reports.py 1.7 KB

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