diff --git a/pikatasks/utils.py b/pikatasks/utils.py index 7f978da994f7c823f7fce374c2fcce85bdbdece5..9f59caa8f2e29f1b9ebd96932cb77f6ad9d66d44 100644 --- a/pikatasks/utils.py +++ b/pikatasks/utils.py @@ -2,34 +2,48 @@ import json import pika import logging import ssl -from datetime import datetime +from datetime import datetime, timezone from . import settings logger = logging.getLogger("pika-tasks") - all_tasks = set() # each registered task will show up here - -DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" # need it to de/serialize datetime stored in JSON +DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f%Z%z" # used for serialization, I leave here both %Z%z for compatibility in case we ever want to improve timezone-related stuff def serialize(stuff): return json.dumps(stuff).encode("utf-8") -def deserialize(binary): - return json.loads(binary.decode("utf-8")) +def deserialize(bytes): + return json.loads(bytes.decode("utf-8")) def serialize_datetime(dt): - return datetime.strftime(dt, DATETIME_FORMAT) - - -def deserialize_datetime(text): - """ Throws ValueError when fails to parse the text """ - return datetime.strptime(text, DATETIME_FORMAT) + """ + :param dt: datetime (timezone-aware) + :return: str that can be deserialized by deserialize_datetime() + """ + if not dt.tzinfo: + logger.warning("Naive datetime received by serialize_datetime() and will be treated as local: {dt}. Avoid using naive datetime objects.".format(dt=dt)) + utc_dt = dt.astimezone(timezone.utc) + return datetime.strftime(utc_dt, DATETIME_FORMAT) + + +def deserialize_datetime(text, utc=False): + """ + :param text: str created by serialize_datetime() + :param utc: set to True if you want this function to return UTC datetime + :return: datetime (timezone-aware) + """ + dt = datetime.strptime(text, DATETIME_FORMAT) + assert dt.tzinfo, "ok, now that's weird, no tzinfo, but there must have been %z in the DATETIME_FORMAT" + if utc: + return dt.astimezone(timezone.utc) + else: + return dt.astimezone() # not pytz, just old c++ stuff, but still a timezone with correct utc offset def get_ssl_options(settings):