149 lines
5.4 KiB
Python
149 lines
5.4 KiB
Python
"""
|
||
Конфигурация уведомлений для модуля Documents.
|
||
|
||
Содержит:
|
||
- NotificationVerbs - глаголы для уведомлений
|
||
- MessageTemplates - шаблоны сообщений
|
||
- ActionURLs - URL-адреса действий
|
||
"""
|
||
|
||
from django.conf import settings
|
||
|
||
|
||
class NotificationVerbs:
|
||
"""Глаголы (verbs) для уведомлений documents."""
|
||
|
||
DOCUMENT_READY = 'document_ready'
|
||
DOCUMENT_SIGNED_ALL = 'document_signed_all'
|
||
DOCUMENT_COMMENT = 'document_comment'
|
||
DOCUMENT_COMMENT_REPLY = 'document_comment_reply'
|
||
REGULATION_READY = 'regulation_ready'
|
||
REGULATION_SIGNED_ALL = 'regulation_signed_all'
|
||
REGULATION_COMMENT = 'regulation_comment'
|
||
REGULATION_COMMENT_REPLY = 'regulation_comment_reply'
|
||
|
||
@classmethod
|
||
def ready(cls, is_regulation: bool) -> str:
|
||
return cls.REGULATION_READY if is_regulation else cls.DOCUMENT_READY
|
||
|
||
@classmethod
|
||
def signed_all(cls, is_regulation: bool) -> str:
|
||
return (
|
||
cls.REGULATION_SIGNED_ALL
|
||
if is_regulation
|
||
else cls.DOCUMENT_SIGNED_ALL
|
||
)
|
||
|
||
|
||
class MessageTemplates:
|
||
"""Шаблоны сообщений для уведомлений documents."""
|
||
|
||
@staticmethod
|
||
def document_ready(
|
||
uploader_name: str,
|
||
document_title: str,
|
||
acknowledgement_required: bool = True,
|
||
is_regulation: bool = False,
|
||
) -> str:
|
||
"""Шаблон для нового документа."""
|
||
resource = 'регламент' if is_regulation else 'документ'
|
||
action = 'опубликовал' if is_regulation else 'загрузил'
|
||
message = f'{uploader_name} {action} {resource} "{document_title}".'
|
||
if acknowledgement_required:
|
||
return f"{message} Требуется ознакомление."
|
||
return message
|
||
|
||
@staticmethod
|
||
def document_ready_title(
|
||
acknowledgement_required: bool = True,
|
||
is_regulation: bool = False,
|
||
) -> str:
|
||
"""Заголовок для нового документа."""
|
||
resource = 'регламент' if is_regulation else 'документ'
|
||
if not acknowledgement_required:
|
||
return f'Новый {resource}'
|
||
return f'Новый {resource} на ознакомление'
|
||
|
||
@staticmethod
|
||
def all_acknowledged(
|
||
document_title: str,
|
||
is_regulation: bool = False,
|
||
) -> str:
|
||
"""Шаблон для завершения ознакомления всеми."""
|
||
resource = 'регламентом' if is_regulation else 'документом'
|
||
return f'Все сотрудники ознакомились с {resource} "{document_title}"'
|
||
|
||
@staticmethod
|
||
def all_acknowledged_title(is_regulation: bool = False) -> str:
|
||
"""Заголовок для завершения ознакомления."""
|
||
resource = 'регламентом' if is_regulation else 'документом'
|
||
return f'Все ознакомились с {resource}'
|
||
|
||
@staticmethod
|
||
def comment(author_name: str, document_title: str) -> str:
|
||
"""Шаблон для нового комментария к документу."""
|
||
return (
|
||
f'{author_name} оставил комментарий '
|
||
f'к вашему документу "{document_title}"'
|
||
)
|
||
|
||
@staticmethod
|
||
def comment_title() -> str:
|
||
"""Заголовок для комментария к документу."""
|
||
return 'Новый комментарий к документу'
|
||
|
||
@staticmethod
|
||
def comment_reply(author_name: str, document_title: str) -> str:
|
||
"""Шаблон для ответа на комментарий."""
|
||
return (
|
||
f'{author_name} ответил на ваш '
|
||
f'комментарий к документу "{document_title}"'
|
||
)
|
||
|
||
@staticmethod
|
||
def comment_reply_title() -> str:
|
||
"""Заголовок для ответа на комментарий."""
|
||
return 'Ответ на ваш комментарий'
|
||
|
||
|
||
class ActionURLs:
|
||
"""URL-адреса для действий с документами."""
|
||
|
||
DOCUMENTS = '/documents'
|
||
|
||
@staticmethod
|
||
def document_detail(
|
||
document_id: int,
|
||
is_regulation: bool = False,
|
||
) -> str:
|
||
"""Возвращает прямую ссылку на документ или регламент."""
|
||
section = 'regulations' if is_regulation else 'folders'
|
||
return f'/documents?section={section}&document={document_id}'
|
||
|
||
|
||
# ===== Константы =====
|
||
|
||
def get_bulk_threshold() -> int:
|
||
"""
|
||
Возвращает порог для определения массовой рассылки.
|
||
|
||
Returns:
|
||
int: Количество получателей, начиная с которого используется bulk режим
|
||
"""
|
||
return getattr(settings, 'NOTIFICATION_BULK_THRESHOLD', 10)
|
||
|
||
|
||
def get_uploader_name(uploaded_by) -> str:
|
||
"""
|
||
Возвращает имя загрузившего документ пользователя.
|
||
|
||
Args:
|
||
uploaded_by: Объект Employee или None
|
||
|
||
Returns:
|
||
str: Полное имя или 'Администратор'
|
||
"""
|
||
if uploaded_by:
|
||
return uploaded_by.get_full_name() or uploaded_by.username
|
||
return 'Администратор'
|