forbid past dates for product actions

This commit is contained in:
imperosol
2025-09-29 15:03:34 +02:00
parent 09d9529f0d
commit e9da0d8c4f
2 changed files with 13 additions and 2 deletions

View File

@@ -13,6 +13,7 @@ from phonenumber_field.widgets import RegionalPhoneNumberWidget
from club.widgets.ajax_select import AutoCompleteSelectClub from club.widgets.ajax_select import AutoCompleteSelectClub
from core.models import User from core.models import User
from core.views.forms import ( from core.views.forms import (
FutureDateTimeField,
NFCTextInput, NFCTextInput,
SelectDate, SelectDate,
SelectDateTime, SelectDateTime,
@@ -185,7 +186,7 @@ class ScheduledProductActionForm(forms.ModelForm):
labels = {"task": _("Action")} labels = {"task": _("Action")}
help_texts = {"task": ""} help_texts = {"task": ""}
trigger_at = forms.DateTimeField( trigger_at = FutureDateTimeField(
label=_("Date and time of action"), widget=SelectDateTime label=_("Date and time of action"), widget=SelectDateTime
) )
counters = forms.ModelMultipleChoiceField( counters = forms.ModelMultipleChoiceField(
@@ -206,7 +207,7 @@ class ScheduledProductActionForm(forms.ModelForm):
) )
def clean(self): def clean(self):
if not self.changed_data: if not self.changed_data or "trigger_at" in self.errors:
return super().clean() return super().clean()
if "trigger_at" in self.changed_data: if "trigger_at" in self.changed_data:
if not self.instance.clocked_id: if not self.instance.clocked_id:

View File

@@ -1385,3 +1385,13 @@ class ScheduledProductAction(PeriodicTask):
def full_clean(self, *args, **kwargs): def full_clean(self, *args, **kwargs):
self.one_off = True # A product action should occur one time only self.one_off = True # A product action should occur one time only
return super().full_clean(*args, **kwargs) return super().full_clean(*args, **kwargs)
def clean_clocked(self):
if not self.clocked:
raise ValidationError(_("Product actions must declare a clocked schedule."))
def validate_unique(self, exclude):
# The checks done in PeriodicTask.validate_unique aren't
# adapted in the case of scheduled product action,
# so we skip it and execute directly Model.validate_unique
return super(PeriodicTask, self).validate_unique(exclude=exclude)