Merge branch 'develop'

This commit is contained in:
lizerk 2026-03-13 12:18:37 +03:00
commit 4df7c14c45
2 changed files with 52 additions and 8 deletions

View File

@ -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
# -----------------------------------------------------------------------------

View File

@ -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}"