|
2 | 2 | from django.db.models import Prefetch |
3 | 3 | from rest_framework import permissions, viewsets |
4 | 4 | from rest_framework.renderers import JSONRenderer |
| 5 | +from rest_framework.response import Response |
5 | 6 | from rest_framework.versioning import NamespaceVersioning |
6 | 7 |
|
7 | 8 | from dora.core.pagination import OptionalPageNumberPagination |
| 9 | +from dora.decoupage_administratif.models import ( |
| 10 | + EPCI, |
| 11 | + AdminDivisionType, |
| 12 | + City, |
| 13 | +) |
8 | 14 | from dora.orientations.models import Orientation, OrientationStatus |
9 | 15 | from dora.services.models import Service |
10 | 16 | from dora.structures.models import DisabledDoraFormDIStructure |
@@ -58,6 +64,31 @@ def get_queryset(self): |
58 | 64 | .order_by("pk") |
59 | 65 | ) |
60 | 66 |
|
| 67 | + def _warm_geo_caches(self, services): |
| 68 | + city_codes = [ |
| 69 | + s.diffusion_zone_details |
| 70 | + for s in services |
| 71 | + if s.diffusion_zone_type == AdminDivisionType.CITY |
| 72 | + ] |
| 73 | + epci_codes = [ |
| 74 | + s.diffusion_zone_details |
| 75 | + for s in services |
| 76 | + if s.diffusion_zone_type == AdminDivisionType.EPCI |
| 77 | + ] |
| 78 | + City.objects.warm_cache(city_codes) |
| 79 | + EPCI.objects.warm_cache(epci_codes) |
| 80 | + |
| 81 | + def list(self, request, *args, **kwargs): |
| 82 | + queryset = self.filter_queryset(self.get_queryset()) |
| 83 | + page = self.paginate_queryset(queryset) |
| 84 | + if page is not None: |
| 85 | + self._warm_geo_caches(page) |
| 86 | + serializer = self.get_serializer(page, many=True) |
| 87 | + return self.get_paginated_response(serializer.data) |
| 88 | + self._warm_geo_caches(queryset) |
| 89 | + serializer = self.get_serializer(queryset, many=True) |
| 90 | + return Response(serializer.data) |
| 91 | + |
61 | 92 |
|
62 | 93 | class DisabledDoraFormDIStructureViewSet(viewsets.ReadOnlyModelViewSet): |
63 | 94 | versioning_class = NamespaceVersioning |
|
0 commit comments