Skip to content

Commit b99abe3

Browse files
committed
Fixed signals can not connect to OneToOneField (#572)
1 parent d4b97af commit b99abe3

File tree

3 files changed

+45
-20
lines changed

3 files changed

+45
-20
lines changed

django_celery_beat/apps.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,7 @@ class BeatConfig(AppConfig):
1212
label = 'django_celery_beat'
1313
verbose_name = _('Periodic Tasks')
1414
default_auto_field = 'django.db.models.AutoField'
15+
16+
def ready(self):
17+
from .signals import signals_connect
18+
signals_connect()

django_celery_beat/models.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -619,23 +619,3 @@ def schedule(self):
619619
return self.solar.schedule
620620
if self.clocked:
621621
return self.clocked.schedule
622-
623-
624-
signals.pre_delete.connect(PeriodicTasks.changed, sender=PeriodicTask)
625-
signals.pre_save.connect(PeriodicTasks.changed, sender=PeriodicTask)
626-
signals.pre_delete.connect(
627-
PeriodicTasks.update_changed, sender=IntervalSchedule)
628-
signals.post_save.connect(
629-
PeriodicTasks.update_changed, sender=IntervalSchedule)
630-
signals.post_delete.connect(
631-
PeriodicTasks.update_changed, sender=CrontabSchedule)
632-
signals.post_save.connect(
633-
PeriodicTasks.update_changed, sender=CrontabSchedule)
634-
signals.post_delete.connect(
635-
PeriodicTasks.update_changed, sender=SolarSchedule)
636-
signals.post_save.connect(
637-
PeriodicTasks.update_changed, sender=SolarSchedule)
638-
signals.post_delete.connect(
639-
PeriodicTasks.update_changed, sender=ClockedSchedule)
640-
signals.post_save.connect(
641-
PeriodicTasks.update_changed, sender=ClockedSchedule)

django_celery_beat/signals.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
def signals_connect():
2+
from django.db.models import signals, OneToOneRel
3+
from .models import ClockedSchedule, PeriodicTask, PeriodicTasks, IntervalSchedule, CrontabSchedule, SolarSchedule
4+
5+
def o2o_discover():
6+
"""
7+
Description: Discover the `OneToOneField`, and connect their signals to `PeriodicTasks.changed`.
8+
9+
Issues: Signals can not connect to OneToOneField.
10+
https://github.com/celery/django-celery-beat/issues/572
11+
12+
Note: The inheritance relationship introduces links between the child model and each of its
13+
parents (via an automatically-created OneToOneField).
14+
https://docs.djangoproject.com/en/stable/topics/db/models/#multi-table-inheritance
15+
"""
16+
related_objects = PeriodicTask._meta.related_objects
17+
for obj in related_objects:
18+
if isinstance(obj, OneToOneRel):
19+
sender_class = obj.related_model
20+
signals.pre_delete.connect(PeriodicTasks.changed, sender=sender_class)
21+
signals.pre_save.connect(PeriodicTasks.changed, sender=sender_class)
22+
23+
o2o_discover()
24+
signals.pre_delete.connect(PeriodicTasks.changed, sender=PeriodicTask)
25+
signals.pre_save.connect(PeriodicTasks.changed, sender=PeriodicTask)
26+
signals.pre_delete.connect(
27+
PeriodicTasks.update_changed, sender=IntervalSchedule)
28+
signals.post_save.connect(
29+
PeriodicTasks.update_changed, sender=IntervalSchedule)
30+
signals.post_delete.connect(
31+
PeriodicTasks.update_changed, sender=CrontabSchedule)
32+
signals.post_save.connect(
33+
PeriodicTasks.update_changed, sender=CrontabSchedule)
34+
signals.post_delete.connect(
35+
PeriodicTasks.update_changed, sender=SolarSchedule)
36+
signals.post_save.connect(
37+
PeriodicTasks.update_changed, sender=SolarSchedule)
38+
signals.post_delete.connect(
39+
PeriodicTasks.update_changed, sender=ClockedSchedule)
40+
signals.post_save.connect(
41+
PeriodicTasks.update_changed, sender=ClockedSchedule)

0 commit comments

Comments
 (0)