from django.db import models from django.utils.translation import gettext_lazy as _ from core.models import BaseModel from apps.locations.dislocation_columns import STANDARD_COLUMNS, normalize_columns class DislocationColumnPreset(BaseModel): """Заготовка набора колонок таблицы дислокации. ``department`` — задел под преднастройки по отделам (nullable). """ name = models.CharField(_('Название'), max_length=100) code = models.SlugField(_('Код'), max_length=50, unique=True) columns = models.JSONField( _('Колонки'), default=list, help_text=_('Упорядоченный список ключей из реестра колонок дислокации.'), ) department = models.ForeignKey( 'core.Directory', on_delete=models.SET_NULL, null=True, blank=True, limit_choices_to={'directory_type__code': 'department', 'is_active': True}, related_name='dislocation_column_presets', verbose_name=_('Отдел'), help_text=_('Если задан — пресет по умолчанию для сотрудников этого отдела.'), ) is_default = models.BooleanField( _('По умолчанию'), default=False, help_text=_('Используется, если у сотрудника нет своего набора и нет пресета отдела.'), ) class Meta: verbose_name = _('Пресет колонок дислокации') verbose_name_plural = _('Пресеты колонок дислокации') ordering = ['name'] def __str__(self): return self.name def save(self, *args, **kwargs): self.columns = normalize_columns(self.columns or STANDARD_COLUMNS) super().save(*args, **kwargs) if self.is_default: ( DislocationColumnPreset.objects .exclude(pk=self.pk) .filter(is_default=True) .update(is_default=False) )