Coverage for extras/forms/reports.py: 0%
23 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django import forms
2from django.utils.translation import gettext_lazy as _
4from core.choices import JobIntervalChoices
5from utilities.datetime import local_now
6from utilities.forms.widgets import DateTimePicker, NumberWithOptions
8__all__ = (
9 'ReportForm',
10)
13class ReportForm(forms.Form):
14 schedule_at = forms.DateTimeField(
15 required=False,
16 widget=DateTimePicker(),
17 label=_("Schedule at"),
18 help_text=_("Schedule execution of report to a set time"),
19 )
20 interval = forms.IntegerField(
21 required=False,
22 min_value=1,
23 label=_("Recurs every"),
24 widget=NumberWithOptions(
25 options=JobIntervalChoices
26 ),
27 help_text=_("Interval at which this report is re-run (in minutes)")
28 )
30 def __init__(self, *args, scheduling_enabled=True, **kwargs):
31 super().__init__(*args, **kwargs)
33 # Annotate the current system time for reference
34 now = local_now().strftime('%Y-%m-%d %H:%M:%S %Z')
35 self.fields['schedule_at'].help_text += _(' (current time: <strong>{now}</strong>)').format(now=now)
37 # Remove scheduling fields if scheduling is disabled
38 if not scheduling_enabled:
39 self.fields.pop('schedule_at')
40 self.fields.pop('interval')
42 def clean(self):
43 scheduled_time = self.cleaned_data.get('schedule_at')
44 if scheduled_time and scheduled_time < local_now():
45 raise forms.ValidationError(_('Scheduled time must be in the future.'))
47 # When interval is used without schedule at, schedule for the current time
48 if self.cleaned_data.get('interval') and not scheduled_time:
49 self.cleaned_data['schedule_at'] = local_now()
51 return self.cleaned_data