@@ -126,6 +126,33 @@ async def nc_calendar_list_events(
126126 """
127127 client : NextcloudClient = ctx .request_context .lifespan_context .client
128128
129+ # Convert YYYY-MM-DD format dates to datetime objects
130+ start_datetime = None
131+ end_datetime = None
132+
133+ if start_date :
134+ try :
135+ start_datetime = dt .datetime .strptime (start_date , "%Y-%m-%d" )
136+ except ValueError :
137+ # If parsing fails, try to parse as ISO format
138+ try :
139+ start_datetime = dt .datetime .fromisoformat (start_date )
140+ except ValueError :
141+ logger .warning (f"Invalid start_date format: { start_date } " )
142+
143+ if end_date :
144+ try :
145+ # For end date, set to end of day (23:59:59)
146+ end_datetime = dt .datetime .strptime (end_date , "%Y-%m-%d" ).replace (
147+ hour = 23 , minute = 59 , second = 59
148+ )
149+ except ValueError :
150+ # If parsing fails, try to parse as ISO format
151+ try :
152+ end_datetime = dt .datetime .fromisoformat (end_date )
153+ except ValueError :
154+ logger .warning (f"Invalid end_date format: { end_date } " )
155+
129156 # Build filters dictionary
130157 filters = {}
131158 if min_attendees is not None :
@@ -144,17 +171,17 @@ async def nc_calendar_list_events(
144171 if search_all_calendars :
145172 # Search across all calendars with filters
146173 events = await client .calendar .search_events_across_calendars (
147- start_date = start_date ,
148- end_date = end_date ,
174+ start_datetime = start_datetime ,
175+ end_datetime = end_datetime ,
149176 filters = filters if filters else None ,
150177 )
151178 return events [:limit ]
152179 else :
153180 # Search in specific calendar
154181 events = await client .calendar .get_calendar_events (
155182 calendar_name = calendar_name ,
156- start_date = start_date ,
157- end_date = end_date ,
183+ start_datetime = start_datetime ,
184+ end_datetime = end_datetime ,
158185 limit = limit ,
159186 )
160187
@@ -302,7 +329,6 @@ async def nc_calendar_create_meeting(
302329 start_datetime = f"{ date } T{ time } :00"
303330
304331 # Calculate end_datetime
305-
306332 start_dt = dt .datetime .fromisoformat (start_datetime )
307333 end_dt = start_dt + dt .timedelta (minutes = duration_minutes )
308334 end_datetime = end_dt .isoformat ()
@@ -334,17 +360,14 @@ async def nc_calendar_get_upcoming_events(
334360 client : NextcloudClient = ctx .request_context .lifespan_context .client
335361
336362 now = dt .datetime .now ()
337- end_date = now + dt .timedelta (days = days_ahead )
338-
339- start_date_str = now .strftime ("%Y%m%dT%H%M%SZ" )
340- end_date_str = end_date .strftime ("%Y%m%dT%H%M%SZ" )
363+ end_datetime = now + dt .timedelta (days = days_ahead )
341364
342365 if calendar_name :
343366 # Get events from specific calendar
344367 return await client .calendar .get_calendar_events (
345368 calendar_name = calendar_name ,
346- start_date = start_date_str ,
347- end_date = end_date_str ,
369+ start_datetime = now ,
370+ end_datetime = end_datetime ,
348371 limit = limit ,
349372 )
350373 else :
@@ -356,8 +379,8 @@ async def nc_calendar_get_upcoming_events(
356379 try :
357380 events = await client .calendar .get_calendar_events (
358381 calendar_name = calendar ["name" ],
359- start_date = start_date_str ,
360- end_date = end_date_str ,
382+ start_datetime = now ,
383+ end_datetime = end_datetime ,
361384 limit = limit ,
362385 )
363386 # Add calendar info to each event
@@ -421,6 +444,24 @@ async def nc_calendar_find_availability(
421444 if time_range .strip ()
422445 ]
423446
447+ # Convert date strings to datetime objects
448+ start_datetime = None
449+ end_datetime = None
450+
451+ if date_range_start :
452+ try :
453+ start_datetime = dt .datetime .strptime (date_range_start , "%Y-%m-%d" )
454+ except ValueError :
455+ logger .warning (f"Invalid date_range_start format: { date_range_start } " )
456+
457+ if date_range_end :
458+ try :
459+ end_datetime = dt .datetime .strptime (date_range_end , "%Y-%m-%d" ).replace (
460+ hour = 23 , minute = 59 , second = 59
461+ )
462+ except ValueError :
463+ logger .warning (f"Invalid date_range_end format: { date_range_end } " )
464+
424465 # Build constraints
425466 constraints = {
426467 "business_hours_only" : business_hours_only ,
@@ -431,8 +472,8 @@ async def nc_calendar_find_availability(
431472 return await client .calendar .find_availability (
432473 duration_minutes = duration_minutes ,
433474 attendees = attendee_list ,
434- date_range_start = date_range_start ,
435- date_range_end = date_range_end ,
475+ start_datetime = start_datetime ,
476+ end_datetime = end_datetime ,
436477 constraints = constraints ,
437478 )
438479
@@ -491,6 +532,24 @@ async def nc_calendar_bulk_operations(
491532 if operation not in ["update" , "delete" , "move" ]:
492533 raise ValueError ("Operation must be 'update', 'delete', or 'move'" )
493534
535+ # Convert date strings to datetime objects
536+ start_datetime = None
537+ end_datetime = None
538+
539+ if start_date :
540+ try :
541+ start_datetime = dt .datetime .strptime (start_date , "%Y-%m-%d" )
542+ except ValueError :
543+ logger .warning (f"Invalid start_date format: { start_date } " )
544+
545+ if end_date :
546+ try :
547+ end_datetime = dt .datetime .strptime (end_date , "%Y-%m-%d" ).replace (
548+ hour = 23 , minute = 59 , second = 59
549+ )
550+ except ValueError :
551+ logger .warning (f"Invalid end_date format: { end_date } " )
552+
494553 # Build filter criteria
495554 filter_criteria = {}
496555 if title_contains is not None :
@@ -503,6 +562,7 @@ async def nc_calendar_bulk_operations(
503562 filter_criteria ["status" ] = status
504563 if location_contains is not None :
505564 filter_criteria ["location_contains" ] = location_contains
565+ # Add datetime strings for client compatibility
506566 if start_date :
507567 filter_criteria ["start_date" ] = start_date
508568 if end_date :
@@ -513,16 +573,18 @@ async def nc_calendar_bulk_operations(
513573 if calendar_name :
514574 events = await client .calendar .get_calendar_events (
515575 calendar_name = calendar_name ,
516- start_date = start_date ,
517- end_date = end_date ,
576+ start_datetime = start_datetime ,
577+ end_datetime = end_datetime ,
518578 )
519579 if filter_criteria :
520580 events = client .calendar ._apply_event_filters (
521581 events , filter_criteria
522582 )
523583 else :
524584 events = await client .calendar .search_events_across_calendars (
525- start_date = start_date , end_date = end_date , filters = filter_criteria
585+ start_datetime = start_datetime ,
586+ end_datetime = end_datetime ,
587+ filters = filter_criteria ,
526588 )
527589
528590 deleted_count = 0
@@ -592,16 +654,18 @@ async def nc_calendar_bulk_operations(
592654 if calendar_name :
593655 events = await client .calendar .get_calendar_events (
594656 calendar_name = calendar_name ,
595- start_date = start_date ,
596- end_date = end_date ,
657+ start_datetime = start_datetime ,
658+ end_datetime = end_datetime ,
597659 )
598660 if filter_criteria :
599661 events = client .calendar ._apply_event_filters (
600662 events , filter_criteria
601663 )
602664 else :
603665 events = await client .calendar .search_events_across_calendars (
604- start_date = start_date , end_date = end_date , filters = filter_criteria
666+ start_datetime = start_datetime ,
667+ end_datetime = end_datetime ,
668+ filters = filter_criteria ,
605669 )
606670
607671 moved_count = 0
0 commit comments