55import django .utils .timezone as timezone
66from reversion .views import RevisionMixin
77from django .contrib .auth .models import Permission
8+ from django .db import models
89
910from rest_framework import (
1011 views ,
4546from dref .permissions import PublishDrefPermission
4647
4748
49+ def filter_dref_queryset_by_user_access (user , queryset ):
50+ if user .is_superuser :
51+ return queryset
52+ # Check if regional admin
53+ dref_admin_regions_id = [
54+ codename .replace ('dref_region_admin_' , '' )
55+ for codename in Permission .objects .filter (
56+ group__user = user ,
57+ codename__startswith = 'dref_region_admin_' ,
58+ ).values_list ('codename' , flat = True )
59+ ]
60+ if len (dref_admin_regions_id ):
61+ return queryset .filter (
62+ models .Q (created_by = user ) | models .Q (country__region__in = dref_admin_regions_id )
63+ ).distinct ()
64+ # Normal access
65+ return queryset .model .get_for (user )
66+
67+
4868class DrefViewSet (RevisionMixin , viewsets .ModelViewSet ):
4969 serializer_class = DrefSerializer
5070 permission_classes = [permissions .IsAuthenticated ]
@@ -57,10 +77,8 @@ def get_queryset(self):
5777 .order_by ("-created_at" )
5878 .distinct ()
5979 )
60- if user .is_superuser :
61- return queryset
62- else :
63- return Dref .get_for (user )
80+ return filter_dref_queryset_by_user_access (user , queryset )
81+
6482
6583 @action (
6684 detail = True ,
@@ -107,10 +125,7 @@ def get_queryset(self):
107125 .order_by ("-created_at" )
108126 .distinct ()
109127 )
110- if user .is_superuser :
111- return queryset
112- else :
113- return DrefOperationalUpdate .get_for (user )
128+ return filter_dref_queryset_by_user_access (user , queryset )
114129
115130 @action (
116131 detail = True ,
@@ -142,10 +157,7 @@ def get_queryset(self):
142157 .order_by ("-created_at" )
143158 .distinct ()
144159 )
145- if user .is_superuser :
146- return queryset
147- else :
148- return DrefFinalReport .get_for (user )
160+ return filter_dref_queryset_by_user_access (user , queryset )
149161
150162 @action (
151163 detail = True ,
0 commit comments