feat: dodaj bilješke widget i admin kalendar/notifikacije
Uveden je novi Notes drawer s kalendar integracijom, zajednički DRY left-slide mehanizam te međusobno isključivo prikazivanje s Kalendar widgetom. Backend i frontend su prošireni za servisne bilješke (uključujući slanje na više servisera), dodan je users/servicers endpoint, te su uvedene warning notifikacije kada serviser ima više od 2 zadatka isti dan. U admin su dodane stavke za Bilješke i zaseban Kalendar zadataka (proxy TaskCalendar) radi lakšeg operativnog pregleda. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -565,4 +565,72 @@ class VehicleNotification(BaseModel):
|
||||
ordering = ['-created_at']
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.title} -> {self.recipient} ({self.level})"
|
||||
return f"{self.title} -> {self.recipient} ({self.level})"
|
||||
|
||||
|
||||
class ServiceContextNote(BaseModel):
|
||||
AUDIENCE_SOURCE_CHOICES = [
|
||||
('self', 'Samo autor'),
|
||||
('member', 'Odabrani član tima'),
|
||||
('team', 'Svi članovi tima'),
|
||||
]
|
||||
|
||||
created_by = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='created_service_context_notes',
|
||||
verbose_name=_("Kreirao"),
|
||||
)
|
||||
recipient = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='service_context_notes',
|
||||
verbose_name=_("Primatelj"),
|
||||
)
|
||||
audience_source = models.CharField(
|
||||
max_length=16,
|
||||
choices=AUDIENCE_SOURCE_CHOICES,
|
||||
default='self',
|
||||
verbose_name=_("Publika"),
|
||||
)
|
||||
work_order = models.ForeignKey(
|
||||
WorkOrder,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='service_context_notes',
|
||||
verbose_name=_("Putni nalog"),
|
||||
)
|
||||
task = models.ForeignKey(
|
||||
'task_management.Task',
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='service_context_notes',
|
||||
verbose_name=_("Radni zadatak"),
|
||||
)
|
||||
note = models.TextField(verbose_name=_("Bilješka"))
|
||||
note_date = models.DateField(
|
||||
null=True,
|
||||
blank=True,
|
||||
db_index=True,
|
||||
verbose_name=_("Datum podsjetnika"),
|
||||
)
|
||||
is_closed = models.BooleanField(default=False, verbose_name=_("Ručno zatvoreno"))
|
||||
closed_at = models.DateTimeField(null=True, blank=True, verbose_name=_("Vrijeme zatvaranja"))
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Bilješka servisnog konteksta")
|
||||
verbose_name_plural = _("Bilješke servisnog konteksta")
|
||||
ordering = ['is_closed', 'note_date', '-created_at']
|
||||
|
||||
def __str__(self):
|
||||
return f"Note {self.pk} -> {self.recipient_id}"
|
||||
|
||||
def clean(self):
|
||||
super().clean()
|
||||
if self.task_id and self.work_order_id and self.task and self.task.work_order_id:
|
||||
if self.task.work_order_id != self.work_order_id:
|
||||
raise ValidationError({
|
||||
'task': _("Radni zadatak mora biti povezan s istim putnim nalogom kao bilješka."),
|
||||
})
|
||||
Reference in New Issue
Block a user