Ревизии и корректировки¶
Ревизии и корректировки — это механизмы отслеживания изменений и внесения правок в значения параметров.
Внимание! Механизмы хранения истории изменений через "ревизии" и "корректировки" больше не используются как основная технология хранения истории. История изменений теперь доступна только через кнопки "История ревизий" и "История корректировок" в дашборде. Описанные ниже механизмы считаются устаревшими и приведены только для справки.
Архитектура и модели¶
Revision¶
Модель для хранения ревизий параметров:
class Revision(models.Model):
parameter = models.ForeignKey(Parameter, on_delete=models.CASCADE)
revision_type = models.CharField(max_length=20, choices=REVISION_TYPES)
branch = models.ForeignKey(Branch, on_delete=models.CASCADE)
parent = models.ForeignKey('self', null=True, on_delete=models.SET_NULL)
is_approved = models.BooleanField(default=False)
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)
RevisionCorrection¶
Модель для хранения корректировок:
class RevisionCorrection(models.Model):
revision = models.ForeignKey(Revision, on_delete=models.CASCADE)
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)
dimensions = models.JSONField() # Список измерений
description = models.TextField(null=True, blank=True)
cells_changed = models.IntegerField(default=0)
reason = models.ForeignKey('CorrectionReason', on_delete=models.SET_NULL, null=True, blank=True)
RevisionCorrectionDetail¶
Модель для хранения деталей корректировок:
class RevisionCorrectionDetail(models.Model):
correction = models.ForeignKey(RevisionCorrection, on_delete=models.CASCADE)
layer_id = models.IntegerField()
measure = models.ForeignKey(Measure, on_delete=models.CASCADE)
uom = models.ForeignKey('conversions.Uom', on_delete=models.CASCADE, null=True, blank=True)
currency = models.ForeignKey('conversions.Currency', on_delete=models.CASCADE, null=True, blank=True)
correction_method = models.ForeignKey('scripts.CorrectionMethod', on_delete=models.CASCADE)
changes = models.JSONField() # [[dimension_values, old_value, new_value], ...]
cells_changed = models.IntegerField(default=0)
Связи моделей¶
- Каждая корректировка (
RevisionCorrection) привязана к ревизии (Revision) - Детали корректировки (
RevisionCorrectionDetail) привязаны к корректировке - Корректировки содержат подробную информацию о каждом изменении
Настройка параметров¶
- Для включения ревизий: флаг
supports_revisions_flagв админке - Для включения корректировок: флаг
track_correctionsв админке - Оба флага доступны в секции "История изменений" модели параметра
Права доступа¶
- Для просмотра истории ревизий и корректировок пользователь должен иметь право
can_viewна параметр - Права выдаются через группы пользователей и области видимости (см. админ-документацию)
- Важно! Права
view_revision_historyиview_corrections_historyвыдаются глобально на уровне всей системы. Если пользователь или группа получает эти права, он получает доступ ко всем параметрам, поддерживающим ревизии или корректировки. Выдача этих прав на отдельный параметр не предусмотрена.
API и процесс работы¶
- Ревизии и корректировки создаются автоматически при изменении данных (импорт, ручная корректировка, резервное копирование)
- Для просмотра истории используйте кнопки "История ревизий" и "История корректировок" в дашборде (генерируются Excel-отчёты)
- Старые API для создания/редактирования ревизий и корректировок считаются устаревшими и не рекомендуются к использованию
История корректировок: формирование отчёта и отображение фильтра¶
- История корректировок формируется как Excel‑файл в обработчике /src/planiqum/core/parameters/libs/revisions_history/corrections.py: build_correction_details_dataframe.
- Фильтр, применённый при корректировке, хранится в
RevisionCorrection.filter_data(JSON) и НЕ дублируется в отформатированном виде. - Текстовое представление фильтра формируется «на лету» методом
/src/planiqum/core/filters/libs/filter.py: Filter.get_multistring
по данным
get_readable(); метод только форматирует вывод. - Формат:
• {Измерение}: {Уровень1} - [элементы], {Уровень2} - [элементы]; внутри групп — с заголовкомГруппа "...". - В детальном Excel‑отчёте поле называется «Примененный фильтр».
Рекомендации:
- Храните только JSON (filter_data), форматируйте при построении отчёта
- Для UI/Excel используйте Filter(json).get_multistring()