""" Конфигурация уведомлений для модуля Communications. Содержит: - NotificationVerbs - глаголы для уведомлений - MessageTemplates - шаблоны сообщений - ActionURLs - URL-адреса действий - Вспомогательные функции для обработки сообщений """ import re class NotificationVerbs: """Глаголы (verbs) для уведомлений communications.""" NEW_MESSAGE = 'chat_new_message' ANNOUNCEMENT = 'announcement_new_message' MENTION = 'chat_mention' REPLY = 'chat_reply' ADDED_TO_CHAT = 'chat_added_to_chat' COMMENTED = 'commented' # Для комментариев к объектам class MessageTemplates: """Шаблоны сообщений для уведомлений communications.""" @staticmethod def mention(author_name: str) -> str: """Шаблон для упоминания пользователя.""" return f'Вас упомянул {author_name}' @staticmethod def reply(author_name: str) -> str: """Шаблон для ответа на сообщение.""" return f'{author_name} ответил на ваше сообщение' @staticmethod def announcement(author_name: str) -> str: """Шаблон для нового объявления.""" return f'Новое объявление от {author_name}' @staticmethod def private_message(author_name: str) -> str: """Шаблон для приватного сообщения.""" return f'Новое сообщение от {author_name}' @staticmethod def group_message(author_name: str, chat_name: str) -> str: """Шаблон для сообщения в группе.""" return f'{author_name} в {chat_name}' @staticmethod def added_to_chat(chat_name: str) -> str: """Шаблон для добавления в чат.""" return f'Вы были добавлены в чат "{chat_name}"' @staticmethod def added_to_chat_title() -> str: """Заголовок для уведомления о добавлении в чат.""" return 'Вас добавили в чат' class ActionURLs: """URL-адреса для действий с сообщениями.""" MESSAGES = '/messages' @staticmethod def chat_detail(chat_id: int) -> str: """ Возвращает URL-адрес чата. """ return f'/messages/{chat_id}' @staticmethod def message_detail(chat_id: int, message_id: int) -> str: """ Возвращает URL-адрес сообщения. В будущем можно добавить прокрутку к конкретному сообщению. """ return f'/messages/{chat_id}?message={message_id}' # ===== Вспомогательные функции ===== def extract_mentions(text: str) -> list[str]: """ Извлекает email'ы из упоминаний вида @email. Args: text: Текст сообщения Returns: list: Список email'ов без символа @ Examples: >>> extract_mentions("Привет @user@example.com и @test@mail.com") ['user@example.com', 'test@mail.com'] """ if not text: return [] # Паттерн: @ + email формат pattern = r'@([\w.+-]+@[\w.-]+\.[\w]+)' mentions = re.findall(pattern, text) return list(set(mentions)) # Уникальные значения def truncate_message(text: str, max_length: int = 100) -> str: """ Обрезает текст сообщения до указанной длины. Args: text: Исходный текст max_length: Максимальная длина (по умолчанию 100) Returns: Обрезанный текст с многоточием если нужно """ if not text: return '' if len(text) <= max_length: return text return text[:max_length - 3] + '...' def get_chat_name(chat) -> str: """ Возвращает название чата в зависимости от типа. Args: chat: Объект Chat Returns: str: Название чата """ if chat.name: return chat.name if chat.type == 'global': return 'Глобальный чат' # Use context_object (GenericFK) for any chat type if chat.context_object: return f"Чат: {chat.context_object}" if chat.type == 'private': # Для приватного чата можно вернуть имена участников participants = chat.participants.all()[:2] if participants: names = [p.get_full_name() or p.username for p in participants] return ', '.join(names) return 'Чат'