from django.conf import settings from django.db import models DEFAULT_LABEL_LAYOUT = [ { 'id': 'qr', 'type': 'qr', 'x_mm': 2.0, 'y_mm': 2.0, 'w_mm': 22.0, 'h_mm': 22.0, 'font_pt': 9, 'bold': False, 'align': 'left', 'text': '', }, { 'id': 'model', 'type': 'model', 'x_mm': 26.0, 'y_mm': 2.0, 'w_mm': 40.0, 'h_mm': 8.0, 'font_pt': 10, 'bold': True, 'align': 'left', 'text': '', }, { 'id': 'type', 'type': 'type', 'x_mm': 26.0, 'y_mm': 10.0, 'w_mm': 40.0, 'h_mm': 5.0, 'font_pt': 8, 'bold': False, 'align': 'left', 'text': '', }, { 'id': 'inventory', 'type': 'inventory', 'x_mm': 26.0, 'y_mm': 15.5, 'w_mm': 40.0, 'h_mm': 5.0, 'font_pt': 10, 'bold': False, 'align': 'left', 'text': '', }, { 'id': 'serial', 'type': 'serial', 'x_mm': 26.0, 'y_mm': 21.0, 'w_mm': 40.0, 'h_mm': 4.0, 'font_pt': 8, 'bold': False, 'align': 'left', 'text': '', }, { 'id': 'ean', 'type': 'ean13', 'x_mm': 2.0, 'y_mm': 26.0, 'w_mm': 64.0, 'h_mm': 14.0, 'font_pt': 8, 'bold': False, 'align': 'center', 'text': '', }, ] class EquipmentLabelTemplate(models.Model): """Общий шаблон инвентарной этикетки (singleton code=default).""" code = models.SlugField('Код', max_length=40, unique=True, default='default') name = models.CharField('Название', max_length=100, default='Этикетка оборудования') width_mm = models.FloatField('Ширина (мм)', default=70.0) height_mm = models.FloatField('Высота (мм)', default=42.0) layout = models.JSONField('Блоки', default=list, blank=True) updated_at = models.DateTimeField(auto_now=True) updated_by = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='+', verbose_name='Кто обновил', ) class Meta: verbose_name = 'Шаблон этикетки' verbose_name_plural = 'Шаблоны этикеток' def __str__(self): return self.name @classmethod def get_default(cls): obj, created = cls.objects.get_or_create( code='default', defaults={ 'name': 'Этикетка оборудования', 'width_mm': 70.0, 'height_mm': 42.0, 'layout': list(DEFAULT_LABEL_LAYOUT), }, ) if not created and not obj.layout: obj.layout = list(DEFAULT_LABEL_LAYOUT) obj.save(update_fields=['layout']) return obj