Skip to content

Commit b7a9583

Browse files
fix: filter privacy overview KPIs (#2959)
* fix: filter privacy overview KPIs * restric more gdpr metrics --------- Co-authored-by: Abderrahmane Smimite <[email protected]>
1 parent 8af25ee commit b7a9583

File tree

2 files changed

+79
-22
lines changed

2 files changed

+79
-22
lines changed

backend/privacy/models.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,10 @@ def save(self, *args, **kwargs):
251251
self.processing.save(update_fields=["has_sensitive_personal_data"])
252252

253253
@classmethod
254-
def get_categories_count(cls):
254+
def get_categories_count(cls, filters: dict = {}):
255255
categories = (
256-
cls.objects.values("category")
256+
cls.objects.filter(**filters)
257+
.values("category")
257258
.annotate(count=Count("id"))
258259
.order_by("-count")
259260
)

backend/privacy/views.py

Lines changed: 76 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from itertools import chain
99
from collections import defaultdict
1010

11+
from iam.models import Folder, RoleAssignment
12+
1113
from .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

Comments
 (0)