it_manager: справочник типовых работ в журнале WorkLog.

Категория/работа/required_details вместо свободного work_type; seed Directory, отчёт и тесты.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-07 13:38:07 +03:00
parent be7e5853cb
commit 31bd4c8fa7
11 changed files with 822 additions and 112 deletions
+22 -4
View File
@@ -2,8 +2,6 @@ from django.db import models
from django.conf import settings
from django.utils import timezone
from core.models.directories import directory_default
class WorkLog(models.Model):
date = models.DateField('Дата', default=timezone.localdate, db_index=True)
@@ -16,12 +14,21 @@ class WorkLog(models.Model):
null=True, blank=True,
related_name='work_logs', verbose_name='Локация',
)
# Устаревший грубый вид (~7 типов); для новых записей не заполняется.
work_type = models.ForeignKey(
'core.Directory', on_delete=models.PROTECT,
limit_choices_to={'directory_type__code': 'worklog_type', 'is_active': True},
related_name='worklogs_by_type', verbose_name='Вид работ',
null=True, blank=True,
)
description = models.TextField('Описание работ')
catalog_work = models.ForeignKey(
'core.Directory', on_delete=models.PROTECT,
limit_choices_to={'directory_type__code': 'it_work', 'is_active': True},
related_name='worklogs_by_catalog', verbose_name='Типовая работа',
null=True, blank=True,
)
details = models.JSONField('Уточнения', default=dict, blank=True)
description = models.TextField('Комментарий', blank=True)
result = models.TextField('Результат', blank=True)
hours_spent = models.DecimalField('Затрачено часов', max_digits=5, decimal_places=1,
null=True, blank=True)
@@ -49,7 +56,18 @@ class WorkLog(models.Model):
]
def __str__(self):
return f'{self.work_type.name} — {self.technician} — {self.date:%d.%m.%Y}'
if self.catalog_work_id:
title = self.catalog_work.name
elif self.work_type_id:
title = self.work_type.name
else:
title = (self.description or '—')[:40]
return f'{title} — {self.technician} — {self.date:%d.%m.%Y}'
@property
def display_title(self) -> str:
from apps.it_manager.work_directory import worklog_display_title
return worklog_display_title(self)
class ServiceCall(models.Model):