feat(filter):refactor sorting logic
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user