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

1from django import forms 

2from django.utils.translation import gettext_lazy as _ 

3 

4from core.choices import JobIntervalChoices 

5from utilities.datetime import local_now 

6from utilities.forms.widgets import DateTimePicker, NumberWithOptions 

7 

8__all__ = ( 

9 'ReportForm', 

10) 

11 

12 

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 ) 

29 

30 def __init__(self, *args, scheduling_enabled=True, **kwargs): 

31 super().__init__(*args, **kwargs) 

32 

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) 

36 

37 # Remove scheduling fields if scheduling is disabled 

38 if not scheduling_enabled: 

39 self.fields.pop('schedule_at') 

40 self.fields.pop('interval') 

41 

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.')) 

46 

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

50 

51 return self.cleaned_data