diff --git a/pilab/events/reservation.py b/pilab/events/reservation.py index ec116bf03880ee7b3163c0cbe30056ee45e46387..8f8c66753459d68f129290d54a3520db5d06cd31 100644 --- a/pilab/events/reservation.py +++ b/pilab/events/reservation.py @@ -1,11 +1,12 @@ import functools import json +from json import JSONEncoder import logging import threading import time import traceback from collections import Counter -from datetime import datetime +from datetime import datetime, date from zoneinfo import ZoneInfo from typing import List, Callable, Optional, Dict @@ -26,9 +27,16 @@ class Reservation(BaseModel): endtime: datetime extraUsers: Optional[List[str]] = None reason: str - pass +class DateTimeEncoder(JSONEncoder): + # Override the default method + def default(self, obj): + if isinstance(obj, (date, datetime)): + return obj.isoformat() + return super().default(obj) + + def send_event(event: Reservation): routing_key = f"res.cube.{event.cube_id}" try: @@ -43,7 +51,7 @@ def send_event(event: Reservation): arguments={"x-queue-type": "stream"} ) - event_serialized = json.dumps(event.dict()).encode('utf-8') + event_serialized = json.dumps(event.dict(), cls=DateTimeEncoder).encode('utf-8') channel.basic_publish( exchange='', @@ -212,6 +220,10 @@ class ReservationConsumer(threading.Thread): self.callback(reservation) self._channel.basic_ack(basic_deliver.delivery_tag) logger.debug(f"Event processed successful") + except TypeError as e: + traceback.print_exc() + self._channel.basic_ack(basic_deliver.delivery_tag) + logger.debug(f"Event format could no get parsed") except Exception as e: traceback.print_exc() logger.error(f"Failed to process Event; message {e}")