@@ -30,7 +30,7 @@ def get_events(request):
3030 try :
3131 search_term = request .GET .get ("search" , "" ).strip ()
3232
33- queryset = Events .objects .all ( ).order_by ("dtstart" )
33+ queryset = Events .objects .filter ( status__iexact = "CONFIRMED" ).order_by ("dtstart" )
3434 filterset = EventFilter (request .GET , queryset = queryset )
3535 if not filterset .is_valid ():
3636 return Response (
@@ -50,27 +50,19 @@ def get_events(request):
5050 # Build OR query: match any of the search terms in any field
5151 or_queries = Q ()
5252 for term in search_terms :
53- # Special handling for "free food" search
54- if term .lower () == "free food" :
55- term_query = Q (
56- (Q (price__isnull = True ) | Q (price = 0 ) | Q (price__icontains = "free" ))
57- & Q (food__isnull = False )
58- & ~ Q (food = "" )
59- )
60- else :
61- term_query = (
62- Q (title__icontains = term )
63- | Q (location__icontains = term )
64- | Q (description__icontains = term )
65- | Q (food__icontains = term )
66- | Q (club_type__icontains = term )
67- | Q (school__icontains = term )
68- | Q (ig_handle__icontains = term )
69- | Q (discord_handle__icontains = term )
70- | Q (x_handle__icontains = term )
71- | Q (tiktok_handle__icontains = term )
72- | Q (fb_handle__icontains = term )
73- )
53+ term_query = (
54+ Q (title__icontains = term )
55+ | Q (location__icontains = term )
56+ | Q (description__icontains = term )
57+ | Q (food__icontains = term )
58+ | Q (club_type__icontains = term )
59+ | Q (school__icontains = term )
60+ | Q (ig_handle__icontains = term )
61+ | Q (discord_handle__icontains = term )
62+ | Q (x_handle__icontains = term )
63+ | Q (tiktok_handle__icontains = term )
64+ | Q (fb_handle__icontains = term )
65+ )
7466 or_queries |= term_query
7567
7668 keyword_events = filtered_queryset .filter (or_queries )
@@ -111,6 +103,7 @@ def get_events(request):
111103 "x_handle" ,
112104 "tiktok_handle" ,
113105 "fb_handle" ,
106+ "other_handle" ,
114107 ]
115108 results = list (filtered_queryset .values (* fields ))
116109
@@ -449,13 +442,14 @@ def rss_feed(request):
449442
450443
451444@api_view (["POST" ])
452- @permission_classes ([AllowAny ])
445+ @permission_classes ([ClerkAuthenticated ])
453446@ratelimit (key = "ip" , rate = "5/hr" , block = True )
454447def submit_event (request ):
455448 """Submit event for review - accepts screenshot file and source URL, runs extraction, creates Event and links submission"""
456449 try :
457450 screenshot = request .FILES .get ("screenshot" )
458451 source_url = request .data .get ("source_url" )
452+ other_handle = request .data .get ("other_handle" )
459453
460454 if not screenshot or not source_url :
461455 return Response (
@@ -483,8 +477,12 @@ def submit_event(request):
483477 if isinstance (event_data , dict ):
484478 event_data ["source_url" ] = source_url
485479 event_data ["source_image_url" ] = event_data .get ("source_image_url" ) or screenshot_url
480+ if other_handle :
481+ event_data ["other_handle" ] = other_handle
486482 else :
487483 event_data = {"source_url" : source_url , "source_image_url" : screenshot_url }
484+ if other_handle :
485+ event_data ["other_handle" ] = other_handle
488486
489487 # Create Event immediately and link submission
490488 allowed_fields = {f .name for f in Events ._meta .get_fields ()}
@@ -502,6 +500,9 @@ def submit_event(request):
502500 status = status .HTTP_400_BAD_REQUEST ,
503501 )
504502
503+ # Create event with pending status by default
504+ if "status" not in cleaned or not cleaned .get ("status" ):
505+ cleaned ["status" ] = "PENDING"
505506 event = Events .objects .create (** cleaned )
506507
507508 # Attempt to capture submitting user if available (optional for anonymous)
0 commit comments