88from itertools import chain
99from collections import defaultdict
1010
11+ from iam .models import Folder , RoleAssignment
12+
1113from .models import (
1214 ProcessingNature ,
1315 Purpose ,
@@ -149,12 +151,16 @@ def legal_basis(self, request):
149151 return Response (dict (LEGAL_BASIS_CHOICES ))
150152
151153
152- def agg_countries ():
153- transfer_countries = DataTransfer .objects .values ("country" ).annotate (
154- count = Count ("id" )
154+ def agg_countries (viewable_data_transfers , viewable_data_contractors ):
155+ transfer_countries = (
156+ DataTransfer .objects .filter (id__in = viewable_data_transfers )
157+ .values ("country" )
158+ .annotate (count = Count ("id" ))
155159 )
156- contractor_countries = DataContractor .objects .values ("country" ).annotate (
157- count = Count ("id" )
160+ contractor_countries = (
161+ DataContractor .objects .filter (id__in = viewable_data_contractors )
162+ .values ("country" )
163+ .annotate (count = Count ("id" ))
158164 )
159165 country_counts = defaultdict (int )
160166 for item in chain (transfer_countries , contractor_countries ):
@@ -188,40 +194,88 @@ def metrics(self, request, pk=None):
188194
189195 @action (detail = False , name = "aggregated metrics" )
190196 def agg_metrics (self , request ):
191- pd_categories = PersonalData .get_categories_count ()
192- total_categories = len (pd_categories )
193- processings_count = Processing .objects .all ().count ()
197+ (viewable_processings , _ , _ ) = RoleAssignment .get_accessible_object_ids (
198+ folder = Folder .get_root_folder (),
199+ user = request .user ,
200+ object_type = Processing ,
201+ )
202+ (viewable_data_contractors , _ , _ ) = RoleAssignment .get_accessible_object_ids (
203+ folder = Folder .get_root_folder (),
204+ user = request .user ,
205+ object_type = DataContractor ,
206+ )
207+ (viewable_data_transfers , _ , _ ) = RoleAssignment .get_accessible_object_ids (
208+ folder = Folder .get_root_folder (),
209+ user = request .user ,
210+ object_type = DataTransfer ,
211+ )
212+ (viewable_right_requests , _ , _ ) = RoleAssignment .get_accessible_object_ids (
213+ folder = Folder .get_root_folder (),
214+ user = request .user ,
215+ object_type = RightRequest ,
216+ )
217+ (viewable_data_breaches , _ , _ ) = RoleAssignment .get_accessible_object_ids (
218+ folder = Folder .get_root_folder (),
219+ user = request .user ,
220+ object_type = DataBreach ,
221+ )
222+ (viewable_personal_data , _ , _ ) = RoleAssignment .get_accessible_object_ids (
223+ folder = Folder .get_root_folder (),
224+ user = request .user ,
225+ object_type = PersonalData ,
226+ )
227+ processings_count = Processing .objects .filter (
228+ id__in = viewable_processings
229+ ).count ()
194230
231+ pd_categories = PersonalData .get_categories_count (
232+ filters = {"id__in" : viewable_personal_data }
233+ )
234+ total_categories = len (pd_categories )
195235 # Count distinct entities from data contractors and data transfers
196236 contractor_entities = (
197- DataContractor .objects .filter (entity__isnull = False )
237+ DataContractor .objects .filter (
238+ id__in = viewable_data_contractors , entity__isnull = False
239+ )
198240 .values_list ("entity" , flat = True )
199241 .distinct ()
200242 )
201243 transfer_entities = (
202- DataTransfer .objects .filter (entity__isnull = False )
244+ DataTransfer .objects .filter (
245+ id__in = viewable_data_transfers , entity__isnull = False
246+ )
203247 .values_list ("entity" , flat = True )
204248 .distinct ()
205249 )
206250 recipients_count = len (set (list (contractor_entities ) + list (transfer_entities )))
207251
208- open_right_requests_count = RightRequest .objects .exclude (status = "done" ).count ()
209- open_data_breaches_count = DataBreach .objects .exclude (
210- status = "privacy_closed"
211- ).count ()
252+ open_right_requests_count = (
253+ RightRequest .objects .filter (id__in = viewable_right_requests )
254+ .exclude (status = "done" )
255+ .count ()
256+ )
257+ open_data_breaches_count = (
258+ DataBreach .objects .filter (id__in = viewable_data_breaches )
259+ .exclude (status = "privacy_closed" )
260+ .count ()
261+ )
212262
213263 # Aggregate data breaches by breach type
214- breach_types = DataBreach .objects .values ("breach_type" ).annotate (
215- count = Count ("id" )
264+ breach_types = (
265+ DataBreach .objects .filter (id__in = viewable_data_breaches )
266+ .values ("breach_type" )
267+ .annotate (count = Count ("id" ))
216268 )
217269 breach_type_data = [
218270 {"name" : item ["breach_type" ], "value" : item ["count" ]}
219271 for item in breach_types
220272 ]
221273
222274 # Aggregate right requests by request type
223- request_types = RightRequest .objects .values ("request_type" ).annotate (
224- count = Count ("id" )
275+ request_types = (
276+ RightRequest .objects .filter (id__in = viewable_right_requests )
277+ .values ("request_type" )
278+ .annotate (count = Count ("id" ))
225279 )
226280 request_type_data = [
227281 {"name" : item ["request_type" ], "value" : item ["count" ]}
@@ -237,7 +291,7 @@ def agg_metrics(self, request):
237291 personal_data = (
238292 PersonalData .objects .select_related ("processing" )
239293 .prefetch_related ("processing__purposes" , "processing__data_transfers" )
240- .all ( )
294+ .filter ( id__in = viewable_personal_data )
241295 )
242296
243297 for pd in personal_data :
@@ -322,7 +376,9 @@ def agg_metrics(self, request):
322376
323377 return Response (
324378 {
325- "countries" : agg_countries (),
379+ "countries" : agg_countries (
380+ viewable_data_transfers , viewable_data_contractors
381+ ),
326382 "processings_count" : processings_count ,
327383 "recipients_count" : recipients_count ,
328384 "pd_categories" : pd_categories ,
0 commit comments