from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ class DashboardLayout(models.Model): """Персональная раскладка дашборда сотрудника. widgets — упорядоченный список ключей включённых виджетов (см. core.dashboard.DASHBOARD_WIDGETS). Отсутствие записи = дашборд по умолчанию для типа локации сотрудника. """ employee = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='dashboard_layout', verbose_name=_('Сотрудник'), ) widgets = models.JSONField(_('Виджеты (порядок)'), default=list, blank=True) # {ключ виджета: 'half' | 'full'} — ширина виджета в сетке дашборда. widget_widths = models.JSONField(_('Ширины виджетов'), default=dict, blank=True) updated_at = models.DateTimeField(auto_now=True) class Meta: verbose_name = _('Раскладка дашборда') verbose_name_plural = _('Раскладки дашборда') def __str__(self): return f'{self.employee}: {len(self.widgets or [])} виджетов' class DashboardDefaults(models.Model): """Синглтон: наборы виджетов дашборда по умолчанию для типа локации. Применяются к сотруднику, который ещё не настраивал свой дашборд. Каждое поле — упорядоченный список ключей виджетов. """ office = models.JSONField(_('Офис'), default=list, blank=True) pharmacy = models.JSONField(_('Аптека'), default=list, blank=True) warehouse = models.JSONField(_('Склад'), default=list, blank=True) class Meta: verbose_name = _('Дашборд по умолчанию') verbose_name_plural = _('Дашборд по умолчанию') def __str__(self): return str(_('Дашборд по умолчанию')) def save(self, *args, **kwargs): self.pk = 1 super().save(*args, **kwargs) def delete(self, *args, **kwargs): pass # синглтон нельзя удалить @classmethod def load(cls): obj, _created = cls.objects.get_or_create(pk=1) return obj def keys_for(self, location_type: str) -> list: return { 'office': self.office, 'pharmacy': self.pharmacy, 'warehouse': self.warehouse, }.get(location_type) or []