|
|
|
|
@@ -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
|
|
|
|
|
|