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

@@ -58,4 +58,29 @@ class TestUserAPI:
self.user.refresh_from_db()
assert response.status_code == status.HTTP_200_OK
assert self.user.first_name == "Inženjer"
assert self.user.first_name == "Inženjer"
def test_get_servicers_returns_only_servicers(self):
serviser = User.objects.create_user(
email="serviser@test.hr",
first_name="Serviser",
last_name="Jedan",
password="strongpassword123",
is_serviser=True,
is_team_member=True,
)
non_serviser = User.objects.create_user(
email="nons@test.hr",
first_name="Nije",
last_name="Serviser",
password="strongpassword123",
is_serviser=False,
is_team_member=True,
)
self.client.force_authenticate(user=self.user)
url = reverse('user-servicers')
response = self.client.get(url)
assert response.status_code == status.HTTP_200_OK
returned_ids = {str(item['id']) for item in response.data}
assert str(serviser.id) in returned_ids
assert str(non_serviser.id) not in returned_ids

View File

@@ -30,6 +30,12 @@ class UserViewSet(viewsets.ModelViewSet):
serializer = TeamMemberSerializer(queryset, many=True)
return Response(serializer.data)
@action(detail=False, methods=['get'], url_path='servicers')
def servicers(self, request):
queryset = User.objects.filter(is_active=True, is_serviser=True).order_by('first_name', 'last_name', 'email')
serializer = TeamMemberSerializer(queryset, many=True)
return Response(serializer.data)
def perform_update(self, serializer):
# Delegiramo logiku servisu
UserService.update_user_profile(