Coverage for apps/core_los/saved_views_api.py: 100%
23 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-04 14:06 +0000
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-04 14:06 +0000
1"""Saved pipeline views router: GET/POST/DELETE /api/saved-views (mounted at "")."""
3from django.db.models import Q
4from ninja import Router
6from apps.accounts.auth import requires
7from apps.accounts.models import User
8from apps.core_los.models import SavedView
9from apps.core_los.schemas import SavedViewCreate, SavedViewOut
10from domain.result import AppError, DomainError
12router = Router(tags=["saved-views"])
15@router.get("/saved-views", response=list[SavedViewOut], auth=requires("LOAN_VIEW"))
16def list_saved_views(request):
17 principal = request.principal
18 sharers = User.objects.filter(org_unit_id__in=principal.org_unit_ids).values_list(
19 "id", flat=True
20 )
21 return list(
22 SavedView.objects.filter(
23 Q(owner_id=principal.user_id) | Q(shared=True, owner_id__in=sharers)
24 )
25 )
28@router.post("/saved-views", response={201: SavedViewOut}, auth=requires("LOAN_VIEW"))
29def create_saved_view(request, payload: SavedViewCreate):
30 view = SavedView.objects.create(owner_id=request.principal.user_id, **payload.model_dump())
31 return 201, view
34@router.delete("/saved-views/{view_id}", response={204: None}, auth=requires("LOAN_VIEW"))
35def delete_saved_view(request, view_id: int):
36 deleted, _ = SavedView.objects.filter(
37 pk=view_id, owner_id=request.principal.user_id
38 ).delete()
39 if deleted == 0:
40 raise DomainError([AppError("NOT_FOUND", "Saved view not found")])
41 return 204, None