From 8b74f791f460e8a05558e20c1b286099a0aa8271 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 19 Jan 2023 14:34:15 +0100 Subject: [PATCH] Export schedule: Fix computation of start time on same day --- src/pretix/base/models/exports.py | 7 ++++++- src/pretix/control/views/orders.py | 5 +++-- src/tests/base/test_export.py | 3 ++- src/tests/base/test_models.py | 8 ++++++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/pretix/base/models/exports.py b/src/pretix/base/models/exports.py index a6350e8807..221da8af0d 100644 --- a/src/pretix/base/models/exports.py +++ b/src/pretix/base/models/exports.py @@ -94,7 +94,12 @@ class AbstractScheduledExport(LoggedModel): def compute_next_run(self): tz = self.tz r = rrulestr(self.schedule_rrule) - new_d = r.after(now().astimezone(tz).replace(tzinfo=None), inc=False) + + base_dt = now().astimezone(tz).replace(tzinfo=None) + if now().astimezone(tz).time() < self.schedule_rrule_time: + base_dt -= timedelta(days=1) + + new_d = r.after(base_dt, inc=False) if not new_d: self.schedule_next_run = None return diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 1a9b86b5b5..d5380a8255 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -2484,8 +2484,9 @@ class RunScheduledExportView(EventPermissionRequiredMixin, ExportMixin, View): messages.success(self.request, _('Your export is queued to start soon. The results will be send via email. ' 'Depending on system load and type and size of export, this may take a few ' 'minutes.')) - return redirect(reverse('control:organizer.export', kwargs={ - 'organizer': self.request.organizer.slug + return redirect(reverse('control:event.orders.export', kwargs={ + 'event': self.request.event.slug, + 'organizer': self.request.event.organizer.slug })) diff --git a/src/tests/base/test_export.py b/src/tests/base/test_export.py index 68b68a7e86..79007563bb 100644 --- a/src/tests/base/test_export.py +++ b/src/tests/base/test_export.py @@ -42,6 +42,7 @@ def event(): date_from=datetime(2023, 1, 19, 2, 30, 0, tzinfo=pytz.UTC), plugins='pretix.plugins.banktransfer' ) + o.settings.timezone = "Europe/Berlin" with scope(organizer=o): yield event @@ -191,7 +192,7 @@ def test_event_ok(event, user, team): @pytest.mark.django_db @freeze_time("2023-01-18 03:00:00+01:00") def test_organizer_run_sets_new_time(event, user): - s = ScheduledOrganizerExport(organizer=event.organizer, owner=user) + s = ScheduledOrganizerExport(organizer=event.organizer, owner=user, timezone="Europe/Berlin") s.schedule_rrule = "DTSTART:20230118T000000\nRRULE:FREQ=DAILY;INTERVAL=1;WKST=MO" s.schedule_rrule_time = time(2, 30, 0) s.schedule_next_run = now() - timedelta(minutes=5) diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py index fd9d696322..d5e22b25f1 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -2791,6 +2791,14 @@ class ScheduledExportTestCase(TestCase): s.compute_next_run() assert s.schedule_next_run == self.event.timezone.localize(datetime.datetime(2023, 1, 19, 6, 30, 0)) + with freeze_time("2023-01-19 06:28:00+01:00"): + s.compute_next_run() + assert s.schedule_next_run == self.event.timezone.localize(datetime.datetime(2023, 1, 19, 6, 30, 0)) + + with freeze_time("2023-01-19 06:30:00+01:00"): + s.compute_next_run() + assert s.schedule_next_run == self.event.timezone.localize(datetime.datetime(2023, 1, 24, 6, 30, 0)) + with freeze_time("2024-01-18 15:08:00+01:00"): s.compute_next_run() assert s.schedule_next_run is None