Skip to content

Commit 616471a

Browse files
committed
feat: only display geozones associated to parcels$
1 parent 88d0556 commit 616471a

File tree

4 files changed

+40
-2
lines changed

4 files changed

+40
-2
lines changed

core/permissions/geo_custom_zone.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from core.permissions.base import BasePermission
66
from core.repository.geo_custom_zone import GeoCustomZoneRepository
77

8-
from django.db.models import QuerySet, Prefetch
8+
from django.db.models import Q, QuerySet, Prefetch
99

1010

1111
class GeoCustomZonePermission(
@@ -57,3 +57,19 @@ def get_detection_prefetch(self):
5757

5858
def get_parcel_prefetch(self):
5959
return self._get_prefetch()
60+
61+
def get_geo_custom_zones_q(self, lookup_root: str = "") -> Q:
62+
q = Q(
63+
**{
64+
f"{lookup_root}geo_custom_zones__geo_custom_zone_status": GeoCustomZoneStatus.ACTIVE
65+
}
66+
)
67+
68+
if self.user.user_role != UserRole.SUPER_ADMIN:
69+
q &= Q(
70+
**{
71+
f"{lookup_root}geo_custom_zones__user_groups_custom_geo_zones__user_user_groups__user": self.user.id
72+
}
73+
)
74+
75+
return q

core/repository/parcel.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def filter_(
8383
filter_detections_count_gt: Optional[int] = None,
8484
with_commune: bool = False,
8585
with_zone_names: bool = False,
86+
filter_geo_custom_zones: Optional[Q] = None,
8687
with_detections_count: bool = False,
8788
with_detections_objects_types: bool = False,
8889
*args,
@@ -143,6 +144,7 @@ def filter_(
143144
queryset = self._annotate_zone_names(
144145
queryset=queryset,
145146
with_zone_names=with_zone_names,
147+
filter_geo_custom_zones=filter_geo_custom_zones,
146148
)
147149
queryset = self._annotate_detections_count(
148150
queryset=queryset,
@@ -183,18 +185,24 @@ def _annotate_commune(
183185
def _annotate_zone_names(
184186
queryset: QuerySet[Parcel],
185187
with_zone_names: bool = False,
188+
filter_geo_custom_zones: Optional[Q] = None,
186189
) -> QuerySet[Parcel]:
187190
if not with_zone_names:
188191
return queryset
189192

193+
zone_names_filter = models.Q(geo_custom_zones__isnull=False)
194+
195+
if filter_geo_custom_zones is not None:
196+
zone_names_filter &= filter_geo_custom_zones
197+
190198
queryset = queryset.annotate(
191199
zone_names=ArrayAgg(
192200
Coalesce(
193201
"geo_custom_zones__geo_custom_zone_category__name",
194202
"geo_custom_zones__name",
195203
),
196204
distinct=True,
197-
filter=models.Q(geo_custom_zones__isnull=False),
205+
filter=zone_names_filter,
198206
),
199207
)
200208

core/services/parcel_filter.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from core.models.detection_data import DetectionControlStatus, DetectionValidationStatus
55
from core.models.tile_set import TileSetType, TileSetStatus
6+
from core.permissions.geo_custom_zone import GeoCustomZonePermission
67
from core.permissions.user import UserPermission
78
from core.permissions.tile_set import TileSetPermission
89
from core.repository.base import NumberRepoFilter, RepoFilterLookup
@@ -61,6 +62,9 @@ def apply_filters(
6162

6263
if with_details:
6364
filter_args["with_zone_names"] = True
65+
filter_args["filter_geo_custom_zones"] = GeoCustomZonePermission(
66+
user=self.user
67+
).get_geo_custom_zones_q()
6468
filter_args["with_detections_count"] = True
6569
filter_args["with_detections_objects_types"] = True
6670

core/views/parcel.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
ParcelSerializer,
2020
ParcelOverviewSerializer,
2121
)
22+
from core.permissions.geo_custom_zone import GeoCustomZonePermission
2223
from core.services.parcel_filter import ParcelFilterService
2324
from core.utils.filters import ChoiceInFilter, UuidInFilter
2425
from rest_framework.response import Response
@@ -139,6 +140,15 @@ def list_items(self, request):
139140
with_details=True,
140141
)
141142

143+
geo_custom_zones_prefetch, geo_custom_zones_category_prefetch = (
144+
GeoCustomZonePermission(user=self.request.user).get_parcel_prefetch()
145+
)
146+
147+
queryset = queryset.prefetch_related(
148+
geo_custom_zones_prefetch,
149+
geo_custom_zones_category_prefetch,
150+
)
151+
142152
queryset = queryset.distinct()
143153
page = self.paginate_queryset(queryset)
144154

0 commit comments

Comments
 (0)