mandate both csv files, so that we can always get room order. actually finding/creating objects

This commit is contained in:
Clinton Roy 2019-10-13 11:54:03 +11:00 committed by Joel Addison
parent 619a311487
commit ed21bc0335

View file

@ -1,5 +1,13 @@
from django.core.management.base import BaseCommand 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)
from dateutil.parser import parse from dateutil.parser import parse
from collections import Counter from collections import Counter
@ -20,13 +28,23 @@ class Command(BaseCommand):
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument(self.SLOTS, type=Path) parser.add_argument(self.SLOTS, type=Path)
parser.add_argument(self.TALKS, nargs="?", type=Path, default=None) parser.add_argument(self.TALKS, type=Path)
def handle(self, *args, **options): def handle(self, *args, **options):
all_kinds, all_rooms = set(), set() date_strs = set()
slotkind_names = set()
room_names = set()
slot = {} slot = {}
slot_type_count = Counter() 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)
with open(options[self.SLOTS]) as csv_file: with open(options[self.SLOTS]) as csv_file:
csv_reader = csv.reader(csv_file) csv_reader = csv.reader(csv_file)
@ -38,10 +56,11 @@ class Command(BaseCommand):
assert len(row) == len(self.known_headers) assert len(row) == len(self.known_headers)
rowdate, start_time, end_time, kind, rooms = row rowdate, start_time, end_time, kind, rooms = row
all_kinds.add(kind) slotkind_names.add(kind)
if rowdate: if rowdate:
date = rowdate date = rowdate
date_strs.add(date)
assert kind, "kind cannot be blank" assert kind, "kind cannot be blank"
@ -50,47 +69,59 @@ class Command(BaseCommand):
for room in rooms.split(';'): for room in rooms.split(';'):
room = room.strip() room = room.strip()
all_rooms.add(room) room_names.add(room)
slot[(date, slot_name, room)] = self.find_or_create_slot( slot[(date, slot_name, room)] = self.find_or_create_slot(
date, start_time, end_time, room) date, start_time, end_time, room)
print(slot.keys()) with open(options[self.TALKS]) as csv_file:
csv_reader = csv.reader(csv_file)
if options[self.TALKS]: used_rooms = next(csv_reader)
with open(options[self.TALKS]) as csv_file:
csv_reader = csv.reader(csv_file)
used_rooms = next(csv_reader) assert used_rooms[0] == '', "Cell (1, 1) must be empty"
assert used_rooms[0] == '', "Cell (1, 1) must be empty" for room in used_rooms[1:]:
assert room in room_names, f"Unknown room: {room}"
for room in used_rooms[1:]: for row in csv_reader:
assert room in all_rooms, f"Unknown room: {room}" cell = row[0]
for row in csv_reader: if cell.rsplit(' ', 1)[0] in slotkind_names:
cell = row[0] kind = cell
if cell.rsplit(' ', 1)[0] in all_kinds: for i, room in enumerate(used_rooms[1:], 1):
kind = cell talk_id = row[i]
print('used_rooms', used_rooms) if not talk_id:
continue
for i, room in enumerate(used_rooms[1:], 1): assert (date, kind, room) in slot, f"Slot ({date}, '{kind}', '{room}') not found"
talk_id = row[i]
if not talk_id: # TODO set the talk slot to the associated talk
continue # place_talk(slot[(date, slot_name)].talk = int(talk_id)
assert (date, kind, room) in slot, f"Slot ({date}, '{kind}', '{room}') not found" else:
assert parse(row[0]), "Not a date: {row[0]}"
# TODO set the talk slot to the associated talk date = row[0]
# place_talk(slot[(date, slot_name)].talk = int(talk_id)
else: for col in row[1:]:
assert parse(row[0]), "Not a date: {row[0]}" assert col == '', f"All other columns must be empty: {date}"
date = row[0] days = {}
for date in date_strs:
print('schedule', type(schedule))
day, _created = Day.objects.get_or_create(
schedule=schedule, date=date)
days['date'] = day
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))
slotkind = {}
for slotkind_name in slotkind_names:
slotkind, _created = SlotKind.objects.get_or_create(schedule=schedule, label=slotkind_name)
for col in row[1:]:
assert col == '', f"All other columns must be empty: {date}"