Skip to content

Commit 2bf1a84

Browse files
committed
reduce schedulers.py diff
1 parent 245e324 commit 2bf1a84

File tree

1 file changed

+89
-89
lines changed

1 file changed

+89
-89
lines changed

django_celery_beat/schedulers.py

Lines changed: 89 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ class ModelEntry(ScheduleEntry):
5454
"""Scheduler entry taken from database row."""
5555

5656
model_schedules = (
57-
(schedules.crontab, CrontabSchedule, "crontab"),
58-
(schedules.schedule, IntervalSchedule, "interval"),
59-
(schedules.solar, SolarSchedule, "solar"),
60-
(clocked, ClockedSchedule, "clocked"),
57+
(schedules.crontab, CrontabSchedule, 'crontab'),
58+
(schedules.schedule, IntervalSchedule, 'interval'),
59+
(schedules.solar, SolarSchedule, 'solar'),
60+
(clocked, ClockedSchedule, 'clocked')
6161
)
62-
save_fields = ["last_run_at", "total_run_count", "no_changes"]
62+
save_fields = ['last_run_at', 'total_run_count', 'no_changes']
6363

6464
def __init__(self, model, app=None):
6565
"""Initialize the model entry."""
@@ -70,34 +70,33 @@ def __init__(self, model, app=None):
7070
self.schedule = model.schedule
7171
except model.DoesNotExist:
7272
logger.error(
73-
"Disabling schedule %s that was removed from database",
73+
'Disabling schedule %s that was removed from database',
7474
self.name,
7575
)
7676
self._disable(model)
7777
try:
78-
self.args = loads(model.args or "[]")
79-
self.kwargs = loads(model.kwargs or "{}")
78+
self.args = loads(model.args or '[]')
79+
self.kwargs = loads(model.kwargs or '{}')
8080
except ValueError as exc:
8181
logger.exception(
82-
"Removing schedule %s for argument deseralization error: %r",
83-
self.name,
84-
exc,
82+
'Removing schedule %s for argument deseralization error: %r',
83+
self.name, exc,
8584
)
8685
self._disable(model)
8786

8887
self.options = {}
89-
for option in ["queue", "exchange", "routing_key", "priority"]:
88+
for option in ['queue', 'exchange', 'routing_key', 'priority']:
9089
value = getattr(model, option)
9190
if value is None:
9291
continue
9392
self.options[option] = value
9493

95-
if getattr(model, "expires_", None):
96-
self.options["expires"] = getattr(model, "expires_")
94+
if getattr(model, 'expires_', None):
95+
self.options['expires'] = getattr(model, 'expires_')
9796

98-
headers = loads(model.headers or "{}")
99-
headers["periodic_task_name"] = model.name
100-
self.options["headers"] = headers
97+
headers = loads(model.headers or '{}')
98+
headers['periodic_task_name'] = model.name
99+
self.options['headers'] = headers
101100

102101
self.total_run_count = model.total_run_count
103102
self.model = model
@@ -109,9 +108,8 @@ def __init__(self, model, app=None):
109108
# This will trigger the job to run at start_time
110109
# and avoid the heap block.
111110
if self.model.start_time:
112-
model.last_run_at = model.last_run_at - datetime.timedelta(
113-
days=365 * 30
114-
)
111+
model.last_run_at = model.last_run_at \
112+
- datetime.timedelta(days=365 * 30)
115113

116114
self.last_run_at = model.last_run_at
117115

@@ -128,7 +126,7 @@ def is_due(self):
128126
# START DATE: only run after the `start_time`, if one exists.
129127
if self.model.start_time is not None:
130128
now = self._default_now()
131-
if getattr(settings, "DJANGO_CELERY_BEAT_TZ_AWARE", True):
129+
if getattr(settings, 'DJANGO_CELERY_BEAT_TZ_AWARE', True):
132130
now = maybe_make_aware(self._default_now())
133131
if now < self.model.start_time:
134132
# The datetime is before the start date - don't run.
@@ -149,7 +147,8 @@ def is_due(self):
149147
return schedules.schedstate(False, NEVER_CHECK_TIMEOUT)
150148

