84 lines
3.0 KiB
Python
84 lines
3.0 KiB
Python
# documents/models.py
|
||
|
||
from django.db import models
|
||
from django.utils.translation import gettext_lazy as _
|
||
from django.conf import settings
|
||
from django.utils import timezone
|
||
|
||
User = settings.AUTH_USER_MODEL # 'employees.Employee'
|
||
|
||
|
||
class Document(models.Model):
|
||
"""
|
||
Документ, который нужно разослать сотрудникам.
|
||
"""
|
||
title = models.CharField(_('Название'), max_length=255)
|
||
file = models.FileField(_('Файл'), upload_to='documents/%Y/%m/%d/')
|
||
description = models.TextField(_('Описание'), blank=True)
|
||
|
||
uploaded_by = models.ForeignKey(
|
||
User,
|
||
verbose_name=_('Загрузил'),
|
||
on_delete=models.SET_NULL,
|
||
null=True,
|
||
blank=True,
|
||
related_name='uploaded_documents' # <-- уникальный related_name
|
||
)
|
||
uploaded_at = models.DateTimeField(_('Дата загрузки'), auto_now_add=True)
|
||
|
||
sent_to_all = models.BooleanField(
|
||
_('Разослать всем'),
|
||
default=True,
|
||
help_text=_('Если включено — уведомление получат все активные сотрудники')
|
||
)
|
||
departments = models.ManyToManyField(
|
||
'employees.Department',
|
||
verbose_name=_('Отделы-получатели'),
|
||
blank=True,
|
||
help_text=_('Документ будет доступен всем сотрудникам выбранных отделов (включая будущих)'),
|
||
related_name='documents'
|
||
)
|
||
recipients = models.ManyToManyField(
|
||
User,
|
||
verbose_name=_('Получатели'),
|
||
blank=True,
|
||
help_text=_('Если `Разослать всем` отключено, документ пойдет только этим'),
|
||
related_name='document_recipients' # <-- уникальный related_name
|
||
)
|
||
|
||
class Meta:
|
||
verbose_name = _('Документ')
|
||
verbose_name_plural = _('Документы')
|
||
ordering = ['-uploaded_at']
|
||
|
||
def __str__(self):
|
||
return self.title
|
||
|
||
|
||
class DocumentAcknowledgement(models.Model):
|
||
"""
|
||
Фиксация, что сотрудник ознакомился с документом.
|
||
"""
|
||
document = models.ForeignKey(
|
||
Document,
|
||
verbose_name=_('Документ'),
|
||
on_delete=models.CASCADE,
|
||
related_name='acknowledgements'
|
||
)
|
||
user = models.ForeignKey(
|
||
User,
|
||
verbose_name=_('Сотрудник'),
|
||
on_delete=models.CASCADE,
|
||
related_name='document_acknowledgements'
|
||
)
|
||
acknowledged_at = models.DateTimeField(_('Время ознакомления'), auto_now_add=True)
|
||
|
||
class Meta:
|
||
verbose_name = _('Ознакомление с документом')
|
||
verbose_name_plural = _('Ознакомления с документами')
|
||
unique_together = ('document', 'user')
|
||
ordering = ['-acknowledged_at']
|
||
|
||
def __str__(self):
|
||
return f'{self.user} — {self.document} @ {self.acknowledged_at:%d.%m.%Y %H:%M}'
|