From b2a80c355634ec4e99a73def97d1c6e64b7ae700 Mon Sep 17 00:00:00 2001 From: Zeno Dalla Valle Date: Tue, 9 Dec 2025 12:30:59 +0100 Subject: [PATCH] Add unique constraints to ClockedSchedule and CrontabSchedule models --- ...r_clockedschedule_clocked_time_and_more.py | 41 +++++++++++++++++++ django_celery_beat/models.py | 21 +++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 django_celery_beat/migrations/0020_alter_clockedschedule_clocked_time_and_more.py diff --git a/django_celery_beat/migrations/0020_alter_clockedschedule_clocked_time_and_more.py b/django_celery_beat/migrations/0020_alter_clockedschedule_clocked_time_and_more.py new file mode 100644 index 00000000..040922fa --- /dev/null +++ b/django_celery_beat/migrations/0020_alter_clockedschedule_clocked_time_and_more.py @@ -0,0 +1,41 @@ +# Generated by Django 5.2.9 on 2025-12-09 09:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("django_celery_beat", "0019_alter_periodictasks_options"), + ] + + operations = [ + migrations.AlterField( + model_name="clockedschedule", + name="clocked_time", + field=models.DateTimeField( + help_text="Run the task at clocked time", + unique=True, + verbose_name="Clock Time", + ), + ), + migrations.AddConstraint( + model_name="crontabschedule", + constraint=models.UniqueConstraint( + fields=( + "minute", + "hour", + "day_of_month", + "month_of_year", + "day_of_week", + "timezone", + ), + name="unique_crontab", + ), + ), + migrations.AddConstraint( + model_name="intervalschedule", + constraint=models.UniqueConstraint( + fields=("every", "period"), name="unique_interval" + ), + ), + ] diff --git a/django_celery_beat/models.py b/django_celery_beat/models.py index ad53a288..b92f05c4 100644 --- a/django_celery_beat/models.py +++ b/django_celery_beat/models.py @@ -173,6 +173,9 @@ class Meta: verbose_name = _('interval') verbose_name_plural = _('intervals') ordering = ['period', 'every'] + constraints = [ + models.UniqueConstraint(fields=["every", "period"], name="unique_interval") + ] @property def schedule(self): @@ -214,8 +217,9 @@ class ClockedSchedule(models.Model): """clocked schedule.""" clocked_time = models.DateTimeField( - verbose_name=_('Clock Time'), - help_text=_('Run the task at clocked time'), + verbose_name=_("Clock Time"), + help_text=_("Run the task at clocked time"), + unique=True, ) class Meta: @@ -314,6 +318,19 @@ class Meta: verbose_name_plural = _('crontabs') ordering = ['month_of_year', 'day_of_month', 'day_of_week', 'hour', 'minute', 'timezone'] + constraints = [ + models.UniqueConstraint( + fields=[ + "minute", + "hour", + "day_of_month", + "month_of_year", + "day_of_week", + "timezone", + ], + name="unique_crontab", + ) + ] @property def human_readable(self):