Files
Touchh/pms_integration/manager.py
Andrey K. Choi eb662f7fe6
Some checks reported errors
continuous-integration/drone Build was killed
Merge branch 'PMSManager_refactor'
2025-07-19 19:15:03 +09:00

104 lines
4.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import importlib
import os
from pathlib import Path
from django.conf import settings
from .plugins.base_plugin import BasePMSPlugin
from asgiref.sync import sync_to_async
class PluginLoader:
PLUGIN_PATH = Path(__file__).parent / "plugins"
@staticmethod
def load_plugins():
plugins = {}
if not PluginLoader.PLUGIN_PATH.exists():
print("Папка с плагинами не существует:", PluginLoader.PLUGIN_PATH)
return plugins
print("Загрузка плагинов:")
for file in os.listdir(PluginLoader.PLUGIN_PATH):
if file.endswith("_pms.py") and not file.startswith("__"):
module_name = f"pms_integration.plugins.{file[:-3]}"
try:
module = importlib.import_module(module_name)
for attr in dir(module):
cls = getattr(module, attr)
if isinstance(cls, type) and issubclass(cls, BasePMSPlugin) and cls is not BasePMSPlugin:
plugin_name = file[:-7] # Убираем `_pms` из имени файла
plugins[plugin_name] = cls
print(f" Загружен плагин {plugin_name}: {cls.__name__}")
except Exception as e:
print(f" Ошибка загрузки плагина {module_name}: {e}")
return plugins
class PMSIntegrationManager:
def __init__(self, hotel):
"""
Инициализирует PMSIntegrationManager с объектом отеля.
:param hotel: Объект отеля, связанный с PMS.
"""
self.hotel = hotel
self.plugin = None
self.plugins = PluginLoader.load_plugins()
def load_hotel(self):
"""
Проверяет, что у отеля есть связанная PMS конфигурация.
"""
if not self.hotel.pms:
raise ValueError(f"Отель {self.hotel.name} не имеет связанной PMS конфигурации.")
def load_plugin(self):
"""
Загружает плагин, соответствующий PMS конфигурации отеля.
"""
<<<<<<< HEAD
pms_name = self.hotel.pms.plugin_name.lower()
if pms_name in self.plugins:
plugin_class = self.plugins[pms_name]
self.plugin = plugin_class(self.hotel)
print(f"Плагин {pms_name} успешно загружен.")
else:
raise ValueError(f"Неизвестный PMS: {pms_name}")
=======
pms_name = self.hotel.pms.plugin_name.lower() # Приводим название плагина к нижнему регистру
# Формируем имя модуля и класса плагина
plugin_module_name = f"pms_integration.plugins.{pms_name}_pms"
plugin_class_name = f"{pms_name.capitalize()}PMSPlugin"
try:
# Динамически импортируем модуль плагина
plugin_module = importlib.import_module(plugin_module_name)
# Динамически получаем класс плагина
plugin_class = getattr(plugin_module, plugin_class_name, None)
if not plugin_class or not issubclass(plugin_class, BasePMSPlugin):
raise ImportError(f"Класс {plugin_class_name} не найден или не является наследником BasePMSPlugin.")
# Инициализируем плагин
self.plugin = plugin_class(self.hotel)
except ImportError as e:
raise ValueError(f"Ошибка загрузки плагина для PMS {pms_name}: {e}")
>>>>>>> PMSManager_refactor
def fetch_data(self):
"""
Получает данные из PMS с использованием загруженного плагина.
"""
if not self.plugin:
self.load_plugin()
return self.plugin.fetch_data()
async def save_log(self, status, message):
"""
Сохраняет запись в лог интеграции.
"""
from .models import PMSIntegrationLog
await sync_to_async(PMSIntegrationLog.objects.create)(
hotel=self.hotel,
status=status,
message=message,
)