diff --git a/backend/eusrr_backend/settings.py b/backend/eusrr_backend/settings.py index c5d8e0b2..63908ac2 100644 --- a/backend/eusrr_backend/settings.py +++ b/backend/eusrr_backend/settings.py @@ -265,6 +265,13 @@ DEFAULT_FROM_EMAIL = os.getenv( "DEFAULT_FROM_EMAIL", EMAIL_HOST_USER or "webmaster@localhost" ) +# ----------------------------------------------------------------------------- +# SITE SETTINGS +# ----------------------------------------------------------------------------- +# Название сайта для email уведомлений и UI +SITE_NAME = os.getenv("SITE_NAME", "CORP HiRo") +SITE_URL = os.getenv("SITE_URL", "https://corp.robotail.pro") + # ----------------------------------------------------------------------------- # NOTIFICATIONS # ----------------------------------------------------------------------------- @@ -273,6 +280,12 @@ DEFAULT_FROM_EMAIL = os.getenv( NOTIFICATION_BULK_THRESHOLD = int( os.getenv("NOTIFICATION_BULK_THRESHOLD", "10")) +# Конфигурация модуля уведомлений +NOTIFICATIONS_CONFIG = { + 'SITE_NAME': SITE_NAME, + 'DEFAULT_FROM_EMAIL': DEFAULT_FROM_EMAIL, +} + # ----------------------------------------------------------------------------- # CHANNELS & CACHE # ----------------------------------------------------------------------------- diff --git a/backend/notifications/senders/email.py b/backend/notifications/senders/email.py index a3dfcd99..a19b0a6a 100644 --- a/backend/notifications/senders/email.py +++ b/backend/notifications/senders/email.py @@ -85,10 +85,10 @@ class EmailNotificationSender(BaseNotificationSender): 'actor': notification.actor, 'verb': notification.verb, 'description': notification.description, - 'action_url': self._get_full_url(notification.action_url), + 'action_url': self._get_full_url(notification.action_url, notification), 'action_text': 'Посмотреть', 'site_name': config.site_name(), - 'site_url': self._get_site_url(), + 'site_url': self._get_site_url(notification), 'verb_icon': self.VERB_ICONS.get(notification.verb, '🔔'), } @@ -159,7 +159,7 @@ class EmailNotificationSender(BaseNotificationSender): 'total_count': len(notifications), 'verb_icons': self.VERB_ICONS, 'site_name': config.site_name(), - 'site_url': self._get_site_url(), + 'site_url': self._get_site_url(notifications[0] if notifications else None), } # Рендерим шаблоны @@ -209,25 +209,56 @@ class EmailNotificationSender(BaseNotificationSender): return f"{notif.description}\n\n{context.get('action_url', '')}" return "" - def _get_site_url(self) -> str: - """Получает базовый URL сайта из настроек.""" + def _get_site_url(self, notification=None) -> str: + """ + Получает базовый URL сайта. + + Приоритет: + 1. notification.data['site_url'] - если передан при создании + 2. settings.SITE_URL - статическая настройка + 3. settings.ALLOWED_HOSTS[0] - автоопределение из разрешенных хостов + 4. 'http://localhost:9000' - fallback для разработки + + Args: + notification: Объект Notification (опционально) + + Returns: + Базовый URL сайта (например, 'https://example.com') + """ + # 1. Проверяем данные уведомления + if notification and hasattr(notification, 'data') and isinstance(notification.data, dict): + if 'site_url' in notification.data: + return notification.data['site_url'] + + # 2. Проверяем settings.SITE_URL if hasattr(settings, 'SITE_URL'): return settings.SITE_URL + # 3. Автоопределение из ALLOWED_HOSTS if settings.ALLOWED_HOSTS and settings.ALLOWED_HOSTS[0] != '*': host = settings.ALLOWED_HOSTS[0] protocol = 'https' if getattr(settings, 'SECURE_SSL_REDIRECT', False) else 'http' return f"{protocol}://{host}" + # 4. Fallback для разработки return 'http://localhost:9000' - def _get_full_url(self, path: str) -> str: - """Преобразует относительный URL в абсолютный.""" + def _get_full_url(self, path: str, notification=None) -> str: + """ + Преобразует относительный URL в абсолютный. + + Args: + path: Относительный или абсолютный URL + notification: Объект Notification для получения site_url + + Returns: + Абсолютный URL + """ if not path: return '' if path.startswith('http://') or path.startswith('https://'): return path - site_url = self._get_site_url() + site_url = self._get_site_url(notification) return f"{site_url}{path}"