151149
# ONE OFF TASK: Disable one off tasks after they've ran once
152-
if self.model.one_off and self.model.enabled and self.model.total_run_count > 0:
150+
if self.model.one_off and self.model.enabled \
151+
and self.model.total_run_count > 0:
153152
self.model.enabled = False
154153
self.model.total_run_count = 0 # Reset
155154
self.model.no_changes = False # Mark the model entry as changed
@@ -164,7 +163,7 @@ def is_due(self):
164163
return self.schedule.is_due(last_run_at_in_tz)
165164

166165
def _default_now(self):
167-
if getattr(settings, "DJANGO_CELERY_BEAT_TZ_AWARE", True):
166+
if getattr(settings, 'DJANGO_CELERY_BEAT_TZ_AWARE', True):
168167
now = datetime.datetime.now(self.app.timezone)
169168
else:
170169
# this ends up getting passed to maybe_make_aware, which expects
@@ -177,7 +176,6 @@ def __next__(self):
177176
self.model.total_run_count += 1
178177
self.model.no_changes = True
179178
return self.__class__(self.model)
180-
181179
next = __next__ # for 2to3
182180

183181
def save(self):
@@ -197,20 +195,20 @@ def to_model_schedule(cls, schedule):
197195
model_schedule = model_type.from_schedule(schedule)
198196
model_schedule.save()
199197
return model_schedule, model_field
200-
raise ValueError(f"Cannot convert schedule type {schedule!r} to model")
198+
raise ValueError(
199+
f'Cannot convert schedule type {schedule!r} to model')
201200

202201
@classmethod
203202
def from_entry(cls, name, app=None, **entry):
204203
obj, created = PeriodicTask._default_manager.update_or_create(
205-
name=name,
206-
defaults=cls._unpack_fields(**entry),
204+
name=name, defaults=cls._unpack_fields(**entry),
207205
)
208206
return cls(obj, app=app)
209207

210208
@classmethod
211-
def _unpack_fields(
212-
cls, schedule, args=None, kwargs=None, relative=None, options=None, **entry
213-
):
209+
def _unpack_fields(cls, schedule,
210+
args=None, kwargs=None, relative=None, options=None,
211+
**entry):
214212
entry_schedules = {
215213
model_field: None for _, _, model_field in cls.model_schedules
216214
}
@@ -220,37 +218,27 @@ def _unpack_fields(
220218
entry_schedules,
221219
args=dumps(args or []),
222220
kwargs=dumps(kwargs or {}),
223-
**cls._unpack_options(**options or {}),
221+
**cls._unpack_options(**options or {})
224222
)
225223
return entry
226224

227225
@classmethod
228-
def _unpack_options(
229-
cls,
230-
queue=None,
231-
exchange=None,
232-
routing_key=None,
233-
priority=None,
234-
headers=None,
235-
expire_seconds=None,
236-
**kwargs,
237-
):
226+
def _unpack_options(cls, queue=None, exchange=None, routing_key=None,
227+
priority=None, headers=None, expire_seconds=None,
228+
**kwargs):
238229
return {
239-
"queue": queue,
240-
"exchange": exchange,
241-
"routing_key": routing_key,
242-
"priority": priority,
243-
"headers": dumps(headers or {}),
244-
"expire_seconds": expire_seconds,
230+
'queue': queue,
231+
'exchange': exchange,
232+
'routing_key': routing_key,
233+
'priority': priority,
234+
'headers': dumps(headers or {}),
235+
'expire_seconds': expire_seconds,
245236
}
246237

247238
def __repr__(self):
248-
return "<ModelEntry: {} {}(*{}, **{}) {}>".format(
249-
safe_str(self.name),
250-
self.task,
251-
safe_repr(self.args),
252-
safe_repr(self.kwargs),
253-
self.schedule,
239+
return '<ModelEntry: {} {}(*{}, **{}) {}>'.format(
240+
safe_str(self.name), self.task, safe_repr(self.args),
241+
safe_repr(self.kwargs), self.schedule,
254242
)
255243

256244

@@ -273,17 +261,16 @@ def __init__(self, *args, **kwargs):
273261
Scheduler.__init__(self, *args, **kwargs)
274262
self._finalize = Finalize(self, self.sync, exitpriority=5)
275263
self.max_interval = (
276-
kwargs.get("max_interval")
264+
kwargs.get('max_interval')
277265
or self.app.conf.beat_max_loop_interval
278-
or DEFAULT_MAX_INTERVAL
279-
)
266+
or DEFAULT_MAX_INTERVAL)
280267

