symposion_app/pinaxcon/registrasion/management/commands/update_schedule.py

146 lines
4.6 KiB
Python
Raw Normal View History

2019-10-12 03:47:33 +00:00
from django.core.management.base import BaseCommand
from symposion.conference.models import Section, current_conference, Conference
from symposion.schedule.models import Day, Schedule, Session
from symposion.schedule.models import (Day, Presentation, Room, SlotKind, Slot,
SlotRoom, ProposalBase)
2019-10-12 23:29:59 +00:00
from dateutil.parser import parse
2019-10-12 03:47:33 +00:00
from collections import Counter
from pathlib import Path
import csv
2019-10-13 03:54:07 +00:00
2019-10-12 03:47:33 +00:00
class Command(BaseCommand):
known_headers = ["date", "start time", "end time", "kind", "rooms"]
2019-10-12 23:29:59 +00:00
SLOTS = 'slots'
TALKS = 'talks'
2019-10-12 03:47:33 +00:00
help = "Updates the schedule based on two csv files, "\
"one that gives all the talk slots, the other the talks."
def find_or_create_slot(self, date, start_time, end_time, room):
print(date, start_time, end_time, room)
return (date, start_time, end_time, room)
def add_arguments(self, parser):
2019-10-12 23:29:59 +00:00
parser.add_argument(self.SLOTS, type=Path)
parser.add_argument(self.TALKS, type=Path)
2019-10-12 03:47:33 +00:00
def handle(self, *args, **options):
date_strs = set()
slotkind_names = set()
room_names = set()
2019-10-13 03:54:07 +00:00
slot_details = {}
2019-10-12 03:47:33 +00:00
slot_type_count = Counter()
conf = current_conference()
section = Section.objects.filter(conference=conf, slug="main").all().first()
schedule, _created = Schedule.objects.get_or_create(section=section)
print('conf', conf)
print('section', section)
print('schedule', schedule)
2019-10-12 23:29:59 +00:00
with open(options[self.SLOTS]) as csv_file:
2019-10-12 03:47:33 +00:00
csv_reader = csv.reader(csv_file)
headers = next(csv_reader)
assert headers == self.known_headers
for row in csv_reader:
assert len(row) == len(self.known_headers)
2019-10-12 23:29:59 +00:00
rowdate, start_time, end_time, kind, rooms = row
slotkind_names.add(kind)
2019-10-12 23:29:59 +00:00
if rowdate:
date = rowdate
date_strs.add(date)
2019-10-12 23:29:59 +00:00
assert kind, "kind cannot be blank"
2019-10-12 03:47:33 +00:00
slot_type_count[(date, kind)] += 1
2019-10-13 03:54:07 +00:00
kindslot = f"{kind} {slot_type_count[(date, kind)]}"
2019-10-12 23:29:59 +00:00
2019-10-12 03:47:33 +00:00
for room in rooms.split(';'):
room = room.strip()
room_names.add(room)
2019-10-12 23:29:59 +00:00
2019-10-13 03:54:07 +00:00
slot_details[(date, kindslot, room)] = (start_time, end_time)
2019-10-12 03:47:33 +00:00
with open(options[self.TALKS]) as csv_file:
csv_reader = csv.reader(csv_file)
used_rooms = next(csv_reader)
2019-10-13 03:54:07 +00:00
talk = {}
2019-10-12 23:29:59 +00:00
assert used_rooms[0] == '', "Cell (1, 1) must be empty"
2019-10-12 23:29:59 +00:00
for room in used_rooms[1:]:
assert room in room_names, f"Unknown room: {room}"
for row in csv_reader:
cell = row[0]
2019-10-12 23:29:59 +00:00
if cell.rsplit(' ', 1)[0] in slotkind_names:
2019-10-13 03:54:07 +00:00
kindslot = cell
2019-10-12 23:29:59 +00:00
for i, room in enumerate(used_rooms[1:], 1):
talk_id = row[i]
2019-10-12 23:29:59 +00:00
if not talk_id:
continue
2019-10-12 23:29:59 +00:00
2019-10-13 03:54:07 +00:00
assert (date, kindslot, room) in slot_details, f"Slot ({date}, '{kindslot}', '{room}') not found"
2019-10-12 23:29:59 +00:00
2019-10-13 03:54:07 +00:00
talk[(date, kindslot, room)] = int(talk_id)
2019-10-12 23:29:59 +00:00
else:
assert parse(row[0]), "Not a date: {row[0]}"
2019-10-12 23:29:59 +00:00
date = row[0]
2019-10-12 23:29:59 +00:00
for col in row[1:]:
assert col == '', f"All other columns must be empty: {date}"
2019-10-12 23:29:59 +00:00
days = {}
for date in date_strs:
print('schedule', type(schedule))
day, _created = Day.objects.get_or_create(
schedule=schedule, date=date)
2019-10-13 03:54:07 +00:00
days[date] = day
print('days', days)
2019-10-12 23:29:59 +00:00
rooms = {}
for room_name in room_names:
room, _created = Room.objects.get_or_create(
schedule=schedule, name=room_name, order=used_rooms.index(room_name))
2019-10-12 23:29:59 +00:00
2019-10-13 03:54:07 +00:00
slotkinds = {}
for slotkind_name in slotkind_names:
slotkind, _created = SlotKind.objects.get_or_create(schedule=schedule, label=slotkind_name)
2019-10-13 03:54:07 +00:00
slotkinds[slotkind_name] = slotkind
for details in slot_details:
date, kindslot, room = details
start_time, end_time = slot_details[details]
kind_name = kindslot.rsplit(' ', 1)[0]
# TODO this should not be hard coded
exclusive = kind_name in ["plenary", "morning tea", "afternoon tea"]
slot, _created = Slot.objects.get_or_create(
day=days[date],
kind=slotkinds[kind_name],
start=start_time, end=end_time,
exclusive=exclusive)
2019-10-12 23:29:59 +00:00