Перейти к содержанию

Ревизии и корректировки

Ревизии и корректировки — это механизмы отслеживания изменений и внесения правок в значения параметров.

Внимание! Механизмы хранения истории изменений через "ревизии" и "корректировки" больше не используются как основная технология хранения истории. История изменений теперь доступна только через кнопки "История ревизий" и "История корректировок" в дашборде. Описанные ниже механизмы считаются устаревшими и приведены только для справки.

Архитектура и модели

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()

Ссылки