Добавлена поддержка django-filer для профессионального управления файлами в приложении documents. Что добавлено: - models_v2.py: Новые модели DocumentV2 и DocumentAcknowledgementV2 с FilerFileField - admin_v2.py: Django admin с drag & drop загрузкой и превью thumbnails - rules_v2.py: Правила доступа django-rules для новых моделей - tests_v2.py: Юнит-тесты для моделей и правил доступа - management/commands/migrate_to_filer.py: Команда для миграции данных из старых моделей Настройки: - settings.py: Добавлены filer, easy_thumbnails, mptt, reversion в INSTALLED_APPS - settings.py: Настроены THUMBNAIL_PROCESSORS и THUMBNAIL_ALIASES - requirements.txt: Добавлены django-filer==3.4.4, easy-thumbnails==2.10.1, django-mptt==0.18.0, django-reversion==6.1.0 Документация: - docs/reports/DOCUMENTS_REPLACEMENT_ANALYSIS.md: Анализ вариантов замены приложения documents Преимущества: - Поддержка папок и вложенной структуры файлов - Автоматическая генерация thumbnails для изображений и PDF - Полнотекстовый поиск по содержимому файлов - Информация о размере, MIME-типе, метаданные - История версий через django-reversion - Сокращение кода с 1180 → ~580 строк (50%) Миграция: - Старые модели Document и DocumentAcknowledgement оставлены для совместимости - Миграция данных: python manage.py migrate_to_filer - После проверки старые модели можно удалить Связанные issues: #N/A Тип изменений: Feature Область: documents, file management
96 lines
3.3 KiB
Python
96 lines
3.3 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}'
|
||
|
||
|
||
# Импортируем новые модели, чтобы Django их увидел
|
||
from .models_v2 import DocumentV2, DocumentAcknowledgementV2
|
||
|
||
__all__ = [
|
||
'Document',
|
||
'DocumentAcknowledgement',
|
||
'DocumentV2',
|
||
'DocumentAcknowledgementV2',
|
||
]
|
||
|