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,14 +69,11 @@ 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())
if options[self.TALKS]:
with open(options[self.TALKS]) as csv_file: with open(options[self.TALKS]) as csv_file:
csv_reader = csv.reader(csv_file) csv_reader = csv.reader(csv_file)
@ -66,16 +82,14 @@ class Command(BaseCommand):
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:]: for room in used_rooms[1:]:
assert room in all_rooms, f"Unknown room: {room}" assert room in room_names, f"Unknown room: {room}"
for row in csv_reader: for row in csv_reader:
cell = row[0] cell = row[0]
if cell.rsplit(' ', 1)[0] in all_kinds: if cell.rsplit(' ', 1)[0] in slotkind_names:
kind = cell kind = cell
print('used_rooms', used_rooms)
for i, room in enumerate(used_rooms[1:], 1): for i, room in enumerate(used_rooms[1:], 1):
talk_id = row[i] talk_id = row[i]
@ -94,3 +108,20 @@ class Command(BaseCommand):
for col in row[1:]: for col in row[1:]:
assert col == '', f"All other columns must be empty: {date}" assert col == '', f"All other columns must be empty: {date}"
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)