Upgrade site and modules to Django 2.2. Remove and replace obsolete
functionality with current equivalents. Update requirements to latest
versions where possible. Remove unused dependencies.
Change licence to CC-BY-SA so YouTube gets appropriate licencing for talks.
This does not correspond to the YouTube Creative Common licence, which is
CC-BY-3.0, which is more permissive than we allow.
* The slot object updates its name every time it is saved
* But sometimes its slotrooms are changed underneath it, and so the
name can become out of date
* This method is a simple way of updating the names for all the slots
* lca2018 has a situation where we have multiple slots starting at the
same time, but ending at different times
* The headers of the timetable grid are sorted by room sort order
* In sqlite at least, ordering by start,order seems to implicitly
resolve duplicate start times by looking at the other sort fields
first, and will only sort on order if all other fields are identical
* This results in the slot that ends first going in column 1, which
gets out of sync with the room listed in the header
* I can't figure out how to solve this in the database, so...
* Force the slots to be sorted by room order.
* Then, for each start_time, select out slots starting at that time
and operate on them
* This both gets the slots in the right order *and* keeps multi-room
slots with the right colspan. Yay!
* It's possible that this wouldn't be needed on some DBs which might
do the sorting differently.
In many parts of the schedule there are multiple slots with the same
start/end times, and it can be hard to find the one you want to edit.
Make this slightly simpler by listing the room names in the admin list.
* Old implementation needs to see exactly the same rooms in exactly
the same order every time it loads new data, otherwise it will
create a duplicate entry for the room that differs only in display
order.
* New implementation ignores the display order when checking to see
if the room already exists.