feat: dodaj bilješke widget i admin kalendar/notifikacije
Some checks failed
ERP CI/CD Pipeline / test (push) Has been cancelled
ERP CI/CD Pipeline / Deploy (server git pull + compose) (push) Has been cancelled

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:
mariomitte
2026-07-20 06:33:36 +02:00
parent 61996bd1a0
commit 1a18498b30
20 changed files with 1312 additions and 113 deletions

View File

@@ -1,5 +1,7 @@
from django.test import TestCase
from django.contrib.auth import get_user_model
from unittest.mock import patch
from datetime import date
from rest_framework.exceptions import ValidationError
from modules.task_management.services import TaskService
from modules.task_management.exceptions import OpenWorkOrderBlockingTaskClose
@@ -192,4 +194,76 @@ class TaskServiceTests(TestCase):
)
self.assertEqual(TaskWorkEntry.objects.filter(task=created).count(), 10)
self.assertEqual(VehicleServiceRecord.objects.filter(task=created).count(), 10)
self.assertEqual(VehicleServiceRecord.objects.filter(task=created).count(), 10)
@patch('modules.fleet.services.NotificationService.create_notification')
def test_create_task_entry_sends_overload_notifications_after_two_tasks(self, mock_notify):
servicer = get_user_model().objects.create_user(
username='servicer-overload',
email='servicer-overload@example.test',
password='test1234',
is_serviser=True,
is_team_member=True,
)
supervisor = get_user_model().objects.create_user(
username='supervisor-overload',
email='supervisor-overload@example.test',
password='test1234',
is_team_member=True,
is_serviser=False,
)
vehicle = Vehicle.objects.create(registration_number="ZG-TASK-OVER1", asset_type='crane')
scheduled = date(2026, 7, 21)
Task.objects.create(title="Postojeći 1", assigned_to=servicer, vehicle=vehicle, status='aktivan', scheduled_date=scheduled)
Task.objects.create(title="Postojeći 2", assigned_to=servicer, vehicle=vehicle, status='servis', scheduled_date=scheduled)
TaskService.create_task_entry(
data={
"title": "Treći task",
"status": "aktivan",
"assigned_to": servicer,
"vehicle": vehicle,
"scheduled_date": scheduled,
},
user=self.staff,
)
recipients = [call.kwargs.get('recipient') for call in mock_notify.call_args_list]
recipient_ids = {str(recipient.id) for recipient in recipients if recipient}
self.assertIn(str(servicer.id), recipient_ids)
self.assertIn(str(supervisor.id), recipient_ids)
@patch('modules.fleet.services.NotificationService.create_notification')
def test_create_task_entry_does_not_send_overload_notifications_when_two_or_less(self, mock_notify):
servicer = get_user_model().objects.create_user(
username='servicer-normal-load',
email='servicer-normal-load@example.test',
password='test1234',
is_serviser=True,
is_team_member=True,
)
vehicle = Vehicle.objects.create(registration_number="ZG-TASK-OVER2", asset_type='crane')
scheduled = date(2026, 7, 21)
TaskService.create_task_entry(
data={
"title": "Prvi task",
"status": "aktivan",
"assigned_to": servicer,
"vehicle": vehicle,
"scheduled_date": scheduled,
},
user=self.staff,
)
TaskService.create_task_entry(
data={
"title": "Drugi task",
"status": "aktivan",
"assigned_to": servicer,
"vehicle": vehicle,
"scheduled_date": scheduled,
},
user=self.staff,
)
self.assertEqual(mock_notify.call_count, 0)