Corp/backend/documents/migrations/0004_documentv2_documentacknowledgementv2.py
igor_nadein 49eff37671 feat(documents): Интеграция django-filer для управления файлами
Добавлена поддержка 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
2026-02-28 00:36:17 +03:00

56 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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')},
},
),
]