From fc7761e315242494b5c319a308caac89ba87d703 Mon Sep 17 00:00:00 2001 From: Thomas Steen Rasmussen Date: Mon, 22 Jun 2020 00:21:23 +0200 Subject: [PATCH] add eventinstance migration script --- .../commands/convert_eventinstances.py | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/utils/management/commands/convert_eventinstances.py diff --git a/src/utils/management/commands/convert_eventinstances.py b/src/utils/management/commands/convert_eventinstances.py new file mode 100644 index 00000000..9e043db4 --- /dev/null +++ b/src/utils/management/commands/convert_eventinstances.py @@ -0,0 +1,115 @@ +# coding: utf-8 +import logging + +from camps.models import Camp +from django.core.management.base import BaseCommand +from program.models import EventInstance, EventSession, EventSlot, SpeakerAvailability + +logger = logging.getLogger("bornhack.%s" % __name__) + + +class Command(BaseCommand): + args = "none" + help = "Migrate eventinstances to eventsessions and eventslots" + + def add_arguments(self, parser): + parser.add_argument( + "campslug", type=str, help="The slug of the camp to process", + ) + + def handle(self, *args, **options): + camp = Camp.objects.get(slug=options["campslug"]) + for event_type_id in set( + EventInstance.objects.filter(event__track__camp=camp).values_list( + "event__event_type", flat=True + ) + ): + if event_type_id == 1: + # skip facilities + continue + logger.info(f"processing event type id {event_type_id} ...") + for instance in EventInstance.objects.filter( + event__track__camp=camp, event__event_type_id=event_type_id + ): + logger.info(f"processing instance {instance}") + + for speaker in instance.event.speakers.all(): + # create speaker availability + try: + sa = SpeakerAvailability.objects.get( + speaker=speaker, + when__adjacent_to=instance.when, + available=True, + ) + if sa.when.lower == instance.upper: + # this availability begins when the instance ends + sa.when = (instance.when.lower, sa.when.upper) + else: + # this availability ends when the instance begins + sa.when = (sa.when.lower, instance.when.upper) + sa.save() + logger.info( + f"extended speakeravailability {sa} to include instance {instance}" + ) + except SpeakerAvailability.DoesNotExist: + sa = SpeakerAvailability.objects.create( + speaker=speaker, when=instance.when, available=True, + ) + logger.info( + f"created speakeravailability {sa} for instance {instance}" + ) + + duration = int( + (instance.when.upper - instance.when.lower).total_seconds() / 60 + ) + # do we have a matching slot? + try: + slot = EventSlot.objects.get( + when=instance.when, + event_session__event_type=instance.event.event_type, + ) + except EventSlot.DoesNotExist: + slot = None + + if not slot: + logger.info(f"no existing slot found for instance {instance}") + # do we have a session of the matching type and event duration which is adjacent to this eventinstance? + try: + session = EventSession.objects.get( + when__adjacent_to=instance.when, + event_type_id=event_type_id, + event_duration_minutes=duration, + ) + logger.info( + f"found existing eventsession adjacent to instance {instance}" + ) + if session.when.lower == instance.when.upper: + # session starts when this instance ends + session.when = (instance.when.lower, session.when.upper) + elif session.when.upper == instance.when.lower: + # session ends when this instance starts + session.when = (session.when.lower, instance.when.upper) + logger.info( + f"session has been expanded to include instance {instance}" + ) + session.save() + # we should now have a matching slot + slot = EventSlot.objects.get( + when=instance.when, + event_session__event_type=instance.event.event_type, + ) + except EventSession.DoesNotExist: + session = EventSession.objects.create( + camp=camp, + event_location=instance.location, + event_type=instance.event.event_type, + when=instance.when, + event_duration_minutes=duration, + ) + logger.info(f"created new eventsession {session}") + slot = session.event_slots.get() + logger.info(f"found slot {slot} matching instance {instance}") + slot.event = instance.event + slot.autoscheduled = False + slot.save() + logger.info(f"saved slot {slot}")