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 17:24 +0000

1"""Saved pipeline views router: GET/POST/DELETE /api/saved-views (mounted at "").""" 

2 

3from django.db.models import Q 

4from ninja import Router 

5 

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 

11 

12router = Router(tags=["saved-views"]) 

13 

14 

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 ) 

26 

27 

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 

32 

33 

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