class NotificationVerbs: TASK_CREATED = "task_created" TASK_ASSIGNED = "task_assigned" TASK_REASSIGNED = "task_reassigned" TASK_COMMENT = "task_comment" TASK_DUE_DATE_CHANGED = "task_due_date_changed" TASK_DUE_SOON = "task_due_soon" TASK_OVERDUE = "task_overdue" TASK_COMPLETED = "task_completed" TASK_REOPENED = "task_reopened" TASK_UPDATED = "task_updated" TASK_MOVED = "task_moved" TASK_DELETED = "task_deleted" TASK_ATTACHMENT_ADDED = "task_attachment_added" TASK_ATTACHMENT_REMOVED = "task_attachment_removed" TASK_CHECKLIST_CHANGED = "task_checklist_changed" TASK_LINKED_OBJECT_REMOVED = "task_linked_object_removed" TASK_COMMENT_CHANGED = "task_comment_changed" TASK_LINKED_OBJECT_ADDED = "task_linked_object_added" TASK_BOARD_MEMBER_ADDED = "task_board_member_added" class ActionURLs: @staticmethod def task_detail(task) -> str: return f"/tasks?board={task.board_id}&task={task.id}" @staticmethod def board_detail(board) -> str: return f"/tasks?board={board.id}" class MessageTemplates: @staticmethod def task_created(task, actor_name: str) -> tuple[str, str]: return ( "Новая задача", f'{actor_name} создал задачу #{task.id} "{task.title}".', ) @staticmethod def task_assigned(task, actor_name: str) -> tuple[str, str]: return ( "Вам назначена задача", f'{actor_name} назначил вам задачу #{task.id} "{task.title}".', ) @staticmethod def task_reassigned(task, actor_name: str) -> tuple[str, str]: return ( "Исполнитель задачи изменен", f'{actor_name} изменил исполнителя задачи #{task.id} "{task.title}".', ) @staticmethod def task_comment(task, actor_name: str, text: str) -> tuple[str, str]: preview = text[:160] return ( "Новый комментарий к задаче", f'{actor_name} прокомментировал задачу #{task.id} "{task.title}": {preview}', ) @staticmethod def task_due_date_changed( task, actor_name: str, old_due_date, new_due_date, ) -> tuple[str, str]: old_value = old_due_date or "без срока" new_value = new_due_date or "без срока" return ( "Срок задачи изменен", ( f'{actor_name} изменил срок задачи #{task.id} "{task.title}": ' f"{old_value} -> {new_value}." ), ) @staticmethod def task_due_soon(task) -> tuple[str, str]: return ( "Срок задачи сегодня", f'Сегодня срок задачи #{task.id} "{task.title}".', ) @staticmethod def task_overdue(task) -> tuple[str, str]: return ( "Задача просрочена", f'Просрочена задача #{task.id} "{task.title}".', ) @staticmethod def task_completed(task, actor_name: str) -> tuple[str, str]: return ( "Задача завершена", f'{actor_name} завершил задачу #{task.id} "{task.title}".', ) @staticmethod def task_reopened(task, actor_name: str) -> tuple[str, str]: return ( "Задача возвращена в работу", f'{actor_name} вернул в работу задачу #{task.id} "{task.title}".', ) @staticmethod def task_moved(task, actor_name: str, old_column, new_column) -> tuple[str, str]: return ( "Задача перемещена", ( f'{actor_name} переместил задачу #{task.id} "{task.title}": ' f'"{old_column.name}" -> "{new_column.name}".' ), ) @staticmethod def task_updated(task, actor_name: str, fields: list[str]) -> tuple[str, str]: field_names = { "title": "название", "description": "описание", "priority": "приоритет", "label_ids": "метки", "participant_ids": "участников", "cover_attachment_id": "обложку", "cover": "обложку", } changed = ", ".join(field_names.get(field, field) for field in fields) return ( "Задача изменена", ( f'{actor_name} изменил задачу #{task.id} "{task.title}"' f"{f': {changed}' if changed else ''}." ), ) @staticmethod def task_deleted(task, actor_name: str) -> tuple[str, str]: return ( "Задача удалена", f'{actor_name} удалил задачу #{task.id} "{task.title}".', ) @staticmethod def task_activity_changed( task, actor_name: str, action: str, metadata: dict, ) -> tuple[str, str]: file_name = metadata.get("file_name") or "файл" item_title = metadata.get("item_title") or "пункт" object_label = ( metadata.get("object_label") or metadata.get("object_type") or "объект" ) messages = { "attachment_added": ( "К задаче добавлен файл", f'{actor_name} добавил файл "{file_name}" к задаче #{task.id} "{task.title}".', ), "attachment_removed": ( "Из задачи удален файл", f'{actor_name} удалил файл "{file_name}" из задачи #{task.id} "{task.title}".', ), "checklist_item_added": ( "Чек-лист задачи изменен", f'{actor_name} добавил пункт "{item_title}" в задачу #{task.id} "{task.title}".', ), "checklist_item_updated": ( "Чек-лист задачи изменен", f'{actor_name} изменил пункт "{item_title}" в задаче #{task.id} "{task.title}".', ), "checklist_item_completed": ( "Пункт чек-листа выполнен", f'{actor_name} выполнил пункт "{item_title}" в задаче #{task.id} "{task.title}".', ), "checklist_item_reopened": ( "Пункт чек-листа возвращен", f'{actor_name} вернул пункт "{item_title}" в задаче #{task.id} "{task.title}".', ), "checklist_item_removed": ( "Чек-лист задачи изменен", f'{actor_name} удалил пункт "{item_title}" из задачи #{task.id} "{task.title}".', ), "linked": ( "К задаче добавлена ссылка", f'{actor_name} добавил "{object_label}" к задаче #{task.id} "{task.title}".', ), "unlinked": ( "Связь с задачей удалена", f'{actor_name} удалил связь "{object_label}" из задачи #{task.id} "{task.title}".', ), "comment_edited": ( "Комментарий к задаче изменен", f'{actor_name} изменил комментарий в задаче #{task.id} "{task.title}".', ), "comment_removed": ( "Комментарий к задаче удален", f'{actor_name} удалил комментарий из задачи #{task.id} "{task.title}".', ), } return messages[action] @staticmethod def task_linked_object_added( task, actor_name: str, object_type: str, ) -> tuple[str, str]: return ( "К задаче добавлен связанный объект", ( f'{actor_name} добавил объект "{object_type}" ' f'к задаче #{task.id} "{task.title}".' ), ) @staticmethod def board_member_added(board, actor_name: str) -> tuple[str, str]: return ( "Вас добавили на доску", f'{actor_name} добавил вас на доску "{board.name}".', )