12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import datetime
- import ctypes
- from django.forms.widgets import Widget
- from .models import Participant, Date, Event
- from .helpers import string2slots, get_slot_count, slots2string, slots2grid
- from django.utils.translation import gettext as _
- class DatePickerWidget(Widget):
- template_name = 'widgets/date-picker.html'
- n_weeks = 5
- def get_context(self, name, value, attrs):
- context = super().get_context(name, value, attrs)
- # get first day of the week
- today = datetime.date.today()
- context['widget']['today'] = today
- first_day_of_week = today - datetime.timedelta(days=today.weekday())
-
- # get the weekdays
- weekdays = []
- for i in range(7):
- weekdays.append(_((first_day_of_week + datetime.timedelta(days=i)).strftime('%a')))
- context['widget']['weekdays'] = weekdays
- # for the next weeks
- weeks = []
- for i in range(self.n_weeks):
- date = first_day_of_week + datetime.timedelta(days=i*7)
- week = {
- 'days': [],
- 'month': _(date.strftime('%b')),
- 'year': date.strftime('%Y'),
- }
- for j in range(7):
- day = {
- 'date': date + datetime.timedelta(days=j),
- 'day': (date + datetime.timedelta(days=j)).strftime('%d'),
- }
- week['days'].append(day)
- weeks.append(week)
- context['widget']['weeks'] = weeks
- return context
-
- def value_from_datadict(self, data, files, name):
- dates = []
- for day in self.GetValidDates():
- if data.get(f"date_{day.strftime('%Y-%m-%d')}") == "on":
- dates.append(day)
- return dates
- def value_omitted_from_data(self, data, files, name):
- return not any(
- (data.get(f"date_{day.strftime('%Y-%m-%d')}") == "on")
- for day in self.GetValidDates()
- )
- def GetValidDates(self):
- today = datetime.date.today()
- return [
- (today + datetime.timedelta(days=i))
- for i in range(7*self.n_weeks)
- ]
- class SlotPickerWidget(Widget):
- template_name = 'widgets/slot-picker.html'
- def get_context(self, name, value, attrs):
- context = super().get_context(name, value, attrs)
- event: Event = self.participant.event
- context['widget']['grid'] = slots2grid(event, [self.participant])
- return context
- def value_from_datadict(self, data, files, name):
- # create a mutable string buffer
- slots = ctypes.create_string_buffer(self.n_slots)
- # set the slots
- for i in range(self.n_slots):
- if data.get(f"slot_{i}") == "on":
- slots[i] = b'1'
- else:
- slots[i] = b'0'
- # return the slots as a string
- return slots.value
- def value_omitted_from_data(self, data, files, name):
- return False
-
- def __init__(self, *args, participant, **kwargs):
- super().__init__(*args, **kwargs)
- self.participant = participant
- self.n_slots = get_slot_count(participant.event)
|