widgets.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import datetime
  2. from django.forms.widgets import Widget
  3. from .models import Participant, Date, Event
  4. from .helpers import string2slots, get_slot_count, slots2string, slots2grid
  5. class DatePickerWidget(Widget):
  6. template_name = 'widgets/date-picker.html'
  7. n_weeks = 5
  8. def get_context(self, name, value, attrs):
  9. context = super().get_context(name, value, attrs)
  10. # get first day of the week
  11. today = datetime.date.today()
  12. context['widget']['today'] = today
  13. first_day_of_week = today - datetime.timedelta(days=today.weekday())
  14. # get the weekdays
  15. weekdays = []
  16. for i in range(7):
  17. weekdays.append((first_day_of_week + datetime.timedelta(days=i)).strftime('%A')[0])
  18. context['widget']['weekdays'] = weekdays
  19. # for the next weeks
  20. weeks = []
  21. for i in range(self.n_weeks):
  22. date = first_day_of_week + datetime.timedelta(days=i*7)
  23. week = {
  24. 'days': [],
  25. 'month': date.strftime('%b'),
  26. 'year': date.strftime('%Y'),
  27. }
  28. for j in range(7):
  29. day = {
  30. 'date': date + datetime.timedelta(days=j),
  31. 'day': (date + datetime.timedelta(days=j)).strftime('%d'),
  32. }
  33. week['days'].append(day)
  34. weeks.append(week)
  35. context['widget']['weeks'] = weeks
  36. return context
  37. def value_from_datadict(self, data, files, name):
  38. dates = []
  39. for day in self.GetValidDates():
  40. if data.get(f"date_{day.strftime('%Y-%m-%d')}") == "on":
  41. dates.append(day)
  42. return dates
  43. def value_omitted_from_data(self, data, files, name):
  44. return not any(
  45. (data.get(f"date_{day.strftime('%Y-%m-%d')}") == "on")
  46. for day in self.GetValidDates()
  47. )
  48. def GetValidDates(self):
  49. today = datetime.date.today()
  50. return [
  51. (today + datetime.timedelta(days=i))
  52. for i in range(7*self.n_weeks)
  53. ]
  54. class SlotPickerWidget(Widget):
  55. template_name = 'widgets/slot-picker.html'
  56. def get_context(self, name, value, attrs):
  57. context = super().get_context(name, value, attrs)
  58. event: Event = self.participant.event
  59. context['widget']['grid'] = slots2grid(event, [self.participant])
  60. return context
  61. def value_from_datadict(self, data, files, name):
  62. slots = []
  63. for i in range(self.n_slots):
  64. if data.get(f"slot_{i}") == "on":
  65. slots.append(i)
  66. return slots
  67. def value_omitted_from_data(self, data, files, name):
  68. return not any(
  69. (data.get(f"slot_{i}") == "on")
  70. for i in range(self.n_slots)
  71. )
  72. def __init__(self, *args, participant, **kwargs):
  73. super().__init__(*args, **kwargs)
  74. self.participant = participant
  75. self.n_slots = get_slot_count(participant.event)