feat(filter):refactor sorting logic

This commit is contained in:
bobbyvish
2024-07-30 12:41:41 +05:30
parent 27a124b0b2
commit ce676aa81d
2 changed files with 29 additions and 23 deletions

View File

@@ -31,4 +31,10 @@ class EventFilter(filters.FilterSet):
def filter_category(self, queryset, name, value):
category = value.split(',')
return queryset.filter(category__title__in=category)
return queryset.filter(category__title__in=category)
# def filter_queryset(self, queryset):
# queryset = super().filter_queryset(queryset)
# if 'price_from' in self.data or 'price_to' in self.data:
# queryset = queryset.order_by('entry_fee')
# return queryset

View File

@@ -1010,31 +1010,28 @@ class EventListView(generics.ListAPIView):
def get_queryset(self):
# Base queryset filtering active, non-draft, non-deleted events with end date in the future
print(f"queryparams is {self.request.query_params}")
queryset = Event.objects.filter(
active=True,
draft=False,
deleted=False,
end_date__gte=timezone.now().date()
)
if self.request.query_params:
queryset = Event.objects.filter(
active=True,
draft=False,
deleted=False,
end_date__gte=timezone.now().date()
)
else:
if not self.request.query_params:
preferences = PrincipalPreference.objects.get(principal=self.request.user)
preferred_categories_ids = preferences.preferred_categories.values_list(
"id", flat=True
)
queryset = Event.objects.filter(
active=True,
draft=False,
deleted=False,
end_date__gte=timezone.now().date(),
category__in=preferred_categories_ids
)
queryset = queryset.filter(category__in=preferred_categories_ids).order_by("start_date")
return queryset
def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset)
# Get query parameters
latitude = self.request.query_params.get("latitude")
longitude = self.request.query_params.get("longitude")
latitude = self.request.query_params.get("latitude", "")
longitude = self.request.query_params.get("longitude", "")
ordering = self.request.query_params.get("sort", "")
# Handle nearest location sorting
@@ -1042,8 +1039,7 @@ class EventListView(generics.ListAPIView):
queryset = self.apply_nearest_filter(queryset, latitude, longitude)
# Handle popularity and latest sorting
# if ordering:
queryset = self.apply_popularity_latest(queryset, ordering)
queryset = self.apply_sorting(queryset, ordering)
return queryset
@@ -1051,7 +1047,7 @@ class EventListView(generics.ListAPIView):
gmaps_service = GoogleMapsservice()
return gmaps_service.get_nearest_events(queryset, float(latitude), float(longitude))
def apply_popularity_latest(self, queryset, ordering):
def apply_sorting(self, queryset, ordering):
# Split ordering fields and process each field
ordering_fields = [field.lstrip("-") for field in ordering.split(",")]
@@ -1065,7 +1061,11 @@ class EventListView(generics.ListAPIView):
queryset = queryset.annotate(popularity=Count("interaction_event")).order_by("-popularity")
# order latest record and by default sorting
queryset = queryset.order_by("start_date")
if "latest" in ordering_fields:
queryset = queryset.order_by("start_date")
if "price" in ordering_fields:
queryset = queryset.order_by('entry_fee')
return queryset