From ff74aad3e59cf5ac81447db3e48d8d03bd2ae4cf Mon Sep 17 00:00:00 2001 From: rizwanisready Date: Mon, 27 May 2024 15:44:00 +0530 Subject: [PATCH] optimized event api query and added events till 7 days --- goodtimes/services.py | 149 ++++++++++--------------------- manage_events/api/serializers.py | 8 +- manage_events/api/views.py | 5 +- 3 files changed, 55 insertions(+), 107 deletions(-) diff --git a/goodtimes/services.py b/goodtimes/services.py index 0468a27..cc22c0e 100644 --- a/goodtimes/services.py +++ b/goodtimes/services.py @@ -147,7 +147,9 @@ class SMSService: raise SMSError(message=str(e)) def create_otp(self, principal: IAmPrincipal, opt_purpose: str): - old_otp_change = IAmPrincipalOtp.objects.filter(principal=principal).update(is_used=True) + old_otp_change = IAmPrincipalOtp.objects.filter(principal=principal).update( + is_used=True + ) print("Everything Is Used..!!") otp = IAmPrincipalOtp.objects.create( principal=principal, otp_purpose=opt_purpose @@ -436,19 +438,22 @@ class InteractionCalculator: class EventFilterService: + today = timezone.now().date() + one_week_ago = today - timedelta(days=7) + + # Base query for events that are active, not deleted, not draft, created by active users, and visible up to 1 week after their end date + base_event_query = Event.objects.filter( + active=True, + deleted=False, + draft=False, + end_date__gte=one_week_ago, + created_by__is_active=True, + ).distinct() + @staticmethod def filter_events_by_search(search_query=None): - today = timezone.now().date() - # Filter events that are active, not deleted, not draft, and created by active users - filtered_events = Event.objects.filter( - deleted=False, - active=True, - draft=False, - created_by__is_active=True, - end_date__gte=today, # Only include events that end today or in the future - ) + filtered_events = EventFilterService.base_event_query - # Optional search filtering on title, key_guest, venue address, and tags if search_query: print("search_query: ", search_query) filtered_events = filtered_events.filter( @@ -458,136 +463,76 @@ class EventFilterService: | Q(tags__name__icontains=search_query) ) print("filtered_events: ", filtered_events) + else: + # Filter events where key_guest is not null if no search query is provided + filtered_events = filtered_events.filter( + Q(key_guest__isnull=False) & ~Q(key_guest__exact="") + ) - # Ensure results are distinct - filtered_events = filtered_events.distinct() - - return filtered_events + return filtered_events.distinct() @staticmethod def filter_events_by_tags(search_query=None): - today = timezone.now().date() + filtered_events = EventFilterService.base_event_query + if search_query: print("search_query: ", search_query) - filtered_events = Event.objects.filter( + filtered_events = filtered_events.filter( tags__isnull=False, - deleted=False, - active=True, - draft=False, - created_by__is_active=True, tags__name__icontains=search_query, ) - - # filtered_events = ( - # filtered_events.annotate( - # matched_tags=Count( - # "tags", - # filter=Q(tags__name__icontains=search_query), - # distinct=True, - # ) - # ) - # .filter(matched_tags__gt=0) - # .distinct() - # ) print("filtered_events: ", filtered_events) - # Filter for current, future, or ongoing events - current_and_future_events_query = Q( - start_date__lte=today, end_date__gte=today - ) | Q(start_date__gt=today) - filtered_events = filtered_events.filter(current_and_future_events_query) - - return filtered_events + return filtered_events.distinct() @staticmethod def filter_events(filter_type, principal=None): - today = timezone.now().date() - events = Event.objects.none() - - current_and_future_events_query = Q( - active=True, deleted=False, draft=False, created_by__is_active=True - ) & (Q(start_date__lte=today, end_date__gte=today) | Q(start_date__gt=today)) + events = EventFilterService.base_event_query if filter_type == "expensive": - events = Event.objects.filter(current_and_future_events_query).order_by( - "-entry_fee" - ) + events = events.order_by("-entry_fee") elif filter_type == "cheap": - events = Event.objects.filter(current_and_future_events_query).order_by( - "entry_fee" - ) + events = events.order_by("entry_fee") elif filter_type == "preference" and principal is not None: preferences = PrincipalPreference.objects.get(principal=principal) - preferred_categories_ids = preferences.preferred_categories.values_list( - "id", flat=True - ) - events = Event.objects.filter( - category__in=preferred_categories_ids, - end_date__gte=today, - draft=False, - active=True, - deleted=False, - created_by__is_active=True, - ).distinct() + preferred_categories_ids = preferences.preferred_categories.values_list("id", flat=True) + events = events.filter(category__in=preferred_categories_ids) - return events + return events.distinct() @staticmethod def filter_events_by_category(category_id): - today = timezone.now().date() + events = EventFilterService.base_event_query - current_and_future_events_query = Q( - active=True, deleted=False, draft=False, created_by__is_active=True - ) & (Q(start_date__lte=today, end_date__gte=today) | Q(start_date__gt=today)) - - # Ensure the category_id is valid and within the specified range (1-8) + # Ensure the category_id is valid and within the specified range (1-10) if 1 <= category_id <= 10: - events = Event.objects.filter( - current_and_future_events_query, category_id=category_id - ).distinct() + events = events.filter(category_id=category_id) else: - events = ( - Event.objects.none() - ) # Return an empty queryset if the category_id is not valid + events = Event.objects.none() # Return an empty queryset if the category_id is not valid - return events + return events.distinct() @staticmethod def filter_events_for_tomorrow(): - today = timezone.now().date() - tomorrow = today + timezone.timedelta(days=1) + tomorrow = EventFilterService.today + timezone.timedelta(days=1) - # Events that are starting tomorrow, ending tomorrow, or have an end date greater than tomorrow - events_query = ( - Q(start_date=tomorrow) - | Q(end_date=tomorrow) - | (Q(start_date__lte=tomorrow) & Q(end_date__gte=tomorrow)) + events = EventFilterService.base_event_query.filter( + start_date__lte=tomorrow, + end_date__gte=tomorrow, ) - events = Event.objects.filter( - events_query, - active=True, - deleted=False, - draft=False, - created_by__is_active=True, - ).distinct() - return events + return events.distinct() @staticmethod def filter_events_for_today(): - today = timezone.now().date() - print("Today: ", today) + print("Today: ", EventFilterService.today) - events = Event.objects.filter( - active=True, - deleted=False, - draft=False, - start_date__lte=today, - end_date__gte=today, - created_by__is_active=True, + events = EventFilterService.base_event_query.filter( + start_date__lte=EventFilterService.today, + end_date__gte=EventFilterService.today, ) - return events + return events.distinct() # ye package ka naam hai diff --git a/manage_events/api/serializers.py b/manage_events/api/serializers.py index f7ba42d..a371140 100644 --- a/manage_events/api/serializers.py +++ b/manage_events/api/serializers.py @@ -61,19 +61,19 @@ class EventListSerializer(serializers.ModelSerializer): "end_date", # "from_time", # "to_time", - # "category", - # "venue", + "category", + "venue", # "venue_capacity", "image", # "video_url", # "entry_type", "entry_fee", - # "key_guest", + "key_guest", # "age_group", # "images", # "is_favorited", # "reviews", - # "tags", + "tags", # "principal_interaction", # "draft", ] diff --git a/manage_events/api/views.py b/manage_events/api/views.py index 7a53e93..0c72a3a 100644 --- a/manage_events/api/views.py +++ b/manage_events/api/views.py @@ -245,7 +245,10 @@ class MyEventsAPIView(APIView): errors="Invalid filter parameter", ) - serializer = EventDetailSerializer( + # serializer = EventDetailSerializer( + # events, context={"request": request}, many=True + # ) + serializer = EventListSerializer( events, context={"request": request}, many=True ) return ApiResponse.success(