Добавлена поддержка 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
56 lines
3.7 KiB
Python
56 lines
3.7 KiB
Python
# Generated by Django 5.2.4 on 2026-02-27 21:30
|
||
|
||
import django.db.models.deletion
|
||
import filer.fields.file
|
||
from django.conf import settings
|
||
from django.db import migrations, models
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
|
||
dependencies = [
|
||
('documents', '0003_change_sent_to_all_default'),
|
||
('employees', '0041_alter_departmentpermission_code'),
|
||
('filer', '0018_alter_file_options'),
|
||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
]
|
||
|
||
operations = [
|
||
migrations.CreateModel(
|
||
name='DocumentV2',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('title', models.CharField(max_length=255, verbose_name='Название')),
|
||
('description', models.TextField(blank=True, verbose_name='Описание')),
|
||
('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата загрузки')),
|
||
('sent_to_all', models.BooleanField(default=True, help_text='Если включено — уведомление получат все активные сотрудники', verbose_name='Разослать всем')),
|
||
('departments', models.ManyToManyField(blank=True, help_text='Документ будет доступен всем сотрудникам выбранных отделов (включая будущих)', related_name='documents_v2', to='employees.department', verbose_name='Отделы-получатели')),
|
||
('file', filer.fields.file.FilerFileField(blank=True, help_text='Файл, загруженный через django-filer', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='documents', to='filer.file', verbose_name='Файл')),
|
||
('recipients', models.ManyToManyField(blank=True, help_text='Если `Разослать всем` отключено, документ пойдет только этим', related_name='document_recipients_v2', to=settings.AUTH_USER_MODEL, verbose_name='Получатели')),
|
||
('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='uploaded_documents_v2', to=settings.AUTH_USER_MODEL, verbose_name='Загрузил')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Документ v2',
|
||
'verbose_name_plural': 'Документы v2',
|
||
'db_table': 'documents_documentv2',
|
||
'ordering': ['-uploaded_at'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='DocumentAcknowledgementV2',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('acknowledged_at', models.DateTimeField(auto_now_add=True, verbose_name='Время ознакомления')),
|
||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='document_acknowledgements_v2', to=settings.AUTH_USER_MODEL, verbose_name='Сотрудник')),
|
||
('document', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='acknowledgements', to='documents.documentv2', verbose_name='Документ')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Ознакомление с документом v2',
|
||
'verbose_name_plural': 'Ознакомления с документами v2',
|
||
'db_table': 'documents_documentacknowledgementv2',
|
||
'ordering': ['-acknowledged_at'],
|
||
'unique_together': {('document', 'user')},
|
||
},
|
||
),
|
||
]
|