Export schedule: Fix computation of start time on same day

This commit is contained in:
Raphael Michel
2023-01-19 14:34:15 +01:00
parent 4d75438a11
commit 8b74f791f4
4 changed files with 19 additions and 4 deletions

View File

@@ -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

View File

@@ -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
}))

View File

@@ -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)

View File

@@ -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