Display talk format or proposal kind on review tables and in CSV.
Add suggested status to CSV output, for auto-accept and auto-reject.
Add endpoint to download CSV of proposals for section.
* 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.
- This has the effect of bouncing people to the login page if they're
unauthenticated, rather than returning a 502 because 'home' doesn't
exist.
- If they're authenticated but don't have a speaker profile, send them
to the speaker profile create page rather than just to the
dashboard.
Closes#26
This follows from investigations in
https://rt.lca2018.org/Ticket/Display.html?id=283&results=eac0bd3c49f782d054f87d6b160ca36b;
in short, it seems that because this very long and complex method
creates several different objects at differnt times, the DB has been
getting out of sync; there are more votes recorded then there are
reviews, becuase the table that stores the vote count is updated
before the table that stores the vote and review information
This change is intended to make this operation (and the other
operations that the revew_detail handler performs) atomic, to prevent
things getting further out of step. It does *not* fix the existing
incosistency.
review_delete has been atomicified as well as it likely needs the same
treatment, but this has not been examined in detail.