interaktivna Tablica radnih sati, db
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
# backend/modules/task_management/models.py
|
||||
# backend/modules/task_management/models.py
|
||||
|
||||
from django.db import models
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from core.base_models import BaseModel # Uvozimo naš Base
|
||||
from core.base_models import BaseModel
|
||||
|
||||
|
||||
class Task(BaseModel):
|
||||
"""
|
||||
@@ -13,6 +14,7 @@ class Task(BaseModel):
|
||||
STATUS_CHOICES = [
|
||||
('aktivan', 'Aktivan'),
|
||||
('servis', 'U tijeku'),
|
||||
('zavrsen', 'Završen'),
|
||||
('neaktivan', 'Otkazano'),
|
||||
]
|
||||
title = models.CharField(max_length=255)
|
||||
@@ -23,9 +25,9 @@ class Task(BaseModel):
|
||||
default='aktivan'
|
||||
)
|
||||
assigned_to = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
settings.AUTH_USER_MODEL,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
related_name='tasks'
|
||||
)
|
||||
vehicle = models.ForeignKey(
|
||||
@@ -53,7 +55,102 @@ class Task(BaseModel):
|
||||
|
||||
def clean(self):
|
||||
super().clean()
|
||||
if self.status == 'neaktivan' and not self.work_order_id:
|
||||
if self.status in {'neaktivan', 'zavrsen'} and not self.work_order_id:
|
||||
raise ValidationError({
|
||||
'work_order': "Putni nalog je obavezan prije zatvaranja zadatka."
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
class TaskWorkHoursTable(BaseModel):
|
||||
"""Interaktivna tablica radnih sati povezana s radnim zadatkom."""
|
||||
|
||||
task = models.OneToOneField(
|
||||
Task,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='work_hours_table',
|
||||
verbose_name=_("Radni zadatak"),
|
||||
)
|
||||
data = models.JSONField(
|
||||
null=True,
|
||||
blank=True,
|
||||
default=None,
|
||||
verbose_name=_("Podaci tablice radnih sati"),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
ordering = ['-updated_at']
|
||||
verbose_name = _("Tablica radnih sati")
|
||||
verbose_name_plural = _("Tablice radnih sati")
|
||||
|
||||
def __str__(self):
|
||||
return f"Work hours table for task {self.task_id}"
|
||||
|
||||
|
||||
class TaskTemplate(BaseModel):
|
||||
"""Predložak za brzo kreiranje servisnog radnog zadatka."""
|
||||
|
||||
code = models.SlugField(max_length=64, unique=True)
|
||||
title = models.CharField(max_length=255)
|
||||
description = models.TextField(blank=True)
|
||||
status = models.CharField(max_length=20, choices=Task.STATUS_CHOICES, default='aktivan')
|
||||
|
||||
class Meta:
|
||||
ordering = ['title']
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.title} ({self.code})"
|
||||
|
||||
|
||||
class TaskTemplateEntry(BaseModel):
|
||||
"""Predlošci radnih unosa koji se generiraju prilikom kreiranja Taska."""
|
||||
|
||||
task_template = models.ForeignKey(
|
||||
TaskTemplate,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='entries',
|
||||
)
|
||||
sort_order = models.PositiveSmallIntegerField(default=1)
|
||||
title = models.CharField(max_length=255)
|
||||
work_description = models.TextField(blank=True)
|
||||
active_faults = models.TextField(blank=True, help_text=_("Aktivne greške."))
|
||||
explanation_hr = models.TextField(blank=True, help_text=_("Obrazloženje na hrvatskom jeziku."))
|
||||
|
||||
class Meta:
|
||||
ordering = ['sort_order', 'created_at']
|
||||
constraints = [
|
||||
models.UniqueConstraint(
|
||||
fields=['task_template', 'sort_order'],
|
||||
name='task_template_entry_sort_order_unique',
|
||||
)
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.task_template.code} #{self.sort_order} - {self.title}"
|
||||
|
||||
|
||||
class TaskWorkEntry(BaseModel):
|
||||
"""Radni unos na konkretnom Tasku (generiran iz templatea ili ručno)."""
|
||||
|
||||
task = models.ForeignKey(
|
||||
Task,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='work_entries',
|
||||
)
|
||||
template_entry = models.ForeignKey(
|
||||
TaskTemplateEntry,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='task_work_entries',
|
||||
)
|
||||
sort_order = models.PositiveSmallIntegerField(default=1)
|
||||
title = models.CharField(max_length=255)
|
||||
work_description = models.TextField(blank=True)
|
||||
active_faults = models.TextField(blank=True)
|
||||
explanation_hr = models.TextField(blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['sort_order', 'created_at']
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.task_id} #{self.sort_order} - {self.title}"
|
||||
|
||||
Reference in New Issue
Block a user