diff --git a/AUTHORS b/AUTHORS index ef975283..8c5bca8e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -37,6 +37,7 @@ Grégoire Cachet Hari Idan Zalzberg Ionel Maries Cristian +Jaeyoung Heo Jannis Leidel Jason Baker Jay States diff --git a/Changelog b/Changelog index 60a3f300..264fbe7c 100644 --- a/Changelog +++ b/Changelog @@ -4,6 +4,14 @@ Change history ================ +2.3.0 +===== +:release-date: +:release-by: + +- Admin "disable_tasks" action also updates PeriodicTask's last_run_at field + + 2.2.1 ===== :release-date: 2021-07-02 11:15 a.m. UTC+6:00 @@ -30,7 +38,7 @@ 2.1.0 ===== -:release-date: +:release-date: :release-by: Asif Saif Uddin - Fix string representation of CrontabSchedule, so it matches UNIX CRON expression format (#318) - If no schedule is selected in PeriodicTask form, raise a non-field error instead of an error bounded to the `interval` field (#327) diff --git a/django_celery_beat/admin.py b/django_celery_beat/admin.py index aaeb76f5..650d1c6e 100644 --- a/django_celery_beat/admin.py +++ b/django_celery_beat/admin.py @@ -179,7 +179,7 @@ def enable_tasks(self, request, queryset): enable_tasks.short_description = _('Enable selected tasks') def disable_tasks(self, request, queryset): - rows_updated = queryset.update(enabled=False) + rows_updated = queryset.update(enabled=False, last_run_at=None) PeriodicTasks.update_changed() self._message_user_about_update(request, rows_updated, 'disabled') disable_tasks.short_description = _('Disable selected tasks') diff --git a/t/unit/test_admin.py b/t/unit/test_admin.py index 06aee0cd..cca2c3cc 100644 --- a/t/unit/test_admin.py +++ b/t/unit/test_admin.py @@ -1,7 +1,9 @@ import pytest + from django.core.exceptions import ValidationError from django.test import TestCase from itertools import combinations +from unittest import mock from django_celery_beat.admin import PeriodicTaskAdmin from django_celery_beat.models import \ @@ -115,3 +117,30 @@ def test_validate_unique_not_raises(self): PeriodicTask(interval=IntervalSchedule()).validate_unique() PeriodicTask(solar=SolarSchedule()).validate_unique() PeriodicTask(clocked=ClockedSchedule(), one_off=True).validate_unique() + + +@pytest.mark.django_db() +class DisableTasksTest(TestCase): + + @classmethod + def setUpTestData(cls): + super().setUpTestData() + cls.interval_schedule = IntervalSchedule.objects.create(every=10, + period=DAYS) + + @mock.patch('django_celery_beat.admin.PeriodicTaskAdmin.' + '_message_user_about_update') + def test_disable_tasks(self, mock_message_user): + PeriodicTask.objects.create(name='name1', task='task1', enabled=True, + interval=self.interval_schedule) + PeriodicTask.objects.create(name='name2', task='task2', enabled=True, + interval=self.interval_schedule) + + qs = PeriodicTask.objects.all() + + PeriodicTaskAdmin(PeriodicTask, None).disable_tasks(None, qs) + + for periodic_task in qs: + self.assertFalse(periodic_task.enabled) + self.assertIsNone(periodic_task.last_run_at) + mock_message_user.assert_called_once()