Сортировка в таблицах и попытка приструнить генерацию превьюшек
All checks were successful
Deploy MES Core / deploy (push) Successful in 13s
All checks were successful
Deploy MES Core / deploy (push) Successful in 13s
This commit is contained in:
@@ -117,6 +117,12 @@ class DxfPreviewSettings(models.Model):
|
||||
help_text="Если включено — не перекрашиваем линии, берём цвета из DXF",
|
||||
)
|
||||
|
||||
per_task_timeout_sec = models.PositiveIntegerField(
|
||||
"Таймаут на 1 DXF (сек)",
|
||||
default=45,
|
||||
help_text="Если конкретный DXF завис — убиваем обработку этой детали и идём дальше",
|
||||
)
|
||||
|
||||
updated_at = models.DateTimeField("Обновлено", auto_now=True)
|
||||
|
||||
class Meta:
|
||||
@@ -127,6 +133,64 @@ class DxfPreviewSettings(models.Model):
|
||||
return "Настройки превью DXF"
|
||||
|
||||
|
||||
class DxfPreviewJob(models.Model):
|
||||
"""Фоновая задача пакетной регенерации превью DXF.
|
||||
|
||||
Зачем нужна:
|
||||
- генерация превью и bbox может быть тяжёлой и в синхронном POST «вешает» ответ;
|
||||
- поэтому мы запускаем задачу в фоне и пишем прогресс в БД;
|
||||
- UI может показывать статус/счётчики без ожидания завершения.
|
||||
|
||||
Важно:
|
||||
- это не Celery и не очередь, а простой «фон» для текущего процесса Django;
|
||||
- для продакшена лучше вынести в полноценный воркер, но этот вариант уже убирает зависания UI.
|
||||
"""
|
||||
|
||||
STATUS_CHOICES = [
|
||||
('queued', 'В очереди'),
|
||||
('running', 'Выполняется'),
|
||||
('done', 'Готово'),
|
||||
('failed', 'Ошибка'),
|
||||
('cancelled', 'Остановлено'),
|
||||
]
|
||||
|
||||
status = models.CharField("Статус", max_length=16, choices=STATUS_CHOICES, default='queued')
|
||||
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Запустил")
|
||||
|
||||
cancel_requested = models.BooleanField(
|
||||
"Запрошена остановка",
|
||||
default=False,
|
||||
help_text="Если включено — воркер завершит задачу после текущей детали",
|
||||
)
|
||||
pid = models.PositiveIntegerField(
|
||||
"PID процесса",
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="Номер процесса, который выполняет задачу (для диагностики)",
|
||||
)
|
||||
|
||||
started_at = models.DateTimeField("Начато", null=True, blank=True)
|
||||
finished_at = models.DateTimeField("Завершено", null=True, blank=True)
|
||||
|
||||
total = models.PositiveIntegerField("Всего задач", default=0)
|
||||
processed = models.PositiveIntegerField("Обработано", default=0)
|
||||
updated = models.PositiveIntegerField("Обновлено", default=0)
|
||||
skipped = models.PositiveIntegerField("Пропущено", default=0)
|
||||
errors = models.PositiveIntegerField("Ошибок", default=0)
|
||||
|
||||
last_message = models.CharField("Сообщение", max_length=255, blank=True, default='')
|
||||
|
||||
created_at = models.DateTimeField("Создано", auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Задача превью DXF"
|
||||
verbose_name_plural = "Задачи превью DXF"
|
||||
ordering = ['-id']
|
||||
|
||||
def __str__(self):
|
||||
return f"DXF превью: {self.get_status_display()}"
|
||||
|
||||
|
||||
class Item(models.Model):
|
||||
"""
|
||||
Единица сменного задания. Определяет КТО, КОГДА и СКОЛЬКО сделал.
|
||||
|
||||
Reference in New Issue
Block a user