import datetime from django.utils.translation import gettext as _ from django.utils.html import escape from .models import Participant, Date, Event def slots2string( participant : Participant | None, n_slots : int ) -> str : """ Convert the slots of a participant to a string. """ if not participant: return '0' * n_slots # Get the slots of the participant byte_array = participant.slots # Convert the slots to a string string_value = bin(int.from_bytes(byte_array, byteorder='big'))[2:] # Pad the string with 0s if necessary return '0' * (n_slots - len(string_value)) + string_value def string2slots( string : str, n_slots : int ) -> bytes : """ Convert a string to a byte array. """ if len(string) != n_slots: raise ValueError(_("Invalid string length: {0} (expected: {1})").format(len(string), n_slots)) # Convert the string to a byte array return int(string, 2).to_bytes((n_slots + 7) // 8, byteorder='big') def get_slot_count( event ) -> int : """ Get the number of slots in an event. """ # Get the timespan of the event start_time = datetime.datetime.combine(datetime.date.today(), event.start_time) end_time = datetime.datetime.combine(datetime.date.today(), event.end_time) if(start_time>end_time): end_time += datetime.timedelta(days=1) timespan = end_time - start_time # Get the number of slots in the event days = event.date_set.count() slots_per_day = int(timespan.total_seconds() // event.slot_interval.total_seconds()) return days * slots_per_day def slots2grid( event : Event, participants : list[Participant], is_input : bool) -> dict : """ Convert the slots of an event to data for the grid. """ # Get the number of slots in the event n_slots = get_slot_count(event) # Get the timespan of the event start_time = datetime.datetime.combine(datetime.date.today(), event.start_time) end_time = datetime.datetime.combine(datetime.date.today(), event.end_time) if(start_time>end_time): end_time += datetime.timedelta(days=1) timespan = end_time - start_time # Get the slots in a day slots_per_day = int(timespan.total_seconds() // event.slot_interval.total_seconds()) # Get the slots of each day participant_slot_strings = [slots2string(participant, n_slots) for participant in participants] if is_input: html = [] for n, date in reversed(list(enumerate(event.date_set.all()))): day_offset = n * slots_per_day dt = datetime.datetime.combine(date.date, datetime.time()) html += f'