281268
def setup_schedule(self):
282269
self.install_default_entries(self.schedule)
283270
self.update_from_dict(self.app.conf.beat_schedule)
284271

285272
def all_as_schedule(self):
286-
debug("DatabaseScheduler: Fetching database schedule")
273+
debug('DatabaseScheduler: Fetching database schedule')
287274
s = {}
288275
for model in self.enabled_models():
289276
try:
@@ -305,7 +292,8 @@ def enabled_models_qs(self):
305292
seconds=SCHEDULE_SYNC_MAX_INTERVAL
306293
)
307294
exclude_clock_tasks_query = Q(
308-
clocked__isnull=False, clocked__clocked_time__gt=next_schedule_sync
295+
clocked__isnull=False,
296+
clocked__clocked_time__gt=next_schedule_sync
309297
)
310298

311299
exclude_cron_tasks_query = self._get_crontab_exclude_query()
@@ -330,7 +318,9 @@ def _get_crontab_exclude_query(self):
330318
server_hour = server_time.hour
331319

332320
# Window of +/- 2 hours around the current hour in server tz.
333-
hours_to_include = [(server_hour + offset) % 24 for offset in range(-2, 3)]
321+
hours_to_include = [
322+
(server_hour + offset) % 24 for offset in range(-2, 3)
323+
]
334324
hours_to_include += [4] # celery's default cleanup task
335325

336326
# Get all tasks with a simple numeric hour value
@@ -342,30 +332,30 @@ def _get_crontab_exclude_query(self):
342332
# Annotate these tasks with their server-hour equivalent
343333
annotated_tasks = numeric_hour_tasks.annotate(
344334
# Cast hour string to integer
345-
hour_int=Cast("hour", IntegerField()),
335+
hour_int=Cast('hour', IntegerField()),
336+
346337
# Calculate server-hour based on timezone offset
347338
server_hour=Case(
348339
# Handle each timezone specifically
349340
*[
350341
When(
351342
timezone=timezone_name,
352343
then=(
353-
F("hour_int")
344+
F('hour_int')
354345
+ self._get_timezone_offset(timezone_name)
355346
+ 24
356-
)
357-
% 24,
347+
) % 24
358348
)
359349
for timezone_name in self._get_unique_timezone_names()
360350
],
361351
# Default case - use hour as is
362-
default=F("hour_int"),
363-
),
352+
default=F('hour_int')
353+
)
364354
)
365355

366356
excluded_hour_task_ids = annotated_tasks.exclude(
367357
server_hour__in=hours_to_include
368-
).values_list("id", flat=True)
358+
).values_list('id', flat=True)
369359

370360
# Build the final exclude query:
371361
# Exclude crontab tasks that are not in our include list
@@ -380,11 +370,15 @@ def _get_valid_hour_formats(self):
380370
Return a list of all valid hour values (0-23).
381371
Both zero-padded ("00"–"09") and non-padded ("0"–"23")
382372
"""
383-
return [str(hour) for hour in range(24)] + [f"{hour:02d}" for hour in range(10)]
373+
return [str(hour) for hour in range(24)] + [
374+
f"{hour:02d}" for hour in range(10)
375+
]
384376

385377
def _get_unique_timezone_names(self):
386378
"""Get a list of all unique timezone names used in CrontabSchedule"""
387-
return CrontabSchedule.objects.values_list("timezone", flat=True).distinct()
379+
return CrontabSchedule.objects.values_list(
380+
'timezone', flat=True
381+
).distinct()
388382

389383
def _get_timezone_offset(self, timezone_name):
390384
"""
@@ -437,12 +431,12 @@ def schedule_changed(self):
437431

