Skip to content

Commit

Permalink
🐛 Fix APIv2 filters performances were deteriorated
Browse files Browse the repository at this point in the history
  • Loading branch information
Chatewgne committed Feb 2, 2023
1 parent d72a2d3 commit 7e6e1b3
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 25 deletions.
10 changes: 10 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ CHANGELOG
2.96.0+dev (XXXX-XX-XX)
-----------------------

**Bug fixes**

- Fix APIv2 filters deteriorated performances

**Improvements**

- Sensitivity: Add missing attachments list to sensitive areas API
Expand All @@ -13,6 +17,12 @@ CHANGELOG
2.96.0 (2023-02-01)
-----------------------

**DO NOT USE IT!**

**Warning**

- APIv2 filters performances are deteriorated - Skip to 2.96.1 instead

**New feature**

- Handle very high resolution images (HD Views) that will automatically be tiled, for ``Trek``, ``POI`` and ``Site`` (#3378)
Expand Down
47 changes: 23 additions & 24 deletions geotrek/api/v2/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -960,14 +960,7 @@ def get_schema_fields(self, view):
class RelatedObjectsPublishedNotDeletedFilter(BaseFilterBackend):

def filter_queryset_related_objects_published_not_deleted(self, qs, request, related_name, optional_query=Q()):
# Exclude if no related objects exist
# ####################################
# Should be :
# qs = qs.exclude(**{'{}'.format(related_name): None})
# But we need to bypass this bug : https://code.djangoproject.com/ticket/26261
# TODO Revert when using Django > 4.2
qs = qs.filter(**{'{}__isnull'.format(related_name): False})
# ####################################
qs = qs.exclude(**{'{}'.format(related_name): None})
# Ensure no deleted content is taken in consideration in the filter
related_field_name = '{}__deleted'.format(related_name)
optional_query &= Q(**{related_field_name: False})
Expand Down Expand Up @@ -1017,25 +1010,13 @@ def filter_queryset_related_objects_by_portal(self, request, related_name):

def filter_queryset_related_objects_published_not_deleted_by_portal(self, qs, request, related_name):
# Exclude if no related objects exist
# ####################################
# Should be :
# qs = qs.exclude(**{'{}'.format(related_name): None})
# But we need to bypass this bug : https://code.djangoproject.com/ticket/26261
# TODO Revert when using Django > 4.2
qs = qs.filter(**{'{}__isnull'.format(related_name): False})
# ####################################
qs = qs.exclude(**{'{}'.format(related_name): None})
portal_query = self.filter_queryset_related_objects_by_portal(request, related_name)
return self.filter_queryset_related_objects_published_not_deleted(qs, request, related_name, portal_query)

def filter_queryset_related_objects_published_by_portal(self, qs, request, related_name):
# Exclude if no related objects exist
# ####################################
# Should be :
# qs = qs.exclude(**{'{}'.format(related_name): None})
# But we need to bypass this bug : https://code.djangoproject.com/ticket/26261
# TODO Revert when using Django > 4.2
qs = qs.filter(**{'{}__isnull'.format(related_name): False})
# ####################################
qs = qs.exclude(**{'{}'.format(related_name): None})
portal_query = self.filter_queryset_related_objects_by_portal(request, related_name)
return self.filter_queryset_related_objects_published(qs, request, related_name, portal_query)

Expand Down Expand Up @@ -1097,13 +1078,31 @@ def filter_queryset(self, request, qs, view):
return self.filter_queryset_related_objects_published_not_deleted_by_portal(qs, request, 'contents')


class TrekAndSiteAndPOIRelatedPublishedNotDeletedByPortalFilter(RelatedObjectsPublishedNotDeletedByPortalFilter):
class HDViewPointPublishedByPortalFilter(RelatedObjectsPublishedNotDeletedByPortalFilter):

def filter_queryset_related_objects_published_not_deleted_by_portal(self, qs, request, related_name):
# ####################################
# Should be :
# qs = qs.exclude(**{'{}'.format(related_name): None})
# But we need to bypass this bug : https://code.djangoproject.com/ticket/26261
# TODO Revert when using Django > 4.2
qs = qs.filter(**{'{}__isnull'.format(related_name): False})
# ####################################
# Ensure no deleted content is taken in consideration in the filter
portal_query = self.filter_queryset_related_objects_by_portal(request, related_name)
related_field_name = '{}__deleted'.format(related_name)
portal_query &= Q(**{related_field_name: False})
return self.filter_queryset_related_objects_published(qs, request, related_name, portal_query)

def filter_queryset(self, request, qs, view):
set_1 = self.filter_queryset_related_objects_published_not_deleted_by_portal(qs, request, 'trek')
set_2 = self.filter_queryset_related_objects_published_not_deleted_by_portal(qs, request, 'poi')
set_3 = qs.none()
if 'geotrek.outdoor' in settings.INSTALLED_APPS:
set_3 = self.filter_queryset_related_objects_published_by_portal(qs, request, 'site')
related_name = 'site'
qs = qs.filter(**{'{}__isnull'.format(related_name): False})
portal_query = self.filter_queryset_related_objects_by_portal(request, related_name)
set_3 = self.filter_queryset_related_objects_published(qs, request, related_name, portal_query)
return (set_1 | set_2 | set_3).distinct()


Expand Down
2 changes: 1 addition & 1 deletion geotrek/api/v2/views/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ class FileTypeViewSet(api_viewsets.GeotrekViewSet):

class HDViewPointViewSet(api_viewsets.GeotrekGeometricViewset):
serializer_class = api_serializers.HDViewPointSerializer
filter_backends = api_viewsets.GeotrekGeometricViewset.filter_backends + (api_filters.TrekAndSiteAndPOIRelatedPublishedNotDeletedByPortalFilter,)
filter_backends = api_viewsets.GeotrekGeometricViewset.filter_backends + (api_filters.HDViewPointPublishedByPortalFilter,)

def get_queryset(self):
activate(self.request.GET.get('language'))
Expand Down

0 comments on commit 7e6e1b3

Please sign in to comment.