it_manager/locations: редактор шаблона этикеток, раздельная печать QR/EAN и карточка поставщика.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -3,3 +3,4 @@ from .tickets import Ticket, TicketComment
|
||||
from .providers import InternetProvider, InternetContract, InternetContractPayment
|
||||
from .worklogs import WorkLog, ServiceCall
|
||||
from .consumables import Consumable
|
||||
from .label_template import EquipmentLabelTemplate, DEFAULT_LABEL_LAYOUT
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
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
|
||||
Reference in New Issue
Block a user