redbeat icon indicating copy to clipboard operation
redbeat copied to clipboard

Redbeat do not support ZoneInfo classes (PEP-615)

Open Cediddi opened this issue 3 years ago • 0 comments

PEP-615 defines a ZoneInfo class which kind of deprecates pytz in the long term.

The code below is not tied to any django project, thus timezone defined should be the default value, UTC.

Pytz works, thus I'll be using it for the foreseeable future.

Here's the code related to this issue:


from zoneinfo import ZoneInfo

def now_in_germany():
    return datetime.datetime.now(tz=ZoneInfo('Europe/Berlin'))


crontab_germany = partial(crontab, nowfun=now_in_germany)

BEAT_SCHEDULE = {
    "every-minute": {
        "task": "<something>",
        "schedule": crontab_germany("*", "7,13", "*", "*", "*", ),
        # 7AM and 1PM in german time
        "args": (),
    },
}

Here's the traceback:

beat raised exception <class 'AttributeError'>: AttributeError("'zoneinfo.ZoneInfo' object has no attribute 'zone'")
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/celery/apps/beat.py", line 105, in start_scheduler
    service.start()
  File "/usr/local/lib/python3.10/site-packages/celery/beat.py", line 636, in start
    humanize_seconds(self.scheduler.max_interval))
  File "/usr/local/lib/python3.10/site-packages/kombu/utils/objects.py", line 30, in __get__
    return super().__get__(instance, owner)
  File "/usr/local/lib/python3.10/functools.py", line 981, in __get__
    val = self.func(instance)
  File "/usr/local/lib/python3.10/site-packages/celery/beat.py", line 679, in scheduler
    return self.get_scheduler()
  File "/usr/local/lib/python3.10/site-packages/celery/beat.py", line 670, in get_scheduler
    return symbol_by_name(self.scheduler_cls, aliases=aliases)(
  File "/usr/local/lib/python3.10/site-packages/redbeat/schedulers.py", line 377, in __init__
    super(RedBeatScheduler, self).__init__(app, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/celery/beat.py", line 271, in __init__
    self.setup_schedule()
  File "/usr/local/lib/python3.10/site-packages/redbeat/schedulers.py", line 395, in setup_schedule
    self.update_from_dict(self.app.redbeat_conf.schedule)
  File "/usr/local/lib/python3.10/site-packages/redbeat/schedulers.py", line 409, in update_from_dict
    entry.save()  # store into redis
  File "/usr/local/lib/python3.10/site-packages/redbeat/schedulers.py", line 306, in save
    pipe.hsetnx(self.key, 'meta', json.dumps(meta, cls=RedBeatJSONEncoder))
  File "/usr/local/lib/python3.10/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/lib/python3.10/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/lib/python3.10/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python3.10/site-packages/redbeat/decoder.py", line 79, in default
    elif obj.tzinfo.zone is None:
AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'zone'

Cediddi avatar Jul 04 '22 10:07 Cediddi