225 lines
8.6 KiB
Python
225 lines
8.6 KiB
Python
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}".',
|
||
)
|