Files
@ 8badb0cb99fa
Branch filter:
Location: symposion_app/pinaxcon/registrasion/management/commands/update_schedule.py - annotation
8badb0cb99fa
5.0 KiB
text/x-python
first stab at making a room slot, still not quite there, think i have to make a separate slot for each time slot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | 2591a943feec 2591a943feec 92adbb33140e ed21bc03359b 8badb0cb99fa ed21bc03359b 92adbb33140e ed21bc03359b 619a31148786 619a31148786 92adbb33140e 2591a943feec 2591a943feec 2591a943feec a7f26de2febc 2591a943feec 2591a943feec 619a31148786 619a31148786 2591a943feec 2591a943feec 2591a943feec 2591a943feec 2591a943feec 619a31148786 ed21bc03359b 2591a943feec 2591a943feec ed21bc03359b ed21bc03359b ed21bc03359b a7f26de2febc 2591a943feec 2591a943feec ed21bc03359b ed21bc03359b ed21bc03359b ed21bc03359b 619a31148786 2591a943feec 2591a943feec 2591a943feec 2591a943feec 2591a943feec 2591a943feec 2591a943feec 2591a943feec 2591a943feec 619a31148786 ed21bc03359b 619a31148786 619a31148786 619a31148786 ed21bc03359b 619a31148786 619a31148786 2591a943feec 2591a943feec a7f26de2febc 619a31148786 2591a943feec 2591a943feec ed21bc03359b 619a31148786 a7f26de2febc 2591a943feec ed21bc03359b ed21bc03359b ed21bc03359b ed21bc03359b 92adbb33140e 619a31148786 ed21bc03359b 619a31148786 ed21bc03359b ed21bc03359b ed21bc03359b ed21bc03359b ed21bc03359b 619a31148786 ed21bc03359b a7f26de2febc 619a31148786 ed21bc03359b ed21bc03359b 619a31148786 ed21bc03359b ed21bc03359b 619a31148786 a7f26de2febc 619a31148786 92adbb33140e 619a31148786 ed21bc03359b ed21bc03359b 619a31148786 ed21bc03359b 619a31148786 ed21bc03359b ed21bc03359b 619a31148786 ed21bc03359b ed21bc03359b ed21bc03359b ed21bc03359b a7f26de2febc a7f26de2febc ed21bc03359b ed21bc03359b ed21bc03359b ed21bc03359b 8badb0cb99fa 619a31148786 a7f26de2febc ed21bc03359b ed21bc03359b a7f26de2febc a7f26de2febc 92adbb33140e a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc a7f26de2febc 619a31148786 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 8badb0cb99fa 8badb0cb99fa 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e 92adbb33140e | from django.core.management.base import BaseCommand
from symposion.conference.models import Section, current_conference
from symposion.schedule.models import (Day, Presentation, Room, SlotKind, Schedule, Slot, SlotRoom)
from symposion.proposals.models import ProposalBase
from dateutil.parser import parse
from collections import Counter
from pathlib import Path
import csv
class Command(BaseCommand):
known_headers = ["date", "start time", "end time", "kind", "rooms"]
SLOTS = 'slots'
TALKS = 'talks'
help = "Updates the schedule based on two csv files, "\
"one that gives all the talk slots, the other the talks."
def add_arguments(self, parser):
parser.add_argument(self.SLOTS, type=Path)
parser.add_argument(self.TALKS, type=Path)
def handle(self, *args, **options):
date_strs = set()
slotkind_names = set()
room_names = set()
slot_details = {}
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)
with open(options[self.SLOTS]) as csv_file:
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)
rowdate, start_time, end_time, kind, rooms = row
slotkind_names.add(kind)
if rowdate:
date = rowdate
date_strs.add(date)
assert kind, "kind cannot be blank"
slot_type_count[(date, kind)] += 1
kindslot = f"{kind} {slot_type_count[(date, kind)]}"
for room in rooms.split(';'):
room = room.strip()
room_names.add(room)
slot_details[(date, kindslot, room)] = (start_time, end_time)
with open(options[self.TALKS]) as csv_file:
csv_reader = csv.reader(csv_file)
used_rooms = next(csv_reader)
talks = {}
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 row in csv_reader:
cell = row[0]
if cell.rsplit(' ', 1)[0] in slotkind_names:
kindslot = cell
for i, room in enumerate(used_rooms[1:], 1):
talk_id = row[i]
if not talk_id:
continue
assert (date, kindslot, room) in slot_details, f"Slot ({date}, '{kindslot}', '{room}') not found"
talks[(date, kindslot, room)] = int(talk_id)
else:
assert parse(row[0]), "Not a date: {row[0]}"
date = row[0]
for col in row[1:]:
assert col == '', f"All other columns must be empty: {date}"
days = {}
for date in date_strs:
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))
rooms[room_name] = room
slotkinds = {}
for slotkind_name in slotkind_names:
slotkind, _created = SlotKind.objects.get_or_create(schedule=schedule, label=slotkind_name)
slotkinds[slotkind_name] = slotkind
slots = {}
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)
slots[(date, kind_name, start_time, end_time)] = slot
for details, talk_id in talks.items():
date, kindslot, room = details
kind_name = kindslot.rsplit(' ', 1)[0]
(start_time, end_time) = slot_details[(date, kindslot, room)]
slot = slots[(date, kind_name, start_time, end_time)]
slotroom = SlotRoom.objects.get_or_create(slot=slot, room=rooms[room])
proposal = ProposalBase.objects.filter(pk=talk_id).first()
assert proposal, f"Could not find proposal {talk_id}"
preso = Presentation.objects.filter(proposal_base=proposal).first()
print(f'would like to set {preso} to slot {slot}')
#preso.slot = slot
preso.save()
|