add eventinstance migration script
This commit is contained in:
parent
582a006cf1
commit
fc7761e315
115
src/utils/management/commands/convert_eventinstances.py
Normal file
115
src/utils/management/commands/convert_eventinstances.py
Normal file
|
@ -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}")
|
Loading…
Reference in a new issue