438432
last, ts = self._last_timestamp, self.Changes.last_change()
439433
except DatabaseError as exc:
440-
logger.exception("Database gave error: %r", exc)
434+
logger.exception('Database gave error: %r', exc)
441435
return False
442436
except InterfaceError:
443437
warning(
444-
"DatabaseScheduler: InterfaceError in schedule_changed(), "
445-
"waiting to retry in next call..."
438+
'DatabaseScheduler: InterfaceError in schedule_changed(), '
439+
'waiting to retry in next call...'
446440
)
447441
return False
448442

@@ -462,7 +456,7 @@ def reserve(self, entry):
462456

463457
def sync(self):
464458
if logger.isEnabledFor(logging.DEBUG):
465-
debug("Writing entries...")
459+
debug('Writing entries...')
466460
_tried = set()
467461
_failed = set()
468462
try:
@@ -476,11 +470,11 @@ def sync(self):
476470
except (KeyError, TypeError, ObjectDoesNotExist):
477471
_failed.add(name)
478472
except DatabaseError as exc:
479-
logger.exception("Database error while sync: %r", exc)
473+
logger.exception('Database error while sync: %r', exc)
480474
except InterfaceError:
481475
warning(
482-
"DatabaseScheduler: InterfaceError in sync(), "
483-
"waiting to retry in next call..."
476+
'DatabaseScheduler: InterfaceError in sync(), '
477+
'waiting to retry in next call...'
484478
)
485479
finally:
486480
# retry later, only for the failed ones
@@ -490,7 +484,9 @@ def update_from_dict(self, mapping):
490484
s = {}
491485
for name, entry_fields in mapping.items():
492486
try:
493-
entry = self.Entry.from_entry(name, app=self.app, **entry_fields)
487+
entry = self.Entry.from_entry(name,
488+
app=self.app,
489+
**entry_fields)
494490
if entry.model.enabled:
495491
s[name] = entry
496492

@@ -502,11 +498,10 @@ def install_default_entries(self, data):
502498
entries = {}
503499
if self.app.conf.result_expires:
504500
entries.setdefault(
505-
"celery.backend_cleanup",
506-
{
507-
"task": "celery.backend_cleanup",
508-
"schedule": schedules.crontab("0", "4", "*"),
509-
"options": {"expire_seconds": 12 * 3600},
501+
'celery.backend_cleanup', {
502+
'task': 'celery.backend_cleanup',
503+
'schedule': schedules.crontab('0', '4', '*'),
504+
'options': {'expire_seconds': 12 * 3600},
510505
},
511506
)
512507
self.update_from_dict(entries)
@@ -523,20 +518,26 @@ def schedule(self):
523518
current_time = datetime.datetime.now()
524519

525520
if self._initial_read:
526-
debug("DatabaseScheduler: initial read")
521+
debug('DatabaseScheduler: initial read')
527522
initial = update = True
528523
self._initial_read = False
529524
self._last_full_sync = current_time
530525
elif self.schedule_changed():
531-
info("DatabaseScheduler: Schedule changed.")
526+
info('DatabaseScheduler: Schedule changed.')
532527
update = True
533528
self._last_full_sync = current_time
534529

535530
# Force update the schedule if it's been more than 5 minutes
536531
if not update:
537-
time_since_last_sync = (current_time - self._last_full_sync).total_seconds()
538-
if time_since_last_sync >= SCHEDULE_SYNC_MAX_INTERVAL:
539-
debug("DatabaseScheduler: Forcing full sync after 5 minutes")
532+
time_since_last_sync = (
533+
current_time - self._last_full_sync
534+
).total_seconds()
535+
if (
536+
time_since_last_sync >= SCHEDULE_SYNC_MAX_INTERVAL
537+
):
538+
debug(
539+
'DatabaseScheduler: Forcing full sync after 5 minutes'
540+
)
540541
update = True
541542
self._last_full_sync = current_time
542543

@@ -548,8 +549,7 @@ def schedule(self):
548549
self._heap = []
549550
self._heap_invalidated = True
550551
if logger.isEnabledFor(logging.DEBUG):
551-
debug(
552-
"Current schedule:\n%s",
553-
"\n".join(repr(entry) for entry in self._schedule.values()),
552+
debug('Current schedule:\n%s', '\n'.join(
553+
repr(entry) for entry in self._schedule.values()),
554554
)
555555
return self._schedule

0 commit comments

Comments
 (0)