@@ -417,8 +417,8 @@ def create_repeat_event_api() -> tuple[Response, int]: # noqa: PLR0911
417417
418418@events_api_bp .route ("/<int:event_id>" , methods = ["PATCH" ])
419419@valid_api_auth
420- def edit_event_api (event_id : int ) -> tuple [Response , int ]:
421- """Edit an existing event
420+ def edit_event_api (event_id : int ) -> tuple [Response , int ]: # noqa: PLR0911, PLR0912
421+ """Edit an existing event. Leave a field out to leave it unchanged, or as an empty string to clear it.
422422 ---
423423 parameters:
424424 - name: event_id
@@ -504,36 +504,64 @@ def edit_event_api(event_id: int) -> tuple[Response, int]:
504504 if not data :
505505 return jsonify ({"error" : "No data provided" }), 400
506506
507+ event = {}
508+
509+ if "name" in data :
510+ if data ["name" ] == "" :
511+ return jsonify ({"error" : "Name cannot be empty" }), 400
512+ event ["name" ] = data ["name" ]
513+
514+ if "description" in data :
515+ if data ["description" ] == "" :
516+ return jsonify ({"error" : "Description cannot be empty" }), 400
517+ event ["description" ] = data ["description" ]
518+
519+ if "draft" in data :
520+ if not isinstance (data ["draft" ], bool ):
521+ return jsonify ({"error" : "Draft must be a boolean" }), 400
522+ event ["draft" ] = data ["draft" ]
523+
524+ if "location" in data :
525+ if data ["location" ] == "" :
526+ return jsonify ({"error" : "Location cannot be empty" }), 400
527+ event ["location" ] = data ["location" ]
528+
529+ event ["location_url" ] = data .get ("location_url" , None )
530+ event ["icon" ] = data .get ("icon" , None )
531+ event ["colour" ] = data .get ("colour" , None )
532+
507533 # convert strings to time objects
508534 if "start_time" in data :
509- start_time = get_datetime_from_string (data ["start_time" ])
510- if isinstance (start_time , str ):
511- return jsonify ({"error" : start_time }), 400
535+ if data ["start_time" ] == "" :
536+ return jsonify ({"error" : "Start time cannot be empty" }), 400
537+ event ["start_time" ] = get_datetime_from_string (data ["start_time" ])
538+ if isinstance (event ["start_time" ], str ):
539+ return jsonify ({"error" : event ["start_time" ]}), 400
512540
513541 if "end_time" in data :
514- end_time = get_datetime_from_string (data ["end_time" ])
515- if isinstance (end_time , str ):
516- return jsonify ({"error" : end_time }), 400
542+ if data ["end_time" ] == "" :
543+ event ["end_time" ] = None
544+ else :
545+ event ["end_time" ] = get_datetime_from_string (data ["end_time" ])
546+ if isinstance (event ["end_time" ], str ):
547+ return jsonify ({"error" : event ["end_time" ]}), 400
517548
518549 if "duration" in data :
519- duration = get_timedelta_from_string (data ["duration" ])
520- if isinstance (duration , str ):
521- return jsonify ({"error" : duration }), 400
522-
523- event = edit_event (
524- event_id ,
525- data .get ("name" ),
526- data .get ("description" ),
527- data .get ("draft" , False ),
528- data .get ("location" ),
529- data .get ("location_url" ),
530- data .get ("icon" ),
531- data .get ("colour" ),
532- start_time if "start_time" in data else None , # type: ignore
533- duration if "duration" in data else None , # type: ignore
534- end_time if "end_time" in data else None , # type: ignore
535- data .get ("tags" , []),
536- )
550+ if data ["duration" ] == "" :
551+ event ["duration" ] = None
552+ else :
553+ event ["duration" ] = get_timedelta_from_string (data ["duration" ])
554+ if isinstance (event ["duration" ], str ):
555+ return jsonify ({"error" : event ["duration" ]}), 400
556+
557+ if "tags" in data :
558+ if not isinstance (data ["tags" ], list ):
559+ return jsonify ({"error" : "Tags must be a list" }), 400
560+ if any (not isinstance (tag , str ) for tag in data ["tags" ]):
561+ return jsonify ({"error" : "All tags must be strings" }), 400
562+ event ["tags" ] = data ["tags" ]
563+
564+ event = edit_event (event_id , ** event )
537565
538566 if isinstance (event , str ):
539567 return jsonify ({"error" : event }), 400
0 commit comments