""" Конфигурация уведомлений для django-scheduler. Содержит: - NotificationVerbs - глаголы для уведомлений - MessageTemplates - шаблоны сообщений - ActionURLs - URL-адреса действий - Вспомогательные функции """ class NotificationVerbs: """Глаголы (verbs) для уведомлений событий календаря.""" EVENT_CREATED = "event_created" EVENT_CHANGED = "event_changed" EVENT_CANCELLED = "event_cancelled" EVENT_REMINDER = "event_reminder" # Для будущей реализации через Celery class MessageTemplates: """Шаблоны сообщений для уведомлений календаря.""" @staticmethod def event_created( event_title: str, event_date: str, calendar_name: str = None ) -> str: """Шаблон для нового события.""" if calendar_name: return ( f'Добавлено событие в календарь "{calendar_name}": ' f'"{event_title}" ({event_date})' ) return f'Добавлено новое событие: "{event_title}" ({event_date})' @staticmethod def event_created_title() -> str: """Заголовок для нового события.""" return "Новое событие в календаре" @staticmethod def event_changed(event_title: str, changes_text: str = None) -> str: """Шаблон для изменения события.""" if changes_text: return f'Событие "{event_title}" изменено. Изменения: {changes_text}' return f'Событие "{event_title}" изменено' @staticmethod def event_changed_title() -> str: """Заголовок для изменения события.""" return "Событие изменено" @staticmethod def event_cancelled(event_title: str, event_date: str) -> str: """Шаблон для отмены события.""" return f'Событие "{event_title}" ({event_date}) отменено' @staticmethod def event_cancelled_title() -> str: """Заголовок для отмены события.""" return "Событие отменено" class ActionURLs: """URL-адреса для действий с календарем.""" CALENDAR = "/calendar" @staticmethod def event_detail(event_id: int) -> str: """ Возвращает URL-адрес события. TODO: реализовать прямые ссылки на конкретные события """ return f"/calendar?event={event_id}" # ===== Константы для полей django-scheduler Event ===== FIELD_NAMES = { "title": "название", "start": "время начала", "end": "время окончания", "description": "описание", "end_recurring_period": "окончание повторения", } IMPORTANT_FIELDS = ["title", "start", "end", "description"] def format_datetime(dt) -> str: """ Форматирует дату/время в строку. Args: dt: Объект datetime Returns: str: Отформатированная дата и время (например, "10.03.2026 14:30") """ if not dt: return "" return dt.strftime("%d.%m.%Y %H:%M") def format_date(dt) -> str: """ Форматирует только дату в строку. Args: dt: Объект datetime или date Returns: str: Отформатированная дата (например, "10.03.2026") """ if not dt: return "" return dt.strftime("%d.%m.%Y") def format_changes(changed_fields: list[str]) -> str: """ Форматирует список изменённых полей в текст. Args: changed_fields: Список имён полей Returns: str: Текстовое описание изменений через запятую """ return ", ".join([FIELD_NAMES.get(f, f) for f in changed_fields])