Do not allow run_at to be in the past

This commit is contained in:
tcely 2025-05-11 13:36:00 -04:00 committed by GitHub
parent 5bf4eeac48
commit eace2bf45b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1016,15 +1016,18 @@ class TaskScheduleView(FormView, SingleObjectMixin):
model = Task
errors = dict(
invalid_when=_('The type ({}) was incorrect.'),
when_before_now=_('The date and time must be in the future.'),
)
def __init__(self, *args, **kwargs):
self.now = timezone.now()
self.object = None
self.timestamp = None
self.when = None
super().__init__(*args, **kwargs)
def dispatch(self, request, *args, **kwargs):
self.now = timezone.now()
self.object = self.get_object()
self.timestamp = kwargs.get('timestamp')
try:
@ -1032,7 +1035,7 @@ class TaskScheduleView(FormView, SingleObjectMixin):
except AssertionError:
self.when = None
if self.when is None:
self.when = timezone.now()
self.when = self.now
# Use the next minute and zero seconds
# The web browser does not select seconds by default
self.when = self.when.replace(second=0) + timezone.timedelta(minutes=1)
@ -1040,11 +1043,13 @@ class TaskScheduleView(FormView, SingleObjectMixin):
def get_initial(self):
initial = super().get_initial()
initial['now'] = self.now
initial['when'] = self.when
return initial
def get_context_data(self, *args, **kwargs):
data = super().get_context_data(*args, **kwargs)
data['now'] = self.now
data['when'] = self.when
return data
@ -1059,24 +1064,28 @@ class TaskScheduleView(FormView, SingleObjectMixin):
def form_valid(self, form):
max_attempts = getattr(settings, 'MAX_ATTEMPTS', 15)
now = timezone.now()
when = form.cleaned_data.get('when')
if not isinstance(when, now.__class__):
if not isinstance(when, self.now.__class__):
form.add_error(
'when',
ValidationError(
errors['invalid_when'].format(
self.errors['invalid_when'].format(
type(when),
),
),
)
if when < self.now:
form.add_error(
'when',
ValidationError(self.errors['when_before_now']),
)
if form.errors:
return super().form_invalid(form)
self.object.attempts = max_attempts // 2
self.object.run_at = when
self.object.run_at = max(self.now, when)
self.object.save()
return super().form_valid(form)