From eff4bfaf1cfef9e4d77d2d97f3b26e847bfaa714 Mon Sep 17 00:00:00 2001 From: Thomas Steen Rasmussen Date: Wed, 3 Jun 2020 21:18:06 +0200 Subject: [PATCH] SpeakerAvailability, EventSession, autoscheduler, and other goodies (#497) * fix old bug where the get_days() method would return the wrong number of days, this was not discovered because our bootstrap script has been creating 9 day camps instead of 8 day camps (this has been fixed in a different commit) * remove stray debug print * output camp days in local timezone (CEST usually), not UTC * speakeravailability commit of doom, originally intended for #385 but goes a bit further than that. Adds SpeakerAvailability and EventSession models, and models for the new autoscheduler. Update bootstrap script and more. New conference_autoscheduler dependency. Work in progress, but ready for playing around! * add conference-scheduler to requirements * rework migrations, work at bit with postgres range fields and bounds, change how speakeravailability is saved (continuous ranges instead of 1 hour chunks), add tests for utils/range_fields.py including adding hypothesis to requirements/dev.txt, add a test which runs our bootstrap script * catch name collision in the right place, and load missing postgres extension in the migration * add some verbosity to see what the travis issue might be * manually create btree_gist extension in postgres, not sure why the BtreeGistExtension() operation in program/migrations/0085... isn't working in travis? * create extension in the right database maybe * lets try this then * ok so the problem is not that the btree_gist extension isn't getting loaded, the problem is that GIST indexes do not work with uuid fields in postgres 9.6, lets take another stab at getting pg10 with postgis to work with in travis * lets try normal socket connection * add SPEAKER_AVAILABILITY_DAYCHUNK_HOURS=3 to travis environment_settings.py * rework migrations, change so an autoschedule can work with multiple eventtypes, change AutoSlot model to use a DateTimeRangeField so we can use the database for more efficient lookups, add 'conflicts' self m2m for EventLocation to indicate when a room conflicts with another room, add a support_autoscheduling bool to EventType, add workshops to bootstrap script, add timing output to bootstrap script * update README a bit, move some functionality to model methods, update jquery and jquery.datatables, include datatables in base.html instead of in each page, start adding backoffice schedule management views (unfinished), yolo commit so I can show valberg something * Switch to a more simple way of using the autoscheduler, meaning we can remove the whole autoscheduler app and all models. All autoscheduler code is now in program/autoscheduler.py and a bit in backoffice views. Add more backoffice CRUD views for schedule management. Add datatables moment.js plugin to help table sorting of dates. Add Speaker{Proposal}EventConflict model to allow speakers to inform us which events they want to attend so we dont schedule them at the same time. Add EventTag model. New models not hooked up to anything yet. * handle cases where there is no solution without failing, also dont return anything here * wrong block kiddo * switch from EventInstance to EventSlot as the way we schedule events. Finish backoffice content team views (mostly). Many small changes. Prod will need data migration of EventInstances -> EventSlots when the time comes. * keep speakeravailability stuff a bit more DRY by using the AvailabilityMatrixViewMixin everywhere, add event_duration_minutes to EventSession create/update form, reverse the order we delete/create EventSlot objects when updating an EventSession * go through all views, fix various little bugs here and there * add missing migration * add django-taggit, add tags for Events, add tags in bootstrap script, make AutoScheduler use tags. Add tags in forms and templates. * fix taggit entry in requirements * Fix our iCal view: Add uuid field to Event, add uuid property to EventSlot which calculates a consitent UUID for an event at a start time at a location. Use this as the schedule uuid. While here fix so our iCal export is valid, a few fields were missing, the iCal file now validates 100% OK. * fix our FRAB xml export view * comment the EventSlot.uuid property better * typo in comment * language Co-Authored-By: Benjamin Balder Bach * language Co-Authored-By: Benjamin Balder Bach * Update src/backoffice/templates/autoschedule_debug_events.html Co-Authored-By: Benjamin Balder Bach * add a field to make this form look less weird. No difference in functionality. * remove stray print and refactor this form init a bit * fix ScheduleView * only show slots where all speakers are available when scheduling events manually in backoffice * make event list sortable by video recording column * update description on {speaker|event}proposal models reason field * remove badge showing number of scheduled slots for each event in backoffice eventlist. it was unclear what the number meant and it doesn't really fit * remember to consider events in the same location when deciding whether a slot is available or not * add is_available() method to EventLocation, add clean_location() method to EventSlot, call it from EventSlot.clean(), update a bit of text in eventslotunschedule template * fix EventSession.get_available_slots() so it doesnt return busy slots as available, and since this means we can no longer schedule stuff in the lunchbreak lower the number of talks in the bootstrap script a bit so we have a better chance of having a solvable problem * fix the excludefilter in EventSession.get_available_slots() for real this time, also fix an icon and add link in event schedule template in backoffice * show message when no slots are available for manual scheduling in backoffice * add event_conflicts to SpeakerUpdateView form in backoffice * fix link to speaker object in speakerproposal list in backoffice * allow blank tags * make duration validation depend on the eventtype event_duration_minutes if we have one. fix help_text and label and placeholder for all duration fields * allow music acts up to 180 mins in the bootstrap data * fix wrong eventtype name for recreational events in speakerproposalform * stretch the colspan one cell more * save event_conflicts m2m when submitting speaker and event together * form not self, and add succes message * move js function toggleclass() to bornhack.js and rename to toggle_sa_form_class(), function is used in several templates and was missing when submitting combined proposals * move the no-js removal to the top of ready() function This will allow other javascript initialization (eg. DataTable) to see the elements and initialize accordingly (eg. column width for tables) * Fixed problem with event feedback detail view * Fixed problem with event feedback list view * introduce a get_tzrange_days() function and use that to get the relevant days for the matrix instead of camp.get_days(), thereby fixing some display issues when eventsessions cross dates * show submitting user and link to proposal on backoffice event detail page, change User to Submitter in backoffice speaker list table * show warning by the buttons when a proposal cannot be approved, and show better text on approve/reject buttons * disable js schedule, save m2m, prefetch some stuff * fix broken date header in table * remove use of djangos regular slugify function, use the new utils.slugs.unique_slugify() instead Co-authored-by: Thomas Steen Rasmussen Co-authored-by: Benjamin Balder Bach Co-authored-by: Thomas Flummer --- .gitignore | 2 + .travis.yml | 6 +- README.md | 6 +- src/.coverage | 1 - src/backoffice/forms.py | 85 ++ .../templates/approve_feedback.html | 6 +- .../approve_public_credit_names.html | 6 +- .../templates/autoschedule_apply.html | 23 + .../templates/autoschedule_crash_course.html | 31 + .../templates/autoschedule_debug_events.html | 29 + .../templates/autoschedule_debug_slots.html | 30 + .../templates/autoschedule_diff.html | 15 + .../templates/autoschedule_index.html | 58 + .../templates/autoschedule_validate.html | 26 + src/backoffice/templates/badge_handout.html | 6 +- .../templates/chain_list_backoffice.html | 7 +- src/backoffice/templates/event_delete.html | 20 + .../templates/event_detail_backoffice.html | 77 + .../templates/event_list_backoffice.html | 28 + .../templates/event_location_delete.html | 18 + .../templates/event_location_detail.html | 89 ++ .../templates/event_location_form.html | 19 + .../templates/event_location_list.html | 69 + .../event_proposal_approve_reject.html | 28 + .../event_proposal_detail_backoffice.html | 95 ++ .../templates/event_proposal_list.html | 22 + src/backoffice/templates/event_schedule.html | 48 + .../event_session_create_location_select.html | 25 + .../event_session_create_type_select.html | 25 + .../templates/event_session_delete.html | 19 + .../templates/event_session_detail.html | 82 ++ .../templates/event_session_form.html | 63 + .../templates/event_session_list.html | 70 + .../templates/event_slot_detail.html | 54 + src/backoffice/templates/event_slot_list.html | 82 ++ .../templates/event_slot_unschedule.html | 24 + .../templates/event_type_detail.html | 91 ++ src/backoffice/templates/event_type_list.html | 50 + src/backoffice/templates/event_update.html | 21 + .../templates/expense_list_backoffice.html | 5 - .../includes/autoschedule_diff_table.html | 63 + .../includes/event_list_table_backoffice.html | 57 + .../event_proposal_list_table_backoffice.html | 58 + .../includes/event_slot_list_backoffice.html | 29 + .../speaker_list_table_backoffice.html | 46 + ...peaker_proposal_list_table_backoffice.html | 41 + src/backoffice/templates/index.html | 62 +- .../templates/manage_eventproposal.html | 15 - .../templates/manage_proposals.html | 83 -- .../templates/manage_speakerproposal.html | 15 - .../templates/merchandise_to_order.html | 6 +- .../templates/orders_merchandise.html | 6 +- src/backoffice/templates/orders_village.html | 6 +- .../templates/pending_proposals.html | 32 + src/backoffice/templates/product_handout.html | 6 +- .../reimbursement_list_backoffice.html | 5 - .../templates/revenue_list_backoffice.html | 5 - .../templates/shop_ticket_overview.html | 6 +- src/backoffice/templates/speaker_delete.html | 19 + .../templates/speaker_detail_backoffice.html | 68 + .../templates/speaker_list_backoffice.html | 20 + .../speaker_proposal_approve_reject.html | 21 + .../speaker_proposal_detail_backoffice.html | 90 ++ .../templates/speaker_proposal_list.html | 24 + src/backoffice/templates/speaker_update.html | 32 + src/backoffice/templates/ticket_checkin.html | 6 +- .../templates/village_to_order.html | 6 +- src/backoffice/urls.py | 351 ++++- src/backoffice/views.py | 918 +++++++++++- src/bornhack/environment_settings.py.dist | 1 + src/bornhack/environment_settings.py.dist.dev | 7 +- src/bornhack/settings.py | 8 +- src/camps/models.py | 82 +- src/economy/models.py | 21 +- src/economy/templates/expense_list.html | 5 - src/economy/templates/reimbursement_list.html | 5 - src/economy/templates/revenue_list.html | 5 - src/facilities/models.py | 13 +- src/news/models.py | 23 +- src/phonebook/templates/phonebook.html | 7 +- src/program/admin.py | 60 +- src/program/apps.py | 13 +- src/program/autoscheduler.py | 390 +++++ src/program/email.py | 96 +- src/program/forms.py | 200 ++- .../migrations/0085_btree_gist_extension.py | 15 + .../0086_sessions_slots_availability.py | 426 ++++++ .../0087_fk_and_related_name_underscores.py | 215 +++ .../0088_speaker_event_conflicts_and_more.py | 114 ++ .../migrations/0089_event_conflicts_blank.py | 23 + src/program/migrations/0090_event_tags.py | 25 + .../migrations/0091_eventproposal_tags.py | 26 + src/program/migrations/0092_event_uuid.py | 25 + .../0093_proposal_reason_description.py | 29 + src/program/migrations/0094_tags_blank.py | 27 + src/program/mixins.py | 84 +- src/program/models.py | 975 +++++++++++-- src/program/schema.py | 2 +- src/program/signal_handlers.py | 34 +- .../combined_proposal_select_person.html | 16 +- .../templates/combined_proposal_submit.html | 12 +- ...pted.html => event_proposal_accepted.html} | 0 ...cepted.txt => event_proposal_accepted.txt} | 0 ...cted.html => event_proposal_rejected.html} | 0 ...jected.txt => event_proposal_rejected.txt} | 0 ...tproposal.html => new_event_proposal.html} | 2 +- ...entproposal.txt => new_event_proposal.txt} | 2 +- ...roposal.html => new_speaker_proposal.html} | 2 +- ...rproposal.txt => new_speaker_proposal.txt} | 2 +- ...ed.html => speaker_proposal_accepted.html} | 0 ...pted.txt => speaker_proposal_accepted.txt} | 0 ...ed.html => speaker_proposal_rejected.html} | 0 ...cted.txt => speaker_proposal_rejected.txt} | 0 ...oposal.html => update_event_proposal.html} | 2 +- ...proposal.txt => update_event_proposal.txt} | 2 +- ...osal.html => update_speaker_proposal.html} | 2 +- ...oposal.txt => update_speaker_proposal.txt} | 2 +- src/program/templates/event_detail.html | 75 + ...delete.html => event_feedback_delete.html} | 4 +- ...detail.html => event_feedback_detail.html} | 2 +- ...ack_form.html => event_feedback_form.html} | 4 +- ...ack_list.html => event_feedback_list.html} | 6 +- src/program/templates/event_list.html | 56 +- .../templates/event_proposal_add_person.html | 21 +- .../templates/event_proposal_detail.html | 107 ++ ...sal_form.html => event_proposal_form.html} | 1 + .../event_proposal_remove_person.html | 6 +- .../event_proposal_select_person.html | 16 +- .../templates/eventproposal_detail.html | 22 - .../includes/event_feedback_buttons.html | 6 + ....html => event_feedback_detail_panel.html} | 18 +- .../templates/includes/event_list_table.html | 52 + .../includes/event_proposal_table.html | 24 +- .../includes/event_proposal_type_select.html | 12 +- .../includes/event_proposal_url_table.html | 25 + .../includes/eventfeedback_buttons.html | 6 - .../includes/eventproposal_detail.html | 64 - .../includes/eventproposalurl_table.html | 25 - .../includes/speaker_proposal_table.html | 28 +- ...e.html => speaker_proposal_url_table.html} | 10 +- .../includes/speakerproposal_detail.html | 40 - .../templates/noscript_schedule_view.html | 35 +- src/program/templates/program_base.html | 2 +- src/program/templates/proposal_list.html | 12 +- .../templates/schedule_event_detail.html | 66 - src/program/templates/speaker_detail.html | 80 +- ...lete.html => speaker_proposal_delete.html} | 0 .../templates/speaker_proposal_detail.html | 82 ++ .../templates/speaker_proposal_form.html | 28 + ...bmit.html => speaker_proposal_submit.html} | 0 .../templates/speakerproposal_detail.html | 24 - .../templates/speakerproposal_form.html | 21 - src/program/templates/url_delete.html | 8 +- src/program/templates/url_form.html | 2 +- src/program/templatetags/program.py | 161 ++- src/program/urls.py | 57 +- src/program/utils.py | 298 ++++ src/program/views.py | 843 +++++++---- src/requirements/dev.txt | 2 +- src/requirements/production.txt | 2 + .../templates/rideshare/ride_list.html | 7 +- src/shop/models.py | 10 +- src/static_src/css/bornhack.css | 7 +- ....css => jquery.dataTables.1.10.20.min.css} | 0 src/static_src/js/bornhack.js | 27 + src/static_src/js/jquery-3.3.1.min.js | 2 + .../js/jquery.dataTables.1.10.20.min.js | 180 +++ .../js/jquery.dataTables.datatime-moment.js | 74 + src/static_src/js/jquery.dataTables.min.js | 164 --- src/static_src/js/jquery.min.js | 5 - src/static_src/js/moment-with-locales.min.js | 10 - src/static_src/js/moment.2.8.4.min.js | 7 + src/teams/models.py | 19 +- src/templates/base.html | 22 +- src/utils/database.py | 17 + src/utils/forms.py | 7 + .../management/commands/bootstrap-devsite.py | 1277 ++++++++--------- src/utils/migrations/0004_uuidtaggeditem.py | 52 + src/utils/models.py | 11 +- src/utils/range_fields.py | 303 ++++ src/utils/slugs.py | 29 + src/utils/templatetags/bornhack.py | 10 +- src/utils/test_range_fields.py | 613 ++++++++ src/utils/tests.py | 10 + src/villages/models.py | 31 +- src/wishlist/models.py | 13 +- 186 files changed, 9383 insertions(+), 2434 deletions(-) delete mode 100644 src/.coverage create mode 100644 src/backoffice/forms.py create mode 100644 src/backoffice/templates/autoschedule_apply.html create mode 100644 src/backoffice/templates/autoschedule_crash_course.html create mode 100644 src/backoffice/templates/autoschedule_debug_events.html create mode 100644 src/backoffice/templates/autoschedule_debug_slots.html create mode 100644 src/backoffice/templates/autoschedule_diff.html create mode 100644 src/backoffice/templates/autoschedule_index.html create mode 100644 src/backoffice/templates/autoschedule_validate.html create mode 100644 src/backoffice/templates/event_delete.html create mode 100644 src/backoffice/templates/event_detail_backoffice.html create mode 100644 src/backoffice/templates/event_list_backoffice.html create mode 100644 src/backoffice/templates/event_location_delete.html create mode 100644 src/backoffice/templates/event_location_detail.html create mode 100644 src/backoffice/templates/event_location_form.html create mode 100644 src/backoffice/templates/event_location_list.html create mode 100644 src/backoffice/templates/event_proposal_approve_reject.html create mode 100644 src/backoffice/templates/event_proposal_detail_backoffice.html create mode 100644 src/backoffice/templates/event_proposal_list.html create mode 100644 src/backoffice/templates/event_schedule.html create mode 100644 src/backoffice/templates/event_session_create_location_select.html create mode 100644 src/backoffice/templates/event_session_create_type_select.html create mode 100644 src/backoffice/templates/event_session_delete.html create mode 100644 src/backoffice/templates/event_session_detail.html create mode 100644 src/backoffice/templates/event_session_form.html create mode 100644 src/backoffice/templates/event_session_list.html create mode 100644 src/backoffice/templates/event_slot_detail.html create mode 100644 src/backoffice/templates/event_slot_list.html create mode 100644 src/backoffice/templates/event_slot_unschedule.html create mode 100644 src/backoffice/templates/event_type_detail.html create mode 100644 src/backoffice/templates/event_type_list.html create mode 100644 src/backoffice/templates/event_update.html create mode 100644 src/backoffice/templates/includes/autoschedule_diff_table.html create mode 100644 src/backoffice/templates/includes/event_list_table_backoffice.html create mode 100644 src/backoffice/templates/includes/event_proposal_list_table_backoffice.html create mode 100644 src/backoffice/templates/includes/event_slot_list_backoffice.html create mode 100644 src/backoffice/templates/includes/speaker_list_table_backoffice.html create mode 100644 src/backoffice/templates/includes/speaker_proposal_list_table_backoffice.html delete mode 100644 src/backoffice/templates/manage_eventproposal.html delete mode 100644 src/backoffice/templates/manage_proposals.html delete mode 100644 src/backoffice/templates/manage_speakerproposal.html create mode 100644 src/backoffice/templates/pending_proposals.html create mode 100644 src/backoffice/templates/speaker_delete.html create mode 100644 src/backoffice/templates/speaker_detail_backoffice.html create mode 100644 src/backoffice/templates/speaker_list_backoffice.html create mode 100644 src/backoffice/templates/speaker_proposal_approve_reject.html create mode 100644 src/backoffice/templates/speaker_proposal_detail_backoffice.html create mode 100644 src/backoffice/templates/speaker_proposal_list.html create mode 100644 src/backoffice/templates/speaker_update.html create mode 100644 src/program/autoscheduler.py create mode 100644 src/program/migrations/0085_btree_gist_extension.py create mode 100644 src/program/migrations/0086_sessions_slots_availability.py create mode 100644 src/program/migrations/0087_fk_and_related_name_underscores.py create mode 100644 src/program/migrations/0088_speaker_event_conflicts_and_more.py create mode 100644 src/program/migrations/0089_event_conflicts_blank.py create mode 100644 src/program/migrations/0090_event_tags.py create mode 100644 src/program/migrations/0091_eventproposal_tags.py create mode 100644 src/program/migrations/0092_event_uuid.py create mode 100644 src/program/migrations/0093_proposal_reason_description.py create mode 100644 src/program/migrations/0094_tags_blank.py rename src/program/templates/emails/{eventproposal_accepted.html => event_proposal_accepted.html} (100%) rename src/program/templates/emails/{eventproposal_accepted.txt => event_proposal_accepted.txt} (100%) rename src/program/templates/emails/{eventproposal_rejected.html => event_proposal_rejected.html} (100%) rename src/program/templates/emails/{eventproposal_rejected.txt => event_proposal_rejected.txt} (100%) rename src/program/templates/emails/{new_eventproposal.html => new_event_proposal.html} (60%) rename src/program/templates/emails/{new_eventproposal.txt => new_event_proposal.txt} (60%) rename src/program/templates/emails/{new_speakerproposal.html => new_speaker_proposal.html} (60%) rename src/program/templates/emails/{new_speakerproposal.txt => new_speaker_proposal.txt} (60%) rename src/program/templates/emails/{speakerproposal_accepted.html => speaker_proposal_accepted.html} (100%) rename src/program/templates/emails/{speakerproposal_accepted.txt => speaker_proposal_accepted.txt} (100%) rename src/program/templates/emails/{speakerproposal_rejected.html => speaker_proposal_rejected.html} (100%) rename src/program/templates/emails/{speakerproposal_rejected.txt => speaker_proposal_rejected.txt} (100%) rename src/program/templates/emails/{update_eventproposal.html => update_event_proposal.html} (57%) rename src/program/templates/emails/{update_eventproposal.txt => update_event_proposal.txt} (56%) rename src/program/templates/emails/{update_speakerproposal.html => update_speaker_proposal.html} (57%) rename src/program/templates/emails/{update_speakerproposal.txt => update_speaker_proposal.txt} (61%) create mode 100644 src/program/templates/event_detail.html rename src/program/templates/{eventfeedback_delete.html => event_feedback_delete.html} (60%) rename src/program/templates/{eventfeedback_detail.html => event_feedback_detail.html} (50%) rename src/program/templates/{eventfeedback_form.html => event_feedback_form.html} (62%) rename src/program/templates/{eventfeedback_list.html => event_feedback_list.html} (61%) create mode 100644 src/program/templates/event_proposal_detail.html rename src/program/templates/{eventproposal_form.html => event_proposal_form.html} (99%) delete mode 100644 src/program/templates/eventproposal_detail.html create mode 100644 src/program/templates/includes/event_feedback_buttons.html rename src/program/templates/includes/{eventfeedback_detail_panel.html => event_feedback_detail_panel.html} (62%) create mode 100644 src/program/templates/includes/event_list_table.html create mode 100644 src/program/templates/includes/event_proposal_url_table.html delete mode 100644 src/program/templates/includes/eventfeedback_buttons.html delete mode 100644 src/program/templates/includes/eventproposal_detail.html delete mode 100644 src/program/templates/includes/eventproposalurl_table.html rename src/program/templates/includes/{speakerproposalurl_table.html => speaker_proposal_url_table.html} (51%) delete mode 100644 src/program/templates/includes/speakerproposal_detail.html delete mode 100644 src/program/templates/schedule_event_detail.html rename src/program/templates/{speakerproposal_delete.html => speaker_proposal_delete.html} (100%) create mode 100644 src/program/templates/speaker_proposal_detail.html create mode 100644 src/program/templates/speaker_proposal_form.html rename src/program/templates/{speakerproposal_submit.html => speaker_proposal_submit.html} (100%) delete mode 100644 src/program/templates/speakerproposal_detail.html delete mode 100644 src/program/templates/speakerproposal_form.html create mode 100644 src/program/utils.py rename src/static_src/css/{jquery.dataTables.min.css => jquery.dataTables.1.10.20.min.css} (100%) create mode 100644 src/static_src/js/bornhack.js create mode 100644 src/static_src/js/jquery-3.3.1.min.js create mode 100644 src/static_src/js/jquery.dataTables.1.10.20.min.js create mode 100644 src/static_src/js/jquery.dataTables.datatime-moment.js delete mode 100644 src/static_src/js/jquery.dataTables.min.js delete mode 100644 src/static_src/js/jquery.min.js delete mode 100644 src/static_src/js/moment-with-locales.min.js create mode 100644 src/static_src/js/moment.2.8.4.min.js create mode 100644 src/utils/database.py create mode 100644 src/utils/forms.py create mode 100644 src/utils/migrations/0004_uuidtaggeditem.py create mode 100644 src/utils/range_fields.py create mode 100644 src/utils/slugs.py create mode 100644 src/utils/test_range_fields.py create mode 100644 src/utils/tests.py diff --git a/.gitignore b/.gitignore index 976b5854..508f574d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .dev .idea/ +.hypothesis/ __pycache__/ db.sqlite3 *.sw* @@ -7,3 +8,4 @@ db.sqlite3 venv/ environment_settings.py elm-stuff/ +.coverage diff --git a/.travis.yml b/.travis.yml index c3fe7ea6..5225b44a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,10 +10,12 @@ services: - postgresql addons: - postgresql: "9.6" + postgresql: "10" apt: packages: - - postgresql-9.6-postgis-2.5 + - postgresql-10 + - postgresql-client-10 + - postgresql-10-postgis-2.5 install: - pip install -r src/requirements/dev.txt diff --git a/README.md b/README.md index 7a044872..c3912a48 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,9 @@ If you already cloned the repository without --recursive, you can change into th git submodule update --init --recursive ### Virtualenv -Create a Python 3 virtual environment and activate it: +Create a Python 3.7 virtual environment and activate it: ``` -$ virtualenv venv -p python3 +$ virtualenv venv -p python3.7 $ source venv/bin/activate ``` @@ -57,7 +57,7 @@ Install pip packages: ### Postgres -You need to have a running Postgres instance (we use Postgres-specific fields and PostGIS/GeoDjango). Install Postgres and PostGIS, and add a database `bornhack` (or whichever you like) with some way for the application to connect to it, for instance adding a user with a password. Connect to the database as a superuser and run `create extension postgis`. +You need to have a running Postgres instance (sqlite or mysql or others can't be used, because we use Postgres-specific fields and PostGIS/GeoDjango). Install Postgres and PostGIS, and add a database `bornhack` (or whichever you like) with some way for the application to connect to it, for instance adding a user with a password. Connect to the database as a superuser and run `create extension postgis`. The postgres version in production is 12 and the postgis version in production is 2.5. The minimum postgres version is 10, because we use GIST indexes on uuid fields (for ExclusionConstraints). ### Configuration file diff --git a/src/.coverage b/src/.coverage deleted file mode 100644 index 5a690a30..00000000 --- a/src/.coverage +++ /dev/null @@ -1 +0,0 @@ -!coverage.py: This is a private format, don't read it directly!{"lines":{"/home/valberg/code/bornhack/bornhack-website/src/manage.py":[2,3,5,7,8,9,10,13,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/__init__.py":[1,3,5,8,14,15,16,17,19,20,21,22,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/version.py":[1,2,3,4,5,6,12,13,14,15,18,42,49,63,71,93,20,54,57,58,60,27,44,45,46,29,30,35,39,98,99,100,101,103,104,55],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/distutils/__init__.py":[1,2,3,4,5,9,11,12,16,17,19,20,21,22,23,25,27,28,29,30,35,52,53,70,74,75,79,80,82,83,87,88,90,91,100,101],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/__init__.py":[1,2,3,4,5,6,7,9,10,11,12,13,16,17,20,30,40,75,151,154,155,162,195,227,301,378,380,156,157,158,160,381,306,307,314,315,316,317,318,319,320,324,325,331,335,357,359,249,250,361,370,372,375,202,63,25,26,27,65,68,69,70,72,203,204,220,224,36,37,225,95,101,102,106,110,113,115,117,119,120,123,124,125,127,128,130,131,132,133,134,144,145,146,148],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/apps/__init__.py":[1,2,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/apps/config.py":[1,2,4,5,7,10,11,13,51,54,81,154,170,191,200,86,90,105,107,112,116,117,118,129,135,136,142,143,152,15,19,23,30,31,34,39,40,60,61,69,74,79,45,49,108,110,35,194,196,197,198,160,163,164,165,161,183,184,185,187,189,186,166,167,168],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/exceptions.py":[3,6,7,8,11,12,13,16,17,18,21,22,23,26,27,30,31,32,35,36,37,40,41,42,45,46,47,50,54,55,58,62,63,66,67,68,71,72,73,76,77,78,81,82,83,86,87,88,91,94,95,96,139,147,153,161,172,177,181,182,183],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/module_loading.py":[1,2,3,4,7,27,63,83,12,13,17,19,20,65,66,67,72,73,74,37,39,40,41,43,44,45,47,48,53,54,59],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/apps/registry.py":[1,2,3,4,5,6,8,10,13,18,20,59,124,134,139,144,162,163,182,209,231,240,259,273,295,322,327,352,358,374,413,423,24,34,37,41,44,47,48,53,56,67,72,73,78,82,85,86,89,90,95,96,99,100,102,103,108,111,112,249,126,250,251,252,253,254,255,256,257,213,214,215,227,228,418,419,229,366,367,384,392,397,400,406,407,267,268,269,270,408,409,420,398,399,271,411,385,141,142,114,116,119,120,150,151,152,194,197,199,200,202,204,207,122,195,136,57,370,285,175,177,178,179,180,286,288,291,293,87,292,371,372,237,238],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/conf/__init__.py":[7,9,10,11,12,13,15,16,17,18,20,23,28,29,46,54,62,73,78,91,97,98,143,146,153,154,157,159,167,172,178,183,189,195,201,67,68,71,94,56,57,35,36,44,100,101,102,105,107,112,114,115,116,117,119,122,123,120,125,128,144,131,134,135,136,140,141,58,59,60,70],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/conf/global_settings.py":[4,9,17,22,26,31,35,41,44,48,52,10,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,144,148,149,152,153,154,155,160,164,169,170,173,176,179,182,188,191,194,197,200,201,202,203,204,205,206,209,211,214,218,222,225,228,231,243,245,257,262,265,269,273,277,281,285,286,291,295,299,304,308,313,319,323,327,331,336,341,345,350,357,358,359,360,361,369,370,371,380,381,382,383,384,385,386,387,388,389,390,391,396,399,402,406,409,412,413,416,418,419,426,435,444,451,453,455,457,459,461,463,466,468,470,472,475,477,485,486,489,490,491,497,499,501,503,505,508,514,515,516,517,520,526,534,537,538,539,540,541,542,543,544,545,546,553,563,566,570,577,581,588,595,598,603,604,613,623,628,629,630,631,632,633,634,635],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/deprecation.py":[1,2,5,6,9,10,13,14,20,30,40,42,44,73,74,82,83,87,84,85],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/functional.py":[1,2,3,4,10,16,23,24,29,41,45,46,49,167,171,178,200,207,210,218,225,228,230,235,211,215,237,246,253,273,278,287,296,297,298,301,305,306,307,308,311,312,313,314,315,316,319,327,333,334,346,351,358,367,377,233,238,240,25,26,27,57,58,63,64,66,73,79,82,102,112,115,118,121,129,134,139,144,147,152,159,164,204,185,188,197,189,191,196,162,67,68,69,70,84,85,86,89,90,91,105,110,92,93,94,95,97,98,71,343,344,99,35,37,38,148,149,113,212,213,214,242,244,193,194,385,386,387,388,195,108,109,347],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/base.py":[4,5,6,7,8,10,11,12,13,14,17,28,29,32,35,36,39,44,45,50,57,64,76,91,95,97,98,101,107,110,114,117,118,122,129,134,137,140,148,215,217,220,221,222,223,226,228,230,239,247,285,291,299,335,365,368,369,435,462,470,477,478,480,483,496,506,517,518,519,521,524,532,46,47,48,70,72,231,130,131,124,127,132,232,233,236,237,138,125,307,308,252,253,254,255,256,257,259,245,260,261,262,263,265,266,268,273,274,275,277,278,279,280,282,283,310,52,55,311,313,314,315,316,341,344,346,349,351,353,78,88,79,80,81,82,83,85,86,87,354,363,135,376,377,378,379,366,382,383,385,410,413,414,416,417,420,423,427,429,430,433,141,142,143,144,120,145,328,329],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/__init__.py":[1,5,8,9,10,11,12,13,14,15,19,20,21,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/messages.py":[2,3,4,5,6,9,11,19,26,41,45,48,53,54,58,59,63,64,68,69,73,74,70,12,13,14,15,16,17,65],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/registry.py":[1,3,6,9,10,11,12,13,14,15,16,17,18,21,23,27,56,78,81,86,93,24,25,94,95,96,43,49,52,53,54,44,45,46,47,50,60,61,87,88,90,63,68,70,71,72,75,76],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/itercompat.py":[1,3,4,8,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/caches.py":[1,2,4,6,7,8,12,14,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/cache/__init__.py":[14,15,17,18,19,22,25,26,29,32,57,62,63,66,83,87,64,90,96,97,100,103,106,109,113,116,124,67,68,69,70,74,79,33,35,36,47,48,49,50,54,80,81],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/signals.py":[1,3,4,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/dispatch/__init__.py":[7,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/dispatch/dispatcher.py":[1,2,4,7,13,8,10,16,19,27,28,49,113,149,152,178,214,223,262,272,35,36,38,39,40,46,47,37,82,85,92,95,97,98,99,101,104,105,107,108,216,109,110,111,285,292,286,290,86,89,291,9,102,103,170,171,93,174,175,230,231,237,238,239,240,241,242,243,245,251,252,260,244,253,255,256,257,232,235,246,247,269,217,219,220,250],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/inspect.py":[1,4,12,36,43,53,61,37,38,39,5,7,8,62],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/cache/backends/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/cache/backends/base.py":[1,2,3,5,6,9,10,13,14,19,22,25,36,50,51,77,89,103,113,120,127,134,140,155,176,182,194,201,210,226,235,239,258,274,281,52,53,54,55,58,60,61,62,63,67,68,69,73,74,75,42,47],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/database.py":[1,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/__init__.py":[1,2,10,11,12,13,16,18,26,31,32,35,38,41,45,49,54,59,64,65,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/utils.py":[1,2,3,4,6,7,8,9,11,12,15,16,19,20,23,24,27,28,31,32,35,36,39,40,43,44,47,48,51,55,57,65,68,91,100,131,132,135,136,144,161,182,195,207,210,213,216,219,228,229,235,248,267,249,265,268,270,283,297,305,141,142,233,196,199,166,167,146,147,148,154,157,159,171,172,173,174,176,177,178,179,180,200,186,187,191,192,193,201,202,106,107,109,110,203,204,205,197,214,63,66,69,70,94,97,95,96,298,299,300,301,302,284,237,238,239,240,246,295,307,308,250,251,261,262,263,271,281,217,264,220,221,222,225],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/model_checks.py":[1,2,3,5,6,9,10,31,152,153,42,45,46,154,11,12,13,16,17,27,28],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/security/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/security/base.py":[1,3,5,6,8,9,14,17,18,24,27,28,33,36,37,42,45,46,51,54,55,60,63,64,69,72,73,77,78,80,83,84,85,88,89,95,98,99,100,103,104,106,110,114,118,124,130,136,146,156,165,174,183,193,199,208],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/security/csrf.py":[1,3,5,6,11,14,15,19,23,27,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/security/sessions.py":[1,3,6,13,14,15,7,8,18,21,22,23,27,30,31,32,36,43,44,45,37,38,48,51,52,53,57,60,61,62,66,79,92,96],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/templates.py":[1,3,5,7,8,10,12,13,14,18,26,20,21,22,23,28,29,30,31,35],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/checks/urls.py":[1,3,5,8,17,30,53,71,96,106,98,99,100,101,103,35,38,39,40,57,59,60,62,63,64,65,67,68,66,41,42,43,44,50,10,11,12,13,21,22,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/color.py":[3,5,6,7,9,12,25,26,29,59,67,71,17,18,21,22,73,36,38,43,44,45,46,50,54,56],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/termcolors.py":[3,5,6,7,9,10,13,58,71,72,73,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,137,168,169,68],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/autoreload.py":[31,32,33,34,35,36,38,40,41,42,46,47,51,52,56,57,59,65,66,68,70,71,73,74,76,77,78,79,82,129,143,152,201,221,245,251,267,282,298,316],"/home/valberg/code/bornhack/bornhack-website/src/bornhack/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/bornhack/settings.py":[1,2,3,5,8,18,25,27,28,29,31,33,36,40,41,42,43,44,45,46,48,49,50,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,73,74,75,76,77,78,79,80,81,82,86,87,9,10,11,88,89,92,93,94,95,96,100,101,102,104,105,106,107,108,109,110,111,119,122,123,124,125,126,127,128,130,133,134,137,138,139,140,141,142,143,144,145,148,149,151,152,153,154,156,157,159,160,161,162,163,164,165,166,167,168,169,170,177,178,181,184,185,189,190,191,192,198,199,200,201,207],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/wrapt/__init__.py":[1,2,4,10,13,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/wrapt/wrappers.py":[1,2,3,4,5,6,8,9,11,12,16,20,31,35,39,43,50,59,63,64,74,18,70,72,76,78,90,94,98,102,106,110,114,117,120,121,124,130,133,134,137,140,143,146,149,152,155,158,161,164,189,198,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281,284,287,290,293,296,299,303,307,311,315,319,323,327,331,335,339,343,347,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396,399,402,405,408,411,414,417,420,423,427,431,433,436,438,452,460,463,466,476,532,566,568,624,626,628,719,720,721,729,769,772,784,786,792,796,799,802,814,826,829,834,865,878,880,882,927,830,832,831,773,730,734,736,737,739,740,767,774,775,770,776],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/wrapt/decorators.py":[4,6,8,9,11,12,14,15,16,33,34,35,36,38,39,43,52,54,58,62,66,70,74,78,80,84,89,93,97,109,113,115,120,123,125,127,134,138,142,146,150,154,155,158,159,162,165,174,418,511,425,432,434,196,200,225,398,201,215,216,442,444,448,451,246,282,288,289,297,298,338,392],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/wrapt/importer.py":[4,6,7,9,10,12,13,14,18,26,27,28,37,48,103,112,127,143,145,151,153,156,162,164,167,168,226],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/__init__.py":[1,3],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/generic/__init__.py":[1,2,6,7,10,13,14,15,16,20,21,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/generic/base.py":[1,2,4,5,9,10,11,13,16,20,21,23,30,34,36,38,48,80,90,97,104,108,109,110,111,112,113,115,131,144,147,148,153,154,155,156,157,158,160,178,192,195,198,201,204,207,51,61,69,70,73,77,78,52,56],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/http/__init__.py":[1,2,5,14,15,16,17,18,19,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/http/cookie.py":[1,4,7,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/http/request.py":[1,2,3,4,5,6,8,9,10,13,14,15,16,17,18,19,21,22,25,26,29,34,35,38,39,42,43,45,64,69,88,108,116,119,122,131,154,165,198,202,209,222,225,228,232,245,249,256,262,271,289,294,326,339,346,353,360,367,371,384,388,389,391,411,412,424,430,434,438,444,448,454,461,467,471,477,481,485,489,495,499,532,546,568],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/signing.py":[34,36,37,38,39,40,41,43,44,45,46,47,49,52,53,54,57,58,59,62,66,71,75,81,85,86,89,93,126,145,147,158,161,164,173,175,178,182],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/baseconv.py":[38,40,41,42,43,44,45,48,49,51,57,60,66,72,96,52,53,54,97,98,99,100,101],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/crypto.py":[3,4,5,6,7,9,10,13,14,15,23,49,72,77],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/encoding.py":[1,2,3,4,5,7,8,11,12,16,21,24,38,42,51,73,85,108,109,115,119,122,156,157,159,160,161,165,166,168,172,208,225,240,255,269,261,262,263,266,93,98,100,102,105,59,61,63,64,67,70,48],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/six.py":[1,23,24,25,26,27,29,30,34,35,36,38,39,40,41,42,43,45,73,78,84,86,89,101,103,112,115,122,124,128,134,137,139,157,162,169,171,175,179,182,187,193,207,216,222,224,172,173,227,229,230,234,140,87,141,142,144,145,146,149,150,235,236,237,238,147,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,104,105,106,107,108,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,301,306,307,308,309,176,177,310,312,314,125,126,315,318,320,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,348,349,350,352,354,355,358,360,364,365,366,368,369,370,372,374,375,378,380,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,422,424,425,428,430,434,435,436,437,439,440,441,443,445,446,449,451,455,457,458,459,461,463,464,467,469,470,471,180,472,473,474,475,477,480,481,484,489,500,501,502,504,505,506,507,518,519,523,526,527,533,534,537,539,542,559,560,75,563,564,565,566,567,568,571,572,575,578,581,584,586,588,608,609,610,611,612,613,616,617,620,622,623,624,625,626,627,628,629,630,631,632,633,637,638,660,661,664,668,672,676,677,90,113,80,81,91,92,95,98,679,704,710,711,713,719,720,774,784,786,795,798,810,826,847,848,849,850,854,855,860,864,866,871,872,873,183,185,834,841,184,214,188,189,194,196,197,198,199,200,203,204,205,158,159],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/__init__.py":[1,3],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/base.py":[1,2,4,5,8,9,11,19,22,25,28,31,48,65,75,102,105,108,117,121,124,125,130,133,136,140,143,148,153,158],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/utils.py":[1,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,30,37,44,51],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/uploadhandler.py":[3,5,7,8,11,14,15,16,20,23,24,27,30,31,39,46,49,50,53,57,58,61,64,65,67,75,93,107,114,123,131,134,135,142,145,151,154,156,165,171,178,195],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/uploadedfile.py":[3,5,6,8,9,10,13,16,23,25,32,35,38,52,55,58,59,64,68,78,81,82,86,90,94,99,102,103,107],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/temp.py":[17,19,20,22,24,27,72,74],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/http/multipartparser.py":[6,7,8,9,10,12,13,16,19,20,21,23,26,27,30,33,34,37,38,39,42,48,49,100,285,296,300,309,316,317,332,335,362,378,387,390,403,425,429,430,434,444,448,451,452,456,459,466,476,478,493,496,537,562,573,632,633,637,644,676],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/datastructures.py":[1,2,5,9,11,14,17,20,26,29,32,35,39,40,43,64,65,68,71,85,88,94,102,105,111,124,142,149,152,159,168,172,180,184,189,193,211,216,227,229,234,241,242,243,244,245,246,247,248,249,250,251,252,253,256,264,265,270,230,231,232,12,15,27,36,266,267,268,276,277,279,280,282,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/text.py":[1,2,3,4,5,7,10,11,14,21,22,23,24,25,28,59,62,63,66,81,105,125,137,149,222,236,237,260,266,280,287,288,291,294,301,304,309,324,332,335,354,373,376,381,402,403,418,425,433,422,17,409,410,413,414,415],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/safestring.py":[6,8,11,12,21,28,29,42,46,47,57,61,64,71,80,82,83,58],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/translation/__init__.py":[3,4,5,7,10,11,12,13,14,15,16,17,18,19,20,23,26,27,38,49,51,61,64,67,71,74,79,82,87,90,94,98,99,102,139,143,148,151,155,159,163,164,168,175,184,188,192,196,205,221,225,229,233,238,242,264,267,144,103,107,109,110,113,134,135,136,75,52,53,54,57,58,198,199,202,207,208,209,210,217,218,160,185,239,165,166,169,170,173,176,177,156,178,181],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/http.py":[1,2,3,4,5,6,7,8,9,15,16,17,18,19,22,29,31,32,33,34,35,36,37,38,39,40,42,43,45,48,49,57,58,66,75,84,113,132,146,182,194,207,221,229,241,255,266,285,308,327,356,386,438],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/http/response.py":[1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,21,24,25,28,34,36,38,64,72,76,87,91,102,104,108,135,140,143,146,150,152,155,159,204,209,213,224,245,254,257,260,266,269,272,275,279,284,286,288,293,300,304,306,310,325,328,331,334,337,340,345,352,354,356,362,369,373,377,383,386,390,393,394,396,401,413,451,452,454,461,463,472,473,476,477,480,481,483,487,494,495,498,499,502,503,506,507,509,513,522,523,526,527,530,531,534,546,548,549],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/serializers/__init__.py":[17,19,21,22,23,27,28,29,30,33,36,43,44,46,49,53,85,94,102,108,114,122,132,143,159,127,95,96,150,151,152,66,69,70,79,82,71,72,47,74,75,76,153,156,97,99,128,167,168,169,170,171,173,174,176,181,185,186,187,188,189,193,198,177,178,179,194,195,196,197,200,209,210,211,212,213,214,219,223,220,221,224,232,234,129],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/serializers/base.py":[3,4,6,9,10,11,14,15,16,19,20,22,31,32,33,38,39,41,46,61,64,68,69,70,72,73,118,124,130,136,142,148,154,160,169,172,174,184,187,192,202,204,208,215,229,247,268,77,79,80,81,82,83,42,43,44,85,86,87,88,91,95,99,100,101,102,103,104,108,112,113,47,48,114,106,107,115,116,165,166],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/__init__.py":[1,2,3,4,5,8,12,13,14,15,16,17,18,19,20,23,26,27,33,34,35,36,37,38,39,40,41,42,43,44,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/signals.py":[1,3,4,6,9,13,14,25,31,37,38,40,41,42,44,45,47,48,49,52,53,26,27,28,15,18,19,23,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/utils.py":[1,7,8,10,14,15,16,11,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/aggregates.py":[3,4,5,6,9,13,14,15,16,17,19,23,27,33,37,52,59,62,78,85,86,87,89,95,101,111,112,113,114,115,117,127,130,134,135,136,139,140,141,144,145,146,148,152,156,157,158,160,166,176,177,178,180,184,20,21,54,28,29,31,55,56,39,40,41,50,63,76,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/expressions.py":[1,2,3,5,6,7,8,9,10,13,17,18,28,32,35,36,37,38,39,42,47,48,49,50,52,68,71,74,77,80,83,86,89,94,97,100,103,108,111,114,117,120,123,126,129,134,140,142,145,146,148,150,152,156,161,168,171,174,181,209,213,217,221,245,249,253,262,274,294,298,315,318,321,329,332,340,344,347,350,353,363,377,387,388,389,392,394,400,403,406,409,412,442,450,451,463,479,480,482,485,492,493,494,496,498,505,508,511,514,517,520,524,530,531,537,540,544,545,550,554,555,556,557,558,559,561,575,583,587,590,593,600,621,628,629,630,642,645,663,668,672,673,680,681,687,690,693,696,700,701,704,708,709,711,714,718,720,722,728,732,736,739,742,749,753,754,758,761,764,767,772,775,778,782,787,788,790,795,799,803,805,809,812,815,818,822,823,825,836,839,842,845,848,852,860,873,881,892,893,894,896,904,907,910,913,917,925,930,958,962,963,965,970,975,980,1013,1021,1030,1039,1051,1052,1053,1055,1059,1062,1068,1074,1083,1084,1086,1096,1100,1103,1106,1123,1131,1139,1145,1152,1155,1159,1160,1164,1165,1166,1168,1195,1198,1201,1204,1236,1244,1247,1251,1258,1259,1261,1265,1268,1271,1280,1283,1286,1306,1310,1311,1313,1317,1318,1320,639,153,640,723,724,725,154,726,733,734,743,744,316,211,169,236,330,157,158,159,237,238,239,241,172,243,1087,1089,1090,1091,1092,1094,1104,1101,1107,1108,1110,1112,1113,1115,1116,1117,1119,1120,1121,745,746,682,683,684,685,691,562,571,572,176,178,503,573,588,594,622,623,624,625,595,596,597,509,598,601,602,603,604,605,606,607,608,612,615,616,617,618,619,256,288,268,269,289,290,292,257,260,164,305,306,307,309,310,165,166,737],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/fields/__init__.py":[1,2,3,4,5,6,7,8,9,11,12,13,14,18,19,20,21,22,23,24,27,28,29,30,31,32,33,36,37,38,39,40,41,42,43,47,48,51,52,57,60,79,85,89,90,91,95,96,101,102,103,105,106,107,108,112,115,116,119,121,122,123,124,125,128,132,134,135,136,137,138,139,140,181,192,200,211,243,293,305,323,330,349,377,386,391,399,488,496,502,508,511,522,530,550,561,569,577,593,624,635,638,650,676,684,691,704,707,712,716,720,727,750,757,760,765,768,772,778,788,792,796,800,811,835,842,851,853,856,892,897,898,900,902,905,909,915,927,933,936,948,951,954,960,967,972,976,977,979,982,986,987,989,990,992,994,997,1014,1020,1033,1034,1036,1040,1046,1067,1072,1075,1080,1084,1096,1097,1098,1101,1105,1108,1112,1114,1121,1140,1144,1145,1147,1149,1152,1155,1162,1202,1213,1216,1246,1254,1266,1270,1276,1280,1287,1288,1290,1292,1294,1298,1302,1345,1348,1396,1407,1426,1432,1436,1443,1444,1446,1448,1451,1455,1468,1492,1516,1527,1533,1537,1545,1548,1562,1565,1569,1578,1584,1585,1587,1590,1592,1595,1614,1621,1627,1631,1638,1639,1640,1642,1647,1653,1662,1663,1666,1672,1678,1689,1705,1711,1722,1726,1727,1729,1731,1733,1739,1742,1754,1761,1762,1764,1766,1768,1774,1786,1803,1809,1812,1824,1831,1832,1833,1834,1836,1839,1847,1848,1849,1852,1855,1856,1859,1863,1868,1874,1878,1879,1880,1881,1884,1893,1899,1911,1921,1924,1934,1939,1950,1958,1960,1961,1963,1965,1970,1976,1980,1982,1997,1998,2000,2003,2010,2011,2013,2016,2023,2024,2025,2027,2033,2045,2048,2056,2057,2059,2063,2064,2066,2069,2074,2078,2089,2090,2092,2094,2097,2100,2107,2150,2161,2164,2192,2200,2204,2210,2214,2221,2222,2223,2225,2229,2235,2244,2245,2246,2248,2254,2262,2265,2268,2276,2282,2286,2293,2295,2297,2298,2300,2304,2309,2312,2322,2334,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,157,158,159,160,161,162,165,169,170,172,174,175,176,177,178,179,1156,1157,1160,2101,2102,2105,1037,1038,575,734,721,722,761,758,762,763,723,724,725,735,736,739,740,744,745,746,504,505,906,907,166,167,968,969,970,1255,1256,1257,1258,1259,1261,1262,1263,747,748,718,1644,1645,514,525,526,527,528,515,519,520,498,499,516,517,518,2301,2302,1158,1159,2226,2227,2028,2029,2031,1966,1967,1968,1452,1453,1088,1090,1092,1093,858,859,860,861,794,867,887,888,890,973,889,1437,1438,1439,1281,1282,1283,1021,1025,1029,1030,862,866,798,802,803,805,1656,1657,1658,863,864,378,379,380,384,388,389,397,708,710,493,432,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,456,457,458,459,460,462,463,464,466,469,473,474,467,470,476,477,479,481,483,484,486,494,2034,2035,2036,2037,2040,2041,2043,1538,1539,1540,1541,1542,1543,1203,1204,1206,1208,1211,480,1207,1209,1210,1205,478,928,929,930,931,471,1648,1651,2305,2306,2307,2230,2231,2233,2232,1971,1972,1973,1974,697,670,636,671,672,2310,698,644,645,646,647,648,700,701,705,1346,714,1073,2046,2067,682,766,1214,790,1272,1273,1267,774,776,1268,1217,1218,1274,807,808,86,804,557,558,770,784,785,1081,1082,1076,1077,786,1397,1402,1247,1252,1428,1429,1408,1349,1351,1352,1409,1410,1424,1430,961,962,963,965,381,382,949,1810,955,958,956,957,894,840,2082,2083,2084,2085,1825,1826,1827,1570,1571,1572,1573,1574,809,911,202,216,224,232,241,203,244,245,204,294,303,205,306,321,206,324,325,326,327,207,331,332,347,208,350,363,375,912,916,925,1116,1117,1125,1126,1127,1138,1118,1307,1310,1311,1312,1313,1314,1320,1329,1042,333,1043,1047,1055,1056,1065,1770,247,250,248,260,261,262,266,267,268,269,272,274,275,279,282,1790,1791,2014,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1771,1775,1784,1308,2001,1456,1529,1530,1459,1469,1470,1471,1490,1460,1493,1494,1495,1514,1462,1463,1517,1525,1466,1167,1168,1837,2060,630,2323,2332,631,598,600,632,578,581,582,590,633,602,618,621,583,584,998,1000,1003,2313,2315,2318,2319,1398,1399,1400,1015,1016,1018,1813,1815,1816,2070,2071,1804,1805,1807,2075,2076,995,1806,1350,937,939,940,934,1977,952],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/__init__.py":[3,5,6,7,8,9,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/boundfield.py":[1,3,4,5,6,7,8,10,13,15,16,29,35,52,56,59,62,69,76,96,102,106,112,119,129,166,179,184,197,208,218,228,241,242,247,250,254,260,264],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/utils.py":[1,2,4,5,6,7,8,11,18,44,45,50,51,54,57,60,68,75,79,80,83,84,92,95,105,108,118,121,124,127,130,133,139,151,171],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/timezone.py":[3,5,6,7,8,10,12,15,16,17,18,19,20,26,29,36,38,44,47,50,55,58,70,81,86,89,94,99,109,124,134,145,146,149,156,165,185,205,218,232,245,258,274,222,224,255,276,279,281],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pytz/__init__.py":[9,11,12,13,15,16,17,18,19,20,21,25,26,27,29,32,33,34,35,36,37,41,45,47,78,111,120,123,183,188,189,192,197,198,200,201,202,204,209,212,215,218,221,227,235,238,242,245,275,278,285,288,319,320,324,343,346,351,352,366,371,373,375,381,384,387,390,393,396,402,411,477,480,486,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1084,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1529,210],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pytz/exceptions.py":[3,6,7,11,23,24,27,28,31,39,42,48],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pytz/lazy.py":[1,2,3,13,16,17,18,20,30,40,50,60,71,72,75,76,77,78,79,80,81,82,84,118,121,122,137,139,172,86,91,92,94,96,109,110,97,107,112,113,141,144,145,147,149,163,164,150,161,166,167],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pytz/tzinfo.py":[1,3,4,5,6,10,11,13,15,18,27,28,31,42,45,58,20,21,22,23,24,25,61,66,68,69,70,72,76,81,82,88,96,104,112,118,147,150,156,162,166,170,172,176,177,179,193,203,258,396,427,466,504,518,529],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pytz/tzfile.py":[4,6,7,9,10,13,17,15,20,25,126],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/html.py":[1,3,4,5,6,10,11,12,13,16,17,20,22,23,24,25,28,29,30,31,32,36,50,51,52,53,54,55,56,57,58,59,60,61,65,68,75,76,77,81,95,110,121,140,141,152,153,158,161,164,167,171,181,196,202,237,238,373,381,386,391,396,397,398,399],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/widgets.py":[3,5,6,7,8,9,11,12,13,14,15,16,17,18,19,21,30,33,36,37,40,42,54,57,60,63,71,82,92,98,133,143,169,172,173,182,183,184,185,186,188,191,197,201,205,215,227,232,237,241,248,251,263,174,176,177,144,166,179,267,270,271,272,274,280,286,287,288,291,292,293,296,297,298,301,302,303,306,307,308,310,314,320,321,322,325,329,330,332,351,358,362,363,364,365,367,371,375,379,382,383,384,385,386,388,395,401,407,414,428,442,445,452,453,455,463,464,465,467,471,475,476,477,480,481,482,485,486,487,491,495,496,497,499,505,511,518,530,536,537,538,539,540,541,542,543,545,552,559,567,572,606,627,632,641,650,659,660,661,662,663,664,665,667,673,679,693,696,697,705,711,723,724,726,733,739,740,741,742,745,746,747,748,749,751,756,761,771,780,781,783,787,791,822,827,830,836,844,853,855,860,865,868,869,870,872,885,892,895,896,898,904,910,911,912,913,914,915,916,917,918,920,952,988,1013,1029,1034,1055,546,189,550,275,276,277,278,192,193,194,195,500,503,311,312,199,468,469,457,458,460,784,785,856,857,858,459],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/templatetags/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/templatetags/static.py":[1,3,4,5,6,8,11,13,16,23,39,49,57,75,93,94,101,105,114,122,143,162],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/__init__.py":[40,44,45,47,49,55,56,57,60,65,68],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/engine.py":[1,3,4,5,7,8,9,10,13,15,16,17,22,55,56,81,87,90,96,100,108,122,132,139,150,166,23,24,25,26,27,28,29,31,37,39,40,42,43,44,45,46,47,48,49,50,51,91,92,93,94,52,53,88,74,75,76,30,32,77,78],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/base.py":[51,53,54,55,56,58,61,62,63,64,67,68,70,73,74,75,76,77,78,79,80,81,82,83,84,88,92,93,94,95,97,100,101,102,103,104,107,109,113,117,118,123,126,133,141,142,158,162,165,175,200,279,288,289,312,317,333,334,338,352,382,383,409,410,426,486,493,507,520,537,546,549,552,555,559,565,580,581,582,583,584,586,599,600,601,602,603,604,607,610,623,624,668,705,721,723,727,744,746,792,810,813,816,883,886,887,888,890,896,910,913,928,931,933,943,951,952,955,958,962,978,979,982,985,997,1000],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/context.py":[1,2,5,8,9,10,13,14,20,23,27,28,31,37,42,45,48,57,62,66,78,85,89,92,98,105,114,123,135,136,137,148,158,163,172,186,187,189,192,195,198,201,202,215,221,222,235,256,265],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/formats.py":[1,2,3,4,6,7,8,9,16,17,20,21,23,24,25,26,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,49,60,87,99,141,144,155,165,187,210,235],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/dateformat.py":[12,13,14,15,16,18,21,22,24,25,28,29,44,46,59,65,71,75,91,102,110,114,118,122,126,142,155,159,180,184,210,211,213,217,224,228,232,236,240,253,257,261,265,269,273,277,281,285,289,302,306,313,317,342,346,350,358,364],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/dates.py":[1,3,6,7,10,11,14,15,16,19,20,23,24,25,26,27,28,29,30,31,32,33,34,37,38,39,40,41,42,43,44,45,46,47,48],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/datetime_safe.py":[10,11,12,17,18,22,23,26,32,36,37,40,45,57,60,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/numberformat.py":[1,3,4,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/exceptions.py":[6,9,26,27,38,41,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/library.py":[1,2,3,5,6,8,9,12,13,16,22,23,27,50,54,96,100,136,164,169,170,176,184,186,190,201,203,207,237,312,24,25,28,31,32,34,51,52,37,39,38,40,42,43,62,64,66,65,97,98,67,76,78,79,80,81,83,86,87,88,89,68,73,75,74,70,316,317,323,324,108,127,129,109,110,112,124,125,130,132,145,161,146,147,149,159,160],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/utils.py":[1,2,3,5,6,7,8,9,12,13,16,17,25,64,86,89,93,22,23,90,87,27,28,30,31,32,33,36,44,45,46,47,48,51,52,54,55,56,62,65,66,67,68,69,78,79,80,81,83,84],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/renderers.py":[1,2,4,5,6,7,8,10,11,12,13,16,19,25,26,29,34,35,38,48,52,53,56,60,61,64,68,69],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/backends/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/backends/django.py":[1,2,4,5,6,7,8,9,11,14,16,18,29,32,38,48,50,54,58,66,79,87,114,19,20,21,22,23,24,25,43,94,95,96,97,98,100,101,102,107,108,119,120,121,128,129,109,103,105,111,44,45,26,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/backends/base.py":[1,4,5,6,9,14,28,34,44,57,68,20,21,22,23,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/_os.py":[1,2,3,5,6,9,12,17,25,53],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/loader.py":[1,2,5,22,52,65],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/backends/jinja2.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/fields.py":[3,5,6,7,8,9,10,11,12,13,15,16,18,19,20,21,28,29,30,31,32,41,45,46,47,48,52,54,56,57,58,118,121,124,128,142,152,165,173,192,199,207,208,220,230,241,242,244,246,248,260,277,287,289,292,308,315,322,324,327,332,350,357,370,372,377,387,391,392,393,395,398,411,415,416,417,419,422,433,437,438,439,441,444,449,464,468,470,471,474,479,496,497,505,508,517,520,521,522,524,528,529,531,532,533,534,535,536,537,538,541,546,567,586,591,595,596,598,599,604,647,654,655,657,659,661,664,696,697,699,711,715,723,727,728,730,746,750,751,754,758,759,761,764,768,773,776,787,789,795,805,820,821,826,842,847,848,849,851,852,855,862,875,889,890,895,914,918,925,928,929,938,949,965,967,968,971,986,991,994,1048,1059,1077,1078,1079,1122,1123,1124,1126,1127,1130,1145,1158,1159,1164,1173,1174,1176,1183,1185,1188,1193,765,82,83,84,85,86,87,88,89,94,95,99,102,171,103,106,108,109,110,111,112,114,116,766,780,783,785,91,209,210,211,212,213,231,232,235,238,214,216,218,234,104,217,373,374,525,237,215,662,249,250,253,278,279,280,282,284,255,257,972,973,974,975,976,977,979,984,542,543,544,328,329,358,359,360,363,366,367,330,648,649,650,651,316,317,318,319],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/validators.py":[1,2,3,4,6,7,8,9,10,13,16,28,30,31,32,33,34,36,52,62,73,74,75,78,79,82,84,88,93,95,98,101,18,25,102,103,105,110,152,153,154,155,37,38,39,40,41,42,43,45,47,50,159,163,165,166,167,168,170,171,173,174,175,177,178,179,181,189,210,224,233,182,184,186,235,236,237,239,240,243,244,245,246,247,251,258,263,274,275,276,280,295,303,304,296,297,298,300,308,310,311,313,318,324,332,335,339,340,341,342,344,348,349,350,351,353,357,358,359,360,361,362,363,365,368,372,373,374,375,376,377,378,380,383,387,392,394,395,396,397,398,400,401,402,403,405,406,407,408,412,416,457,465,467,468,471,473,482,494,503,513,517,519,520,521,523,529,533,106,107,314,315,524,526,413,414,319,384,320,321,381,57,20,21,23,24,58,59,336,354,345],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/deconstruct.py":[1,3,6,13,53,55,14,20,48,49,51,16,17,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/ipv6.py":[1,3,4,7,8,38],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/dateparse.py":[1,8,9,11,13,14,17,18,22,23,29,30,41,42,56,57,68,80,97,124],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/duration.py":[1,4,18,31,43],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/forms.py":[3,5,6,8,10,11,13,14,15,16,17,18,20,22,25,26,27,55,61,68,69,70,71,72,74,75,76,119,141,144,156,160,176,183,187,196,200,277,287,297,307,315,362,368,385,407,416,423,432,436,460,468,475,482,489,500,58,501,29,30,31,34,36,39,40,42,46,47,43,50,51,53,32,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/formsets.py":[1,2,3,4,5,6,7,8,9,11,14,15,16,17,18,19,22,25,28,33,34,45,49,50,51,63,66,70,74,77,84,103,122,131,139,148,176,181,186,198,207,225,263,267,277,284,289,293,311,353,362,366,377,380,390,399,407,412,418,419,420,438],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/forms/models.py":[4,6,7,9,12,13,14,15,16,19,20,26,29,32,70,95,106,193,194,206,207,278,279,280,281,282,308,349,353,381,411,422,443,466,469,470,208,209,210,214,216,218,219,473,474,475,476,556,559,560,563,566,571,577,582,591,625,644,648,652,657,671,673,676,745,755,765,768,794,808,852,853,854,855,856,857,881,882,884,906,911,934,938,955,982,987,1042,1043,1044,1045,1046,1047,1048,1086,1090,1091,1093,1096,1108,1123,1127,1128,1132,1142,1148,1151,1155,1156,1160,1163,1165,1166,1167,1184,1194,1201,1204,1208,1212,1220,1235,1237,1245,1255,1258,1266,1267,1268,1269,1271,1272,1274,1277,1280,1285,1299,1336,1344,1358,221,195,196,197,198,199,200,201,202,203,226,227,228,237,239,246,251,252,253,254,256,137,138,139,141,142,143,144,152,153,154,157,158,160,162,164,166,168,169,171,172,178,179,181,184,185,186,187,188,190,260,261,262,269,273,275,249,183,1278,1169,1172,1176,1177,1178,1180,1205,1206,1223,1233,1129,1130,1202,1181,1182,145,271,996,997,998,1015,1016,1017,1018,1021,1022,1039],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/constants.py":[3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/query_utils.py":[7,8,9,10,11,13,14,19,22,23,24,27,33,37,38,40,43,47,51,53,54,55,56,58,63,80,83,86,92,99,116,120,121,124,142,156,158,162,163,168,177,186,197,202,203,212,213,223,259,272,300,301,303,59,60,61,313,321,327,334,204,205,206,207,208,209,199,28,200,29,30,210,122,129,130,169,170,160,165,166,192,193,194,195,171,173,175,279,295,281,87,88,89,90],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/tree.py":[4,6,8,11,16,19,21,29,30,43,47,50,56,60,64,68,75,78,122,23,24,25,39,40,41,93,95,98,100,113,114,62,101,108,109,70,124],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/hashable.py":[1,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/deletion.py":[1,2,4,5,8,9,14,21,31,42,46,50,54,63,64,80,107,119,154,167,228,236,241,260],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/transaction.py":[1,3,8,9,10,13,23,28,33,38,43,52,60,68,75,80,95,107,134,136,140,176,265,275,283,268,272,137,138,141,18,20,143,145,146,147,162,173,174,177,179,183,185,186,191,192,211,212,252,253,256,167,171,180,194,258,168,169,92,224,225,228,231,232,235,243,244],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/sql/__init__.py":[1,2,3,4,5,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/sql/query.py":[8,9,10,11,12,13,15,18,19,20,21,22,23,24,25,28,31,34,37,38,39,41,44,51,59,60,61,65,66,68,80,83,86,93,105,108,112,115,133,134,136,137,139,141,230,236,242,246,251,262,269,275,278,285,293,339,354,359,403,492,503,506,518,526,627,713,738,742,746,780,799,808,844,890,902,910,952,985,992,1005,1008,1019,1037,1048,1068,1114,1130,1248,1251,1269,1295,1317,1330,1427,1528,1556,1583,1650,1653,1656,1679,1683,1686,1694,1702,1711,1715,1722,1760,1785,1795,1811,1827,1860,1864,1884,1908,1927,1931,1939,1943,1954,1989,2008,2023,2093,2112,2126,2137,2145,2149,2151,2166,2173,142,143,149,153,154,155,156,157,158,159,160,168,169,170,177,178,179,180,181,182,183,184,185,187,189,193,199,200,201,204,205,206,212,213,214,216,217,222,224,226,227,228,344,298,299,301,303,304,305,306,307,308,309,310,318,319,320,321,324,325,328,330,331,333,334,335,336,337,345,347,348,349,350,352,1955,1956,1862,1957,1708,1709,1959,1964,1965,1966,1967,1968,1971,1981,1948,1951,1952,1982,1933,1936,1937,1986,1987,1727,895,899,291,926,933,936,941,721,722,728,733,734,735,736,942,948,949,950,900,1728,1730,1731,1732,1735,1458,1464,1469,1470,1471,1472,1473,1345,1346,1347,1348,1351,1352,1353,1354,1361,1365,1372,1373,1394,1400,1417,1418,1419,1423,1424,1485,1486,1487,1502,1526,1736,1737,1738,1739,1541,1542,1554,1741,1742,1465,1743,1744,1712,1713,279,281,282,283,2010,2012,2013,1995,1997,1998,804,805,806,744,1692,1262,1263,1271,1272,1273,1274,1275,1276,2152,2153,2154,2160,2161,2164,1277,1278,1284,1285,1286,1287,1159,1161,1162,1164,1023,1024,1028,1029,1030,1035,1166,1172,1175,1176,1009,1011,1017,1177,1179,1180,1185,1186,1187,1189,1190,1191,1192,1196,1198,1050,1202,1208,1209,1210,1211,1213,1223,1225,1078,1079,1083,1084,1085,1096,1099,1108,1112,1226,1227,1229,1230,1246,1289,2171,1290,1291,896,248,249,897,740,1292,2180,2181,2184,2195,2207,2209,2225,757,758,2226,790,791,792,793,2227,1293,1264,1265,1266,1790,1791,1792,1769,1770,1778,1780,1783,641,642,643,961,962,1401,1402,1408,1409,1410,1411,1412,1413,1414,1355,1356,1358,1381,1382,1390,1503,1507,1508,1509,1510,1511,2107,2109,1514,1515,1516,1518,1519,1520,1521,934,943,946,947,1523,1524,1056,1062,1064,1065,1066,1042,1043,1543,1545,1547,1548,1549,1551,1552,1553,1215,1216,1218,1219,937,938,2120,2121,2123,238,239,240,1550,507,508,509,512,1696,1697,1698,1699,1700,513,1793,514,1665,1666,1669,1670,1676,515,516,1832,1837,1838,1841,1842,1843,1844,1845,1846,1850,1852,232,233,234,1853,1855,1857,2014,2015,2016,2017,2019,2011,1771,1773,1781,1063,987,988,1557,1559,1569,1570,1571,1572,1577,1578,1580,1581,989,1940,990,407,1999,2006,409,410,411,412,413,426,427,473,474,475,476,478,479,1681,480,481,482,483,484,487,488,490,1349,1010,993,312,323,995,851,869,873,874,860,861,862,875,876,877,882,883,884,885,886,887,888,814,818,819,821,822,827,828,830,831,832,833,834,836,837,838,839,840,841,842,996,999,1000,1001,1002,1003,276,244,1006,2155,2156,1231,1232,1233,1234,346,351,908],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/fields/related_lookups.py":[1,7,8,10,14,18,22,26,46,47,62,102,103,119,133,134,137,138,141,142,145,146,149,150,153,154,48,50,27,28,29,30,31,32,34,35,40,55,58,59,60,63,87,99,104,106,111,114,115,117,120,130,41,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/lookups.py":[1,2,3,5,6,7,8,9,10,13,14,15,16,18,33,38,55,60,66,73,76,82,97,100,107,113,116,120,124,129,133,134,135,137,141,151,152,161,168,172,176,177,179,191,195,196,198,214,222,230,244,245,246,248,263,264,265,266,268,275,276,277,280,281,282,285,286,287,290,291,292,295,299,300,306,307,308,311,312,313,316,317,318,320,348,351,357,380,381,382,384,400,407,408,409,412,413,414,417,418,419,420,423,424,425,428,429,430,431,434,435,436,439,440,441,443,447,448,449,450,452,460,461,462,463,465,475,476,477,480,481,490,491,501,504,510,511,513,531,532,534,538,539,541,545,546,548,552,553,555,19,20,67,69,70,21,24,25,31,118,162,153,77,78,79,80,154,155,156,157,158,159,163,249,250,260,83,84,91,95,181,182,184,186,187,164,165,169,166,98,199,200,204,205,209,210,211,212,352,353,355,321,322,328,329,330,334,339,231,39,41,51,185,52,53,236,237,238,223,224,226,228,240,241,340,341,349,335,101,102,103,105,203,343,346,215,220,92,93],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/sql/constants.py":[3,5,9,14,15,16,17,19,21,22,26,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/sql/datastructures.py":[4,6,7,10,15,16,22,23,26,42,44,61,106,119,128,131,136,142,148,149,150,151,153,157,162,165,154,155,158,159,160,46,47,49,51,54,56,58,59,129,121,122,123,124,125,67,68,69,70,73,74,75,76,77,78,83,84,85,89,94,101,102,103,104,163,107,108,109,113,114,115,116],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/sql/where.py":[3,5,6,7,10,11,14,27,28,29,30,32,65,117,123,126,130,142,157,162,168,172,178,182,186,192,193,194,196,200,202,204,208,213,216,218,224,148,149,150,155,38,170,164,165,39,72,73,74,75,79,105,106,107,115,151,154,166,80,81,85,86,87,95,100,108,113,114,82,83,96,99,135,136,139,140,152,112],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/sql/subqueries.py":[3,5,6,7,8,11,13,16,17,19,21,27,44,79,80,82,84,88,97,102,109,131,143,151,169,170,172,177,183,187,189,191,173,174,175,178,179,180,93,94,95,137,138,141,157,158],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/fields/files.py":[1,2,4,5,6,7,8,9,10,11,14,15,22,29,36,40,46,49,52,54,59,64,71,79,85,94,96,113,115,120,125,133,146,147,150,208,212,216,219,221,223,232,239,251,265,274,277,284,291,295,309,319,327,331,332,349,350,357,358,359,360,362,366,372,388,396,405,462,224,226,227,229,230,292,293,148,363,364,397,402,403,389,266,267,268,269,270,272,390,392,394,463,464,465,320,321,322,323,234,235,240,249,236,252,263,368,369,373,374,386],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/images.py":[5,6,7,9,12,16,17,21,25,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/storage.py":[1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,19,22,26,31,35,53,60,91,100,111,117,124,131,137,144,151,158,166,167,170,173,180,192,195,199,203,209,213,217,220,293,307,310,320,323,326,334,345,348,351,355,359,360,364,174,175,176,177,178,201,197,193],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/locks.py":[18,19,21,24,29,89,90,91,92,93,107,111],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/files/move.py":[6,8,9,10,12,14,17,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/fields/proxy.py":[4,6,9,13,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/indexes.py":[1,3,4,6,9,10,13,15,35,47,55,62,70,75,86,114,117],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/utils.py":[1,2,3,4,5,6,8,9,10,11,13,16,17,21,23,30,34,37,49,67,70,73,79,87,93,97,114,139,143,154,190,196,210,227,249,218,203,204,205,206,207,220,221,255,256,18,19,35,68,74,75,77,80,81,82,85,24,25,26,41,42,28,83],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/manager.py":[1,2,3,5,6,9,11,14,18,20,26,34,38,75,78,100,101,109,117,125,131,139,146,155,161,165,102,103,104,105,106,80,87,88,90,93,94,95,91,97,81,83,84,85,98,166,169,171,174,195,196,200,22,23,24,27,28,122,123,29,30,31,32,110,111,113,172,115,197,198,82,144,175,178,183,192,45,46,56,57,59,60,68,69,70,71,72,126,127,128,129,133,153,76],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/query.py":[3,5,6,7,8,9,10,12,13,14,18,19,20,21,22,23,24,25,26,27,28,29,32,35,38,39,45,46,48,88,91,93,110,114,116,141,145,147,148,154,167,171,173,180,181,183,197,203,204,210,220,225,243,249,253,271,275,305,316,331,334,344,372,385,406,416,421,475,490,514,532,562,597,600,603,608,613,641,669,670,672,678,680,696,698,713,714,716,721,726,733,740,748,754,785,801,822,832,839,846,853,865,882,893,900,909,915,930,952,974,1020,1029,1040,1048,1056,1072,1092,1102,1115,1126,1137,1138,1140,1158,1170,1184,1190,1204,1215,1222,1230,1232,1239,1247,1259,1260,1264,1268,1270,1274,1278,1280,1292,1302,1311,1315,1324,1330,1334,1338,1342,1375,1378,1381,1386,1395,1413,1424,1425,1438,1448,1452,1455,1461,1466,1469,1473,1485,1611,1658,1758,1772,1773,1819,1835,199,200,201,202,184,185,186,187,188,189,190,191,192,193,194,195,1094,1163,1175,1176,1177,1178,1179,1180,1181,1182,1164,1167,1168,1095,1096,837,755,757,760,761,762,763,764,765,775,777,741,742,744,745,746,779,780,781,783,268,1185,1186,40,41,42,117,118,119,1118,1120,121,122,123,124,127,129,130,138,1187,269,411,412,413,1119,1131,1132,1134,1135,1136,414,390,844,854,855,858,859,862,863,391,392,1022,1024,1025,1026,1027,393,250,49,50,51,54,55,56,57,58,59,60,61,62,1836,1837,1838,1841,63,64,65,67,72,85,251,394,395,441,446,449,450,717,718,396,397,398,399,481,538,539,540,541,542,543,544,545,546,547,548,549,554,560,484,485,486,487,488,519,520,521,522,523,451,452,453,454,455,417,418,419,456,457,458,463,464,465,1144,1145,1146,1147,1148,1149,1150,1151,1156,466,467,468,469,470,471,473,339,341,342,332,875,880,352,354,1249,1250,355,359,360,363,365,366,367,368,370,1223,1227,1228,1229,272,273,851,860,705,707,708,710,711,712],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/functions/__init__.py":[1,2,8,12,19,21,22,23,24,25,27,28,29,31,32],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/functions/comparison.py":[1,2,5,6,7,8,10,13,17,22,29,30,31,33,38,54,61,62,64,69,74,81,82,84,89],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/functions/datetime.py":[1,3,4,8,11,14,15,17,31,32,33,35,43,63,79,80,83,84,87,88,91,95,96,99,104,105,108,109,112,113,116,117,120,121,124,125,126,127,128,129,131,132,133,135,136,137,139,140,141,142,143,146,147,148,150,157,158,159,161,165,180,209,227,229,234,235,238,239,242,243,246,247,248,251,252,255,256,257,258,260,268,269,270,271,273,281,282,285,286,289,290,293,294],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/functions/text.py":[1,2,5,13,14,21,22,23,25,30,33,37,41,42,44,50,56,66,71,72,73,75,81,90,91,92,94,104,107,110,111,114,115,116,117,118,120,124,125,126,129,130,132,138,139,140,143,144,145,146,148,151,155,156,158,163,169,170,172,176,177,179,183,184,187,188,189,192,197,198,199,200,202,206,207,209,223,226,230,231,232,235,236,237],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/functions/window.py":[1,4,5,9,10,11,12,13,16,17,18,19,20,23,24,25,26,27,30,31,33,49,54,55,56,59,60,61,62,63,66,67,68,71,72,73,74,76,83,88,89,90,91,92,94,100,101,102,103,104,107,108,109,110,111,114,115,116,117,118],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/base.py":[1,2,3,4,5,7,8,9,10,14,18,19,20,23,24,25,26,29,30,31,32,33,36,37,40,44,47,61,62,63,302,309,355,359,364,365,372,373,374,379,380,383,385,489,502,505,508,518,523,529,533,551,555,558,560,569,623,641,719,722,761,763,785,836,863,871,882,884,888,904,919,924,933,949,997,1042,1071,1088,1118,1154,1179,1209,1236,1249,1257,1267,1298,1315,1372,1397,1421,1441,1455,1482,1509,1515,1563,1630,64,68,69,70,1710,1722,1729,1746,1756,73,74,75,76,78,79,80,81,82,84,87,89,90,99,101,304,305,102,103,104,105,106,107,108,109,110,111,55,56,57,307,112,113,114,115,116,117,118,119,120,121,130,134,138,139,142,143,144,145,147,150,170,173,174,176,177,179,182,183,188,190,191,194,195,288,290,298,311,312,314,329,330,332,333,336,349,353,299,300,77,294,295,296,337,342,343,344,197,198,248,251,252,253,254,255,256,259,265,269,184,185,361,387,388,389,390,392,395,401,405,417,418,427,428,430,432,433,450,451,452,457,461,469,470,459,472,486,487,653,656,677,678,681,564,565,566,682,708,717,718,732,733,734,735,737,739,740,741,742,743,745,746,747,765,766,748,790,791,793,797,552,553,798,799,800,801,802,804,806,817,818,826,827,828,830,831,357,868,869,832,833,834,750,752,755,756,757,758,491,497,406,411,412,414,498,499,500,519,521,434,436,437,447,466,467,366,368,369,556,1181,1212,1213,1234,1238,1239,1247,1252,1253,1254,1255,1182,1183,1184,1260,1261,1262,1263,1265,1185,1272,1273,1275,1278,1281,1283,1296,1186,1636,1637,1638,1641,1643,1645,1646,1647,1650,1651,1652,1657,1660,1661,1665,1677,1701,1189,1301,1303,1313,1190,1318,1319,1322,1344,1349,1350,1355,1356,1367,1368,1370,1191,1399,1400,1401,1410,1419,1192,1423,1424,1426,1429,1427,1430,1439,1193,1443,1444,1453,1195,1198,1199,1375,1376,1378,1379,1382,1393,1395,1200,1201,1458,1467,1477,1478,1480,1202,1485,1494,1504,1505,1507,1203,1512,1513,1517,1521,1522,1525,1526,1561,1204,1569,1578,1581,1590,1591,1594,1597,1601,1605,1608,1612,1613,1614,1615,1618,1620,1628,1207,1506,1527,1528,1540,1551,1264,1284,1285,1295,1679,1684,1685,1686,1579,1159,1160,1162,1163,1164,1168,1169,1171,1172,1170,1176,931,938,957,958,959,961,962,966,967,973,978,979,982,983,984,985,987,988,989,991,993,995,940,998,1000,1004,1005,1006,1007,1009,1010,1013,1016,1019,1022,1030,1031,1033,1040,941,1043,1044,1069,943,946,438,439,441,442,443,657,664,674,968,970,1020,1032,1015,807,808,809,810,811,812,841,842,849,861,813,815],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/fields/related.py":[1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20,25,29,33,36,61,82,83,86,87,88,89,91,97,107,126,155,170,189,283,288,319,329,342,361,376,385,389,400,420,427,439,443,446,449,450,451,452,454,455,456,457,461,479,486,508,564,600,616,622,626,630,634,637,640,658,662,666,669,684,698,712,726,727,734,738,750,751,752,753,754,755,756,759,766,769,770,771,772,774,776,778,780,784,815,822,845,855,873,876,880,894,916,919,924,931,939,942,947,959,962,965,968,973,979,983,989,992,993,994,995,997,998,999,1001,1003,1007,1013,1018,1024,1029,1076,1084,1087,1088,1089,1090,1092,1094,1099,1134,1143,1154,1187,1386,1418,1461,1487,1490,1493,1506,1524,1554,1591,1609,1612,1615,1618,1633,1636,1641,785,786,787,788,801,802,803,804,805,806,807,809,811,463,473,475,476,477,813,799,735,290,920,917,921,922,292,294,295,298,299,307,314,317,76,50,54,55,58,77,78,79,736,315,316,386,378,381,383,387,943,741,742,746,944,1100,1101,1109,1110,1112,1117,1118,1119,1120,1121,1122,1123,1124,1125,1127,1129,1131,1132,1561,1564,1571,1577,1578,1582,1583,1030,1032,1035,1036,1037,56,1039,1040,1041,1045,1046,1498,1500,1503,1504,1047,1048,1049,1050,1051,1052,1053,1056,1057,1058,1059,1060,1061,1062,1063,1064,1066,1067,1068,1069,1070,1071,296,300,301,302,303,305,1586,1589,1610,1594,1595,1598,1599,1601,1602,1604,1605,1606,1607,1033,308,309,310,312,1004,1005,1102,1103,1113,1579,1581,1580,1620,1621,1622,1626,1631,408,409,413,414,415,417,418,94,95,856,565,320,321,323,325,327,566,567,568,570,573,574,582,367,369,370,373,583,598,857,858,860,861,864,867,868,871,869,870,1419,1421,1423,1426,1427,1433,1443,1444,1459,324,326,585,593,594,595,596,1008,1009,1010,1011,1434,1435,1446,1454,1455,1456,1457,966,963,878,632,618,619,601,603,605,606,607,608,609,611,613,614,620,960,932,935,700,701,702,703,704,705,612,706,707,708,709,425,663,664,980,729,730,731,732,696,940,974,975,977,440,937,948,952,953,954,955,956,817,481,99,100,108,109,110,111,101,127,129,130,131,142,153,102,156,157,158,159,168,103,171,187,104,191,193,194,198,213,217,218,219,220,225,226,227,228,239,253,254,255,256,257,258,269,281,482,488,491,492,493,506,483,509,510,513,514,518,521,523,524,526,528,530,531,533,550,562,818,823,824,833,843,819,853,494,495,1136,1137,1144,1152,1138,1188,1189,1190,1194,1196,1208,1214,1215,1216,1219,1220,1221,1224,1235,1257,1258,1259,1261,1262,1263,1266,1283,1300,1313,1384,1139,1155,1157,1166,1174,1185,1140,1387,1389,1391,1392,1394,1499,1395,1398,1416,112,113,124,1026,926,927,929,874,895,897,898,901,902,903,905,396,398,906],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/fields/mixins.py":[1,4,5,7,10,19,22,25,23,11,12,13,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py":[64,66,67,68,69,72,83,85,88,104,107,110,141,146,193,259,268,278,280,299,316,327,329,334,349,352,355,373,420,479,484,498,500,504,513,528,534,541,731,746,748,753,760,770,777,86,501,502,749,751,523,524,332,758,204,213,214,215,216,218,221,226,246,247,251,256,156,157,162,163,186,191,300,257,303],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/fields/reverse_related.py":[10,12,13,15,16,19,25,28,29,30,31,35,38,54,58,62,66,77,84,88,92,96,100,103,106,110,117,129,133,136,139,149,166,169,177,190,193,205,210,219,223,229,232,245,251,255,274,194,195,196,197,198,199,200,39,40,41,42,43,44,45,47,48,203,220,131,79,82,156,157,158,160,162,164,256,257,258,259,260,263,265,267,269,271,272,163,233,234,235,236,237,238,239,242,206,207,208,60,56,174],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/options.py":[1,2,3,4,6,7,8,9,10,11,12,13,14,15,16,17,19,21,24,37,41,63,67,69,70,71,73,75,77,133,137,141,146,150,205,245,249,279,284,293,296,299,315,321,346,366,370,398,422,456,469,482,496,513,528,543,568,585,596,616,646,668,704,708,721,736,819,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,115,119,120,121,122,126,129,131,151,152,154,155,157,158,159,163,166,167,168,172,173,174,175,176,177,178,182,47,48,50,52,53,56,183,49,187,191,194,198,201,254,256,259,260,280,270,277,711,712,713,715,719,246,247,716,717,206,222,224,225,242,243,281,282,439,442,445,450,451,452,748,756,757,758,759,762,764,767,768,769,771,774,775,789,800,801,802,808,809,813,64,816,817,453,440,443,447,139,348,349,350,351,352,353,356,357,358,359,361,362,363,271,272,273,274,275,330,344,188,202,203,257,54,714,179,180,331,332,333,334,342,354,547,550,515,516,517,518,522,523,526,197,255,465,466,491,492,493,400,401,408,419,420,51,57,60,368,135,304,306,307,308,310,313,731,733,793,706,675,677,678,679,682,685,688,686,689,690,692,698,699,702,794,718,797,798,478,479,372,373,375,376,381,392,393,394,395,396,318,319,551,554,561,564,530,531,532,533,537,538,539,540,541,565,566,590,591,594,822,823,824,825,826,827,297,305,524,525,403,404,405,406,507,508,509,510,144,377,379],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/serializers/json.py":[3,5,6,7,8,10,11,14,15,16,19,20,21,23,33,37,44,56,61,76,80,81,34,24,25,26,27,28,31,35,46,47,51,53,54,48,49,50,83,84,85,86,87,88,89,38,40,41,58],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/serializers/python.py":[5,6,8,9,10,11,14,17,19,21,25,28,31,35,42,49,52,63,75,79,143,29,50,43,47,36,37,38,39,40,53,60,61],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/response.py":[1,3,6,7,10,11,14,45,60,69,72,86,97,113,117,124,132,139,140,143],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/urls/__init__.py":[1,6,7,8,9,13,16,17,18,19,20,21,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/urls/base.py":[1,2,4,5,6,8,9,10,15,18,21,27,93,96,102,111,120,130,142,150,163,106,108],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/urls/exceptions.py":[1,4,5,8,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/urls/resolvers.py":[7,8,9,10,11,12,14,15,16,17,18,19,20,21,22,24,25,26,29,30,53,56,63,64,70,81,82,85,104,105,114,137,138,83,140,147,158,165,177,186,190,191,195,235,236,238,245,259,271,274,278,279,283,288,296,302,305,308,312,313,319,322,327,341,349,363,364,383,394,400,459,466,473,480,485,523,530,545,554,557,65,66,67,141,142,143,144,145,365,369,370,371,372,373,374,375,376,379,380,381,533,525,526,314,315,316,317,239,240,241,242,243,202,203,204,205,206,207,208,209,230,232,231,210,211,212,213,218,219,222,223,228,229,221,534,535,543,528,395,396,397,323,331,339,324,159,160,118,89,94,95,96,179,180,97,119,123,134,161,163,325,398,162,166,167,175,260,272,261,262,269],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/regex_helper.py":[7,12,13,14,15,16,17,18,19,20,21,25,26,29,30,33,34,37,189,210,231,268,282],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/urls/converters.py":[1,3,6,7,9,12,16,17,19,22,26,27,29,32,36,37,40,41,45,46,47,48,49,53,56,61,66,67,63],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/lru_cache.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/urls/utils.py":[1,2,4,5,8,55],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/urls/conf.py":[1,2,3,5,7,12,57,76,77,13,14,31,33,34,58,69,70,71,35,36,37,44,47,48,49,50,54,60,61,62,63,64,65,66,67],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/decorators.py":[1,4,5,8,9,15,24,55,91,107,117,126,167,168,171,174,113,127,164,128,130,163,63,83,84,86,87,88,64,65,29,35,37,48,49,18,131,162,21,51,52,169,10,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/generic/dates.py":[1,3,4,5,6,7,8,9,10,11,14,19,20,21,22,24,31,44,48,52,63,68,69,70,71,73,80,93,97,101,115,120,121,122,123,125,132,145,149,153,161,166,167,168,169,171,178,191,195,199,210,214,229,230,231,232,234,240,250,260,273,293,294,295,296,298,307,311,318,344,351,375,378,379,381,392,393,394,397,398,399,400,402,430,438,439,440,443,444,445,447,473,474,475,478,479,481,512,513,514,517,518,519,531,548,549,550,553,554,556,561,562,563,566,570,571,601,605,606,609,625,715],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/generic/detail.py":[1,2,3,4,5,8,11,12,13,14,15,16,17,18,20,58,78,82,91,103,104,105,111,112,113,115,164,170],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/generic/list.py":[1,2,3,4,5,6,9,10,11,12,13,14,15,16,17,18,19,21,50,54,77,84,90,97,104,113,139,140,141,161,162,163,165,194,198],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/paginator.py":[1,2,3,5,6,9,10,13,14,17,18,21,22,25,28,35,52,65,74,83,94,102,110,129,132,134,139,142,145,154,157,160,163,166,169,179],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/generic/edit.py":[1,2,3,4,5,10,11,12,13,14,15,17,21,25,29,35,49,55,59,63,70,71,72,74,103,110,123,129,130,131,135,148,152,153,156,157,160,165,166,170,175,178,179,182,187,188,192,197,198,199,202,203,204,206,217,220,228,233,236,240,241],"/home/valberg/code/bornhack/bornhack-website/src/bornhack/environment_settings.py":[1,4,5,7,8,9,10,11,12,15,16,17,19,20,21,25,26,27,29,30,32,33,34,36,37,38,39,40,41,43,44,45,47,48,50,51,52,53,54,56,58,60,63,64,68],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/log.py":[1,2,3,5,6,7,8,9,10,12,19,20,23,26,30,31,32,33,38,39,40,43,44,45,48,49,50,55,56,59,60,61,67,79,84,86,91,124,127,130,137,142,143,146,152,153,157,158,162,163,167,195,199,68,70,72,164,165,87,88,89,75,76],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/mail/__init__.py":[3,4,9,14,15,18,19,20,21,22,26,40,64,90,105],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/mail/message.py":[1,2,5,6,7,8,9,10,11,12,13,14,15,17,18,19,23,24,25,26,30,32,35,36,41,42,43,44,45,46,47,48,49,50,51,55,74,98,126,127,140,154,156,162,164,168,172,184,186,190,195,196,197,198,199,203,245,251,278,285,293,325,341,344,358,388,402,415,420,421,425,436,442,445],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/mail/utils.py":[3,5,10,11,14,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/debug.py":[1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,22,23,24,27,29,31,34,40,41,44,48,72,84,98,104,109,113,115,121,125,129,131,140,154,179,193,244,245,246,258,329,336,343,388,456,512],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/defaultfilters.py":[1,2,3,4,5,6,7,8,9,11,12,13,14,18,19,22,23,25,26,28,35,60,61,40,51,53,71,72,78,79,85,94,95,166,167,173,174,175,190,191,197,198,209,210,220,239,240,247,248,258,259,272,273,286,287,300,301,307,308,309,324,325,326,331,332,333,343,344,350,351,357,358,364,365,371,372,378,379,393,394,400,401,411,412,413,423,424,425,437,438,444,454,455,465,491,503,515,524,525,536,545,554,563,569,587,588,658,670,695,696,709,710,723,724,736,737,751,757,765,771,772,808,851,852,895,901],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/timesince.py":[1,2,4,5,6,9,10,11,12,13,14,23,27,87],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/templatetags/i18n.py":[1,2,3,4,5,6,8,11,12,15,20,21,25,31,32,36,44,50,51,54,59,60,63,68,70,79,98,101,111,125,181,182,186,192,213,234,259,264,270,275,280,299,319,412,534],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/defaulttags.py":[1,2,3,4,5,6,7,9,10,11,12,13,15,22,23,24,26,29,30,31,34,45,46,50,51,70,71,76,88,95,96,104,105,108,115,116,120,133,134,136,145,155,219,220,222,226,249,262,263,265,270,273,281,283,286,289,293,297,314,315,318,332,335,336,340,346,362,363,367,368,372,383,384,387,392,393,396,401,402,403,404,405,406,407,408,409,412,415,419,420,426,456,457,460,464,465,471,497,498,506,509,515,532,541,629,634,649,679,728,820,837,857,866,867,871,874,878,879,881,885,889,976,1018,1029,1051,1082,1129,1152,1221,1247,1278,1313,1380,1403,1441],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/lorem_ipsum.py":[3,5,8,46,52,56,71,80,97],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/smartif.py":[3,11,15,16,17,18,20,26,32,38,43,68,94,48,49,51,56,65,95,96,73,74,76,81,87,97,98,99,100,101,102,103,104,105,106,110,111,114,117,121,122,124,127,130,133,136,140,141,143,147,150,151,153,173,181,189,197,207],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/template/loader_tags.py":[1,2,4,6,9,11,13,16,17,21,25,31,34,41,42,45,48,67,80,81,82,84,90,93,109,126,153,154,156,162,191,220,250,272],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/__init__.py":[3,4,9,10,13,14,17,18,19,20,21,25,29,26],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/decorators.py":[1,12,13,15,30,16,19,21,24,27,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/filters.py":[7,8,10,11,14,15,16,17,20,21,22,24,34,40,48,54,62,64,66,81,84,92,101,104,118,119,120,122,132,135,143,144,155,162,163,178,186,193,196,199,219,145,153,222,223,233,236,254,257,258,265,268,292,295,296,346,352,361,362,368,369,384,387,412,415,416],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/options.py":[1,2,3,4,5,6,7,9,10,11,12,13,16,17,18,23,24,27,28,31,32,33,34,35,36,40,41,42,43,44,45,46,47,48,49,50,51,52,53,55,56,59,62,69,73,74,81,82,83,85,86,87,88,89,90,91,92,93,94,97,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,121,124,132,189,207,220,243,277,284,297,306,312,322,330,336,342,348,360,364,418,463,472,487,502,521,524,538,539,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,558,559,560,561,562,563,564,567,568,569,570,571,572,574,580,583,599,624,628,643,656,659,710,717,745,760,773,787,794,797,813,829,845,850,852,870,886,902,913,943,950,962,969,976,983,1031,1049,1055,1056,1080,1087,1093,1099,1103,1109,1121,1168,1245,1320,1333,1340,1347,1414,1455,1476,1494,1509,1522,1523,1527,1633,1636,1639,1642,1647,1663,1664,1818,1825,1826,1830,1888,1927,1973,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1995,2006,2017,2022,2026,2030,2034,2121,2124,2130,2140,2149,2158,2174,2175,2178,2179,575,576,577,578,127,128,130,626,600,602,608,611,603,605,606,612,613,614,615,616,618,619,622,122,854,857,858,859,863,864,865,868,920,927,928,937,940,941,1996,1997,1998,1999,2000,2001,2002,2003,2004,921,922,938],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/messages/__init__.py":[1,2,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/messages/api.py":[1,2,8,12,13,16,37,45,56,69,75,81,87,93],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/messages/constants.py":[1,2,3,4,5,8,9,10,11,12,16,17,18,19,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/messages/storage/__init__.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/helpers.py":[1,3,4,5,9,10,11,12,13,14,15,17,20,21,22,23,24,25,26,30,33,34,45,54,58,62,70,71,72,80,92,97,98,113,120,128,129,135,153,157,158,190,197,228,231,235,252,277,304,317,321,325,333,336,338,346,353,364,367,374,378,383,384,388,395,396,397],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/utils.py":[1,2,3,5,6,7,8,9,10,11,12,13,14,17,18,19,22,47,60,77,96,109,119,175,176,182,185,201,205,220,230,238,257,275,301,322,382,394,419,440,441,444,451,482,502,100,101,102,105,106,491,492,493,494,497,498,499,495,445,446],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/widgets.py":[3,4,5,7,8,9,10,11,12,13,14,15,16,19,25,26,38,43,53,54,65,70,71,82,87,90,91,93,99,106,107,110,111,114,134,138,139,141,147,171,177,183,205,209,210,212,219,222,225,230,234,238,239,243,264,271,275,279,283,310,313,316,320,321,325,326,330,331,335,336,338,341,349,350,352,356,357,363,368,370,373,379,380,382,389,393,414,440,462,463,466,467],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/checks.py":[1,2,4,5,6,9,10,11,12,13,14,17,18,19,22,30,69,71,88,100,143,155,172,204,219,254,267,295,313,321,331,341,356,367,391,407,419,431,454,466,477,491,528,541,565,567,585,594,603,614,641,653,686,703,717,726,778,786,794,802,814,864,872,895,922,924,937,966,974,982,992,1002,1010,1025,1035,1045,34,36,45,46,57,58,66,23,24,25,26,569,73,92,95,96,97,74,147,150,151,152,75,177,178,76,208,209,77,298,299,78,315,319,79,323,326,327,328,80,333,336,337,338,345,346,351,354,81,358,361,362,364,82,422,425,426,428,83,408,417,84,481,483,486,487,488,493,500,510,512,517,519,521,522,526,85,531,532,570,588,592,571,597,601,572,606,609,610,611,573,645,648,649,650,654,656,657,574,689,691,693,696,697,698,699,575,718,721,722,723,576,781,784,577,789,792,578,797,800,579,806,809,810,811,580,867,870,581,875,876,582,900,901,902,903,905,906,907,919,210,213,214,215,216,223,225,227,229,237,240,241,249,250,251,259,265,268,274,275,281,293,282,658,659,660,664,672,735,737,753,762,765,766,776,482,904,300,302,311,661,662,655,533,536,537,538,542,544,546,547,616,618,620,628,636,639,925,1011,1012,1013,1017,1018,926,928,929,967,968,972,930,940,941,945,948,949,931,977,980,932,985,986,933,995,996,934,1005,1008,160,161,166,170,815,816,820,829,839,851,862,739,743,752,272,371,372,377,389,394,396,405,545,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/exceptions.py":[1,4,5,6,9,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/templatetags/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/templatetags/admin_urls.py":[1,3,4,5,6,8,11,16,21,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/views/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/views/autocomplete.py":[1,2,5,6,7,8,10,38,42,50],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/__init__.py":[1,2,4,5,6,7,8,9,10,12,14,15,16,17,20,24,37,41,56,62,87,135,160,174,204,211,225,164,165,208],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/middleware/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/middleware/csrf.py":[6,7,8,9,10,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,30,31,32,33,36,41,45,57,71,75,94,106,123,132,139,142,149,159,182,199,205,314],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/cache.py":[18,19,20,21,23,24,25,26,27,30,31,32,34,37,86,100,106,116,134,174,195,203,222,229,248,256,276,287,299,312,320,342,383],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/signals.py":[1,3,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/decorators/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/decorators/csrf.py":[1,3,4,6,7,12,15,17,21,22,27,30,31,34,41,42,46,49,53,55,56],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/sites.py":[1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,23,24,27,28,31,38,41,44,47,50,52,54,55,56,57,58,59,60,62,69,85,126,139,145,153,159,166,173,177,181,188,232,283,287,305,322,335,344,345,366,367,400,466,482,483,501,524,525,534,526,527,63,64,65,66,67,99,100,102,103,108,113,116,124,101,285,233,237,239,247,240,242,243,248,249,250,251,252,253,254,256,257,258,259,260,266,267,268,269,271,272,211,224,225,228,229,230,276,277,278,279,281,74,75,76,78,79,80,81,82,171,143,83],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/actions.py":[3,5,6,7,8,9,10,13,78,79],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/decorators/cache.py":[1,3,4,5,8,27,38,42,47],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/middleware/cache.py":[44,46,47,48,52,55,63,64,71,74,113,120,121,127,156,162,163],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/i18n.py":[1,2,3,4,5,7,8,9,10,11,12,13,14,17,18,20,23,60,175,178,195,203,214,215,216,218,230,241,252,264,273,295,302,315,331,332],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/translation/trans_real.py":[1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,19,23,24,27,30,34,38,40,41,42,45,48,60,68,69,71,108,111,127,134,149,155,170,184,188,193,203,213,222,232,244,259,275,301,312,322,333,341,352,366,386,394,395,429,446,494,283,285,286,198,199,73,74,77,78,79,80,83,85,86,90,129,130,131,119,120,121,122,123,124,132,172,174,176,177,178,181,92,97,136,137,143,144,145,146,147,180,173,99,151,100,103,159,160,104,200,287,289,295,298,218,234,235,241,228,229,236,237,208,210,190],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/conf/locale/__init__.py":[8,12,13,14,15,18,19,20,21,24,25,26,27,30,31,32,33,36,37,38,39,42,43,44,45,48,49,50,51,54,55,56,57,60,61,62,63,66,67,68,69,72,73,74,75,78,79,80,81,84,85,86,87,90,91,92,93,96,97,98,99,102,103,104,105,108,109,110,111,114,115,116,117,120,121,122,123,126,127,128,129,132,133,134,135,138,139,140,141,144,145,146,147,150,151,152,153,156,157,158,159,162,163,164,165,168,169,170,171,174,175,176,177,180,181,182,183,186,187,188,189,192,193,194,195,198,199,200,201,204,205,206,207,210,211,212,213,216,217,218,219,222,223,224,225,228,229,230,231,234,235,236,237,240,241,242,243,246,247,248,249,252,253,254,255,258,259,260,261,264,265,266,267,270,271,272,273,276,277,278,279,282,283,284,285,288,289,290,291,294,295,296,297,300,301,302,303,306,307,308,309,312,313,314,315,318,319,320,321,324,325,326,327,330,331,332,333,336,337,338,339,342,343,344,345,348,349,350,351,354,355,356,357,360,361,362,363,366,367,368,369,372,373,374,375,378,379,380,381,384,385,386,387,390,391,392,393,396,397,398,399,402,403,404,405,408,409,410,411,414,415,416,417,420,421,422,423,426,427,428,429,432,433,434,435,438,439,440,441,444,445,446,447,450,451,452,453,456,457,458,459,462,463,464,465,468,469,470,471,474,475,476,477,480,481,482,483,486,487,488,489,492,493,494,495,498,499,500,501,504,505,506,507,510,511,512,513,516,517,518,519,522,523,524,525,528,529,530,531,534,535,536,537,540,543,544,545,546,549,550,551,552,555,558,561,564,567],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/apps.py":[1,2,3,4,7,8,10,11,12,14,19,20,22,23,15,16,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/apps.py":[1,2,3,4,5,7,8,9,10,13,14,15,17,18,19,20,22,24,25,26,27,28],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/checks.py":[1,2,4,5,6,8,11,97,12,13,26,29,39,50,74,84,94,98,99,103,104,105,107,108,109,113,112,115,129,130,132,143,154,164,166],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/management/__init__.py":[3,4,5,7,8,9,10,13,22,36,85,100,37,40,41,42,43,44,48,53,55,56,59,61,62,17,27,28,29,30,31,33,18,19,63,68,69,71,75,76,77,79,80],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/apps.py":[1,2,5,6,7,9,14,15,16,18,19,20,21,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/checks.py":[1,3,4,7,24,8,10,11,14,16,19,17,20,21,25,26,29,30,31,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/management/__init__.py":[1,2,3,6,7,13,38,41,45,87,104,50,54,55,59,61,63,64,74,76,77,78,83,108,111,112,113,114,118,88,91,93,95,97,99,101,120,124,128,129,131,132,121],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/__init__.py":[1,2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/migration.py":[1,3,6,21,24,28,33,38,45,49,51,60,67,70,73,76,90,127,179,183,185,191,193,186,187,188,52,53,55,56,57,58,71,74,82,83,86,87,88,99,102,113,114,116,117,124,125],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/exceptions.py":[1,4,5,6,9,10,11,14,15,16,19,20,21,24,25,26,29,30,31,34,35,37,42,45,49,50,53,54],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/operations/__init__.py":[1,2,7,10,11,12,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/operations/fields.py":[1,2,3,5,6,9,10,14,18,22,25,28,31,34,41,42,44,49,63,75,89,94,97,120,121,123,134,147,152,158,162,166,168,173,187,208,220,223,226,241,242,244,249,253,257,269,324,334,344,347,353,169,170,171,11,12,45,46,47,245,246,247,188,192,194,196,16,195,203,204,206,135,136,137,138,139,141,142,144,145,65,69,70,72,73,66,67,270,272,273,274,275,276,280,281,288,289,290,277,278,292,297,298,299,305,306,307,308,309,310,311,313,314,316,317,318,319,320,322,282,283,284,301,302,189,190,209,210,211,212,213,214,216,217,76,77,78,79,80,82,83,84,86],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/operations/base.py":[1,2,5,19,23,26,30,33,35,37,43,55,62,69,77,83,95,104,116,128,136,39,40,41,129,131,132,111,114],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/operations/utils.py":[1,2,3,4,5,6,7,9,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/operations/models.py":[1,2,3,4,5,7,12,22,23,26,30,33,40,41,43,45,61,78,88,93,98,101,123,133,224,225,227,237,240,245,250,254,255,257,262,266,270,281,322,373,382,388,391,408,409,411,415,426,430,448,451,457,463,464,470,471,479,483,484,486,491,502,507,517,520,529,533,537,538,540,545,556,561,571,574,583,587,588,590,594,605,610,628,631,640,644,649,653,654,655,656,657,658,659,660,661,662,663,666,670,681,689,692,695,699,700,702,704,708,715,720,723,726,730,731,733,738,739,741,750,757,762,767,778,786,787,789,793,799,806,813,824,46,47,48,49,50,24,53,13,14,15,19,54,55,57,59,487,488,489,667,668,258,259,260,79,80,81,82,83,84,85,503,28,504,505,682,683,684,685,686,687,238,283,264,284,285,268,287,288,289,290,291,292,293,294,295,311,314,296,297,299,302,303,304,305,307,317,319,320,89,90,91,508,509,510,511,512,513,514,690],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/state.py":[1,2,3,5,6,7,8,9,10,11,12,13,14,15,17,20,28,47,58,80,85,87,93,99,107,155,160,167,193,204,208,212,217,226,230,231,233,235,242,246,250,251,280,292,318,330,340,348,357,359,395,399,400,526,539,553,576,582,588,591,88,90,91,360,361,362,363,364,365,366,368,370,372,377,382,388,94,397,95,96,156,100,101,541,542,543,544,548,549,550,161,210,257,258,259,260,263,264,236,240,265,243,269,271,297,300,284,285,286,287,301,302,303,304,305,306,556,557,559,560,561,562,567,568,569,572,529,530,531,532,536,537,574,331,332,336,337,338,309,316,289,290,274,275,276,277,195,196,197,199,200,320,298,321,322,324,325,327,328,201,202,97,157,108,111,113,114,115,116,126,129,130,131,138,139,151,153,158,169,170,171,341,342,344,345,173,177,182,183,184,188,191,132,134,21,22,23,135,140,141,145,148,69,70,31,34,35,36,41,42,44,71,77,343,109,120,121,52,54,37,38,146,185,186,123,72,73,75,76,74,205,206],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/operations/special.py":[1,3,6,12,14,16,20,32,36,44,59,63,69,70,72,79,95,99,103,107,113,116,133,136,138,140,156,172,176,181,192,198,201,141,143,145,147,150,152,153,154,148,179],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/apps.py":[1,2,5,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/messages/apps.py":[1,2,5,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/apps.py":[1,2,3,4,7,8,9,10,12,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/checks.py":[1,4,6,7,8,9,13,10,11,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/finders.py":[1,2,3,5,6,7,8,9,10,13,14,15,18,21,24,25,31,40,48,52,53,71,90,105,119,129,133,134,135,137,155,164,180,193,197,198,200,212,230,238,241,242,244,253,275,280,276,277,286,287,290,55,57,58,59,62,63,64,65,66,67,68,69,72,73,79,80,82,88,139,141,142,143,146,147,148,149,150,151,152,153,26,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/utils.py":[1,2,4,5,8,16,38],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/apps.py":[1,2,3,5,8,9,10,12,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/management.py":[3,5,6,7,8,11,12,13,17,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/__init__.py":[1,2,4,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/types.py":[1,3,4,5,6,7,9,10,11,14,35,36,37,38,40,43,44,47,48,49,50,51,52,53,54,55,56,57,114,117,130],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/__init__.py":[1,3,32,41,42,45,47,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,87],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/pyutils/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/pyutils/version.py":[1,3,4,5,8,33,40,53,61,10,44,47,48,50,17,35,36,37,19,20,26,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/__init__.py":[2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,23,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,54],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/__init__.py":[23,24,27,30,90,106,115,118,121,161,171,172,266],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/pyutils/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/pyutils/version.py":[1,3,4,5,8,33,40,53,61,10,44,47,48,50,17,35,36,37,19,20,26,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/graphql.py":[1,2,4,38,55,76],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/execution/__init__.py":[20,21,22,23,27,28,29,30,31,32],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/execution/executor.py":[1,2,3,4,5,6,8,9,11,12,13,14,15,25,35,36,45,48,66,156,182,227,262,312,367,438,458,495,571,605,627,676,689,714],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/__init__.py":[1,2,9,10,14,15,25,26,27,28,31,32,33,35,36],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/__init__.py":[2,4,5,6,7,8,15,16,17,18,20,21,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/py3/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/py3/observer.py":[1,4,5,9,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/py3/observable.py":[1,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/py3/disposable.py":[1,4,5,7,11,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/py3/scheduler.py":[1,4,5,6,10,11,14,15,18,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/observerbase.py":[1,3,4,7,11,13,16,21,25,35,39,46,50,57],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/__init__.py":[1,2,3,4,5,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/priorityqueue.py":[1,3,4,7,8,10,16,21,28,36,43,50,11,12,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/exceptions.py":[4,5,9,10,14,15,19,20,24,25,29,30,34,35],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/basic.py":[1,5,10,15,19,23,27,31],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/extensionmethod.py":[1,39,14,36,20,21,25,27,28,34,35,51,22,23,29,32,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/enumerable.py":[1,3,6,8,11,14,17,21,34,47,48,53,54],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/enumerator.py":[1,2,4,7,11,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/concurrency.py":[2,3,5,8,12,17,18,21,24,27,31,32,35,38,41,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/observablebase.py":[1,2,4,5,7,8,9,12,13,15,22,90],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/__init__.py":[1,3,4,6,7,8,9,10,13,14,15,17,18,19,20,21,22,23,24,25,26],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/scheduleditem.py":[1,4,8,9,16,20,26,29,32,35],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/__init__.py":[1,2,3,4,5,6,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/anonymousdisposable.py":[1,2,3,6,7,9,25,37,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/booleandisposable.py":[1,2,5,6,8,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/compositedisposable.py":[1,2,5,6,8,18,35,53,68,79,90,93,96],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/singleassignmentdisposable.py":[1,2,5,9,11,21,24,42,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/multipleassignmentdisposable.py":[1,2,5,7,9,16,19,33,35],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/serialdisposable.py":[1,2,5,8,10,17,20,39,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/refcountdisposable.py":[1,2,5,8,10,12,17,23,35,53,67],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/disposables/scheduleddisposable.py":[1,2,5,7,9,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/immediatescheduler.py":[1,3,4,5,8,9,14,23,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/schedulerbase.py":[1,3,4,5,8,11,13,20,48,57,69,80,91],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/currentthreadscheduler.py":[2,3,4,5,7,8,9,11,12,14,17,18,34,37,39,46,52,75,81,87,93,95,105,112,43,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/virtualtimescheduler.py":[1,3,5,6,7,9,12,14,16,32,38,43,55,62,66,83,88,123,137,150,160],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/scheduleperiodic.py":[1,4,7,9,22,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/timeoutscheduler.py":[1,2,3,5,6,8,10,13,14,16,31,55,61,69],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/newthreadscheduler.py":[1,2,3,5,6,7,9,12,14,16,26,32,38,43,69,17,19,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/eventloopscheduler.py":[1,2,3,5,6,7,8,9,11,13,16,18,20,40,55,60,79,102,110,159,171,180,21,22,24,29,30,31,32,33,34,35,36,38],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/threadpoolscheduler.py":[1,3,5,8,9,11,12,14,19,22,25,29,32,26,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/historicalscheduler.py":[1,2,5,7,9,26,33,45,51],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/catchscheduler.py":[1,2,4,7,8,21,24,29,34,39,42,54,64],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/__init__.py":[1,2,3,4,5,6,7,8,9,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/asyncioscheduler.py":[1,2,4,5,6,8,11,12,14,21,35,63,80],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/ioloopscheduler.py":[1,3,4,5,7,10,13,15,19,37,65,78],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/geventscheduler.py":[1,3,5,6,7,9,12,16,18,24,39,68,81],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/gtkscheduler.py":[1,2,3,6,11,13,44,48,57,68],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/twistedscheduler.py":[1,3,4,5,7,10,11,13,16,21,50,63],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/tkinterscheduler.py":[1,2,3,6,10,12,15,20,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/pygamescheduler.py":[1,2,4,6,7,8,10,13,17,19,28,34,45,62,74],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/qtscheduler.py":[1,3,4,5,7,10,11,13,17,46,50,61,74],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/wxscheduler.py":[1,3,4,5,7,10,12,14,29,38,70,74,85,98],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/concurrency/mainloopscheduler/eventletscheduler.py":[1,3,5,6,7,9,12,16,18,24,39,68,81],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/anonymousobserver.py":[1,2,5,6,13,16,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/autodetachobserver.py":[1,3,6,8,14,21,27,33,36,38],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/anonymousobservable.py":[1,4,6,8,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/checkedobserver.py":[1,2,3,6,8,12,19,26,33,47],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/observerextensions.py":[1,3,4,7,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/disposableextensions.py":[1,2,3,6,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/__init__.py":[1,2,3,4,5,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/controlledobservable.py":[1,2,4,7,9,15,18,24,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/controlledsubject.py":[1,2,3,4,5,8,9,22,25,34,44,53,66,86],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/subjects/__init__.py":[1,2,3,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/subjects/subject.py":[1,2,3,5,6,9,12,14,24,28,42,57,77,94,101],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/subjects/anonymoussubject.py":[1,4,5,11,14,17,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/subjects/innersubscription.py":[1,4,5,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/subjects/behaviorsubject.py":[1,2,3,5,8,12,14,34,38,56,71,86,98],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/subjects/replaysubject.py":[1,2,4,5,6,7,8,11,12,16,22,26,28,52,56,76,83,101,122,140],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/scheduledobserver.py":[1,2,4,7,8,23,28,33,38,49,69],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/subjects/asyncsubject.py":[1,2,3,5,8,11,13,28,32,53,77,92,99],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/notification.py":[1,2,3,5,8,9,11,15,34,57,63,67,68,70,78,81,84,88,89,91,98,101,104,108,109,111,117,120,123,126,149],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/pausable.py":[2,3,4,5,8,9,20,35,38,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/pausablebuffered.py":[1,2,3,4,7,56,58,69,113,116,120],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/stopandwait.py":[1,3,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/stopandwaitobservable.py":[1,3,4,7,9,18,24,30,39,48,50,56],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/internal/utils.py":[1,3,4,6,9,16,75,80,84,86,91,93],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/windowed.py":[1,3,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/backpressure/windowedobservable.py":[1,3,4,5,6,9,10,20,24,28,37,50,51,59],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/__init__.py":[1,2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/__init__.py":[1,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,140],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/all.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/amb.py":[1,2,3,6,83],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/and_.py":[1,2,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/joins/__init__.py":[1,2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/joins/pattern.py":[1,3,4,9,23,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/joins/plan.py":[1,2,5,6,10,36],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/joins/activeplan.py":[1,2,10,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/joins/joinobserver.py":[1,2,5,7,17,28,31,34,37,40,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/some.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/asobservable.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/average.py":[1,2,5,7,12,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/buffer.py":[1,2,5,6,23,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/bufferwithtime.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/bufferwithtimeorcount.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/case.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/catch.py":[1,2,4,5,6,9,37,38,62],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/concat.py":[1,2,3,4,5,8,28,37,48,60,112],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/contains.py":[1,2,3,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/combinelatest.py":[1,2,3,6,32],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/count.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/create.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/debounce.py":[1,2,4,5,8,9,70],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/defaultifempty.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/defer.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/delay.py":[1,2,4,5,6,7,9,12,13,18,93,101,102],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/delaysubscription.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/delaywithselector.py":[1,2,4,7,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/dematerialize.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/distinct.py":[1,2,3,6,12,13,17,23,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/distinctuntilchanged.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/doaction.py":[1,2,3,6,8,81,103,117,140,172,201],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/dowhile.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/elementat.py":[1,2,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/elementatordefault.py":[1,2,3,7,36,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/empty.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/exclusive.py":[1,3,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/expand.py":[1,3,5,6,9,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/finallyaction.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/find.py":[1,2,5,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/findindex.py":[1,2,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/first.py":[1,2,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/firstordefault.py":[1,2,3,5,22,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/forin.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/fromiterable.py":[1,2,3,4,5,8,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/fromcallback.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/fromfuture.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/generate.py":[1,2,3,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/generatewithrelativetime.py":[1,2,3,4,7,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/groupby.py":[1,2,5,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/groupbyuntil.py":[1,3,4,5,7,8,9,12,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/groupedobservable.py":[1,2,3,6,7,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/groupjoin.py":[1,2,4,5,6,8,9,11,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/ifthen.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/ignoreelements.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/interval.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/isempty.py":[1,2,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/join.py":[1,2,4,5,6,7,9,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/last.py":[1,2,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/lastordefault.py":[1,2,3,6,26,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/let.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/manyselect.py":[1,2,3,4,5,6,7,10,12,22,27,30,33,38,39],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/materialize.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/merge.py":[1,2,3,4,7,73,104],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/max.py":[1,2,3,5,8,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/min.py":[1,2,3,4,7,14,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/maxby.py":[1,2,3,5,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/minby.py":[1,2,3,5,46,47],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/multicast.py":[1,2,3,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/connectableobservable.py":[1,2,3,6,7,9,17,20,34,61],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/never.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/observeon.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/observeonobserver.py":[1,4,5,8,12,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/onerrorresumenext.py":[1,2,4,5,8,26],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/of.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/pairwise.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/partition.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/pluck.py":[1,2,5,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/publish.py":[1,2,3,6,7,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/publishvalue.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/range.py":[1,2,3,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/reduce.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/repeat.py":[1,2,3,4,7,8,25,38,39],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/replay.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/retry.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/returnvalue.py":[1,3,4,7,8,37,38],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/scan.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/sample.py":[1,2,3,4,7,36,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/select.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/selectswitch.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/selectmany.py":[1,2,3,4,7,19,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/sequenceequal.py":[1,3,4,5,6,9,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/single.py":[1,2,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/singleordefault.py":[1,2,3,5,28],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/skip.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/skiplast.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/skiplastwithtime.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/skipuntil.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/skipuntilwithtime.py":[1,3,4,5,6,9,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/skipwhile.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/skipwithtime.py":[1,2,3,4,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/slice.py":[1,2,5,6,61],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/start.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/startasync.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/startswith.py":[1,3,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/statistics.py":[1,2,3,6,18,26,39,54],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/subscribeon.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/sum.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/switchlatest.py":[1,2,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/take.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/takelast.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/takelastbuffer.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/takelastwithtime.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/takeuntil.py":[1,2,3,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/takeuntilwithtime.py":[1,3,4,5,6,8,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/takewhile.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/takewithtime.py":[1,2,3,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/thendo.py":[1,2,4,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/throttlefirst.py":[1,2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/throw.py":[1,3,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/timeinterval.py":[1,2,3,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/timer.py":[1,2,4,5,6,7,9,12,22,45,57,73,74],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/timeout.py":[1,3,4,6,7,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/timeoutwithselector.py":[1,2,4,7,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/timestamp.py":[1,3,4,5,6,8,11,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/toasync.py":[1,2,3,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/toblocking.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/core/blockingobservable.py":[1,4,5,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/todict.py":[1,2,4,33,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/tofuture.py":[1,2,3,6,7,52],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/toiterable.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/tolist.py":[1,2,5,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/toset.py":[1,2,4,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/transduce.py":[15,17,18,21,23,25,28,31,34,37,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/using.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/when.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/where.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/whiledo.py":[1,3,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/window.py":[1,3,4,5,6,8,9,11,14,15,44,47,79],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/windowwithcount.py":[1,3,4,5,6,7,8,10,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/windowwithtime.py":[1,3,4,5,6,8,9,12,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/windowwithtimeorcount.py":[1,2,3,4,6,7,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/withlatestfrom.py":[1,2,3,6,10,36],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/zip.py":[1,2,3,6,72,93],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/ziparray.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/blocking/__init__.py":[1,2,3,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/blocking/foreach.py":[1,2,3,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/blocking/toiterable.py":[1,2,3,4,7,51],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/blocking/first.py":[1,3,6,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/observable/blocking/last.py":[1,3,6,31],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/enumerable/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/rx/linq/enumerable/whiledo.py":[1,2,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/six.py":[21,23,25,26,27,28,29,31,32,36,37,38,40,41,42,43,44,45,47,75,80,86,88,91,103,105,114,117,124,126,130,136,139,141,159,164,171,173,177,181,184,189,195,209,218,224,226,174,175,229,231,232,236,142,89,143,144,146,147,148,151,152,237,238,239,240,149,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,106,107,108,109,110,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,305,310,311,312,313,178,179,314,316,318,127,128,319,322,324,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,354,355,356,358,360,361,364,366,370,371,372,374,375,376,378,380,381,384,386,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,426,427,428,430,432,433,436,438,442,443,444,445,447,448,449,451,453,454,457,459,463,465,466,467,469,471,472,475,477,478,479,182,480,481,482,483,485,488,489,492,497,508,509,510,512,513,514,515,526,527,531,534,535,541,542,545,547,550,567,568,77,571,572,573,574,575,576,579,580,583,586,589,592,594,596,616,617,618,619,620,621,624,625,628,630,631,632,633,634,635,636,637,638,639,640,641,645,646,668,669,672,676,680,684,685,92,115,82,83,93,94,97,100,687,719,728,729,734,740,741,795,805,807,816,819,835,853,872,892,912,933,934,935,936,940,941,946,947,950,952,185,187,837,850,838,839,840,841,843,845,846,847,848,849,824,826,829,832,831,827,844,186,216,190,191,196,198,199,200,201,202,205,206,207,160,161,626],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/__init__.py":[1,4,8,9,10,13,15,17,18,27,30,31,32,33,34,35,36,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/pyutils/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/pyutils/version.py":[1,3,4,5,8,33,40,55,63,10,44,49,50,52,17,35,36,37,19,20,26,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/promise.py":[1,2,3,4,5,7,8,9,15,16,17,18,40,42,45,50,55,56,58,59,61,62,63,65,68,72,73,74,77,82,91,92,95,99,106,107,108,109,110,111,112,113,114,115,116,117,119,120,122,150,155,165,169,171,172,174,179,180,182,187,215,227,242,263,269,279,288,296,304,332,343,353,361,369,377,385,392,436,443,449,455,471,497,498,502,506,512,516,517,519,538,544,550,556,567,596,597,598,600,630,635,655,685,714,723,725,737,738,740,760,762,777,782,802,820,823,832,833,834,837,743,749,758],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/async_.py":[2,9,10,17,20,23,26,30,35,40,46,53,60,68,70,81,99,118,126,132,11,12,13,14,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/compat.py":[1,2,9,10,27,28],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/iterate_promise.py":[7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/utils.py":[1,2,3,4,5,8,15,16,22,42,43,45,46,47,48,49,50,17,19,20,23,24,32,34,39],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/promise_list.py":[1,2,17,19,21,38,42,54,71,108,122,132,137,144],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/schedulers/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/promise/schedulers/immediate.py":[1,8,9,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/error/__init__.py":[1,2,3,4,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/error/base.py":[1,2,12,21,32,45,55,66,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/location.py":[6,9,10,12,17,21,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/error/located_error.py":[1,3,10,13,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/error/syntax_error.py":[1,2,9,12,13,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/error/format_error.py":[1,3,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/pyutils/default_ordered_dict.py":[1,2,9,10,13,21,28,35,38,41,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/pyutils/ordereddict.py":[1,4,5,6,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/undefined.py":[1,2,4,8,10,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/type/__init__.py":[2,24,37,44,46],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/type/definition.py":[1,2,4,5,6,7,8,9,16,33,41,56,61,69,73,79,88,89,92,93,95,99,103,108,112,127,129,137,162,167,192,200,218,223,229,262,297,298,306,315,325,329,334,335,342,350,359,363,376,383,399,405,422,429,445,452,484,502,504,512,515,518,530,539,546,551,556,584,585,588,595,599,609,629,636,648,652,657,677,678,685,693,702,719,721,723,730,734,740,756,758,760,770,774,140,141,142,143,145,151,152,153,158,159,160,765,18,19,21,22,23,24,25,26,27,28,766,768,345,346,347,348,35,81,82,83,85,36,37,203,204,205,206,208,213,214,215,216,590,591,592,593,505,506,507,508,510,558,563,564,567,568,569,570,574,575,576,579,581,309,310,311,312,313],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/ast.py":[10,11,12,13,16,17,20,21,22,24,29,38,42,46,51,58,65,76,86,99,111,122,127,128,129,131,138,149,159,163,168,169,170,172,177,186,190,194,199,200,203,204,205,214,224,237,249,260,265,266,267,269,275,285,291,295,300,301,302,308,315,325,334,338,343,344,345,352,360,371,381,387,392,393,394,402,411,423,434,444,449,450,453,454,455,457,462,470,474,478,483,484,485,487,492,501,505,509,514,515,516,518,523,532,536,540,545,546,547,549,554,563,567,571,576,577,578,580,585,594,598,602,607,608,609,611,616,625,629,633,638,639,640,642,647,656,660,664,669,670,671,673,678,687,691,695,700,701,702,704,710,720,726,730,735,736,737,743,750,760,766,770,775,776,779,780,781,783,788,797,801,805,810,811,812,814,819,828,832,836,841,842,843,845,850,859,863,867,872,873,874,876,881,890,894,898,906,907,910,911,914,915,916,922,929,937,946,950,955,956,957,959,965,973,982,986,991,992,993,1001,1010,1022,1033,1039,1044,1045,1046,1054,1063,1075,1085,1091,1096,1097,1098,1106,1115,1127,1138,1144,1149,1150,1151,1158,1166,1177,1187,1191,1196,1197,1198,1205,1213,1224,1234,1238,1243,1244,1245,1251,1258,1268,1277,1281,1286,1287,1288,1295,1303,1314,1324,1328,1333,1334,1335,1341,1348,1358,1367,1371,1376,1377,1378,1385,1393,1404,1414,1418,1423,1424,1425,1427,1432,1441,1447,1451,1456,1457,1458,1465,1473,1484,1493,1497],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/pyutils/cached_property.py":[6,12,14,18,15,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/pyutils/compat.py":[21,23,24,25,27,28,36,37,39,40,41,42,43,44,53,54,61,64,65,72,73,81,83,86,89,92,111,113,116,119,121,122,138,139,141,177,188,189,195,203,204,205,206,207,208,209,219,226],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/assert_valid_name.py":[1,3,4,7,10,11,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/type/directives.py":[1,3,4,5,6,9,11,12,13,14,15,16,17,20,21,22,23,24,25,26,27,28,29,30,32,34,36,39,40,42,68,69,70,72,73,77,78,79,43,44,45,46,49,50,51,53,54,55,57,58,59,60,64,84,85,86,88,89,93,94,95,100,103,104,105,107,108,110,114,117,121,122,123],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/type/scalars.py":[1,3,4,15,16,19,36,45,46,47,51,52,53,57,64,71,72,73,76,77,78,82,93,101,109,110,111,114,115,116,120,127,128,129,130,131,132,136,143,144,145,150,151,152],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/type/schema.py":[1,3,4,5,6,19,42,51,60,103,107,111,115,119,124,128,136,140],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/type/introspection.py":[1,3,4,5,18,19,27,28,29,33,48,49,50,53,105,106,107,109,110,111,117,171,172,175,177,180,181,182,183,187,188,189,190,194,195,196,197,201,202,203,207,208,209,210,214,215,216,217,221,222,223,224,228,229,230,231,235,236,237,238,242,243,244,245,249,250,251,252,256,257,258,259,263,264,265,266,270,271,272,273,277,278,279,280,284,285,286,287,291,292,293,294,298,299,300,301,309,310,311,312,313,314,315,316,317,320,322,323,324,325,326,327,328,329,332,345,349,370,377,387,391,402,409,410,411,419,486,487,488,490,522,523,524,527,545,546,547,550,572,573,574,575,578,579,580,584,585,586,587,592,593,594,595,600,601,602,603,608,609,610,611,616,617,618,619,624,625,626,627,632,633,634,635,643,645,647,648,649,650,653,654,656,657,658,661,662,664,665,666],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/printer.py":[1,3,47,50,55,56,58,62,66,70,83,87,91,104,110,114,126,136,140,143,147,151,155,159,163,169,175,179,183,189,195,199,203,216,226,236,246,256,266,270,280,284,293,300,308,315],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/visitor.py":[1,3,5,6,17,18,21,26,27,30,31,34,35,37,46,176,177,178,180,194,209,210,212,220,240,261,262,264,269,286],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/visitor_meta.py":[1,4,5,6,10,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,47,50,51,52,53,55,56,59,62,63,68,73,74,75,76,77,57,60,69,70,71,64,65,66],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/ast_from_value.py":[1,2,3,5,7,8,14,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/type/typemap.py":[1,2,4,5,24,25,46,55,75,143],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/type_comparators.py":[1,23,36,69],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/execution/base.py":[2,13,14,24,27,29,31,42,51,66,78,93,110,111,112,113,114,115,116,117,118,119,120],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/execution/utils.py":[2,3,5,6,7,8,9,10,15,16,35,38,42,56,59,130,136,146,154,174,175,177,182,186,191,220,281,319,339,347,358],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/type_from_ast.py":[1,2,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/execution/values.py":[1,2,4,6,7,8,9,17,18,19,28,31,89,148],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/is_valid_value.py":[3,5,6,8,10,22,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/value_from_ast.py":[1,2,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/execution/executors/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/execution/executors/sync.py":[6,7,11,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/execution/middleware.py":[1,2,3,5,12,15,20,23,32,44,47,58,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/backend/__init__.py":[5,7,8,9,10,16,19,27,37,38,39,40,41,42,43],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/backend/base.py":[1,2,4,5,15,16,23,24,31,49],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/backend/core.py":[1,2,4,5,6,7,9,21,37,39,41,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/base.py":[1,2,3,4,5,6,9,10,11,12,13,14,15,16,17,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/lexer.py":[1,3,5,12,15,16,18,25,31,42,43,45,50,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,81,89,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,117,126,127,128,129,130,131,132,133,134,135,136,137,141,152,201,204,206,207,209,210,212,217,246,304,328,329,330,331,332,333,334,335,339,420,434,451],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/parser.py":[1,3,4,5,6,51,54,69,81,82,84,93,94,96,102,107,116,129,137,143,155,174,191,201,215,229,239,252,281,310,324,334,348,356,365,373,398,406,420,446,462,470,518,523,528,539,551,564,572,585,604,610,662,676,687,699,714,729,742,750,765,780,793,806,821,832,845,855,871],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/language/source.py":[1,4,5,7,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/__init__.py":[1,2,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/validation.py":[1,2,3,4,5,27,36,44,45,47,52,53,55,60,63,68,78,81,93,96,100,104,115,128,150,167,170,179,183,187,191,195,199],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/type_info.py":[1,3,4,11,12,39,46,47,56,59,70,76,82,88,94,98,102,109,116,124,133,136,148,158,160,163,175,181,190,194,199,202,206,207,209,212,217,221],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/get_field_def.py":[1,2,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/__init__.py":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,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],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/arguments_of_correct_type.py":[1,2,3,4,12,13,36],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/is_valid_literal_value.py":[1,2,3,17,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/base.py":[1,8,9,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/default_values_of_correct_type.py":[1,2,3,4,5,13,14,40,51,54,61],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/fields_on_correct_type.py":[1,3,4,5,6,7,8,15,17,18,20,23,36,37,40,45,47,91,131],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/quoted_or_list.py":[1,8,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/suggestion_list.py":[1,4,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/fragments_on_composite_types.py":[1,2,3,4,12,13,34,47,51],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/known_argument_names.py":[1,2,3,4,5,13,23,33,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/known_directives.py":[1,2,3,4,7,8,40,44,52,53,54,58],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/known_fragment_names.py":[1,2,5,6,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/known_type_names.py":[1,2,3,4,12,20,21,24,27,30,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/lone_anonymous_operation.py":[1,2,3,12,13,15,20,28,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/no_fragment_cycles.py":[1,2,12,13,15,23,34,39,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/no_undefined_variables.py":[1,2,11,12,14,19,20,27,38,62],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/no_unused_fragments.py":[1,2,11,16,19,25,37,41,59],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/no_unused_variables.py":[1,2,11,12,14,19,30,57,60],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/overlapping_fields_can_be_merged.py":[1,2,4,5,6,7,8,16,17,18,36,37,39,52,87,92,100,166,224,271,347,428,462,503,585,608,632,676,693,721,730],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/pyutils/pair_set.py":[6,7,9,13,16,19,22,36,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/possible_fragment_spreads.py":[1,2,3,4,12,13,37,56,61,67],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/provided_non_null_arguments.py":[1,2,3,11,12,41,61,67],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/scalar_leafs.py":[1,2,3,11,12,42,48],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/unique_argument_names.py":[1,2,11,12,14,19,30,33,55],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/unique_fragment_names.py":[1,2,11,12,14,19,30,43],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/unique_input_field_names.py":[1,2,11,12,14,20,32,43,64],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/unique_operation_names.py":[1,2,11,12,14,19,43,46],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/unique_variable_names.py":[1,2,11,12,14,19,30,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/variables_are_input_types.py":[1,2,3,4,5,8,9,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/validation/rules/variables_in_allowed_position.py":[1,2,3,4,5,14,15,17,22,33,67,78,85],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/backend/decider.py":[1,2,3,4,5,8,9,10,18,20,27,28,30,39,44,49,81,104,121,132,136,153,156,158,159,165,166,167,168,189,193,199],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/backend/cache.py":[1,3,4,6,13,15,18,30,42,44,50,62,71],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/base.py":[4,7,10,13,16,19,22,25,28,31,35,38,41,44,47,50,53,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/introspection_query.py":[90],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/get_operation_ast.py":[1,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/build_client_schema.py":[1,2,3,25,26,37,40,44,48,52],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/build_ast_schema.py":[1,2,3,4,28,38,41,51,58,66,70,74,338],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/extend_schema.py":[1,3,4,5,6,20,30,37,38,41,388],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/schema_printer.py":[1,2,10,11,28,35,40,45,50,55,58,63,83,102,123,128,142,147,152,159,170,178,190,203,213,220],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql/utils/concat_ast.py":[1,3,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/objecttype.py":[1,3,4,5,6,9,10,14,15,16,19,25,27,30,31,32,33,66,68,36,37,39,41,47,48,50,55,58,60,61,62,64],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/base.py":[1,2,5,6,7,9,11,14,17,23,27,28,32,33,34,35,36,12,18,19,37,38,39,15,40,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/subclass_with_meta.py":[1,3,5,6,9,10,12,17,21,22,25,54,27,28,29,41,43,44,50,51,52,30,32,33,40,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/pyutils/init_subclass.py":[1,3,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/props.py":[1,2,5,6,9,12,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/trim_docstring.py":[1,4,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/field.py":[1,2,3,5,6,7,8,9,11,14,21,33,70,74,36,37,41,43,47,48,51,56,60,61,62,63,65,66,67,68],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/argument.py":[1,2,4,5,6,7,10,18,30,34,43,44,45,46,48,51,52,53,54,83],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/dynamic.py":[1,2,4,7,11,13,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/mountedtype.py":[1,2,5,6,11,15,16,17,18,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/orderedtype.py":[1,4,5,6,8,11,17,20,26,32,38,9,13,14,15,28,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/unmountedtype.py":[1,4,16,18,23,30,33,41,49,57,19,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/structures.py":[1,2,5,9,11,23,27,35,42,44,47,55,66,68,74,77,69,12,13,21,70],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/utils.py":[1,2,3,5,7,8,9,12,24,41,29,30,31,16,18,32,33,36,37,38,19,21,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/module_loading.py":[1,2,5,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/interface.py":[1,3,4,5,8,9,13,14,17,25,27,28,43,50,29,32,33,34,36,37,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/mutation.py":[1,3,4,5,6,7,8,11,12,17,18,19,20,23,26,28,30,79,81],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/deprecated.py":[1,2,3,5,8,12,19,29,43,31,34,36,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/get_unbound_function.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/scalars.py":[1,2,4,5,8,9,12,19,21,26,27,28,30,44,45,48,54,56,68,69,71,23,24,79,84,86,94,95,97,103,108,110,116,117,119,125,128,130,131,133,139,146,148,149,151,36],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/datetime.py":[1,3,5,6,8,11,16,18,27,32,40,45,47,54,59,67,72,74,81,86],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/__init__.py":[10,11,12,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/time.py":[9,11,12,15,16,18,76,116,131,142,157,185,232,238,254,255,256],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/date.py":[9,11,13,15,86,104,127,143,153,186,204,226,244,245,246,247,248,249],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/exceptions.py":[9,10,12,13,15,16,18,19,21,22,24,25,27,28,30,31,33,34,36,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/resolution.py":[9,11,12,14,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/compat.py":[9,11,13,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/timezone.py":[9,11,13,43,44,55,83,86,89],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/duration.py":[9,11,12,13,14,16,33,84,122,178,199,234,255],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/aniso8601/interval.py":[9,10,11,12,13,15,41,68,143,154],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/json.py":[1,3,5,7,10,11,13,17,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/uuid.py":[1,3,5,7,10,11,13,22,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/schema.py":[1,3,4,9,10,11,13,14,15,18,28,34,43,64,67,70,73,87,101,104,110,113,116],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/definitions.py":[1,11,15,17,22,23,26,27,30,31,34,35,38,39,42,43],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/typemap.py":[1,2,3,5,17,18,19,21,22,23,32,33,34,35,36,37,38,39,40,41,42,45,54,72,76,77,82,91,119,141,172,206,228,239,262,267,308,331],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/str_converters.py":[1,6,15,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/enum.py":[1,3,5,7,8,9,12,18,21,22,23,26,27,37,40,43,46,53,64,44,65,66,76,28,31,32,33,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/pyutils/compat.py":[1,3,5,7,8,12,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/inputobjecttype.py":[1,3,4,5,6,9,10,14,15,16,19,20,21,23,28,32,40,42,43,60],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/inputfield.py":[1,2,3,6,15,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/resolver.py":[1,5,9,12,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/union.py":[1,2,5,6,11,12,15,22,24,25,34,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/context.py":[1,2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/types/abstracttype.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/relay/__init__.py":[1,2,3,6,7,8,9,10,11,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/relay/node.py":[1,2,3,5,7,8,9,12,29,30,35,36,41,50,51,64,68,69,70,72,81,82,84,88,92,93,113,117,74,75,76,31,32,33,78],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/__init__.py":[1,5,10,16,22,24,26,28,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/connection/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/connection/connection.py":[1,3,13,16,17,18,19,20,24,63,64,65,66],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/utils.py":[1,3,6,10,14,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/connection/arrayconnection.py":[1,3,4,7,24,34,110,113,117,124,134,145],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/connection/connectiontypes.py":[1,3,7,14,17,23,32,34,38],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/node/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/node/node.py":[1,2,4,6,15,52,60,70],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/mutation/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphql_relay/mutation/mutation.py":[1,2,3,12,13,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/relay/mutation.py":[1,2,4,6,7,10,11,12,14,16,58],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/relay/connection.py":[1,2,3,5,6,8,9,10,11,14,15,16,17,18,21,22,23,24,27,28,29,32,33,34,38,39,42,43,44,46,47,89,90,97,115,134,147,152],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene/utils/resolve_only_args.py":[1,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/converter.py":[1,2,4,20,21,22,24,25,26,28,31,40,55,82,83,89,90,91,92,93,94,95,96,97,101,102,106,107,111,112,113,114,115,116,120,121,125,126,130,131,132,133,137,138,142,143,147,148,152,153,169,170,171,172,197,198,199,212,213,220,221,222,226,227],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/compat.py":[1,2,5,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/fields/__init__.py":[1,2,3,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/fields/array.py":[1,3,4,5,6,7,8,9,10,12,13,14,16,19,20,22,23,25,27,39,46,51,75,79,83,87,92,102,109,119,132,153,172,185,194,195,196,202,203,204,210,211,212,218,219,220,226,227,228,229,231,240,241,242,258,260,265,269,274,276,280,284,286,291,296,298,302,28,29,30,35,37,76,77,48,49,93,94,95,96,97,98,100,41,42,43,44,52,53,63,64,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/lookups.py":[1,2,4,7,8,15,16,17,20,21,22,25,26,27,30,31,32,33,36,37,38,40,44,45,46,49,50,51,52,55,56,58,65,66,67,70,71,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/search.py":[1,2,3,4,7,8,10,17,24,26,30,32,36,37,39,47,48,49,50,51,53,64,73,89,90,95,96,97,99,114,117,120,123,127,128,130,135,144,156,161,165,166,171,172,173,175,186,201,204,205,207,213,214,217,218,219],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/forms/__init__.py":[1,2,3,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/forms/array.py":[1,2,4,5,8,9,11,14,16,19,30,34,39,62,78,94,105,106,108,113,117,121,127,133,154,158,163,168,170,173,181],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/validators.py":[1,2,6,7,10,11,12,13,14,17,18,19,20,21,24,26,29,30,32,34,40,58,67,68,70,73,74,76],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/utils.py":[1,2,3,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/forms/hstore.py":[1,3,4,5,7,10,13,14,16,17,20,25,50],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/forms/jsonb.py":[1,3,4,6,9,10,13,14,17,19,21,23,43,51,56],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/forms/ranges.py":[1,3,4,5,6,9,10,14,16,17,20,29,43,63,64,65,66,69,70,71,72,75,76,77,78,81,82,83,84,87,88,92,21,22,89,90,23,24,25,26,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/psycopg2/__init__.py":[18,50,63,68,69,70,75,76,80,81,82,85,120,121,123,126,129,130,131,134],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/psycopg2/tz.py":[6,29,30,32,35,48,49,50,52,54,60,71,76,80,83,95,99,100,101,104,107,111,112,118,124,127,136],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/psycopg2/extensions.py":[12,35,37,44,45,49,50,52,53,60,70,71,72,73,74,75,79,80,81,82,83,84,87,91,92,93,94,98,99,100,101,102,105,111,112,113,117,120,131,135,140,141,144,148,183,184,199,201,202,203,207,211,107,212,219,220,221,223,150,154,159,160,163,166,168,173,174,188,191,192,195,177,179],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/psycopg2/_json.py":[6,30,32,33,37,38,47,48,51,52,55,66,67,78,82,97,100,107,111,117,155,168,181,203,164,165,141,144,145,183,184,187,189,194,195,196,200,147,149,150,152,177,178],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/psycopg2/_range.py":[3,27,29,30,31,34,43,44,46,57,64,69,74,79,86,93,100,107,129,132,139,142,149,165,171,177,183,190,195,226,231,232,234,237,241,244,274,280,281,295,330,386,398,400,402,433,441,446,447,450,451,452,455,456,457,460,461,462,470,471,472,496,502,503,282,283,301,302,306,307,308,309,313,317,318,319,321,322,326,285,287,289,290,291,504,434,435,436,438,506,507,508,510,511,512,514,515,303,304,516,518,519,520,522,523,524,47,48,51,52,53,133,134,235,242,245,250,251,77,254,67,255,256,258,262,72,263,264,266,271,108,111,112,113,119,120,124,127,268,114,125],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/psycopg2/extras.py":[5,28,29,30,31,33,35,36,37,38,39,41,49,54,60,63,64,66,78,87,96,105,123,124,125,130,131,133,138,143,148,155,156,158,160,164,169,174,177,180,183,186,192,196,199,202,205,208,211,216,217,218,219,220,223,224,225,230,237,238,243,248,253,260,261,263,265,273,278,281,286,287,288,293,308,309,311,315,319,323,331,338,345,361,362,367,385,389,391,403,412,419,424,429,435,436,438,444,451,461,462,466,473,478,479,481,485,490,492,497,499,504,512,513,516,517,519,549,556,613,619,624,626,629,633,636,640,674,681,682,685,688,691,697,701,705,738,750,778,793,794,795,798,805,829,840,842,853,855,856,888,897,931,995,1003,1004,1020,1035,1047,1051,1053,1055,1070,1080,1131,1159,1178,1203,1281,650,652,653,654,661,662,663,665,666,667,669,627,634],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/psycopg2/_ipaddress.py":[2,26,30,33,36,65,75,82,88],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/fields/mixins.py":[1,4,5,7,26,27,28,8,24,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/fields/utils.py":[1,2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/fields/citext.py":[1,3,6,8,11,15,16,19,20,23,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/fields/hstore.py":[1,3,4,5,6,7,9,11,14,15,16,18,20,22,25,31,41,46,49,55,73,74,75,76,77,80,81,83,87,92,94,97,101,102,103,104,105,108,109,110,111,112],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/fields/jsonb.py":[1,3,5,6,7,10,12,14,17,20,21,25,30,31,32,34,36,38,44,47,53,59,64,76,79,86,87,88,89,90,91,94,95,96,98,102,120,121,122,123,126,131,132,140,141,144,145,148,149,152,153,156,157,160,161,164,165,168,169,172,173,174,175,176,177,178,179,182,184,187,39,41,42,48,49,51],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/postgres/fields/ranges.py":[1,2,4,6,7,9,12,13,17,18,20,26,33,38,47,59,63,80,85,86,87,88,90,94,95,96,97,99,103,104,105,106,108,112,113,114,115,117,121,122,123,124,126,130,131,132,135,139,140,142,150,162,163,166,167,169,170,171,172,173,176,187,191,192,193,194,195,198,199,200,201,204,205,206,207,210,211,212,213,216,217,218,219,222,223,224,225,228,229,230,231,233,238,239,240,241,243,248,249,250,251,252,22,23,24,60,61,35,36,28,29,30,31,81,82,48,55,57,39,41,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/fields.py":[1,3,5,7,8,9,11,12,15,16,19,23,27,31,32,43,56,60,64,70,78,104,145],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/settings.py":[13,14,16,17,18,20,21,29,30,31,32,35,37,40,41,44,47,61,81,89,91,97,103,123,92,94,95,126,133],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/test/__init__.py":[1,3,4,8,14,15,16,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/test/client.py":[1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,20,21,22,23,24,25,26,27,28,29,31,34,35,36,38,41,42,43,49,55,56,63,66,77,85,94,113,118,119,123,161,174,223,252,264,265,271,299,303,315,323,334,342,343,351,359,364,370,377,384,391,417,434,435,440,444,457,525,532,533,540,548,556,564,572,579,586,601,613,641,655,665,436,266,267,268,269,437,120,121,438],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/handlers/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/handlers/base.py":[1,2,4,5,6,7,8,9,11,13,16,17,18,19,20,22,63,70,73,96,160],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/handlers/exception.py":[1,2,3,5,6,7,11,12,13,14,15,18,41,105,116],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/handlers/wsgi.py":[1,2,3,4,6,7,8,9,10,11,12,14,17,18,19,25,34,46,66,67,100,103,109,114,117,122,128,131,132,134,138,156,163,194,207],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/test/signals.py":[1,2,3,4,6,7,8,9,10,11,12,13,14,16,22,25,32,49,77,83,104,111,123,129,136,145,153,164,174,181],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/test/utils.py":[1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,38,41,44,45,49,52,56,60,61,70,76,83,90,99,100,103,139,155,199,241,286,300,313,324,325,329,332,335,338,341,361,370,378,384,385,389,407,417,427,437,441,442,452,460,485,490,491,498,509,514,576,580,583,584,587,590,593,596,600,611,619,620,628,633,637,638,665,666,667,672,683,693,708,718,728,741,758,775,776,777,781,785,789,793,794,800,804,819,820,824,830,834,301,302,304,305,308,309,310,108,115,118,119,121,123,125,126,128,129,131,132,134,136,157,253,254,255,256,258,259,260,262,269,270,271,273,275,278,281,204,205,208,211,212,213,214,215,220,222,223,224,227,228,229,230,231,235,237,238,282,283,159,161,162,163,164,165,168,169,170,171,172,173,174,176,188,192,196,288,289,290,297,144,146,147,148,149,151,152],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/test/testcases.py":[1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,36,37,40,43,55,64,65,70,86,87,94,99,102,105,109,125,126,129,133,134,138,146,150,151,152,156,158,173,188,214,223,227,234,243,321,352,371,382,438,517,541,570,587,593,606,622,633,678,696,706,718,735,752,772,789,793,796,799,802,808,812,814,851,852,863,874,897,900,927,945,957,968,973,985,986,995,1002,1022,1030,1035,1040,1050,1060,1067,1068,1069,1072,1075,1088,1112,1120,1128,1136,1140,1141,1145,1149,1150,1155,1163,1168,1178,1187,1193,1197,1198,1201,1205,1209,1210,1213,1217,1218,1220,1229,1255,1258,1266,1276,1277,1278,1279,1280,1282,1286,1314,1323,1336,1343,1351,1352,1354,1364,1004,160,161,164,167,1005,970,1007,989,990,855,861,991,992,993,1009,1016,1017,1033,194,196,197,200,201,202,822,220,221,823,833,834,1041,1047,1048,848,849,206,207,208,209,907,908,1051,1053,1054,1055,1062,1063,1056,1058,998,999,1000,909,225,910,1036,1037,920,1024,1025,1026,1027,1028,175,180,183,186],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/sql.py":[1,2,5,21,38,23,24,26,28,29,30,31,32,33,34,25,40,41,43,45,46,47,48,49,50,51,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/servers/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/servers/basehttp.py":[8,10,11,12,13,14,16,17,18,19,21,23,26,53,58,59,61,63,69,76,77,78,81,82,84,97,109,113,119,120,122,126,156,167,177,197],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/wsgi.py":[1,2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/test/html.py":[1,3,4,6,9,13,14,19,37,54,74,77,100,103,106,109,124,128,129,132,136,137,140,143,146,152,155,164,171,176,191,202,205,208,212],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/static.py":[4,5,6,7,8,10,13,14,15,16,19,79,80,83,108],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/utils.py":[1,3,4,10,11,14,15,17,22,36,42,59,63,64,65,69,75,83],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/__init__.py":[2,4,5,9,11,13,16,30,21,22,23,24,25,28],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/filterset.py":[1,2,4,5,6,7,13,14,15,31,39,54,55,65,66,83,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,135,136,137,143,144,145,151,152,153,159,160,161,166,167,168,172,173,174,181,182,184,202,208,215,230,241,255,265,297,313,360,361,381,426,452,453,67,86,87,88,92,96,99,100,107,69,70,56,57,58,60,62,71,321,322,74,81,456],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/conf.py":[1,2,3,5,8,11,12,13,17,18,19,20,21,22,23,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,47,48,49,50,51,52,57,61,66,68,82,90,106,107],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/utils.py":[1,2,4,5,6,7,8,9,10,11,12,13,14,15,17,20,24,25,27,31,40,41,43,78,94,97,101,121,131,145,177,221,229,261,288,311],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/exceptions.py":[2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/constants.py":[2,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/filters.py":[1,2,4,5,6,7,8,9,10,12,13,14,29,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,65,66,67,69,70,90,96,116,101,104,115,118,130,119,126,129,132,143,153,154,157,158,161,162,164,168,176,177,180,181,184,206,207,209,211,217,231,255,262,263,266,267,270,271,274,283,284,287,288,291,292,295,317,318,322,328,335,346,347,349,354,355,358,359,362,363,365,379,380,382,397,401,403,404,405,406,407,411,416,421,425,429,434,454,464,465,468,469,472,473,476,477,480,481,489,490,498,501,502,504,516,543,545,550,551,553,558,580,581,582,584,593,615,629,644,652,677,678,680,699,706,713,736,750,754,755,758,764],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/fields.py":[1,2,4,5,6,7,9,10,11,12,21,22,24,31,37,38,40,46,63,64,66,73,74,76,83,84,86,93,94,104,106,109,117,130,138,139,140,142,153,162,163,165,171,186,192,195,198,201,214,218,222,232,238,243,255,260,261,267,270,275,279,280,282,287,288,290,295,296,298,305,306,308],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_filters/widgets.py":[1,2,3,5,6,7,8,9,10,11,12,15,16,21,26,39,53,71,75,81,82,84,90,93,100,106,112,120,126,127,128,130,134,140,141,144,145,147,153,157,158,164,176,191,192,195,204,222,223,226,235,237],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/registry.py":[1,2,6,21,24,27,31,34,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/__init__.py":[1,3,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/apps.py":[1,6,8,11,13,14,16,18,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/daphne/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/daphne/server.py":[2,3,4,6,7,18,20,21,22,23,24,26,27,28,29,31,32,34,37,59,87,142,156,160,171,179,189,213,226,246,297,314,323],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/__init__.py":[8,11,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/_version.py":[3,8,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/incremental/__init__.py":[8,10,12,13,19,22,24,25,26,27,42,104,105,108,109,52,55,61,67,73,79,85,91,92,93,94,95,96,97,122,125,128,131,132,139,141,179,187,216,217,218,220,242,247,314,325,350,158,160,167,172,173,174,175,176,177,353,198,201,202,206,207,211,212,213,214,321,322],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/incremental/_version.py":[3,8,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/__init__.py":[12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/asyncioreactor.py":[7,9,11,13,15,16,17,19,20,22,23,29,32,38,39,43,51,52,55,56,57,59,72,128,144,166,191,215,240,245,250,255,259,265,272,277,282,286,307,313,320,61,62,64,65,66,67,68,69,145,146,149,150,151,152,153,154,321,322],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/__init__.py":[50,51,53,54,57,58,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,83,86,88,90],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/interface.py":[15,16,18,19,20,21,22,24,25,28,29,30,32,34,42,50,53,60,69,73,77,81,85,89,93,95,101,109,114,116,117,118,122,123,125,127,145,157,158,159,164,165,166,171,182,185,186,188,193,196,205,217,219,220,223,256,267,278,281,301,302,309,310,377,382,385,389,401,404,417,425,427,430,433,436,455,467,486,489,520,527,531,535,539,543,547,552,312,313,315,328,330,331,337,338,340,61,65,66,67,342,343,347,351,189,190,191,207,211,212,215,226,227,228,229,231,232,234,521,522,525,236,237,239,240,242,243,244,247,249,252,355,373,375,554,556,563,566,571,578,579,580,584,586,588,590,593,601,614,659,668,684,528,511,514,515,518,529,238,685,686,687,669,671,316,317,318,332,348,213,194,356,360,361,362,363,364,366,367,615,616,617,618,620,621,622,624,625,630,632,633,634,585,636,639,643,646,649,651,653,656,333,334,335,62,63,365,320,324,640,641,208,197,198,199,672,674,675,677,678,680,681,253,402,391,394,396,397,399,647,259,260,261,380,262,263,264],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/exceptions.py":[15,17,19,21,22,23,26,31,33,35,39,45,47,49,53,58,60,62,67],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/ro.py":[15,16,18,47,61,64,48,49,50,51,57,58,37,38,39,40,41,42,43,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/declarations.py":[26,27,29,30,31,32,33,35,36,37,38,39,40,43,45,48,51,53,56,60,61,63,66,73,79,84,89,99,114,123,126,129,131,133,145,148,151,176,186,190,194,198,202,214,299,301,315,345,352,379,381,384,397,419,421,424,436,454,486,518,522,524,529,532,534,545,549,551,564,567,603,614,621,623,636,637,640,641,645,648,654,655,661,665,667,685,735,743,744,746,749,753,797,804,819,821,870,872,877,879,891,895,915,64,903,904,906,907,910,913,67,68,69,70,71,917,918,922,923,924,926,929,382,385,386,324,219,220,251,254,255,256,260,212,261,268,269,275,140,141,142,177,143,276,278,279,292,293,295,297,911,908,280,281,283,285,287,288,289,656,657,658,659,325,328,329,330,331,332,333,335,337,338,339,340,341,343,387,776,777,780,784,788,789,557,558,559,525,526,527,560,562,82,422,425,433,310,311,312,313,434,747,750,576,577,586,587,590,591,592,595,600,751,581,582,593,594,598],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/advice.py":[26,28,29,30,31,32,36,38,74,154,159,188],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/_compat.py":[15,16,17,19,36,43,44,46,48,49,51,56,37,39,40],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/interfaces.py":[15,16,18,19,20,23,25,27,29,30,32,38,44,47,51,52,54,55,59,60,62,78,86,87,89,97,105,109,118,128,133,135,141,143,150,152,160,246,248,259,271,277,283,291,294,301,303,308,310,317,321,333,347,358,362,384,386,395,401,423,430,451,458,464,503,513,528,564,596,625,628,653,663,673,675,682,696,704,708,716,720,726,732,736,746,753,759,760,762,763,765,770,772,775,776,778,781,786,788,789,791,792,794,800,807,813,820,827,835,841,847,853,862,864,866,868,870,875,877,879,881,882,883,885,887,889,891,896,898,901,903,905,907,909,911,913,915,920,922,923,926,927,929,930,933,935,937,938,939,941,943,945,946,948,949,951,953,955,956,983,984,1016,1023,1024,1058,1059,1100,1107,1108,1145,1146,1191,1198,1233,1269,1277,1279],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/__init__.py":[43,47,50,51,52,55,58,61,64,67,70,71,74,77,80,83,86,87,90,92,94,99,101,103,105,107,112,114,116,118,122],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_levels.py":[7,9,13,16,17,27,60,62,63,64,65,66,69,89,107,108,109],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/constantly/__init__.py":[4,8,9,10,12,13,14,18,19,20,21,22,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/constantly/_constants.py":[8,10,13,14,16,17,18,20,21,24,34,35,40,48,66,84,102,120,137,141,142,200,160,161,165,166,167,212,214,216,226,242,261,277,285,289,293,294,169,170,171,178,179,187,189,298,305,306,312,316,317,319,339,360,367,368,373,403,411,419,428,441,448,460,465,469,474,475,477,479,36,37,172,176,180,239,181,132,133,182,270,272,273,256,257],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/constantly/_version.py":[7,8,17,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_flatten.py":[9,11,12,14,16,20,24,26,33,67,128,158],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/__init__.py":[6,8,11,12,13,15,16,17,18,21,22,23,24,27,28,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/compat.py":[22,24,26,27,28,29,30,31,32,33,34,36,39,42,44,45,49,52,54,57,61,78,81,100,163,198,199,203,204,210,214,217,220,221,224,225,231,250,251,252,253,269,334,335,336,343,404,430,462,463,478,482,483,491,492,497,501,522,551,561,579,582,583,584,586,588,589,590,592,594,595,596,598,600,601,602,603,604,605,615,616,620,624,627,628,629,653,660,667,669,683,703,726,727,729,731,732,733,734,735,737,738,739,746,762,763,769,795,796,797,804,826,827,831,832,838,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,70,72,73,93,94,95,96,373,375,279,283,290,297,304,311,318,324,325,326,327,328,329,330],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/deprecate.py":[72,74,77,78,79,80,81,82,86,87,88,89,91,92,94,99,127,128,129,132,148,169,207,242,269,312,395,403,415,422,423,427,432,438,464,465,472,481,490,521,540,541,552,568,594,621,656,699,759,613,614,615,466,424,467,433,434,468,469,616,618,584,585,545,546,547,548,549,588,589,590,499,500,428,429,503,505,512,513,516,517,514,501,485,486,487,288,308,292,293,237,238,107,108,112,113,114,194,195,196,197,198,199,200,201,142,144,202,295,303,304,162,163,164,165,251,254,256,257,265,305,306,252,258,261,262,263,264],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/versions.py":[8,10,12,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_format.py":[7,9,11,12,13,14,16,18,22,46,87,124,183,189,190,198,212,244,283,308,344,345,346,347],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/failure.py":[12,14,17,18,19,20,21,22,24,25,27,28,30,31,35,82,86,90,94,113,117,119,132,139,141,154,157,158,164,166,183,200,202,203,211,212,218,380,412,445,464,466,476,479,178,179,494,551,553,559,563,596,609,627,636,642,650,719,726,734,750,752,753,754,773,243,244,245,246,248,251,253,256,261,262,263,267,272,276,290,291,293,297,298,303,305,307,311,313,327,350,373,374,375,603,566,568,571,575,579,581,585,589,592,593,604],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/reflect.py":[8,10,12,13,14,15,16,17,18,19,21,24,25,26,27,28,31,52,93,113,155,168,176,180,200,203,207,210,214,218,222,226,230,261,325,363,371,379,391,415,431,454,458,459,462,467,475,487,524,536,540,544,548,554,558,620,622,624,625,626,627,628,629,632,634,367],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/_oldstyle.py":[7,9,11,12,14,18,49,61,83,29,45,84,31,32,39,43,41,57],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/_tzhelper.py":[7,9,12,13,18,27,29,43,73,92,99,107,119,64,65,68,70,39,40],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_logger.py":[7,9,11,12,13,17,31,33,47,76,107,111,147,193,209,225,241,257,274,63,64,41,42,66,67,69,70,73,71,275],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_global.py":[8,10,11,13,14,16,17,18,19,20,21,22,23,28,35,78,80,84,120,194,239,240,94,95,96,97,98,99,100,101,102,103,104,105,106,112,115,116],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_buffer.py":[7,9,11,13,16,20,21,36,38,47,51,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_observer.py":[7,9,11,12,17,22,29,31,70,71,77,79,84,96,108,144,80,81,90,92,93],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_filter.py":[7,9,11,13,15,16,20,38,39,40,41,45,48,50,59,96,97,101,105,125,138,139,145,147,157,191,210,218,152,153,154,214,215,120,121,122],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_io.py":[7,9,11,15,26,28,31,56,67,78,89,100,118,125,132,142,152,173,185,195,196,197,198,199,200,201,202,44,45,47,50,52,53],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_file.py":[7,9,11,12,13,14,15,19,20,23,24,43,64,34,37,39,40],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_stdlib.py":[7,9,11,13,14,15,16,22,23,24,25,26,29,41,35,36,37,38,39,45,46,63,65,67,81,103,120,124,125,133,137,140,141],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_legacy.py":[7,9,11,12,13,14,18,19,26,28,37,44,97],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/logger/_json.py":[7,9,11,12,13,15,16,17,18,20,21,23,27,48,73,105,109,110,111,115,116,117,123,124,129,148,171,211,226,257],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/base.py":[7,9,11,12,14,15,16,18,20,26,27,32,33,34,35,36,40,43,44,49,50,53,79,88,107,130,150,154,164,174,184,229,230,240,242,247,252,258,273,297,298,301,312,340,341,348,367,380,396,417,437,453,454,455,484,486,488,489,490,491,492,494,496,525,527,532,547,561,570,579,586,590,594,598,602,607,612,617,630,642,655,666,677,688,698,705,713,723,730,739,762,771,773,786,806,810,823,833,863,928,999,1000,1002,1004,1006,1011,1023,1035,1038,1057,1066,1073,1085,1086,1089,1090,1095,1096,1097,1099,1105,1112,1126,1135,1143,1148,1158,1166,1173,1177,1179,1180,1182,1189,1196,1210,1212,1214,1235,1249,1265,1270,1288,497,498,499,500,501,502,503,504,505,507,508,509,514,515,716,717,718,342,343,344,345,719,720,361,363,364,516,517,519,520,1007,555,556,557,558,1008,521],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/interfaces.py":[8,10,12,15,20,24,29,31,36,44,49,58,59,87,93,95,98,101,108,114,116,124,137,145,151,154,191,192,215,237,259,281,303,325,347,369,391,413,435,457,479,501,523,545,567,589,611,633,655,677,699,729,731,753,778,780,801,820,823,825,844,867,870,872,893,913,918,920,935,946,949,951,974,980,983,1001,1034,1036,1067,1100,1136,1138,1139,1233,1236,1238,1246,1266,1276,1282,1284,1291,1301,1313,1327,1335,1341,1343,1359,1365,1367,1375,1380,1382,1391,1399,1402,1404,1405,1409,1414,1421,1427,1437,1452,1460,1495,1511,1531,1538,1540,1553,1557,1559,1563,1566,1579,1589,1591,1600,1610,1616,1618,1629,1640,1647,1654,1664,1673,1683,1686,1688,1697,1705,1713,1717,1719,1727,1730,1732,1745,1765,1770,1772,1782,1787,1789,1799,1802,1805,1808,1810,1815,1821,1824,1826,1839,1842,1844,1872,1878,1890,1896,1898,1907,1914,1916,1923,1931,1935,1937,1947,1949,1966,1979,1984,1997,2000,2002,2012,2025,2035,2049,2063,2071,2073,2088,2098,2106,2108,2125,2131,2132,2144,2147,2149,2163,2168,2174,2185,2187,2200,2212,2220,2232,2241,2244,2246,2258,2270,2275,2283,2288,2297,2302,2309,2312,2313,2336,2349,2351,2365,2376,2378,2392,2400,2402,2414,2422,2424,2436,2441,2443,2462,2465,2467,2474,2478,2479,2489,2494,2497,2498,2499,2504,2507,2508,2523,2526,2528,2529,2534,2539,2544,2549,2555,2573,2578,2597,2600,2602,2609,2614,2620,2623,2625,2637,2650,2658,2666,2674,2683,2686,2688,2693,2699,2702,2704,2709,2714,2720,2723,2725,2730,2737,2742,2747,2752,2757,2765,2771,2777,2779,2792,2798,2800,2812,2818,2820,2826,2830,2842,2857,2859,2865,2869,2894,2900,2902,2906],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/fdesc.py":[8,10,11,12,13,18,21,30,39,44,53,62,97,118,25,26,27,48,49,50],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/main.py":[11,13,15,17,18,22,37,29,30,31,33,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/error.py":[6,8,10,12,13,17,18,20,29,38,39,45,52,55,59,60,62,71,72,74,83,84,89,90,92,96,107,108,112,113,117,118,122,123,127,128,132,133,137,138,142,143,147,148,152,153,157,159,163,165,169,172,176,177,179,180,181,183,191,212,215,219,220,222,231,237,241,242,244,253,262,266,267,271,272,274,283,284,286,295,301,303,310,311,312,313,314,318,319,321,329,336,337,363,367,371,372,374,383,384,386,395,398,401,404,408,411,414,417,421,428,430,440,444,448,452,456,460,463,467,471,478,480,494,495,496,497,498,499,500,501,502,503,504,505,506],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/abstract.py":[7,9,11,13,16,17,18,20,23,35,72,73,74,75,77,87,116,126,127,132,134,147,157,158,159,160,161,168,169,170,171,172,173,174,175,177,179,192,211,225,235,292,300,304,308,313,327,340,359,387,412,416,424,432,437,450,451,453,465,469,472,476,486,531,546],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/defer.py":[17,19,21,22,23,24,25,26,27,30,31,32,33,34,36,39,40,44,47,50,53,57,71,94,113,130,164,165,171,176,187,195,196,200,244,246,247,248,249,254,258,260,262,295,315,325,336,348,410,438,463,504,511,522,551,571,579,714,728,731,735,736,755,756,759,800,845,868,922,926,928,930,943,968,969,979,980,986,994,1003,1020,1041,1043,1044,1047,1103,1124,1147,1155,1189,1190,1195,1199,1201,1212,1219,1275,1276,1343,1344,1349,1366,1367,1376,1378,1379,1383,1496,1534,1538,1542,1619,1620,1624,1629,1662,1669,1671,1674,1689,1707,1725,1739,1741,1753,1768,1784,1801,1802,1806,1807,1811,1827,1829,1836,1851,1865,1886,1890,1894,1910,1911,1912,1913,1916,1930,1996,1997,1998,1999,2000,2001,2002,2003,1601,1614],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/__init__.py":[1,3,5,6,7,8,21,23,24,25,26,27,29,30,32,33,36,37,38,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/converters.py":[3,5,7,10,29,21,26],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/_make.py":[1,3,4,5,6,7,8,10,12,13,21,31,32,33,35,37,41,43,46,51,53,55,60,64,56,57,58,71,72,73,74,75,76,77,78,79,80,81,82,222,252,253,256,258,260,232,234,235,237,238,239,240,244,245,247,265,276,292,299,424,431,438,441,456,459,495,498,509,557,653,659,672,676,685,700,711,745,962,969,985,993,1000,1065,1073,1086,1091,1194,1208,1211,1260,1271,1311,1339,1367,1384,1388,1395,1675,1684,1697,1713,1753,1756,1766,1767,1796,1807,1816,1822,1837,1846,1847,1716,1720,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1746,1747,1750,1751,1850,1851,1264,1267,1215,1217,1257,1268,1198,1201,1202,1092,1095,1096,1221,1222,1223,1224,1225,1227,1229,1230,1231,1232,1233,1243,1244,1245,1246,1247,1248,1249,1252,1251,61,1253,1255,1097,1099,1100,1101,1105,1106,1107,1108,1109,1110,1112,1116,1117,1118,1119,1120,1125,1126,1127,1128,1130,1131,1133,1139,1152,1165,1178,1191,1205,1852,1069,1001,1002,1003,1004,1007,1010,1011,1012,1013,1015,1017,1032,1045,1023,1024,1027,1028,1030,1047,1048,1049,1050,1051,1056,1057,1058,1059,1062,1070,1856,1863,1876,1878,1879,1889,1891,1892,1893,1894,1895,1896,1897,1898,1899,1902,1904,1934,1948,1966,1265,1199,1969,890,956,957,1970,1983,1985,176,181,195,205,206,208,209,210,211,212,213,214,215,216,217,218,1917,1918,1919,1921,1924,1925,1926,1927,1928,1929,1930,1931,1932,1986,1988,892,895,897,898,899,900,901,902,903,904,905,906,471,472,307,308,280,281,282,310,315,345,347,348,351,349,355,358,1769,1770,1775,1777,1778,1784,1787,1788,1789,1790,1791,1792,361,362,363,366,378,380,382,386,388,389,390,392,393,403,404,412,418,421,475,476,477,478,479,480,481,482,990,483,484,485,486,487,489,491,909,910,654,655,715,716,720,721,722,727,657,911,913,914,701,706,709,916,921,929,933,677,678,679,683,943,946,952,504,505,561,562,564,565,568,571,576,578,579,580,581,583,587,588,590,592,593,594,597,598,601,607,609,625,626,629,637,638,643,645,646,647,648,651,1997,2054,2055,2058,2060,2062,944,686,687,688,689,690,691,692,693,694,1274,1277,1278,1279,1281,1282,1406,1407,1408,1392,1410,1473,1479,1487,1488,1489,1493,1494,1496,1497,1499,1500,1501,1502,1505,1506,1547,1562,1599,1602,1603,1609,1474,1475,1476,1611,1614,1625,1633,1647,1652,1653,1667,1668,1670,1671,1284,1285,1286,1287,1289,1294,1299,1300,1301,1302,1305,1306,1308,698,2067,243,1114,507,513,514,517,518,532,533,540,555,405,409,411,1498,1548,1549,1551,1554,1555,1561,1615,1616,1617,1618,1619,1620,1621,1623,1624,959,930,935,941,673,674,520,521,523,524,394,922,1604,1480,1481,1482,1483,1484,1607,1507,1527,1539,1540,1541,1542,1543,1993,1994,1563,1564,1567,1568,1569,1571,1572,1588,1589,1590,1591,1592,1593,1594,1597],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/_config.py":[1,4,6,9,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/_compat.py":[1,3,4,5,6,9,10,13,14,21,101,103,115,118,120,123,127,136,159,140,146,147,131,133,149,150,151,156,124,121],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/exceptions.py":[1,4,12,14,15,18,23,26,31,34,40,43,49,52,57],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/filters.py":[3,5,7,8,11,21,38],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/validators.py":[3,5,7,10,13,14,15,17,35,41,57,58,59,61,76,82,98,99,100,102,108,114,132,133,134,136,149,155,173,174,175,182,186,199,200,201,196,202,203,127,129,206,216,183,109,110,231,246,247,248,249,250,252,263,269,170,150,151],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/attr/_funcs.py":[1,3,5,6,7,12,13,14,15,85,118,119,120,121,215,227,265],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/lockfile.py":[8,10,12,13,15,17,18,20,23,25,26,27,28,29,30,121,138,140,141,143,147,209,227,248],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/runtime.py":[5,7,8,9,10,12,16,25,26,27,28,29,36,41,45,47,48,49,51,59,69,79,89,107,118,131,141,170,197,211,232,52,55,233,76,234,115,204,205,206],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/threads.py":[8,10,12,13,16,18,19,22,58,75,83,93,126,127],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/_resolver.py":[9,11,13,15,18,20,22,23,24,25,26,27,28,31,32,35,37,45,48,49,50,54,55,59,60,64,65,70,71,75,77,101,142,143,146,148,150,158,206,207,210,212,221,230,242,252,253,256,257,266,94,95,96,97,263],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/address.py":[6,8,10,11,13,14,15,16,17,18,21,22,23,36,37,38,39,43,44,45,66,67,68,69,70,71,75,76,79,83,84,85,94,96,97,101,102,103,109,111,113,114,141,147,154,168,169,171],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/filepath.py":[7,9,11,12,13,14,16,17,18,20,21,22,23,25,31,32,33,34,36,37,38,40,44,45,49,62,63,64,68,95,96,98,110,118,123,131,139,147,155,164,172,180,188,197,202,213,216,220,224,228,238,239,250,258,262,277,285,287,298,314,381,412,426,444,476,484,491,498,506,522,523,524,530,535,554,569,571,573,582,587,600,605,606,610,631,653,668,669,670,726,727,728,731,740,751,762,774,786,800,814,828,863,883,903,934,960,974,990,1016,1036,1045,1057,1072,1086,1100,1114,1135,1159,1185,1205,1225,1241,1259,1276,1293,1310,1327,1342,1354,1369,1381,1385,1401,1416,1437,1457,1469,1481,1492,1545,1551,1562,1575,1590,1615,1617,1690,1737,1759,1760,1761,1762,1763,1766],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/win32.py":[12,14,16,17,21,22,23,24,26,28,32,34,35,36,37,40,41,42,57,70,84,85,90,108,111,136,95,96,97,98,99,100,101,102,103,104,105,106,107,86,87,88],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/util.py":[5,7,8,9,12,13,17,18,19,20,23,25,26,27,28,29,33,41,48,58,63,70,78,87,94,97,105,112,119,126,137,147,155,163,168,173,178,184,189,193,197,205,220,244,258,266,278,296,344,353,358,387,408,437,444,445,456,464,467,472,476,480,488,500,517,519,532,537,538,545,556,559,568,581,598,600,603,616,620,627,628,630,640,648,650,656,664,684,730,733,734,736,741,745,749,753,757,761,765,769,773,777,781,785,789,793,798,823,851,898,921,944,985,1011,1012,1013,1014,1015,1016,1017,1021,1022,1023,1024,1025,1026,1027],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/_idna.py":[8,10,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/log.py":[7,9,11,12,13,15,17,19,20,21,22,23,24,25,26,34,35,39,46,50,56,57,79,80,83,90,111,140,143,147,148,158,162,164,167,168,190,201,217,227,240,251,289,293,294,313,314,315,316,169,173,175,176,177,178,184,185,186,187,320,309,311,310,332,344,359,369,418,460,464,466,473,481,487,489,491,497,512,544,567,575,577,585,599,609,611,612,613,614,616,624,628,632,636,639,640,641,642,645,655,663,677,688,692,693,695,701,710,716,723,733,734,735,736,737,738,739,743,749,750,752,766,767],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/context.py":[13,15,17,19,22,24,26,60,61,65,90,110,111,114,121,124,128,137,112,133,134,135],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/threadable.py":[8,10,12,14,17,19,24,29,33,43,48,60,76,103,104,111,118,125,126,128,129,132,133,137,83,84,85,86,88,89,92,99,141,68,69,70,71,49,56,72],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/posixbase.py":[7,9,11,12,13,14,16,18,19,20,21,26,27,30,31,34,35,36,37,38,39,40,41,43,45,46,47,48,49,52,60,66,67,69,87,96,104,110,123,124,126,127,129,141,148,162,167,169,185,186,192,198,199,203,210,217,232,235,238,239,262,263,264,270,274,276,289,290,309,328,329,330,363,374,388,394,404,418,432,434,441,462,479,493,498,505,519,534,557,570,572,631,632,652,655,656,657,660,667,685,695,703,711,722,734,746,753,760,774,789,791,792,793,794,795,796,798,661,662,663,664,283,284,132,133,134,135,136,137,138,285,286],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/udp.py":[16,18,21,22,23,24,26,28,29,47,48,49,50,53,54,55,56,60,61,62,63,80,82,83,84,86,87,89,120,159,165,171,182,216,221,254,314,330,343,349,358,363,380,388,401,408,422,433,445,449,451,456,461,467,471,476,480,485,490,494,507,513,514,517,520,528],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/tcp.py":[9,11,13,14,15,16,17,19,21,23,24,25,26,28,31,35,37,38,41,42,45,46,49,68,69,70,71,72,73,74,75,76,77,78,79,81,84,87,88,89,90,91,92,93,96,100,103,123,131,139,144,145,147,173,179,180,182,200,201,202,211,214,222,227,246,262,283,298,311,330,332,337,340,343,347,353,403,405,406,408,432,456,477,498,506,524,540,542,543,545,557,566,576,630,660,662,687,713,715,717,753,762,771,777,782,786,799,800,802,804,831,838,878,888,898,921,923,933,944,951,963,964,965,973,974,976,977,980,991,1008,1019,1031,1032,1035,1037,1047,1053,1061,1099,1102,1120,1124,1125,1136,1137,1138,1139,1141,1151,1165,1237,1238,1272,1274,1276,1277,1278,1279,1281,1285,1289,1291,1292,1293,1295,1308,1332,1339,1346,1389,1392,1457,1472,1474,1481,1500,1506,1516,1525,1526,1528,1541,1551],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/_newtls.py":[11,13,15,16,18,19,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/protocols/__init__.py":[6,9,10,12,13,14,15,18,19,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/protocols/tls.py":[37,39,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/task.py":[7,9,11,13,14,15,17,19,20,21,22,23,25,26,27,30,59,61,62,63,64,65,66,68,75,90,147,150,166,199,211,225,244,279,295,301,305,309,313,317,321,324,328,331,335,339,343,347,351,352,353,357,362,363,368,402,404,418,438,453,466,490,501,510,532,563,566,567,568,595,615,627,640,651,665,675,676,684,695,710,722,586,587,588,589,590,591,592,724,738,757,763,765,767,771,783,790,804,811,829,840,871,941,943,945,947],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/protocol.py":[10,12,14,15,17,18,19,20,23,24,31,34,36,37,39,60,67,81,99,112,125,146,152,154,164,174,185,194,196,197,199,205,209,220,230,240,260,262,269,296,312,328,346,366,367,368,373,380,382,383,384,385,386,387,389,392,398,404,443,459,470,486,489,493,501,502,503,505,517,529,530,533,534,550,552,560,575,587,588,590,594,598,602,603,607,608,610,614,618,622,626,627,631,632,636,638,645,651,657,666,672,678,684,692,702,706,708,709,710,712,718,731,746,754,762,774,784,785,793,795,803,813,818,820,827,836,837,844,846,847,848,849,851,855,862,869,879,883,888,892,900,906,912,916,921,926,930,931,932,933],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/components.py":[29,31,34,35,38,39,40,45,48,50,74,89,109,119,98,99,105,106,122,129,131,147,151,152,154,159,168,175,186,188,190,193,196,203,213,219,241,245,259,292,296,297,300,308,344,359,360,365,380,393,394,399,410,418,428,429,430,58,59,63,66,67,68,70,71,64,332,334,335,336,395,396,337,338,339,340],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/zope/interface/adapter.py":[15,16,18,19,20,21,22,24,25,27,29,34,38,40,87,92,93,96,101,105,140,159,207,234,294,300,301,303,308,313,326,348,361,364,380,395,409,411,412,417,423,428,433,437,441,445,447,448,453,455,461,492,497,509,516,524,547,558,576,579,602,616,617,619,620,622,624,631,634,638,649,656,657,659,660,662,664,670,688,700,627,629,55,59,63,79,97,456,457,458,493,494,459,98,99,85,639,640,643,647,88,89,90,650,102,103,462,463,467,652,141,665,668,142,143,144,145,146,106,108,112,113,114,115,116,117,118,119,121,122,123,124,125,126,128,131,133,134,135,136,498,499,500,505,502,506,138,148,149,151,152,153,154],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/ssl.py":[54,56,59],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/unix.py":[11,13,15,16,17,18,19,21,23,26,27,28,29,30,31,34,35,41,51,52,69,71,72,74,78,102,111,155,194,225,229,233,234,240,242,244,248,282,285,290,303,304,314,315,316,318,319,322,329,348,356,359,411,419,428,429,430,431,432,434,445,448,452,453,458,461,465,466,469,471,473,480,488,503,521,538,543,544,545,548,550,557,566,578,600,623],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/sendmsg.py":[7,9,11,12,14,16,21,23,27,54,94],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/process.py":[11,13,15,17,21,22,23,24,25,26,27,28,29,31,32,36,37,41,43,44,45,46,47,48,49,53,55,57,68,92,104,128,114,115,116,117,121,122,123,124,132,144,145,146,147,149,181,188,201,206,237,251,257,258,260,272,279,287,294,298,306,316,319,320,321,323,354,365,387,399,501,508,526,535,549,551,552,553,555,561,573,603,613,622,644,557,558,646,655,656,668,669,670,672,673,675,676,680,781,874,878,887,893,899,906,910,914,920,930,943,950,960,964,976,991,992,995,997,998,1001,1049,1098,1104,1108,1112,1121,1128,1139,1149],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/_baseprocess.py":[8,10,11,12,13,15,20,21,22,23,24,26,30,44,55],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/_signals.py":[33,35,37,40,64],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/endpoints.py":[13,15,17,18,19,20,21,23,24,26,28,29,30,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,55,57,58,64,65,67,68,69,70,71,72,73,74,75,79,83,85,103,112,121,128,135,142,150,158,167,179,180,182,192,200,225,232,239,257,267,268,275,277,279,286,296,297,298,304,308,309,310,318,322,330,332,344,355,371,388,396,397,398,402,403,410,411,412,413,433,454,455,458,460,479,492,495,496,513,516,517,534,535,538,540,565,580,581,594,596,597,598,599,601,615,630,639,653,654,664,665,667,678,723,724,750,751,752,753,756,799,820,845,891,1028,1046,1047,1050,1053,1076,1089,1090,1093,1096,1125,1141,1142,1145,1146,1163,1175,1176,1179,1180,1201,1218,1219,1226,1227,1228,1230,1246,1266,1293,1327,1412,1413,1418,1419,1421,1431,1438,1439,1447,1448,1450,1452,1480,1488,1489,1494,1495,1497,1518,1525,1526,1527,1530,1532,1575,1608,1609,1610,1614,1615,1616,1620,1649,1662,1736,1772,1812,1841,1857,1883,1922,1953,1979,1980,1981,1986,2071,2094,2095,2098,2100,2108,2118,2119,2122,2124,2132,2142,2175,2231,2232,2239,2240,2242],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/stdio.py":[23,25,27,29,35,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/_posixstdio.py":[12,14,16,17,20,21,22,25,26,27,29,30,31,32,34,47,51,55,59,68,71,76,79,92,113,127,140,146,151,154,158,162,166],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/plugin.py":[11,13,15,16,18,20,31,24,25,27,28,29,33,34,35,36,37,41,48,52,53,60,65,68,77,81,97,98,105,115,116,126,199,226,229,259],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/modules.py":[57,59,61,64,66,67,68,69,71,73,74,75,76,77,80,82,83,84,87,89,104,113,118,120,176,188,195,203,213,235,246,257,258,273,276,286,295,299,310,312,328,331,338,347,367,374,398,406,414,419,425,447,455,456,463,466,469,472,476,477,490,492,493,495,498,500,501,504,527,531,541,559,562,563,564,565,566,567,618,624,626,658,678,689,729,743,749,757,766,606,608,609,610,611,612,613,614,615,768,776,785],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/zippath.py":[9,11,13,14,15,17,19,20,21,22,24,26,30,31,32,35,37,57,64,72,83,90,107,111,115,119,123,127,139,149,153,159,164,168,178,188,201,212,223,224,226,253,263,270,277,284,291,295],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/systemd.py":[10,12,14,16,19,34,35,37,45,46,85,61,62,63,64,66,68,69,70,71,82,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/web/__init__.py":[12,14,15,17,18,20,21,22,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/web/http.py":[26,28,31,32,34,35,37,38,39,40,41,42,44,45,46,48,50,51,53,54,59,60,61,62,63,64,65,66,67,69,70,74,75,78,89,92,94,95,96,97,98,99,100,101,102,103,104,106,108,110,111,113,114,115,118,140,144,146,150,153,157,158,159,160,161,162,164,193,219,236,252,273,329,341,362,381,384,386,387,390,391,395,405,416,426,432,449,462,475,485,489,490,492,494,499,518,519,520,521,522,524,527,533,537,553,595,598,609,612,615,625,630,636,650,654,657,658,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,715,742,771,785,801,823,832,920,936,947,960,970,986,993,1037,1067,1143,1236,1254,1268,1278,1315,1348,1362,1380,1390,1425,1440,1457,1479,1498,1515,1532,1546,1553,1574,1595,1605,1606,1607,1608,1610,1611,1614,1621,1625,1634,1638,1644,1648,1663,1664,1670,1702,1723,1760,1761,1763,1769,1788,1797,1807,1819,1825,1836,1848,1849,1854,1855,1865,1875,1885,1893,1894,1895,1896,1999,2001,2002,2003,2005,2006,2007,2008,2009,2012,2014,2015,2016,2017,2018,2019,2020,2021,2022,2024,2032,2040,2114,2119,2169,2193,2214,2223,2236,2280,2306,2319,2336,2347,2362,2388,2400,2412,2421,2430,2442,2484,2500,2513,2549,2569,2577,2593,2618,2650,2651,2660,2661,2666,2670,2671,2685,2693,2701,2711,2724,2755,2756,2757,2758,2759,2760,2761,2764,2772,2778,2788,2803,2813,2828,2836,2851,2860,2873,2916,2924,2945,2947,2949,2951,2953,2954,2989,2997,3013,3026,3037,3045],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/internet/_producer_helpers.py":[7,8,10,12,13,14,15,19,22,23,46,48,51,56,84,93,106,113,120],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/protocols/policies.py":[9,11,14,16,19,20,21,22,25,39,49,51,53,58,66,80,84,88,93,97,101,105,109,113,119,123,131,134,136,138,143,150,155,160,164,168,172,176,183,191,194,198,203,208,213,218,223,227,231,236,242,248,250,252,253,267,277,284,291,304,315,324,334,343,353,368,383,384,388,394,395,399,401,403,406,414,421,433,434,435,436,438,455,458,463,466,468,483,498,513,521,526,531,536,541,552,555,556,559,564,569,580,583,602,607,614,619,624,630,635,640,646,647,649,651,657,661,668,676,685,686,688,690,700,715,741,745],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/protocols/basic.py":[8,10,13,14,15,16,18,21,22,23,28,29,38,42,44,47,51,54,57,119,120,121,123,126,128,131,133,137,139,152,166,188,202,212,228,245,262,286,305,324,334,355,378,391,401,412,421,433,434,435,436,438,459,469,479,488,489,491,496,502,508,524,525,526,527,528,529,531,542,586,603,612,619,629,639,653,657,661,676,677,682,703,705,706,707,711,713,724,736,786,803,811,812,813,817,825,826,827,831,839,840,841,845,858,860,862,884,892,894,896,897,899,927,945,949],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/web/iweb.py":[11,13,15,16,19,24,26,27,28,30,31,32,33,39,40,43,44,48,49,52,65,71,81,93,101,115,127,138,149,164,175,182,190,197,204,210,218,228,234,247,255,277,299,317,320,321,336,340,341,358,366,367,368,372,386,405,425,434,439,441,453,464,468,470,484,497,501,503,513,518,520,521,526,529,530,533,536,537,544,545,548,549,554,577,587,593,595,607,618,623,625,633,638,639,640,644,645,649,650,655,693,694,729,737,739,760,767,769,787,790,791,792,794],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/cred/__init__.py":[7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/cred/credentials.py":[9,11,13,15,16,17,18,19,21,22,24,25,26,27,28,32,38,42,46,47,58,70,72,88,103,105,121,124,128,129,132,134,141,164,189,207,209,210,219,221,223,229,249,259,267,287,349,395,396,408,409,410,411,413,417,433,437,441,447,450,454,459,462,466,471,473,477,497,501,503],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/python/randbytes.py":[7,9,11,13,15,17,18,24,27,31,34,38,45,48,50,53,63,92,103,104,105,120,123,141,143,145,147,150],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/cred/_digest.py":[9,11,13,14,21,30,32,37,83,107],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/cred/error.py":[6,8,11,12,16,19,23,25,29,34,38,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/web/http_headers.py":[7,9,11,14,28,29,49,51,52,53,54,55,56,57,59,66,73,85,101,116,134,151,160,173,185,206,226,250,260,275],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/web/_http2.py":[15,17,19,20,21,23,25,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/web/_responses.py":[7,9,11,12,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,50,51,52,53,54,55,56,57,61,62,65,66,67,68,69,70,71,72,75,76,77,78,79,80,82,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,105,106,107,108,109,110,111,112],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/daphne/http_protocol.py":[1,2,3,4,6,7,8,9,10,12,14,17,24,44,45,47,48,49,52,66,196,206,218,286,292,310,319,327,351,354,358,359,365,367,371,385],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/daphne/utils.py":[1,3,6,18,31],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/daphne/ws_protocol.py":[1,2,3,4,6,11,13,15,18,22,24,27,29,98,118,127,141,157,180,203,216,224,245,257,266,272,292,295,298,302,307,309,311,315],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/__init__.py":[27,29,31],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/_version.py":[27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/twisted/__init__.py":[28,30,31,33,35,40,41,44,51,58,83,86,89],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/twisted/util.py":[27,29,31,32,33,34,39,40,41,48,52,72,94],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/twisted/choosereactor.py":[27,29,30,32,33,35,36,41,45,56,177],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/txaio/__init__.py":[27,29,30,32,39,55,57,99,103,106,118,130,146,147,135,136,137,139,140,138,108,110,111,112,113,114,115],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/txaio/_version.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/txaio/interfaces.py":[27,29,30,34,35,36,37,38,39,40,44,45,70,72,84,85,118,140,143,146,149,152,155,159,160,176,178],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/txaio/_unframework.py":[31,33,34,36,37,38,41,49,50,51,52,53,54,55,56,57,58,59,60,61,63,65,66,67,69,71,72,73,74,76,78,79,81],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/txaio/tx.py":[27,29,30,31,32,34,36,37,38,39,41,43,44,45,46,48,50,51,52,53,54,55,59,60,62,63,71,72,73,74,76,78,80,81,83,84,85,86,134,138,142,159,161,175,183,192,203,211,242,245,251,271,272,277,279,280,281,282,283,284,287,293,303,332,368,371,373,376,389,396,408,419,422,425,431,434,437,464,467,470,480,483,495,509,530,541,554,565,569,374,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,255,256,261,262,265,266,267,163,165,166,168,171,215,217,218,219,221,229,231,234,235,237,238,222,223,224,225,240,173,268],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/txaio/_iotype.py":[27,29,31,32,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/txaio/_common.py":[2,3,6,12,14,20,24,28,38,41,53,77,113],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/twisted/websocket.py":[27,29,31,33,34,36,37,38,41,42,43,44,45,46,48,74,78,81,83,85,87,105,134,137,144,147,150,153,156,159,162,165,168,171,174,177,188,195,196,201,203,205,212,213,218,220,222,225,229,236,239,242,243,248,250,268,269,274,276,294,295,313,315,333,336,348,351,360,365,369,373,378,381,384,387,390,393,401,437,444,448,453,456,464,503,511,512,555,556,591,592,599,602,603,606,608,610,633,634,641,644,645,648,650,652],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/util.py":[27,29,30,31,32,33,34,35,36,37,38,39,40,42,44,46,47,48,49,50,70,73,87,88,79,80,84,138,170,171,190,201,215,217,220,233,271,274,294,314,336,341,358,359,422,434,446,461,473,476,488,495,497,511,524,540,556,571,574,576,585,594,628,643,649,652,656,664,666,686,699,718,721,733,734,735,737,744,757,775,803,827,836,837,839,842,846,856,81,83],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/__init__.py":[27,29,41,50,52,82],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/types.py":[27,29,31,33,53,57,58,62,70,73,119,123,124,127,130,131,134,142,145,180,184,185,188,192,195,210,214,215,218,222,225,241,245,246,249,261,264,319,323,324,329,341,344,384,399,403,404,417,422,425,445,448,456,481,507,508,513,514,515,519,522,537,544,548,549,553,563,568,606,620,624,625,629,640,644,705,709,710,714,730,747,819,857,861,862,866,877,882,920,940,944,945,949,959,963,1019,1023,1024,1027,1036,1046,1079,1096,1100,1101,1105,1111,1114,1141,1145,1146,1149,1155,1158,1184,1187,1189,1195,1198,1200,1205,1210,1233,1236,1238,1243,1248],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/request.py":[28,42,46,50,52,54,66,70,73,75,77,98,107,111,114,116,118,135,138,140,142,163,172,175,177,179,196,200,202,204,217,220,222,224,240,243,245,247,267,270,272,274,281,284,286,288,305,308,311,314,316,318,326,329,331,333],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/exception.py":[27,29,31,32,42,46,47,50,53,54,58,61,62,66,69,70,75,78,79,83,86,87,91,93,99,104,110,116,122,127,132,137,146,152,158,163,169,176,182,187,193,200,205,210,216,223,229,234,239,250,263,272,279,280,283,286,287,290,293,294,297],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/uri.py":[28,30,32,34,35,42,46,93,94,105,107,108,109,111,112,113,115,120,128,136,232,233,243,244,254,264,290,300,310,321,322,348,349,368,373,379,374,375,376,377,149,150,151,152,153,154,156,159,161,162,163,164,165,166,168,169,193,194,204,205,206,207,217,225,226,227,228,229,230,378],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/interfaces.py":[27,28,30,39,43,44,45,50,52,53,60,61,73,74,87,88,89,92,94,95,101,102,108,109,121,122,139,140,141,143,145,146,154,155,156,167,168,182,183,190,191,192,196,198,199,214,215,224,225,233,234,243,244,289,290,291,293,294,302,303,314,315,326,327,337,338,339,342,344,345,352,353,373,374,380,381,390,395,396,407,408,423,424,435,436,437,452,453,462,463,469,470,476,477,483,484,490,491,505,506,518,519,520,532,533,569,570,571,613,614,650,651,652,688,689,691,699,711,712,713,728,730,731,732,755,756],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/websocket.py":[27,29,31,32,33,34,39,42,45,47,49,53,67,83,107,129,135,144,154,157,169,172,174,176,195,198,200,202,218,221,223,286,289,292,295],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/__init__.py":[28,30,32,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/types.py":[27,29,31,32,41,45,46,51,62,65,115,126,130,131,136,143,146,171,178,182,183,188,190,192,221,222,226,228,230,235,240,245,250,255,260,265,270,286,289,291,294,297,299,301,319,322,324,326,352,355,357,359],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/interfaces.py":[27,28,30,36,39,40,41,46,48,54,75,76,82,104,105,130,210,211,218,219,220,225,227,234,262,263,270,295,296,316,380,381,388,389,390,397,399,400,420,421,428,429,442,443,456,457,458,470,471,487,488,499,509,510,521,531,534,536,545,555,562,563,576,577,593,601,604,606,616,626,634,643,644],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/protocol.py":[27,29,30,31,32,33,34,35,36,37,38,40,41,43,45,49,51,52,53,54,55,56,57,59,60,62,65,72,75,104,152,154,157,178,220,224,229,231,253,298,302,304,308,317,350,353,356,360,369,371,373,380,385,390,396,402,408,413,418,426,427,428,429,430,433,434,435,436,441,444,447,450,453,456,459,462,465,468,471,474,477,480,483,486,489,490,491,492,493,494,495,496,497,498,499,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,522,523,524,525,526,527,528,529,530,531,532,533,538,539,540,541,542,543,548,552,558,566,587,604,613,620,632,642,653,662,673,772,788,811,827,837,861,888,908,930,944,1060,1107,1118,1130,1148,1169,1184,1226,1232,1238,1247,1278,1315,1324,1569,1610,1649,1687,1760,1851,1865,1885,1899,1942,1971,1996,2084,2127,2149,2168,2246,2279,2280,2281,2284,2289,2291,2358,2363,2365,2425,2428,2431,2433,2435,2437,2457,2468,2478,2481,2840,3013,3023,3034,3048,3059,3071,3076,3078,3080,3085,3091,3092,3093,3094,3095,3129,3157,3225,3313,3322,3325,3327,3329,3331,3341,3358,3367,3381,3460,3468,3539,3759,3772,3777,3779,3781,3786,3792,3793,3794,3795,3796,3797,3828,3849,3898],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/utf8validator.py":[31,49,52,53,57,58,60,67,69,74,76,82,87,90,96,115,123],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/xormasker.py":[27,29,32,37,42,44,45,48,50,52,54,57,60,63,66,70,72,74,79,82,85,96,98,100,117,120,123,135],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/compress.py":[27,29,36,47,48,49,50,51,52,53,54,55,56,57,63,64,65,66,67,68,74,75,79,88,89,90,91,92,94,96,97,98,99,100,104,106,107,108],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/compress_base.py":[32,36,39,42,45,48,51,54,57,60,63],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/compress_deflate.py":[27,29,31,32,44,48,51,53,58,64,68,71,72,76,78,167,200,218,231,241,242,246,255,320,338,356,366,367,370,372,440,461,474,484,485,489,496,538,551,562,565,566,567,569,583,602,617,626,629,640,643,647,655,660],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/compress_bzip2.py":[27,29,31,43,47,50,52,57,60,63,67,69,117,136,150,161,171,175,180,213,227,239,249,252,254,302,308,319,329,333,337,359,370,380,383,384,386,393,400,411,417,420,428,431,440,444,447],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/websocket/util.py":[27,29,31,32,41,46,48,49,50,51,52,53,57,61,62,124],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/twisted/wamp.py":[27,29,30,31,32,34,35,37,39,41,42,44,45,47,50,51,52,56,57,58,59,60,63,67,68,75,76,84,86,89,92,94,99,102,103,110,112,126,195,207,208,426,429,431,443,451,464,472,480,484,486,488,509,523,535,599,635,668,686,689,700,701,703,734,768,772,775,778,781,784,789,791,825,829,832,834,852,869],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/rawsocket/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/rawsocket/util.py":[27,29,31,41,46,48,49,50,51,52,53,57,61,62,106],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/twisted/rawsocket.py":[27,29,31,32,33,35,36,37,38,44,48,51,52,54,92,103,115,130,147,153,162,176,177,184,186,261,268,269,276,278,294,350,357,360,363,364,367,369,371,431,432,435,437,439],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/protocol.py":[27,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,59,63,68,70,72,113,117,121,125,129,133,137,150,215,307,308,311,313,347,355,362,379,386,395,430,438,445,452,469,490,1155,1192,1199,1205,1211,1249,1267,1268,1288,1299,1390,1391,1451,1485,1583,1584,1643,1665,1675,1678,1680,1683,1701,1712,1726,1729,1734,1779,1794,1797,1800,1803,1811,1814,1816,1821,1829],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/message.py":[27,29,30,32,34,35,36,38,39,42,43,78,82,85,88,91,94,97,100,105,108,111,114,117,119,120,121,122,125,126,127,128,131,133,134,135,136,137,138,139,142,143,144,145,146,147,148,151,154,177,202,217,276,303,329,365,370,372,383,386,399,403,408,412,417,421,426,430,435,458,470,482,485,489,492,498,531,536,538,552,555,613,721,760,767,772,774,791,794,867,951,999,1006,1011,1013,1020,1023,1039,1072,1085,1092,1097,1099,1106,1109,1125,1151,1160,1167,1172,1174,1181,1184,1200,1226,1235,1242,1247,1249,1254,1262,1265,1286,1327,1343,1350,1360,1362,1377,1381,1450,1549,1577,1584,1594,1596,1654,1676,1821,1864,1867,1873,1878,1886,1891,1898,1903,1910,1915,1922,1927,1935,1940,1948,1953,1963,1971,1981,1989,1999,2007,2017,2025,2035,2043,2053,2061,2069,2074,2082,2087,2094,2099,2107,2112,2117,2122,2126,2263,2461,2497,2516,2523,2528,2530,2537,2540,2556,2579,2588,2595,2600,2602,2607,2608,2609,2615,2618,2645,2689,2700,2709,2716,2721,2723,2730,2733,2749,2772,2781,2788,2793,2795,2802,2805,2821,2844,2853,2860,2868,2870,2878,2881,2905,2943,2960,2967,2977,2979,3028,3035,3127,3164,3167,3173,3178,3184,3189,3196,3201,3208,3213,3220,3225,3233,3238,3246,3251,3259,3264,3272,3277,3283,3288,3296,3301,3309,3314,3321,3326,3334,3339,3344,3349,3353,3429,3568,3614,3621,3626,3629,3635,3638,3649,3671,3680,3687,3697,3699,3715,3729,3809,3918,3940,3959,3966,3973,3975,3980,3981,3982,3987,3990,4021,4078,4094,4101,4111,4113,4127,4131,4200,4294,4324,4331,4336,4338,4343,4344,4345,4347,4348,4349,4350,4351,4352,4360,4363,4398,4487,4504,4513,4520,4525,4527,4534,4537,4553,4576,4585,4592,4597,4599,4606,4609,4625,4648,4657,4664,4672,4674,4682,4685,4708,4746,4763,4770,4780,4782,4802,4820,4915,5064,5107,5114,5121,5123,5128,5129,5135,5138,5181,5242,5262,5269,5279,5281,5295,5299,5364,5458,5488],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/role.py":[27,29,31,32,43,47,51,53,55,58,66,74,78,80,95,113,117,119,128,140,144,146,154,165,169,171,186,204,208,210,218,229,233,235,247,264,265,266,267,268,269,275,276,277,278,279,280,130,131,132,133,134,135,136,137,68,69,70,282,283,284,285,286,287,288,156,157,158,159,160,161,162,290,291,292,293,294,295,220,221,222,223,224,225,226,297,298,299,300,301,302,303,304,305,249,250,251,252,253,254,255,256,257,258,259],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/autobahn/wamp/auth.py":[27,29,30,31,32,33,34,35,36,37,38,39,40,42,43,44,48,49,53,54,66,70,97,98,100,103,107,112,116,119,120,122,131,135,139,143,146,147,149,183,187,190,194,197,219,226,232,233,235,244,253,309,329,332,333,335,353,357,373,377,380,381,398,399,426,452,480,482,484,489,520,521,549,550,580,586,587,607],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/application/__init__.py":[6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/application/service.py":[15,17,19,21,22,23,24,25,26,29,37,38,39,42,43,46,47,51,63,64,67,68,75,79,76,78,82,86,83,85,90,95,97,98,100,101,103,104,106,114,125,138,143,153,163,164,171,173,174,175,177,183,188,195,200,203,206,211,218,220,230,235,247,264,265,273,275,280,285,290,299,302,305,317,330,335,336,340,342,346,348,352,356,357,364,365,367,382,402,422,423,424],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/persisted/__init__.py":[6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/persisted/sob.py":[10,12,14,15,17,18,19,20,21,22,23,27,29,31,37,46,49,51,55,62,74,78,88,108,110,112,114,120,131,164,181,193,194],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/twisted/persisted/styles.py":[7,9,12,13,14,15,16,17,18,19,21,24,25,27,30,31,32,33,35,36,49,62,83,119,121,141,160,162,166,175,176,177,181,196,218,235,258,259,260,261,268,272,274,281,290,295,296,298,305,314,331,350,351,352,354,358,374],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/corsheaders/__init__.py":[1,3],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/corsheaders/checks.py":[1,3,4,6,7,9,11,12,16,19,114,21,23,116,117,31,39,47,55,63,71,79,87,95,103,111],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/corsheaders/conf.py":[1,3,5,8,11,13,17,21,25,29,33,37,41,45,49,53,58,15,19,23,27,31,35,39,43,47,51,55],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/corsheaders/defaults.py":[10,19],"/home/valberg/code/bornhack/bornhack-website/src/profiles/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/profiles/apps.py":[1,2,3,4,5,8,9,11,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/profiles/signal_handlers.py":[1,5,6,7,10,20,33,58,15,16,17,24,25,26,27,29,37,41,46,47,48,52,53,54,30,63],"/home/valberg/code/bornhack/bornhack-website/src/events/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/events/handler.py":[1,2,3,4,5,8,38,64,17,18,19,25,28],"/home/valberg/code/bornhack/bornhack-website/src/ircbot/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/ircbot/utils.py":[1,2,3,4,5,8],"/home/valberg/code/bornhack/bornhack-website/src/camps/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/shop/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/shop/apps.py":[1,2,3,6,7],"/home/valberg/code/bornhack/bornhack-website/src/news/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/utils/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/villages/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/program/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/program/apps.py":[1,2,5,6,8,9,14,18,19,20,22],"/home/valberg/code/bornhack/bornhack-website/src/info/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/teams/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/people/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/tickets/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/tickets/apps.py":[1,2,3,4,5,8,9,11,13],"/home/valberg/code/bornhack/bornhack-website/src/tickets/signals.py":[1,2,6,7,8,10],"/home/valberg/code/bornhack/bornhack-website/src/bar/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/backoffice/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/tokens/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/feedback/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/economy/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/__init__.py":[9,11,13,14,15,16,17,18,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/apps.py":[1,2,5,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth_2fa/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/__init__.py":[1,2,5,8,31,40,43,62,85,108,126,139,146],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_totp/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_static/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/__init__.py":[3],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/__init__.py":[2,5,6,7,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/__init__.py":[7,9,10,16,21,39],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/errors.py":[1,3,6,8,11,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/revisions.py":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,23,27,33,37,39,43,40,46,50,56,64,85,89,108,112,116,120,124,128,132,136,140,159,170,211,217,273,278,300,306,308,313,316,319,327,332,338,342,345,349,353,367,368,407,414,419,427,369,401,402,371,346,339,376,377,378,379,385,382,383,380,386,388,389,390,391,394,396,354,397,355,356,399],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/signals.py":[1,5,6,9,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/betterforms/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/__init__.py":[16,18,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,46,47,52,53,57,58,61,62,63,64,69,70,72,73,75,79,80,81,82,83,84,85,88,91,94,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,120,124,127,134,137,142,150,157,161,166,170,174,177,203,204,205,206,207,210,211,212,215,216,219,220,223,226,227,228,231,234,237,238,239,240,241,244,247,251,252,254,258,264,266,268,272,276,279,290,294,296,298,303,304,306,309,313,317,323,326,330,331,334,336,337,338,339,340,341,344,354,367,383,387,411,412,414,417,463,473,476,487,492,497,502,503,506,509,515,518,521,525,526,528,533,538,543,546,549,553,554,556,569,589,611,626,630,646,660,668,685,716,808,891,907,921,925,931,939,942,944,959,960,963,190,393,395,396,408,191,192,198,964,986,1000,1004,1019,1030,1040,1067,1079,1085,1097,1106,1109,1122,1125,1126,1127,1129,1132,1136,1142,1148,1154,1160,1166,1194,1219,1245,1265,1291,1305,1317,1325,1337,1346,1354,1368,1383,1384,1386,1387,1388,1390,1394,1397,1400,1403,1406,1409,1415,1418,1421,1424,1427,1432,1455,1460,1465,1470,1476,1538,1546,351,1549,1550,1552,1556,1571,1572,1574,1577,1580,1583,1586,1590,1598,1592,1593,1594,1595,1601,1602,1604,1606,1608,1611,1614,1618,1615,1621,1624,1626,1645,1648,1651,1652,1654,1668,1669,1671,1672,1674,1678,1690,1700,1704,1717,1726,1781,1797,1806,1823,1827,1830,1833,1836,1840,1843,1853,1855,1858,1861,1870,1878,1882,1900,1902,1907,1908,1910,1922,138,139,1925,1935,1942,1969,1932,1972,1976,1979,2005,2037,2054,2061,2062,2064,2067,2071,2092,2107,2118,2132,2134,2135,2137,2138,2141,2159,2190,2224,2258,2270,2283,2156,2284,2286,2287,2290,2294,2297,2302,2313,2321,2328,2338,2346,2360,2361,2370,2371,2375,2376,2378,2387,2395,2398,2413,2423,2436,2437,2445,2446,2465,2474,2475,2487,2488,2507,2516,2529,2530,2531,2534,2535,2536,2546,2547,2563,2566,2577,2580,2583,2586,2589,2592,2598,2605,2613,2620,2646,2657,2669,2691,2698,2712,2717,2728,2739,2745,2753,2759,2768,2772,2773,2779,2788,2795,2807,2811,2879,2901,2909,2917,2922,2923,2941,2945,2946,2947,2949,2959,2967,2992,2993,2994,2998,3011,3012,3016,3038,3039,3059,3065,3068,3080,3083,3086,3092,3102,3110,3116,3129,3155,3170,3174,3179,3180,3175,3182,1130,3183,3184,3185,3186,3187,3176,3191,3204,574,558,559,560,561,563,564,566,567,621,622,623,1937,1938,3104,3097,3099,3105,3106,3107,1939,2007,2314,2315,2316,2317,2299,2310,2318,2009,2333,2325,2017,2075,2076,2023,2024,2029,1994,2002,2025,2041,2042,2045,2047,2049,2050,2063,2030,1973,1998,1999,2000,2031,2032,2033,2093,2094,2095,2098,1903,1904,2101,2102,2103,2548,2549,2550,2551,2553,2554,2555,2556,2558,2559,2560,2537,1322,2538,2539,1329,1331,2540,2541,2542,2543,2544,2564,2034,624,697,700,702,703,704,2607,2608,2755,2756,2609,2610,2611,708,709,710,711,713,922,575,576,577,579,3205,3207,3208,3209,3210,3212,3217,3218,3219,674,675,676,680,681,682,683,2719,2720,2721,2831,2832,2835,2836,2837,2839,2840,2847,2841,2846,2722,2723,2260,2261,2262,2267,2724,2713,2757,1407,1471,1517,1518,1519,1521,1522,1472,1473,1575,2714,1416,1410,1412,1587,1588,1413,2348,2349,2350,2352,2353,2715,2725,2726,2227,2228,2229,2232,2233,2235,2246,2247,2249,2252,2162,2163,2167,2168,2169,2171,2172,2164,2255,2263,2264,3221,3222,3223,913,915,916,917,3225,3227,706,3228,3230,3236,478,479,3088,3022,3024,3026,3029,3035,3041,3042,3045,3046,3047,3049,3050,3052,3053,3054,3055,3057,3089,480,481,356,357,640,641,3069,3070,3073,2648,2649,3078,644,482,484,128,129],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/extern/__init__.py":[1,4,8,10,15,23,35,64,72,73,11,12,13,68,69,28,29,31,33,39,40,20,41,42,43,44,45,51,52,53,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/six.py":[1,23,25,26,27,28,29,31,32,36,37,38,40,41,42,43,44,45,47,75,80,86,88,91,103,105,114,117,124,126,130,136,139,141,159,164,171,173,177,181,184,189,195,209,218,224,226,174,175,229,231,232,236,142,89,143,144,146,147,148,151,152,237,238,239,240,149,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,106,107,108,109,110,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,303,308,309,310,311,178,179,312,314,316,127,128,317,320,322,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,354,356,357,360,362,366,367,368,370,371,372,374,376,377,380,382,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,420,421,422,424,426,427,430,432,436,437,438,439,441,442,443,445,447,448,451,453,457,459,460,461,463,465,466,469,471,472,473,182,474,475,476,477,479,482,483,486,491,502,503,504,506,507,508,509,520,521,525,528,529,535,536,539,541,544,561,562,77,565,566,567,568,569,570,573,574,577,580,583,586,588,590,610,611,612,613,614,615,618,619,622,624,625,626,627,628,629,630,631,632,633,634,635,639,640,662,663,666,670,674,678,679,92,115,82,83,93,94,97,100,681,706,712,713,715,721,722,776,786,788,797,800,812,828,849,850,851,852,856,857,862,863,866,868,864,865,185,186,216,190,191,196,198,199,200,201,202,205,206,207,160,161,187],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/py31compat.py":[1,2,3,5,8,20,21,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py":[9,16,17,20,21,23,25,26,28,41,45,100,166,206,257,314,356,407,408,410,417,422,427,432,437,442,447,455,479,506,532,558,576],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py":[4,6,12,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py":[4,7,8,11,12,13,15,17,18,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py":[4,6,7,8,10,14,18,19,20,24,36,39,42,44,47,50,53,56,59,62,65,72,74,78,81,84,88,92,96,100,105,106,110,114,131,188,191,193,194,195,198,233,236,266,270,283,289,293,298,329,332,343,30,31,200,201,202,32,33,75,76,136,140,141,115,116,118,121,125,142,144,149,152,145,128,153,155,205,206,207,208,209,210,299,321,212,213,214,216,217,218,220,336,224,225,226,227,228,229,230,349,350,351,352,353,362,366,367,370,371,374,375,377,379,393,119,302,306,311,313,315,317,320,123,54,66,69,48,237,240,244,247,251,255,259,264,248],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py":[4,7,9,12,15,18,21,24,27,30,33,36,39,41,44,47,50,53,56,59,62,65,68,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py":[4,6,7,8,9,11,12,15,18,21,23,30,36,43,50,57,64,65,70,71,78,80,82,95,108,111,114,125,136,139,144,148,152,156,160,163,182,214,227,230,231,234,235,236,237,238,239,242,247,250,253,256,259,262,266,275,369,372,373,376,377,378,379,380,381,382,383,386,267,272,413,448,452,456,460,485,516,519,543,548,551,562,589,591,612,621,624,627,650,660,670,673,676,693,697,700,729,594,598,599,606,610,674,625,702,703,708,717,724,725,726],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py":[4,6,9,10,14,15,20,27,28,30,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py":[4,6,7,9,10,11,12,14,15,18,21,24,26,27,28,29,30,31,32,34,35,36,38,39,41,42,44,45,47,48,50,51,52,53,54,56,57,59,60,61,63,64,66,67,70,72,75,81,88,109,126,89,90,96,97,104,105,106,107],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py":[75,77,78,79,81,82,83,84,85,86,87,88,89,90,91,92,94,95,99,101,102,108,109,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,140,141,142,143,144,145,148,183,185,195,196,198,199,200,201,202,203,205,206,209,220,228,243,246,248,258,261,279,280,282,284,285,287,290,291,306,307,308,311,314,315,317,319,321,324,362,363,372,411,420,433,454,457,458,459,460,461,462,468,471,474,475,478,481,482,506,511,563,585,605,619,637,644,658,663,679,687,690,693,704,720,755,766,827,834,871,916,940,947,960,963,966,968,981,993,1003,1006,1009,1012,1039,1103,1104,1105,1106,1108,1123,1144,1167,1190,1204,1232,1250,1288,1298,1325,1338,1351,1363,1366,1370,1441,1447,1455,1456,1477,1478,1479,1536,1537,1538,1542,1565,1567,1572,1573,1574,1608,1658,1729,1772,1799,1821,1841,1853,1865,1877,1945,1948,1960,1972,1984,1996,2008,2020,2026,2045,2052,2061,2070,2079,2102,2112,2153,2156,2159,2164,2167,2173,2193,2201,2204,2207,2210,2213,2232,2364,2367,2368,2372,2375,2376,2383,2386,2387,2394,2398,2411,2412,2431,2436,2437,2439,2455,2456,2458,2479,2493,2498,2504,2514,2515,2522,2527,2535,2536,2539,2545,2569,2570,2579,2606,2652,2653,2707,2742,2765,2777,2778,2779,2813,2826,2838,2862,2863,2928,2963,2975,2990,2991,3015,3032,3046,3053,3055,3056,3057,3058,3059,3061,3081,3097,3098,3104,3107,3108,3112,3121,3130,3150,3151,3155,3160,3163,3164,3169,3180,3183,3184,3188,3195,3198,3199,3203,3213,3220,3221,3226,3233,3240,3241,3247,3256,3259,3260,3280,3283,3288,3297,3309,3319,3353,3357,3363,3368,3382,3384,3385,3390,3397,3422,3427,3434,3444,3457,3458,3465,3503,3508,3517,3523,3539,3540,3547,3571,3576,3585,3591,3644,3645,3651,3700,3709,3715,3718,3719,3737,3743,3750,3762,3768,3775,3781,3792,3808,3809,3813,3818,3828,3829,3836,3841,3850,3851,3859,3888,3912,3914,3923,3934,3935,3939,3945,3954,3955,3957,3958,3961,3962,3996,3997,4003,4017,4026,4080,4081,4094,4141,4159,4160,4163,4176,4179,4183,4190,4197,4214,4222,4223,4226,4229,4230,4234,4250,4251,4261,4268,4278,4291,4292,4296,4299,4334,4335,4339,4364,4382,4383,4386,4390,4393,4394,4397,4403,4406,4450,4469,4500,4509,4537,4565,4573,4646,4681,4718,4725,4750,2377,2369,1145,1146,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,2378,2379,2380,1198,1199,1200,1202,4751,3152,3099,3100,3101,3102,3153,4752,3165,3166,2065,2066,2067,2068,3167,4753,3185,3186,4754,3200,3201,4756,2654,2655,2659,2660,2661,2662,2663,2668,2670,2673,2675,2678,2680,2681,2682,2684,2743,2744,2154,2745,2746,2749,2751,2757,2758,2752,2755,2753,2762,2685,2686,2687,2689,1284,1040,1042,1043,1046,1047,1052,1063,1066,1049,1050,1051,1067,1069,1093,1094,1095,1096,1099,1101,1285,1286,4757,2781,2783,2784,2788,2789,2791,2792,2793,2808,2827,2828,2829,2830,2832,2833,2835,2809,2810,2811,4758,4759,1952,1954,1958,3541,3261,3262,3265,3267,3268,3270,3272,3278,3542,3543,2992,2993,2994,2996,2999,3001,3004,3006,3007,3008,3010,3033,3034,3035,3036,3038,3039,3042,3044,3011,3012,3013,4760,4231,3720,3721,3722,3723,2413,2414,2415,2416,2417,2422,2423,2424,2425,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,4232,1833,1835,1839,3391,3392,3393,3394,3395,4293,4294,4761,3998,3999,4000,4001,1224,1183,1184,1185,1186,1188,1225,1228,1229,1230,3852,3853,3854,3855,3857,1834,4763,4787,4797,4811,4825,4869,4857,4860,4861,4862,4865,4867,4872,4875,4904,4923,4932,4995,4997,5032,5033,5034,5036,5148,5151,4252,4254,4255,3744,3745,3364,3365,1187,3366,3746,3747,3291,3292,3293,3294,2058,2059,3295,3748,4256,4257,4258,4259,5152,5153,5154,5155,5157,5247,5361,4781,4782,4783,1635,1569,1570,1636,1637,3320,2160,2161,2162,3322,3323,3763,3764,3765,3766,3328,3329,3330,3339,3340,3349,3435,3438,3439,4018,4021,4022,4024,3441,3351,3577,3580,3581,3583,3331,3332,3333,3334,3335,3336,3337,3782,3783,3784,3785,3787,3788,3789,3341,3342,3343,3344,3345,3346,3347,3915,3918,3919,3921,1639,1641,1642,1643,1644,1371,1373,1395,1396,1352,1355,1356,1357,1358,1361,1399,1400,1401,1402,3400,1398,1406,2432,2433,2434,1408,1367,1410,364,366,367,368,373,374,375,376,377,378,379,380,382,384,387,388,390,1411,1434,1439,3401,3402,3403,3406,3417,4004,4005,2435,210,211,215,216,217,218,4006,4007,4014,4015,383,391,393,395,396,3418,509,3738,3739,3860,3861,3862,3863,3868,3870,3548,3549,3550,3551,3552,2708,2716,2719,2720,2721,2722,2723,2724,2725,2728,2729,2730,2731,2733,2737,2738,3554,3555,3556,3557,2814,2815,2818,2819,2820,2821,2824,365,1412,1427,1428,1070,1071,1072,412,413,1073,1074,1429,1430,1431,1432,1433,3553,4384,3419,664,675,676,677,3420,4297,3871,3872,3873,3874,3876,3879,3880,3881,3882,2717,2816,3016,3017,3565,3566,3567,1403,3883,3884,3886,397,399,400,403,316,421,422,423,318,430,431,404,415,416,665,666,667,668,669,670,671,672,673,1645,1656,645,646,5362,5364,2690,2692,2697,2698,4567,4568,4569,4570,4571,2699,2700,2702,2703,4921,4877,4881,4883,4884,4890,4891,2665,2666,2760,2691,4895,2040,2041,3936,3937,4336,4337,4896,4898,3354,3355,4899,4900,4901,4902,5365,5366,5367,5372,5375,5378,5379,5382,5385,5388,5391,2656,2657,5392,5393,2024,3830,3832,3833,3834,3842,3845,3846,3848,5394,4463,4464,4467,5399,5533,5535,5540,5545,5548,5551,5554,2043,5556,1294,1295,1296,5558,2050,5560,1041,5562,5565,5569,5572,5575,5578,5581,5582,1845,1846,1847,1851,1897,1898,1918,1920,1922,1925,1939,1942,1943,5583,1899,1900,1901,1903,1910,1911,1912,1926,1931,1937,1927,1928,1930,5584,1315,1316,1317,1318,1321,1322,1323,5585,5586,5589,5592,5593,5614,5615,5636,5639,5642,5645,5646,5661,5662,3062,3063,3064,3066,3067,3068,3070,3072,3075,3077,5663,5666,5669,5670,5673,2864,2867,2868,2872,2873,2880,2881,2882,2883,2884,2885,2886,2887,2888,2890,2897,2898,2899,2900,2901,2902,2908,2910,2913,2915,2916,2917,2923,2964,2965,2966,2967,2969,2970,2972,2924,2925,2926,4161,4164,4166,4167,4168,4169,4170,4171,4172,4173,4174,1976,1978,1982,3459,3460,3461,4705,4706,4707,4708,4709,4710,4714,4715,4716,4215,4216,3946,3949,3950,3952,4184,4185,4186,4187,4188,4198,4200,3509,3512,3513,3515,3189,3193,2709,2710,2713,2714,3940,3941,2711,3942,3943,4269,759,760,761,762,763,764,4270,434,435,436,439,444,445,447,4271,694,695,696,698,701,702,4273,4276,406,407,424,428,429,1404,1364,408,409,3466,3467,3468,3469,3470,3471,1442,1443,1444,3472,3473,3474,3475,3476,3485,3496,3497,3498,647,648,401,3204,3206,3207],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py":[4,6,7,8,9,11,12,13,15,16,20,21,25,28,31,34,37,41,44,46,49,52,55,59,61,65,67,71,73,94,95,98,99,100,101,102,103,105,114,115,118,119,121,122,124,126,128,129,131,132,134,135,136,138,141,148,172,173,174,175,176,177,178,179,183,200,203,214,241,249,272,274,282,285,288],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/__init__.py":[1,3,6,7,9,16,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/apps.py":[1,3,5,6,7,8,9,10,13,14,15,18,76,20,22,23,24,26,27,28,33,34,77,78,81,82,36,37,39,50,61,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/middleware/gzip.py":[1,3,4,5,7,10,15,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/models.py":[1,3,4,5,6,7,8,9,10,12,13,14,17,18,19,23,24,26,39,40,41,42,43,45,46,47,48,50,51,52,53,54,56,58,59,61,63,65,66,67,68,69,71,74,87,90,93,96,136,140],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/models.py":[1,3,4,5,8,9,11,17,25,30,34,62,105,119,125,134,135,136,137,12,15,139,140,141,142,143,145,148,155,162,171,177,40,26,27,28,41,42,31,32,43,44,48,51,59,129,130,131,60,123,52,55,56,57],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/models.py":[1,2,3,4,5,6,7,8,9,11,14,23,24,26,33,55,56,57,58,59,60,62,63,65,66,67,68,70,72,79,81,84,87,88,90,94,110,111,112,113,114,115,118,120,121,122,124,127,131,132,134,147,152,165,173,188,203,207,208,209,210,211,212,216,217,218,219,220,221,224,225,227,228,229,230,231,232,233,236,237,239,251,254,269,276,288,294,295,297,298,299,300,301,302,304,307,308,309,310,311,312,313,315,316,317,318,319,323,325,327,328,329,331,332,333,334,336,340,347,351,356,362,363,364,367,368,369,370,371,372,373,374,375,377,380,383,386,389,392,395,398,402,406,409,412,415,418,421,425,429],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/base_user.py":[4,5,7,8,11,12,13,16,18,33,43,47,48,49,51,53,57,59,60,62,66,69,72,78,81,89,97,101,113,117,123,130,137,87,95,73,74],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/password_validation.py":[1,2,3,4,5,7,8,11,12,13,14,17,22,35,54,66,78,88,91,94,95,98,110,118,128,129,131,135,156,160,169,170,172,182,189,193,196,197,204],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/hashers.py":[1,2,3,4,5,6,7,9,10,11,12,13,16,17,19,20,23,31,65,81,94,99,106,129,150,160,168,169,170,172,187,191,195,204,213,216,230,237,238,239,240,242,250,256,266,270,277,283,284,285,288,295,296,297,299,300,301,303,316,329,344,356,361,389,397,398,399,400,401,403,407,419,425,436,440,451,463,464,465,468,471,472,474,480,486,495,499,502,503,505,511,517,526,530,538,539,541,544,549,553,561,565,575,576,578,581,585,591,597,601,606,607,608,610,613,621,627,636],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/base.py":[5,7,8,10,11,12,13,14,15,16,17,19,20,21,22,27,32,28,29,34,39,40,41,42,43,44,45,47,48,52,53,54,55,56,58,61,62,63,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,96,97,100,101,102,103,104,105,106,107,108,109,110,111,112,113,124,126,127,128,129,130,131,134,135,137,138,139,140,141,143,145,177,197,207,216,226,236,240,248,257,280,259,260,261,146,148,152,163,164,166,167,168,169,170,171,172,173,175,178,185,186,187,188,189,195,237,238,208,210,198,199,200,201,202,203,204,211,213,278,217,222,223,224,227,228,229,231,232,220,249,251,255,245,246],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/base.py":[1,2,3,4,5,7,8,10,11,12,13,14,15,16,17,18,19,21,24,25,27,29,31,32,33,34,35,37,38,39,40,41,42,44,46,47,108,115,135,147,151,161,165,169,173,179,201,212,220,231,236,241,246,253,257,266,276,297,301,305,309,315,335,350,360,368,376,381,412,419,428,434,442,454,462,469,479,491,518,536,543,551,558,562,566,583,598,607,616,627,635,647,50,54,55,57,58,63,65,67,69,72,75,78,79,80,83,84,89,93,99,101,102,103,104,105,106,592,593,594,595,214,215,549,216,182,202,184,185,186,188,189,190,191,193,194,195,393,430,394,397,401,404,406,408,196,140,142,143,378,379,197,199,255,232,233,234,224,525,225,149,228,564,229,435,278,279,284,285,541,611,614,398,259,260,261,237,238,239,263,264,409,628,629,630,631,410,321,311,324,325,327,328,330,331,298,299,333,423,426,339,342,343,302,303,347,354,357,358,306,307,268,269,270,242,243,244,272,273,274,286,287,247,248,249,289,293],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/validation.py":[1,2,3,6,9,4,10,12,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/signals.py":[1,3],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/client.py":[1,2,3,5,6,9,16,17,19,70],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/client.py":[1,2,5,7,11,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/creation.py":[1,3,5,6,9,11,14,22,32,36,53,23,24,27,28,29,15,16,18,20,37,38,33,34,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/psycopg2/errorcodes.py":[4,33,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,103,106,107,108,109,110,111,112,113,116,117,120,123,124,125,126,127,128,129,132,135,138,141,142,145,146,149,152,153,156,159,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,216,217,218,219,220,221,222,225,228,229,230,231,232,233,234,235,236,237,238,239,242,245,248,249,252,253,256,259,260,261,262,263,266,269,270,271,272,273,276,277,278,279,280,281,284,285,288,291,294,295,296,297,298,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,347,350,351,352,353,354,357,358,359,360,363,364,365,366,367,370,371,372,373,374,375,378,379,380,381,384,387,388,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,420,421,422,423,424,427,428,429],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/creation.py":[1,2,4,5,6,7,11,14,18,19,22,29,85,92,122,131,140,151,154,197,216,226,234,264,276,282,20,288,290,291,292,293,147,149,35,37,39,40,41,42,44,45,46,135,136,137,54,158,160,161,164,27,165,166,195,56,57,58,63,64,65,66,67,68,75,76,99,100,101,102,104,105,106,108,111,118,119,112,113,114,115,116,120,78,81,83,239,240,241,245,246,247,248,249,250,251,256,260,261,262],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/features.py":[1,2,3,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,42,50,51,52,53,54,56,60,61,62,63],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/features.py":[1,2,3,6,7,8,9,10,11,14,19,23,25,26,27,28,29,30,34,35,36,37,38,39,42,46,49,54,57,60,61,64,67,71,74,77,80,83,87,90,93,96,100,103,107,110,113,118,121,124,127,130,133,136,139,142,146,149,152,156,159,162,165,168,171,174,179,182,185,188,191,195,198,201,203,206,210,214,218,221,224,225,226,227,231,234,237,240,244,245,248,251,254,258,260,263,268,282,261],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/introspection.py":[1,4,7,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,30,32,41,54,72,92,111,128,43,49,50,51,52],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/introspection.py":[1,4,7,10,11,12,14,17,27,35,43,58,65,94,110,135,143,151,160,15,50,53,56,51,52],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/operations.py":[1,3,4,5,8,9,10,12,25,33,37,42,46,50,54,59,62,65,73,92,95,98,103,106,129,145,151,195,198,211,218,225,228,233,236,239,242,247,254,263,209,99,101,104,63,234,237,229,230,231,226,74,77,78,87,90,71],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/operations.py":[1,2,3,5,6,7,8,9,10,13,17,18,23,24,25,26,27,30,31,32,37,39,42,43,44,45,46,49,51,55,64,72,82,90,97,103,111,120,126,134,142,150,157,164,175,183,192,199,209,217,225,247,256,264,271,278,285,292,312,319,328,338,345,349,360,368,374,380,388,404,411,421,431,435,441,452,458,460,468,487,496,505,516,523,530,544,562,571,575,586,596,599,606,613,621,628,638,648,656,659,52,53,334,335,336,569,611,181,190,584,269,219,210,211,212,220,221,222,70,466,619,366,378,372],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/schema.py":[1,3,6,8,10,11,12,14,15,16,17,21,23,25,28,35,57,109,29,30,40,41,49,51,53,55,31,33,52,32,112,120,121,122,125,126,132,113,114,115],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/base/schema.py":[1,2,3,5,8,9,10,11,12,14,17,33,42,47,50,51,52,53,55,56,57,58,59,60,61,62,63,64,66,67,69,70,73,76,77,79,80,82,83,85,87,96,103,112,135,138,151,199,206,215,241,253,322,338,342,346,362,378,389,404,412,454,484,526,775,797,828,849,870,899,909,910,936,955,964,967,970,975,983,1002,1013,1021,1048,1058,88,89,90,92,97,98,99,100,101,104,105,107,108,259,260,261,263,157,158,159,161,164,166,167,180,183,185,186,188,189,193,194,197,264,267,268,271,272,274,276,287,288,136,289,292,190,181,191,299,303,304,305,307,312,116,122,124,125,132,133,315,941,943,944,945,959,960,965,962,916,900,901,903,905,907,917,918,919,921,927,928,929,930,931,932,933,947,951,953,318,277,278,279,284,285,984,985,986,987,989,992,993,994,995,996,997,998,999,961,493,494,495,496,497,498,504,509,515,522,523,529,530,542,557,558,561,580,593,604,611,612,613,615,626,217,219,224,234,236,239,627,629,630,631,635,638,639,782,787,788,790,791,792,794,640,641,644,647,648,651,653,654,655,657,658,659,660,661,663,665,685,689,692,971,972,703,707,708,711,968,725,741,746,751,764,772,418,421,204,168,169,184,423,426,427,430,431,432,433,435,438,446,448,449,451,352,353,355,358,359,360,1003,1005,1006,1007,1008,1009,1010,1004,877,878,144,145,146,147,879,881,882,883,106,923,924,925,990,559,220,223],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/ddl_references.py":[4,7,8,10,16,22,28,34,37,41,42,44,48,51,55,59,60,62,66,69,76,77,79,84,94,95,97,102,106,107,109,115,118,124,128,132,140,147,148,152,158,164,169,174,45,46,98,99,100,63,64,80,81,82,149,150,110,111,112,113,175,56,103,85,91,86,87,88,89,133,134,135,137],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/backends/postgresql/utils.py":[1,4,5,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/validators.py":[1,3,4,5,8,9,10,11,12,15,18,19,20,21,22,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/models.py":[1,6,7,10,26,27,29,34,35],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/base_session.py":[4,5,6,9,10,17,26,27,28,29,31,33,34,35,36,38,41,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/models.py":[1,3,4,5,6,7,9,12,27,28,30,36,50,71,76,80,82,83,84,85,86,88,89,91,92,93,94,95,97,100,104,120,121],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/corsheaders/models.py":[1,3,6,7,8,9,11],"/home/valberg/code/bornhack/bornhack-website/src/profiles/models.py":[1,2,3,5,8,9,10,11,13,14,15,16,17,20,21,22,23,24,27,28,29,30,33,34,35,36,39,40,41,44,45,46,47,50,54,57,65],"/home/valberg/code/bornhack/bornhack-website/src/utils/models.py":[1,2,3,4,5,6,7,10,11,12,14,34,35,36,38,39,40,41,45,46,47,49,50,53,55,57,58,60,68,76,81,82,83,84,85,86,87,88,89,91,92,93,94,96,97,98,99,101,102,104,107,15,21,22,23,31],"/home/valberg/code/bornhack/bornhack-website/src/camps/models.py":[1,2,3,4,5,6,7,8,9,10,11,14,17,18,19,20,28,32,33,34,35,36,38,39,40,41,44,45,46,47,50,51,52,55,56,57,60,61,62,65,66,67,70,71,72,75,76,77,80,81,82,83,86,87,88,91,92,93,96,97,98,99,102,103,104,107,108,109,110,113,116,134,137,142,147,151,155,159,163,206,213,220],"/home/valberg/code/bornhack/bornhack-website/src/program/models.py":[1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,21,24,27,30,31,32,33,34,37,38,39,40,43,44,46,50,59,60,61,62,63,66,67,70,71,72,73,76,77,78,79,80,81,82,85,86,87,88,89,90,91,94,95,96,97,98,99,100,103,104,105,106,107,108,109,112,115,129,145,150,151,152,153,160,164,166,167,169,170,171,172,175,176,177,180,181,182,185,186,187,191,192,193,196,197,198,199,202,205,213,222,223,225,226,227,228,229,232,233,234,237,238,239,242,243,246,247,248,251,252,253,256,260,263,302,309,310,311,312,313,314,315,318,319,320,323,324,325,328,329,330,331,334,335,336,337,338,341,342,343,346,347,348,349,350,353,354,355,358,362,364,368,374,384,423,433,434,436,437,438,441,442,445,446,447,448,449,452,453,454,455,456,459,462,463,465,472,473,475,476,479,481,482,483,486,487,488,489,492,495,496,498,506,507,508,509,510,511,514,516,517,518,519,522,523,524,527,528,529,532,533,534,535,538,539,540,543,544,545,548,549,550,553,554,555,556,559,562,571,572,574,575,576,579,580,583,584,585,586,589,590,591,592,595,596,597,598,599,602,603,604,605,606,609,610,611,614,615,616,617,618,619,620,623,624,625,627,630,635,639,641,647,650,675,676,678,679,680,681,684,686,687,690,691,692,693,696,697,699,702,706,710,712,723,730,739,774,775,777,778,779,782,783,784,787,788,791,792,793,794,797,798,799,800,801,802,805,806,807,808,809,812,813,814,815,816,817,818,821,822,823,826,827,828,830,833,838,841,850,851,852,853,854,856,857,858,861,862,866,870,871,873,880,887],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/__init__.py":[2,4,17,39,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/cal.py":[6,7,8,9,10,11,12,13,14,15,16,17,19,20,21,23,29,32,34,51,52,53,54,57,60,64,66,67,68,69,70,71,73,79,98,104,106,111,118,156,209,227,248,256,267,272,282,293,319,320,404,410,420,429,443,445,450,453,458,460,463,465,468,470,472,477,479,482,486,488,490,493,497,501,503,505,508,510,513,514,515,516,517,519,568,580,654,655,656,657,658,661,662,663,664,665,668,670,672,675,677,678,681,683,684,685,686,687,690,691,37,38,39,40,41,42,43,44,45,46],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/caselessdict.py":[2,3,5,8,18,25,28,30,40,44,48,52,56,60,64,68,71,75,84,87,90,95,97,103,33,45,46,34,35,36],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/compat.py":[2,5,10,11,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/parser_tools.py":[2,5,6,9,22,12,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/parser.py":[8,9,11,12,13,14,15,17,20,33,52,65,103,115,117,118,119,120,121,124,131,139,142,154,179,185,188,190,215,230,231,267,273,278,288,291,292,300,301,321,357,358,365,372,376,377,382,399],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/prop.py":[37,38,39,40,41,42,44,45,49,50,51,52,53,54,55,56,57,58,59,61,62,63,64,65,68,69,70,71,72,73,74,82,83,84,85,86,89,92,94,95,99,102,105,109,111,112,118,124,127,136,138,140,144,147,150,158,160,161,163,168,173,181,183,184,190,193,196,201,203,204,209,212,220,222,223,228,231,239,241,242,258,262,263,270,272,277,280,281,286,290,291,315,330,331,352,354,355,361,365,378,388,389,393,411,412,444,447,449,455,480,499,501,502,534,539,546,553,563,571,573,574,575,578,594,597,605,607,609,610,611,612,613,614,615,616,619,627,630,638,640,642,643,650,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,669,673,687,693,712,714,716,723,726,729,735,737,739,748,751,761,763,765,771,774,782,784,786,798,801,810,812,814,819,825,846,866,870,871,877,880,885,891,893,942,946,947,948,949,951,952,953,954,955,956,957,958,959,960,961,962,964,965,966,967,968,969,970,972,973,974,975,976,978,979,980,981,982,983,984,986,987,988,989,991,992,993,995,996,997,998,1000,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1025,1030,1037,895,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/__init__.py":[2,3,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/_version.py":[4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/tz/__init__.py":[2,3,8,10,11,12,13,16,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/tz/tz.py":[9,10,11,12,13,14,15,16,17,19,20,21,22,23,24,26,27,28,29,30,31,34,36,37,38,41,42,73,74,77,80,84,100,108,115,117,120,123,126,127,136,137,148,151,154,158,162,176,182,184,187,192,195,198,199,212,221,230,234,252,256,296,311,313,316,319,322,323,324,326,330,338,350,352,355,361,367,371,372,373,375,380,450,452,476,482,706,721,732,737,773,802,815,824,840,846,853,855,858,861,864,868,942,945,990,1014,1025,1030,1031,1072,1073,1105,1146,1150,1152,1161,1162,1171,1216,1224,1230,1237,1241,1244,1247,1257,1258,1275,1281,1308,1324,1449,1453,1454,1455,1456,1457,1458,1464,1666,1465,1466,1469,1538,1539,1546,1573,1579,1584,1585,1663,1541,1542,1543,1544,1667,1670,1704,1750,1796,1804,1805,1818,1820,1821,1822,1826,1827,1830,1833],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/tz/_common.py":[1,3,5,8,10,13,35,37,132,149,152,154,179,204,207,244,137,146,267,288,289,292,302,312,19,30,319,352,374,395,407,411,413,416,419],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/tz/_factories.py":[1,2,3,6,7,11,17,18,23,24,29,50,51,56,8,9,25,26,27,52,53,54,12,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/tz/win.py":[8,10,11,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/timezone_cache.py":[3],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/icalendar/windows_to_olson.py":[10,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],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/rrule.py":[7,8,9,10,11,12,14,15,19,20,21,23,24,27,29,30,31,32,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,51,59,62,63,66,69,70,77,71,74,80,93,94,104,112,123,148,170,182,190,211,229,270,304,426,432,699,761,775,1031,1078,1111,1112,1113,1114,1115,1117,1122,1252,1255,1262,1277,1283,1293,1301,1306,1312,1314,1315,1324,1334,1336,1339,1342,1345,1348,1355,85,90,1361,1367,1375,1382,1417,1460,1462,1463,1464,1465,1466,1467,1468,1470,1471,1473,1476,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1491,1494,1505,1508,1534,1540,1562,1622,1730,1734],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/_common.py":[3,6,7,9,13,19,27,33,36,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/fields.py":[1,3,4,5,6,7,8,9,10,14,15,18,25,28,29,30,31,33,34,35,36,37,38,39,41,49,55,62,69,74,81,93,108,158,161,171,217,246,258,261,263,271,274,277,279,280,281,282,284,286,289,312,318,330,350,354,394,411,424,428,451,454,457,464,472,483,494,496,504,42,43,44,45,46,47,50,51,52,53,76,82,91,77,94,95,106,78,113,114,127,141,156],"/home/valberg/code/bornhack/bornhack-website/src/shop/models.py":[1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,21,24,25,26,29,30,33,34,37,38,39,40,43,44,45,48,51,59,60,61,62,64,65,66,69,70,71,72,73,74,77,78,79,80,83,84,85,86,89,90,91,92,95,96,97,98,102,103,104,105,108,109,110,111,112,115,117,118,119,120,123,124,125,126,127,130,131,132,135,136,137,138,141,143,146,151,155,168,176,179,182,185,188,192,195,224,230,255,267,273,280,286,297,312,313,314,315,317,318,319,321,324,329,330,331,332,333,335,336,337,338,341,342,344,345,348,350,351,352,357,358,359,360,361,364,366,369,370,373,375,381,387,400,406,412,416,429,438,439,440,441,442,444,448,455,456,457,458,459,461,462,464,468,469,470,471,473,474,475,478,479,480,482,483,484,487,488,491,492,493,494,497,498,499,500,501,502,503,504,507,508,509,510,513,514,515,518,519,520,521,524,526,539,553,560,565,566,567,568,569,570,572,573,574,575,576,578,579,581,600,604,608,609,610,611,613,616,621,622,623,624,625,626,628,632,633,634,635,636,638,325,326,382,418,419,420,421,422,424,426,395,402,403,404,396,397,431,432,433,398,449],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/unidecode/__init__.py":[16,17,18,20,23,31,56,66,68],"/home/valberg/code/bornhack/bornhack-website/src/shop/managers.py":[1,2,5,7,14,16,19,22,25,28],"/home/valberg/code/bornhack/bornhack-website/src/news/models.py":[1,2,3,4,6,9,10,11,12,14,15,16,17,18,20,23,46],"/home/valberg/code/bornhack/bornhack-website/src/villages/models.py":[1,2,3,4,7,9,10,11,13,14,15,16,17,18,21,22,23,26,27,30,33,36,61],"/home/valberg/code/bornhack/bornhack-website/src/info/models.py":[1,2,3,5,8,9,10,11,13,14,15,18,19,22,23,24,27,28,29,30,31,34,41,45,47,52,53,54,55,56,58,59,60,61,64,65,66,69,70,73,74,77,78,79,82,86,88,93],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/models.py":[1,3,6,16,17,18,19,22,24,25,28,29,30,33,34,35,36,39,41,44,48,51,52,53,54,57,58,61,62,63,64,65,66,69,70,72,75,76,77,78,81],"/home/valberg/code/bornhack/bornhack-website/src/ircbot/models.py":[1,2,3,4,7,8,9,10,11,12,14,17],"/home/valberg/code/bornhack/bornhack-website/src/teams/models.py":[1,3,4,5,6,7,8,9,10,12,14,38,41,42,43,44,45,48,49,50,53,54,55,56,59,60,63,65,66,67,70,71,72,73,77,78,81,82,83,86,87,88,92,93,94,95,96,97,99,100,101,103,104,105,107,108,109,112,113,114,115,116,117,119,120,121,123,124,125,127,128,129,132,133,134,137,138,139,141,142,143,144,145,148,151,154,166,191,202,211,220,231,243,256,258,259,260,261,264,265,266,267,270,271,272,275,276,277,280,281,282,285,286,288,296,301,304,305,306,307,308,309,311,312,313,315,316,317,318,320,321,323,324,325,326,328,329,330,333,334,335,337,340,345,347,354,355,356,357,360,362,363,365,366,367,368,369,372,374,375,376,379,380,383,388,390,397],"/home/valberg/code/bornhack/bornhack-website/src/tickets/models.py":[1,2,3,4,5,6,7,8,12,13,14,15,19,20,21,23,27,28,29,30,32,33,35,39,47,58,63,71,72,74,77,82,83,84,87,90,95,96,97,98,99,101,103,104,106,109,110,113,114,115,119,128,134,139],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/__init__.py":[1,2,3,6,9,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/main.py":[1,2,4,5,8,14,20,26,37,39,40,41,42,43,58,67,85,99,126,144,173,191,220,273,300,311,334,345,376,421],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/constants.py":[2,3,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/exceptions.py":[1,2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/util.py":[1,2,4,5,7,10,11,12,13,17,18,19,20,23,24,25,26,29,30,31,32,35,36,39,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,86,89,90,92,93,96,98,100,99,104,112,119,127,131,154,163,175,188,229,256,332,340,370,384,394,405,410,412,433,436,461,465,467,471,474,478,482,485,494,558],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/base.py":[1,3,5,7,8,10,12,13,15,16,19,20,21,22,33,34,35,36,39,40,41,42,45,46,47,48,51,52,53,54,57,58,59,60,63,64,65,66,69,70,71,72,75,76,77,78,81,82,83,84,87,88,89,90,93,94,95,96,99,100,101,102,105,106,107,108,111,112,113,114,117,118,119,120,123,124,125,126,129,130,131,132,135,136,137,138,141,142,143,144,147,148,149,150,153,154,155,156,159,160,161,162,165,166,167,168,171,172,173,174,177,178,179,180,183,184,185,186,189,190,191,192,195,196,197,198,201,202,203,204,207,208,209,210,213,214,215,216,219,220,221,222,225,226,227,228,231,232,233,234,237,238,239,240,243,244,245,246,249,250,251,252,255,256,257,258,261,262,263,264,267,268,269,270,275,281,285,287,299,302,305,308,317,334,336,341,342,346,347,349,351,352,353,354,337,338,356],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/LUT.py":[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/image/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/image/base.py":[1,4,5,6,8,15,21,27,36,42,48],"/home/valberg/code/bornhack/bornhack-website/src/utils/pdf.py":[1,2,3,5,6,7,8,9,10,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/wkhtmltopdf/__init__.py":[1,2,3,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/wkhtmltopdf/utils.py":[1,3,4,5,6,7,8,9,11,13,14,15,20,21,22,23,24,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,52,73,149,168,172,173,174,176,188,194,239,254,273,278,312],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/wkhtmltopdf/subprocess.py":[1,3,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/wkhtmltopdf/views.py":[1,3,4,5,7,10,11,14,24,38,39,45,63,84,85,88,91,94,95,96,97,100,101,104,110,116,128,131,134],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PyPDF2/__init__.py":[1,2,3,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PyPDF2/pdf.py":[37,39,40,42,43,45,46,47,48,49,50,51,54,56,59,61,62,63,64,65,66,67,69,72,75,76,79,83,84,113,117,122,130,140,151,164,172,190,214,247,328,354,373,382,398,445,529,541,596,602,616,651,665,690,751,759,774,784,839,893,963,965,978,999,1003,1005,1019,1039,1041,1044,1060,1061,1089,1106,1109,1125,1131,1158,1164,1179,1180,1189,1231,1246,1252,1276,1286,1327,1333,1379,1395,1408,1422,1427,1452,1453,1460,1474,1478,1492,1496,1531,1584,1636,1649,1669,1676,1685,1919,1922,1930,1965,1991,2025,2043,2046,2051,2054,2070,2076,2080,2089,2101,2102,2107,2140,2142,2153,2164,2168,2181,2183,2193,2195,2203,2205,2214,2216,2228,2241,2315,2330,2346,2363,2379,2410,2436,2462,2498,2512,2544,2553,2567,2581,2623,2082,2083,2084,2085,2630,2639,2646,2652,2657,2660,2661,2676,2708,2756,2775,2778,2781,2794,2796,2799,2805,2809,2812,2816,2819,2823,2826,2832,2835,2841,2842,2845,2854,2855,2860,2904,2931,2955,2970],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PyPDF2/filters.py":[33,34,35,37,38,39,42,43,45,46,48,51,109,110,150,152,154,157,158,176,179,182,183,184,195,199,219,253,254,258,259,332,335],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PyPDF2/utils.py":[30,31,32,35,37,38,39,40,43,44,46,47,48,52,57,62,68,73,89,99,112,120,144,145,149,152,168,185,192,205,206,209,210,213,214,217,218,221,222,225,229,231,244,251,261,268,275,282,291,295,232,233,235,238,239,240,241,245,248,54],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PyPDF2/generic.py":[33,34,35,37,38,39,40,41,42,43,44,45,46,49,50,51,54,101,102,107,108,111,116,119,120,123,129,138,141,142,149,168,171,172,177,180,183,192,195,198,223,226,227,233,244,247,251,252,253,255,262,265,268,274,280,303,325,400,405,407,421,422,423,430,432,445,467,468,469,471,474,494,497,498,501,508,515,526,542,544,553,641,644,645,648,651,654,665,690,758,775,776,780,791,801,803,821,822,825,829,830,833,848,852,861,862,868,873,876,879,882,885,888,891,894,897,900,903,906,909,912,915,918,921,924,927,930,935,940,945,949,952,956,957,967,972,977,982,987,992,999,1005,1011,1016,1021,1024,1044,1045,1067,1070,1087,1094,1101,1108,1115,1122,1129,1136,1141,1144,1145,1162,1173,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1218,1220,1221,1222,1223,1224,1225,1226],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PyPDF2/merger.py":[30,31,32,33,34,35,39,40,41,44,48,49,56,68,70,79,183,205,235,248,258,275,291,307,331,347,421,438,462,476,507,519,520,526,531,550],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PyPDF2/pagerange.py":[8,10,11,13,14,18,19,33,36,48,50,84,85,87,95,99,111,115,123,63,67,71,72,74,80,81,126],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PyPDF2/_version.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/bar/models.py":[1,2,5,6,7,9,12,13,16,17,18,19,20,21,22,24,26,27,29],"/home/valberg/code/bornhack/bornhack-website/src/events/models.py":[1,2,3,5,12,13,14,15,18,19,20,23,24,25,27,30,39,44,45,46,47,48,49,52,53,54,55,56,59,35,36],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/models.py":[1,2,4,7,8,9,10,11,12,13,15,24],"/home/valberg/code/bornhack/bornhack-website/src/tokens/models.py":[1,2,5,6,7,8,11,12,13,16,17,20,21,24,26,29,30,33,34,35,37,38,39,42,43,44,47,49,52],"/home/valberg/code/bornhack/bornhack-website/src/feedback/models.py":[1,3,6,7,8,9],"/home/valberg/code/bornhack/bornhack-website/src/economy/models.py":[1,3,4,5,6,7,8,10,11,14,18,19,20,22,23,24,25,28,29,30,31,34,35,36,39,42,48,54,55,56,57,59,60,61,62,63,66,67,68,69,72,73,74,77,78,81,82,83,86,89,98,107,108,109,110,111,112,115,116,117,118,119,120,123,124,125,126,127,130,131,132,133,136,137,138,141,142,143,146,147,150,151,152,153,154,155,156,159,160,161,162,163,166,167,168,171,172,173,176,180,184,193,215,231,232,233,234,235,236,239,240,241,242,243,244,247,248,249,250,251,254,255,256,257,260,261,262,265,266,267,270,271,272,275,276,279,280,281,282,283,286,287,288,291,292,293,294,295,296,297,300,301,302,305,309,313,322,344,360,363,364,365,366,367,368,371,372,373,374,375,378,379,380,381,382,385,386,387,390,391,392,395,402],"/home/valberg/code/bornhack/bornhack-website/src/economy/email.py":[1,3,5,9,24,36,49,64,76],"/home/valberg/code/bornhack/bornhack-website/src/utils/email.py":[1,2,3,4,5,6,7,8,9,15,16,17,18,19,20,21,67,68,69,70,71,72,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/magic.py":[18,20,21,22,23,24,25,27,30,31,36,40,43,69,84,94,103,118,120,126,138,153,155,158,159,161,179,183,185,192,202,208,225,226,227,229,230,231,233,234,235,237,238,239,241,242,243,244,246,249,250,251,252,254,258,259,260,261,263,266,267,268,270,271,272,274,275,276,280,281,282,283,284,285,286,287,288,289,290,291,293,294,295,296,297,298,299,300,301],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/models.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/models.py":[1,3,5,6,7,8,9,10,12,13,14,15,16,19,20,22,23,24,25,26,27,28,29,31,33,34,35,36,39,42,55,63,77,78,80,81,82,83,84,85,86,88,90,91,92,94,97,103,108,110,119,129,131,134,140,156,165],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/app_settings.py":[1,3,4,5,6,8,11,14,16,18,35,42,46,56,65,75,83,90,104,110,117,124,131,139,150,157,164,171,178,185,192,197,201,205,212,220,224,228,232,236,240,248,257,264,268,277,286,290,294,298,321,324,19,21,106,107,36,37,38,39,40,108,22,88,24,25,122,26,95,96,98,99,102,27,28,29,234,325,326,115,288,190,162,176,262],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/signals.py":[1,2,5,8,10,11,12,14,15,16,18,20,21,22,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/app_settings.py":[1,4,6,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/adapter.py":[1,3,4,5,6,8,9,10,11,17,18,19,20,21,22,23,24,25,26,27,28,29,31,32,41,45,47,49,51,54,57,60,65,68,71,83,90,97,135,139,155,164,177,186,193,214,217,246,280,287,299,305,323,348,373,393,396,404,408,414,418,433,452,456,460,468,483,500,510,514],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/shortcuts.py":[1,4],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/shortcuts.py":[5,6,8,11,12,13,14,17,31,40,61,74,98,119],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/utils.py":[1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,23,24,25,30,32,33,36,64,74,82,92,113,125,143,150,158,161,193,229,253,288,295],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/managers.py":[1,3,4,5,7,10,13,23,29,35,44,61,63,66,69,74],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/utils.py":[1,2,4,5,6,7,8,9,10,11,12,13,14,16,18,19,20,26,27,30,41,55,58,66,73,82,107,113,119,172,186,246,283,337,359,375,392,400,416],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/compat.py":[1,4,5,9,10,15,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/exceptions.py":[1,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/models.py":[1,3,4,5,6,7,10,14,15,34,70,71,72,73,75,77,78,80,86,94,98,108,130,142,159,161],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_totp/models.py":[1,3,4,5,7,8,9,10,11,13,14,15,18,22,26,72,73,74,75,76,77,78,79,81,82,84,91,113],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/oath.py":[1,3,4,5,6,8,10,11,17,54,89,137,138,146,150,154,167,171,175],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/util.py":[1,3,4,6,7,10,51],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_static/models.py":[1,3,4,6,8,11,25,26,36,47,48,49,51],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/models.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/models.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/models.py":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,37,38,40,42,43,44,45,48,49,50,51,52,53,54,57,58,59,60,63,66,100,103,104,105,108,110,114,116,124,129,132,175,184,185,187,189,191,192,193,194,197,198,199,202,203,204,205,208,212,217,218,219,222,223,224,227,228,229,232,233,236,237,240,256,279,300,303,306,307,309,311,314,316,318,319,321,324,329],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/betterforms/models.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/admin.py":[1,2,3,4,5,6,9,10,11,12,13,14,15,16,17,18,19,21,22,25,26,27,28,29,31,40,41,42,43,45,46,47,48,49,52,53,54,57,58,59,60,61,62,63,64,66,71,81,90,94,95,96,100,127,128,190,83,84,85,86,88],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/forms.py":[1,3,4,7,10,11,12,13,14,15,16,17,18,20,23,24,25,27,44,45,47,51,56,60,61,65,69,71,73,74,75,76,77,79,80,81,82,83,86,87,88,89,91,96,106,117,125,126,127,128,129,48,49,135,136,137,138,140,149,156,160,161,162,163,164,165,169,170,173,176,191,204,221,224,232,233,236,252,265,266,267,268,269,270,299,303,305,307,308,309,310,311,313,314,315,316,319,323,335,343,347,349,350,352,353,354,355,358,360,373,376,378,380,381,382,383,384,385,387,388,389,390,391,394,398,410,418],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/tokens.py":[1,3,4,5,8,12,13,14,16,23,54,65,85,88,93],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/decorators/debug.py":[1,3,6,41,64,78,65,77],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/admin.py":[1,3,4,5,6,9,10,11,12,15,16,20,83,84,85,86,88,90,124,125,128,129],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/forms.py":[1,2,3,4,7,10,13,33,38,46,52,53,54,55,56,57,58,59],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/admin.py":[1,2,5,6,7,8],"/home/valberg/code/bornhack/bornhack-website/src/profiles/admin.py":[1,2,5,6,7,10,11,12,13,14,18,21,24],"/home/valberg/code/bornhack/bornhack-website/src/camps/admin.py":[1,2,5,6,7],"/home/valberg/code/bornhack/bornhack-website/src/shop/admin.py":[1,3,4,19,20,21,22,23,26,27,29,30,31,32,33,37,38,40,41,42,43,44,45,46,47,51,55,56,58,59,60,61,62,63,64,65,69,73,74,76,80,84,87,91,94,103,104,106,107,108,109,110,111,112,116,117,120,123,124,127,128,129,133,136,140,141,142,143,144,145,146,147,148,149,150,154,155,156,157,158,159,162,164,166,168,171,173,176,178,181,184],"/home/valberg/code/bornhack/bornhack-website/src/tickets/admin.py":[1,3,11,12,13,15,18,21,22,24,25,29,30,34,35,37,38,39,40,44,45,46,47,50,53,54,55,58,59,60,63,67,68,69,70,71,72,73,77,78,79,80,81,84,87,88],"/home/valberg/code/bornhack/bornhack-website/src/news/admin.py":[1,3,6,7,8,9,11,13,15,17],"/home/valberg/code/bornhack/bornhack-website/src/villages/admin.py":[1,3,6,7,9,10,11,12,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/admin.py":[1,5,8,23,24,25,28,30,31,34,36,39,40,41,55,57,60,61,62,65,66,67,68,71,72,73,74,76,77,78,79,80,83,84,85,88,89,90,91,94,95,96,99,100,103,104,105,107,108,112,115,117,118,119,121,122,123],"/home/valberg/code/bornhack/bornhack-website/src/info/admin.py":[1,2,3,9,10,11,12,15,16,17,18,21,22,23,24,25,26],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/admin.py":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,25,27,29,31,33,35,37,39,43,51,59,67,79,89,96,130,143,157,161,165,194,214,230,238,264,131,133,144,145,146,147,149,150,151,153],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/conf/urls/__init__.py":[1,2,4,6,7,8,9,12,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/views/defaults.py":[1,3,7,8,10,11,12,13,19,20,63,64,81,82,103,104],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/views.py":[1,3,6,8,12,16,21,49,55,57,59,61,63,72],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/admin.py":[1,3,6,7,8,9,12,13,14,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/ircbot/admin.py":[1,2,4],"/home/valberg/code/bornhack/bornhack-website/src/teams/admin.py":[1,2,3,4,7,8,10,11,12,13,17,18,21,22,23,25,28,29,30,31,32,33,34,35,36,37,41,42,43,44,45,46,48,51,52,54,55,56,59,61,78,80,96,100,101,103],"/home/valberg/code/bornhack/bornhack-website/src/teams/email.py":[1,2,3,6,21,43],"/home/valberg/code/bornhack/bornhack-website/src/camps/utils.py":[1,2,3,6,13,17,18,19,21,32],"/home/valberg/code/bornhack/bornhack-website/src/bar/admin.py":[1,2,5,6,7,10,11,12,13],"/home/valberg/code/bornhack/bornhack-website/src/events/admin.py":[1,2,4,5,6,8,9,10],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/admin.py":[1,3,6,7,8,9],"/home/valberg/code/bornhack/bornhack-website/src/tokens/admin.py":[1,2,4,5,6,7,8,11,12,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/feedback/admin.py":[1,3,6,7,8],"/home/valberg/code/bornhack/bornhack-website/src/economy/admin.py":[1,3,8,9,10,11,12,15,16,17,18,19,24,27,30,33,36,37,38,39,40,41,46,49,52,55,58,59,60,61,62,63,68,69,70,72,73,74],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/admin.py":[1,3,4,5,8,9,10,11,12,14,19,20,21,22,25,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/admin.py":[1,3,4,5,6,8,11,28,33,34,35,39,41,50,57,64,68,70,75,12,14,16,18,20,22,25,77,80],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/forms.py":[1,2,3,6,9,11,12,13,17,19,29,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/forms.py":[1,3,4,5,7,8,11,57,59,60,61,62,63,66,95,112,127,138,145,150,213,214,215,219,221,228,263,264,265,266,268,274,281],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_totp/admin.py":[1,3,4,5,6,7,8,10,11,15,18,22,23,26,27,29,30,32,33,35,36,39,40,41,43,53,61,67,75,88,104,105,69,70,71,73],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_static/admin.py":[1,3,4,6,9,10,11,14,18,20,21,24,27,32,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/admin/__init__.py":[5,6,7,8,9,11,12,13,14,15,16,17,18,19,21,24,47,49,50,51,53,66,127,133,143,157,158,161,162,165,166],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/admin/widgets.py":[2,3,4,5,6,7,8,11,12,13,16,20,22,24,26,34,36,42,46],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/hacks.py":[1,7,10,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/management/commands/runserver.py":[1,2,3,8,9,11,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/handlers.py":[1,2,4,5,6,7,8,11,15,18,20,25,30,34,42,49,53,63],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/views.py":[5,6,7,9,10,11,12,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/commands/runserver.py":[1,2,3,4,5,6,8,9,10,13,15,20,23,24,27,28,30,31,32,33,34,36,54,62,66,97,106,161],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/management/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/management/commands/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/management/commands/runserver.py":[1,2,3,5,6,7,8,10,11,12,13,15,17,20,21,22,24,50,61,116,130],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/routing.py":[1,3,5,6,7,9,11,12,24,45,49,51,56,65,92,99,104,106,123,157,161,163,166],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/http.py":[1,2,3,4,5,6,8,9,10,11,12,13,14,15,17,18,20,23,27,31,33,138,142,145,151,154,160,161,163,168,178,180,183,185,195,216,256,272,308,358],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/asgiref/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/asgiref/sync.py":[1,2,3,4,5,8,14,16,25,66,72,85,90,93,97,99,102,110,116,127,128,100],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/exceptions.py":[1,5,7,10,13,15,18,21,23,26,30,32,35,39,41,44,47,49,52,55,57,60,63,65],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/daphne/endpoints.py":[2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/channels/staticfiles.py":[1,2,4,5,6,7,9,12,16,18,22,26,35,44,47,49,56,62],"/home/valberg/code/bornhack/bornhack-website/src/program/signal_handlers.py":[1,3,5,6,7,9,10,11,14,33],"/home/valberg/code/bornhack/bornhack-website/src/program/email.py":[1,3,4,5,6,9,33,57,81],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/commands/test.py":[1,3,4,5,8,9,12,13,15,28,52,21,22,23,26,29,30,31,33,34,35,37,38,39,41,42,43,47,49,50,53,55,56,58],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/test/runner.py":[1,2,3,4,5,6,7,8,9,10,12,13,14,15,19,21,22,23,24,27,28,33,39,47,52,57,64,74,83,85,94,98,106,122,169,176,180,183,186,189,193,196,201,206,217,220,223,233,238,243,245,247,252,260,272,275,300,313,327,330,331,332,334,340,395,396,398,399,400,401,402,407,422,462,466,548,554,557,564,569,574,583,587,590,612,628,650,676,689,424,425,426,428,429,430,432,433,434,436,437,438,440,441,442,444,445,446,448,449,450,264,266,267,268,269,451,453,454,455,457,458,459,409,410,411,412,413,414,415,416,417,418,419,420,602,463,464,603,467,468,469,471,472,473,474,477,478,479,481,484,486,499,500,501,502,509,510,512,618,619,620,621,625,514,518,520,522,525,532,640,641,642,643,661,662,664,665,666,668,669,670,671,644,645,646,647,534,546,604,549,550,551,605,567,606,570,559,560,555,561,571,572,607,576,577,578,579,580,608,584,585,609,588],"/home/valberg/code/bornhack/bornhack-website/src/backoffice/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/bar/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/camps/management/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/camps/management/commands/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/events/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/events/tests.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/feedback/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/feedback/tests.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/info/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/ircbot/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/people/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/tests.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/shop/management/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/shop/management/commands/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/shop/templatetags/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/shop/tests.py":[1,2,4,6,12,13,15,21,35,42,53,65,17,18,19,37,39,40,67,68,70,72,74,75,55,56,58,60,62,63,23,25,26,27,28,29,31,32,33,44,45,46,48,50,51],"/home/valberg/code/bornhack/bornhack-website/src/shop/factories.py":[1,3,5,7,9,12,13,14,16,19,20,21,23,24,25,26,27,28,29,37,38,39,41,44,45,46,48,49,50,51,30,31,32],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/__init__.py":[4,15,22,26,28,46,71,72,73,74,77,78,81,82],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/base.py":[4,6,7,8,10,11,12,13,14,16,21,26,34,35,37,53,96,103,104,105,108,118,119,125,137,143,144,156,163,178,201,235,246,261,272,284,308,319,326,341,367,375,378,385,391,393,396,401,405,406,409,410,412,416,145,146,147,148,149,150,151,153,154,419,421,422,433,442,443,463,464,480,485,502,503,513,528,543,548,560,565,577,586,598,615,633,648,667,668,673,68,23,69,70,74,75,77,28,29,30,78,31,80,81,83,84,86,87,88,89,90,91,203,204,206,180,183,184,185,186,189,170,120,121,122,123,171,172,173,174,175,190,191,126,127,128,129,130,132,135,192,193,195,208,373,209,210,212,238,244,216,217,218,219,220,222,223,334,336,339,226,231,345,347,349,360,361,365,233,158,159,161,94,678,681,682,683,688,690,691,692,694,698,239,240,335,703,704,705,706,708,715,720,721,722,725,726,727,728,730,739,744,745,746,749,338,224,43,45,46,563,493,499,500,269,252,255,256,440,394,270,397,398,399,286,288,483,291,292,293,297,301,302,303,306,309,311,313,314,320,321,322,323,253],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/builder.py":[1,3,5,6,7,8,11,12,13,17,18,19,23,33,35,40,57,67,70,96,108,114,117,124,127,132,139,143,147,151,152,155,159,205,206,213,223,231,236,244,245,251,308,313,328,330,332,341,345,348,388,36,37,38,76,83,84,160,161,164,165,166,185,188,104,189,191,196,198,202,167,176,115,182,105,52,55,192,199,77,78,79,246,247,248,249,254,255,256,257,68,141,134,135,136,260,262,265,267,268,269,270,207,208,209,210,211,272,214,215,216,217,333,390,391,334,336,337,339,220,125,221,354,358,360,361,118,119,120,121,362,363,364,365,366,367,368,369,372,373,374,375,378,379,381,382,232,310,233,274,276,277,278,279,282,283,109,110,111,301,302,303,304,306],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/declarations.py":[4,6,7,9,10,11,12,15,18,24,26,30,32,43,56,57,62,68,70,74,79,85,87,91,96,97,100,129,140,142,151,161,169,177,179,189,201,207,217,218,223,228,236,237,244,252,253,258,278,289,291,294,296,300,306,326,343,348,349,362,370,377,384,386,387,388,390,394,398,417,418,420,422,426,427,429,431,440,441,445,448,451,452,473,494,508,512,518,520,532,537,538,542,547,554,555,556,560,576,580,591,592,594,596,608,609,610,614,629,637,639,641,648,652,678,679,682,694,695,706,391,297,298,392,350,351,352,353,71,72,33,35,37,34,320,321,324,406,396,363,368,407,408,409,410,411,413,414,75,76],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/enums.py":[5,6,7,12,16,18,21,24,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/compat.py":[5,7,8,10,12,24,27,29,33,35,25,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/errors.py":[5,6,9,10,13,14,17,18,21,22,25,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/utils.py":[4,6,8,9,12,45,71,83,90,95,96,98,102,105,115,123,124,125,131,140,145,149,151,153,165,176,154,155,156,157,158,159,160,161,162,99,100,120],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/faker.py":[14,17,18,20,22,23,25,28,41,42,48,55,58,59,61,62,71,72,82,83,43,44,45,46,56,49,50,51,52,73,74,76,77,78,80,53],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/__init__.py":[1,2,4,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/generator.py":[3,5,6,8,9,10,13,15,17,23,41,49,53,57,61,70,71,74,81,95,102,109,18,19,20,21,25,28,30,32,35,37,33,39,100,79,82,83,55,107,110,111,112],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/factory.py":[3,4,6,7,9,10,12,13,14,17,20,21,24,27,29,35,66,67,89,90,37,38,41,42,43,47,48,50,52,54,55,58,69,92,94,96,97,99,100,110,111,113,114,115,117,130,71,72,59,60,61,62,101,102,103,104,107,121,124,127,128,64],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/config.py":[2,3,5,8,11,12,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/utils/__init__.py":[4,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/utils/loading.py":[1,2,3,4,7,20,27,39,40,41,43,44,21,8,16,17,22,23,24,46,47,28,30,32,33,34,35,36],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/__init__.py":[3,4,6,9,10,11,12,13,14,17,19,20,24,25,29,30,31,32,33,34,35,36,37,38,40,41,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,84,87,93,96,106,113,120,130,140,159,164,171,175,179,206,224,242,255,275,302,312,321,85,222,180,182,185,189,193,196,197,199,200,201,202,203,264,266,267,268,269,271,273,104,240,190,191,319,288,289,290,291,292,293,294,295,296,297,298,299,300,310],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/utils/distribution.py":[3,4,7,13,20,45,46,49,51,52,53],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/address/__init__.py":[2,4,5,7,10,11,12,13,14,15,16,17,18,19,21,22,24,25,27,33,39,45,52,59,66,72,79,82],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/date_time/__init__.py":[3,5,7,8,9,11,12,14,15,17,19,22,28,38,39,42,43,44,45,48,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,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,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1366,1368,1378,1389,1402,1429,1436,1444,1451,1460,1467,1474,1481,1501,1512,1513,1528,1546,1570,1585,1600,1613,1628,1645,1680,1695,1725,1755,1784,1810,1833,1855,1877,1907,1939,1942,1945,1948,1951,1954,1957,1963,1967],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/dateutil/relativedelta.py":[2,3,5,6,8,9,11,13,15,18,103,110,231,264,268,272,282,317,404,407,410,439,457,475,493,495,518,520,547,567,570,578,580,596],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/utils/datetime_safe.py":[14,15,16,17,18,21,22,26,27,30,35,39,44,56,59,72],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/automotive/__init__.py":[3,4,5,7,10,11,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/bank/__init__.py":[2,3,4,5,7,8,11,16,18,21,22,24,27,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/barcode/__init__.py":[3,4,7,9,26,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/color/__init__.py":[2,3,5,7,10,11,151,157,160,163,166,173,177,180],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/company/__init__.py":[3,4,7,10,14,17,324,495,497,504,510,520,501,502],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/credit_card/__init__.py":[2,3,5,8,16,24,30,31,32,33,34,35,36,37,38,40,41,42,17,18,19,20,21,43,44,45,46,47,48,49,50,51,52,53,55,56,58,59,61,67,74,78,96,101,109],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/currency/__init__.py":[3,6,172,219,222,225,228,231,234,237],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/file/__init__.py":[2,4,5,7,10,49,62,76,85,97,107,123,135,138,139,140,141,142,143,144,145,146,152,161,170,177,193,196,197,198,199,200,201,203,205,213,222,230,242,251],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/geo/__init__.py":[2,4,6,9,15,975,978,992,996,999,1002,1011],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/internet/__init__.py":[2,4,6,8,12,15,18,25,27,28,29,32,34,36,41,42,43,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,66,67,68,72,73,74,76,78,81,85,89,96,100,104,111,119,122,124,131,132,140,146,150,154,158,165,173,179,185,193,194,209,210,227,228,235,238,256,279,322,330,365,394,419,428,432,435,441,444,448,449,455,160,161,162,187,188,189,125,128,129,191,220,222,223,230,231,232,233,236],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/text_unidecode/__init__.py":[2,3,4,6,8,9,10,11,13,17,18,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/utils/decorators.py":[3,5,8,15,22,29,30,33,23,26,9,12,32,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/utils/text.py":[3,5,6,9,10,11,14,22,25,27,28,29,30,31],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/isbn/__init__.py":[3,4,5,6,9,21,23,44,64,69],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/isbn/isbn.py":[5,8,10,12,19,21,25,38,43,45,49,60],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/isbn/rules.py":[11,13,15,16,20,22,23,24,25,26,27,28,29,30,31,34,35,36,37,38,39,40,41,42,43],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/job/__init__.py":[2,4,7,647,650],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/lorem/__init__.py":[1,3,6,9,24,25,26,28,45,56,81,100,127,141,54,40,41,43,115,118,119,121,122,93,94,70,73,74,76,77,79,125],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/misc/__init__.py":[3,4,5,6,7,9,12,13,16,23,31,41,51,62,77],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/person/__init__.py":[1,3,6,9,10,12,14,16,23,26,29,37,45,50,55,60,65,74,79,84,93,98,27,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/phone_number/__init__.py":[1,3,6,7,10,13,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/profile/__init__.py":[3,4,7,11,13,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/python/__init__.py":[3,5,6,8,10,13,14,17,35,59,62,65,72,79,89,94,106,123,139,60],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/ssn/__init__.py":[2,4,6,9,10,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/user_agent/__init__.py":[3,5,7,10,12,19,22,24,26,29,32,37,62,97,137,154,161,164,168],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/helpers.py":[5,7,8,10,11,14,15,30,46,51,56,61,66,71,76,81,86,91,96,100,105,109,113,117],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/alchemy.py":[4,6,7,9,10,12,13,14,18,19,26,39,59,60,62,64,65,67],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/django.py":[5,7,8,10,11,12,14,15,16,23,24,25,26,28,31,34,40,43,52,67,68,74,86,94,101,103,105,106,108,117,134,157,167,168,175,176,178,180,184,188,225,234,235,237,256,274,276,280,291,304,307,69,70,71,87,88,89,45,46,58,62,63,64,48,49,91,75,76,84,160,119,123,124,130,132,162,165,170],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/mogo.py":[5,8,10,13,14,15,16,18,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/factory/mongoengine.py":[5,8,11,14,15,17,18,20,24],"/home/valberg/code/bornhack/bornhack-website/src/utils/factories.py":[1,2,5,6,7,9,10],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/management/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/management/commands/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/teams/templatetags/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/teams/views/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/tickets/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/tickets/templatetags/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/tokens/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/tokens/templatetags/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/utils/management/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/utils/management/commands/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/utils/migrations/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/utils/templatetags/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/commands/migrate.py":[1,2,3,5,6,7,10,13,14,15,16,17,18,21,22,24,58,63,229,263,25,26,27,29,30,31,34,35,36,38,39,40,41,43,44,45,47,48,49,53,54,55,66,67,71,72,73,76,77,80,82,85,89,90,102,103,125,133,135,136,139,162,163,164,165,169,170,172,265,266,270,274,275,278,286,287,288,292,294,295,296,309,175,177,199,200,201,202,203,230,207,208,213,214,215,219,220,225,226],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/autodetector.py":[1,2,3,5,6,7,8,9,10,11,12,16,19,30,32,38,50,90,104,197,221,236,326,344,360,423,431,451,494,649,683,776,789,827,832,863,868,884,960,978,989,1000,1019,1056,1059,1062,1079,1115,1142,1156,1205,1230,1251],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/optimizer.py":[1,10,12,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/questioner.py":[1,2,3,5,6,7,9,12,17,19,24,55,60,65,69,73,77,83,85,93,108,142,161,186,192,198,206,226,228,232,236],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/loader.py":[1,2,3,5,6,7,8,10,15,18,41,43,51,64,126,130,148,176,186,199,275,301,315,44,45,46,47,48,49,206,66,67,68,69,71,58,61,62,72,75,76,77,89,93,97,99,100,101,102,105,106,107,108,117,121,122,123,78,81,82,83,84,98,208,211,212,215,216,217,218,220,181,183,222,184,225,226,187,189,191,149,155,158,163,164,165,166,192,193,194,190,150,228,246,247,280,281,282,284,286,287,307,308,309,310,312,313],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/graph.py":[1,2,4,5,7,10,17,22,23,28,31,34,37,40,43,46,49,54,67,79,80,85,95,99,120,122,127,139,144,168,204,241,245,252,271,290,300,311,325,345,348,352,355,363,381,123,124,125,129,130,134,24,25,26,135,136,137,246,150,156,162,50,35,163,47,164,166,158,159,161,140,81,82,83,141,142,132,91,92,93,382,305,306,307,38,308,309,243,29,319,320,321,322,323,258,261,328,329,330,331,332,333,334,335,338,339,340,341,343,262,263,264,265,57,58,59,60,32,61,62,63],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/recorder.py":[1,2,3,4,6,9,20,22,23,24,25,27,28,29,30,32,35,38,42,46,59,68,73,78,36,61,44,62,40,50,51,70,71],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/utils.py":[1,2,4,7,8,12,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/topological_sort.py":[1,26],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/executor.py":[1,2,4,5,6,7,10,14,16,22,64,82,127,152,213,231,256,274,291,17,18,19,20,26,27,30,31,33,42,47,48,49,52,50,58,59,60,61,62,69,70,72,28,73,74,75,77,78,79,80,91,93,96,98,99,101,105,113,114,117,132,133,134,140,141,147,233,234,235,236,241,243,244,246,250,252,253,254,148,139,150,123,285,286,125],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/management/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/management/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_static/management/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/management/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/management/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/management/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/migrations/0001_initial.py":[1,2,3,6,9,10,14,15,17,18,19,20,21,22,23,24,25,26,27,28,30,31,32,33,37,38,39,40,42,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py":[1,2,5,8,13,14,15,16,17,18,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py":[1,4,7,12,13,14,15,16,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0008_alter_user_username_max_length.py":[1,2,5,8,12,13,14,15,16,17,18,19,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0001_initial.py":[1,2,3,4,7,10,14,15,17,18,19,20,21,22,23,25,28,29,30,31,34,37,38,40,41,42,45,46,49,52,53,55,56,57,58,59,60,61,63,64,65,66,68,69,70,71,72,73,75,76,77,81,82,83,84,85,89,90,91,92,96,97,98,101],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0003_alter_user_email_max_length.py":[1,4,7,11,12,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0007_alter_validators_add_error_messages.py":[1,2,5,8,12,13,14,15,16,17,18,19,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0006_require_contenttypes_0002.py":[1,4,7,8,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0002_alter_permission_name_max_length.py":[1,4,7,11,12,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0004_alter_user_username_opts.py":[1,2,5,8,13,14,15,16,17,18,19,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0005_alter_user_last_login_null.py":[1,4,7,11,12,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/migrations/0009_alter_user_last_name_max_length.py":[1,4,7,11,12,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/migrations/0001_initial.py":[1,2,5,7,11,12,14,15,16,17,20,21,22,23,25,27,30,31,32],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/migrations/0002_remove_content_type_name.py":[1,4,14,17,21,22,23,25,26,27,28,30,31,32,33,35,36,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/migrations/0001_initial.py":[1,2,5,7,11,12,14,15,17,18,21,22,23,24,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/migrations/0001_initial.py":[1,2,3,6,8,11,12,14,15,16,18,21,22,23,24,26,28],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/migrations/0002_alter_domain_unique.py":[1,2,5,8,12,13,14,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0001_initial.py":[4,5,6,9,12,16,17,19,20,21,22,25,26],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0007_auto_20170711_2025.py":[3,5,7,10,13,14,18],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0002_profile_description.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0009_profile_nickserv_username.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0010_auto_20180411_2305.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0005_auto_20170711_1721.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0006_auto_20170711_1757.py":[3,5,8,11,15,16,17,19,20,21,22,24,25,26,27,29,30,31,32],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0004_auto_20170430_1408.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0008_auto_20180325_2022.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/profiles/migrations/0003_auto_20170413_1703.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0010_auto_20161220_1714.py":[5,8,11,15,16,17,19,20,21,22,23,25,26,27,28,29],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0020_camp_read_only.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0006_auto_20160804_1705.py":[5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0024_populate_camp_shortslugs.py":[3,5,7,14,16,20],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0009_auto_20161220_1645.py":[5,6,7,10,13,17,18,19,20,22,23,24,25,27,28,29,30,31,33,34,35,36,37],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0008_delete_day.py":[5,8,11,12,16,17],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0016_camp_description.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0030_camp_light_text.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0028_auto_20180525_1025.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0005_auto_20160510_2011.py":[5,8,11,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0026_auto_20180506_1633.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0019_auto_20170131_1849.py":[3,5,6,9,12,16,17,18,19,21,22,23,24,26,27,28,29,31,32,33,34,36,37,38,39,41,42,43,44],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0007_auto_20161212_1803.py":[5,6,7,8,9,12,15,16,20,21,22,24,25,26,28,29,30,32,33,34,36,37,38,40,41,42,44,45,46,47,48,50,51,52,53,54,56,57,58,59,60,62,63,64,65,66,68,69,70,71,73,74,75,76,78,79,80,81,83,84,85,86,88,89,90,91],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0018_auto_20170128_1841.py":[5,6,9,12,16,17,18,19,21,22,23,24,26,27,28,29],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0021_auto_20170711_2247.py":[3,5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0031_auto_20180830_0014.py":[3,6,9,13,14,16,19,20,21,24,25,26],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0022_camp_colour.py":[3,5,8,11,15,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0003_auto_20160422_2019.py":[5,8,11,15,16,17,19,20,21,23,24],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0001_initial.py":[4,5,6,9,12,16,17,19,20,21,22,23,24,27,28,31,32,34,35,36,37,38,41,42,45,46,48,49,50,51,52,53,54,55,58,59,62,63,65,66,67,68,69,70,71,74,75],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0002_auto_20160117_1718.py":[5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0013_auto_20161229_2201.py":[5,6,9,12,16,17,18,20,21,22,24,25,26,28,29,30,32,33,34,35,37,38,39,40,42,43,44,45],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0015_auto_20170116_1634.py":[5,8,11,15,16,17,19,20],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0004_camp_ticket_sale_open.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0029_auto_20180815_2018.py":[3,6,9,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0011_auto_20161228_1750.py":[5,8,11,15,16,17,18,19,21,22,23,24,25],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0012_auto_20161228_2312.py":[5,8,11,15,16,17,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0032_auto_20180917_1754.py":[3,6,9,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0014_auto_20161229_2202.py":[5,6,7,10,13,17,18,19,20,22,23,24,25,27,28,29,30],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0025_auto_20180318_1250.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0017_remove_camp_description.py":[5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0027_auto_20180525_1019.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/camps/migrations/0023_camp_shortslug.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0036_auto_20170319_2155.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0009_epaycallback_md5valid.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0041_auto_20170408_1104.py":[3,5,6,9,12,16,17,18,19,20,22,23,24,25],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0055_order_customer_address.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0019_invoice_pdf_generated.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0054_auto_20180415_1159.py":[3,4,7,10,14,15,16,17,19,20,21,22,24,25,26,27,29,30,31,32],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0010_auto_20160517_1313.py":[5,6,9,12,16,17,19,20,21,22,23,26,29,30,31,33,34,35,36],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0012_ticket.py":[5,6,7,10,13,17,18,20,21,22,23,24,27],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0017_auto_20160529_1626.py":[5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0053_auto_20180318_0906.py":[3,5,6,7,10,13,17,18,19,20,22,23,24,25,27,28,29,30,32,33,34,35,37,38,39,40,42,43,44,45,47,48,49,50],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0027_auto_20160712_2036.py":[5,6,7,10,13,14,18,19,21,22,23,24,25,26,27,30,33,34,35,37,38,39,40,42,43,44,45,47,48,49,50,52,53,54,55,57,58,59,60,62,63,64,65,67,68,69,70,72,73,74,75],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0026_order_refunded.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0023_order_cancelled.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0008_auto_20160516_0954.py":[5,6,7,10,13,17,18,19,20,21,23,24,25,26,27],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0043_auto_20170507_1309.py":[3,5,6,7,10,13,17,18,20,21,22,23,24,25,28,31,32,33,34],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0030_auto_20160827_0752.py":[5,8,11,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0046_coinifyapirequest_method.py":[3,5,8,11,15,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0042_auto_20170507_1000.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0034_auto_20170131_1849.py":[3,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28,30,31,32,33,35,36,37,38],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0005_product_slug.py":[5,8,11,15,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0003_auto_20160513_0646.py":[5,6,9,12,16,17,18,19,21,22,23,24,26,27,28,29,31,32,33,34],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0013_ticket_qrcode_base64.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0015_coinifyapiinvoice_coinifycallback.py":[5,6,7,10,13,17,18,20,21,22,23,24,27,30,31,33,34,35,36,37,40],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0002_orderproductrelation_handed_out.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0033_auto_20161212_1756.py":[5,8,11,15,16,17,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0038_auto_20170323_2021.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0018_auto_20160529_1736.py":[5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0056_auto_20180827_1020.py":[3,6,9,13,14,15,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0001_initial.py":[5,6,7,8,9,10,13,15,18,19,23,24,26,27,28,29,32,33,36,37,39,40,41,42,43,46,47,50,51,53,54,55,56,57,58,61,64,65,67,68,69,72,73,75,76,77,78,79,80,81,84,85,86,89,90,92,93,94,95,98,99,102,103,104,105,107,108,109,110,112,113,114,115,117,118,119,120,122,123,124,125],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0006_ensure_slugs.py":[5,8,19,22,26],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0029_auto_20160712_2133.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0028_auto_20160712_2119.py":[5,8,11,15,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0031_auto_20161109_1000.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0039_auto_20170403_1752.py":[3,5,6,9,12,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0050_auto_20170916_1336.py":[3,5,6,7,10,13,17,18,19,20,22,23,24,25,27,28,29,30],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0004_auto_20160515_1604.py":[5,6,9,12,16,17,18,19,20,22,23,24,25],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0052_auto_20171004_0005.py":[3,5,8,11,15,16,17,19,20,21,23,24],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0016_auto_20160529_1122.py":[5,6,9,12,16,17,18,19,20,22,23,24,25],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0035_auto_20170222_1629.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0037_auto_20170319_2204.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0057_order_notes.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0014_ticket_name.py":[5,8,11,15,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0007_auto_20160515_2157.py":[5,8,11,15,16,17,18,20,21,22,24,25,26],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0051_creditnote_danish_vat.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0021_ticket_email.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0044_coinifyapiinvoice_coinify_id.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0040_auto_20170408_1055.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0011_auto_20160517_1902.py":[5,8,11,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0020_auto_20160530_1824.py":[5,8,11,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0032_order_customer_comment.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0045_auto_20170507_1648.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0047_auto_20170522_1942.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0022_auto_20160530_2301.py":[5,6,9,12,16,17,18,19,21,22,23,24,26,27,28,29],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0025_creditnote.py":[5,6,7,10,13,14,18,19,21,22,23,24,25,26,27,28,29,32],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0049_auto_20170914_2034.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0048_product_ticket_type.py":[3,5,6,9,12,13,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/shop/migrations/0024_auto_20160605_2126.py":[5,8,11,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/0008_newsitem_archived.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/0003_newsitem_slug.py":[5,8,11,15,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/0001_initial.py":[5,8,10,12,16,17,19,20,21,22,23,24,25,28],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/0005_auto_20160618_1902.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/0007_auto_20161220_1136.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/0004_auto_20160610_1743.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/0006_remove_newsitem_public.py":[5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/news/migrations/0002_auto_20160530_2223.py":[5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/utils/migrations/0001_initial.py":[3,5,8,10,12,16,17,19,20,21,22,23,24,25,26,27,28,31],"/home/valberg/code/bornhack/bornhack-website/src/utils/migrations/0003_auto_20170521_1932.py":[3,5,6,9,12,16,17,18,19,21,22,23,24,26,27,28,29],"/home/valberg/code/bornhack/bornhack-website/src/utils/migrations/0002_remove_outgoingemail_recipient.py":[3,5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0001_initial.py":[5,6,7,8,11,13,16,17,21,22,24,25,26,27,28,29,30,31,32,35],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0011_auto_20180318_0906.py":[3,5,6,7,10,13,17,18,19,20,22,23,24,25],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0009_auto_20161229_2143.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0003_auto_20160705_2159.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0006_remove_village_camp.py":[5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0008_auto_20161228_2209.py":[5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0004_village_deleted.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0007_village_camp.py":[5,6,9,12,13,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0005_auto_20160712_2036.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0010_auto_20170318_1506.py":[3,5,8,11,12,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/villages/migrations/0002_auto_20160705_2154.py":[5,8,11,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0015_auto_20170128_1841.py":[5,8,11,12,16,17,18,19,21,22,23,24,26,27,28,30,31,32],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0008_auto_20160808_1747.py":[5,8,11,15,16,17,19,20,21,23,24,25,26,28,29,30,31,33,34,35,36,38,39,40,41],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0017_eventinstance_notifications_sent.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0019_auto_20170205_1940.py":[3,5,6,9,12,13,17,18,20,21,22,23,24,25,26,29,32,33,34,35],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0033_auto_20170312_1857.py":[3,5,6,7,8,9,12,15,16,17,21,22,24,25,26,27,28,29,30,31,34,37,38,40,41,42,43,44,45,46,47,48,49,52,55,56,57,59,60,61,63,64,65,67,68,69,71,72,73,75,76,77,79,80,81,83,84,86,87,89,90,91,92,94,95,96,97,99,100,101,102],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0038_favorite.py":[3,5,6,7,10,13,14,18,19,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0056_add_urltypes.py":[3,5,49,52,56],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0005_auto_20160807_1312.py":[5,8,11,15,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0002_eventtype_color.py":[5,8,11,15,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0012_auto_20161229_2150.py":[5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0064_auto_20180810_1748.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0006_auto_20160807_1320.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0071_auto_20180827_1958.py":[3,6,9,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0010_auto_20161212_1809.py":[5,6,9,12,13,17,18,20,21,22,23,24,27,30,31,32,34,35,36,38,39,40,42,43,44,45,47,48,49,50],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0061_auto_20180603_1525.py":[3,4,7,10,14,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0063_auto_20180809_1525.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0027_auto_20170307_1701.py":[3,5,6,9,12,13,14,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0035_auto_20170314_2325.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0068_add_email_to_speaker_and_speaker_proposal.py":[3,6,21,24,28],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0049_add_event_tracks.py":[3,5,21,24,28],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0043_auto_20170801_1526.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0059_auto_20180523_2241.py":[3,4,7,10,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0007_auto_20160807_1333.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0055_auto_20180521_2354.py":[3,4,7,10,14,15,17,18,19,20,21,22,23,24,27,30,31,33,34,35,36,37,40,43,44,45,46],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0024_auto_20170222_1629.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0039_auto_20170430_1408.py":[3,5,6,9,12,13,17,18,19,20,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0057_auto_20180522_0659.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0004_auto_20160804_1712.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0018_eventtype_notifications.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0028_auto_20170307_2014.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0029_auto_20170307_2042.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0045_event_proposal.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0053_auto_20180519_2325.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0014_speaker_camp.py":[5,6,9,12,13,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0058_auto_20180523_0844.py":[3,6,9,13,14,15,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0036_auto_20170316_0004.py":[3,5,6,9,12,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0048_auto_20180512_1625.py":[3,4,5,8,11,12,13,17,18,20,21,22,23,24,25,26,29,30,31,33,34,35,37,38,39,41,42,43,45,46,47,48,50,51,52,53,55,56,57,58,60,61,62,63,65,66,67,68,70,71,72,73,75,76,77,78,80,81,82,83,85,86,87,88,90,91,92,93,95,96,97,98,100,101,102,103,105,106,107,108,110,111,112,113,115,116,117,118,120,121,122,123,125,126,127,128,130,131,132],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0066_speaker_email.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0001_initial.py":[5,6,9,11,14,18,19,21,22,23,24,25,26,27,28,31,34,35,37,38,39,40,41,44,47,48,50,51,52,53,54,55,56,59,62,63,64,65],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0022_auto_20170218_1148.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0026_speaker_user.py":[3,5,6,7,10,13,14,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0050_auto_20180512_1650.py":[3,6,9,13,14,15,17,18,19,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0051_auto_20180512_1801.py":[3,4,7,10,14,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0046_auto_20180318_0906.py":[3,5,6,7,10,13,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0041_auto_20170711_2248.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0040_eventproposal_allow_video_recording.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0003_eventtype_light_writing.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0031_auto_20170312_1529.py":[3,5,8,11,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0011_auto_20161229_2149.py":[5,6,9,12,16,17,18,20,21,22,24,25,26,28,29,30,31],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0025_auto_20170306_1938.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0044_auto_20170801_1527.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0069_add_bogus_email_to_old_speakers.py":[3,6,15,18,22],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0013_auto_20170121_1312.py":[5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0009_auto_20160827_0752.py":[5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0020_auto_20170205_1940.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0052_auto_20180519_2324.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0067_auto_20180818_1634.py":[3,6,9,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0034_auto_20170314_2012.py":[3,5,6,9,12,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0070_auto_20180819_1729.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0060_auto_20180603_1455.py":[3,4,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28,30,31,32,33,35,36,37,38],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0047_auto_20180415_1159.py":[3,4,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28,30,31,32,33,35,36,37,38,40,41,42,43,45,46,47,48,50,51,52,53,55,56,57,58,60,61,62,63,65,66,67,68,70,71,72,73,75,76,77,78,80,81,82,83],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0042_auto_20170715_1547.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0054_auto_20180520_1509.py":[3,6,9,13,14,15,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0016_auto_20170131_1849.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0062_auto_20180717_1720.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0023_auto_20170218_1243.py":[3,5,6,9,12,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0032_auto_20170312_1556.py":[3,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28,30,31,32,33,35,36,37,38,40,41,42,43],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0021_auto_20170205_2130.py":[3,5,8,11,12,16,17,18,19,21,22,23,24,26,27,28],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0065_speakerproposal_email.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0030_auto_20170312_1230.py":[3,5,6,7,8,9,12,15,16,17,21,22,24,25,26,27,28,29,30,31,32,35,38,39,41,42,43,44,45,46,47,48,49,50,53,56,57,58,60,61,62,63,65,66,67,68,70,71,72,73,75,76,77,78,80,81,82,83,85,86,87,88,90,91,92,93,95,96,97,98,100,101,102,103,105,106,107,108,110,111,112,113,115,116,117,118,120,121,122,123,125,126,127,128,130,131,132,133,135,136,137,139,140,141,142,144,145,146],"/home/valberg/code/bornhack/bornhack-website/src/program/migrations/0037_eventtype_include_in_event_list.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/info/migrations/0001_initial.py":[5,6,9,11,14,18,19,21,22,23,24,25,26,27,30,33,34,36,37,38,39,40,41,42,43,46,49,50,51,53,54,55],"/home/valberg/code/bornhack/bornhack-website/src/info/migrations/0006_auto_20180520_1113.py":[3,4,7,10,14,15,16,17,19,20,21,23,24,25],"/home/valberg/code/bornhack/bornhack-website/src/info/migrations/0003_auto_20170218_1148.py":[3,5,8,11,15,16,17,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/info/migrations/0002_auto_20161228_2312.py":[5,8,11,15,16,17,19,20,21,22,24,25,26,27],"/home/valberg/code/bornhack/bornhack-website/src/info/migrations/0005_add_teams_to_categories.py":[3,4,7,70,73,77],"/home/valberg/code/bornhack/bornhack-website/src/info/migrations/0007_auto_20180520_1511.py":[3,4,7,10,14,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/info/migrations/0004_infocategory_team.py":[3,4,7,10,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0010_populate_logo_filename.py":[3,5,11,14,18],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0001_initial.py":[3,5,6,9,11,13,17,18,20,21,22,23,24,25,26,29],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0003_sponsortier_camp.py":[3,5,6,9,12,13,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0007_auto_20180318_0906.py":[3,5,6,9,12,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0008_auto_20180815_1119.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0002_auto_20170711_2341.py":[3,5,6,9,12,16,17,19,20,21,22,23,26,29,30,31,32],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0009_sponsor_logo_filename.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0011_auto_20181118_1513.py":[3,6,9,13,14,15,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0004_sponsortier_weight.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0006_auto_20170715_1110.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/migrations/0005_sponsor_url.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/ircbot/migrations/0001_initial.py":[5,8,10,12,16,17,19,20,21,22,23,24,27],"/home/valberg/code/bornhack/bornhack-website/src/ircbot/migrations/0003_outgoingircmessage_expired.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/ircbot/migrations/0002_outgoingircmessage_timeout.py":[3,5,6,7,10,13,17,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0003_auto_20170401_2227.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0008_team_needs_members.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0014_remove_teammember_deleted.py":[3,5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0007_teamarea_description.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0018_auto_20171122_2204.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0005_auto_20170402_1331.py":[3,5,6,7,10,13,14,15,19,20,22,23,24,25,26,27,30,33,34,35,37,38,39,41,42,43,44,46,47,48,50,51,52,54,55,56,57,59,60,61,63,64,66,67,68],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0037_auto_20180408_1416.py":[3,5,6,7,10,13,17,18,19,20,22,23,24,25,27,28,29,30,32,33,34,35,37,38,39,40],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0028_auto_20180331_1416.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0013_auto_20170523_2046.py":[3,5,6,9,12,16,17,18,19,20,22,23,24,25,27,28,29,30],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0011_auto_20170402_1608.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0024_populate_shortslugs.py":[3,5,7,14,16,20],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0030_auto_20180402_1514.py":[3,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0029_remove_team_area.py":[3,5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0031_auto_20180402_2146.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0032_auto_20180402_2148.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0017_auto_20171122_1928.py":[3,5,6,9,12,16,17,19,20,21,22,23,24,25,28,31,32,33],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0038_auto_20180412_1844.py":[3,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28,30,31,32,33,35,36,37,38,40,41,42,43],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0039_fix_irc_channels.py":[3,5,7,24,27,31],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0050_team_guide.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0022_auto_20180318_1135.py":[3,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28,30,31,32,33],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0035_auto_20180402_2344.py":[3,5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0025_auto_20180318_1318.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0045_merge_20180805_1131.py":[3,6,9,10,13],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0002_auto_20170327_2208.py":[3,5,8,11,12,16,17,18,20,21,22,23,25,26,27],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0001_initial.py":[3,5,6,7,10,12,15,16,20,21,23,24,25,26,27,28,31,34,35,37,38,39,40,43,44,45,46],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0043_auto_20180702_1338.py":[3,4,5,8,11,15,16,18,19,20,21,22,25,28,29,30,31,33,34,35,36,38,39,40,41],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0027_fixup_teams.py":[3,5,7,18,50,53,57,58],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0046_auto_20180808_2154.py":[3,6,9,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0006_auto_20170402_1331.py":[3,5,6,9,12,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0015_team_mailing_list.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0048_auto_20180814_1950.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0026_team_camp.py":[3,5,6,9,12,13,17,18,19,20],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0033_auto_20180402_2204.py":[3,5,8,11,15,16,17,19,20,21,23,24,25,27,28],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0004_team_sub_team_of.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0040_auto_20180412_2109.py":[3,5,8,11,15,16,17,19,20,21,23,24,25,27,28,29],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0016_auto_20170711_2247.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0034_auto_20180402_2334.py":[3,5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0019_auto_20180304_1019.py":[3,5,8,11,15,16,17,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0020_auto_20180304_1233.py":[3,5,6,9,12,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0042_auto_20180413_1933.py":[3,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0012_teammember_responsible.py":[3,5,8,11,15,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0043_auto_20180804_1641.py":[3,4,7,10,14,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0044_auto_20180702_1507.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0047_taskcomment.py":[3,4,5,8,11,15,16,18,19,20,21,22,23,26],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0051_auto_20190312_1129.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0036_auto_20180403_0201.py":[3,5,8,11,12,16,17,18],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0041_auto_20180412_2231.py":[3,5,8,11,15,16,17,19,20,21,22],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0021_auto_20180318_0906.py":[3,5,6,7,10,13,17,18,19,20,22,23,24,25,27,28,29,30],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0049_auto_20180815_1119.py":[3,6,9,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0010_remove_team_members.py":[3,5,8,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0009_auto_20170402_1607.py":[3,5,6,7,10,13,14,18,19,21,22,25,26,27,28,30,31,32,33,35,36,37,38,40,41,42,43],"/home/valberg/code/bornhack/bornhack-website/src/teams/migrations/0023_auto_20180318_1256.py":[3,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28],"/home/valberg/code/bornhack/bornhack-website/src/tickets/migrations/0001_initial.py":[3,5,6,7,10,12,15,16,17,21,22,24,25,26,27,28,29,32,35,36,38,39,40,41,42,43,44,45,46,49,52,53,55,56,57,58,59,60,63,66,67,69,70,71,72,73,76,79,80,81,82,84,85,86,87,89,90,91,92],"/home/valberg/code/bornhack/bornhack-website/src/tickets/migrations/0005_auto_20180318_0906.py":[3,5,6,9,12,16,17,18,19,21,22,23,24,26,27,28,29,31,32,33,34,36,37,38,39,41,42,43,44,46,47,48,49],"/home/valberg/code/bornhack/bornhack-website/src/tickets/migrations/0004_auto_20170823_1228.py":[3,5,8,11,15,16,17,18,20,21,22,23,25,26,27,28],"/home/valberg/code/bornhack/bornhack-website/src/tickets/migrations/0002_auto_20170819_2222.py":[3,5,6,9,12,16,17,18,19,21,22,23,24,26,27,28,29,31,32,33,34],"/home/valberg/code/bornhack/bornhack-website/src/tickets/migrations/0003_auto_20170819_2309.py":[3,5,8,11,15,16,17,19,20,21,23,24,25],"/home/valberg/code/bornhack/bornhack-website/src/bar/migrations/0001_initial.py":[3,5,6,9,11,14,18,19,21,22,23,24,27,28,30,31,32,33,34,37,40,41,42,43],"/home/valberg/code/bornhack/bornhack-website/src/bar/migrations/0003_auto_20180318_0906.py":[3,5,6,9,12,16,17,18,19,21,22,23,24],"/home/valberg/code/bornhack/bornhack-website/src/bar/migrations/0002_auto_20170916_2128.py":[3,5,6,9,12,16,17,18,20,21,22,24,25,26,27],"/home/valberg/code/bornhack/bornhack-website/src/events/migrations/0002_create_eventtype.py":[3,5,7,11,14,18],"/home/valberg/code/bornhack/bornhack-website/src/events/migrations/0001_initial.py":[3,5,6,9,11,14,18,19,21,22,23,26,29,30,32,33,34,35,38,41,42,43,44,46,47,48,49],"/home/valberg/code/bornhack/bornhack-website/src/events/migrations/0003_create_another_eventtype.py":[3,5,7,12,15,19],"/home/valberg/code/bornhack/bornhack-website/src/events/migrations/0004_auto_20180403_1228.py":[3,5,8,11,15,16,17,18,20,21,22,23],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/migrations/0001_initial.py":[3,4,5,6,9,11,14,15,19,20,22,23,24,25,26,27,28,29,30,33],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/migrations/0002_auto_20180814_1942.py":[3,6,9,13,14,15,16],"/home/valberg/code/bornhack/bornhack-website/src/tokens/migrations/0004_auto_20180819_1743.py":[3,4,7,10,11,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/tokens/migrations/0001_initial.py":[3,4,7,9,12,16,17,19,20,21,22,23,24,27],"/home/valberg/code/bornhack/bornhack-website/src/tokens/migrations/0005_auto_20190327_2025.py":[3,6,9,13,14,15],"/home/valberg/code/bornhack/bornhack-website/src/tokens/migrations/0002_tokenfind.py":[3,4,5,8,11,12,16,17,19,20,21,22,23,26],"/home/valberg/code/bornhack/bornhack-website/src/tokens/migrations/0003_token_category.py":[3,6,9,13,14,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/feedback/migrations/0002_feedback_camp.py":[3,4,7,10,11,15,16,17,18,19],"/home/valberg/code/bornhack/bornhack-website/src/feedback/migrations/0001_initial.py":[3,4,5,6,9,11,14,18,19,21,22,23,24,25,28],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0001_initial.py":[3,4,5,6,9,11,14,15,16,20,21,23,24,25,26,27,28,29,30,31,32,35,38,39,41,42,43,44,45,46,47,48,51,54,55,56,57,59,60,61,62,64,65,66,67],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0005_auto_20190120_1532.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0008_auto_20190327_1721.py":[3,4,5,8,11,15,16,18,19,20,21,22,23,26,29,30,32,33,34,35,36,37,38,39,42,45,46,47,48,50,51,52,53,55,56,57,58,60,61,62,63,65,66,67],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0006_auto_20190120_1642.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0009_auto_20190328_0715.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0002_revenue.py":[3,4,5,6,9,12,13,14,15,16,20,21,23,24,25,26,27,28,29,30,31,32,33,34,37],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0003_auto_20180917_1933.py":[3,4,7,10,14,15,16,17],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0007_auto_20190327_0936.py":[3,6,9,13,14,15,16,18,19,20,21],"/home/valberg/code/bornhack/bornhack-website/src/economy/migrations/0004_auto_20181120_1835.py":[3,4,5,8,11,15,16,17,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/migrations/0001_initial.py":[2,4,5,6,8,11,14,18,19,21,22,23,24,25,28,29,31,33,34,36,37,38,39,40,43,44,46,50],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/migrations/0002_email_max_length.py":[2,4,5,7,8,11,14,18,19,20,21,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_totp/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_totp/migrations/0001_initial.py":[2,4,5,6,9,12,16,17,19,20,21,22,23,24,25,26,27,28,29,32,33,35],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_static/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/plugins/otp_static/migrations/0001_initial.py":[2,4,5,8,11,15,16,18,19,20,21,24,26,28,29,31,32,33,35,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/migrations/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/reversion/migrations/0001_squashed_0004_auto_20160611_1202.py":[3,5,6,7,10,12,15,16,20,21,23,24,25,26,29,32,33,35,36,37,38,39,40,41,42,45,48,49,50],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/models/sql/compiler.py":[1,2,3,4,5,7,8,9,10,11,14,15,16,17,18,20,23,24,38,44,58,135,181,251,358,368,385,395,439,590,634,659,689,702,737,910,969,979,1002,1013,1014,1027,1037,1103,1116,1127,1128,1130,1162,1185,1194,1229,1281,1302,1303,1318,1319,1376,1397,1440,1441,1460,25,26,27,28,33,34,35,36,1016,1017,1050,1051,1052,447,448,449,50,39,41,199,200,201,202,203,207,208,213,214,215,216,217,218,219,221,222,224,229,241,242,243,244,386,387,390,374,376,377,378,381,382,383,391,392,248,375,249,42,51,260,262,265,266,267,271,272,325,326,328,356,52,53,359,360,366,54,55,95,96,56,450,452,453,454,455,460,641,642,643,645,656,463,713,714,715,716,718,719,724,393,725,726,727,734,464,465,466,467,469,477,478,479,480,482,485,486,488,489,491,518,521,525,526,529,535,539,545,552,555,558,585,588,1053,1060,1063,1064,1065,1071,1074,1083,1087,1088,1089,1090,1092,1101,1018,1019,980,981,982,983,984,985,1000,1020,1021,1025,1465,1466,1467,1469,1283,1286,1287,1288,1232,1233,1234,1235,1236,1238,1240,1241,1190,1192,1167,1182,1183,1252,1254,1206,1212,1213,1218,1222,1139,1142,1145,1151,1158,1160,1225,1227,1256,1257,1258,1259,1263,1264,1267,1268,1269,1270,1289,1290,1292,1294,1295,1296,209,602,603,604,605,975,976,977,606,610,612,613,616,617,618,626,628,629,630,631,632,263,522,523,273,280,284,285,287,293,300,311,314,315,665,666,667,668,697,698,699,700,673,686,687,329,344,345,346,351,352,354,355,546,547,548,549,550,1033,1034,1035,40,204,205,206,481,553,1075,1076,1077,1078,1082,1055,1056,1057,1284,1293,1061,1079,1272,1273,1274,1291,225,226,227,717,986,987,988,998,999,1003,1004,1005,1006,1007,1008,1009,1010,1011,379,380,1383,1324,1406,1408,1409,1410,1411,1325,1327,1328,1329,1330,1336,1349,1352,1355,1356,1357,1361,1362,1363,1366,1368,1369,1371,1372,1373,1374,1073,1384,1385,1386,1388,1389,1390,1395],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/writer.py":[1,2,3,5,6,7,8,9,10,11,12,15,20,22,25,29,30,35,116,119,122,125,129,133,135,139,208,269,273,277,296,23,26],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/db/migrations/serializer.py":[1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,21,22,25,29,30,33,44,45,49,50,62,63,70,71,75,76,90,101,105,106,118,119,127,128,134,135,139,140,161,162,180,181,194,195,200,201,210,211,218,219,232,233,237,238,244,245,249,250,254,255,262,263,269,270,285,286,290],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/serializers/xml_serializer.py":[3,5,6,7,9,10,11,12,13,18,19,21,25,33,41,57,64,87,110,139,149,150,152,158,162,169,218,247,269,287,304,309,310,315,318,322,326,329,338,339,340,344,345,346,352,357,358,359,368,373,374,375,382],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/xmlutils.py":[3,5,6,7,10,11,14,15,24,31],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/serializers/pyyaml.py":[5,7,8,9,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/commands/createcachetable.py":[1,2,3,4,5,8,11,12,14,16,32,46,17,18,19,21,22,23,24,27,28,29,33,34,35,36,41,42,43],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/cache/backends/db.py":[1,2,3,4,6,7,8,9,10,13,17,18,31,32,41,49,97,102,107,112,202,213,238,257],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/cache/backends/locmem.py":[1,2,3,4,5,7,11,12,13,16,17,23,33,44,51,58,66,81,90,94,104,111,117,18,19,20,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/management/commands/check.py":[1,2,3,4,7,8,10,12,37,13,14,15,16,18,19,20,22,23,24,26,27,28,29,30,32,38,39,43,46,48,49,60,61,62,63,64,65],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/templatetags/cache.py":[1,2,3,7,10,11,18,52],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/core/cache/utils.py":[1,2,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/templatetags/l10n.py":[1,2,4,7,16,25,26,30,33,41],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/templatetags/tz.py":[1,3,5,6,8,13,14,19,29,37,83,86,87,91,99,102,103,107,113,116,117,120,125,148,173],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/templatetags/admin_list.py":[1,3,4,7,10,11,12,13,14,15,16,17,18,19,20,22,24,26,29,45,93,103,192,198,210,301,306,307,312,321,328,344,354,428,438,449,454,464,473,478],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/views/main.py":[1,2,4,5,6,9,12,15,18,19,20,21,22,23,24,27,28,29,30,31,32,35,38,39,91,104,188,206,239,247,269,316,356,401,413,426],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/templatetags/base.py":[1,3,6,10,12,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/templatetags/admin_modify.py":[1,3,4,6,8,11,43,48,84,89,99],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/templatetags/admin_static.py":[1,3,4,5,7,10],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/templatetags/log.py":[1,2,4,7,8,11,14,26],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/templatetags/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/templatetags/staticfiles.py":[1,3,4,7,9,12,22],"/home/valberg/code/bornhack/bornhack-website/src/shop/templatetags/shop_tags.py":[1,2,4,6],"/home/valberg/code/bornhack/bornhack-website/src/utils/templatetags/bornhack.py":[1,3,4,6,9],"/home/valberg/code/bornhack/bornhack-website/src/utils/templatetags/commonmark.py":[1,2,4,5,6,8,11,18,19,27,28],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/__init__.py":[2,4,5,6,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/main.py":[12,14,15,16,17,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/blocks.py":[1,3,4,5,6,7,8,9,12,14,15,16,17,18,19,20,21,28,29,30,31,34,35,36,37,38,39,41,42,43,44,45,46,47,48,49,50,51,54,59,63,70,84,151,162,163,165,166,169,170,173,178,179,181,182,185,186,189,194,195,197,198,201,202,220,225,226,228,229,240,241,244,249,250,252,253,269,270,273,278,279,281,282,286,287,290,295,296,298,299,303,304,307,312,313,315,316,344,345,360,365,366,368,369,376,377,382,387,388,390,391,394,395,409,414,421,423,424,425,426,427,428,429,430,433,434,448,449,472,473,493,494,510,511,530,531,541,542,561,562,575,576,598,609,628,637,667,672,703,847,862,878],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/common.py":[1,3,4,6,7,11,12,13,14,22,24,25,26,27,28,30,31,32,33,34,35,36,37,38,40,41,42,43,44,45,46,47,48,51,58,69,98,99,100,101,105,109],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/inlines.py":[1,3,4,5,6,7,9,10,11,12,22,24,25,52,57,58,59,60,62,63,64,65,66,67,68,69,72,73,74,75,76,77,78,79,80,81,82,83,85,88,97,103,124,130,132,139,151,159,169,192,219,246,257,320,353,362,368,486,498,534,547,562,583,693,706,709,718,735,758,826,867,882],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/node.py":[1,3,6,7,12,16,18,23,50,52,55,66,71,72,96,99,103,115,118,129,140,155,166,177],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/utils.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/dump.py":[1,3,4,5,8,50,56],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/render/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/render/html.py":[1,4,5,6,7,10,11,12,13,16,21,22,32,35,53,56,59,63,77,95,98,101,115,125,130,145,151,162,178,186,192,200,206,216,219],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/render/renderer.py":[1,4,5,24,32,36],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/commonmark/render/rst.py":[1,4,7,23,24,28,38,41,52,55,58,62,65,68,71,77,83,94,99,117,121,129,135],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/__init__.py":[3,5,7,11,21,23,24,27,30,31,32,87],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/linkifier.py":[1,2,3,5,6,7,11,26,29,32,56,45,52,53,59,62,69,70,73,86,87,88,136,166,178,179,180,208,228,255,308,356,441,484],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/callbacks.py":[1,2,5,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/html5lib_shim.py":[5,7,9,10,12,14,18,19,23,24,25,26,27,28,29,30,34,37,40,41,42,43,45,46,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,157,158,159,160,161,162,163,167,173,174,180,184,188,192,199,204,209,219,229,230,231,239,301,319,327,362,363,364,379,399,418,453,511,514,530,531,532,563],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/__init__.py":[21,23,25,26,27,28,30,31,35],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/html5parser.py":[1,2,4,5,7,8,10,11,13,14,27,50,75,87,92,94,125,139,173,183,193,196,263,267,292,320,328,339,342,345,348,352,396,412,2774,2782,2789,2790,2791],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/_inputstream.py":[1,3,4,6,7,9,11,12,13,15,17,18,23,24,25,26,29,31,36,37,38,39,43,44,45,46,47,48,49,51,54,57,62,64,69,76,85,94,97,104,131,154,160,162,164,196,210,224,235,240,255,293,297,320,367,384,390,394,434,438,457,519,535,569,584,587,588,592,596,599,607,611,620,625,633,635,638,640,652,663,674,688,689,691,696,719,723,759,762,766,789,792,869,870,874,908],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/webencodings/__init__.py":[13,15,17,19,22,27,28,29,30,32,35,61,91,109,123,124,128,133,74,58,75,76,78,79,80,83,85,86,125,126,87,88,135,136,139,161,172,186,214,246,262,272,282,283,295,323,339,340],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/webencodings/labels.py":[11,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,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/constants.py":[1,3,5,9,11,13,15,17,19,22,25,27,29,31,33,35,37,39,41,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,159,161,163,165,168,170,172,174,177,180,183,186,188,190,192,194,197,199,201,204,207,210,213,215,217,219,222,224,227,229,231,233,235,238,241,243,246,249,252,255,258,261,263,265,268,271,273,275,277,279,281,283,285,287,289,291,293,297,298,299,300,301,302,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,425,426,427,428,429,432,433,434,435,436,437,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,505,508,509,510,511,512,513,514,515,516,517,518,519,522,523,525,526,527,528,529,530,533,534,535,536,537,538,541,542,543,544,545,547,548,557,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,578,580,581,582,583,584,585,586,587,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,646,649,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2923,2924,2925,2926,2927,2928,2929,2930,2933,2934,2937,2938,2941,2942,2943,2946,2947],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/_utils.py":[1,3,5,7,8,13,14,15,24,25,26,33,36,47,49,64,71,77,86,115,116,118,124],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/_tokenizer.py":[1,3,5,7,8,9,10,11,12,14,16,18,21,32,34,49,65,137,217,222,242,271,276,305,310,328,346,361,396,420,442,453,464,492,503,514,542,556,567,595,605,615,635,655,677,692,703,731,747,768,791,816,827,843,873,927,959,993,1012,1031,1056,1076,1094,1109,1154,1177,1200,1218,1237,1268,1291,1308,1334,1359,1410,1430,1459,1483,1507,1537,1563,1583,1612,1636,1660,1679,1693],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/_trie/__init__.py":[1,3,5,8,9,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/_trie/py.py":[1,2,4,6,9,10,19,22,25,28,31,54,11,14,15,16,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/_trie/_base.py":[1,3,6,7,9,18,25,35],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/_trie/datrie.py":[1,3],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/treebuilders/__init__.py":[30,32,34,36,39],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/treebuilders/base.py":[1,2,4,9,12,13,14,15,16,17,18,19,23,24,25,45,54,57,65,77,89,97,110,116,122,123,136,146,154,158,161,164,167,170,172,184,196,218,264,269,283,288,296,301,309,312,321,323,333,349,364,390,400,404,411],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/treewalkers/__init__.py":[9,11,13,14,16,18,21,65,80],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/serializer.py":[1,2,4,6,8,9,10,11,13,14,15,16,25,26,27,29,30,32,33,36,37,39,42,72,75,104,107,108,109,112,113,114,115,118,119,120,123,124,125,126,133,135,224,231,238,375,400,407,408,409],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/filters/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/filters/base.py":[1,4,5,8,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/_vendor/html5lib/filters/sanitizer.py":[1,3,4,6,8,9,11,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,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,178,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,507,508,509,510,511,512,513,514,515,516,517,518,519,520,523,534,537,552,555,601,604,643,646,654,657,680,683,689,693,703,704,707,708,711,712,713,714,715,716,717,718,719,720,764,781,799,849,869],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/utils.py":[1,3,6,18,28],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bleach/sanitizer.py":[1,3,4,6,7,8,10,11,16,17,18,19,20,21,22,23,24,25,26,27,33,34,35,39,42,45,48,49,50,55,58,85,87,88,89,149,192,233,238,239,240,270,283,314,317,360,421,480,541,582],"/home/valberg/code/bornhack/bornhack-website/src/utils/templatetags/dateutils.py":[1,2,3,5],"/home/valberg/code/bornhack/bornhack-website/src/utils/templatetags/imageutils.py":[1,2,4,5],"/home/valberg/code/bornhack/bornhack-website/src/utils/templatetags/menubutton.py":[1,3,5],"/home/valberg/code/bornhack/bornhack-website/src/teams/templatetags/teams_tags.py":[1,2,3,4,7,14,15],"/home/valberg/code/bornhack/bornhack-website/src/tickets/templatetags/tickets_tags.py":[1,2,4,7],"/home/valberg/code/bornhack/bornhack-website/src/tokens/templatetags/token_tags.py":[1,3,5,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/templatetags/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/templatetags/account.py":[1,3,6,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/templatetags/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/templatetags/bootstrap3.py":[2,4,5,7,8,9,10,11,13,20,21,32,33,39,42,43,44,45,46,49,52,62,87,111,135,159,183,213,214,258,288,317,355,394,520,555,621,653,654,692,724,725,731,752,790,851,857],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/bootstrap.py":[2,4,6,7,12,13,14,16,18,19,20,22,23,24,25,26,27,28,29,30,31,32,34,35,40,43,46,53,60,67,74,81,88,93,98],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/components.py":[2,4,5,6,8,11,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/utils.py":[2,4,5,7,9,11,12,13,14,16,17,18,19,21,22,23,24,25,26,27,29,32,35,54,78,86,99,108,116,128,143,152,174],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/exceptions.py":[2,5,8,10,13,16,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/text.py":[2,5,6,11,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/bootstrap3/forms.py":[2,4,5,16,17,19,25,26,27,28,30,33,34,35,36,37,41,49,57,65,73,81,106,158,179,188,199],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/templatetags/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/templatetags/debugger_tags.py":[11,13,16,19,26,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/templatetags/highlighting.py":[31,33,34,37,38,40,41,42,43,44,48,51,52,57,58,66,77],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/__init__.py":[27,28,30,32,33,35,38,53,77,88],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/util.py":[10,12,13,16,17,26,27,28,29,32,33,36,37,40,50,70,84,96,108,125,170,183,188,191,209,218,257,276,292,297,298,302,323,340,350,364,365,366,367,368,369,370,371,373,375,379],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/lexers/__init__.py":[10,12,13,14,15,16,18,19,20,21,24,25,27,28,31,39,47,57,75,97,118,152,195,209,225,237,288,312,313,315,325,326,327,328,329],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/lexers/_mapping.py":[14,16,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,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,458],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/modeline.py":[10,12,14,17,20,23,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/plugin.py":[37,38,39,40,41,44,53,58,63,68],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/formatters/__init__.py":[10,12,13,14,15,16,18,19,20,22,23,25,26,29,37,45,56,71,82,117,136,137,139,149,150,151,152,153,140,141,142,39,40,41,42,143,144,145],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/formatters/_mapping.py":[14,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/formatters/html.py":[10,12,14,15,16,18,19,20,23,24,25,26,28,32,33,34,35,36,40,45,62,73,79,94,99,102,378,380,381,382,384,430,438,447,471,510,517,560,622,658,669,679,694,712,783,790,812,820],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/formatter.py":[10,12,14,15,17,20,26,51,54,57,60,64,66,77,87],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/styles/__init__.py":[10,12,13,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,50,74],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/pygments/token.py":[10,13,14,16,25,29,35,44,47,51,56,27,59,36,38,39,40,41,42,60,61,62,64,67,68,69,70,71,72,73,74,77,81,82,83,86,95,125,127,128,129,130,131,133,134,135,136,137,138,139,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,181,182,183,184,185,186,187,189,190,192,194,195,196,197,198,199,200,202,203,204,205,206,207,208,209,210,211,212],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/templatetags/indent_text.py":[2,4,7,8,16,32],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/templatetags/syntax_color.py":[33,34,36,37,38,40,41,42,43,44,48,51,54,65,66,56,62,71,78,84,85,86,87,94,95,96,97,104,105,106,107],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/templatetags/truncate_letters.py":[2,3,5,8,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_extensions/templatetags/widont.py":[2,3,5,6,9,10,11,14,15,38,61],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/betterforms/templatetags/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/betterforms/templatetags/betterforms_tags.py":[1,2,4,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/templatetags/__init__.py":[1],"/home/valberg/code/bornhack/bornhack-website/src/bornhack/urls.py":[1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,19,22,23,24,25,26,27,29,30,31,33,34,35,37,38,39,40,42,43,44,45,47,48,49,50,52,53,54,55,57,58,59,60,62,63,64,65,67,70,72,73,74,75,78,79,80,85,86,87,88,89,92,93,94,95,96,99,100,101,102,103,106,107,108,109,110,113,114,115,116,117,120,121,122,123,128,129,130,131,132,133,136,137,138,139,142,143,144,147,148,149,150,153,154,155,156,159,160,161,162,163,164,166,167,168,169,171,172,173,174,176,177,178,179,182,183,184,185,190,191,192,195,196,197,200,201,202,205,206,207,208,211,212,213,219],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/views.py":[1,2,3,4,9,10,11,12,13,14,16,17,18,19,20,30,31,43,44,47,48,51,68,70,83,90,92,99,109,117,123,127,128,129,130,131,132,133,135,139,144,147,154,161,177,180,182,184,194,197,205,206,207,208,209,210,212,216,219,227,239,261,264,266,268,278,302,340,352,357,364,369,372,373,374,375,377,380,384,389,403,424,442,471,513,520,532,535,537,538,539,541,546,551,557,562,574,582,585,586,587,588,590,595,601,605,610,621,629,632,633,634,635,636,638,643,647,659,662,664,667,670,672,673,674,676,681,715,723,729,747,750,752,753,756,759,761,762,764,774,781,789,798,807,810,812,815,818,820,823],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/decorators.py":[1,2,4,5,6,7,10,38,53,43,44,45,46,17,35,48,49,18,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/forms.py":[1,3,4,6,7,8,9,10,11,13,14,19,20,21,22,35,37,51,54,55,66,68,77,79,83,89,91,69,70,71,72,73,74,92,93,95,98,101,104,107,140,160,164,172,194,208,210,217,259,229,230,260,261,262,264,265,266,267,268,270,323,328,335,338,349,362,363,373,401,411,413,418,420,421,422,423,424,425,426,428,447,454,456,457,80,81,458,460,464,470,474,476,477,479,483,487,489,490,491,492,493,494,495,499,508,544,546,547,549,555,559,561,562,564,565,568,571,579],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/graphene_django/views.py":[1,2,3,5,6,7,8,9,10,11,13,14,15,16,17,19,22,23,29,45,53,54,55,57,58,59,60,61,62,63,64,75,102,105,108,111,114,165,196,199,205,246,292,297,316,334,341],"/home/valberg/code/bornhack/bornhack-website/src/bar/views.py":[1,2,3,6,7,8,9,11],"/home/valberg/code/bornhack/bornhack-website/src/camps/mixins.py":[1,2,3,6,10,12,16],"/home/valberg/code/bornhack/bornhack-website/src/camps/views.py":[1,2,3,4,5,6,7,8,9,12,14,65,66,67,69,73,74,75,76],"/home/valberg/code/bornhack/bornhack-website/src/feedback/views.py":[1,2,3,4,5,7,8,9,12,13,14,16],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/mixins.py":[1,2,3,4,7,11,12,13,14,15,17,29,35,41,47,48,49,55,56,57,59,75,82,88,92,94,99,105],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/views.py":[1,3,5,9,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,31,32,34,38,41,42,43,44,45,46,47,49,50,51,63,67,80,83,88,93,105,108,109,110,111,112,114,123,127,152,164,172,194,195,197,206,207,208,209,210,211,212,213,214,215,216,218,222,237,238,241,242,243,246,247,248,249,250,251,252,253,255,256,284,293,298,305,318,319,320,322,328,329,330,331,332,334,335,336,340,345,353,354,355,357],"/home/valberg/code/bornhack/bornhack-website/src/info/views.py":[1,2,3,5,6,7,8,10],"/home/valberg/code/bornhack/bornhack-website/src/people/views.py":[1,2,5,6,7],"/home/valberg/code/bornhack/bornhack-website/src/program/views.py":[1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,21,27,33,34,37,44,45,103,104,105,106,108,112,124,125,126,127,128,130,135,138,149,154,176,179,180,181,182,184,211,228,231,232,233,235,244,250,251,252,259,262,263,264,266,271,275,282,285,286,287,289,294,298,305,308,309,310,311,312,314,319,325,335,338,339,340,341,342,344,351,357,375,383,386,387,388,389,391,397,404,415,429,433,434,435,436,438,449,455,469,470,471,473,478,479,480,486,489,490,491,493,498,503,504,505,507,516,520,528,535,540,541,543,552,560,595,614,630,631,632,635,636,637,644,645,646,649,650,651,658,659,661,669,670,672,681,687,688,695,696,698,702,719,720,721,722,724,752,753,754,755,756,758,783,784,785,786,788],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/admin/views/decorators.py":[1,2,5,6,11,12,13,14,16,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/betterforms/multiform.py":[1,2,4,5,9,10,14,15,16,17,20,21,27,28,30,48,64,67,70,81,90,94,98,106,109,117,124,127,130,133,136,140,145,148,155,166,171,172,178,188],"/home/valberg/code/bornhack/bornhack-website/src/program/mixins.py":[1,2,3,4,5,6,9,10,22,23,33,34,44,45,57,60,61,75,86],"/home/valberg/code/bornhack/bornhack-website/src/program/forms.py":[1,3,4,6,8,11,14,15,16,17,19,156,159,161,162,163,164,167,168,169,171,177,182,204],"/home/valberg/code/bornhack/bornhack-website/src/sponsors/views.py":[1,2,4,7,8,9,10,12],"/home/valberg/code/bornhack/bornhack-website/src/villages/views.py":[1,2,3,4,5,6,7,8,9,10,13,14,15,16,18,22,23,24,25,27,31,32,33,34,36,45,49,50,52,63,64,65,66,68,74,77,81,82,83,84,86],"/home/valberg/code/bornhack/bornhack-website/src/villages/mixins.py":[1,2,3,4,7,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/urls.py":[1,3,5,7,10,12,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/socialaccount/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/socialaccount/providers/__init__.py":[1,3,5,8,9,13,19,22,26,31,54,10,11,14,38,39,40,41,42,44,45,51,16,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth/account/urls.py":[1,3,7,8,9,11,12,13,15,18,19,20,21,22,25,26,27,28,29,30,31,32,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth_2fa/urls.py":[1,3,7,8,9,11,12,13,15,16,17,19,20,21,23,24,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth_2fa/views.py":[1,2,3,7,8,9,11,12,13,14,15,16,17,18,21,23,24,26,27,29,30,35,36,37,39,50,56,91,92,93,94,96,108,118,124,129,134,140,141,142,143,145,156,160,166,167,169,180,191,201,202,203,205],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/qrcode/image/svg.py":[1,4,5,6,7,8,11,16,18,19,20,22,28,31,40,44,47,55,63,67,72,73,75,85,88,93,97,99,101,105,111,115,133,143,148,151,152,155,158,159],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth_2fa/adapter.py":[1,2,6,7,9,10,11,16,17,21],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/allauth_2fa/forms.py":[1,2,4,5,8,9,10,13,21,26,27,28,31,37,47,57,59,63],"/home/valberg/code/bornhack/bornhack-website/src/profiles/urls.py":[1,3,8,10,11],"/home/valberg/code/bornhack/bornhack-website/src/profiles/views.py":[1,2,3,4,6,9,10,11,12,14,18,19,20,21,22,24,27],"/home/valberg/code/bornhack/bornhack-website/src/tickets/urls.py":[1,3,9,12,13,14,15,17,18,19,20,22,23,24,25],"/home/valberg/code/bornhack/bornhack-website/src/tickets/views.py":[1,3,4,5,6,12,17,18,21,22,23,24,26,32,33,35,41,51,52,53,54,55,57,61],"/home/valberg/code/bornhack/bornhack-website/src/shop/urls.py":[1,2,4,7,9,11,12,13,14,15,17,18,19,21,22,23,25,27,29,30],"/home/valberg/code/bornhack/bornhack-website/src/shop/views.py":[1,2,3,4,5,6,12,13,19,20,21,22,23,25,34,35,36,37,38,43,44,48,49,51,61,62,64,75,76,78,89,90,92,104,105,107,119,120,122,134,135,137,147,148,150,163,164,166,179,180,181,182,184,188,217,218,219,220,221,223,232,273,279,280,281,282,284,289,290,291,292,294,360,361,363,370,371,372,373,375,380,381,383,390,392,394,406,407,408,410,424,425,427,470,471,472,474,489,490,491,493,506,507,508,513,514,516,532,536,537,539,543,577,578,579],"/home/valberg/code/bornhack/bornhack-website/src/shop/forms.py":[1,4,5],"/home/valberg/code/bornhack/bornhack-website/src/shop/epay.py":[1,2,5,23],"/home/valberg/code/bornhack/bornhack-website/src/vendor/coinify/coinify_callback.py":[1,3,6,8,11,14],"/home/valberg/code/bornhack/bornhack-website/src/shop/coinify.py":[1,2,3,4,5,6,8,11,28,52,87,113,130],"/home/valberg/code/bornhack/bornhack-website/src/vendor/coinify/coinify_api.py":[1,4,5,8,11,14,16,27,46,79,89,106,121,134,157,176,197,207,217,231,245,256,263,280,300],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/__init__.py":[41,43,44,45,46,49,74,86,87,50,51,54,58,59,61,62,63,66,67,69,70,71,94,95,101,102,105,106,108,109,110,112,113,114,115,116,117,118,125,126,128,131],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/__init__.py":[3,5,6,8,14,15,16,17,18,19,20,21,25,26,28,29,30,46,49,52,71,78,80,82,83,85,88],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/connectionpool.py":[1,2,3,4,5,7,8,11,26,27,28,29,35,36,38,39,40,41,42,43,44,47,49,51,55,59,61,62,64,72,76,79,84,92,95,153,155,156,157,159,160,161,162,199,212,250,280,286,290,302,319,404,407,425,446,447,448,449,736,752,754,755,757,758,759,760,761,762,763,764,782,799,807,831,850,878],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/exceptions.py":[1,2,8,9,10,13,14,15,18,19,20,24,29,30,31,35,40,41,42,45,46,47,50,51,52,55,56,57,61,66,74,76,85,86,88,94,95,96,99,104,105,108,109,110,115,116,117,120,121,122,125,126,127,130,131,132,135,136,137,140,141,143,150,151,152,153,156,157,158,161,162,163,166,167,168,171,172,173,176,177,178,181,182,183,186,190,191,194,195,196,199,203,204,207,214,215,218,223,224,225,228,229,232,237,238,239,244,245,246],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/packages/__init__.py":[1,3,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/packages/ssl_match_hostname/__init__.py":[1,3,6,9,19],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/packages/six.py":[1,23,25,26,27,28,29,31,32,36,37,38,40,41,42,43,44,45,47,75,80,86,88,91,103,105,114,117,124,126,130,136,139,141,159,164,171,173,177,181,184,189,195,209,218,224,226,174,175,229,231,232,236,142,89,143,144,146,147,148,151,152,237,238,239,240,149,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,106,107,108,109,110,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,303,308,309,310,311,178,179,312,314,316,127,128,317,320,322,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,354,356,357,360,362,366,367,368,370,371,372,374,376,377,380,382,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,420,421,422,424,426,427,430,432,436,437,438,439,441,442,443,445,447,448,451,453,457,459,460,461,463,465,466,469,471,472,473,182,474,475,476,477,479,482,483,486,491,502,503,504,506,507,508,509,520,521,525,528,529,535,536,539,541,544,561,562,77,565,566,567,568,569,570,573,574,577,580,583,586,588,590,610,611,612,613,614,615,618,619,622,624,625,626,627,628,629,630,631,632,633,634,635,639,640,662,663,666,670,674,678,679,92,115,82,83,93,94,97,100,681,706,712,713,715,721,722,776,786,788,797,800,812,828,849,850,851,852,856,857,862,863,866,868,185,186,216,190,191,196,198,199,200,201,202,205,206,207,118,119,203,160,161,187],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/connection.py":[1,2,3,4,5,6,7,8,9,10,12,13,14,22,24,30,36,38,47,49,51,54,55,62,65,66,67,70,92,94,98,101,103,116,135,145,172,180,184,223,224,226,228,229,230,244,263,267,268,269,270,271,272,277,299,372,386,388,389],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/__init__.py":[1,3,4,5,6,16,21,22,28,53],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/connection.py":[1,2,3,4,7,33,34,85,93,104,134,106,107,113,116,122,123,124,125,129,130,131],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/wait.py":[1,2,3,4,5,6,10,13,14,39,41,68,87,107,111,124,139,146],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/contrib/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/contrib/_appengine_environ.py":[3,5,8,14,18,23,29,15,9,19,10,24,11,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/request.py":[1,2,4,5,7,8,12,77,95],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/response.py":[1,2,4,7,38,75],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/ssl_.py":[1,2,3,4,5,7,8,10,11,14,15,16,17,21,22,23,27,40,41,44,45,46,47,52,53,61,62,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,112,113,163,190,213,230,294,360],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/timeout.py":[1,4,5,7,11,15,18,88,91,93,99,103,140,156,171,182,195,213],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/retry.py":[1,2,3,4,5,6,7,9,17,20,24,25,28,147,149,150,152,154,157,159,160,161,162,163,184,199,200,213,227,243,253,261,267,283,289,295,304,320,330,404,411,165,166,167,168,170,174,175,176,177,178,179,180,181,182],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/url.py":[1,2,4,7,11,14,19,20,23,33,38,48,55,95,99,132,225],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/_collections.py":[1,2,3,6,7,17,18,19,22,25,28,40,42,44,51,58,73,80,84,87,97,102,134,136,147,151,155,158,161,169,172,176,178,181,186,203,209,225,251,264,265,266,269,271,274,282,287,294,300,303],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/request.py":[1,3,4,7,10,37,39,41,45,50,74,92],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/filepost.py":[1,2,3,4,6,8,9,10,12,15,25,45,63],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/fields.py":[1,2,3,5,8,22,50,62,63,71,105,116,138,158],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/response.py":[1,2,3,4,5,6,7,9,10,14,15,16,17,19,22,24,29,32,55,57,58,59,62,64,68,71,93,100,102,105,108,114,124,155,157,158,164,211,224,231,240,244,247,255,303,318,336,347,404,473,499,529,532,536,540,547,558,567,571,575,584,593,607,629,696],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/util/queue.py":[1,2,3,5,10,11,14,17,20],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/poolmanager.py":[1,2,3,4,6,7,8,9,10,11,12,13,16,19,22,50,55,58,112,113,117,118,122,148,150,152,163,166,171,198,207,230,243,267,282,302,362,387,390,412,420,435,449],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/__init__.py":[19,20,21,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/compat.py":[22,25,31,32,33,34],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/universaldetector.py":[36,39,40,41,43,44,45,46,47,48,51,66,68,69,70,71,72,73,74,75,76,77,78,79,81,94,111,220],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/charsetgroupprober.py":[28,29,32,33,39,49,57,65,85],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/enums.py":[5,8,11,12,13,14,17,21,22,23,24,25,26,27,28,29,32,35,36,37,38,41,44,45,46,47,50,53,54,55,56,57,59,65,71,72,73,74,75,76],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/charsetprober.py":[29,30,32,35,37,39,44,47,51,54,58,61,66,103],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/escprober.py":[28,29,30,31,35,40,42,58,69,73,77,83],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/codingstatemachine.py":[28,30,33,54,55,63,66,80,83,86],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/escsm.py":[28,62,66,67,68,69,70,71,74,76,77,78,79,80,81,115,119,120,121,122,123,124,125,126,129,131,132,133,134,135,136,170,174,175,176,177,178,179,180,181,182,185,187,188,189,190,191,192,226,230,231,232,233,234,237,239,240,241,242,243,244],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/latin1prober.py":[29,30,32,34,35,36,37,38,39,40,41,42,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,92,96,97,103,108,112,116,130],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/mbcsgroupprober.py":[30,31,32,33,34,35,36,37,38,41,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/utf8prober.py":[28,29,30,31,35,36,38,44,49,53,57,76],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/mbcssm.py":[28,64,68,69,70,73,75,76,77,78,79,99,104,105,106,107,108,109,110,113,115,116,117,118,119,155,159,160,161,162,163,166,168,169,170,171,172,208,212,213,216,218,219,220,221,222,258,262,263,264,265,266,267,270,272,273,274,275,276,312,316,317,318,319,320,321,329,331,332,333,334,335,373,377,378,379,382,384,385,386,387,388,424,428,429,430,431,432,433,434,437,439,440,441,442,443,479,483,484,485,486,487,488,489,492,494,495,496,497,498,534,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,566,568,569,570,571,572],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/sjisprober.py":[28,29,30,31,32,33,36,37,44,48,52,56,89],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/mbcharsetprober.py":[30,31,34,37,39,45,53,57,61,90],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/chardistribution.py":[28,30,32,34,36,40,41,42,43,44,46,61,70,84,100,105,113,114,120,132,133,139,151,152,158,170,171,177,192,193,199,217,218,224],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/euctwfreq.py":[44,47,385],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/euckrfreq.py":[41,43,193],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/gb2312freq.py":[42,44,281],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/big5freq.py":[43,46,384],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/jisfreq.py":[44,47,322],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/jpcntx.py":[113,116,117,118,119,120,121,123,131,143,170,173,180,183,184,188,192,212,213],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/eucjpprober.py":[28,29,30,31,32,33,36,37,44,48,52,56,89],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/gb2312prober.py":[28,29,30,31,33,34,40,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/euckrprober.py":[28,29,30,31,34,35,41,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/cp949prober.py":[28,29,30,31,34,35,43,47],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/big5prober.py":[28,29,30,31,34,35,41,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/euctwprober.py":[28,29,30,31,33,34,40,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/sbcsgroupprober.py":[29,30,31,34,35,37,38,39,40,43,44],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/sbcharsetprober.py":[29,30,33,34,35,36,37,39,53,63,70,77,124],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/langcyrillicmodel.py":[46,65,84,103,122,141,278,282,283,284,285,286,287,291,292,293,294,295,296,300,301,302,303,304,305,309,310,311,312,313,314,318,319,320,321,322,323,327,328,329,330,331,332],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/langgreekmodel.py":[50,69,206,210,211,212,213,214,215,219,220,221,222,223,224],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/langbulgarianmodel.py":[53,72,209,213,214,215,216,217,218,222,223,224,225,226,227],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/langthaimodel.py":[52,189,193,194,195,196,197,198],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/langhebrewmodel.py":[53,190,194,195,196,197,198,199],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/hebrewprober.py":[28,29,128,130,131,132,133,134,135,136,137,138,139,144,149,151,152,154,164,174,178,182,196,255,282,286],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/langturkishmodel.py":[52,183,187,188,189,190,191,192],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/chardet/version.py":[6,8,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/exceptions.py":[8,9,12,15,17,28,29,32,33,36,37,40,41,44,50,53,57,60,61,64,65,68,69,72,73,76,77,80,81,84,85,88,89,92,93,96,97,100,101,104,105,108,109,114,115,116,119,120,121,124,125,126],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/contrib/pyopenssl.py":[43,44,46],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/__version__.py":[5,6,7,8,9,10,11,12,13,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/utils.py":[9,11,12,13,14,15,16,17,18,19,20,21,23,24,26,27,28,32,33,34,37,39,41,44,98,107,168,219,227,259,284,312,344,379,404,419,430,450,475,496,514,524,561,562,565,589,611,626,637,648,672,694,755,767,793,802,814,852,853,854,857,889,906,923,924,927,948,965],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/certs.py":[14,15,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/certifi/__init__.py":[1,3],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/certifi/core.py":[8,9,12,13,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/_internal_utils.py":[9,11,14,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/compat.py":[9,11,13,20,23,26,28,29,30,31,37,56,57,58,59,60,61,62,63,65,66,67,68,69,70],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/cookies.py":[10,12,13,14,16,17,19,20,25,35,37,42,45,48,51,65,68,71,74,78,81,84,88,92,97,102,104,111,114,118,135,146,165,168,171,187,189,201,218,227,235,244,252,261,270,278,286,299,315,321,330,337,343,348,356,376,401,408,414,421,426,441,477,508,529],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/structures.py":[8,10,13,38,40,46,51,54,57,60,63,71,80,83,87,88,90,94,97,102,91,92],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/packages.py":[1,6,7,10,11,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/idna/__init__.py":[1,2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/idna/package_data.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/idna/core.py":[1,2,3,4,5,6,8,9,10,12,13,14,16,17,18,21,22,23,26,27,28,31,32,33,36,43,46,49,53,60,67,127,134,143,149,193,234,266,291,312,340,371],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/idna/idnadata.py":[3,41,60,71,77,87,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,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,1966,1969,1977],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/idna/intranges.py":[6,8,10,31,34,38],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/models.py":[8,10,11,16,18,19,20,21,24,25,26,28,29,30,33,34,38,42,43,48,49,50,51,52,55,56,57,60,61,82,109,174,175,186,198,224,228,251,254,272,288,290,309,325,328,339,345,355,441,452,521,534,556,576,586,589,592,593,596,643,646,649,657,665,668,678,688,692,707,714,719,724,729,784,815,835,873,899,917,942],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/hooks.py":[13,14,17,23],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/auth.py":[8,10,11,12,13,14,15,17,19,20,21,22,24,25,28,72,73,75,79,80,82,86,92,95,100,101,103,108,109,111,117,127,229,234,278,298,304],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/status_codes.py":[18,20,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,42,43,44,45,46,47,48,49,51,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,89,90,91,92,93,94,95,96,97,98,99,102,104,120,105,106,107,108,109,111,118,117,112,113],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/api.py":[11,13,16,63,78,91,104,119,134,149],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/sessions.py":[9,10,11,12,13,15,16,17,19,20,21,22,23,26,27,29,34,37,40,46,49,80,95,97,118,144,256,276,317,340,357,360,361,362,365,420,423,426,469,537,548,559,570,583,595,607,617,690,719,733,738,749,753,758],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/requests/adapters.py":[9,11,12,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,31,32,33,36,37,38,41,43,44,45,46,49,50,51,52,55,56,58,62,79,84,109,110,111,113,114,115,131,134,146,166,203,255,292,319,329,358,372,394],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/urllib3/contrib/socks.py":[23,24,26,27,28,29,30,32,33,37,39],"/home/valberg/code/bornhack/bornhack-website/src/news/urls.py":[1,2,4,6,7,8,9],"/home/valberg/code/bornhack/bornhack-website/src/news/views.py":[1,2,3,5,8,21,22,23,24,26,30,31,32,33,36,37,38,40,43,46],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/syndication/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/syndication/views.py":[1,3,4,5,6,7,8,9,10,11,12,15,25,26,29,30,31,32,34,49,53,56,65,76,95,102,109,112,122],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/utils/feedgenerator.py":[23,24,25,26,27,29,30,31,32,35,41,47,60,61,64,86,87,88,89,117,120,127,134,140,146,153,161,180,181,182,188,189,191,201,205,211,227,231,232,234,241,243,245,293,295,296,298,306,312,334,340,391],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/contenttypes/views.py":[1,2,3,4,5,6,9],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sites/requests.py":[1,8,9,12,15,18],"/home/valberg/code/bornhack/bornhack-website/src/tokens/urls.py":[1,2,4,7,8,9,10,11],"/home/valberg/code/bornhack/bornhack-website/src/tokens/views.py":[1,2,4,7,8,9,10,11,13,22,23,24,26],"/home/valberg/code/bornhack/bornhack-website/src/program/urls.py":[1,2,4,7,8,9,10,12,13,14,15,17,18,20,21,23,24,25,26,27,28,30,31,32,33,34,35,37,38,39,40,42,43,44,45,49,50,51,52,53,54,56,57,58,59,61,62,63,64,66,67,68,69,71,72,73,74,76,77,78,79,81,82,83,84,86,87,88,89,93,94,95,96,97,98,100,101,102,103,105,106,107,108,110,111,112,113,115,116,117,118,120,121,122,123,125,126,127,128,130,131,132,133,135,136,137,138,140,141,142,143,149,150,151,152,153,154,156,157,158,159,163,164,165,166,169,170,171,172,174,175,176,177,179,180,181,182,185,186,187,188],"/home/valberg/code/bornhack/bornhack-website/src/teams/urls.py":[1,3,10,18,25,32,43,48,51,52,53,54,56,57,58,59,61,62,63,64,65,66,68,69,70,71,73,74,75,76,78,79,80,81,83,84,85,86,88,89,90,91,93,94,95,96,98,99,100,101,102,103,105,106,107,108,110,111,112,113,117,118,119,120,121,122,124,125,126,127,129,130,131,132,133,134,136,137,138,139,146,147,148,149,150,151,152,154,155,156,157,158,159,161,162,163,164,165,166,168,169,170,171,179,180,181,182,183,185,186,187,188,190,191,192,193,195,196,197,198,199,201,202,203,204,206,207,208,209,211,212,213,214],"/home/valberg/code/bornhack/bornhack-website/src/teams/views/base.py":[1,2,3,4,5,6,7,8,10,11,13,14,17,18,19,20,22,29,30,31,32,33,34,36,43,44,45,46,47,48,49,50,52,55,60,61,62,63,64,66,90,109],"/home/valberg/code/bornhack/bornhack-website/src/teams/views/mixins.py":[1,2,3,5,8,11,12,23,26,27,29,39,41,44],"/home/valberg/code/bornhack/bornhack-website/src/teams/views/members.py":[1,3,4,5,6,8,9,10,12,13,15,18,19,20,21,22,23,26,27,28,29,30,31,33,51,57,58,59,60,61,62,64,71,77,78,79,80,81,83,95,96,97,98,99,101],"/home/valberg/code/bornhack/bornhack-website/src/teams/views/info.py":[1,2,3,4,6,7,8,9,12,13,14,15,16,18,25,26,27,28,29,30,32,38,45,48,57,58,59,60,61,62,63,65,71,78,79,80,81,82,83,85,91],"/home/valberg/code/bornhack/bornhack-website/src/teams/views/tasks.py":[1,2,3,4,5,6,8,9,10,13,14,15,16,17,18,21,22,23,24,27,28,29,30,31,33,38,55,56,57,58,60,72,73,74,75,76,78,84,92,96,97,98,99,100,102,107,115],"/home/valberg/code/bornhack/bornhack-website/src/teams/views/shifts.py":[1,2,3,4,5,14,15,16,18,20,22,29,30,31,32,33,35,39,48,85,86,87,89,90,91,94,106,107,109,116,123,129,135,136,137,138,139,141,146,154,160,169,170,171,172,173,175,180,187,193,194,195,196,198,206,214,216,221,223,224,227,228,231,234,235,236,237,239,244,276,282,291,293,295,334,336,338,359,360,362],"/home/valberg/code/bornhack/bornhack-website/src/teams/views/guide.py":[1,2,4,6,9,10,11,12,13,14,16,25,26],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/urls.py":[1,3,11,14,15,16,17,19,20,21,22,24,25,26,27,28,29,31,32,33,34,36,37,38,39],"/home/valberg/code/bornhack/bornhack-website/src/rideshare/views.py":[1,2,3,4,11,12,14,15,17,20,21,22,23,24,28,29,32,33,35,40,62,63,64,66,75,76,80,81,82,85,86,88],"/home/valberg/code/bornhack/bornhack-website/src/backoffice/urls.py":[1,2,5,8,10,11,12,15,18,19,22,23,26,27,28,29,33,34,36,37,38,39,44,45,46,47,52,53,54,55,56,57,58,59,62,63],"/home/valberg/code/bornhack/bornhack-website/src/backoffice/views.py":[1,2,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,26,29,32,33,34,37,38,40,49,50,51,53,60,61,62,64,71,72,73,75,79,82,83,84,86,92,101,104,105,107,123,126,127,128,131,134,135,136,139,140,142,156,157,159,185,186,188,202,203,205,234,235,236,238,245,254,255,256,257,259,278,279,280,283,284,285,288,289,291,303,304,305,306,308,319,326,338,384,385,386,387,389,392,393,394,395,397,408,409,410,412,419,428,429,430,431,433],"/home/valberg/code/bornhack/bornhack-website/src/utils/mixins.py":[1,2,3,6,9,10,20,24,25],"/home/valberg/code/bornhack/bornhack-website/src/backoffice/mixins.py":[1,4,7,8,11,14,15,18,21,22,25,28,29],"/home/valberg/code/bornhack/bornhack-website/src/economy/urls.py":[1,2,4,7,8,9,10,14,15,16,17,18,19,21,22,23,24,26,27,28,29,30,31,32,34,35,36,37,39,40,41,42,43,44,45,47,48,49,50,60,61,62,63,64,65,66,68,69,70,71,72,73,74,76,77,78,79,81,82,83,84,86,87,88,89,97,98,99,100,101,102,103,105,106,107,108,114,115,116,117,118,119,120,122,123,124,125,126,127,128,130,131,132,133,135,136,137,138,140,141,142,143],"/home/valberg/code/bornhack/bornhack-website/src/economy/views.py":[1,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,22,23,25,60,61,62,63,64,66,81,82,83,84,87,88,89,90,91,93,101,118,119,120,121,123,135,136,137,139,144,145,146,149,150,151,152,153,155,164,189,190,191,192,194,201,210,215,216,217,218,220,230,234,238,239,241,261,262,263,265,270,271,272,278,279,280,282,287,288,289,292,293,294,295,296,298,307,332,333,334,335,337,344,352,357,358,359,360,362,372,376,380,381,383],"/home/valberg/code/bornhack/bornhack-website/src/economy/mixins.py":[1,2,4,7,10,11,20,23,24,33,36,37,46,49,50,59,62,63],"/home/valberg/code/bornhack/bornhack-website/src/economy/forms.py":[1,3,4,7,11,12,14,36,37,38,39,42,43,44,45,48,49,50,51,54,55,56,57],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/middleware.py":[3,5,7,8,10,11,12,13,14,15,17,18,20,23,33,44,48,50,52,77,90,146],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/settings.py":[1,3,5,6,7,18,19,20,21,22,23,24,26,27,29,30,31,32,33,34,35,36,37,38,40,41,42,43,47,117,118,119,120,121,122,123,124,125,126,127,128,132,134,135,141,142,143,144,145,146,147,148,149,150,151,152,154,155,156,163,49,53,54,55,57,58,66,73,81,82,84,113],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/toolbar.py":[3,5,7,8,10,11,12,13,14,15,17,20,21,34,41,48,56,77,79,85,97,104,106,116,118,135,136,120,121,126,129,108,111,113,114,130,131,132],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/views.py":[1,3,4,5,7,8,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/decorators.py":[1,3,6,7,17],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/__init__.py":[1,3,5,7,8,11,14,16,21,25,47,54,61,69,78,88,102,111,125,138,146,152,161,169,177,185,199,212,224,225,107],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/utils.py":[1,3,4,5,6,7,8,10,11,12,13,14,15,16,18,20,21,27,30,43,44,31,32,36,37,39,38,48,52,70,90,118,133,141,156,211,228,229,237,248,254,230,235],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/versions.py":[1,3,5,6,7,9,12,15,17,21,23,25,35,43,51],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/timer.py":[1,3,5,6,8,10,11,16,19,21,35,37,39,41,56,61,89,99],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/settings.py":[1,3,5,6,7,9,12,15,17,19,21,24],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/headers.py":[1,3,5,7,10,13,16,33,37,39,41,55,60,66],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/request.py":[1,3,4,5,6,8,9,12,15,17,19,21,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/sql/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/sql/panel.py":[1,3,4,5,6,8,9,10,12,13,14,15,16,17,20,36,52,56,58,68,95,110,112,119,128,130,138,143,147,290,133,134,135],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/sql/views.py":[1,3,4,5,7,8,11,12,37,38,74,75],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/sql/forms.py":[1,3,4,5,7,8,9,10,11,12,13,15,18,27,29,30,31,32,33,34,36,47,55,63,71,79,82,88,92],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/sql/utils.py":[1,3,5,6,7,10,11,13,24,31,42],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/__init__.py":[8,11,12,13,14,15,16,18,20,21,24,34,46,63],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/sql.py":[8,9,11,13,14,15,18,19,25,28,30,40,47,55,58,64,68,102,115,119,129,130,135,137,139,145,152,155,158,161,175,184,196,201,205,227,241,246,251,254,264,278,284,313,320,331,335,348,357,363,372,389,390,392,427,431,433,438,444,449,458,459,461,471,472,473,474,476,481,482,483,484,486,491,492,495,496,497,498,501,502,503,504,507,508,510,514,519,520,522,526,527,528,529,531,534,535,536,537,539,587,588,590,601,602,603,604,607,608],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/tokens.py":[12,15,16,18,21,27,32,35,22,23,24,25,36,37,38,40,43,44,45,46,47,48,49,50,51,52,53,56,60,61,62,65,66,67,68],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/compat.py":[16,18,19,21,22,25,26,29,30,31,32,33,27],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/utils.py":[8,9,10,11,12,22,32,34,37,55,64,82,106,111,112,118,119,70,79,71,77],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/cli.py":[20,22,23,24,25,27,28,29,34,139,145],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/exceptions.py":[8,11,12],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/engine/__init__.py":[8,9,10,13,14,15],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/engine/grouping.py":[8,9,10,12,13,14,17,52,56,60,64,68,72,76,90,115,132,149,173,183,203,223,244,257,274,287,307,318,329,362,363,364,365,366],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/engine/filter_stack.py":[8,10,11,12,15,16,22,25],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/lexer.py":[8,15,16,17,18,21,24,26,27,75],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/keywords.py":[8,10,13,22,23,24,26,27,29,30,32,33,35,37,38,39,41,42,43,49,51,56,59,60,61,62,63,64,65,67,71,72,73,74,75,76,77,78,80,82,83,84,87,88,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,120,121,122,123,124,125,126,127,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,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,275,276,277,278,279,280,281,282,283,285,286,287,288,289,291,292,293,294,295,296,298,299,300,301,302,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,324,325,326,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,593,594,595,596,597,598,599,600,601,602,604,605,606,607,608,610,612,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,652,653,654,655,656,657,658,659,660,662,663,664,665,666,667,668,669,670,671,672,674,675,676,677,678,679,681,682,683,684,685,686,687,688,690,691,692,693,694,698,699,701,702,703,704,706,707,708,709,710,712,713,714,715,716,718,719,720,721,722,724,725,726,731,732,733,735,736,737,738,740,741,742,743,744,745,746,747,748,749,750,752,753,754,755,756,757,758,759,760,762,763,765,766,767,768,769,770,771,773,775,776,777,778,779,781,782,783,784,785,786,787,788,789,790,792,793,794,795,796,797,798,800,801,806,807,808,809,810,811,812,814,815,816],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/engine/statement_splitter.py":[8,11,12,14,17,27,77],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/filters/__init__.py":[8,9,10,11,13,14,16,17,18,20,21,22,25,26,27,28,30,31,33,34,35,37,38,39],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/filters/others.py":[8,9,12,13,34,40,41,46,56,70,77,85,86,104,113,114],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/filters/output.py":[8,9,12,13,15,19,22,34,35,78,79,81],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/filters/tokens.py":[8,9,12,13,15,19,26,27,30,31,33,40,41,45],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/filters/reindent.py":[8,9,10,13,15,26,36,40,46,51,66,82,96,101,109,119,149,168,174],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/filters/right_margin.py":[8,10,11,15,16,20,24,46],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/filters/aligned_indent.py":[8,9,10,13,14,17,18,19,20,21,22,24,31,40,47,59,66,89,99,111,122,127],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/sqlparse/formatter.py":[8,10,11,14,118],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/sql/tracking.py":[1,3,4,5,6,8,9,11,12,15,16,18,21,22,25,31,35,23,36,39,58,64,68,70,73,77,80,82,89,98,105,121,182,185,188,191,194,197,200],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/staticfiles.py":[1,3,4,6,7,8,9,10,11,12,14,15,17,18,23,24,27,29,32,35,38,42,43,50,53,58,60,76,79,82,84,85,87,94,99,104,109,113,115,122,125,140,161,171],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/staticfiles/storage.py":[1,2,3,4,5,6,7,9,10,11,14,15,16,17,18,21,27,28,41,49,50,51,55,59,72,83,117,148,154,208,256,327,330,333,345,369,370,371,372,374,378,385,400,405,412,430,433,434,437,440,446,449,452,459,460,468,473,477,478,481,485,486,489,490,494],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/templates/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/templates/panel.py":[1,3,4,5,6,8,9,10,11,12,13,14,15,16,17,19,20,21,29,38,63,66,69,71,85,171,173,180,186,188,194,197,200,191],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/templates/views.py":[1,3,4,5,6,7,8,10,13],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/cache.py":[1,3,4,5,6,8,9,10,11,12,13,14,16,17,18,25,26,30,58,59,61,64,67,72,75,78,31,55,82,86,90,94,98,104,108,112,116,120,124,128,133,134,139,142,145,147,149,184,216,218,227,236,242,249,261],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/signals.py":[1,3,5,6,7,17,18,20,23,24,27,28,29,30,31,32,33,34,35,36,37,38,41,59,61,69],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/logging.py":[1,3,4,6,8,9,11,12,16,19,20,28,29,33,53,54,30,31,55,58,59,61,65,67,75,77,80],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/debug_toolbar/panels/redirects.py":[1,3,4,6,9,12,14,16,18],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/corsheaders/middleware.py":[1,3,5,6,7,8,9,11,12,14,15,16,17,18,19,22,24,34,38,43,45,69,91,99,146,153,158,164,170],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/corsheaders/signals.py":[1,3,8],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/middleware/security.py":[1,3,4,5,8,9,20,30],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/middleware.py":[1,2,4,5,6,7,8,9,12,13,18,22],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/backends/__init__.py":[1],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/backends/base.py":[1,2,3,4,6,7,8,9,10,13,14,18,21,25,26,29,32,33,36,39,40,41,43,45,51,54,57,61,65,68,73,81,84,87,90,94,100,118,122,125,128,131,134,142,149,156,161,168,171,180,181,183,198,200,225,246,272,283,292,305,311,319,327,334,340],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/sessions/exceptions.py":[1,4,5,6,9,10,11],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/middleware/common.py":[1,2,4,5,6,7,8,9,10,13,30,32,34,62,75,98,117,119,140,148],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/middleware.py":[1,2,3,4,5,6,7,10,16,17,27,39,44,45,47,85,98,113,122,123],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/auth/backends.py":[1,2,4,7,10,12,25,33,36,41,60,67,74,84,87,96,104,105,109,119,122,124,154,163,172,173],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django_otp/middleware.py":[1,3,5,6,10,12,13,16,20,30,31,38,59],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/contrib/messages/middleware.py":[1,2,3,6,9,11,14],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/django/middleware/clickjacking.py":[6,8,9,12,23,24,37],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PIL/__init__.py":[15,17,22,23,25,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],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PIL/_version.py":[2],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PIL/Image.py":[30,31,33,34,35,37,38,43,44,45,47,48,49,50,51,54,55,57,64,65,67,70,71,74,75,78,80,85,88,94,95,139,140,141,142,143,145,146,147,156,173,176,177,178,179,180,181,182,185,186,187,188,189,192,193,194,195,196,197,200,201,202,203,206,207,209,210,211,212,215,216,217,219,220,221,222,223,224,230,231,232,233,234,235,236,237,247,248,249,250,251,252,253,254,255,256,257,258,266,267,273,274,275,276,277,278,279,280,281,282,283,284,285,287,288,289,290,291,292,293,294,295,296,297,298,302,310,314,317,330,342,357,371,374,415,440,461,485,489,490,493,496,500,524,534,535,536,537,539,551,555,559,563,578,581,584,612,613,621,627,633,657,668,672,679,689,705,713,725,768,772,793,819,823,861,872,873,1055,1100,1111,1113,1132,1152,1172,1178,1205,1215,1230,1252,1275,1293,1303,1320,1335,1347,1376,1380,1461,1509,1548,1602,1619,1650,1685,1761,1808,1809,1917,2000,2021,2043,2064,2086,2094,2143,2144,2218,2266,2280,2289,2296,2307,2309,2312,2314,2323,2329,2347,2378,2416,2421,2482,2539,2547,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2579,2580,2583,2603,2693,2708,2731,2748,2764,2791,2806,2817,2828,2840,2851,2863,2873,2887,2904,2909,2917,2930,2941,2950,2962,2994,2963,2964,2966,2967,2968,2969,2971,2972,2995],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PIL/_util.py":[1,2,4,6,7,10,21,25,26,29],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PIL/ImageMode.py":[17,20,21,23,29,33],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/PIL/_binary.py":[14,15,17,18,21,32,42,52,62,72,76,81,85,89,93],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/address/en_US/__init__.py":[1,2,4,7,8,29,31,258,260,272,279,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,303,306,308,310,312,314,320,325,330,334,337,342,345,347,350,355,358,369,372,376,398,404,410,416,423,426,429,432,435],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/address/en/__init__.py":[1,2,5,53],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/automotive/en_US/__init__.py":[3,4,7,165],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/bank/en_GB/__init__.py":[1,4,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/color/en_US/__init__.py":[1,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/company/en_US/__init__.py":[1,2,5,6],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/date_time/en_US/__init__.py":[1,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/geo/en_US/__init__.py":[1,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/internet/en_US/__init__.py":[2,3,6,7],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/job/en_US/__init__.py":[1,4,5],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/lorem/en_US/__init__.py":[3,4,7,10,983],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/person/en_US/__init__.py":[1,2,4,7,8,12,15,19,26,27,33,414,417,739,742,743,748,1748,1751,1755,1757,1759,1762,1766,1770,1779],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/phone_number/en_US/__init__.py":[1,2,5,39],"/home/valberg/.virtualenvs/bornhack/lib/python3.6/site-packages/faker/providers/ssn/en_US/__init__.py":[2,4,5,8,9,10,11,13,35,142]}} \ No newline at end of file diff --git a/src/backoffice/forms.py b/src/backoffice/forms.py new file mode 100644 index 00000000..592c4916 --- /dev/null +++ b/src/backoffice/forms.py @@ -0,0 +1,85 @@ +from django import forms +from program.models import Event, Speaker + + +class AutoScheduleValidateForm(forms.Form): + schedule = forms.ChoiceField( + choices=( + ( + "current", + "Validate Current Schedule (Load the AutoScheduler with the currently scheduled Events and validate)", + ), + ( + "similar", + "Validate Similar Schedule (Create and validate a new schedule based on the current schedule)", + ), + ("new", "Validate New Schedule (Create and validate a new schedule)"), + ), + help_text="What to validate?", + ) + + +class AutoScheduleApplyForm(forms.Form): + schedule = forms.ChoiceField( + choices=( + ( + "similar", + "Apply Similar Schedule (Create and apply a new schedule similar to the current schedule)", + ), + ( + "new", + "Apply New Schedule (Create and apply a new schedule without considering the current schedule)", + ), + ), + help_text="Which schedule to apply?", + ) + + +class EventScheduleForm(forms.Form): + """ The EventSlots are added in the view and help_text is not visible, just define the field """ + + slot = forms.ChoiceField() + + +class SpeakerForm(forms.ModelForm): + class Meta: + model = Speaker + fields = [ + "name", + "email", + "biography", + "needs_oneday_ticket", + "event_conflicts", + ] + + def __init__(self, camp, matrix={}, *args, **kwargs): + """ + initialise the form and add availability fields to form + """ + super().__init__(*args, **kwargs) + + # do we have a matrix to work with? + if not matrix: + return + # add speaker availability fields + for date in matrix.keys(): + # do we need a column for this day? + if not matrix[date]: + # nothing on this day, skip it + continue + # loop over the daychunks for this day + for daychunk in matrix[date]: + if not matrix[date][daychunk]: + # no checkbox needed for this daychunk + continue + # add the field + self.fields[matrix[date][daychunk]["fieldname"]] = forms.BooleanField( + required=False + ) + # add it to Meta.fields too + self.Meta.fields.append(matrix[date][daychunk]["fieldname"]) + + # only show events from this camp + self.fields["event_conflicts"].queryset = Event.objects.filter( + track__camp=camp, event_type__support_speaker_event_conflicts=True + ) diff --git a/src/backoffice/templates/approve_feedback.html b/src/backoffice/templates/approve_feedback.html index 6fa62e0f..dbabf133 100644 --- a/src/backoffice/templates/approve_feedback.html +++ b/src/backoffice/templates/approve_feedback.html @@ -11,12 +11,12 @@
The Content team can approve or reject pending EventFeedback from this page. The feedback will not be visible to the Event owner before it is approved. The Event owner will not be able to see the username of the feedback authors. The feedback author can see when the feedback has been approved or rejected by returning to the feedback page.
- {% if eventfeedback_list %} + {% if event_feedback_list %}
{{ formset.management_form }} {% csrf_token %} - {% for form, feedback in formset|zip:eventfeedback_list %} - {% include "includes/eventfeedback_detail_panel.html" with eventfeedback=feedback event=feedback.event %} + {% for form, feedback in formset|zip:event_feedback_list %} + {% include "includes/event_feedback_detail_panel.html" with event_feedback=feedback event=feedback.event %} {% endfor %} Cancel diff --git a/src/backoffice/templates/approve_public_credit_names.html b/src/backoffice/templates/approve_public_credit_names.html index 75d3804b..b712732c 100644 --- a/src/backoffice/templates/approve_public_credit_names.html +++ b/src/backoffice/templates/approve_public_credit_names.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Approve Public Credit Names

@@ -15,7 +11,7 @@

- +
diff --git a/src/backoffice/templates/autoschedule_apply.html b/src/backoffice/templates/autoschedule_apply.html new file mode 100644 index 00000000..e83e87d3 --- /dev/null +++ b/src/backoffice/templates/autoschedule_apply.html @@ -0,0 +1,23 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Really Apply AutoSchedule?

+
+
+

Applying the AutoSchedule will schedule Events in EventSlots to match the result of the AutoScheduler calculation. Any existing autoscheduled Events will be unscheduled.

+ + {% csrf_token %} + {% bootstrap_form form %} + + + Cancel + + +
+
+{% endblock content %} diff --git a/src/backoffice/templates/autoschedule_crash_course.html b/src/backoffice/templates/autoschedule_crash_course.html new file mode 100644 index 00000000..cb2c7dfa --- /dev/null +++ b/src/backoffice/templates/autoschedule_crash_course.html @@ -0,0 +1,31 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+

AutoScheduler Crash Course

+
+
+

The AutoScheduler needs a list of AutoScheduler Slots and a list of AutoScheduler Events to do its thing.

+

We create one AutoScheduler Slot for each EventSlot in all EventSessions for the AutoScheduler-enabled EventTypes.

+

We create one AutoScheduler Event for each EventType which support autoscheduling, excluding any Events which have been scheduled manually.

+

All scheduling constraints are attached to AutoScheduler Events, and they come from many sources: +

    +
  • Slot Conflicts: If a Slot is unavailable because something else has been scheduled in it the Slot is removed and not considered by the AutoScheduler. The same applies if something has been scheduled in a slot in a conflicting EventLocation.
  • +
  • SpeakerAvailability: For each Event we mark any Slots as unavailable if one or more speakers for that event are unavailable for any part of the Slot.
  • +
  • Speaker Conflicts: For each Event we check for each speaker if they are also hosting other Events, and register conflicts as needed, so noone has to be in two places at the same time.
  • +
  • Speaker<>Event Conflicts: If a speaker has expressed desire to attend other Events we register conflicts as needed, so we don't schedule the speakers events at the same time as something the speaker wants to attend.
  • +
  • Event Tags: Events which share a tag are scheduled in the same session if possible, and may not overlap. In other words, all events tagged "Django" will be scheduled together if they can, and if that is not possible they will at least be scheduled without overlaps so it is possible to attend all of them.
  • +
+

+ +

We use the term published schedule when referring the currently published Events (meaning the current schedule on the live site). We use the term draft schedule when referring to the "potential" schedule calculated based on the current data (EventSessions and EventSlots, Events, Speakers, SpeakerAvailability, Event conflicts, Speaker<>Event Conflicts, Event tags) in the database.

+ +

The draft schedule can optionally be created similar to the published schedule. This makes the solver keep the number of schedule changes as low as possible.

+ +

It is fully supported to mix manual scheduling with using the AutoScheduler. The AutoScheduler can be used as needed: It can act strictly as a validator for a manually planned schedule. It could also be used for scheduling some events, while manually scheduling others. It can also be used to do the full schedule. The AutoScheduler will avoid scheduling over manually scheduled events, and will consider manually scheduled events when looking to avoid conflicts.

+ + AutoSchedule Management +
+
+{% endblock content %} diff --git a/src/backoffice/templates/autoschedule_debug_events.html b/src/backoffice/templates/autoschedule_debug_events.html new file mode 100644 index 00000000..23f5653e --- /dev/null +++ b/src/backoffice/templates/autoschedule_debug_events.html @@ -0,0 +1,29 @@ +{% extends 'base.html' %} +{% load bornhack %} + +{% block body %} +

The following conflicts have been found between events in the AutoScheduler, events with a red table cell will not be scheduled together.

+

Back

+
Username
+ + + {% for autoevent,event in scheduler.autoevents|zip:scheduler.events.all %} + + {% endfor %} + + + {% for autoevent,event in scheduler.autoevents|zip:scheduler.events.all %} + + + {% for rowautoevent,rowevent in scheduler.autoevents|zip:scheduler.events.all %} + {% if rowautoevent in autoevent.unavailability or rowautoevent == autoevent or autoevent in rowautoevent.unavailability %} + + {% else %} + + {% endif %} + {% endfor %} + + {% endfor %} +

{{ event.title }}
{{ event.title }}
+

Back

+{% endblock body %} diff --git a/src/backoffice/templates/autoschedule_debug_slots.html b/src/backoffice/templates/autoschedule_debug_slots.html new file mode 100644 index 00000000..dbc11aa3 --- /dev/null +++ b/src/backoffice/templates/autoschedule_debug_slots.html @@ -0,0 +1,30 @@ +{% extends 'base.html' %} +{% load bornhack %} + +{% block body %} +

The following availability matrix has been generated for the Event/Slot combinations in the AutoScheduler

+

Back

+ + + + {% for slot in scheduler.autoslots %} + + {% endfor %} + + + {% for autoevent, event in scheduler.autoevents|zip:scheduler.events.all %} + + + {% for slot in scheduler.autoslots %} + {% if slot in autoevent.unavailability %} + + {% else %} + + {% endif %} + {% endfor %} + + {% endfor %} + +
fedt nok{{ slot.starts_at }} (venue {{ slot.venue }}, cap {{ slot.capacity }})
{{ event.title }} (demand {{ autoevent.demand }})
+

Back

+{% endblock body %} diff --git a/src/backoffice/templates/autoschedule_diff.html b/src/backoffice/templates/autoschedule_diff.html new file mode 100644 index 00000000..9b89661b --- /dev/null +++ b/src/backoffice/templates/autoschedule_diff.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Show schedule diff

+
+
+

Showing the diff between the current schedule (calculated from currently published Events), and the new schedule based on current database object.

+ {% include 'includes/autoschedule_diff_table.html' %} + Back +
+
+{% endblock content %} diff --git a/src/backoffice/templates/autoschedule_index.html b/src/backoffice/templates/autoschedule_index.html new file mode 100644 index 00000000..f43010c6 --- /dev/null +++ b/src/backoffice/templates/autoschedule_index.html @@ -0,0 +1,58 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+

Manage AutoScheduler

+
+
+

Select your desired action below

+ +

If you are new to the AutoScheduler you might wish to consult the crash course for a five minute introduction to the terminology and concepts used.

+

Backoffice

+
+
+ +{% endblock content %} + diff --git a/src/backoffice/templates/autoschedule_validate.html b/src/backoffice/templates/autoschedule_validate.html new file mode 100644 index 00000000..a81f0041 --- /dev/null +++ b/src/backoffice/templates/autoschedule_validate.html @@ -0,0 +1,26 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Validate Schedule

+
+
+

What do you want to validate?

+

Validating the current schedule means looking at the EventSessions, EventLocations, EventTypes, Events and their conflicts, Speakers, SpeakerAvailability, and Speaker<>EventConflicts, and comparing all that with the currently published schedule. Maybe some speakers changed availability or added some event conflicts? Use this tool to check if we still have a valid schedule!

+

Validating the similar schedule means looking at the same things as above, then calculating a new schedule (as similar to the current one as possible), and checking if the new schedule is (would be) valid. Use this to find out if it is feasible to create a new similar schedule from the current data in the database.

+

Validating the new schedule means looking at the same things as above, then calculating a new schedule, without considering the existing schedule. The new schedule will likely be very different from the existing one.

+
+ {% csrf_token %} + {% bootstrap_form form %} + + + Cancel + +
+
+
+{% endblock content %} diff --git a/src/backoffice/templates/badge_handout.html b/src/backoffice/templates/badge_handout.html index 4d49fff4..aea8aedb 100644 --- a/src/backoffice/templates/badge_handout.html +++ b/src/backoffice/templates/badge_handout.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Hand Out Badges

@@ -18,7 +14,7 @@

- +
diff --git a/src/backoffice/templates/chain_list_backoffice.html b/src/backoffice/templates/chain_list_backoffice.html index 87440018..95eecc88 100644 --- a/src/backoffice/templates/chain_list_backoffice.html +++ b/src/backoffice/templates/chain_list_backoffice.html @@ -2,11 +2,6 @@ {% load static %} {% load bootstrap3 %} -{% block extra_head %} - - -{% endblock extra_head %} - {% block title %} Select Chain | {{ block.super }} {% endblock %} @@ -16,7 +11,7 @@ Select Chain | {{ block.super }}

Back to Backoffice Index

{% if chain_list %} -
Ticket UUID
+
diff --git a/src/backoffice/templates/event_delete.html b/src/backoffice/templates/event_delete.html new file mode 100644 index 00000000..2b4bcd1c --- /dev/null +++ b/src/backoffice/templates/event_delete.html @@ -0,0 +1,20 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Really Delete Event?

+
+
+

Really delete event {{ object.title }} ?

+

You can recreate the Event (but not the Events scheduling!) later by re-approving the EventProposal this Event came from.

+
+ {% csrf_token %} + + Back + +
+
+{% endblock content %} + diff --git a/src/backoffice/templates/event_detail_backoffice.html b/src/backoffice/templates/event_detail_backoffice.html new file mode 100644 index 00000000..05170130 --- /dev/null +++ b/src/backoffice/templates/event_detail_backoffice.html @@ -0,0 +1,77 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} +{% load bornhack %} +{% load commonmark %} + +{% block content %} +
+
+

Event: {{ event.title }}

+
+
+ {{ event.abstract|untrustedcommonmark }} + +
+ +

Details for {{ event.title }}

+
Chain Name
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventType{{ event.event_type.icon_html }} {{ event.event_type }}
Event Track{{ event.track.name }}
Tags + {% for tag in event.tags.all %} + {{ tag }} + {% empty %} + N/A + {% endfor %} +
Video Recording{{ event.video_recording|truefalseicon }}
Demand{% if event.demand %}{{ event.demand }} participants expected{% else %}0 (The autoscheduler will not consider capacity/demand when scheduling this event){% endif %}
Proposal Show
Submitted by {{ event.proposal.user.username }}
+ +
+ +

Speakers for {{ event.title }}

+ {% include "includes/speaker_list_table_backoffice.html" with speaker_list=event.speakers.all noactions=True nodatatable=True %} + +
+ +

Schedule for {{ event.title }}

+ {% if event.event_slots.exists %} + {% include "includes/event_slot_list_backoffice.html" with event_slot_list=event.event_slots.all notitle=True %} + {% else %} + N/A + {% endif %} + Schedule Event +
+ +
+ + Update Event + Delete Event + Event List +
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_list_backoffice.html b/src/backoffice/templates/event_list_backoffice.html new file mode 100644 index 00000000..7e6d2443 --- /dev/null +++ b/src/backoffice/templates/event_list_backoffice.html @@ -0,0 +1,28 @@ +{% extends 'base.html' %} +{% load commonmark %} +{% load static %} +{% load bornhack %} + +{% block title %} +Event List | Backoffice | {{ block.super }} +{% endblock %} + +{% block content %} +
+

Event List - BackOffice

+
+

Events are the result of approving an EventProposal. They contain data for the event like title, abstract, duration and more. Search for an event title, speaker names, tags or event type to filter the list. Any changes made here will be reflected immediately on the live site!

+ {% if not event_list %} +

No Events found.

+ {% else %} +

+ Backoffice + {% include "includes/event_list_table_backoffice.html" %} +

+ {% endif %} +

+ Backoffice +

+
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_location_delete.html b/src/backoffice/templates/event_location_delete.html new file mode 100644 index 00000000..bfb2d853 --- /dev/null +++ b/src/backoffice/templates/event_location_delete.html @@ -0,0 +1,18 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Delete EventLocation {{ event_location.name }}?

+
+
+

This EventLocation has {{ event_location.event_sessions.count }} EventSessions with {{ event_location.event_slots.count }} EventSlots which have a total of {{ event_location.scheduled_event_slots.count }} Events scheduled. Deleting the EventLocation will also delete the EventSessions and EventSlots, removing the Events from the schedule!

+
+ {% csrf_token %} + {% bootstrap_button " Yes, Delete it" button_type="submit" button_class="btn-danger" name="Delete" %} + Cancel +
+
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_location_detail.html b/src/backoffice/templates/event_location_detail.html new file mode 100644 index 00000000..f83719a2 --- /dev/null +++ b/src/backoffice/templates/event_location_detail.html @@ -0,0 +1,89 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

EventLocation Details

+
+
+ + + + + + + + + + + + + + + + + + + + + +
Name {{ event_location.name }}
Iconfas fa-{{ event_location.icon }}
Capacity {{ event_location.capacity }}
Conflicts + {% if event_location.conflicts.all %} + + + + + + + + + + {% for conflict in event_location.conflicts.all %} + + + + + + {% endfor %} + +
NameCapacitySessions
{{ conflict.name }}{{ conflict.capacity }}{{ conflict.event_sessions.count }}
+ {% else %} + N/A + {% endif %} +
Sessions + {% if event_location.event_sessions.all %} + + + + + + + + + + + + + {% for session in event_location.event_sessions.all %} + + + + + + + + + {% endfor %} + +
SessionEventTypeWhenDescriptionSlotsEvents
{{ session.pk }}{{ session.event_type.icon_html }} {{ session.event_type.name }}{{ session.when.lower }} to
{{ session.when.upper }}
{{ session.description|default:"N/A" }}{{ session.event_slots.count }}{{ session.scheduled_event_slots.count }}
+ {% else %} + N/A + {% endif %} +
+ Update Location + Delete Location + EventLocation List +
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_location_form.html b/src/backoffice/templates/event_location_form.html new file mode 100644 index 00000000..ec17a020 --- /dev/null +++ b/src/backoffice/templates/event_location_form.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

{% if form.instance.pk %}Update{% else %}Create new{% endif %} EventLocation

+
+
+

{% if form.instance.pk %}Update{% else %}Create{% endif %} EventLocation

+
+ {% csrf_token %} + {% bootstrap_form form %} + + Cancel +
+
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_location_list.html b/src/backoffice/templates/event_location_list.html new file mode 100644 index 00000000..3304229a --- /dev/null +++ b/src/backoffice/templates/event_location_list.html @@ -0,0 +1,69 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+ BackOffice - EventLocations +
+
+

EventLocations - the places where stuff happens!

+ {% if not event_location_list %} +

+ No EventLocations found. Create some! + Create EventLocation +

+ {% else %} +

+ Create EventLocation + Backoffice +

+ + + + + + + + + + + + + + {% for location in event_location_list %} + + + + + + + + + + {% endfor %} + +
NameCapacityLocation ConflictsSessionsSlotsEventsActions
{{ location.icon_html }} {{ location.name }}{{ location.capacity }} + {% if location.conflicts.exists %} +
    + {% for conflict in location.conflicts.all %} + {{ conflict.name }} + {% endfor %} + {% else %} + N/A + {% endif %} +
+
{{ location.event_sessions.count }}{{ location.event_slots.count }}{{ location.scheduled_event_slots.count }} + +
+ {% endif %} +

+ Create EventLocation + Backoffice +

+
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_proposal_approve_reject.html b/src/backoffice/templates/event_proposal_approve_reject.html new file mode 100644 index 00000000..15630cde --- /dev/null +++ b/src/backoffice/templates/event_proposal_approve_reject.html @@ -0,0 +1,28 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +{% if not form.instance.can_be_approved %} +
+

NOTE: Not all SpeakerProposals associated with this EventProposal have been approved. EventProposal can not be approved! It can still be rejected though.

+
+{% endif %} +
+
+

Approve or Reject {{ form.instance.event_type.name }} Proposal

+
+
+

Submitter {{ event_proposal.user }} will receive an email when the EventProposal is approved or rejected. It is possible to include an extra message in the form below explaining why the proposal was accepted or rejected. If the field is left blank a standard email is sent.

+
+ {% csrf_token %} + {% bootstrap_form form %} + {% if form.instance.can_be_approved %} + + {% endif %} + + Cancel +
+
+
+{% endblock content %} + diff --git a/src/backoffice/templates/event_proposal_detail_backoffice.html b/src/backoffice/templates/event_proposal_detail_backoffice.html new file mode 100644 index 00000000..82d6a460 --- /dev/null +++ b/src/backoffice/templates/event_proposal_detail_backoffice.html @@ -0,0 +1,95 @@ +{% extends 'base.html' %} +{% load commonmark %} +{% load bornhack %} + +{% block content %} +

Back to EventProposal List

+{% if not event_proposal.can_be_approved %} +
+

NOTE: Not all SpeakerProposals associated with this EventProposal have been approved. EventProposal can not be approved! It can still be rejected though.

+
+{% endif %} +
+
{{ event_proposal.event_type.name }} Proposal: {{ event_proposal.title }}
+
+ {{ event_proposal.abstract|untrustedcommonmark }} + +
+ +

Details for {{ event_proposal.title }}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UUID{{ event_proposal.uuid }}
Status{{ event_proposal.proposal_status }}
EventType{{ event_proposal.event_type.icon_html }} {{ event_proposal.event_type }}
Duration{{ event_proposal.duration }} minutes
Tags + {% for tag in event_proposal.tags.all %} + {{ tag }} + {% empty %} + N/A + {% endfor %} +
Use provided laptop?{{ event_proposal.use_provided_speaker_laptop|truefalseicon }}
Submission Notes{{ event_proposal.submission_notes|untrustedcommonmark|default:"N/A" }}
+ +
+ +

URLs for {{ event_proposal.title }}

+ {% if event_proposal.urls.exists %} + {% include 'includes/event_proposal_url_table.html' %} + {% else %} + Nothing found. + {% endif %} + +
+ +

{{ event_proposal.event_type.host_title }} Proposals for {{ event_proposal.title }}

+ {% if event_proposal.speakers.exists %} + {% include 'includes/speaker_proposal_list_table_backoffice.html' with speaker_proposal_list=event_proposal.speakers.all nodatatable=True %} + {% else %} + Nothing found. + {% endif %} +
+ +
+ +{% if not event_proposal.can_be_approved %} +

NOTE: Not all SpeakerProposals associated with this EventProposal have been approved. EventProposal can not be approved! It can still be rejected though.

+
+{% endif %} + +

+{% if event_proposal.proposal_status == "pending" %} +{% if form.instance.can_be_approved %} + Approve EventProposal +{% endif %} + Reject EventProposal +{% endif %} + Back to EventProposal List +

+ +{% endblock content %} diff --git a/src/backoffice/templates/event_proposal_list.html b/src/backoffice/templates/event_proposal_list.html new file mode 100644 index 00000000..d8d44a95 --- /dev/null +++ b/src/backoffice/templates/event_proposal_list.html @@ -0,0 +1,22 @@ +{% extends 'base.html' %} + +{% block title %} +EventProposal List | Backoffice | {{ block.super }} +{% endblock %} + +{% block content %} +{% if event_proposal_list %} +
+

EventProposal List - BackOffice

+
+

This is a list of all EventProposal objects in the system. Search for title, type, username, speakers or status to filter the table.

+

Backoffice

+ {% if event_proposal_list %} + {% include 'includes/event_proposal_list_table_backoffice.html' %} + {% else %} + No EventProposals found. + {% endif %} +
+
+{% endif %} +{% endblock %} diff --git a/src/backoffice/templates/event_schedule.html b/src/backoffice/templates/event_schedule.html new file mode 100644 index 00000000..9b705697 --- /dev/null +++ b/src/backoffice/templates/event_schedule.html @@ -0,0 +1,48 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} +{% load static %} +{% load bornhack %} + +{% block content %} +
+
+

Select EventSlot for {{ event.title }}

+
+
+

The following EventSlots are available and suitable for scheduling {{ event.title }}

+

This event has a demand of {{ event.demand }} people.

+
+ {% csrf_token %} + {% if event_slots %} + + + + + + + + + + + + {% for slot in event_slots %} + + + + + + + + {% endfor %} + +
PickStartEndLocationCapacity
{{ slot.slot.when.lower }}{{ slot.slot.when.upper }} {{ slot.slot.event_session.event_location.name }}{{ slot.slot.event_session.event_location.capacity }}
+ + {% else %} +

No available slots found

+ {% endif %} + Cancel +
+
+
+{% endblock content %} + diff --git a/src/backoffice/templates/event_session_create_location_select.html b/src/backoffice/templates/event_session_create_location_select.html new file mode 100644 index 00000000..6d42b3c5 --- /dev/null +++ b/src/backoffice/templates/event_session_create_location_select.html @@ -0,0 +1,25 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Create New EventSession - Select Event Location

+
+
+

Select Event Location for the new EventSession

+
+ {% for location in event_location_list %} + +

+ + {{ location.name }} +

+

Create EventSession for {{ location.name }}

+
+ {% endfor %} +
+
+
+{% endblock content %} + diff --git a/src/backoffice/templates/event_session_create_type_select.html b/src/backoffice/templates/event_session_create_type_select.html new file mode 100644 index 00000000..5da8dc1a --- /dev/null +++ b/src/backoffice/templates/event_session_create_type_select.html @@ -0,0 +1,25 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Create New EventSession - Select Event Type

+
+
+

Select Event Type for the new EventSession

+ +
+
+{% endblock content %} + diff --git a/src/backoffice/templates/event_session_delete.html b/src/backoffice/templates/event_session_delete.html new file mode 100644 index 00000000..b250a77d --- /dev/null +++ b/src/backoffice/templates/event_session_delete.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Delete EventSession?

+
+
+

This EventSession runs from {{ session.when.lower }} to {{ session.when.upper }}. We currently have {{ session.scheduled_event_slots.count }} Events scheduled in this session, leaving {{ session.free_time }} time unused. Deleting an EventSession means deleting all the EventSlots, which means anything scheduled will no longer be scheduled.

+
+ {% csrf_token %} + {% bootstrap_button " Yes, Delete it" button_type="submit" button_class="btn-danger" name="Delete" %} + Cancel +
+
+
+{% endblock content %} + diff --git a/src/backoffice/templates/event_session_detail.html b/src/backoffice/templates/event_session_detail.html new file mode 100644 index 00000000..8561cb74 --- /dev/null +++ b/src/backoffice/templates/event_session_detail.html @@ -0,0 +1,82 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

EventSession Details

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Session ID{{ session.pk }}
Event Type {{ session.event_type }}
Event Location {{ session.event_location.name }}
Session Start{{ session.when.lower }}
Session End{{ session.when.upper }}
Session Duration{{ session.duration }}
EventSlots and Events + + + + + + + + + + + {% for slot in session.event_slots.all %} + + + + + + + {% endfor %} + +
StartEndEventSpeakers
{{ slot.when.lower }}{{ slot.when.upper }} + {% if slot.event %} + {{ slot.event.event_type.icon_html }} {{ slot.event.title }} + {% else %} + N/A + {% endif %} + + {% if slot.event.speakers.exists %} + + {% else %} + N/A + {% endif %} +
+
+ Update EventSession + Delete EventSession + List EventSessions +
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_session_form.html b/src/backoffice/templates/event_session_form.html new file mode 100644 index 00000000..94698cef --- /dev/null +++ b/src/backoffice/templates/event_session_form.html @@ -0,0 +1,63 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} +{% load tz %} + +{% block content %} +
+
+

{% if form.instance.pk %}Update{% else %}Create new{% endif %} EventSession

+
+
+

{% if form.instance.pk %}Update{% else %}Create new{% endif %} EventSession for Event Type {{ event_type }} at location {{ event_location.name }}.

+
+ {% csrf_token %} + {% bootstrap_form form %} + {% get_current_timezone as TIME_ZONE %} +
Note: Input will be interpreted as being in time zone {{ TIME_ZONE }}.
+ + Cancel +
+
+
+{% if sessions %} +
+
+

We have {{ sessions.count }} existing EventSessions for EventType {{ event_type }} at location {{ event_location.name }}:

+
+
+ + + + + + + + + + + + + + {% for session in sessions %} + + + + + + + + + {% endfor %} + +
idSession StartSession EndSession LengthEventsFree TimeActions
{{ session.id }}{{ session.when.lower }}{{ session.when.upper }}{{ session.duration }}{{ session.event_count }}{{ session.free_time }} + +
+
+
+{% endif %} +{% endblock content %} + diff --git a/src/backoffice/templates/event_session_list.html b/src/backoffice/templates/event_session_list.html new file mode 100644 index 00000000..dcb66b20 --- /dev/null +++ b/src/backoffice/templates/event_session_list.html @@ -0,0 +1,70 @@ +{% extends 'base.html' %} +{% load commonmark %} +{% load static %} +{% load bornhack %} + +{% block content %} +
+
+ BackOffice - EventSessions +
+
+

EventSessions define the EventSlots where Events of a certain EventType at a certain EventLocation can be scheduled. EventSessions and EventSlots are used in the following ways in the system:

+
    +
  • To customise the speaker availability form shown when users submit speakers.
  • +
  • They are also used to assist and restrict manual scheduling in backoffice.
  • +
  • They are also used by the AutoScheduler.
  • +
+

Search for an EventType or EventLocation to filter the list.

+ {% if not event_session_list %} +

+ No EventSessions found. Go create one! + Create New EventSession +

+ {% else %} +

+ Create New EventSession + Backoffice +

+ + + + + + + + + + + + + + + {% for session in event_session_list %} + + + + + + + + + + + {% endfor %} + +
Session IDWhenDescriptionDurationScheduled EventsEvent TypeEvent LocationAction
{{ session.id }}{{ session.when.lower }} to
{{ session.when.upper }}
{{ session.description|default:"N/A" }}{{ session.duration }}
{{ session.event_slots.count }} slots
{{ session.scheduled_event_slots.count }} {{ session.event_type }} {{ session.event_location.name }} + +
+ {% endif %} +

+ Create New Session + Backoffice +

+
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_slot_detail.html b/src/backoffice/templates/event_slot_detail.html new file mode 100644 index 00000000..4a8fe054 --- /dev/null +++ b/src/backoffice/templates/event_slot_detail.html @@ -0,0 +1,54 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

EventSlot {{ event_slot.pk }} Details

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventSlot ID{{ event_slot.pk }}
EventSessionThis EventSlot is part of EventSession {{ event_slot.event_session.pk }} which happens at {{ event_slot.event_session.event_location.name }} from {{ event_slot.event_session.when.lower }} to {{ event_slot.event_session.when.upper }}.
Event Type {{ event_slot.event_session.event_type }}
Event Location {{ event_slot.event_session.event_location.name }}
EventSlot Start{{ event_slot.when.lower }}
EventSlot End{{ event_slot.when.upper }}
EventSlot Duration{{ event_slot.duration }}
Scheduled Event + {% if event_slot.event %} + {{ event_slot.event_type.icon_html }} {{ event_slot.event.title }} + Unschedule Event + {% else %} + N/A + {% endif %} +
+ List EventSlots +
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_slot_list.html b/src/backoffice/templates/event_slot_list.html new file mode 100644 index 00000000..995d8056 --- /dev/null +++ b/src/backoffice/templates/event_slot_list.html @@ -0,0 +1,82 @@ +{% extends 'base.html' %} +{% load commonmark %} +{% load static %} +{% load bornhack %} + +{% block content %} +
+
+ BackOffice - EventSlots +
+
+

EventSlots are what we schedule Events in. Search for an Event, Speaker, EventType, EventLocation, or day to filter the list.

+ {% if not event_slot_list %} +

+ No EventSlots found. Go create some EventSessions! + Create EventSession + Backoffice +

+ {% else %} +

+ Backoffice +

+ + + + + + + + + + + + + + + + {% for slot in event_slot_list %} + + + + + + + {% if slot.event %} + + + + {% else %} + + + + {% endif %} + + + {% endfor %} + +
StartEndSessionTypeLocationEventSpeakersOverflowActions
{{ slot.when.lower }}{{ slot.when.upper }} {{ slot.event_session.id }}{{ slot.event_type.icon_html }} {{ slot.event_type.name }}{{ slot.event_location.icon_html }} {{ slot.event_location.name }}{{ slot.event.title }}
({% if slot.autoscheduled %}autoscheduled{% else %}manual{% endif %})
+ {% if slot.event.speakers.exists %} +
    + {% for speaker in slot.event.speakers.all %} + {{ speaker.name }} + {% endfor %} + {% else %} + N/A + {% endif %} +
+
{{ slot.overflow }}N/AN/AN/A +
+ Details + {% if slot.event %} + Unschedule + {% endif %} +
+
+ {% endif %} +

+ Backoffice +

+
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_slot_unschedule.html b/src/backoffice/templates/event_slot_unschedule.html new file mode 100644 index 00000000..acd27f73 --- /dev/null +++ b/src/backoffice/templates/event_slot_unschedule.html @@ -0,0 +1,24 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Unschedule Event {{ event_slot.event.title }}?

+
+
+

This EventSlot runs from {{ event_slot.when.lower }} to {{ event_slot.when.upper }}. It is part of an EventSession for {{ event_slot.event_type.icon_html }} {{ event_slot.event_type }} at location {{ event_slot.event_location }}.

+

The scheduled Event is titled {{ event_slot.event.title }}

+ +

Really unschedule this Event?

+ +
+ {% csrf_token %} + {% bootstrap_form form %} + + Cancel +
+
+
+{% endblock content %} + diff --git a/src/backoffice/templates/event_type_detail.html b/src/backoffice/templates/event_type_detail.html new file mode 100644 index 00000000..0a8c9fed --- /dev/null +++ b/src/backoffice/templates/event_type_detail.html @@ -0,0 +1,91 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Details for EventType: {{ event_type.name }}

+
+
+ + + + + + + + + + + + +
Event Type + {{ event_type }} +
EventSessions + {% if event_sessions %} + + + + + + + + + + + + {% for session in event_sessions %} + + + + + + + + {% endfor %} + +
LocationStartEndSlotsEvents
+ {{ session.event_location.icon_html }} {{ session.event_location.name }} + {{ session.when.lower }}{{ session.when.upper }}{{ session.event_slots.count }}{{ session.scheduled_event_slots.count }}
+ {% else %} + N/A + {% endif %} +
Events + {% if events %} + + + + + + + + + + {% for event in events %} + + + + + + {% endfor %} + +
TitlePeopleSlots
{{ event.event_type.icon_html }} {{ event.title }} +
    + {% for speaker in event.speakers.all %} + {{ speaker.name }} + {% empty %} + N/A + {% endfor %} +
+
+
+ {% else %} + N/A + {% endif %} +
+ EventType List +
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_type_list.html b/src/backoffice/templates/event_type_list.html new file mode 100644 index 00000000..6b5f4f31 --- /dev/null +++ b/src/backoffice/templates/event_type_list.html @@ -0,0 +1,50 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+ BackOffice - EventTypes +
+
+

EventTypes define categories or types of events, like "Music Act" or "Workshop" or "Talk". They are not camp specific, so they are not editable here.

+ {% if not event_type_list %} +

+ No EventTypes found. Is this the twillight zone? +

+ {% else %} +

+ Backoffice +

+ + + + + + + + + + + + {% for type in event_type_list %} + + + + + + + + {% endfor %} + +
NameSessionsSlotsEventsActions
{{ type.icon_html }} {{ type.name }}{{ type.event_sessions_count }}{{ type.event_slots_count }}{{ type.event_count }} + +
+ {% endif %} +

+ Backoffice +

+
+
+{% endblock content %} diff --git a/src/backoffice/templates/event_update.html b/src/backoffice/templates/event_update.html new file mode 100644 index 00000000..73a7e0bb --- /dev/null +++ b/src/backoffice/templates/event_update.html @@ -0,0 +1,21 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} +{% load static %} +{% load bornhack %} + +{% block content %} +
+
+

Update Event: {{ event.title }}

+
+
+

Note: Any changes made here will be overwritten if the EventProposal for this event is later re-approved.

+
+ {% csrf_token %} + {% bootstrap_form form %} + + Cancel +
+
+
+{% endblock content %} diff --git a/src/backoffice/templates/expense_list_backoffice.html b/src/backoffice/templates/expense_list_backoffice.html index 4af1d732..adcaf923 100644 --- a/src/backoffice/templates/expense_list_backoffice.html +++ b/src/backoffice/templates/expense_list_backoffice.html @@ -1,11 +1,6 @@ {% extends 'base.html' %} {% load static %} -{% block extra_head %} - - -{% endblock extra_head %} - {% block content %}

Manage Expenses for {{ camp.title }}

diff --git a/src/backoffice/templates/includes/autoschedule_diff_table.html b/src/backoffice/templates/includes/autoschedule_diff_table.html new file mode 100644 index 00000000..ca5e4bf7 --- /dev/null +++ b/src/backoffice/templates/includes/autoschedule_diff_table.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + {% for eventdiff in diff.event_diffs %} + + + + + + + + {% endfor %} + +
Event Differences - each row shows an event which changed time or location
EventOld LocationNew LocationOld Start TimeNew Start Time
+ {% if eventdiff.event.slug %} + {{ eventdiff.event.title }} + {% else %} + Event ID {{ eventdiff.event }} (deleted) + {% endif %} + {{ eventdiff.old.event_location.name|default:"N/A" }}{{ eventdiff.new.event_location.name|default:"N/A" }}{{ eventdiff.old.starttime|default:"N/A" }}{{ eventdiff.new.starttime|default:"N/A" }}
+ + + + + + + + + + + + {% for slotdiff in diff.slot_diffs %} + + + + + + + {% endfor %} + +
Slot Differences - each row represents a slot with changed content
EventLocationStart TimeOld EventNew Event
{{ slotdiff.event_location.name }}{{ slotdiff.starttime }} + {% if slotdiff.old.event %} + {% if slotdiff.old.event.title %}{{ slotdiff.old.event.title }}{% else %}Event ID {{ slotdiff.old.event }} (deleted){% endif %} + {% else %} + N/A + {% endif %} + + {% if slotdiff.new.event %} + {% if slotdiff.new.event.title %}{{ slotdiff.new.event.title }}{% else %}Event ID {{ slotdiff.new.event }} (deleted){% endif %} + {% else %} + N/A + {% endif %} +
+ diff --git a/src/backoffice/templates/includes/event_list_table_backoffice.html b/src/backoffice/templates/includes/event_list_table_backoffice.html new file mode 100644 index 00000000..8c3b802b --- /dev/null +++ b/src/backoffice/templates/includes/event_list_table_backoffice.html @@ -0,0 +1,57 @@ + + + + + + + {% if not nopeople %}{% endif %} + {% if not noschedule %}{% endif %} + {% if not noactions %}{% endif %} + + + + {% for event in event_list %} + + + + + {% if not nopeople %} + + {% endif %} + {% if not noschedule %} + + {% endif %} + {% if not noactions %} + + {% endif %} + + {% endfor %} + +
TitleEvent TypeTagsPeopleScheduledActions
{{ event.title }}{{ event.event_type.icon_html }} {{ event.event_type }} + {% for tag in event.tags.all %} + {{ tag }}
+ {% empty %} + N/A + {% endfor %} +
+ {% for speaker in event.speakers.all %} + {{ speaker.name }}
+ {% empty %} + N/A + {% endfor %} +
+ {% if event.event_slots.exists %} + {% for slot in event.event_slots.all %} + {{ slot.event_location.icon_html }} + {{ slot.event_location.name }}, {{ slot.when.lower }}
+ {% endfor %} + {% else %} + Not scheduled yet + {% endif %} +
+ +
diff --git a/src/backoffice/templates/includes/event_proposal_list_table_backoffice.html b/src/backoffice/templates/includes/event_proposal_list_table_backoffice.html new file mode 100644 index 00000000..945ee826 --- /dev/null +++ b/src/backoffice/templates/includes/event_proposal_list_table_backoffice.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + {% for proposal in event_proposal_list %} + + + + + + + {% if proposal.event %} + + {% else %} + + {% endif %} + + + + {% endfor %} + +
TitleStatusTypeTagsSpeaker ProposalsEvent?UserAction
{{ proposal.title }}{{ proposal.proposal_status }} {{ proposal.event_type }} + {% for tag in proposal.tags.all %} + {{ tag }}
+ {% empty %} + N/A + {% endfor %} +
+ {% if proposal.speakers.exists %} +
    + {% for speaker in proposal.speakers.all %} + {{ speaker.name }} + {% endfor %} + {% else %} + N/A + {% endif %} +
+ {{ proposal.event_type.icon_html }} Event + {{ proposal.user }} +
+ Details + {% if proposal.proposal_status == "pending" %} + Approve + Reject + {% endif %} +
+
+ diff --git a/src/backoffice/templates/includes/event_slot_list_backoffice.html b/src/backoffice/templates/includes/event_slot_list_backoffice.html new file mode 100644 index 00000000..3dcd0a60 --- /dev/null +++ b/src/backoffice/templates/includes/event_slot_list_backoffice.html @@ -0,0 +1,29 @@ + + + + {% if not notitle %}{% endif %} + + + + + + + + + {% for slot in event_slot_list %} + + {% if not notitle %} + + {% endif %} + + + + + + + {% endfor %} + +
EventSlotLocationDurationOverflowActions
{{ slot.event.title }}{{ slot.when.lower }}{{ slot.event_location.icon_html }} {{ slot.event_location.name }}{{ slot.duration }}{{ slot.overflow }} + Show + Unschedule +
diff --git a/src/backoffice/templates/includes/speaker_list_table_backoffice.html b/src/backoffice/templates/includes/speaker_list_table_backoffice.html new file mode 100644 index 00000000..114e7d06 --- /dev/null +++ b/src/backoffice/templates/includes/speaker_list_table_backoffice.html @@ -0,0 +1,46 @@ + + + + + + + + + + {% if not noactions %}{% endif %} + + + + {% for speaker in speaker_list %} + + + + + + + + {% if not noactions %} + + {% endif %} + + {% endfor %} + +
NameEmailSubmitterProposalEvent ConflictsEventsActions
{{ speaker.name }}{{ speaker.email }} {{ speaker.proposal.user }} Show{{ speaker.event_conflicts.count }} + {% if speaker.events.all %} + + {% else %} + N/A + {% endif %} + + +
diff --git a/src/backoffice/templates/includes/speaker_proposal_list_table_backoffice.html b/src/backoffice/templates/includes/speaker_proposal_list_table_backoffice.html new file mode 100644 index 00000000..56e7e749 --- /dev/null +++ b/src/backoffice/templates/includes/speaker_proposal_list_table_backoffice.html @@ -0,0 +1,41 @@ +{% load bornhack %} + + + + + + + + + + + + + + {% for proposal in speaker_proposal_list %} + + + + + + + + + + {% endfor %} + +
NameEmailNeeds Ticket?Proposal StatusHas Speaker?Submitting UserAction
{{ proposal.name }}{{ proposal.email }}{{ proposal.needs_oneday_ticket|truefalseicon }}{{ proposal.proposal_status }} + {% if proposal.speaker %} + Show Speaker + {% else %} + + {% endif %} + {{ proposal.user }} +
+ Details + {% if proposal.proposal_status == "pending" %} + Approve + Reject + {% endif %} +
+
diff --git a/src/backoffice/templates/index.html b/src/backoffice/templates/index.html index 3c02d1a2..64642e9c 100644 --- a/src/backoffice/templates/index.html +++ b/src/backoffice/templates/index.html @@ -4,15 +4,12 @@ {% load imageutils %} {% block content %} -
-

{{ camp.title }} Backoffice

-
- Welcome to the promised land! Please select your desired action below: +
+
+

{{ camp.title }} Backoffice

-
- - {% endblock content %} diff --git a/src/backoffice/templates/manage_eventproposal.html b/src/backoffice/templates/manage_eventproposal.html deleted file mode 100644 index 4fcb51b7..00000000 --- a/src/backoffice/templates/manage_eventproposal.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends 'base.html' %} -{% load bootstrap3 %} - -{% block content %} -

Manage {{ form.instance.event_type.name }} Proposal

-{% include 'includes/eventproposal_detail.html' with camp=camp %} -
- {% csrf_token %} - {% bootstrap_form form %} - {% bootstrap_button " Approve" button_type="submit" button_class="btn-success" name="approve" %} - {% bootstrap_button " Reject" button_type="submit" button_class="btn-danger" name="reject" %} - Cancel -
-{% endblock content %} - diff --git a/src/backoffice/templates/manage_proposals.html b/src/backoffice/templates/manage_proposals.html deleted file mode 100644 index c812e4ec..00000000 --- a/src/backoffice/templates/manage_proposals.html +++ /dev/null @@ -1,83 +0,0 @@ -{% extends 'base.html' %} -{% load commonmark %} -{% load static %} -{% load imageutils %} -{% load bornhack %} - -{% block extra_head %} - - -{% endblock extra_head %} -{% block content %} -
-

BackOffice - Manage Speaker+EventProposals

-
- The Content team can approve or reject pending SpeakerProposals and EventProposals from this page. -
-
-
-
-

SpeakerProposals

- {% if not speakerproposals %} -

No pending SpeakerProposals found

- {% else %} - - - - - - - - - - - - - {% for proposal in speakerproposals %} - - - - - - - - - {% endfor %} - -
NameEmailTicket?Speaker?Submitting UserAction
{{ proposal.name }}{{ proposal.email }}{{ proposal.needs_oneday_ticket|truefalseicon }}{{ proposal.event|truefalseicon }}{{ proposal.user }} Manage
- {% endif %} - -

EventProposals

- {% if not eventproposals %} -

No pending SpeakerProposals found

- {% else %} - - - - - - - - - - - - - - {% for proposal in eventproposals %} - - - - - - - - - - {% endfor %} - -
TitleTrackTypeSpeakersEvent?Submitting UserAction
{{ proposal.title }}{{ proposal.track }} {{ proposal.event_type }}{% for speaker in proposal.speakers.all %} {% endfor %}{{ proposal.speaker|truefalseicon }}{{ proposal.user }} Manage
- {% endif %} -
-{% endblock content %} - diff --git a/src/backoffice/templates/manage_speakerproposal.html b/src/backoffice/templates/manage_speakerproposal.html deleted file mode 100644 index ab545463..00000000 --- a/src/backoffice/templates/manage_speakerproposal.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends 'base.html' %} -{% load bootstrap3 %} - -{% block content %} -

Manage Speaker Proposal

-{% include 'includes/speakerproposal_detail.html' with camp=camp %} -
- {% csrf_token %} - {% bootstrap_form form %} - {% bootstrap_button " Approve" button_type="submit" button_class="btn-success" name="approve" %} - {% bootstrap_button " Reject" button_type="submit" button_class="btn-danger" name="reject" %} - Cancel -
-{% endblock content %} - diff --git a/src/backoffice/templates/merchandise_to_order.html b/src/backoffice/templates/merchandise_to_order.html index 8854c10a..1b631d46 100644 --- a/src/backoffice/templates/merchandise_to_order.html +++ b/src/backoffice/templates/merchandise_to_order.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Merchandise To Order

@@ -18,7 +14,7 @@

- +
diff --git a/src/backoffice/templates/orders_merchandise.html b/src/backoffice/templates/orders_merchandise.html index d78370ca..80aec9ac 100644 --- a/src/backoffice/templates/orders_merchandise.html +++ b/src/backoffice/templates/orders_merchandise.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Merchandise Orders

@@ -17,7 +13,7 @@

-
Merchandise Type
+
diff --git a/src/backoffice/templates/orders_village.html b/src/backoffice/templates/orders_village.html index e676e0e0..22d9dabe 100644 --- a/src/backoffice/templates/orders_village.html +++ b/src/backoffice/templates/orders_village.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Village Orders

@@ -17,7 +13,7 @@

-
Order
+
diff --git a/src/backoffice/templates/pending_proposals.html b/src/backoffice/templates/pending_proposals.html new file mode 100644 index 00000000..c042c988 --- /dev/null +++ b/src/backoffice/templates/pending_proposals.html @@ -0,0 +1,32 @@ +{% extends 'base.html' %} +{% load commonmark %} +{% load static %} +{% load imageutils %} +{% load bornhack %} + +{% block content %} +
+
+

BackOffice - Pending Proposals

+
+
+ Backoffice +

+

Pending SpeakerProposals

+ {% if not speaker_proposal_list %} +

No pending SpeakerProposals found

+ {% else %} + {% include 'includes/speaker_proposal_list_table_backoffice.html' %} + {% endif %} + +
+ +

Pending EventProposals

+ {% if not event_proposal_list %} +

No pending EventProposals found

+ {% else %} + {% include 'includes/event_proposal_list_table_backoffice.html' %} + {% endif %} +
+
+{% endblock content %} diff --git a/src/backoffice/templates/product_handout.html b/src/backoffice/templates/product_handout.html index eedcc1ce..bb7cfab4 100644 --- a/src/backoffice/templates/product_handout.html +++ b/src/backoffice/templates/product_handout.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Hand Out Products

@@ -18,7 +14,7 @@

-
Order
+
diff --git a/src/backoffice/templates/reimbursement_list_backoffice.html b/src/backoffice/templates/reimbursement_list_backoffice.html index 18296392..8ff9e0bc 100644 --- a/src/backoffice/templates/reimbursement_list_backoffice.html +++ b/src/backoffice/templates/reimbursement_list_backoffice.html @@ -1,11 +1,6 @@ {% extends 'base.html' %} {% load static %} -{% block extra_head %} - - -{% endblock extra_head %} - {% block content %}

Reimbursements for {{ camp.title }}

diff --git a/src/backoffice/templates/revenue_list_backoffice.html b/src/backoffice/templates/revenue_list_backoffice.html index 88a398aa..10ba28bf 100644 --- a/src/backoffice/templates/revenue_list_backoffice.html +++ b/src/backoffice/templates/revenue_list_backoffice.html @@ -1,11 +1,6 @@ {% extends 'base.html' %} {% load static %} -{% block extra_head %} - - -{% endblock extra_head %} - {% block content %}

Manage Revenues for {{ camp.title }}

diff --git a/src/backoffice/templates/shop_ticket_overview.html b/src/backoffice/templates/shop_ticket_overview.html index 761f85fe..9876b04c 100644 --- a/src/backoffice/templates/shop_ticket_overview.html +++ b/src/backoffice/templates/shop_ticket_overview.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Shop Tickets

@@ -15,7 +11,7 @@
-
Order
+
diff --git a/src/backoffice/templates/speaker_delete.html b/src/backoffice/templates/speaker_delete.html new file mode 100644 index 00000000..8563826b --- /dev/null +++ b/src/backoffice/templates/speaker_delete.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Delete Speaker {{ object.name }}?

+
+
+

Deleting a Speaker object will remove the person from all Events, scheduled or not. The change will immediately take effect on the live site. The speaker can later be recreated by re-approving the SpeakerProposal if needed.

+
+ {% csrf_token %} + + Cancel + +
+
+{% endblock content %} + diff --git a/src/backoffice/templates/speaker_detail_backoffice.html b/src/backoffice/templates/speaker_detail_backoffice.html new file mode 100644 index 00000000..355bbc49 --- /dev/null +++ b/src/backoffice/templates/speaker_detail_backoffice.html @@ -0,0 +1,68 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} +{% load bornhack %} +{% load program %} +{% load commonmark %} + +{% block content %} +
+
+

Speaker: {{ speaker.name }}

+
+
+ {{ speaker.biography|untrustedcommonmark }} + +
+ +

Details for {{ speaker.name }}

+
Ticket Type
+ + + + + + + + +
Email{{ speaker.email }}
Proposal{{ speaker.proposal.pk }}
+ +
+ +

Availability for {{ speaker.name }}

+ {% availabilitytable matrix=matrix %} + + +
+ +

Events for {{ speaker.name }}

+ {% if speaker.events.exists %} + {% include "includes/event_list_table_backoffice.html" with event_list=speaker.events.all noactions=True noschedule=True nodatatable=True %} + {% else %} + N/A + {% endif %} + +
+ +

Schedule for {{ speaker.name }}

+ {% if speaker.scheduled_event_slots.exists %} + {% include "includes/event_slot_list_backoffice.html" with event_slot_list=speaker.scheduled_event_slots.all %} + {% else %} + N/A + {% endif %} + +
+ +

Event Conflicts for {{ speaker.name }}

+ {% if speaker.event_conflicts.exists %} + {% include "includes/event_list_table_backoffice.html" with event_list=speaker.event_conflicts.all nodatatable=True nopeople=True noactions=True noschedule=True %} + {% else %} + N/A + {% endif %} + +
+ Update + Delete + Speaker List +
+
+{% endblock content %} diff --git a/src/backoffice/templates/speaker_list_backoffice.html b/src/backoffice/templates/speaker_list_backoffice.html new file mode 100644 index 00000000..97480b17 --- /dev/null +++ b/src/backoffice/templates/speaker_list_backoffice.html @@ -0,0 +1,20 @@ +{% extends 'program_base.html' %} + +{% block title %} +Speaker List | Backoffice | {{ block.super }} +{% endblock %} + +{% block content %} +{% if speaker_list %} +
+

Speaker List - Backoffice

+
+

Speakers are the result of approving a SpeakerProposal. This is an alphabetical list of all speakers, workshop hosts, artists and other event anchors at {{ camp.title }}. Any changes made here will be reflected immediately on the live site!

+

Backoffice

+ {% include "includes/speaker_list_table_backoffice.html" %} +

Backoffice

+
+{% else %} +

No speakers found for {{ camp.title }}

+{% endif %} +{% endblock content %} diff --git a/src/backoffice/templates/speaker_proposal_approve_reject.html b/src/backoffice/templates/speaker_proposal_approve_reject.html new file mode 100644 index 00000000..554ce2dc --- /dev/null +++ b/src/backoffice/templates/speaker_proposal_approve_reject.html @@ -0,0 +1,21 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} + +{% block content %} +
+
+

Approve or Reject SpeakerProposal: {{ speaker_proposal.name }}

+
+
+

{{ speaker_proposal.name }} will receive an email when the proposal is approved or rejected. It is possible to include an extra message in the form below explaining why the proposal was accepted or rejected. If the field is left blank a standard email is sent.

+
+ {% csrf_token %} + {% bootstrap_form form %} + + + Cancel +
+
+
+{% endblock content %} + diff --git a/src/backoffice/templates/speaker_proposal_detail_backoffice.html b/src/backoffice/templates/speaker_proposal_detail_backoffice.html new file mode 100644 index 00000000..764d74fc --- /dev/null +++ b/src/backoffice/templates/speaker_proposal_detail_backoffice.html @@ -0,0 +1,90 @@ +{% extends 'base.html' %} +{% load commonmark %} +{% load program %} + +{% block content %} +

Back to SpeakerProposal List

+
+
{{ speaker_proposal.title }} Proposal: {{ speaker_proposal.name }}
+
+ {{ speaker_proposal.biography|untrustedcommonmark }} + +
+ +

Details for {{ speaker_proposal.name }}

+ + + + + + + + + + + + + + + + + + + + + + + +
UUID{{ speaker_proposal.uuid }}
Status{{ speaker_proposal.proposal_status }}
Speaker Object + {% if speaker_proposal.speaker %} + Show + {% else %} + N/A + {% endif %} +
Username{{ speaker_proposal.user }}
Submission Notes{{ speaker_proposal.submission_notes|untrustedcommonmark|default:"N/A" }}
+ +
+ +

Availability for {{ speaker_proposal.name }}

+ {% availabilitytable matrix=matrix %} + +
+ +

URLs for {{ speaker_proposal.name }}

+ {% if speaker_proposal.urls.exists %} + {% include 'includes/speaker_proposal_url_table.html' %} + {% else %} + Nothing found. + {% endif %} + +
+ +

EventProposals involving {{ speaker_proposal.name }}

+ {% if speaker_proposal.event_proposals.exists %} + {% include 'includes/event_proposal_list_table_backoffice.html' with event_proposal_list=speaker_proposal.event_proposals.all nodatatable=True %} + {% else %} + Nothing found. + {% endif %} + +
+ +

Event Conflicts for {{ speaker_proposal.name }}

+ {% if speaker_proposal.event_conflicts.exists %} + {% include 'includes/event_list_table_backoffice.html' with event_list=speaker_proposal.event_conflicts.all nodatatable=True nopeople=True noactions=True noschedule=True %} + {% else %} + Nothing found. + {% endif %} + +
+ +
+ +

+{% if speaker_proposal.proposal_status == "pending" %} + Approve SpeakerProposal + Reject SpeakerProposal +{% endif %} + Back to SpeakerProposal List +

+ +{% endblock content %} diff --git a/src/backoffice/templates/speaker_proposal_list.html b/src/backoffice/templates/speaker_proposal_list.html new file mode 100644 index 00000000..63ed69a6 --- /dev/null +++ b/src/backoffice/templates/speaker_proposal_list.html @@ -0,0 +1,24 @@ +{% extends 'base.html' %} + +{% block title %} +SpeakerProposal List | Backoffice | {{ block.super }} +{% endblock %} + +{% block content %} + +{% if speaker_proposal_list %} +
+

SpeakerProposal List - Backoffice

+
+

This is a list of all SpeakerProposal objects in the system. Search for name, email, username, or status to filter the table.

+

Backoffice

+ {% if speaker_proposal_list %} + {% include 'includes/speaker_proposal_list_table_backoffice.html' %} + {% else %} + No SpeakerProposals found. + {% endif %} +
+
+{% endif %} + +{% endblock %} diff --git a/src/backoffice/templates/speaker_update.html b/src/backoffice/templates/speaker_update.html new file mode 100644 index 00000000..f26831bc --- /dev/null +++ b/src/backoffice/templates/speaker_update.html @@ -0,0 +1,32 @@ +{% extends 'base.html' %} +{% load bootstrap3 %} +{% load static %} +{% load bornhack %} +{% load program %} + +{% block content %} +
+
+

Update Speaker: {{ speaker.name }}

+
+
+

Note: All changes made here take effect immediately on the live site. Any changes will be overwritten if the SpeakerProposal is later re-approved.

+
+ {% csrf_token %} + {% for field in form %} + {% if field.id_for_label == "id_email" %} + {% availabilitytable form=form matrix=matrix %} + {% bootstrap_field field %} + {% else %} + {% if field.name|slice:":12" != "availability" %} + {% bootstrap_field field %} + {% endif %} + {% endif %} + {% endfor %} + + Cancel +
+
+
+{% endblock content %} + diff --git a/src/backoffice/templates/ticket_checkin.html b/src/backoffice/templates/ticket_checkin.html index d6283fb8..217a3c34 100644 --- a/src/backoffice/templates/ticket_checkin.html +++ b/src/backoffice/templates/ticket_checkin.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Ticket Check-In

@@ -18,7 +14,7 @@

- +
diff --git a/src/backoffice/templates/village_to_order.html b/src/backoffice/templates/village_to_order.html index 5b6fae1d..94f0d9c3 100644 --- a/src/backoffice/templates/village_to_order.html +++ b/src/backoffice/templates/village_to_order.html @@ -2,10 +2,6 @@ {% load commonmark %} {% load static %} {% load imageutils %} -{% block extra_head %} - - -{% endblock extra_head %} {% block content %}

Village Gear To Order

@@ -18,7 +14,7 @@

-
Ticket UUID
+
diff --git a/src/backoffice/urls.py b/src/backoffice/urls.py index af361eec..04c6b8e0 100644 --- a/src/backoffice/urls.py +++ b/src/backoffice/urls.py @@ -3,19 +3,50 @@ from django.urls import include, path from .views import ( ApproveFeedbackView, ApproveNamesView, + AutoScheduleApplyView, + AutoScheduleCrashCourseView, + AutoScheduleDebugEventConflictsView, + AutoScheduleDebugEventSlotUnavailabilityView, + AutoScheduleDiffView, + AutoScheduleManageView, + AutoScheduleValidateView, BackofficeIndexView, BackofficeProxyView, BadgeHandoutView, ChainDetailView, ChainListView, CredebtorDetailView, - EventProposalManageView, + EventDeleteView, + EventDetailView, + EventListView, + EventLocationCreateView, + EventLocationDeleteView, + EventLocationDetailView, + EventLocationListView, + EventLocationUpdateView, + EventProposalApproveRejectView, + EventProposalDetailView, + EventProposalListView, + EventScheduleView, + EventSessionCreateLocationSelectView, + EventSessionCreateTypeSelectView, + EventSessionCreateView, + EventSessionDeleteView, + EventSessionDetailView, + EventSessionListView, + EventSessionUpdateView, + EventSlotDetailView, + EventSlotListView, + EventSlotUnscheduleView, + EventTypeDetailView, + EventTypeListView, + EventUpdateView, ExpenseDetailView, ExpenseListView, FacilityFeedbackView, - ManageProposalsView, MerchandiseOrdersView, MerchandiseToOrderView, + PendingProposalsView, ProductHandoutView, ReimbursementCreateUserSelectView, ReimbursementCreateView, @@ -27,7 +58,13 @@ from .views import ( RevenueListView, ScanTicketsView, ShopTicketOverview, - SpeakerProposalManageView, + SpeakerDeleteView, + SpeakerDetailView, + SpeakerListView, + SpeakerProposalApproveRejectView, + SpeakerProposalDetailView, + SpeakerProposalListView, + SpeakerUpdateView, TicketCheckinView, VillageOrdersView, VillageToOrderView, @@ -72,28 +109,314 @@ urlpatterns = [ # village orders path("village_orders/", VillageOrdersView.as_view(), name="village_orders"), path("village_to_order/", VillageToOrderView.as_view(), name="village_to_order"), - # manage proposals + # manage SpeakerProposals and EventProposals path( - "manage_proposals/", + "proposals/", include( [ - path("", ManageProposalsView.as_view(), name="manage_proposals"), path( - "speakers//", - SpeakerProposalManageView.as_view(), - name="speakerproposal_manage", + "pending/", PendingProposalsView.as_view(), name="pending_proposals" ), path( - "events//", - EventProposalManageView.as_view(), - name="eventproposal_manage", + "speakers/", + include( + [ + path( + "", + SpeakerProposalListView.as_view(), + name="speaker_proposal_list", + ), + path( + "/", + include( + [ + path( + "", + SpeakerProposalDetailView.as_view(), + name="speaker_proposal_detail", + ), + path( + "approve_reject/", + SpeakerProposalApproveRejectView.as_view(), + name="speaker_proposal_approve_reject", + ), + ] + ), + ), + ] + ), + ), + path( + "events/", + include( + [ + path( + "", + EventProposalListView.as_view(), + name="event_proposal_list", + ), + path( + "/", + include( + [ + path( + "", + EventProposalDetailView.as_view(), + name="event_proposal_detail", + ), + path( + "approve_reject/", + EventProposalApproveRejectView.as_view(), + name="event_proposal_approve_reject", + ), + ] + ), + ), + ] + ), ), ] ), ), - # approve eventfeedback objects + # manage EventSession objects path( - "approve_feedback", ApproveFeedbackView.as_view(), name="approve_eventfeedback", + "event_sessions/", + include( + [ + path("", EventSessionListView.as_view(), name="event_session_list"), + path( + "create/", + include( + [ + path( + "", + EventSessionCreateTypeSelectView.as_view(), + name="event_session_create_type_select", + ), + path( + "/", + include( + [ + path( + "", + EventSessionCreateLocationSelectView.as_view(), + name="event_session_create_location_select", + ), + path( + "/", + EventSessionCreateView.as_view(), + name="event_session_create", + ), + ] + ), + ), + ] + ), + ), + path( + "/", + include( + [ + path( + "", + EventSessionDetailView.as_view(), + name="event_session_detail", + ), + path( + "update/", + EventSessionUpdateView.as_view(), + name="event_session_update", + ), + path( + "delete/", + EventSessionDeleteView.as_view(), + name="event_session_delete", + ), + ] + ), + ), + ] + ), + ), + # manage EventSlot objects + path( + "event_slots/", + include( + [ + path("", EventSlotListView.as_view(), name="event_slot_list"), + path( + "/", + include( + [ + path( + "", + EventSlotDetailView.as_view(), + name="event_slot_detail", + ), + path( + "unschedule/", + EventSlotUnscheduleView.as_view(), + name="event_slot_unschedule", + ), + ] + ), + ), + ] + ), + ), + # manage Speaker objects + path( + "speakers/", + include( + [ + path("", SpeakerListView.as_view(), name="speaker_list"), + path( + "/", + include( + [ + path( + "", SpeakerDetailView.as_view(), name="speaker_detail", + ), + path( + "update/", + SpeakerUpdateView.as_view(), + name="speaker_update", + ), + path( + "delete/", + SpeakerDeleteView.as_view(), + name="speaker_delete", + ), + ] + ), + ), + ] + ), + ), + # manage EventType objects + path( + "event_types/", + include( + [ + path("", EventTypeListView.as_view(), name="event_type_list"), + path( + "/", + EventTypeDetailView.as_view(), + name="event_type_detail", + ), + ] + ), + ), + # manage EventLocation objects + path( + "event_locations/", + include( + [ + path("", EventLocationListView.as_view(), name="event_location_list"), + path( + "create/", + EventLocationCreateView.as_view(), + name="event_location_create", + ), + path( + "/", + include( + [ + path( + "", + EventLocationDetailView.as_view(), + name="event_location_detail", + ), + path( + "update/", + EventLocationUpdateView.as_view(), + name="event_location_update", + ), + path( + "delete/", + EventLocationDeleteView.as_view(), + name="event_location_delete", + ), + ] + ), + ), + ] + ), + ), + # manage Event objects + path( + "events/", + include( + [ + path("", EventListView.as_view(), name="event_list"), + path( + "/", + include( + [ + path("", EventDetailView.as_view(), name="event_detail",), + path( + "update/", + EventUpdateView.as_view(), + name="event_update", + ), + path( + "schedule/", + EventScheduleView.as_view(), + name="event_schedule", + ), + path( + "delete/", + EventDeleteView.as_view(), + name="event_delete", + ), + ] + ), + ), + ] + ), + ), + # manage AutoScheduler + path( + "autoscheduler/", + include( + [ + path("", AutoScheduleManageView.as_view(), name="autoschedule_manage",), + path( + "crashcourse/", + AutoScheduleCrashCourseView.as_view(), + name="autoschedule_crash_course", + ), + path( + "validate/", + AutoScheduleValidateView.as_view(), + name="autoschedule_validate", + ), + path( + "diff/", AutoScheduleDiffView.as_view(), name="autoschedule_diff", + ), + path( + "apply/", + AutoScheduleApplyView.as_view(), + name="autoschedule_apply", + ), + path( + "debug-event-slot-unavailability/", + AutoScheduleDebugEventSlotUnavailabilityView.as_view(), + name="autoschedule_debug_event_slot_unavailability", + ), + path( + "debug-event-conflicts/", + AutoScheduleDebugEventConflictsView.as_view(), + name="autoschedule_debug_event_conflicts", + ), + ] + ), + ), + # approve EventFeedback objects + path( + "approve_feedback", + ApproveFeedbackView.as_view(), + name="approve_event_feedback", ), # economy path( diff --git a/src/backoffice/views.py b/src/backoffice/views.py index b94aea41..08e3f235 100644 --- a/src/backoffice/views.py +++ b/src/backoffice/views.py @@ -4,28 +4,49 @@ from itertools import chain import requests from camps.mixins import CampViewMixin +from django import forms from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.models import User from django.core.exceptions import PermissionDenied from django.core.files import File -from django.db.models import Sum +from django.db.models import Count, Q, Sum from django.forms import modelformset_factory from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils import timezone +from django.utils.safestring import mark_safe from django.views.generic import DetailView, ListView, TemplateView from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView from economy.models import Chain, Credebtor, Expense, Reimbursement, Revenue from facilities.models import FacilityFeedback from profiles.models import Profile -from program.models import EventFeedback, EventProposal, SpeakerProposal +from program.autoscheduler import AutoScheduler +from program.mixins import AvailabilityMatrixViewMixin +from program.models import ( + Event, + EventFeedback, + EventLocation, + EventProposal, + EventSession, + EventSlot, + EventType, + Speaker, + SpeakerProposal, +) +from program.utils import save_speaker_availability from shop.models import Order, OrderProductRelation from teams.models import Team from tickets.models import DiscountTicket, ShopTicket, SponsorTicket, TicketType +from .forms import ( + AutoScheduleApplyForm, + AutoScheduleValidateForm, + EventScheduleForm, + SpeakerForm, +) from .mixins import ( ContentTeamPermissionMixin, EconomyTeamPermissionMixin, @@ -188,7 +209,7 @@ class ApproveFeedbackView(CampViewMixin, ContentTeamPermissionMixin, FormView): Why the hell do the forms in the formset not include the object? """ context = super().get_context_data(*args, **kwargs) - context["eventfeedback_list"] = self.queryset + context["event_feedback_list"] = self.queryset context["formset"] = self.form_class(queryset=self.queryset) return context @@ -202,34 +223,37 @@ class ApproveFeedbackView(CampViewMixin, ContentTeamPermissionMixin, FormView): def get_success_url(self, *args, **kwargs): return reverse( - "backoffice:approve_eventfeedback", kwargs={"camp_slug": self.camp.slug} + "backoffice:approve_event_feedback", kwargs={"camp_slug": self.camp.slug} ) -class ManageProposalsView(CampViewMixin, ContentTeamPermissionMixin, ListView): - """ - This view shows a list of pending SpeakerProposal and EventProposals. - """ +####################################### +# MANAGE SPEAKER/EVENT PROPOSAL VIEWS - template_name = "manage_proposals.html" - context_object_name = "speakerproposals" + +class PendingProposalsView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ This convenience view shows a list of pending proposals """ + + model = SpeakerProposal + template_name = "pending_proposals.html" + context_object_name = "speaker_proposal_list" def get_queryset(self, **kwargs): - return SpeakerProposal.objects.filter( - camp=self.camp, proposal_status=SpeakerProposal.PROPOSAL_PENDING - ) + qs = super().get_queryset(**kwargs).filter(proposal_status="pending") + qs = qs.prefetch_related("user", "urls", "speaker") + return qs def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["eventproposals"] = EventProposal.objects.filter( - track__camp=self.camp, proposal_status=EventProposal.PROPOSAL_PENDING - ) + context["event_proposal_list"] = self.camp.event_proposals.filter( + proposal_status=EventProposal.PROPOSAL_PENDING + ).prefetch_related("event_type", "track", "speakers", "tags", "user", "event") return context -class ProposalManageBaseView(CampViewMixin, ContentTeamPermissionMixin, UpdateView): +class ProposalApproveBaseView(CampViewMixin, ContentTeamPermissionMixin, UpdateView): """ - This class contains the shared logic between SpeakerProposalManageView and EventProposalManageView + Shared logic between SpeakerProposalApproveView and EventProposalApproveView """ fields = ["reason"] @@ -247,26 +271,855 @@ class ProposalManageBaseView(CampViewMixin, ContentTeamPermissionMixin, UpdateVi else: messages.error(self.request, "Unknown submit action") return redirect( - reverse("backoffice:manage_proposals", kwargs={"camp_slug": self.camp.slug}) + reverse( + "backoffice:pending_proposals", kwargs={"camp_slug": self.camp.slug} + ) ) -class SpeakerProposalManageView(ProposalManageBaseView): - """ - This view allows an admin to approve/reject SpeakerProposals - """ +class SpeakerProposalListView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ This view permits Content Team members to list SpeakerProposals """ model = SpeakerProposal - template_name = "manage_speakerproposal.html" + template_name = "speaker_proposal_list.html" + context_object_name = "speaker_proposal_list" + + def get_queryset(self, **kwargs): + qs = super().get_queryset(**kwargs) + qs = qs.prefetch_related("user", "urls", "speaker") + return qs -class EventProposalManageView(ProposalManageBaseView): - """ - This view allows an admin to approve/reject EventProposals - """ +class SpeakerProposalDetailView( + AvailabilityMatrixViewMixin, ContentTeamPermissionMixin, DetailView, +): + """ This view permits Content Team members to see SpeakerProposal details """ + + model = SpeakerProposal + template_name = "speaker_proposal_detail_backoffice.html" + context_object_name = "speaker_proposal" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related("user", "urls") + return qs + + +class SpeakerProposalApproveRejectView(ProposalApproveBaseView): + """ This view allows ContentTeam members to approve/reject SpeakerProposals """ + + model = SpeakerProposal + template_name = "speaker_proposal_approve_reject.html" + context_object_name = "speaker_proposal" + + +class EventProposalListView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ This view permits Content Team members to list EventProposals """ model = EventProposal - template_name = "manage_eventproposal.html" + template_name = "event_proposal_list.html" + context_object_name = "event_proposal_list" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related( + "user", + "urls", + "event", + "event_type", + "speakers__event_proposals", + "track", + "tags", + ) + return qs + + +class EventProposalDetailView(CampViewMixin, ContentTeamPermissionMixin, DetailView): + """ This view permits Content Team members to see EventProposal details """ + + model = EventProposal + template_name = "event_proposal_detail_backoffice.html" + context_object_name = "event_proposal" + + +class EventProposalApproveRejectView(ProposalApproveBaseView): + """ This view allows ContentTeam members to approve/reject EventProposals """ + + model = EventProposal + template_name = "event_proposal_approve_reject.html" + context_object_name = "event_proposal" + + +################################ +# MANAGE SPEAKER VIEWS + + +class SpeakerListView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ This view is used by the Content Team to see Speaker objects. """ + + model = Speaker + template_name = "speaker_list_backoffice.html" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related( + "proposal__user", + "events__event_slots", + "events__event_type", + "event_conflicts", + ) + return qs + + +class SpeakerDetailView( + AvailabilityMatrixViewMixin, ContentTeamPermissionMixin, DetailView +): + """ This view is used by the Content Team to see details for Speaker objects """ + + model = Speaker + template_name = "speaker_detail_backoffice.html" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related( + "event_conflicts", "events__event_slots", "events__event_type" + ) + return qs + + +class SpeakerUpdateView( + AvailabilityMatrixViewMixin, ContentTeamPermissionMixin, UpdateView +): + """ This view is used by the Content Team to update Speaker objects """ + + model = Speaker + template_name = "speaker_update.html" + form_class = SpeakerForm + + def get_form_kwargs(self): + """ Set camp for the form """ + kwargs = super().get_form_kwargs() + kwargs.update({"camp": self.camp}) + return kwargs + + def form_valid(self, form): + """ Save object and availability """ + speaker = form.save() + save_speaker_availability(form, obj=speaker) + messages.success(self.request, "Speaker has been updated") + return redirect( + reverse( + "backoffice:speaker_detail", + kwargs={"camp_slug": self.camp.slug, "slug": self.get_object().slug}, + ) + ) + + +class SpeakerDeleteView(CampViewMixin, ContentTeamPermissionMixin, DeleteView): + """ This view is used by the Content Team to delete Speaker objects """ + + model = Speaker + template_name = "speaker_delete.html" + + def delete(self, *args, **kwargs): + speaker = self.get_object() + # delete related objects first + speaker.availabilities.all().delete() + speaker.urls.all().delete() + return super().delete(*args, **kwargs) + + def get_success_url(self): + messages.success( + self.request, f"Speaker '{self.get_object().name}' has been deleted" + ) + return reverse("backoffice:speaker_list", kwargs={"camp_slug": self.camp.slug}) + + +################################ +# MANAGE EVENTTYPE VIEWS + + +class EventTypeListView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ This view is used by the Content Team to list EventTypes """ + + model = EventType + template_name = "event_type_list.html" + context_object_name = "event_type_list" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.annotate( + # only count events for the current camp + event_count=Count( + "events", distinct=True, filter=Q(events__track__camp=self.camp) + ), + # only count EventSessions for the current camp + event_sessions_count=Count( + "event_sessions", + distinct=True, + filter=Q(event_sessions__camp=self.camp), + ), + # only count EventSlots for the current camp + event_slots_count=Count( + "event_sessions__event_slots", + distinct=True, + filter=Q(event_sessions__camp=self.camp), + ), + ) + return qs + + +class EventTypeDetailView(CampViewMixin, ContentTeamPermissionMixin, DetailView): + """ This view is used by the Content Team to see details for EventTypes """ + + model = EventType + template_name = "event_type_detail.html" + context_object_name = "event_type" + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + context["event_sessions"] = self.camp.event_sessions.filter( + event_type=self.get_object() + ).prefetch_related("event_location", "event_slots") + context["events"] = self.camp.events.filter( + event_type=self.get_object() + ).prefetch_related( + "speakers", "event_slots__event_session__event_location", "event_type" + ) + return context + + +################################ +# MANAGE EVENTLOCATION VIEWS + + +class EventLocationListView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ This view is used by the Content Team to list EventLocation objects. """ + + model = EventLocation + template_name = "event_location_list.html" + context_object_name = "event_location_list" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related("event_sessions__event_slots", "conflicts") + return qs + + +class EventLocationDetailView(CampViewMixin, ContentTeamPermissionMixin, DetailView): + """ This view is used by the Content Team to see details for EventLocation objects """ + + model = EventLocation + template_name = "event_location_detail.html" + context_object_name = "event_location" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related( + "conflicts", "event_sessions__event_slots", "event_sessions__event_type" + ) + return qs + + +class EventLocationCreateView(CampViewMixin, ContentTeamPermissionMixin, CreateView): + """ This view is used by the Content Team to create EventLocation objects """ + + model = EventLocation + fields = ["name", "icon", "capacity", "conflicts"] + template_name = "event_location_form.html" + + def get_form(self, *args, **kwargs): + form = super().get_form(*args, **kwargs) + form.fields["conflicts"].queryset = self.camp.event_locations.all() + return form + + def form_valid(self, form): + location = form.save(commit=False) + location.camp = self.camp + location.save() + form.save_m2m() + messages.success( + self.request, f"EventLocation {location.name} has been created" + ) + return redirect( + reverse( + "backoffice:event_location_detail", + kwargs={"camp_slug": self.camp.slug, "slug": location.slug}, + ) + ) + + +class EventLocationUpdateView(CampViewMixin, ContentTeamPermissionMixin, UpdateView): + """ This view is used by the Content Team to update EventLocation objects """ + + model = EventLocation + fields = ["name", "icon", "capacity", "conflicts"] + template_name = "event_location_form.html" + + def get_form(self, *args, **kwargs): + form = super().get_form(*args, **kwargs) + form.fields["conflicts"].queryset = self.camp.event_locations.exclude( + pk=self.get_object().pk + ) + return form + + def get_success_url(self): + messages.success( + self.request, f"EventLocation {self.get_object().name} has been updated" + ) + return reverse( + "backoffice:event_location_detail", + kwargs={"camp_slug": self.camp.slug, "slug": self.get_object().slug}, + ) + + +class EventLocationDeleteView(CampViewMixin, ContentTeamPermissionMixin, DeleteView): + """ This view is used by the Content Team to delete EventLocation objects """ + + model = EventLocation + template_name = "event_location_delete.html" + context_object_name = "event_location" + + def delete(self, *args, **kwargs): + slotsdeleted, slotdetails = self.get_object().event_slots.all().delete() + sessionsdeleted, sessiondetails = ( + self.get_object().event_sessions.all().delete() + ) + + return super().delete(*args, **kwargs) + + def get_success_url(self): + messages.success( + self.request, f"EventLocation '{self.get_object().name}' has been deleted." + ) + return reverse( + "backoffice:event_location_list", kwargs={"camp_slug": self.camp.slug} + ) + + +################################ +# MANAGE EVENT VIEWS + + +class EventListView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ This view is used by the Content Team to see Event objects. """ + + model = Event + template_name = "event_list_backoffice.html" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related( + "speakers__events", + "event_type", + "event_slots__event_session__event_location", + "tags", + ) + return qs + + +class EventDetailView(CampViewMixin, ContentTeamPermissionMixin, DetailView): + """ This view is used by the Content Team to see details for Event objects """ + + model = Event + template_name = "event_detail_backoffice.html" + + +class EventUpdateView(CampViewMixin, ContentTeamPermissionMixin, UpdateView): + """ This view is used by the Content Team to update Event objects """ + + model = Event + fields = [ + "title", + "abstract", + "video_recording", + "duration_minutes", + "demand", + "tags", + ] + template_name = "event_update.html" + + def get_success_url(self): + messages.success(self.request, "Event has been updated") + return reverse( + "backoffice:event_detail", + kwargs={"camp_slug": self.camp.slug, "slug": self.get_object().slug}, + ) + + +class EventDeleteView(CampViewMixin, ContentTeamPermissionMixin, DeleteView): + """ This view is used by the Content Team to delete Event objects """ + + model = Event + template_name = "event_delete.html" + + def delete(self, *args, **kwargs): + self.get_object().urls.all().delete() + return super().delete(*args, **kwargs) + + def get_success_url(self): + messages.success( + self.request, f"Event '{self.get_object().title}' has been deleted!", + ) + return reverse("backoffice:event_list", kwargs={"camp_slug": self.camp.slug}) + + +class EventScheduleView(CampViewMixin, ContentTeamPermissionMixin, FormView): + """ This view is used by the Content Team to manually schedule Events. + It shows a table with radioselect buttons for the available slots for the + EventType of the Event """ + + form_class = EventScheduleForm + template_name = "event_schedule.html" + + def setup(self, *args, **kwargs): + super().setup(*args, **kwargs) + self.event = get_object_or_404(Event, slug=kwargs["slug"]) + + def get_form(self, *args, **kwargs): + form = super().get_form(*args, **kwargs) + self.slots = [] + slotindex = 0 + # loop over sessions, get free slots + for session in self.camp.event_sessions.filter( + event_type=self.event.event_type + ): + for slot in session.get_available_slots(): + # loop over speakers to see if they are all available + for speaker in self.event.speakers.all(): + if not speaker.is_available(slot.when): + # this speaker is not available, skip this slot + break + else: + # all speakers are available for this slot + self.slots.append({"index": slotindex, "slot": slot}) + slotindex += 1 + # add the slot choicefield + form.fields["slot"] = forms.ChoiceField( + widget=forms.RadioSelect, + choices=[(s["index"], s["index"]) for s in self.slots], + ) + return form + + def get_context_data(self, *args, **kwargs): + """ + Add event to context + """ + context = super().get_context_data(*args, **kwargs) + context["event"] = self.event + context["event_slots"] = self.slots + return context + + def form_valid(self, form): + """ + Set needed values, save slot and return + """ + slot = self.slots[int(form.cleaned_data["slot"])]["slot"] + slot.event = self.event + slot.autoscheduled = False + slot.save() + messages.success( + self.request, + f"{self.event.title} has been scheduled to begin at {slot.when.lower} at location {slot.event_location.name} successfully!", + ) + return redirect( + reverse( + "backoffice:event_detail", + kwargs={"camp_slug": self.camp.slug, "slug": self.event.slug}, + ) + ) + + +################################ +# MANAGE EVENTSESSION VIEWS + + +class EventSessionCreateTypeSelectView( + CampViewMixin, ContentTeamPermissionMixin, ListView +): + """ + This view is shown first when creating a new EventSession + """ + + model = EventType + template_name = "event_session_create_type_select.html" + context_object_name = "event_type_list" + + +class EventSessionCreateLocationSelectView( + CampViewMixin, ContentTeamPermissionMixin, ListView +): + """ + This view is shown second when creating a new EventSession + """ + + model = EventLocation + template_name = "event_session_create_location_select.html" + context_object_name = "event_location_list" + + def setup(self, *args, **kwargs): + super().setup(*args, **kwargs) + self.event_type = get_object_or_404(EventType, slug=kwargs["event_type_slug"]) + + def get_context_data(self, *args, **kwargs): + """ + Add event_type to context + """ + context = super().get_context_data(*args, **kwargs) + context["event_type"] = self.event_type + return context + + +class EventSessionFormViewMixin: + """ + A mixin with the stuff shared between EventSession{Create|Update}View + """ + + def get_form(self, *args, **kwargs): + """ + The default range widgets are a bit shit because they eat the help_text and + have no indication of which field is for what. So we add a nice placeholder. + We also limit the event_location dropdown to only the current camps locations. + """ + form = super().get_form(*args, **kwargs) + form.fields["when"].widget.widgets[0].attrs = { + "placeholder": f"Start Date and Time (YYYY-MM-DD HH:MM). Time zone is {settings.TIME_ZONE}.", + } + form.fields["when"].widget.widgets[1].attrs = { + "placeholder": f"End Date and Time (YYYY-MM-DD HH:MM). Time zone is {settings.TIME_ZONE}.", + } + if hasattr(form.fields, "event_location"): + form.fields["event_location"].queryset = EventLocation.objects.filter( + camp=self.camp + ) + return form + + def get_context_data(self, *args, **kwargs): + """ + Add event_type and location and existing sessions to context + """ + context = super().get_context_data(*args, **kwargs) + if not hasattr(self, "event_type"): + self.event_type = self.get_object().event_type + context["event_type"] = self.event_type + + if not hasattr(self, "event_location"): + self.event_location = self.get_object().event_location + context["event_location"] = self.event_location + + context["sessions"] = self.event_type.event_sessions.filter(camp=self.camp) + return context + + +class EventSessionCreateView( + CampViewMixin, ContentTeamPermissionMixin, EventSessionFormViewMixin, CreateView +): + """ + This view is used by the Content Team to create EventSession objects + """ + + model = EventSession + fields = ["description", "when", "event_duration_minutes"] + template_name = "event_session_form.html" + + def setup(self, *args, **kwargs): + super().setup(*args, **kwargs) + self.event_type = get_object_or_404(EventType, slug=kwargs["event_type_slug"]) + self.event_location = get_object_or_404( + EventLocation, camp=self.camp, slug=kwargs["event_location_slug"] + ) + + def form_valid(self, form): + """ + Set camp and event_type, check for overlaps and save + """ + session = form.save(commit=False) + session.event_type = self.event_type + session.event_location = self.event_location + session.camp = self.camp + session.save() + messages.success(self.request, f"{session} has been created successfully!") + return redirect( + reverse( + "backoffice:event_session_list", kwargs={"camp_slug": self.camp.slug} + ) + ) + + +class EventSessionListView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ + This view is used by the Content Team to see EventSession objects. + """ + + model = EventSession + template_name = "event_session_list.html" + context_object_name = "event_session_list" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related("event_type", "event_location", "event_slots") + return qs + + +class EventSessionDetailView(CampViewMixin, ContentTeamPermissionMixin, DetailView): + """ + This view is used by the Content Team to see details for EventSession objects + """ + + model = EventSession + template_name = "event_session_detail.html" + context_object_name = "session" + + +class EventSessionUpdateView( + CampViewMixin, ContentTeamPermissionMixin, EventSessionFormViewMixin, UpdateView +): + """ + This view is used by the Content Team to update EventSession objects + """ + + model = EventSession + fields = ["when", "description", "event_duration_minutes"] + template_name = "event_session_form.html" + + def form_valid(self, form): + """ + Just save, we have a post_save signal which takes care of fixing EventSlots + """ + session = form.save() + messages.success(self.request, f"{session} has been updated successfully!") + return redirect( + reverse( + "backoffice:event_session_list", kwargs={"camp_slug": self.camp.slug} + ) + ) + + +class EventSessionDeleteView(CampViewMixin, ContentTeamPermissionMixin, DeleteView): + """ + This view is used by the Content Team to delete EventSession objects + """ + + model = EventSession + template_name = "event_session_delete.html" + context_object_name = "session" + + def get(self, *args, **kwargs): + """ Show a warning if we have something scheduled in this EventSession """ + if self.get_object().event_slots.filter(event__isnull=False).exists(): + messages.warning( + self.request, + "NOTE: One or more EventSlots in this EventSession has an Event scheduled. Make sure you are deleting the correct session!", + ) + return super().get(*args, **kwargs) + + def delete(self, *args, **kwargs): + session = self.get_object() + session.event_slots.all().delete() + return super().delete(*args, **kwargs) + + def get_success_url(self): + messages.success( + self.request, + "EventSession and related EventSlots was deleted successfully!", + ) + return reverse( + "backoffice:event_session_list", kwargs={"camp_slug": self.camp.slug} + ) + + +################################ +# MANAGE EVENTSLOT VIEWS + + +class EventSlotListView(CampViewMixin, ContentTeamPermissionMixin, ListView): + """ This view is used by the Content Team to see EventSlot objects. """ + + model = EventSlot + template_name = "event_slot_list.html" + context_object_name = "event_slot_list" + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs) + qs = qs.prefetch_related( + "event__speakers", + "event_session__event_location", + "event_session__event_type", + ) + return qs + + +class EventSlotDetailView(CampViewMixin, ContentTeamPermissionMixin, DetailView): + """ This view is used by the Content Team to see details for EventSlot objects """ + + model = EventSlot + template_name = "event_slot_detail.html" + context_object_name = "event_slot" + + +class EventSlotUnscheduleView(CampViewMixin, ContentTeamPermissionMixin, UpdateView): + """ This view is used by the Content Team to remove an Event from the schedule/EventSlot """ + + model = EventSlot + template_name = "event_slot_unschedule.html" + fields = [] + context_object_name = "event_slot" + + def form_valid(self, form): + event_slot = self.get_object() + event = event_slot.event + event_slot.unschedule() + messages.success( + self.request, + f"The Event '{event.title}' has been removed from the slot {event_slot}", + ) + return redirect( + reverse( + "backoffice:event_detail", + kwargs={"camp_slug": self.camp.slug, "slug": event.slug}, + ) + ) + + +################################ +# AUTOSCHEDULER VIEWS + + +class AutoScheduleManageView(CampViewMixin, ContentTeamPermissionMixin, TemplateView): + """ Just an index type view with links to the various actions """ + + template_name = "autoschedule_index.html" + + +class AutoScheduleCrashCourseView( + CampViewMixin, ContentTeamPermissionMixin, TemplateView +): + """ A short crash course on the autoscheduler """ + + template_name = "autoschedule_crash_course.html" + + +class AutoScheduleValidateView(CampViewMixin, ContentTeamPermissionMixin, FormView): + """ This view is used to validate schedules. It uses the AutoScheduler and can + either validate the currently applied schedule or a new similar schedule, or a + brand new schedule """ + + template_name = "autoschedule_validate.html" + form_class = AutoScheduleValidateForm + + def form_valid(self, form): + # initialise AutoScheduler + scheduler = AutoScheduler(camp=self.camp) + + # get autoschedule + if form.cleaned_data["schedule"] == "current": + autoschedule = scheduler.build_current_autoschedule() + message = f"The currently scheduled Events form a valid schedule! AutoScheduler has {len(scheduler.autoslots)} Slots based on {scheduler.event_sessions.count()} EventSessions for {scheduler.event_types.count()} EventTypes. {scheduler.events.count()} Events in the schedule." + elif form.cleaned_data["schedule"] == "similar": + original_autoschedule = scheduler.build_current_autoschedule() + autoschedule, diff = scheduler.calculate_similar_autoschedule( + original_autoschedule + ) + message = f"The new similar schedule is valid! AutoScheduler has {len(scheduler.autoslots)} Slots based on {scheduler.event_sessions.count()} EventSessions for {scheduler.event_types.count()} EventTypes. Differences to the current schedule: {len(diff['event_diffs'])} Event diffs and {len(diff['slot_diffs'])} Slot diffs." + elif form.cleaned_data["schedule"] == "new": + autoschedule = scheduler.calculate_autoschedule() + message = f"The new schedule is valid! AutoScheduler has {len(scheduler.autoslots)} Slots based on {scheduler.event_sessions.count()} EventSessions for {scheduler.event_types.count()} EventTypes. {scheduler.events.count()} Events in the schedule." + + # check validity + valid, violations = scheduler.is_valid(autoschedule, return_violations=True) + if valid: + messages.success(self.request, message) + else: + messages.error(self.request, "Schedule is NOT valid!") + message = "Schedule violations:
" + for v in violations: + message += v + "
" + messages.error(self.request, mark_safe(message)) + return redirect( + reverse( + "backoffice:autoschedule_validate", kwargs={"camp_slug": self.camp.slug} + ) + ) + + +class AutoScheduleDiffView(CampViewMixin, ContentTeamPermissionMixin, TemplateView): + template_name = "autoschedule_diff.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + scheduler = AutoScheduler(camp=self.camp) + autoschedule, diff = scheduler.calculate_similar_autoschedule() + context["diff"] = diff + context["scheduler"] = scheduler + return context + + +class AutoScheduleApplyView(CampViewMixin, ContentTeamPermissionMixin, FormView): + """ This view is used by the Content Team to apply a new schedules by unscheduling + all autoscheduled Events, and scheduling all Event/Slot combinations in the schedule. + + TODO: see comment in program.autoscheduler.AutoScheduler.apply() method. + """ + + template_name = "autoschedule_apply.html" + form_class = AutoScheduleApplyForm + + def form_valid(self, form): + # initialise AutoScheduler + scheduler = AutoScheduler(camp=self.camp) + + # get autoschedule + if form.cleaned_data["schedule"] == "similar": + autoschedule, diff = scheduler.calculate_similar_autoschedule() + elif form.cleaned_data["schedule"] == "new": + autoschedule = scheduler.calculate_autoschedule() + + # check validity + valid, violations = scheduler.is_valid(autoschedule, return_violations=True) + if valid: + # schedule is valid, apply it + deleted, created = scheduler.apply(autoschedule) + messages.success( + self.request, + f"Schedule has been applied! {deleted} Events removed from schedule, {created} new Events scheduled. Differences to the previous schedule: {len(diff['event_diffs'])} Event diffs and {len(diff['slot_diffs'])} Slot diffs.", + ) + else: + messages.error(self.request, "Schedule is NOT valid, cannot apply!") + return redirect( + reverse( + "backoffice:autoschedule_apply", kwargs={"camp_slug": self.camp.slug} + ) + ) + + +class AutoScheduleDebugEventSlotUnavailabilityView( + CampViewMixin, ContentTeamPermissionMixin, TemplateView +): + template_name = "autoschedule_debug_slots.html" + + def get_context_data(self, **kwargs): + scheduler = AutoScheduler(camp=self.camp) + context = { + "scheduler": scheduler, + } + return context + + +class AutoScheduleDebugEventConflictsView( + CampViewMixin, ContentTeamPermissionMixin, TemplateView +): + template_name = "autoschedule_debug_events.html" + + def get_context_data(self, **kwargs): + scheduler = AutoScheduler(camp=self.camp) + context = { + "scheduler": scheduler, + } + return context + + +################################ +# MERCHANDISE VIEWS class MerchandiseOrdersView(CampViewMixin, OrgaTeamPermissionMixin, ListView): @@ -315,6 +1168,10 @@ class MerchandiseToOrderView(CampViewMixin, OrgaTeamPermissionMixin, TemplateVie return context +################################ +# VILLAGE VIEWS + + class VillageOrdersView(CampViewMixin, OrgaTeamPermissionMixin, ListView): template_name = "orders_village.html" @@ -763,11 +1620,8 @@ class ScanTicketsView( class ShopTicketOverview(LoginRequiredMixin, CampViewMixin, ListView): - model = ShopTicket - template_name = "shop_ticket_overview.html" - context_object_name = "shop_tickets" def get_context_data(self, *, object_list=None, **kwargs): diff --git a/src/bornhack/environment_settings.py.dist b/src/bornhack/environment_settings.py.dist index aa5ccdef..04497f5a 100644 --- a/src/bornhack/environment_settings.py.dist +++ b/src/bornhack/environment_settings.py.dist @@ -67,6 +67,7 @@ TICKET_CATEGORY_NAME='Tickets' SCHEDULE_MIDNIGHT_OFFSET_HOURS=9 SCHEDULE_TIMESLOT_LENGTH_MINUTES=30 SCHEDULE_EVENT_NOTIFICATION_MINUTES=10 +SPEAKER_AVAILABILITY_DAYCHUNK_HOURS=3 # how many hours per speaker_availability form checkbox # irc bot settings IRCBOT_CHECK_MESSAGE_INTERVAL_SECONDS=10 diff --git a/src/bornhack/environment_settings.py.dist.dev b/src/bornhack/environment_settings.py.dist.dev index 12995c0c..7f784b18 100644 --- a/src/bornhack/environment_settings.py.dist.dev +++ b/src/bornhack/environment_settings.py.dist.dev @@ -17,9 +17,9 @@ DATABASES = { "ENGINE": 'django.contrib.gis.db.backends.postgis', "NAME": "bornhack", "USER": "bornhack", -# Comment back in if you are connecting via TCP -# "PASSWORD": "bornhack", -# "HOST": "localhost", + #"PASSWORD": "bornhack", + #"HOST": "localhost", + #"PORT": 5433, } } DEBUG = True @@ -37,6 +37,7 @@ MEDIA_ROOT = os.path.join( SCHEDULE_MIDNIGHT_OFFSET_HOURS = 9 SCHEDULE_TIMESLOT_LENGTH_MINUTES = 30 SCHEDULE_EVENT_NOTIFICATION_MINUTES = 10 +SPEAKER_AVAILABILITY_DAYCHUNK_HOURS=3 PDF_LETTERHEAD_FILENAME = "bornhack-2017_test_letterhead.pdf" PDF_ARCHIVE_PATH = os.path.join(MEDIA_ROOT, "pdf_archive") diff --git a/src/bornhack/settings.py b/src/bornhack/settings.py index 9c253f5d..14a6f8d9 100644 --- a/src/bornhack/settings.py +++ b/src/bornhack/settings.py @@ -1,5 +1,8 @@ import os +# monkeypatch postgres Range object to support lookups +from utils import range_fields # noqa: F401 + from .environment_settings import * # noqa: F403 @@ -66,6 +69,7 @@ INSTALLED_APPS = [ "reversion", "leaflet", "oauth2_provider", + "taggit", ] # MEDIA_URL = '/media/' @@ -79,7 +83,7 @@ USE_TZ = True SHORT_DATE_FORMAT = "Ymd" DATE_FORMAT = "l, M jS, Y" DATETIME_FORMAT = "l, M jS, Y, H:i (e)" -TIME_FORMAT = "H:i (e)" +TIME_FORMAT = "H:i" TEMPLATES = [ { @@ -117,7 +121,7 @@ LOGIN_URL = "/login/" ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https" BOOTSTRAP3 = { - "jquery_url": "/static/js/jquery.min.js", + "jquery_url": "/static/js/jquery-3.3.1.min.js", "javascript_url": "/static/js/bootstrap.min.js", } MIDDLEWARE = [ diff --git a/src/camps/models.py b/src/camps/models.py index f64719b9..ccc83fde 100644 --- a/src/camps/models.py +++ b/src/camps/models.py @@ -1,11 +1,12 @@ import logging from datetime import timedelta +from django.apps import apps from django.contrib.postgres.fields import DateTimeRangeField from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse -from program.models import EventLocation, EventType +from django.utils import timezone from psycopg2.extras import DateTimeTZRange from utils.models import CreatedUpdatedModel, UUIDModel @@ -153,20 +154,6 @@ class Camp(CreatedUpdatedModel, UUIDModel): def __str__(self): return "%s - %s" % (self.title, self.tagline) - @property - def event_types(self): - """ Return all event types with at least one event in this camp """ - return EventType.objects.filter( - event__instances__isnull=False, event__camp=self - ).distinct() - - @property - def event_locations(self): - """ Return all event locations with at least one event in this camp""" - return EventLocation.objects.filter( - eventinstances__isnull=False, camp=self - ).distinct() - @property def logo_small(self): return "img/%(slug)s/logo/%(slug)s-logo-s.png" % {"slug": self.slug} @@ -201,31 +188,46 @@ class Camp(CreatedUpdatedModel, UUIDModel): logger.error("this attribute is not a datetimetzrange field: %s" % field) return False - daycount = (field.upper - field.lower).days + # count how many unique dates we have in this range + daycount = 1 + while True: + if field.lower.date() + timedelta(days=daycount) > field.upper.date(): + break + daycount += 1 + + # loop through the required number of days, append to list as we go days = [] for i in range(0, daycount): if i == 0: - # on the first day use actual start time instead of midnight + # on the first day use actual start time instead of midnight (local time) days.append( DateTimeTZRange( - field.lower, - (field.lower + timedelta(days=i + 1)).replace(hour=0), + timezone.localtime(field.lower), + timezone.localtime( + (field.lower + timedelta(days=i + 1)) + ).replace(hour=0), ) ) elif i == daycount - 1: - # on the last day use actual end time instead of midnight + # on the last day use actual end time instead of midnight (local time) days.append( DateTimeTZRange( - (field.lower + timedelta(days=i)).replace(hour=0), - field.lower + timedelta(days=i + 1), + timezone.localtime((field.lower + timedelta(days=i))).replace( + hour=0 + ), + timezone.localtime(field.lower + timedelta(days=i)), ) ) else: - # neither first nor last day, goes from midnight to midnight + # neither first nor last day, goes from midnight to midnight (local time) days.append( DateTimeTZRange( - (field.lower + timedelta(days=i)).replace(hour=0), - (field.lower + timedelta(days=i + 1)).replace(hour=0), + timezone.localtime((field.lower + timedelta(days=i))).replace( + hour=0 + ), + timezone.localtime( + (field.lower + timedelta(days=i + 1)) + ).replace(hour=0), ) ) return days @@ -250,3 +252,33 @@ class Camp(CreatedUpdatedModel, UUIDModel): Returns a list of DateTimeTZRanges representing the days during the buildup. """ return self.get_days("teardown") + + # convenience properties to access Camp-related stuff easily from the Camp object + + @property + def event_types(self): + """ Return all event types with at least one event in this camp """ + EventType = apps.get_model("program", "EventType") + return EventType.objects.filter( + events__isnull=False, event__track__camp=self + ).distinct() + + @property + def event_proposals(self): + EventProposal = apps.get_model("program", "EventProposal") + return EventProposal.objects.filter(track__camp=self) + + @property + def events(self): + Event = apps.get_model("program", "Event") + return Event.objects.filter(track__camp=self) + + @property + def event_sessions(self): + EventSession = apps.get_model("program", "EventSession") + return EventSession.objects.filter(camp=self) + + @property + def event_slots(self): + EventSlot = apps.get_model("program", "EventSlot") + return EventSlot.objects.filter(event_session__in=self.event_sessions.all()) diff --git a/src/economy/models.py b/src/economy/models.py index 265e5502..d0122a53 100644 --- a/src/economy/models.py +++ b/src/economy/models.py @@ -3,9 +3,8 @@ import os from django.contrib import messages from django.core.exceptions import ValidationError from django.db import models -from django.utils.text import slugify - from utils.models import CampRelatedModel, CreatedUpdatedModel, UUIDModel +from utils.slugs import unique_slugify from .email import ( send_accountingsystem_expense_email, @@ -62,8 +61,13 @@ class Chain(CreatedUpdatedModel, UUIDModel): def save(self, **kwargs): if not self.slug: - self.slug = slugify(self.name) - super(Chain, self).save(**kwargs) + self.slug = unique_slugify( + self.name, + slugs_in_use=self.__class__.objects.all().values_list( + "slug", flat=True + ), + ) + super().save(**kwargs) @property def expenses(self): @@ -133,8 +137,13 @@ class Credebtor(CreatedUpdatedModel, UUIDModel): Generate slug as needed """ if not self.slug: - self.slug = slugify(self.name) - super(Credebtor, self).save(**kwargs) + self.slug = unique_slugify( + self.name, + slugs_in_use=self.__class__.objects.filter( + chain=self.chain + ).values_list("slug", flat=True), + ) + super().save(**kwargs) class Revenue(CampRelatedModel, UUIDModel): diff --git a/src/economy/templates/expense_list.html b/src/economy/templates/expense_list.html index c4c162ab..2a560970 100644 --- a/src/economy/templates/expense_list.html +++ b/src/economy/templates/expense_list.html @@ -5,11 +5,6 @@ Expenses | {{ block.super }} {% endblock %} -{% block extra_head %} - - -{% endblock extra_head %} - <{% block content %}

Your {{ camp.title }} Expenses

diff --git a/src/economy/templates/reimbursement_list.html b/src/economy/templates/reimbursement_list.html index b3ae9b5e..af87889e 100644 --- a/src/economy/templates/reimbursement_list.html +++ b/src/economy/templates/reimbursement_list.html @@ -5,11 +5,6 @@ Expenses | {{ block.super }} {% endblock %} -{% block extra_head %} - - -{% endblock extra_head %} - <{% block content %}

Your {{ camp.title }} Reimbursements

diff --git a/src/economy/templates/revenue_list.html b/src/economy/templates/revenue_list.html index 4afacf30..24b32ff5 100644 --- a/src/economy/templates/revenue_list.html +++ b/src/economy/templates/revenue_list.html @@ -5,11 +5,6 @@ Revenues | {{ block.super }} {% endblock %} -{% block extra_head %} - - -{% endblock extra_head %} - <{% block content %}

Your {{ camp.title }} Revenues

diff --git a/src/facilities/models.py b/src/facilities/models.py index 2eedcacd..df0930b2 100644 --- a/src/facilities/models.py +++ b/src/facilities/models.py @@ -4,12 +4,11 @@ import logging import qrcode from django.contrib.gis.db.models import PointField -from django.core.exceptions import ValidationError from django.db import models from django.shortcuts import reverse -from django.utils.text import slugify from maps.utils import LeafletMarkerChoices from utils.models import CampRelatedModel, UUIDModel +from utils.slugs import unique_slugify logger = logging.getLogger("bornhack.%s" % __name__) @@ -42,6 +41,7 @@ class FacilityType(CampRelatedModel): """ class Meta: + # we need a unique slug for each team due to the url structure in backoffice unique_together = [("slug", "responsible_team")] name = models.CharField(max_length=100, help_text="The name of this facility type") @@ -89,9 +89,12 @@ class FacilityType(CampRelatedModel): def save(self, **kwargs): if not self.slug: - self.slug = slugify(self.name) - if not self.slug: - raise ValidationError("Unable to slugify") + self.slug = unique_slugify( + self.name, + slugs_in_use=self.__class__.objects.filter( + responsible_team=self.responsible_team + ).values_list("slug", flat=True), + ) super().save(**kwargs) diff --git a/src/news/models.py b/src/news/models.py index b05fe6ba..d9fd9780 100644 --- a/src/news/models.py +++ b/src/news/models.py @@ -1,8 +1,8 @@ from django.db import models from django.urls import reverse from django.utils.text import slugify - from utils.models import CreatedUpdatedModel +from utils.slugs import unique_slugify class NewsItem(CreatedUpdatedModel): @@ -29,20 +29,13 @@ class NewsItem(CreatedUpdatedModel): published_at_string = self.published_at.strftime("%Y-%m-%d") base_slug = slugify(self.title) slug = "{}-{}".format(published_at_string, base_slug) - incrementer = 1 - - # We have to make sure that the slug won't clash with current slugs - while NewsItem.objects.filter(slug=slug).exists(): - if incrementer == 1: - slug = "{}-1".format(slug) - else: - slug = "{}-{}".format( - "-".join(slug.split("-")[:-1]), incrementer - ) - incrementer += 1 - self.slug = slug - - super(NewsItem, self).save(**kwargs) + self.slug = unique_slugify( + slug, + slugs_in_use=self.__class__.objects.all().values_list( + "slug", flat=True + ), + ) + super().save(**kwargs) def get_absolute_url(self): return reverse("news:detail", kwargs={"slug": self.slug}) diff --git a/src/phonebook/templates/phonebook.html b/src/phonebook/templates/phonebook.html index b8fc24f1..2455a879 100644 --- a/src/phonebook/templates/phonebook.html +++ b/src/phonebook/templates/phonebook.html @@ -5,11 +5,6 @@ Phonebook | {{ block.super }} {% endblock %} -{% block extra_head %} - - -{% endblock extra_head %} - {% block content %}

{{ camp.title }} Phonebook

@@ -26,7 +21,7 @@ This is a list of all the registered DECT numbers in our phonebook for {{ camp.t {% endif %} {% if dectregistration_list %} -
Type
+
diff --git a/src/program/admin.py b/src/program/admin.py index b0549617..d3a834f9 100644 --- a/src/program/admin.py +++ b/src/program/admin.py @@ -7,27 +7,43 @@ from .models import ( EventInstance, EventLocation, EventProposal, + EventSession, + EventSlot, EventTrack, EventType, - Favorite, Speaker, + SpeakerAvailability, SpeakerProposal, + SpeakerProposalAvailability, Url, UrlType, ) +@admin.register(SpeakerProposalAvailability) +class SpeakerProposalAvailabilityAdmin(admin.ModelAdmin): + list_display = ["speaker_proposal", "available", "when"] + list_filter = ["speaker_proposal__camp", "available", "speaker_proposal"] + + +@admin.register(SpeakerAvailability) +class SpeakerAvailabilityAdmin(admin.ModelAdmin): + list_display = ["speaker", "available", "when"] + list_filter = ["speaker__camp", "available", "speaker"] + readonly_fields = ["speaker"] + + @admin.register(SpeakerProposal) class SpeakerProposalAdmin(admin.ModelAdmin): - def mark_speakerproposal_as_approved(self, request, queryset): + def mark_speaker_proposal_as_approved(self, request, queryset): for sp in queryset: sp.mark_as_approved(request) - mark_speakerproposal_as_approved.description = ( + mark_speaker_proposal_as_approved.description = ( "Approve and create Speaker object(s)" ) - actions = ["mark_speakerproposal_as_approved"] + actions = ["mark_speaker_proposal_as_approved"] list_filter = ("camp", "proposal_status", "user") @@ -40,7 +56,7 @@ get_speakers_string.short_description = "Speakers" @admin.register(EventProposal) class EventProposalAdmin(admin.ModelAdmin): - def mark_eventproposal_as_approved(self, request, queryset): + def mark_event_proposal_as_approved(self, request, queryset): for ep in queryset: if not ep.speakers.all(): messages.error( @@ -54,12 +70,12 @@ class EventProposalAdmin(admin.ModelAdmin): messages.error(request, e) return False - mark_eventproposal_as_approved.description = "Approve and create Event object(s)" + mark_event_proposal_as_approved.description = "Approve and create Event object(s)" def get_speakers(self): return - actions = ["mark_eventproposal_as_approved"] + actions = ["mark_event_proposal_as_approved"] list_filter = ("event_type", "proposal_status", "track", "user") list_display = ["title", get_speakers_string, "event_type", "proposal_status"] @@ -67,7 +83,7 @@ class EventProposalAdmin(admin.ModelAdmin): @admin.register(EventLocation) class EventLocationAdmin(admin.ModelAdmin): list_filter = ("camp",) - list_display = ("name", "camp") + list_display = ("name", "camp", "capacity") @admin.register(EventTrack) @@ -76,10 +92,23 @@ class EventTrackAdmin(admin.ModelAdmin): list_display = ("name", "camp") +@admin.register(EventSession) +class EventSessionAdmin(admin.ModelAdmin): + list_display = ("camp", "event_type", "event_location", "when") + list_filter = ("camp", "event_type", "event_location") + search_fields = ["event__type", "event__location"] + + +@admin.register(EventSlot) +class EventSlotAdmin(admin.ModelAdmin): + list_display = ("id", "event_session", "when", "event") + list_filter = ("event_session__camp", "event_session__event_type", "event_session") + + @admin.register(EventInstance) class EventInstanceAdmin(admin.ModelAdmin): - list_display = ("event", "when", "location") - list_filter = ("event__track__camp", "event") + list_display = ("event", "when", "location", "autoscheduled") + list_filter = ("event__track__camp", "event", "autoscheduled") search_fields = ["event__title"] @@ -91,12 +120,7 @@ class EventTypeAdmin(admin.ModelAdmin): @admin.register(Speaker) class SpeakerAdmin(admin.ModelAdmin): list_filter = ("camp",) - readonly_fields = ["proposal"] - - -@admin.register(Favorite) -class FavoriteAdmin(admin.ModelAdmin): - raw_id_fields = ("event_instance",) + readonly_fields = ["proposal", "camp"] class SpeakerInline(admin.StackedInline): @@ -105,8 +129,8 @@ class SpeakerInline(admin.StackedInline): @admin.register(Event) class EventAdmin(admin.ModelAdmin): - list_filter = ("track", "speakers") - list_display = ["title", "event_type"] + list_display = ["title", "event_type", "duration_minutes", "demand"] + list_filter = ("track", "event_type", "speakers") inlines = [SpeakerInline] diff --git a/src/program/apps.py b/src/program/apps.py index 3bd2888b..9df44988 100644 --- a/src/program/apps.py +++ b/src/program/apps.py @@ -1,24 +1,19 @@ from django.apps import AppConfig -from django.db.models.signals import m2m_changed, post_save, pre_save +from django.db.models.signals import m2m_changed, post_save class ProgramConfig(AppConfig): name = "program" def ready(self): - from .models import Speaker, EventInstance + from .models import Speaker, EventSession from .signal_handlers import ( check_speaker_event_camp_consistency, - check_speaker_camp_change, - eventinstance_pre_save, - eventinstance_post_save, + event_session_post_save, ) m2m_changed.connect( check_speaker_event_camp_consistency, sender=Speaker.events.through ) - pre_save.connect(check_speaker_camp_change, sender=Speaker) - pre_save.connect(eventinstance_pre_save, sender=EventInstance) - - post_save.connect(eventinstance_post_save, sender=EventInstance) + post_save.connect(event_session_post_save, sender=EventSession) diff --git a/src/program/autoscheduler.py b/src/program/autoscheduler.py new file mode 100644 index 00000000..14687ffa --- /dev/null +++ b/src/program/autoscheduler.py @@ -0,0 +1,390 @@ +import logging +from datetime import timedelta + +from conference_scheduler import resources, scheduler +from conference_scheduler.lp_problem import objective_functions +from conference_scheduler.validator import is_valid_schedule, schedule_violations +from psycopg2.extras import DateTimeTZRange + +from .models import EventType + +logger = logging.getLogger("bornhack.%s" % __name__) + + +class AutoScheduler: + """ + The BornHack AutoScheduler. Made with love by Tykling. + + Built around https://github.com/PyconUK/ConferenceScheduler which works with lists + of conference_scheduler.resources.Slot and conference_scheduler.resources.Event objects. + + Most of the code in this class deals with massaging our data into a list of Slot and + Event objects defining the data and constraints for the scheduler. + + Initialising this class takes a while because all the objects have to be created. + """ + + def __init__(self, camp): + """ Get EventTypes, EventSessions and Events, build autoslot and autoevent objects """ + self.camp = camp + + # Get all EventTypes which support autoscheduling + self.event_types = self.get_event_types() + + # Get all EventSessions for the current event_types + self.event_sessions = self.get_event_sessions(self.event_types) + + # Build a lookup dict of lists of EventSession IDs per EventType (for easy lookups later) + self.event_type_sessions = {} + for session in self.event_sessions: + if session.event_type not in self.event_type_sessions: + self.event_type_sessions[session.event_type] = [] + self.event_type_sessions[session.event_type].append(session.id) + + # Get all Events for the current event_types + self.events = self.get_events(self.event_types) + + # Get autoslots + self.autoslots = self.get_autoslots(self.event_sessions) + + # Build a lookup dict of autoslots per EventType + self.event_type_slots = {} + for autoslot in self.autoslots: + # loop over event_type_sessions dict and find our + for et, sessions in self.event_type_sessions.items(): + if autoslot.session in sessions: + if et not in self.event_type_slots: + self.event_type_slots[et] = [] + self.event_type_slots[et].append(autoslot) + break + + # get autoevents and a lookup dict which maps Event id to autoevent index + self.autoevents, self.autoeventindex = self.get_autoevents(self.events) + + def get_event_types(self): + """ Return all EventTypes which support autoscheduling """ + return EventType.objects.filter(support_autoscheduling=True) + + def get_event_sessions(self, event_types): + """ Return all EventSessions for these EventTypes """ + return self.camp.event_sessions.filter( + event_type__in=event_types, + ).prefetch_related("event_type", "event_location") + + def get_events(self, event_types): + """ Return all Events that need scheduling """ + # return all events for these event_types, but.. + return self.camp.events.filter(event_type__in=event_types).exclude( + # exclude Events that have been sceduled already... + event_slots__isnull=False, + # ...unless those events are autoscheduled + event_slots__autoscheduled=False, + ) + + def get_autoslots(self, event_sessions): + """ Return a list of autoslots for all slots in all EventSessions """ + autoslots = [] + # loop over the sessions + for session in event_sessions: + # loop over available slots in this session + for slot in session.get_available_slots(count_autoscheduled_as_free=True): + autoslots.append(slot.get_autoscheduler_slot()) + return autoslots + + def get_autoevents(self, events): + """ Return a list of resources.Event objects, one for each Event """ + autoevents = [] + autoeventindex = {} + eventindex = {} + for event in events: + autoevents.append( + resources.Event( + name=event.id, + duration=event.duration_minutes, + tags=event.tags.names(), + demand=event.demand, + ) + ) + # create a dict of events with the autoevent index as key and the Event as value + autoeventindex[autoevents.index(autoevents[-1])] = event + # create a dict of events with the Event as key and the autoevent index as value + eventindex[event] = autoevents.index(autoevents[-1]) + + # loop over all autoevents to add unavailability... + # (we have to do this in a seperate loop because we need all the autoevents to exist) + for autoevent in autoevents: + # get the Event + event = autoeventindex[autoevents.index(autoevent)] + # loop over all other event_types... + for et in self.event_types.all().exclude(pk=event.event_type.pk): + if et in self.event_type_slots: + # and add all slots for this EventType as unavailable for this event, + # this means we don't schedule a talk in a workshop slot and vice versa. + autoevent.add_unavailability(*self.event_type_slots[et]) + + # loop over all speakers for this event and add event conflicts + for speaker in event.speakers.all(): + # loop over other events featuring this speaker, register each conflict, + # this means we dont schedule two events for the same speaker at the same time + conflict_ids = speaker.events.exclude(id=event.id).values_list( + "id", flat=True + ) + for conflictevent in autoevents: + if conflictevent.name in conflict_ids: + # only the event with the lowest index gets the unavailability, + if autoevents.index(conflictevent) > autoevents.index( + autoevent + ): + autoevent.add_unavailability(conflictevent) + + # loop over event_conflicts for this speaker, register unavailability for each, + # this means we dont schedule this event at the same time as something the + # speaker wishes to attend. + # Only process Events which the AutoScheduler is handling + for conflictevent in speaker.event_conflicts.filter( + pk__in=events.values_list("pk", flat=True) + ): + # only the event with the lowest index gets the unavailability + if eventindex[conflictevent] > autoevents.index(autoevent): + autoevent.add_unavailability( + autoevents[eventindex[conflictevent]] + ) + + # loop over event_conflicts for this speaker, register unavailability for each, + # only process Events which the AutoScheduler is not handling, and which have + # been scheduled in one or more EventSlots + for conflictevent in speaker.event_conflicts.filter( + event_slots__isnull=False + ).exclude(pk__in=events.values_list("pk", flat=True)): + # loop over the EventSlots this conflict is scheduled in + for conflictslot in conflictevent.event_slots.all(): + # loop over all slots + for slot in self.autoslots: + # check if this slot overlaps with the conflictevents slot + if conflictslot.when & DateTimeTZRange( + slot.starts_at, + slot.starts_at + timedelta(minutes=slot.duration), + ): + # this slot overlaps with the conflicting event + autoevent.add_unavailability(slot) + + # Register all slots where we have no positive availability + # for this speaker as unavailable + available = [] + for availability in speaker.availabilities.filter( + available=True + ).values_list("when", flat=True): + availability = DateTimeTZRange( + availability.lower, availability.upper, "()" + ) + for slot in self.autoslots: + slotrange = DateTimeTZRange( + slot.starts_at, + slot.starts_at + timedelta(minutes=slot.duration), + "()", + ) + if slotrange in availability: + # the speaker is available for this slot + available.append(self.autoslots.index(slot)) + autoevent.add_unavailability( + *[ + s + for s in self.autoslots + if not self.autoslots.index(s) in available + ] + ) + + return autoevents, autoeventindex + + def build_current_autoschedule(self): + """ Build an autoschedule object based on the existing published schedule. + Returns an autoschedule, which is a list of conference_scheduler.resources.ScheduledItem + objects, one for each scheduled Event. This function is useful for creating an "original + schedule" to base a new similar schedule off of. """ + + # loop over scheduled events and create a ScheduledItem object for each + autoschedule = [] + for slot in self.camp.event_slots.filter( + autoscheduled=True, event__in=self.events + ): + # loop over all autoevents to find the index of this event + for autoevent in self.autoevents: + if autoevent.name == slot.event.id: + # we need the index number of the event + eventindex = self.autoevents.index(autoevent) + break + + # loop over the autoslots to find the index of the autoslot this event is scheduled in + scheduled = False + for autoslot in self.autoslots: + if ( + autoslot.venue == slot.event_location.id + and autoslot.starts_at == slot.when.lower + and autoslot.session + in self.event_type_sessions[slot.event.event_type] + ): + # This autoslot starts at the same time as the EventSlot, and at the same + # location. It also has the session ID of a session with the right EventType. + autoschedule.append( + resources.ScheduledItem( + event=self.autoevents[eventindex], + slot=self.autoslots[self.autoslots.index(autoslot)], + ) + ) + scheduled = True + break + + # did we find a slot matching this EventInstance? + if not scheduled: + print(f"Could not find an autoslot for slot {slot} - skipping") + + # The returned schedule might not be valid! For example if a speaker is no + # longer available when their talk is scheduled. This is fine though, an invalid + # schedule can still be used as a basis for creating a new similar schedule. + return autoschedule + + def calculate_autoschedule(self, original_schedule=None): + """ Calculate autoschedule based on self.autoevents and self.autoslots, + optionally using original_schedule to minimise changes """ + kwargs = {} + kwargs["events"] = self.autoevents + kwargs["slots"] = self.autoslots + + # include another schedule in the calculation? + if original_schedule: + kwargs["original_schedule"] = original_schedule + kwargs["objective_function"] = objective_functions.number_of_changes + else: + # otherwise use the capacity demand difference thing + kwargs[ + "objective_function" + ] = objective_functions.efficiency_capacity_demand_difference + # calculate the new schedule + autoschedule = scheduler.schedule(**kwargs) + return autoschedule + + def calculate_similar_autoschedule(self, original_schedule=None): + """ Convenience method for creating similar schedules. If original_schedule + is omitted the new schedule is based on the current schedule instead """ + + if not original_schedule: + # we do not have an original_schedule, use current EventInstances + original_schedule = self.build_current_autoschedule() + + # calculate and return + autoschedule = self.calculate_autoschedule(original_schedule=original_schedule) + diff = self.diff(original_schedule, autoschedule) + return autoschedule, diff + + def apply(self, autoschedule): + """ Apply an autoschedule by creating EventInstance objects to match it """ + + # "The Clean Slate protocol sir?" - delete any existing autoscheduled Events + # TODO: investigate how this affects the FRAB XML export (for which we added a UUID on + # EventInstance objects). Make sure "favourite" functionality or bookmarks or w/e in + # FRAB clients still work after a schedule "re"apply. We might need a smaller hammer here. + deleted = self.camp.event_slots.filter( + # get all autoscheduled EventSlots + autoscheduled=True + ).update( + # clear the Event + event=None, + # and autoscheduled status + autoscheduled=None, + ) + + # loop and schedule events + scheduled = 0 + for item in autoschedule: + # each item is an instance of conference_scheduler.resources.ScheduledItem + event = self.camp.events.get(id=item.event.name) + slot = self.camp.event_slots.get( + event_session_id=item.slot.session, + when=DateTimeTZRange( + item.slot.starts_at, + item.slot.starts_at + timedelta(minutes=item.slot.duration), + "[)", # remember to use the correct bounds when comparing + ), + ) + slot.event = event + slot.autoscheduled = True + slot.save() + + scheduled += 1 + + # return the numbers + return deleted, scheduled + + def diff(self, original_schedule, new_schedule): + """ + This method returns a dict of Event differences and Slot differences between + the two schedules. + """ + slot_diff = scheduler.slot_schedule_difference(original_schedule, new_schedule,) + + slot_output = [] + for item in slot_diff: + slot_output.append( + { + "event_location": self.camp.event_locations.get(pk=item.slot.venue), + "starttime": item.slot.starts_at, + "old": {}, + "new": {}, + } + ) + if item.old_event: + try: + old_event = self.camp.events.get(pk=item.old_event.name) + except self.camp.events.DoesNotExist: + old_event = item.old_event.name + slot_output[-1]["old"]["event"] = old_event + if item.new_event: + try: + new_event = self.camp.events.get(pk=item.new_event.name) + except self.camp.events.DoesNotExist: + new_event = item.old_event.name + slot_output[-1]["new"]["event"] = new_event + + # then get a list of differences per event + event_diff = scheduler.event_schedule_difference( + original_schedule, new_schedule, + ) + event_output = [] + # loop over the differences and build the dict + for item in event_diff: + try: + event = self.camp.events.get(pk=item.event.name) + except self.camp.events.DoesNotExist: + event = item.event.name + event_output.append( + {"event": event, "old": {}, "new": {},} + ) + # do we have an old slot for this event? + if item.old_slot: + event_output[-1]["old"][ + "event_location" + ] = self.camp.event_locations.get(id=item.old_slot.venue) + event_output[-1]["old"]["starttime"] = item.old_slot.starts_at + # do we have a new slot for this event? + if item.new_slot: + event_output[-1]["new"][ + "event_location" + ] = self.camp.event_locations.get(id=item.new_slot.venue) + event_output[-1]["new"]["starttime"] = item.new_slot.starts_at + + # all good + return {"event_diffs": event_output, "slot_diffs": slot_output} + + def is_valid(self, autoschedule, return_violations=False): + """ Check if a schedule is valid, optionally returning a list of violations if invalid """ + valid = is_valid_schedule( + autoschedule, slots=self.autoslots, events=self.autoevents + ) + if not return_violations: + return valid + return ( + valid, + schedule_violations( + autoschedule, slots=self.autoslots, events=self.autoevents + ), + ) diff --git a/src/program/email.py b/src/program/email.py index 7525f47e..a8134ad2 100644 --- a/src/program/email.py +++ b/src/program/email.py @@ -7,123 +7,123 @@ from utils.email import add_outgoing_email logger = logging.getLogger("bornhack.%s" % __name__) -def add_new_speakerproposal_email(speakerproposal): - formatdict = {"proposal": speakerproposal} +def add_new_speaker_proposal_email(speaker_proposal): + formatdict = {"proposal": speaker_proposal} try: - content_team = Team.objects.get(camp=speakerproposal.camp, name="Content") + content_team = Team.objects.get(camp=speaker_proposal.camp, name="Content") except ObjectDoesNotExist as e: logger.info("There is no team with name Content: {}".format(e)) return False return add_outgoing_email( - text_template="emails/new_speakerproposal.txt", - html_template="emails/new_speakerproposal.html", + text_template="emails/new_speaker_proposal.txt", + html_template="emails/new_speaker_proposal.html", to_recipients=content_team.mailing_list, formatdict=formatdict, - subject="New speaker proposal '%s' was just submitted" % speakerproposal.name, + subject="New speaker proposal '%s' was just submitted" % speaker_proposal.name, ) -def add_new_eventproposal_email(eventproposal): - formatdict = {"proposal": eventproposal} +def add_new_event_proposal_email(event_proposal): + formatdict = {"proposal": event_proposal} try: - content_team = Team.objects.get(camp=eventproposal.camp, name="Content") + content_team = Team.objects.get(camp=event_proposal.camp, name="Content") except ObjectDoesNotExist as e: logger.info("There is no team with name Content: {}".format(e)) return False return add_outgoing_email( - text_template="emails/new_eventproposal.txt", - html_template="emails/new_eventproposal.html", + text_template="emails/new_event_proposal.txt", + html_template="emails/new_event_proposal.html", to_recipients=content_team.mailing_list, formatdict=formatdict, - subject="New event proposal '%s' was just submitted" % eventproposal.title, + subject="New event proposal '%s' was just submitted" % event_proposal.title, ) -def add_speakerproposal_updated_email(speakerproposal): - formatdict = {"proposal": speakerproposal} +def add_speaker_proposal_updated_email(speaker_proposal): + formatdict = {"proposal": speaker_proposal} try: - content_team = Team.objects.get(camp=speakerproposal.camp, name="Content") + content_team = Team.objects.get(camp=speaker_proposal.camp, name="Content") except ObjectDoesNotExist as e: logger.info("There is no team with name Content: {}".format(e)) return False return add_outgoing_email( - text_template="emails/update_speakerproposal.txt", - html_template="emails/update_speakerproposal.html", + text_template="emails/update_speaker_proposal.txt", + html_template="emails/update_speaker_proposal.html", to_recipients=content_team.mailing_list, formatdict=formatdict, - subject="Speaker proposal '%s' was just updated" % speakerproposal.name, + subject="Speaker proposal '%s' was just updated" % speaker_proposal.name, ) -def add_eventproposal_updated_email(eventproposal): - formatdict = {"proposal": eventproposal} +def add_event_proposal_updated_email(event_proposal): + formatdict = {"proposal": event_proposal} try: - content_team = Team.objects.get(camp=eventproposal.camp, name="Content") + content_team = Team.objects.get(camp=event_proposal.camp, name="Content") except ObjectDoesNotExist as e: logger.info("There is no team with name Content: {}".format(e)) return False return add_outgoing_email( - text_template="emails/update_eventproposal.txt", - html_template="emails/update_eventproposal.html", + text_template="emails/update_event_proposal.txt", + html_template="emails/update_event_proposal.html", to_recipients=content_team.mailing_list, formatdict=formatdict, - subject="Event proposal '%s' was just updated" % eventproposal.title, + subject="Event proposal '%s' was just updated" % event_proposal.title, ) -def add_speakerproposal_rejected_email(speakerproposal): - formatdict = {"proposal": speakerproposal} +def add_speaker_proposal_rejected_email(speaker_proposal): + formatdict = {"proposal": speaker_proposal} return add_outgoing_email( - text_template="emails/speakerproposal_rejected.txt", - html_template="emails/speakerproposal_rejected.html", - to_recipients=speakerproposal.user.email, + text_template="emails/speaker_proposal_rejected.txt", + html_template="emails/speaker_proposal_rejected.html", + to_recipients=speaker_proposal.user.email, formatdict=formatdict, - subject=f"Your {speakerproposal.camp.title} speaker proposal '{speakerproposal.name}' was rejected", + subject=f"Your {speaker_proposal.camp.title} speaker proposal '{speaker_proposal.name}' was rejected", ) -def add_speakerproposal_accepted_email(speakerproposal): - formatdict = {"proposal": speakerproposal} +def add_speaker_proposal_accepted_email(speaker_proposal): + formatdict = {"proposal": speaker_proposal} return add_outgoing_email( - text_template="emails/speakerproposal_accepted.txt", - html_template="emails/speakerproposal_accepted.html", - to_recipients=speakerproposal.user.email, + text_template="emails/speaker_proposal_accepted.txt", + html_template="emails/speaker_proposal_accepted.html", + to_recipients=speaker_proposal.user.email, formatdict=formatdict, - subject=f"Your {speakerproposal.camp.title} speaker proposal '{speakerproposal.name}' was accepted", + subject=f"Your {speaker_proposal.camp.title} speaker proposal '{speaker_proposal.name}' was accepted", ) -def add_eventproposal_rejected_email(eventproposal): - formatdict = {"proposal": eventproposal} +def add_event_proposal_rejected_email(event_proposal): + formatdict = {"proposal": event_proposal} return add_outgoing_email( - text_template="emails/eventproposal_rejected.txt", - html_template="emails/eventproposal_rejected.html", - to_recipients=eventproposal.user.email, + text_template="emails/event_proposal_rejected.txt", + html_template="emails/event_proposal_rejected.html", + to_recipients=event_proposal.user.email, formatdict=formatdict, - subject=f"Your {eventproposal.camp.title} event proposal '{eventproposal.title}' was rejected", + subject=f"Your {event_proposal.camp.title} event proposal '{event_proposal.title}' was rejected", ) -def add_eventproposal_accepted_email(eventproposal): - formatdict = {"proposal": eventproposal} +def add_event_proposal_accepted_email(event_proposal): + formatdict = {"proposal": event_proposal} return add_outgoing_email( - text_template="emails/eventproposal_accepted.txt", - html_template="emails/eventproposal_accepted.html", - to_recipients=eventproposal.user.email, + text_template="emails/event_proposal_accepted.txt", + html_template="emails/event_proposal_accepted.html", + to_recipients=event_proposal.user.email, formatdict=formatdict, - subject=f"Your {eventproposal.camp.title} event proposal '{eventproposal.title}' was accepted!", + subject=f"Your {event_proposal.camp.title} event proposal '{event_proposal.title}' was accepted!", ) diff --git a/src/program/forms.py b/src/program/forms.py index ae15018f..c52a2680 100644 --- a/src/program/forms.py +++ b/src/program/forms.py @@ -3,14 +3,15 @@ import logging from django import forms from django.core.exceptions import ImproperlyConfigured -from .models import EventProposal, EventTrack, SpeakerProposal, Url, UrlType +from .models import Event, EventProposal, EventTrack, SpeakerProposal logger = logging.getLogger("bornhack.%s" % __name__) class SpeakerProposalForm(forms.ModelForm): """ - The SpeakerProposalForm. Takes an EventType in __init__ and changes fields accordingly. + The SpeakerProposalForm. Takes a list of EventTypes in __init__, + and changes fields accordingly if the list has 1 element. """ class Meta: @@ -21,17 +22,41 @@ class SpeakerProposalForm(forms.ModelForm): "biography", "needs_oneday_ticket", "submission_notes", + "event_conflicts", ] - def __init__(self, camp, eventtype=None, *args, **kwargs): - # initialise the form + def __init__(self, camp, event_type=None, matrix={}, *args, **kwargs): + """ + initialise the form and adapt based on event_type + """ super().__init__(*args, **kwargs) + # only show events from this camp + self.fields["event_conflicts"].queryset = Event.objects.filter( + track__camp=camp, event_type__support_speaker_event_conflicts=True, + ) + + if matrix: + # add speaker availability fields + for date in matrix.keys(): + # do we need a column for this day? + if matrix[date]: + # loop over the daychunks for this day + for daychunk in matrix[date]: + if matrix[date][daychunk]: + # add the field + self.fields[ + matrix[date][daychunk]["fieldname"] + ] = forms.BooleanField(required=False) + # add it to Meta.fields too + self.Meta.fields.append(matrix[date][daychunk]["fieldname"]) + # adapt form based on EventType? - if not eventtype: + if not event_type: + # we have no event_type to customize the form, use the default form return - if eventtype.name == "Debate": + if event_type.name == "Debate": # fix label and help_text for the name field self.fields["name"].label = "Guest Name" self.fields[ @@ -54,10 +79,10 @@ class SpeakerProposalForm(forms.ModelForm): "submission_notes" ].help_text = "Private notes regarding this guest. Only visible to yourself and the BornHack organisers." - # no free tickets for workshops + # no free tickets for debates del self.fields["needs_oneday_ticket"] - elif eventtype.name == "Lightning Talk": + elif event_type.name == "Lightning Talk": # fix label and help_text for the name field self.fields["name"].label = "Speaker Name" self.fields[ @@ -83,7 +108,7 @@ class SpeakerProposalForm(forms.ModelForm): # no free tickets for lightning talks del self.fields["needs_oneday_ticket"] - elif eventtype.name == "Music Act": + elif event_type.name == "Music Act": # fix label and help_text for the name field self.fields["name"].label = "Artist Name" self.fields[ @@ -109,33 +134,7 @@ class SpeakerProposalForm(forms.ModelForm): # no oneday tickets for music acts del self.fields["needs_oneday_ticket"] - elif eventtype.name == "Recreational Event": - # fix label and help_text for the name field - self.fields["name"].label = "Host Name" - self.fields[ - "name" - ].help_text = "The name of the event host. Can be a real name or an alias." - - # fix label and help_text for the email field - self.fields["email"].label = "Host Email" - self.fields[ - "email" - ].help_text = "The email for the host. Will default to the logged-in users email if left empty." - - # fix label and help_text for the biograpy field - self.fields["biography"].label = "Host Biography" - self.fields["biography"].help_text = "The biography of the host." - - # fix label and help_text for the submission_notes field - self.fields["submission_notes"].label = "Host Notes" - self.fields[ - "submission_notes" - ].help_text = "Private notes regarding this host. Only visible to yourself and the BornHack organisers." - - # no oneday tickets for music acts - del self.fields["needs_oneday_ticket"] - - elif eventtype.name == "Talk": + elif event_type.name == "Talk" or event_type.name == "Keynote": # fix label and help_text for the name field self.fields["name"].label = "Speaker Name" self.fields[ @@ -158,7 +157,7 @@ class SpeakerProposalForm(forms.ModelForm): "submission_notes" ].help_text = "Private notes regarding this speaker. Only visible to yourself and the BornHack organisers." - elif eventtype.name == "Workshop": + elif event_type.name == "Workshop": # fix label and help_text for the name field self.fields["name"].label = "Host Name" self.fields[ @@ -186,7 +185,7 @@ class SpeakerProposalForm(forms.ModelForm): # no free tickets for workshops del self.fields["needs_oneday_ticket"] - elif eventtype.name == "Slacking Off": + elif event_type.name == "Recreational": # fix label and help_text for the name field self.fields["name"].label = "Host Name" self.fields["name"].help_text = "Can be a real name or an alias." @@ -207,10 +206,10 @@ class SpeakerProposalForm(forms.ModelForm): "submission_notes" ].help_text = "Private notes regarding this host. Only visible to yourself and the BornHack organisers." - # no free tickets for workshops + # no free tickets for recreational events del self.fields["needs_oneday_ticket"] - elif eventtype.name == "Meetup": + elif event_type.name == "Meetup": # fix label and help_text for the name field self.fields["name"].label = "Host Name" self.fields[ @@ -233,12 +232,12 @@ class SpeakerProposalForm(forms.ModelForm): "submission_notes" ].help_text = "Private notes regarding this host. Only visible to yourself and the BornHack organisers." - # no free tickets for workshops + # no free tickets for meetups del self.fields["needs_oneday_ticket"] else: raise ImproperlyConfigured( - "Unsupported event type, don't know which form class to use" + f"Unsupported event type '{event_type.name}', don't know which form class to use" ) @@ -258,6 +257,7 @@ class EventProposalForm(forms.ModelForm): "abstract", "allow_video_recording", "duration", + "tags", "slides_url", "submission_notes", "track", @@ -265,52 +265,35 @@ class EventProposalForm(forms.ModelForm): ] def clean_duration(self): - duration = self.cleaned_data["duration"] - if not duration or duration < 60 or duration > 180: + """ Make sure duration has been specified, and make sure it is not too long """ + if not self.cleaned_data["duration"]: + raise forms.ValidationError(f"Please specify a duration.") + if ( + self.event_type.event_duration_minutes + and self.cleaned_data["duration"] > self.event_type.event_duration_minutes + ): raise forms.ValidationError( - "Please keep duration between 60 and 180 minutes." + f"Please keep duration under {self.event_type.event_duration_minutes} minutes." ) - return duration + return self.cleaned_data["duration"] def clean_track(self): track = self.cleaned_data["track"] # TODO: make sure the track is part of the current camp, needs camp as form kwarg to verify return track - def save(self, commit=True, user=None, event_type=None): - eventproposal = super().save(commit=False) - if user: - eventproposal.user = user - if event_type: - eventproposal.event_type = event_type - eventproposal.save() - - if not event_type and hasattr(eventproposal, "event_type"): - event_type = eventproposal.event_type - - if self.cleaned_data.get("slides_url") and event_type.name in [ - "Talk", - "Lightning Talk", - ]: - url = self.cleaned_data.get("slides_url") - if not eventproposal.urls.filter(url=url).exists(): - slides_url = Url() - slides_url.eventproposal = eventproposal - slides_url.url = url - slides_url.urltype = UrlType.objects.get(name="Slides") - slides_url.save() - - return eventproposal - - def __init__(self, camp, eventtype=None, *args, **kwargs): + def __init__(self, camp, event_type=None, matrix=None, *args, **kwargs): # initialise form super().__init__(*args, **kwargs) + # we need event_type for cleaning later + self.event_type = event_type + TALK = "Talk" LIGHTNING_TALK = "Lightning Talk" DEBATE = "Debate" MUSIC_ACT = "Music Act" - RECREATIONAL_EVENT = "Recreational Event" + RECREATIONAL_EVENT = "Recreational" WORKSHOP = "Workshop" SLACKING_OFF = "Slacking Off" MEETUP = "Meetup" @@ -322,15 +305,34 @@ class EventProposalForm(forms.ModelForm): # make sure video_recording checkbox defaults to checked self.fields["allow_video_recording"].initial = True - if eventtype.name not in [TALK, LIGHTNING_TALK]: + if event_type.name not in [TALK, LIGHTNING_TALK]: # Only talk or lightning talk should show the slides_url field del self.fields["slides_url"] - if not eventtype.name == LIGHTNING_TALK: + # better placeholder text for duration field + self.fields["duration"].label = f"{event_type.name} Duration" + if event_type.event_duration_minutes: + self.fields[ + "duration" + ].help_text = f"Please enter the duration of this {event_type.name} (in minutes, max {event_type.event_duration_minutes})" + self.fields["duration"].widget.attrs[ + "placeholder" + ] = f"{event_type.name} Duration (in minutes, max {event_type.event_duration_minutes})" + else: + self.fields[ + "duration" + ].help_text = ( + f"Please enter the duration of this {event_type.name} (in minutes)" + ) + self.fields["duration"].widget.attrs[ + "placeholder" + ] = f"{event_type.name} Duration (in minutes)" + + if not event_type.name == LIGHTNING_TALK: # Only lightning talks submissions will have to choose whether to use provided speaker laptop del self.fields["use_provided_speaker_laptop"] - if eventtype.name == DEBATE: + if event_type.name == DEBATE: # fix label and help_text for the title field self.fields["title"].label = "Title of debate" self.fields["title"].help_text = "The title of this debate" @@ -340,17 +342,12 @@ class EventProposalForm(forms.ModelForm): self.fields["abstract"].help_text = "The description of this debate" # fix label and help_text for the submission_notes field - self.fields["submission_notes"].label = "Debate Act Notes" + self.fields["submission_notes"].label = "Debate Notes" self.fields[ "submission_notes" ].help_text = "Private notes regarding this debate. Only visible to yourself and the BornHack organisers." - # better placeholder text for duration field - self.fields["duration"].widget.attrs[ - "placeholder" - ] = "Debate Duration (minutes)" - - elif eventtype.name == MUSIC_ACT: + elif event_type.name == MUSIC_ACT: # fix label and help_text for the title field self.fields["title"].label = "Title of music act" self.fields["title"].help_text = "The title of this music act/concert/set." @@ -368,10 +365,7 @@ class EventProposalForm(forms.ModelForm): # no video recording for music acts del self.fields["allow_video_recording"] - # better placeholder text for duration field - self.fields["duration"].widget.attrs["placeholder"] = "Duration (minutes)" - - elif eventtype.name == RECREATIONAL_EVENT: + elif event_type.name == RECREATIONAL_EVENT: # fix label and help_text for the title field self.fields["title"].label = "Event Title" self.fields["title"].help_text = "The title of this recreational event" @@ -391,11 +385,7 @@ class EventProposalForm(forms.ModelForm): # no video recording for music acts del self.fields["allow_video_recording"] - # better placeholder text for duration field - self.fields["duration"].label = "Event Duration" - self.fields["duration"].widget.attrs["placeholder"] = "Duration (minutes)" - - elif eventtype.name in [TALK, LIGHTNING_TALK]: + elif event_type.name in [TALK, LIGHTNING_TALK]: # fix label and help_text for the title field self.fields["title"].label = "Title of Talk" self.fields["title"].help_text = "The title of this talk/presentation." @@ -412,7 +402,7 @@ class EventProposalForm(forms.ModelForm): "submission_notes" ].help_text = "Private notes regarding this talk. Only visible to yourself and the BornHack organisers." - if self.fields.get("slides_url") and eventtype.name == LIGHTNING_TALK: + if self.fields.get("slides_url") and event_type.name == LIGHTNING_TALK: self.fields[ "slides_url" ].help_text += " You will only get assigned a slot if you have provided slides (a title slide is enough if you don't use slides for the talk). You can add an URL later if need be." @@ -420,7 +410,7 @@ class EventProposalForm(forms.ModelForm): # no duration for talks del self.fields["duration"] - elif eventtype.name == WORKSHOP: + elif event_type.name == WORKSHOP: # fix label and help_text for the title field self.fields["title"].label = "Workshop Title" self.fields["title"].help_text = "The title of this workshop." @@ -440,13 +430,7 @@ class EventProposalForm(forms.ModelForm): # no video recording for workshops del self.fields["allow_video_recording"] - # duration field - self.fields["duration"].label = "Workshop Duration" - self.fields[ - "duration" - ].help_text = "How much time (in minutes) should we set aside for this workshop? Please keep it between 60 and 180 minutes (1-3 hours)." - - elif eventtype.name == SLACKING_OFF: + elif event_type.name == SLACKING_OFF: # fix label and help_text for the title field self.fields["title"].label = "Event Title" self.fields["title"].help_text = "The title of this recreational event." @@ -466,13 +450,7 @@ class EventProposalForm(forms.ModelForm): # no video recording for recreational events del self.fields["allow_video_recording"] - # duration field - self.fields["duration"].label = "Event Duration" - self.fields[ - "duration" - ].help_text = "How much time (in minutes) should we set aside for this event? Please keep it between 60 and 180 minutes (1-3 hours)." - - elif eventtype.name == MEETUP: + elif event_type.name == MEETUP: # fix label and help_text for the title field self.fields["title"].label = "Meetup Title" self.fields["title"].help_text = "The title of this meetup." @@ -492,12 +470,6 @@ class EventProposalForm(forms.ModelForm): # no video recording for meetups del self.fields["allow_video_recording"] - # duration field - self.fields["duration"].label = "Meetup Duration" - self.fields[ - "duration" - ].help_text = "How much time (in minutes) should we set aside for this meetup? Please keep it between 60 and 180 minutes (1-3 hours)." - else: raise ImproperlyConfigured( "Unsupported event type, don't know which form class to use" diff --git a/src/program/migrations/0085_btree_gist_extension.py b/src/program/migrations/0085_btree_gist_extension.py new file mode 100644 index 00000000..ad454eec --- /dev/null +++ b/src/program/migrations/0085_btree_gist_extension.py @@ -0,0 +1,15 @@ +# Generated by Django 3.0.3 on 2020-04-12 18:15 + +from django.contrib.postgres.operations import BtreeGistExtension +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("program", "0084_auto_20200229_1801"), + ] + + operations = [ + BtreeGistExtension(), + ] diff --git a/src/program/migrations/0086_sessions_slots_availability.py b/src/program/migrations/0086_sessions_slots_availability.py new file mode 100644 index 00000000..bb612a24 --- /dev/null +++ b/src/program/migrations/0086_sessions_slots_availability.py @@ -0,0 +1,426 @@ +# Generated by Django 3.0.3 on 2020-04-12 18:17 + +import uuid + +import django.contrib.postgres.constraints +import django.contrib.postgres.fields.ranges +import django.db.models.deletion +import django.db.models.expressions +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("camps", "0034_add_team_permission_sets"), + ("program", "0085_btree_gist_extension"), + ] + + operations = [ + migrations.CreateModel( + name="EventSession", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created", models.DateTimeField(auto_now_add=True)), + ("updated", models.DateTimeField(auto_now=True)), + ( + "when", + django.contrib.postgres.fields.ranges.DateTimeRangeField( + help_text="A period of time where this type of event can be scheduled. Input format is YYYY-MM-DD HH:MM" + ), + ), + ( + "event_duration_minutes", + models.PositiveIntegerField( + blank=True, + help_text="The duration of events in this EventSession. Defaults to the value from the EventType of this EventSession.", + ), + ), + ( + "description", + models.TextField( + blank=True, help_text="Description of this session (optional)." + ), + ), + ], + options={"ordering": ["when", "event_type", "event_location"],}, + ), + migrations.CreateModel( + name="EventSlot", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created", models.DateTimeField(auto_now_add=True)), + ("updated", models.DateTimeField(auto_now=True)), + ( + "when", + django.contrib.postgres.fields.ranges.DateTimeRangeField( + help_text="Start and end time of this slot" + ), + ), + ( + "autoscheduled", + models.NullBooleanField( + default=None, + help_text="True if the Event was scheduled by the AutoScheduler, False if it was scheduled manually, None if there is nothing scheduled in this EventSlot.", + ), + ), + ], + options={"ordering": ["when"],}, + ), + migrations.CreateModel( + name="SpeakerAvailability", + fields=[ + ( + "uuid", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("created", models.DateTimeField(auto_now_add=True)), + ("updated", models.DateTimeField(auto_now=True)), + ( + "when", + django.contrib.postgres.fields.ranges.DateTimeRangeField( + db_index=True, + help_text="The period when this speaker is available or unavailable. Must be 1 hour!", + ), + ), + ( + "available", + models.BooleanField( + db_index=True, + help_text="Is the speaker available or unavailable during this hour? Check for available, uncheck for unavailable.", + ), + ), + ], + ), + migrations.CreateModel( + name="SpeakerEventConflict", + fields=[ + ( + "uuid", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("created", models.DateTimeField(auto_now_add=True)), + ("updated", models.DateTimeField(auto_now=True)), + ], + options={"abstract": False,}, + ), + migrations.CreateModel( + name="SpeakerProposalAvailability", + fields=[ + ( + "uuid", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("created", models.DateTimeField(auto_now_add=True)), + ("updated", models.DateTimeField(auto_now=True)), + ( + "when", + django.contrib.postgres.fields.ranges.DateTimeRangeField( + db_index=True, + help_text="The period when this speaker is available or unavailable. Must be 1 hour!", + ), + ), + ( + "available", + models.BooleanField( + db_index=True, + help_text="Is the speaker available or unavailable during this hour? Check for available, uncheck for unavailable.", + ), + ), + ], + ), + migrations.CreateModel( + name="SpeakerProposalEventConflict", + fields=[ + ( + "uuid", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("created", models.DateTimeField(auto_now_add=True)), + ("updated", models.DateTimeField(auto_now=True)), + ], + options={"abstract": False,}, + ), + migrations.AddField( + model_name="event", + name="demand", + field=models.PositiveIntegerField( + default=0, + help_text="The estimated demand for this event. Used by the autoscheduler to pick the optimal location for events. Set to 0 to disable demand constraints for this event.", + ), + ), + migrations.AddField( + model_name="event", + name="duration_minutes", + field=models.PositiveIntegerField( + blank=True, + default=None, + help_text="The duration of this event in minutes. Leave blank to use the default from the eventtype.", + ), + ), + migrations.AddField( + model_name="eventinstance", + name="autoscheduled", + field=models.BooleanField( + default=False, + help_text="True if this was created by the autoscheduler.", + ), + ), + migrations.AddField( + model_name="eventlocation", + name="capacity", + field=models.PositiveIntegerField( + default=20, + help_text="The capacity of this location. Used by the autoscheduler.", + ), + ), + migrations.AddField( + model_name="eventlocation", + name="conflicts", + field=models.ManyToManyField( + help_text="Select the locations which this location conflicts with. Nothing can be scheduled in a location if a conflicting location has an EventInstance at the same time. Example: If one room can be split into two, then the big room would conflict with each of the two small rooms (but the small rooms would not conflict with eachother).", + related_name="_eventlocation_conflicts_+", + to="program.EventLocation", + ), + ), + migrations.AddField( + model_name="eventtype", + name="event_duration_minutes", + field=models.PositiveIntegerField( + blank=True, + help_text="The default duration of an event of this type, in minutes. Optional. This default can be overridden in individual EventSessions as needed.", + null=True, + ), + ), + migrations.AddField( + model_name="eventtype", + name="support_autoscheduling", + field=models.BooleanField( + default=False, + help_text="Check to enable this EventType in the autoscheduler", + ), + ), + migrations.AlterField( + model_name="eventinstance", + name="location", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="eventinstances", + to="program.EventLocation", + ), + ), + migrations.AlterField( + model_name="eventinstance", + name="when", + field=django.contrib.postgres.fields.ranges.DateTimeRangeField( + blank=True, null=True + ), + ), + migrations.AlterField( + model_name="eventproposal", + name="event_type", + field=models.ForeignKey( + help_text="The type of event", + on_delete=django.db.models.deletion.PROTECT, + related_name="eventproposals", + to="program.EventType", + ), + ), + migrations.AddConstraint( + model_name="eventinstance", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[("when", "&&"), ("location", "=")], + name="prevent_eventinstance_location_overlaps", + ), + ), + migrations.AddField( + model_name="speakerproposaleventconflict", + name="events", + field=models.ManyToManyField( + help_text="The conflict events", + related_name="speakerproposalconflicts", + to="program.Event", + ), + ), + migrations.AddField( + model_name="speakerproposaleventconflict", + name="speakerproposal", + field=models.OneToOneField( + help_text="The SpeakerProposal", + on_delete=django.db.models.deletion.PROTECT, + related_name="eventconflicts", + to="program.SpeakerProposal", + ), + ), + migrations.AddField( + model_name="speakerproposalavailability", + name="speakerproposal", + field=models.ForeignKey( + blank=True, + help_text="The speaker proposal object this availability belongs to", + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="availabilities", + to="program.SpeakerProposal", + ), + ), + migrations.AddField( + model_name="speakereventconflict", + name="events", + field=models.ManyToManyField( + help_text="The conflict events", + related_name="speakerconflicts", + to="program.Event", + ), + ), + migrations.AddField( + model_name="speakereventconflict", + name="speaker", + field=models.OneToOneField( + help_text="The Speaker", + on_delete=django.db.models.deletion.PROTECT, + related_name="eventconflicts", + to="program.Speaker", + ), + ), + migrations.AddField( + model_name="speakeravailability", + name="speaker", + field=models.ForeignKey( + blank=True, + help_text="The speaker object this availability belongs to (if any)", + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="availabilities", + to="program.Speaker", + ), + ), + migrations.AddField( + model_name="eventslot", + name="event", + field=models.ForeignKey( + blank=True, + help_text="The Event scheduled in this EventSlot", + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="event_slots", + to="program.Event", + ), + ), + migrations.AddField( + model_name="eventslot", + name="event_session", + field=models.ForeignKey( + help_text="The EventSession this EventSlot belongs to", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_slots", + to="program.EventSession", + ), + ), + migrations.AddField( + model_name="eventsession", + name="camp", + field=models.ForeignKey( + help_text="The Camp this EventSession belongs to", + on_delete=django.db.models.deletion.PROTECT, + related_name="eventsessions", + to="camps.Camp", + ), + ), + migrations.AddField( + model_name="eventsession", + name="event_location", + field=models.ForeignKey( + help_text="The event location this session is for", + on_delete=django.db.models.deletion.PROTECT, + related_name="eventsessions", + to="program.EventLocation", + ), + ), + migrations.AddField( + model_name="eventsession", + name="event_type", + field=models.ForeignKey( + help_text="The type of event this session is for", + on_delete=django.db.models.deletion.PROTECT, + related_name="eventsessions", + to="program.EventType", + ), + ), + migrations.AddConstraint( + model_name="speakerproposalavailability", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[ + (django.db.models.expressions.F("speakerproposal"), "="), + ("when", "&&"), + ], + name="prevent_speakerproposalavailability_overlaps", + ), + ), + migrations.AddConstraint( + model_name="speakeravailability", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[ + (django.db.models.expressions.F("speaker"), "="), + ("when", "&&"), + ], + name="prevent_speakeravailability_overlaps", + ), + ), + migrations.AddConstraint( + model_name="eventslot", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[("when", "&&"), ("event_session", "=")], + name="prevent_slot_session_overlaps", + ), + ), + migrations.AddConstraint( + model_name="eventsession", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[ + ("when", "&&"), + ("event_location", "="), + ("event_type", "="), + ], + name="prevent_eventsession_eventtype_eventlocation_overlaps", + ), + ), + ] diff --git a/src/program/migrations/0087_fk_and_related_name_underscores.py b/src/program/migrations/0087_fk_and_related_name_underscores.py new file mode 100644 index 00000000..37f0e3e2 --- /dev/null +++ b/src/program/migrations/0087_fk_and_related_name_underscores.py @@ -0,0 +1,215 @@ +# Generated by Django 3.0.3 on 2020-04-13 12:43 + +import django.contrib.postgres.constraints +import django.db.models.deletion +import django.db.models.expressions +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("camps", "0034_add_team_permission_sets"), + ("program", "0086_sessions_slots_availability"), + ] + + operations = [ + migrations.RemoveConstraint( + model_name="eventsession", + name="prevent_eventsession_eventtype_eventlocation_overlaps", + ), + migrations.RemoveConstraint( + model_name="speakeravailability", + name="prevent_speakeravailability_overlaps", + ), + migrations.RemoveConstraint( + model_name="speakerproposalavailability", + name="prevent_speakerproposalavailability_overlaps", + ), + migrations.RenameField( + model_name="speakerproposalavailability", + old_name="speakerproposal", + new_name="speaker_proposal", + ), + migrations.RenameField( + model_name="url", old_name="eventproposal", new_name="event_proposal", + ), + migrations.RenameField( + model_name="url", old_name="speakerproposal", new_name="speaker_proposal", + ), + migrations.RenameField( + model_name="url", old_name="urltype", new_name="url_type", + ), + migrations.AlterField( + model_name="event", + name="duration_minutes", + field=models.PositiveIntegerField( + blank=True, + default=None, + help_text="The duration of this event in minutes. Leave blank to use the default from the event_type.", + ), + ), + migrations.AlterField( + model_name="eventlocation", + name="camp", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="event_locations", + to="camps.Camp", + ), + ), + migrations.AlterField( + model_name="eventproposal", + name="event_type", + field=models.ForeignKey( + help_text="The type of event", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_proposals", + to="program.EventType", + ), + ), + migrations.AlterField( + model_name="eventproposal", + name="speakers", + field=models.ManyToManyField( + blank=True, + help_text="Pick the speaker(s) for this event. If you cannot see anything here you need to go back and create Speaker Proposal(s) first.", + related_name="event_proposals", + to="program.SpeakerProposal", + ), + ), + migrations.AlterField( + model_name="eventproposal", + name="track", + field=models.ForeignKey( + help_text="The track this event belongs to", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_proposals", + to="program.EventTrack", + ), + ), + migrations.AlterField( + model_name="eventsession", + name="camp", + field=models.ForeignKey( + help_text="The Camp this EventSession belongs to", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_sessions", + to="camps.Camp", + ), + ), + migrations.AlterField( + model_name="eventsession", + name="event_location", + field=models.ForeignKey( + help_text="The event location this session is for", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_sessions", + to="program.EventLocation", + ), + ), + migrations.AlterField( + model_name="eventsession", + name="event_type", + field=models.ForeignKey( + help_text="The type of event this session is for", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_sessions", + to="program.EventType", + ), + ), + migrations.AlterField( + model_name="eventtrack", + name="camp", + field=models.ForeignKey( + help_text="The Camp this Track belongs to", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_tracks", + to="camps.Camp", + ), + ), + migrations.AlterField( + model_name="speakereventconflict", + name="events", + field=models.ManyToManyField( + help_text="The conflict events", + related_name="speaker_conflicts", + to="program.Event", + ), + ), + migrations.AlterField( + model_name="speakereventconflict", + name="speaker", + field=models.OneToOneField( + help_text="The Speaker", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_conflicts", + to="program.Speaker", + ), + ), + migrations.AlterField( + model_name="speakerproposal", + name="camp", + field=models.ForeignKey( + editable=False, + on_delete=django.db.models.deletion.PROTECT, + related_name="speaker_proposals", + to="camps.Camp", + ), + ), + migrations.AlterField( + model_name="speakerproposaleventconflict", + name="events", + field=models.ManyToManyField( + help_text="The conflict events", + related_name="speaker_proposal_conflicts", + to="program.Event", + ), + ), + migrations.AlterField( + model_name="speakerproposaleventconflict", + name="speakerproposal", + field=models.OneToOneField( + help_text="The SpeakerProposal", + on_delete=django.db.models.deletion.PROTECT, + related_name="event_conflicts", + to="program.SpeakerProposal", + ), + ), + migrations.RenameField( + model_name="speakerproposaleventconflict", + old_name="speakerproposal", + new_name="speaker_proposal", + ), + migrations.AddConstraint( + model_name="eventsession", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[ + ("when", "&&"), + ("event_location", "="), + ("event_type", "="), + ], + name="prevent_event_session_event_type_event_location_overlaps", + ), + ), + migrations.AddConstraint( + model_name="speakeravailability", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[ + (django.db.models.expressions.F("speaker"), "="), + ("when", "&&"), + ], + name="prevent_speaker_availability_overlaps", + ), + ), + migrations.AddConstraint( + model_name="speakerproposalavailability", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[ + (django.db.models.expressions.F("speaker_proposal"), "="), + ("when", "&&"), + ], + name="prevent_speaker_proposal_availability_overlaps", + ), + ), + ] diff --git a/src/program/migrations/0088_speaker_event_conflicts_and_more.py b/src/program/migrations/0088_speaker_event_conflicts_and_more.py new file mode 100644 index 00000000..29ab2cbd --- /dev/null +++ b/src/program/migrations/0088_speaker_event_conflicts_and_more.py @@ -0,0 +1,114 @@ +# Generated by Django 3.0.3 on 2020-04-20 22:59 + +import django.contrib.postgres.constraints +import django.db.models.deletion +import utils.database +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("program", "0087_fk_and_related_name_underscores"), + ] + + operations = [ + migrations.RemoveField(model_name="speakereventconflict", name="events",), + migrations.RemoveField(model_name="speakereventconflict", name="speaker",), + migrations.RemoveField( + model_name="speakerproposaleventconflict", name="events", + ), + migrations.RemoveField( + model_name="speakerproposaleventconflict", name="speaker_proposal", + ), + migrations.AddField( + model_name="eventtype", + name="support_speaker_event_conflicts", + field=models.BooleanField( + default=True, + help_text="True if Events of this type should be selectable in the EventConflict m2m for SpeakerProposal and Speaker objects.", + ), + ), + migrations.AddField( + model_name="speaker", + name="event_conflicts", + field=models.ManyToManyField( + help_text="The Events this person wishes to attend. The AutoScheduler will avoid conflicts.", + related_name="speaker_conflicts", + to="program.Event", + ), + ), + migrations.AddField( + model_name="speakerproposal", + name="event_conflicts", + field=models.ManyToManyField( + help_text="Pick the Events this person wishes to attend, and we will attempt to avoid scheduling conflicts.", + related_name="speaker_proposal_conflicts", + to="program.Event", + ), + ), + migrations.AlterField( + model_name="event", + name="event_type", + field=models.ForeignKey( + help_text="The type of this event", + on_delete=django.db.models.deletion.PROTECT, + related_name="events", + to="program.EventType", + ), + ), + migrations.AlterField( + model_name="eventlocation", + name="conflicts", + field=models.ManyToManyField( + blank=True, + help_text="Select the locations which this location conflicts with. Nothing can be scheduled in a location if a conflicting location has a scheduled Event at the same time. Example: If one room can be split into two, then the big room would conflict with each of the two small rooms (but the small rooms would not conflict with eachother).", + related_name="_eventlocation_conflicts_+", + to="program.EventLocation", + ), + ), + migrations.AlterField( + model_name="eventproposal", + name="duration", + field=models.IntegerField( + blank=True, + help_text="How much time (in minutes) should we set aside for this act? Please keep it between 60 and 180 minutes (1-3 hours).", + ), + ), + migrations.AlterField( + model_name="eventslot", + name="event", + field=models.ForeignKey( + blank=True, + help_text="The Event scheduled in this EventSlot", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="event_slots", + to="program.Event", + ), + ), + migrations.AddConstraint( + model_name="speakeravailability", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[ + ("speaker", "="), + (utils.database.CastToInteger("available"), "="), + ("when", "-|-"), + ], + name="prevent_speaker_availability_adjacent_mergeable", + ), + ), + migrations.AddConstraint( + model_name="speakerproposalavailability", + constraint=django.contrib.postgres.constraints.ExclusionConstraint( + expressions=[ + ("speaker_proposal", "="), + (utils.database.CastToInteger("available"), "="), + ("when", "-|-"), + ], + name="prevent_speaker_proposal_availability_adjacent_mergeable", + ), + ), + migrations.DeleteModel(name="SpeakerEventConflict",), + migrations.DeleteModel(name="SpeakerProposalEventConflict",), + ] diff --git a/src/program/migrations/0089_event_conflicts_blank.py b/src/program/migrations/0089_event_conflicts_blank.py new file mode 100644 index 00000000..b8349b3c --- /dev/null +++ b/src/program/migrations/0089_event_conflicts_blank.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.3 on 2020-04-21 17:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("program", "0088_speaker_event_conflicts_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="speakerproposal", + name="event_conflicts", + field=models.ManyToManyField( + blank=True, + help_text="Pick the Events this person wishes to attend, and we will attempt to avoid scheduling conflicts.", + related_name="speaker_proposal_conflicts", + to="program.Event", + ), + ), + ] diff --git a/src/program/migrations/0090_event_tags.py b/src/program/migrations/0090_event_tags.py new file mode 100644 index 00000000..f19b462d --- /dev/null +++ b/src/program/migrations/0090_event_tags.py @@ -0,0 +1,25 @@ +# Generated by Django 3.0.3 on 2020-04-21 20:54 + +import taggit.managers +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("taggit", "0003_taggeditem_add_unique_index"), + ("program", "0089_event_conflicts_blank"), + ] + + operations = [ + migrations.AddField( + model_name="event", + name="tags", + field=taggit.managers.TaggableManager( + help_text="A comma-separated list of tags.", + through="taggit.TaggedItem", + to="taggit.Tag", + verbose_name="Tags", + ), + ), + ] diff --git a/src/program/migrations/0091_eventproposal_tags.py b/src/program/migrations/0091_eventproposal_tags.py new file mode 100644 index 00000000..5ffe83aa --- /dev/null +++ b/src/program/migrations/0091_eventproposal_tags.py @@ -0,0 +1,26 @@ +# Generated by Django 3.0.3 on 2020-04-21 20:54 + +import taggit.managers +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("taggit", "0003_taggeditem_add_unique_index"), + ("utils", "0004_uuidtaggeditem"), + ("program", "0090_event_tags"), + ] + + operations = [ + migrations.AddField( + model_name="eventproposal", + name="tags", + field=taggit.managers.TaggableManager( + help_text="A comma-separated list of tags.", + through="utils.UUIDTaggedItem", + to="taggit.Tag", + verbose_name="Tags", + ), + ), + ] diff --git a/src/program/migrations/0092_event_uuid.py b/src/program/migrations/0092_event_uuid.py new file mode 100644 index 00000000..4ea0f1fd --- /dev/null +++ b/src/program/migrations/0092_event_uuid.py @@ -0,0 +1,25 @@ +# Generated by Django 3.0.3 on 2020-04-22 06:16 + +import uuid + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("program", "0091_eventproposal_tags"), + ] + + operations = [ + migrations.AddField( + model_name="event", + name="uuid", + field=models.UUIDField( + default=uuid.uuid4, + editable=False, + help_text="This field is not the PK of the model. It is used to create EventSlot UUID for FRAB and iCal and other calendaring purposes.", + unique=True, + ), + ), + ] diff --git a/src/program/migrations/0093_proposal_reason_description.py b/src/program/migrations/0093_proposal_reason_description.py new file mode 100644 index 00000000..84451891 --- /dev/null +++ b/src/program/migrations/0093_proposal_reason_description.py @@ -0,0 +1,29 @@ +# Generated by Django 3.0.3 on 2020-05-03 12:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("program", "0092_event_uuid"), + ] + + operations = [ + migrations.AlterField( + model_name="eventproposal", + name="reason", + field=models.TextField( + blank=True, + help_text="The reason this proposal was accepted or rejected. This text will be included in the email to the submitter. Leave blank to send a standard email.", + ), + ), + migrations.AlterField( + model_name="speakerproposal", + name="reason", + field=models.TextField( + blank=True, + help_text="The reason this proposal was accepted or rejected. This text will be included in the email to the submitter. Leave blank to send a standard email.", + ), + ), + ] diff --git a/src/program/migrations/0094_tags_blank.py b/src/program/migrations/0094_tags_blank.py new file mode 100644 index 00000000..501122a5 --- /dev/null +++ b/src/program/migrations/0094_tags_blank.py @@ -0,0 +1,27 @@ +# Generated by Django 3.0.3 on 2020-05-03 16:57 + +import taggit.managers +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("utils", "0004_uuidtaggeditem"), + ("taggit", "0003_taggeditem_add_unique_index"), + ("program", "0093_proposal_reason_description"), + ] + + operations = [ + migrations.AlterField( + model_name="eventproposal", + name="tags", + field=taggit.managers.TaggableManager( + blank=True, + help_text="A comma-separated list of tags.", + through="utils.UUIDTaggedItem", + to="taggit.Tag", + verbose_name="Tags", + ), + ), + ] diff --git a/src/program/mixins.py b/src/program/mixins.py index f26cfcba..6e4ebdb3 100644 --- a/src/program/mixins.py +++ b/src/program/mixins.py @@ -4,6 +4,10 @@ from django.http import Http404 from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.views.generic.detail import SingleObjectMixin +from program.utils import ( + add_existing_availability_to_matrix, + get_speaker_availability_form_matrix, +) from . import models @@ -77,11 +81,11 @@ class UrlViewMixin(object): """ # get the proposal if "event_uuid" in self.kwargs: - self.eventproposal = get_object_or_404( + self.event_proposal = get_object_or_404( models.EventProposal, uuid=self.kwargs["event_uuid"], user=request.user ) elif "speaker_uuid" in self.kwargs: - self.speakerproposal = get_object_or_404( + self.speaker_proposal = get_object_or_404( models.SpeakerProposal, uuid=self.kwargs["speaker_uuid"], user=request.user, @@ -96,20 +100,20 @@ class UrlViewMixin(object): Include the proposal in the template context """ context = super().get_context_data(**kwargs) - if hasattr(self, "eventproposal") and self.eventproposal: - context["eventproposal"] = self.eventproposal + if hasattr(self, "event_proposal") and self.event_proposal: + context["event_proposal"] = self.event_proposal else: - context["speakerproposal"] = self.speakerproposal + context["speaker_proposal"] = self.speaker_proposal return context def get_success_url(self): """ Return to the detail view of the proposal """ - if hasattr(self, "eventproposal"): - return self.eventproposal.get_absolute_url() + if hasattr(self, "event_proposal"): + return self.event_proposal.get_absolute_url() else: - return self.speakerproposal.get_absolute_url() + return self.speaker_proposal.get_absolute_url() class EventViewMixin(CampViewMixin): @@ -136,9 +140,69 @@ class EventFeedbackViewMixin(EventViewMixin): def setup(self, *args, **kwargs): super().setup(*args, **kwargs) - self.eventfeedback = get_object_or_404( + self.event_feedback = get_object_or_404( models.EventFeedback, event=self.event, user=self.request.user, ) def get_object(self): - return self.eventfeedback + return self.event_feedback + + +class AvailabilityMatrixViewMixin(CampViewMixin): + """ + Mixin with shared code between all availability matrix views, + meaning all views that show an availability matrix (form or not) + for a SpeakerProposal or Speaker object. Used by SpeakerProposal + submitters and in backoffice. + """ + + def setup(self, *args, **kwargs): + """ Get the availability matrix""" + super().setup(*args, **kwargs) + # do we have an Event or an EventProposal? + if hasattr(self.get_object(), "events"): + # we have an Event + event_types = models.EventType.objects.filter( + events__in=self.get_object().events.all() + ).distinct() + else: + # we have an EventProposal + event_types = models.EventType.objects.filter( + event_proposals__in=self.get_object().event_proposals.all() + ).distinct() + # get the matrix and add any existing availability to it + self.matrix = get_speaker_availability_form_matrix( + sessions=self.camp.event_sessions.filter(event_type__in=event_types) + ) + add_existing_availability_to_matrix(self.matrix, self.get_object()) + + def get_form_kwargs(self): + """ Add the matrix to form kwargs, only used if the view has a form """ + kwargs = super().get_form_kwargs() + kwargs["matrix"] = self.matrix + return kwargs + + def get_initial(self, *args, **kwargs): + """ Populate the speaker_availability checkboxes, only used if the view has a form """ + initial = super().get_initial(*args, **kwargs) + + # add initial checkbox states + for date in self.matrix.keys(): + # loop over daychunks and check if we need a checkbox + for daychunk in self.matrix[date].keys(): + if not self.matrix[date][daychunk]: + # we have no event_session here, carry on + continue + if self.matrix[date][daychunk]["initial"] in [True, None]: + initial[self.matrix[date][daychunk]["fieldname"]] = True + else: + initial[self.matrix[date][daychunk]["fieldname"]] = False + + # we are ready to render the form + return initial + + def get_context_data(self, **kwargs): + """ Add the matrix to context """ + context = super().get_context_data(**kwargs) + context["matrix"] = self.matrix + return context diff --git a/src/program/models.py b/src/program/models.py index 8d73ee24..04f0eb4a 100644 --- a/src/program/models.py +++ b/src/program/models.py @@ -3,22 +3,35 @@ import uuid from datetime import timedelta import icalendar +from conference_scheduler import resources from django.apps import apps from django.conf import settings from django.contrib import messages -from django.contrib.postgres.fields import DateTimeRangeField -from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.contrib.postgres.constraints import ExclusionConstraint +from django.contrib.postgres.fields import DateTimeRangeField, RangeOperators +from django.core.exceptions import ValidationError from django.core.files.storage import FileSystemStorage from django.db import models +from django.db.models import F, Q from django.urls import reverse, reverse_lazy -from django.utils.text import slugify -from utils.models import CampRelatedModel, CreatedUpdatedModel, UUIDModel +from django.utils import timezone +from django.utils.safestring import mark_safe +from psycopg2.extras import DateTimeTZRange +from taggit.managers import TaggableManager +from utils.database import CastToInteger +from utils.models import ( + CampRelatedModel, + CreatedUpdatedModel, + UUIDModel, + UUIDTaggedItem, +) +from utils.slugs import unique_slugify from .email import ( - add_eventproposal_accepted_email, - add_eventproposal_rejected_email, - add_speakerproposal_accepted_email, - add_speakerproposal_rejected_email, + add_event_proposal_accepted_email, + add_event_proposal_rejected_email, + add_speaker_proposal_accepted_email, + add_speaker_proposal_rejected_email, ) logger = logging.getLogger("bornhack.%s" % __name__) @@ -48,24 +61,25 @@ class UrlType(CreatedUpdatedModel): class Url(CampRelatedModel): """ - This model contains URLs related to - - SpeakerProposals - - EventProposals - - Speakers - - Events - Each URL has a UrlType and a GenericForeignKey to the model to which it belongs. - When a SpeakerProposal or EventProposal is approved the related URLs will be copied with FK to the new Speaker/Event objects. + This model contains URLs related to + - SpeakerProposals + - EventProposals + - Speakers + - Events + Each URL has a UrlType and a ForeignKey to the model to which it belongs. + When a SpeakerProposal or EventProposal is approved the related URLs will + be copied with FK to the new Speaker/Event objects. """ uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) url = models.URLField(help_text="The actual URL") - urltype = models.ForeignKey( + url_type = models.ForeignKey( "program.UrlType", help_text="The type of this URL", on_delete=models.PROTECT ) - speakerproposal = models.ForeignKey( + speaker_proposal = models.ForeignKey( "program.SpeakerProposal", null=True, blank=True, @@ -74,7 +88,7 @@ class Url(CampRelatedModel): related_name="urls", ) - eventproposal = models.ForeignKey( + event_proposal = models.ForeignKey( "program.EventProposal", null=True, blank=True, @@ -107,19 +121,17 @@ class Url(CampRelatedModel): def clean(self): """ Make sure we have exactly one FK """ fks = 0 - if self.speakerproposal: + if self.speaker_proposal: fks += 1 - if self.eventproposal: + if self.event_proposal: fks += 1 if self.speaker: fks += 1 if self.event: fks += 1 - if fks > 1: - raise ( - ValidationError( - "Url objects must have maximum one FK, this has %s" % fks - ) + if fks != 1: + raise ValidationError( + f"Url objects must have exactly one FK, this has {fks}" ) @property @@ -127,10 +139,10 @@ class Url(CampRelatedModel): """ Return the object this Url belongs to """ - if self.speakerproposal: - return self.speakerproposal - elif self.eventproposal: - return self.eventproposal + if self.speaker_proposal: + return self.speaker_proposal + elif self.event_proposal: + return self.event_proposal elif self.speaker: return self.speaker elif self.event: @@ -143,8 +155,8 @@ class Url(CampRelatedModel): return self.owner.camp camp_filter = [ - "speakerproposal__camp", - "eventproposal__track__camp", + "speaker_proposal__camp", + "event_proposal__track__camp", "speaker__camp", "event__track__camp", ] @@ -153,6 +165,136 @@ class Url(CampRelatedModel): ############################################################################### +class Availability(CampRelatedModel, UUIDModel): + """ + This model contains all the availability info for speaker_proposals and + speakers. It is inherited by SpeakerProposalAvailability and SpeakerAvailability + models. + """ + + class Meta: + abstract = True + + when = DateTimeRangeField( + db_index=True, + help_text="The period when this speaker is available or unavailable. Must be 1 hour!", + ) + + available = models.BooleanField( + db_index=True, + help_text="Is the speaker available or unavailable during this hour? Check for available, uncheck for unavailable.", + ) + + +class SpeakerProposalAvailability(Availability): + """ Availability info for SpeakerProposal objects """ + + class Meta: + """ Add ExclusionConstraints preventing overlaps and adjacent ranges with same availability """ + + constraints = [ + # we do not want overlapping ranges + ExclusionConstraint( + name="prevent_speaker_proposal_availability_overlaps", + expressions=[ + (F("speaker_proposal"), RangeOperators.EQUAL), + ("when", RangeOperators.OVERLAPS), + ], + ), + # we do not want adjacent ranges with same availability + ExclusionConstraint( + name="prevent_speaker_proposal_availability_adjacent_mergeable", + expressions=[ + ("speaker_proposal", RangeOperators.EQUAL), + (CastToInteger("available"), RangeOperators.EQUAL), + ("when", RangeOperators.ADJACENT_TO), + ], + ), + ] + + speaker_proposal = models.ForeignKey( + "program.SpeakerProposal", + null=True, + blank=True, + on_delete=models.PROTECT, + related_name="availabilities", + help_text="The speaker proposal object this availability belongs to", + ) + + @property + def camp(self): + return self.speaker_proposal.camp + + camp_filter = "speaker_proposal__camp" + + def clean(self): + if SpeakerProposalAvailability.objects.filter( + speaker_proposal=self.speaker_proposal, + when__adjacent_to=self.when, + available=self.available, + ).exists(): + raise ValidationError( + f"An adjacent SpeakerProposalAvailability object for this SpeakerProposal already exists with the same value for available, cannot save() {self.when}" + ) + + def __str__(self): + return f"SpeakerProposalAvailability: {self.speaker_proposal.name} is {'not ' if not self.available else ''}available from {self.when.lower} to {self.when.upper}" + + +class SpeakerAvailability(Availability): + """ Availability info for Speaker objects """ + + class Meta: + """ Add ExclusionConstraints preventing overlaps and adjacent ranges with same availability """ + + constraints = [ + # we do not want overlapping ranges + ExclusionConstraint( + name="prevent_speaker_availability_overlaps", + expressions=[ + (F("speaker"), RangeOperators.EQUAL), + ("when", RangeOperators.OVERLAPS), + ], + ), + # we do not want adjacent ranges with same availability + ExclusionConstraint( + name="prevent_speaker_availability_adjacent_mergeable", + expressions=[ + ("speaker", RangeOperators.EQUAL), + (CastToInteger("available"), RangeOperators.EQUAL), + ("when", RangeOperators.ADJACENT_TO), + ], + ), + ] + + speaker = models.ForeignKey( + "program.Speaker", + null=True, + blank=True, + on_delete=models.PROTECT, + related_name="availabilities", + help_text="The speaker object this availability belongs to (if any)", + ) + + @property + def camp(self): + return self.speaker.camp + + camp_filter = "speaker__camp" + + def clean(self): + # this should be an ExclusionConstraint but the boolean condition isn't conditioning :/ + if SpeakerAvailability.objects.filter( + speaker=self.speaker, when__adjacent_to=self.when, available=self.available, + ).exists(): + raise ValidationError( + "An adjacent SpeakerAvailability object for this Speaker already exists with the same value for available, cannot save()" + ) + + +############################################################################### + + class UserSubmittedModel(CampRelatedModel): """ An abstract model containing the stuff that is shared @@ -170,7 +312,7 @@ class UserSubmittedModel(CampRelatedModel): PROPOSAL_APPROVED = "approved" PROPOSAL_REJECTED = "rejected" - ROPOSAL_STATUSES = [PROPOSAL_PENDING, PROPOSAL_APPROVED, PROPOSAL_REJECTED] + PROPOSAL_STATUSES = [PROPOSAL_PENDING, PROPOSAL_APPROVED, PROPOSAL_REJECTED] PROPOSAL_STATUS_CHOICES = [ (PROPOSAL_PENDING, "Pending approval"), @@ -183,7 +325,8 @@ class UserSubmittedModel(CampRelatedModel): ) reason = models.TextField( - blank=True, help_text="The reason this proposal was accepted or rejected.", + blank=True, + help_text="The reason this proposal was accepted or rejected. This text will be included in the email to the submitter. Leave blank to send a standard email.", ) def __str__(self): @@ -215,7 +358,7 @@ class SpeakerProposal(UserSubmittedModel): camp = models.ForeignKey( "camps.Camp", - related_name="speakerproposals", + related_name="speaker_proposals", on_delete=models.PROTECT, editable=False, ) @@ -244,60 +387,97 @@ class SpeakerProposal(UserSubmittedModel): help_text="Check if BornHack needs to provide a free one-day ticket for this speaker", ) + event_conflicts = models.ManyToManyField( + "program.Event", + related_name="speaker_proposal_conflicts", + blank=True, + help_text="Pick the Events this person wishes to attend, and we will attempt to avoid scheduling conflicts.", + ) + @property def headline(self): return self.name def get_absolute_url(self): return reverse_lazy( - "program:speakerproposal_detail", + "program:speaker_proposal_detail", kwargs={"camp_slug": self.camp.slug, "pk": self.uuid}, ) - def mark_as_approved(self, request): + def mark_as_approved(self, request=None): """ Marks a SpeakerProposal as approved, including creating/updating the related Speaker object """ - speakerproposalmodel = apps.get_model("program", "speakerproposal") + speaker_proposalmodel = apps.get_model("program", "SpeakerProposal") # create a Speaker if we don't have one if not hasattr(self, "speaker"): - speakermodel = apps.get_model("program", "speaker") + speakermodel = apps.get_model("program", "Speaker") speaker = speakermodel() speaker.proposal = self else: + # this proposal has been approved before, update the existing speaker speaker = self.speaker # set Speaker data speaker.camp = self.camp - if self.email: - email = self.email - else: - email = request.user.email - speaker.email = email + speaker.email = self.email if self.email else self.user.email speaker.name = self.name speaker.biography = self.biography speaker.needs_oneday_ticket = self.needs_oneday_ticket speaker.save() + # save speaker availability, start with a clean slate + speaker.availabilities.all().delete() + for availability in self.availabilities.all(): + SpeakerAvailability.objects.create( + speaker=speaker, + when=availability.when, + available=availability.available, + ) + # mark as approved and save - self.proposal_status = speakerproposalmodel.PROPOSAL_APPROVED + self.proposal_status = speaker_proposalmodel.PROPOSAL_APPROVED self.save() # copy all the URLs to the speaker object speaker.urls.clear() for url in self.urls.all(): - Url.objects.create(url=url.url, urltype=url.urltype, speaker=speaker) + Url.objects.create(url=url.url, url_type=url.url_type, speaker=speaker) - # a message to the admin - messages.success( - request, "Speaker object %s has been created/updated" % speaker - ) - add_speakerproposal_accepted_email(self) + # copy event conflicts to the speaker object + speaker.event_conflicts.clear() + speaker.event_conflicts.set(self.event_conflicts.all()) - def mark_as_rejected(self, request): - speakerproposalmodel = apps.get_model("program", "speakerproposal") - self.proposal_status = speakerproposalmodel.PROPOSAL_REJECTED + # a message to the admin (if we have a request) + if request: + messages.success( + request, "Speaker object %s has been created/updated" % speaker + ) + add_speaker_proposal_accepted_email(self) + + def mark_as_rejected(self, request=None): + speaker_proposalmodel = apps.get_model("program", "SpeakerProposal") + self.proposal_status = speaker_proposalmodel.PROPOSAL_REJECTED self.save() - messages.success(request, "SpeakerProposal %s has been rejected" % self.name) - add_speakerproposal_rejected_email(self) + if request: + messages.success( + request, "SpeakerProposal %s has been rejected" % self.name + ) + add_speaker_proposal_rejected_email(self) + + @property + def event_types(self): + """ Return a queryset of the EventType objects for the EventProposals """ + return EventType.objects.filter( + id__in=self.event_proposals.all().values_list("event_type", flat=True) + ) + + @property + def title(self): + """ Convenience method to return the proper host_title """ + if self.event_proposals.values_list("event_type").distinct().count() > 1: + # we have different eventtypes, use generic title + return "Person" + else: + return self.event_proposals.first().event_type.host_title class EventProposal(UserSubmittedModel): @@ -305,7 +485,7 @@ class EventProposal(UserSubmittedModel): track = models.ForeignKey( "program.EventTrack", - related_name="eventproposals", + related_name="event_proposals", help_text="The track this event belongs to", on_delete=models.PROTECT, ) @@ -321,14 +501,17 @@ class EventProposal(UserSubmittedModel): ) event_type = models.ForeignKey( - "program.EventType", help_text="The type of event", on_delete=models.PROTECT + "program.EventType", + help_text="The type of event", + on_delete=models.PROTECT, + related_name="event_proposals", ) speakers = models.ManyToManyField( "program.SpeakerProposal", blank=True, help_text="Pick the speaker(s) for this event. If you cannot see anything here you need to go back and create Speaker Proposal(s) first.", - related_name="eventproposals", + related_name="event_proposals", ) allow_video_recording = models.BooleanField( @@ -337,8 +520,6 @@ class EventProposal(UserSubmittedModel): ) duration = models.IntegerField( - default=None, - null=True, blank=True, help_text="How much time (in minutes) should we set aside for this act? Please keep it between 60 and 180 minutes (1-3 hours).", ) @@ -352,6 +533,8 @@ class EventProposal(UserSubmittedModel): help_text="Will you be using the provided speaker laptop?", default=True ) + tags = TaggableManager(through=UUIDTaggedItem, blank=True,) + @property def camp(self): return self.track.camp @@ -362,13 +545,18 @@ class EventProposal(UserSubmittedModel): def headline(self): return self.title + def save(self, **kwargs): + if not self.duration: + self.duration = self.event_type.event_duration_minutes + super().save(**kwargs) + def get_absolute_url(self): return reverse_lazy( - "program:eventproposal_detail", + "program:event_proposal_detail", kwargs={"camp_slug": self.camp.slug, "pk": self.uuid}, ) - def get_available_speakerproposals(self): + def get_available_speaker_proposals(self): """ Return all SpeakerProposals submitted by the user who submitted this EventProposal, which are not already added to this EventProposal @@ -377,9 +565,9 @@ class EventProposal(UserSubmittedModel): camp=self.track.camp, user=self.user ).exclude(uuid__in=self.speakers.all().values_list("uuid")) - def mark_as_approved(self, request): - eventmodel = apps.get_model("program", "event") - eventproposalmodel = apps.get_model("program", "eventproposal") + def mark_as_approved(self, request=None): + eventmodel = apps.get_model("program", "Event") + event_proposalmodel = apps.get_model("program", "EventProposal") # use existing event if we have one if not hasattr(self, "event"): event = eventmodel() @@ -392,33 +580,44 @@ class EventProposal(UserSubmittedModel): event.proposal = self event.video_recording = self.allow_video_recording event.save() - # loop through the speakerproposals linked to this eventproposal and associate any related speaker objects with this event + # loop through the speaker_proposals linked to this event_proposal and associate any related speaker objects with this event for sp in self.speakers.all(): - try: - event.speakers.add(sp.speaker) - except ObjectDoesNotExist: - # clean up - event.urls.clear() - event.delete() + if sp.proposal_status != "approved": raise ValidationError("Not all speakers are approved or created yet.") + event.speakers.add(sp.speaker) - self.proposal_status = eventproposalmodel.PROPOSAL_APPROVED + self.proposal_status = event_proposalmodel.PROPOSAL_APPROVED self.save() # clear any old urls from the event object and copy all the URLs from the proposal event.urls.clear() for url in self.urls.all(): - Url.objects.create(url=url.url, urltype=url.urltype, event=event) + Url.objects.create(url=url.url, url_type=url.url_type, event=event) - messages.success(request, "Event object %s has been created/updated" % event) - add_eventproposal_accepted_email(self) + # set event tags + event.tags.add(*self.tags.names()) - def mark_as_rejected(self, request): - eventproposalmodel = apps.get_model("program", "eventproposal") - self.proposal_status = eventproposalmodel.PROPOSAL_REJECTED + if request: + messages.success( + request, "Event object %s has been created/updated" % event + ) + add_event_proposal_accepted_email(self) + + def mark_as_rejected(self, request=None): + event_proposalmodel = apps.get_model("program", "EventProposal") + self.proposal_status = event_proposalmodel.PROPOSAL_REJECTED self.save() - messages.success(request, "EventProposal %s has been rejected" % self.title) - add_eventproposal_rejected_email(self) + if request: + messages.success(request, "EventProposal %s has been rejected" % self.title) + add_event_proposal_rejected_email(self) + + @property + def can_be_approved(self): + """ We cannot approve an EventProposal until all SpeakerProposals are approved """ + if self.speakers.exclude(proposal_status="approved").exists(): + return False + else: + return True ############################################################################### @@ -433,7 +632,7 @@ class EventTrack(CampRelatedModel): camp = models.ForeignKey( "camps.Camp", - related_name="eventtracks", + related_name="event_tracks", on_delete=models.PROTECT, help_text="The Camp this Track belongs to", ) @@ -446,7 +645,7 @@ class EventTrack(CampRelatedModel): ) def __str__(self): - return self.name + return f"{self.name} ({self.camp.title})" class Meta: unique_together = (("camp", "slug"), ("camp", "name")) @@ -468,7 +667,18 @@ class EventLocation(CampRelatedModel): ) camp = models.ForeignKey( - "camps.Camp", related_name="eventlocations", on_delete=models.PROTECT + "camps.Camp", related_name="event_locations", on_delete=models.PROTECT + ) + + capacity = models.PositiveIntegerField( + default=20, + help_text="The capacity of this location. Used by the autoscheduler.", + ) + + conflicts = models.ManyToManyField( + "self", + blank=True, + help_text="Select the locations which this location conflicts with. Nothing can be scheduled in a location if a conflicting location has a scheduled Event at the same time. Example: If one room can be split into two, then the big room would conflict with each of the two small rooms (but the small rooms would not conflict with eachother).", ) def __str__(self): @@ -477,12 +687,47 @@ class EventLocation(CampRelatedModel): class Meta: unique_together = (("camp", "slug"), ("camp", "name")) + def save(self, **kwargs): + """ Create a slug """ + if not self.slug: + self.slug = unique_slugify( + self.name, + self.__class__.objects.filter(camp=self.camp).values_list( + "slug", flat=True + ), + ) + super().save(**kwargs) + def serialize(self): return {"name": self.name, "slug": self.slug, "icon": self.icon} + @property + def icon_html(self): + return mark_safe(f'') + + @property + def event_slots(self): + return self.camp.event_slots.filter(event_session__event_location=self) + + def scheduled_event_slots(self): + """ Returns a QuerySet of all EventSlots scheduled in this EventLocation """ + return self.event_slots.filter(event__isnull=False) + + def is_available(self, when, ignore_event_slot_ids=[]): + """ A location is available if nothing is scheduled in it at that time """ + if ( + self.event_slots.filter(event__isnull=False, when__overlap=when) + .exclude(pk__in=ignore_event_slot_ids) + .exists() + ): + # something is scheduled, the location is not available at this time + return False + # nothing is scheduled, location is available + return True + class EventType(CreatedUpdatedModel): - """ Every event needs to have a type. """ + """ Every event needs to have a type. """ name = models.CharField( max_length=100, unique=True, help_text="The name of this event type" @@ -528,6 +773,21 @@ class EventType(CreatedUpdatedModel): default="Person", ) + event_duration_minutes = models.PositiveIntegerField( + null=True, + blank=True, + help_text="The default duration of an event of this type, in minutes. Optional. This default can be overridden in individual EventSessions as needed.", + ) + + support_autoscheduling = models.BooleanField( + default=False, help_text="Check to enable this EventType in the autoscheduler", + ) + + support_speaker_event_conflicts = models.BooleanField( + default=True, + help_text="True if Events of this type should be selectable in the EventConflict m2m for SpeakerProposal and Speaker objects.", + ) + def __str__(self): return self.name @@ -539,10 +799,405 @@ class EventType(CreatedUpdatedModel): "light_text": self.light_text, } + def clean(self): + if self.support_autoscheduling and not self.event_duration_minutes: + raise ValidationError( + "You must specify event_duration_minutes to support autoscheduling" + ) + + @property + def duration(self): + """ Just return a timedelta of the lenght of this Session """ + return timedelta(minutes=self.event_duration_minutes) + + def icon_html(self): + return mark_safe( + f'' + ) + + +class EventSession(CampRelatedModel): + """ + An EventSession define the "opening hours" for an EventType in an EventLocation. + + Creating an EventSession also creates the related EventSlots. Updating an EventSesion + adds or removes EventSlots as needed. + + Multiple EventSessions can happen at the same time at the same location, for + example we have both Meetups and Music Acts in the Bar Area in the evenings. + + EventSessions are used to allow submitters to specify speaker availability + when submitting, and to assist and validate event scheduling (auto and manual). + """ + + class Meta: + ordering = ["when", "event_type", "event_location"] + constraints = [ + # We do not want overlapping sessions for the same EventType/EventLocation combo. + ExclusionConstraint( + name="prevent_event_session_event_type_event_location_overlaps", + expressions=[ + ("when", RangeOperators.OVERLAPS), + ("event_location", RangeOperators.EQUAL), + ("event_type", RangeOperators.EQUAL), + ], + ), + ] + + camp = models.ForeignKey( + "camps.Camp", + related_name="event_sessions", + on_delete=models.PROTECT, + help_text="The Camp this EventSession belongs to", + ) + + event_type = models.ForeignKey( + "program.EventType", + on_delete=models.PROTECT, + related_name="event_sessions", + help_text="The type of event this session is for", + ) + + event_location = models.ForeignKey( + "program.EventLocation", + on_delete=models.PROTECT, + related_name="event_sessions", + help_text="The event location this session is for", + ) + + when = DateTimeRangeField( + help_text="A period of time where this type of event can be scheduled. Input format is YYYY-MM-DD HH:MM" + ) + + event_duration_minutes = models.PositiveIntegerField( + blank=True, + help_text="The duration of events in this EventSession. Defaults to the value from the EventType of this EventSession.", + ) + + description = models.TextField( + blank=True, help_text="Description of this session (optional).", + ) + + def __str__(self): + return f"EventSession for {self.event_type} in {self.event_location.name}: {self.when}" + + def save(self, **kwargs): + if not self.event_duration_minutes: + self.event_duration_minutes = self.event_type.event_duration_minutes + super().save(**kwargs) + + @property + def duration(self): + """ Just return a timedelta of the lenght of this Session """ + return self.when.upper - self.when.lower + + @property + def free_time(self): + """ Returns a timedelta of the free time in this Session. """ + return self.duration - timedelta( + minutes=self.event_duration_minutes * self.get_unavailable_slots().count() + ) + + def get_available_slots(self, count_autoscheduled_as_free=False, bounds="()"): + """ + Return a queryset of slots that have nothing scheduled, remember to consider + conflicting locations too. + """ + # do we want to count slots with autoscheduled Events as free or not? + if count_autoscheduled_as_free: + # a slot is available if nothing is scheduled, or if the event is autoscheduled + availablefilter = Q(event__isnull=True) | Q(autoscheduled=True) + # a slot is busy if something is manually scheduled + busyfilter = Q(autoscheduled=False) + else: + # a slot is available if nothing is scheduled + availablefilter = Q(event__isnull=True) + # a slot is busy if something is scheduled + busyfilter = Q(event__isnull=False) + + # get the times of all busy slots in the same or conflicting + # locations which overlap with this session + conflict_slot_times = self.camp.event_slots.filter( + # get slots at the same or a conflicting location + Q(event_session__event_location__in=self.event_location.conflicts.all()) + | Q(event_session__event_location=self.event_location), + # which have something scheduled in them + busyfilter, + # at the same time as this session + when__overlap=self.when, + ).values_list("when", flat=True) + + # build the excludefilter so we exclude any slots that overlap with any + # of our conflict_slot_times + excludefilter = Q() + for slot in conflict_slot_times: + # slot is a DateTimeTZRange with bounds "[)" + excludefilter |= Q(when__overlap=slot) + + # do the thing + return self.event_slots.filter(availablefilter).exclude(excludefilter) + + def get_unavailable_slots(self, count_autoscheduled_as_free=False, bounds="[)"): + """ Return a list of slots that are not available for some reason """ + return self.event_slots.exclude( + id__in=self.get_available_slots( + count_autoscheduled_as_free=count_autoscheduled_as_free, bounds=bounds, + ).values_list("id", flat=True), + ) + + def get_slot_times(self, bounds="[)"): + """ Return a list of the DateTimeTZRanges we want EventSlots to exists for """ + slots = [] + period = self.when + duration = timedelta(minutes=self.event_duration_minutes) + if period.upper - period.lower < duration: + # this period is shorter than the duration, no slots + return slots + + # create the first slot + slot = DateTimeTZRange(period.lower, period.lower + duration, bounds=bounds) + + # loop until we pass the end + while slot.upper < period.upper: + slots.append(slot) + # the next slot starts when this one ends + slot = DateTimeTZRange(slot.upper, slot.upper + duration, bounds=bounds) + + # append the final slot to the list unless it continues past the end + if not slot.upper > period.upper: + slots.append(slot) + return slots + + def fixup_event_slots(self): + """ This method takes care of creating and deleting EventSlots when the EventSession is created, updated or deleted """ + # get a set of DateTimeTZRange objects representing the EventSlots we need + needed_slot_times = set(self.get_slot_times(bounds="[)")) + + # get a set of DateTimeTZRange objects representing the EventSlots we have in DB + db_slot_times = set(self.event_slots.all().values_list("when", flat=True)) + + # loop over and delete unneeded slots + for slot in db_slot_times.difference(needed_slot_times): + self.event_slots.get(when=slot).delete() + + # loop over and create missing slots + for slot in needed_slot_times.difference(db_slot_times): + self.event_slots.create(event_session=self, when=slot) + + def scheduled_event_slots(self): + return self.event_slots.filter(event__isnull=False) + + +class EventSlot(CampRelatedModel): + """ + An EventSlot defines a window where we can schedule an Event. + + The EventType and EventLocation is defined by the EventSession this + EventSlot belongs to. EventSlots are created and deleted by a post_save + signal when the parent EventSession is created, updated or deleted. + + If the EventSession has a duration of 6 hours and event_duration_minutes=60 + then 6 instances of this model would exist for that EventSession. + """ + + class Meta: + ordering = ["when"] + constraints = [ + # we do not want overlapping slots for the same EventSession + ExclusionConstraint( + name="prevent_slot_session_overlaps", + expressions=[ + ("when", RangeOperators.OVERLAPS), + ("event_session", RangeOperators.EQUAL), + ], + ), + ] + + event_session = models.ForeignKey( + "program.EventSession", + related_name="event_slots", + on_delete=models.PROTECT, + help_text="The EventSession this EventSlot belongs to", + ) + + when = DateTimeRangeField(help_text="Start and end time of this slot",) + + event = models.ForeignKey( + "program.Event", + null=True, + blank=True, + related_name="event_slots", + on_delete=models.SET_NULL, + help_text="The Event scheduled in this EventSlot", + ) + + autoscheduled = models.NullBooleanField( + default=None, + help_text="True if the Event was scheduled by the AutoScheduler, False if it was scheduled manually, None if there is nothing scheduled in this EventSlot.", + ) + + @property + def camp(self): + return self.event_session.camp + + camp_filter = "event_session__camp" + + def __str__(self): + return f"{self.when} ({self.event_session.event_location.name}, {self.event_session.event_type})" + + def clean(self): + """ Validate EventSlot length, time, and autoscheduled status""" + if self.when.upper - self.when.lower != timedelta( + minutes=self.event_session.event_duration_minutes + ): + raise ValidationError( + f"This EventSlot has the wrong length. It must be {self.event_session.event_duration_minutes} minutes long." + ) + + # remember to use "[)" bounds when comparing + if self.when not in self.event_session.get_slot_times(bounds="[)"): + raise ValidationError( + "This EventSlot is not inside this EventSession, or it might be misaligned" + ) + + # if we have an Event we want to know if it was autoscheduled or not + if self.event and self.autoscheduled is None: + raise ValidationError( + "An EventSlot with a scheduled Event must have autoscheduled set to either True or False, not None" + ) + self.clean_speakers() + self.clean_location() + + def get_autoscheduler_slot(self): + """ Return a conference_scheduler.resources.Slot object matching this EventSlot """ + return resources.Slot( + venue=self.event_session.event_location.id, + starts_at=self.when.lower, + duration=int((self.when.upper - self.when.lower).total_seconds() / 60), + session=self.event_session.id, + capacity=self.event_session.event_location.capacity, + ) + + @property + def event_type(self): + return self.event_session.event_type + + @property + def event_location(self): + return self.event_session.event_location + + def clean_speakers(self): + """ Check if all speakers are available """ + if self.event: + for speaker in self.event.speakers.all(): + if not speaker.is_available( + when=self.when, ignore_event_slot_ids=[self.pk] + ): + raise ValidationError( + f"The speaker {speaker} is not available at this time" + ) + + def clean_location(self): + """ Make sure the location is available """ + if self.event: + if not self.event_location.is_available( + when=self.when, ignore_event_slot_ids=[self.pk] + ): + raise ValidationError( + f"The location {self.event_location} is not available at this time" + ) + + def unschedule(self): + """ Clear the Event FK and autoscheduled status, removing the Event from the schedule """ + self.event = None + self.autoscheduled = None + self.save() + + @property + def overflow(self): + """ If we have more demand than capacity return the overflow """ + if self.event and self.event.demand > self.event_location.capacity: + return (self.event_location.capacity - self.event.demand) * -1 + else: + return 0 + + @property + def duration(self): + return self.when.upper - self.when.lower + + @property + def duration_minutes(self): + return int(self.duration.total_seconds() // 60) + + def get_ics_event(self): + if not self.event: + return False + ievent = icalendar.Event() + ievent["summary"] = self.event.title + ievent["description"] = self.event.abstract + ievent["dtstart"] = icalendar.vDatetime(self.when.lower).to_ical() + ievent["dtend"] = icalendar.vDatetime( + self.when.lower + self.event.duration + ).to_ical() + ievent["dtstamp"] = icalendar.vDatetime(timezone.now()).to_ical() + ievent["uid"] = self.uuid + ievent["location"] = icalendar.vText(self.event_location.name) + return ievent + + @property + def uuid(self): + """ + Returns a consistent UUID for this EventSlot with this Event (if any). + + We want the UUID to be the same even if this EventSlot is deleted and replaced by + another at the same start time and location, so it cannot be a regular UUIDField. + We want the UUID to depend on event, location and start time, meaning if any of + these change we consider it a "schedule change" and create a new UUID. + + We create the UUID from 32 hex digits, which are the unix timestamp of the starttime, + the event id, and the location id, and the rest is padded with the event uuid as needed. + + Examples: + + # timestamp=1472374800 location_id=1 event_id=27 event_uuid=748316fa-78a5-4172-850b-341fc41ba2ba + In [1]: EventSlot.objects.filter(event__isnull=False).first().uuid + Out[1]: UUID('14723748-0012-7748-316f-a78a54172850') + + # timestamp=1472378400 location_id=3 event_id=0 event_uuid=00000000-0000-0000-0000-000000000000 + In [2]: EventSlot.objects.filter(event__isnull=True).first().uuid + Out[2]: UUID('14723784-0030-0000-0000-000000000000') + """ + # get starttime as unix timestamp, 10 bytes (until Sat, Nov. 20th 2286 at 18:46:40 CET) + start_timestamp = int(self.when.lower.timestamp()) + + # get location_id + location_id = self.event_location.id # 1-3? bytes + + # do we have an event? + if self.event: + event_id = self.event.id # 1-4? bytes + event_uuid = str(self.event.uuid).replace("-", "") + else: + event_id = 0 + event_uuid = "0" * 32 + + # put the start of the UUID together + uuidbase = f"{start_timestamp}{location_id}{event_id}" + + # pad using event_uuid up to 32 hex chars and return + return uuid.UUID(f"{uuidbase}{event_uuid[0:32-len(uuidbase)]}") + class Event(CampRelatedModel): """ Something that is on the program one or more times. """ + uuid = models.UUIDField( + default=uuid.uuid4, + unique=True, + editable=False, + help_text="This field is not the PK of the model. It is used to create EventSlot UUID for FRAB and iCal and other calendaring purposes.", + ) + title = models.CharField(max_length=255, help_text="The title of this event") abstract = models.TextField(help_text="The abstract for this event") @@ -550,6 +1205,7 @@ class Event(CampRelatedModel): event_type = models.ForeignKey( "program.EventType", help_text="The type of this event", + related_name="events", on_delete=models.PROTECT, ) @@ -583,17 +1239,39 @@ class Event(CampRelatedModel): editable=False, ) + duration_minutes = models.PositiveIntegerField( + default=None, + blank=True, + help_text="The duration of this event in minutes. Leave blank to use the default from the event_type.", + ) + + demand = models.PositiveIntegerField( + default=0, + help_text="The estimated demand for this event. Used by the autoscheduler to pick the optimal location for events. Set to 0 to disable demand constraints for this event.", + ) + + tags = TaggableManager() + class Meta: ordering = ["title"] unique_together = (("track", "slug"), ("track", "title")) def __str__(self): - return "%s (%s)" % (self.title, self.camp.title) + return self.title def save(self, **kwargs): + """ Create a slug and get duration """ if not self.slug: - self.slug = slugify(self.title) - super(Event, self).save(**kwargs) + self.slug = unique_slugify( + self.title, + slugs_in_use=self.__class__.objects.filter( + track__camp=self.track.camp + ).values_list("slug", flat=True), + ) + if not self.duration_minutes: + # we default to the duration of the event_type + self.duration_minutes = self.event_type.event_duration_minutes + super().save(**kwargs) @property def camp(self): @@ -634,9 +1312,13 @@ class Event(CampRelatedModel): return data + @property + def duration(self): + return timedelta(minutes=self.duration_minutes) + class EventInstance(CampRelatedModel): - """ An instance of an event """ + """ The old way of scheduling events. Model to be deleted after prod data migration """ uuid = models.UUIDField( default=uuid.uuid4, @@ -649,25 +1331,55 @@ class EventInstance(CampRelatedModel): "program.event", related_name="instances", on_delete=models.PROTECT ) - when = DateTimeRangeField() + when = DateTimeRangeField(null=True, blank=True) notifications_sent = models.BooleanField(default=False) location = models.ForeignKey( - "program.EventLocation", related_name="eventinstances", on_delete=models.PROTECT + "program.EventLocation", + related_name="eventinstances", + on_delete=models.PROTECT, + null=True, + blank=True, + ) + + autoscheduled = models.BooleanField( + default=False, help_text="True if this was created by the autoscheduler.", ) class Meta: ordering = ["when"] + # we do not want overlapping instances in the same location + constraints = [ + ExclusionConstraint( + name="prevent_eventinstance_location_overlaps", + expressions=[ + ("when", RangeOperators.OVERLAPS), + ("location", RangeOperators.EQUAL), + ], + ), + ] def __str__(self): return "%s (%s)" % (self.event, self.when) - def clean(self): - if self.location.camp != self.event.camp: - raise ValidationError( - {"location": "Error: This location belongs to a different camp"} - ) + def clean_speakers(self): + """ Check if all speakers are available """ + for speaker in self.event.speakers.all(): + if not speaker.is_available( + when=self.event_slot.when, ignore_eventinstances=[self.pk] + ): + raise ValidationError( + f"The speaker {speaker} is not available at this time" + ) + + def save(self, *args, clean_speakers=True, **kwargs): + """ Validate speakers (unless we are asked not to) """ + if "commit" not in kwargs or kwargs["commit"]: + # we are saving for real + if clean_speakers: + self.clean_speakers() + super().save(*args, **kwargs) @property def camp(self): @@ -738,6 +1450,26 @@ class EventInstance(CampRelatedModel): return data + @property + def duration(self): + """ Return a timedelta of the lenght of this EventInstance """ + return self.when.upper - self.when.lower + + @property + def overflow(self): + if self.event.demand > self.location.capacity: + return (self.location.capacity - self.event.demand) * -1 + else: + return 0 + + @property + def event_type(self): + return self.event_slot.event_session.event_type + + @property + def event_location(self): + return self.event_slot.event_session.event_location + class Speaker(CampRelatedModel): """ A Person (co)anchoring one or more events on a camp. """ @@ -783,6 +1515,12 @@ class Speaker(CampRelatedModel): help_text="Check if BornHack needs to provide a free one-day ticket for this speaker", ) + event_conflicts = models.ManyToManyField( + "program.Event", + related_name="speaker_conflicts", + help_text="The Events this person wishes to attend. The AutoScheduler will avoid conflicts.", + ) + class Meta: ordering = ["name"] unique_together = (("camp", "name"), ("camp", "slug")) @@ -792,8 +1530,13 @@ class Speaker(CampRelatedModel): def save(self, **kwargs): if not self.slug: - self.slug = slugify(self.name) - super(Speaker, self).save(**kwargs) + self.slug = unique_slugify( + self.name, + slugs_in_use=self.__class__.objects.filter(camp=self.camp).values_list( + "slug", flat=True + ), + ) + super().save(**kwargs) def get_absolute_url(self): return reverse_lazy( @@ -805,6 +1548,40 @@ class Speaker(CampRelatedModel): data = {"name": self.name, "slug": self.slug, "biography": self.biography} return data + def is_available(self, when, ignore_event_slot_ids=[]): + """ A speaker is available if the person has positive availability for the period and + if the speaker is not in another event at the time """ + if not self.availabilities.filter(when__contains=when, available=True).exists(): + # we have no positive availability for this speaker + return False + + # get all slots for this speaker which overlap with the period + slots = self.camp.event_slots.filter(event__speakers=self, when__overlap=when) + + # do we have any slots we want to ignore? + if ignore_event_slot_ids: + slots = slots.exclude(pk__in=ignore_event_slot_ids) + + if slots.exists(): + # speaker is in another event at this time + return False + + # speaker is available + return True + + def scheduled_event_slots(self): + """ Returns a QuerySet of all EventSlots scheduled for this speaker """ + return self.camp.event_slots.filter(event__speakers=self) + + @property + def title(self): + """ Convenience method to return the proper host_title """ + if self.events.values_list("event_type").distinct().count() > 1: + # we have different eventtypes, use generic title + return "Person" + else: + return self.events.first().event_type.host_title + class Favorite(models.Model): user = models.ForeignKey( @@ -874,7 +1651,7 @@ class EventFeedback(CampRelatedModel, UUIDModel): def get_absolute_url(self): return reverse( - "program:eventfeedback_detail", + "program:event_feedback_detail", kwargs={"camp_slug": self.camp.slug, "event_slug": self.event.slug}, ) diff --git a/src/program/schema.py b/src/program/schema.py index cb141eee..93b3b545 100644 --- a/src/program/schema.py +++ b/src/program/schema.py @@ -82,7 +82,7 @@ class UrlNode(DjangoObjectType): class Meta: model = Url interfaces = (relay.Node,) - only_fields = ("url", "urltype") + only_fields = ("url", "url_type") class UrlTypeNode(DjangoObjectType): diff --git a/src/program/signal_handlers.py b/src/program/signal_handlers.py index 07671d55..4a95e089 100644 --- a/src/program/signal_handlers.py +++ b/src/program/signal_handlers.py @@ -2,8 +2,6 @@ import logging from django.core.exceptions import ValidationError -from .email import add_event_scheduled_email - logger = logging.getLogger("bornhack.%s" % __name__) @@ -36,32 +34,6 @@ def check_speaker_event_camp_consistency(sender, instance, **kwargs): ) -def check_speaker_camp_change(sender, instance, **kwargs): - if instance.pk: - for event in instance.events.all(): - if event.camp != instance.camp: - raise ValidationError( - { - "camp": "You cannot change the camp a speaker belongs to if the speaker is associated with one or more events." - } - ) - - -def eventinstance_pre_save(sender, instance, **kwargs): - """ Save the old instance.when value so we can later determine if it changed """ - try: - # get the old instance from the database, if we have one - instance.old_when = sender.objects.get(pk=instance.pk).when - except sender.DoesNotExist: - # nothing found in the DB with this pk, this is a new eventinstance - instance.old_when = instance.when - - -def eventinstance_post_save(sender, instance, created, **kwargs): - """ Send an email if this is a new eventinstance, or if the "when" field changed """ - if created: - add_event_scheduled_email(eventinstance=instance, action="scheduled") - else: - if instance.old_when != instance.when: - # date/time for this eventinstance changed, send a rescheduled email - add_event_scheduled_email(eventinstance=instance, action="rescheduled") +def event_session_post_save(sender, instance, created, **kwargs): + """ Make sure we have the number of EventSlots we need to have, adjust if not """ + instance.fixup_event_slots() diff --git a/src/program/templates/combined_proposal_select_person.html b/src/program/templates/combined_proposal_select_person.html index a57fd5dd..7bcae5cf 100644 --- a/src/program/templates/combined_proposal_select_person.html +++ b/src/program/templates/combined_proposal_select_person.html @@ -1,25 +1,25 @@ {% extends 'program_base.html' %} {% block title %} -Use Existing {{ eventtype.host_title }} or Add New? | {{ block.super }} +Use Existing {{ event_type.host_title }} or Add New? | {{ block.super }} {% endblock %} {% block program_content %} -

Use Existing {{ eventtype.host_title }}?

+

Use Existing {{ event_type.host_title }}?

-

Pick a {{ eventtype.host_title }} from the list below, or press the button at the bottom to add a new {{ eventtype.host_title }} for this {{ eventtype.name }}.

+

Pick a {{ event_type.host_title }} from the list below, or press the button at the bottom to add a new {{ event_type.host_title }} for this {{ event_type.name }}.

-

Use an Existing {{ eventtype.host_title }}

+

Use an Existing {{ event_type.host_title }}

- {% for speakerproposal in speakerproposal_list %} - + {% for speaker_proposal in speaker_proposal_list %} +

- Use {{ speakerproposal.name }} as {{ eventtype.host_title }} + Use {{ speaker_proposal.name }} as {{ event_type.host_title }}

{% endfor %} @@ -27,7 +27,7 @@ Use Existing {{ eventtype.host_title }} or Add New? | {{ block.super }}
- Add New {{ eventtype.host_title }} + Add New {{ event_type.host_title }} Cancel {% endblock %} diff --git a/src/program/templates/combined_proposal_submit.html b/src/program/templates/combined_proposal_submit.html index aed9a73d..9749ad33 100644 --- a/src/program/templates/combined_proposal_submit.html +++ b/src/program/templates/combined_proposal_submit.html @@ -1,13 +1,21 @@ {% extends 'program_base.html' %} {% load bootstrap3 %} +{% load program %} {% block program_content %} -

Submit {{ camp.title }} {{ eventtype.name }}

+

Submit {{ camp.title }} {{ event_type.name }}

{% csrf_token %} {% for field in form %} - {% bootstrap_field field %} + {% if field.id_for_label == "id_speaker_proposal-submission_notes" %} + {% availabilitytable form=form.speaker_proposal matrix=matrix %} + {% bootstrap_field field %} + {% else %} + {% if field.name|slice:":12" != "availability" %} + {% bootstrap_field field %} + {% endif %} + {% endif %} {% endfor %} {% bootstrap_button "Submit for Review" button_type="submit" button_class="btn-primary" %} diff --git a/src/program/templates/emails/eventproposal_accepted.html b/src/program/templates/emails/event_proposal_accepted.html similarity index 100% rename from src/program/templates/emails/eventproposal_accepted.html rename to src/program/templates/emails/event_proposal_accepted.html diff --git a/src/program/templates/emails/eventproposal_accepted.txt b/src/program/templates/emails/event_proposal_accepted.txt similarity index 100% rename from src/program/templates/emails/eventproposal_accepted.txt rename to src/program/templates/emails/event_proposal_accepted.txt diff --git a/src/program/templates/emails/eventproposal_rejected.html b/src/program/templates/emails/event_proposal_rejected.html similarity index 100% rename from src/program/templates/emails/eventproposal_rejected.html rename to src/program/templates/emails/event_proposal_rejected.html diff --git a/src/program/templates/emails/eventproposal_rejected.txt b/src/program/templates/emails/event_proposal_rejected.txt similarity index 100% rename from src/program/templates/emails/eventproposal_rejected.txt rename to src/program/templates/emails/event_proposal_rejected.txt diff --git a/src/program/templates/emails/new_eventproposal.html b/src/program/templates/emails/new_event_proposal.html similarity index 60% rename from src/program/templates/emails/new_eventproposal.html rename to src/program/templates/emails/new_event_proposal.html index 1bdd67d1..20790f5d 100644 --- a/src/program/templates/emails/new_eventproposal.html +++ b/src/program/templates/emails/new_event_proposal.html @@ -3,7 +3,7 @@ Hello!
Event "{{ proposal.title }}" was just submitted as a new proposal for {{ proposal.camp }}.

-More info here. +More info here.
Best regards,

diff --git a/src/program/templates/emails/new_eventproposal.txt b/src/program/templates/emails/new_event_proposal.txt similarity index 60% rename from src/program/templates/emails/new_eventproposal.txt rename to src/program/templates/emails/new_event_proposal.txt index 6189875a..a927e38d 100644 --- a/src/program/templates/emails/new_eventproposal.txt +++ b/src/program/templates/emails/new_event_proposal.txt @@ -2,7 +2,7 @@ Hello! Event "{{ proposal.title }}" was just submitted as a new proposal for {{ proposal.camp }}. -More info: https://bornhack.dk/admin/program/eventproposal/{{ proposal.uuid }}/change/ +More info: https://bornhack.dk/admin/program/event_proposal/{{ proposal.uuid }}/change/ Best regards, diff --git a/src/program/templates/emails/new_speakerproposal.html b/src/program/templates/emails/new_speaker_proposal.html similarity index 60% rename from src/program/templates/emails/new_speakerproposal.html rename to src/program/templates/emails/new_speaker_proposal.html index ecedad75..a0e2252e 100644 --- a/src/program/templates/emails/new_speakerproposal.html +++ b/src/program/templates/emails/new_speaker_proposal.html @@ -3,7 +3,7 @@ Hello!
Speaker "{{ proposal.name }}" was just submitted as a new proposal for {{ proposal.camp }}.

-More info here. +More info here.
Best regards,

diff --git a/src/program/templates/emails/new_speakerproposal.txt b/src/program/templates/emails/new_speaker_proposal.txt similarity index 60% rename from src/program/templates/emails/new_speakerproposal.txt rename to src/program/templates/emails/new_speaker_proposal.txt index 584aadc2..51774aba 100644 --- a/src/program/templates/emails/new_speakerproposal.txt +++ b/src/program/templates/emails/new_speaker_proposal.txt @@ -2,7 +2,7 @@ Hello! Speaker "{{ proposal.name }}" was just submitted as a new proposal for {{ proposal.camp }}. -More info: https://bornhack.dk/admin/program/speakerproposal/{{ proposal.uuid }}/change/ +More info: https://bornhack.dk/admin/program/speaker_proposal/{{ proposal.uuid }}/change/ Best regards, diff --git a/src/program/templates/emails/speakerproposal_accepted.html b/src/program/templates/emails/speaker_proposal_accepted.html similarity index 100% rename from src/program/templates/emails/speakerproposal_accepted.html rename to src/program/templates/emails/speaker_proposal_accepted.html diff --git a/src/program/templates/emails/speakerproposal_accepted.txt b/src/program/templates/emails/speaker_proposal_accepted.txt similarity index 100% rename from src/program/templates/emails/speakerproposal_accepted.txt rename to src/program/templates/emails/speaker_proposal_accepted.txt diff --git a/src/program/templates/emails/speakerproposal_rejected.html b/src/program/templates/emails/speaker_proposal_rejected.html similarity index 100% rename from src/program/templates/emails/speakerproposal_rejected.html rename to src/program/templates/emails/speaker_proposal_rejected.html diff --git a/src/program/templates/emails/speakerproposal_rejected.txt b/src/program/templates/emails/speaker_proposal_rejected.txt similarity index 100% rename from src/program/templates/emails/speakerproposal_rejected.txt rename to src/program/templates/emails/speaker_proposal_rejected.txt diff --git a/src/program/templates/emails/update_eventproposal.html b/src/program/templates/emails/update_event_proposal.html similarity index 57% rename from src/program/templates/emails/update_eventproposal.html rename to src/program/templates/emails/update_event_proposal.html index dad21861..e5e5e59f 100644 --- a/src/program/templates/emails/update_eventproposal.html +++ b/src/program/templates/emails/update_event_proposal.html @@ -3,7 +3,7 @@ Hello!
Event "{{ proposal.title }}" for {{ proposal.camp }} was just updated!

-More info here. +More info here.
Best regards,

diff --git a/src/program/templates/emails/update_eventproposal.txt b/src/program/templates/emails/update_event_proposal.txt similarity index 56% rename from src/program/templates/emails/update_eventproposal.txt rename to src/program/templates/emails/update_event_proposal.txt index 8c3d6351..1e590c0d 100644 --- a/src/program/templates/emails/update_eventproposal.txt +++ b/src/program/templates/emails/update_event_proposal.txt @@ -2,7 +2,7 @@ Hello! Event "{{ proposal.title }}" for {{ proposal.camp }} was just updated! -More info: https://bornhack.dk/admin/program/eventproposal/{{ proposal.uuid }}/change/ +More info: https://bornhack.dk/admin/program/event_proposal/{{ proposal.uuid }}/change/ Best regards, diff --git a/src/program/templates/emails/update_speakerproposal.html b/src/program/templates/emails/update_speaker_proposal.html similarity index 57% rename from src/program/templates/emails/update_speakerproposal.html rename to src/program/templates/emails/update_speaker_proposal.html index 64e4a213..49649581 100644 --- a/src/program/templates/emails/update_speakerproposal.html +++ b/src/program/templates/emails/update_speaker_proposal.html @@ -3,7 +3,7 @@ Hello!
Speaker "{{ proposal.name }}" for {{ proposal.camp }} was just updated!

-More info here. +More info here.
Best regards,

diff --git a/src/program/templates/emails/update_speakerproposal.txt b/src/program/templates/emails/update_speaker_proposal.txt similarity index 61% rename from src/program/templates/emails/update_speakerproposal.txt rename to src/program/templates/emails/update_speaker_proposal.txt index 052b236e..ff8f81a9 100644 --- a/src/program/templates/emails/update_speakerproposal.txt +++ b/src/program/templates/emails/update_speaker_proposal.txt @@ -2,7 +2,7 @@ Hello! Speaker "{{ proposal.name }}" was just submitted as a new speaker proposal for {{ proposal.camp }}. -More info: https://bornhack.dk/admin/program/speakerproposal/{{ proposal.uuid }}/change/ +More info: https://bornhack.dk/admin/program/speaker_proposal/{{ proposal.uuid }}/change/ Best regards, diff --git a/src/program/templates/event_detail.html b/src/program/templates/event_detail.html new file mode 100644 index 00000000..b43c777e --- /dev/null +++ b/src/program/templates/event_detail.html @@ -0,0 +1,75 @@ +{% extends 'program_base.html' %} +{% load commonmark %} +{% load program %} +{% block program_content %} + + + +
+
+ + {{ event.title }} + + Feedback +
+
+

+ {{ event.abstract|untrustedcommonmark }} +

+ +
+ + {% if event.speakers.exists %} +

{{ event.event_type.host_title }}s for {{ event.title }}:

+ + {% endif %} + +
+ +

Metadata for {{ event.title }}

+ To be recorded: + + + {% if event.video_recording %} + + {% else %} + + {% endif %} + + {{ event.video_recording|yesno:"Yes,No" }} +
+ +

URLs for {{ event.title }}

+ {% if event.urls.exists %} + {% for url in event.urls.all %} +

{{ url.url_type }}: {{ url.url }}

+ {% endfor %} + {% else %} +

No URLs found.

+ {% endif %} + +
+ +

Schedule for {{ event.title }}

+
    + {% for slot in event.event_slots.all %} +
  • {{ slot.when.lower }} - {{ slot.when.upper }} at {{ slot.event_location.name }}
  • + {% empty %} + Not scheduled yet + {% endfor %} +
+
+
+{% endblock program_content %} diff --git a/src/program/templates/eventfeedback_delete.html b/src/program/templates/event_feedback_delete.html similarity index 60% rename from src/program/templates/eventfeedback_delete.html rename to src/program/templates/event_feedback_delete.html index 54cd3d94..4f9f8499 100644 --- a/src/program/templates/eventfeedback_delete.html +++ b/src/program/templates/event_feedback_delete.html @@ -5,7 +5,7 @@ {% block program_content %}

Delete Your Feedback?

-{% include 'includes/eventfeedback_detail_panel.html' %} +{% include 'includes/event_feedback_detail_panel.html' %}
{% csrf_token %} @@ -13,6 +13,6 @@ Delete Feedback - Cancel + Cancel {% endblock program_content %} diff --git a/src/program/templates/eventfeedback_detail.html b/src/program/templates/event_feedback_detail.html similarity index 50% rename from src/program/templates/eventfeedback_detail.html rename to src/program/templates/event_feedback_detail.html index 0898c6b7..8590eb5a 100644 --- a/src/program/templates/eventfeedback_detail.html +++ b/src/program/templates/event_feedback_detail.html @@ -2,6 +2,6 @@ {% load commonmark %} {% block program_content %} -{% include 'includes/eventfeedback_detail_panel.html' with buttoninclude="includes/eventfeedback_buttons.html"%} +{% include 'includes/event_feedback_detail_panel.html' with buttoninclude="includes/event_feedback_buttons.html"%} {% endblock program_content %} diff --git a/src/program/templates/eventfeedback_form.html b/src/program/templates/event_feedback_form.html similarity index 62% rename from src/program/templates/eventfeedback_form.html rename to src/program/templates/event_feedback_form.html index 86fc80b7..cae1c950 100644 --- a/src/program/templates/eventfeedback_form.html +++ b/src/program/templates/event_feedback_form.html @@ -3,13 +3,13 @@ {% load bootstrap3 %} {% block program_content %} -

{% if request.resolver_match.url_name == "eventfeedback_update" %}Update{% else %}Submit{% endif %} Feedback for {{ camp.title }} event: {{ event.title }}

+

{% if request.resolver_match.url_name == "event_feedback_update" %}Update{% else %}Submit{% endif %} Feedback for {{ camp.title }} event: {{ event.title }}

{% csrf_token %} {% bootstrap_form form %} Cancel diff --git a/src/program/templates/eventfeedback_list.html b/src/program/templates/event_feedback_list.html similarity index 61% rename from src/program/templates/eventfeedback_list.html rename to src/program/templates/event_feedback_list.html index 9a55e93a..12098b36 100644 --- a/src/program/templates/eventfeedback_list.html +++ b/src/program/templates/event_feedback_list.html @@ -3,9 +3,9 @@ {% block program_content %}

Feedback List

-

This is a list of all the approved feedback for your {{ camp.title }} event {{ event.title }}. We currently have feedback from {{ eventfeedback_list|length }} users.

+

This is a list of all the approved feedback for your {{ camp.title }} event {{ event.title }}. We currently have feedback from {{ event_feedback_list|length }} users.

-{% for eventfeedback in eventfeedback_list %} -{% include 'includes/eventfeedback_detail_panel.html' %} +{% for event_feedback in event_feedback_list %} +{% include 'includes/event_feedback_detail_panel.html' %} {% endfor %} {% endblock program_content %} diff --git a/src/program/templates/event_list.html b/src/program/templates/event_list.html index 3ffa9d94..0d946ef0 100644 --- a/src/program/templates/event_list.html +++ b/src/program/templates/event_list.html @@ -1,60 +1,10 @@ {% extends 'program_base.html' %} -{% load program %} {% block program_content %} {% if event_list %} -

- An alphabetical list of all talks, workshops, keynotes and other events - at {{ camp.title }}. The list does not include facilities like bar opening hours. -

- -
Number
- - - - - - - {% if not user.is_anonymous %} - - {% endif %} - - - - {% for event in event_list %} - {% if event.event_type.include_in_event_list %} - - - - - - {% if not user.is_anonymous %} - - {% endif %} - - {% endif %} - {% endfor %} - -
TypeTitleSpeakersScheduledFeedback
- - {{ event.event_type.name }} - - - {{ event.title }} - - {% for speaker in event.speakers.all %} - {{ speaker.name }}
- {% empty %} - N/A - {% endfor %} -
- {% for instance in event.instances.all %} - {{ instance.when.lower }}
- {% empty %} - No instances scheduled yet - {% endfor %} -
{% feedbackbutton %}
+

A list of all talks, workshops, keynotes and other events at {{ camp.title }}.

+ {% include "includes/event_list_table.html" %} {% else %} -

No events for {{ camp.title }} yet!

+

No events for {{ camp.title }} yet!

{% endif %} {% endblock program_content %} diff --git a/src/program/templates/event_proposal_add_person.html b/src/program/templates/event_proposal_add_person.html index ee8a65a5..187fe958 100644 --- a/src/program/templates/event_proposal_add_person.html +++ b/src/program/templates/event_proposal_add_person.html @@ -2,14 +2,17 @@ {% load bootstrap3 %} {% block program_content %} -

Add {{ eventproposal.event_type.host_title }} {{ speakerproposal.name }} to {{ eventproposal.title }}

- -

Really add {{ speakerproposal.name }} as {{ eventproposal.event_type.host_title }} for {{ eventproposal.title }}? - - {% csrf_token %} - {% bootstrap_form form %} - {% bootstrap_button " Yes" button_type="submit" button_class="btn-success" %} - Cancel - +

+
Add {{ event_proposal.event_type.host_title }} {{ speaker_proposal.name }} to {{ event_proposal.title }}?
+
+

Really add {{ speaker_proposal.name }} as {{ event_proposal.event_type.host_title }} for {{ event_proposal.title }}? +

+ {% csrf_token %} + {% bootstrap_form form %} + {% bootstrap_button " Yes" button_type="submit" button_class="btn-success" %} + Cancel +
+
+
{% endblock program_content %} diff --git a/src/program/templates/event_proposal_detail.html b/src/program/templates/event_proposal_detail.html new file mode 100644 index 00000000..4b73bf14 --- /dev/null +++ b/src/program/templates/event_proposal_detail.html @@ -0,0 +1,107 @@ +{% extends 'program_base.html' %} +{% load commonmark %} +{% load bornhack %} + +{% block program_content %} +{% if not camp.call_for_participation_open %} +
+ Note! This Call for Participation is not open. It is no longer possible to make changes to this proposal. +
+{% endif %} + +
+
{{ event_proposal.event_type.name }} Proposal: {{ event_proposal.title }}
+
+ {{ event_proposal.abstract|untrustedcommonmark }} + + {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} + Update Abstract +
+ {% endif %} + +
+ +

Details for {{ event_proposal.title }}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Title{{ event_proposal.title }}
UUID{{ event_proposal.uuid }}
Status{{ event_proposal.proposal_status }}
Duration{{ event_proposal.duration }} minutes
Tags + {% for tag in event_proposal.tags.all %} + {{ tag }} + {% empty %} + N/A + {% endfor %} +
Use provided laptop?{{ event_proposal.use_provided_speaker_laptop|truefalseicon }}
Submission Notes{{ event_proposal.submission_notes|untrustedcommonmark|default:"N/A" }}
+ + {% if camp.call_for_participation_open %} + Update Details +
+ {% endif %} + +
+ +

URLs for {{ event_proposal.title }}

+ {% if event_proposal.urls.exists %} + {% include 'includes/event_proposal_url_table.html' %} + {% else %} + Nothing found. + {% endif %} + {% if camp.call_for_participation_open %} + Add URL +
+ {% endif %} + +
+ +

{{ event_proposal.event_type.host_title }} Proposals for {{ event_proposal.title }}

+ {% if event_proposal.speakers.exists %} + {% include 'includes/speaker_proposal_table.html' with speaker_proposals=event_proposal.speakers.all %} + {% else %} + Nothing found. + {% endif %} + {% if camp.call_for_participation_open and not camp.read_only %} + {% if event_proposal.get_available_speaker_proposals.exists %} + Add {{ event_proposal.event_type.host_title }} + {% else %} + Add {{ event_proposal.event_type.host_title }} + {% endif %} + {% endif %} +
+
+ +

+ Back to List + {% if camp.call_for_participation_open %} + Delete + {% endif %} +

+ +{% endblock program_content %} diff --git a/src/program/templates/eventproposal_form.html b/src/program/templates/event_proposal_form.html similarity index 99% rename from src/program/templates/eventproposal_form.html rename to src/program/templates/event_proposal_form.html index c806a7ba..64be9fb6 100644 --- a/src/program/templates/eventproposal_form.html +++ b/src/program/templates/event_proposal_form.html @@ -7,6 +7,7 @@ {% else %}

{% if object %}Update{% else %}Create{% endif %} {{ camp.title }} {{ event_type.name }}

{% endif %} +
{% csrf_token %} {% bootstrap_form form %} diff --git a/src/program/templates/event_proposal_remove_person.html b/src/program/templates/event_proposal_remove_person.html index dd1ebcae..d78ff4e1 100644 --- a/src/program/templates/event_proposal_remove_person.html +++ b/src/program/templates/event_proposal_remove_person.html @@ -2,13 +2,13 @@ {% load bootstrap3 %} {% block program_content %} -

Remove "{{ speakerproposal.name }}" from "{{ eventproposal.title }}"?

-

Really remove this {{ eventproposal.event_type.host_title }} from this event?

+

Remove "{{ speaker_proposal.name }}" from "{{ event_proposal.title }}"?

+

Really remove this {{ event_proposal.event_type.host_title }} from this event?

{% csrf_token %} {% bootstrap_button " Remove" button_type="submit" button_class="btn-danger" %} - Cancel + Cancel
{% endblock program_content %} diff --git a/src/program/templates/event_proposal_select_person.html b/src/program/templates/event_proposal_select_person.html index 3c77bde4..ae1f590a 100644 --- a/src/program/templates/event_proposal_select_person.html +++ b/src/program/templates/event_proposal_select_person.html @@ -1,25 +1,25 @@ {% extends 'program_base.html' %} {% block title %} -Add {{ eventproposal.event_type.host_title }} to {{ eventproposal.title }} | {{ block.super }} +Add {{ event_proposal.event_type.host_title }} | {{ block.super }} {% endblock %} {% block program_content %} -

Add New {{ eventproposal.event_type.host_title }} to {{ eventproposal.title }}

+

Add New {{ event_proposal.event_type.host_title }} to {{ event_proposal.title }}

-

You are adding a new {{ eventproposal.event_type.host_title }} to {{ eventproposal.title }}. Either pick an existing {{ eventproposal.event_type.host_title }} from the list below, or press the button to create a new {{ eventproposal.event_type.host_title }}.

+

Either pick an existing {{ event_proposal.event_type.host_title }} from the list below, or press the button to create a new {{ event_proposal.event_type.host_title }}. Note: If you need to add a {{ event_proposal.event_type.host_title }} which was not submitted by yourself you need to tell the Content Team.

-

Existing Artists

+

Existing {{ event_proposal.event_type.host_title }}s

- {% for speakerproposal in speakerproposal_list %} - + {% for speaker_proposal in speaker_proposal_list %} +

- Add {{ speakerproposal.name }} to {{ eventproposal.title }} + Add {{ speaker_proposal.name }} to {{ event_proposal.title }}

{% endfor %} @@ -27,7 +27,7 @@ Add {{ eventproposal.event_type.host_title }} to {{ eventproposal.title }} | {{
- Add New {{ eventproposal.event_type.host_title }} + Add New {{ event_proposal.event_type.host_title }} Cancel {% endblock %} diff --git a/src/program/templates/eventproposal_detail.html b/src/program/templates/eventproposal_detail.html deleted file mode 100644 index 0620be0b..00000000 --- a/src/program/templates/eventproposal_detail.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends 'program_base.html' %} - -{% block program_content %} - -{% if not camp.call_for_participation_open %} -
- Note! This Call for Participation is not open. -
-{% endif %} - -

Details for {{ eventproposal.title }}

- -{% include 'includes/eventproposal_detail.html' %} - -

- Back to List - {% if camp.call_for_participation_open and not camp.read_only %} - Delete - {% endif %} -

- -{% endblock program_content %} diff --git a/src/program/templates/includes/event_feedback_buttons.html b/src/program/templates/includes/event_feedback_buttons.html new file mode 100644 index 00000000..94737383 --- /dev/null +++ b/src/program/templates/includes/event_feedback_buttons.html @@ -0,0 +1,6 @@ + Back to Event + + Update Feedback + + Delete Feedback + diff --git a/src/program/templates/includes/eventfeedback_detail_panel.html b/src/program/templates/includes/event_feedback_detail_panel.html similarity index 62% rename from src/program/templates/includes/eventfeedback_detail_panel.html rename to src/program/templates/includes/event_feedback_detail_panel.html index f9d0ab15..2ae3a9c1 100644 --- a/src/program/templates/includes/eventfeedback_detail_panel.html +++ b/src/program/templates/includes/event_feedback_detail_panel.html @@ -6,45 +6,45 @@
- {% if request.resolver_match.url_name == "approve_eventfeedback" %} + {% if request.resolver_match.url_name == "approve_event_feedback" %} - + {% endif %} - + - + - + - + - + - + - +
Username (feedback submitter){{ eventfeedback.user.username }}{{ event_feedback.user.username }}
Were Your Expectations Fulfilled?{{ eventfeedback.expectations_fulfilled|yesno }}{{ event_feedback.expectations_fulfilled|yesno }}
Would You Attend the Same Speaker Again?{{ eventfeedback.attend_speaker_again|yesno }}{{ event_feedback.attend_speaker_again|yesno }}
Rating (0-5)?{{ eventfeedback.rating }}/5{{ event_feedback.rating }}/5
Created{{ eventfeedback.created }}{{ event_feedback.created }}
Updated{{ eventfeedback.updated|default:"N/A" }}{{ event_feedback.updated|default:"N/A" }}
Approved{{ eventfeedback.approved|yesno }}{{ event_feedback.approved|yesno }}
Comment{{ eventfeedback.comment|default:"N/A"|untrustedcommonmark }}{{ event_feedback.comment|default:"N/A"|untrustedcommonmark }}
{% if form %} diff --git a/src/program/templates/includes/event_list_table.html b/src/program/templates/includes/event_list_table.html new file mode 100644 index 00000000..754596fe --- /dev/null +++ b/src/program/templates/includes/event_list_table.html @@ -0,0 +1,52 @@ +{% load program %} +{% load bornhack %} + + + + + + + + + + + + + + {% for event in event_list %} + {% if event.event_type.include_in_event_list %} + + + + + + + + + {% endif %} + {% endfor %} + +
Event Main TitleEvent TypeTagsSpeakersScheduled
+ {{ event.title }} + + {{ event.event_type.name }} + + + {% for tag in event.tags.all %} + {{ tag }}
+ {% empty %} + N/A + {% endfor %} +
+ {% for speaker in event.speakers.all %} + {{ speaker.name }}
+ {% empty %} + N/A + {% endfor %} +
{{ event.video_recording|truefalseicon }} + {% for slot in event.event_slots.all %} + {{ slot.event_location.icon_html }} {{ slot.event_location.name }} at {{ slot.when.lower }}
+ {% empty %} + Not scheduled yet + {% endfor %} +
diff --git a/src/program/templates/includes/event_proposal_table.html b/src/program/templates/includes/event_proposal_table.html index d8cd6299..44e017d4 100644 --- a/src/program/templates/includes/event_proposal_table.html +++ b/src/program/templates/includes/event_proposal_table.html @@ -14,33 +14,33 @@ - {% for eventproposal in eventproposals %} + {% for event_proposal in event_proposals %} - {{ eventproposal.title }} - {{ eventproposal.event_type }} - {% for url in eventproposal.urls.all %} - {% empty %}N/A{% endfor %} + {{ event_proposal.title }} + {{ event_proposal.event_type }} + {% for url in event_proposal.urls.all %} + {% empty %}N/A{% endfor %} - {% for person in eventproposal.speakers.all %} + {% for person in event_proposal.speakers.all %} {% if request.resolver_match.app_name == "program" %} - + {% else %} {% endif %} {% endfor %} - {{ eventproposal.track.name }} - {{ eventproposal.proposal_status }} + {{ event_proposal.track.name }} + {{ event_proposal.proposal_status }} - {% if eventproposal.event %} - Show Event + {% if event_proposal.event %} + Show Event {% else %} {% endif %} {% if request.resolver_match.app_name == "program" %} - + Details diff --git a/src/program/templates/includes/event_proposal_type_select.html b/src/program/templates/includes/event_proposal_type_select.html index 0a5d3d9d..4ed7e019 100644 --- a/src/program/templates/includes/event_proposal_type_select.html +++ b/src/program/templates/includes/event_proposal_type_select.html @@ -10,17 +10,17 @@

To submit content for {{ camp.title }} please begin by selecting the type of event below:

{% endif %} diff --git a/src/program/templates/includes/event_proposal_url_table.html b/src/program/templates/includes/event_proposal_url_table.html new file mode 100644 index 00000000..4222633a --- /dev/null +++ b/src/program/templates/includes/event_proposal_url_table.html @@ -0,0 +1,25 @@ + + + + + + {% if not camp.read_only and request.resolver_match.app_name == "program" and event_proposal.user == request.user %} + + {% endif %} + + + + {% for url in event_proposal.urls.all %} + + + + + + {% endfor %} + +
TypeURLAvailable Actions
{{ url.url_type.name }}{{ url }} + {% if not camp.read_only and request.resolver_match.app_name == "program" and event_proposal.user == request.user %} + Update + Delete + {% endif %} +
diff --git a/src/program/templates/includes/eventfeedback_buttons.html b/src/program/templates/includes/eventfeedback_buttons.html deleted file mode 100644 index decd66df..00000000 --- a/src/program/templates/includes/eventfeedback_buttons.html +++ /dev/null @@ -1,6 +0,0 @@ - Back to Event - - Update Feedback - - Delete Feedback - diff --git a/src/program/templates/includes/eventproposal_detail.html b/src/program/templates/includes/eventproposal_detail.html deleted file mode 100644 index 693f6eee..00000000 --- a/src/program/templates/includes/eventproposal_detail.html +++ /dev/null @@ -1,64 +0,0 @@ -{% load commonmark %} - -
-
- Title: {{ eventproposal.title }}
- ID: {{ eventproposal.uuid }}
- Status: {{ eventproposal.proposal_status }}
- Duration: {{ eventproposal.duration|default:"Not defined" }}
- {% if eventproposal.event_type.name == "Lightning Talk" %} - Use provided laptop?: {{ eventproposal.use_provided_speaker_laptop }}
- {% endif %} -
-
- - -
-
Abstract
-
- {{ eventproposal.abstract|untrustedcommonmark }} - {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} - Modify - {% endif %} -
-
- -
-
Notes
-
- {{ eventproposal.submission_notes|untrustedcommonmark }} -
-
- -
-
URLs
-
- {% if eventproposal.urls.exists %} - {% include 'includes/eventproposalurl_table.html' %} - {% else %} - Nothing found. - {% endif %} - {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} - Add URL - {% endif %} -
-
- -
-
{{ eventproposal.event_type.host_title }} List
-
- {% if eventproposal.speakers.exists %} - {% include 'includes/speaker_proposal_table.html' with speakerproposals=eventproposal.speakers.all %} - {% else %} - Nothing found. - {% endif %} - {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} - {% if eventproposal.get_available_speakerproposals.exists %} - Add {{ eventproposal.event_type.host_title }} - {% else %} - Add {{ eventproposal.event_type.host_title }} - {% endif %} - {% endif %} -
-
- diff --git a/src/program/templates/includes/eventproposalurl_table.html b/src/program/templates/includes/eventproposalurl_table.html deleted file mode 100644 index 0208a8ad..00000000 --- a/src/program/templates/includes/eventproposalurl_table.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - {% if not camp.read_only and request.resolver_match.app_name == "program" and eventproposal.user == request.user %} - - {% endif %} - - - - {% for url in eventproposal.urls.all %} - - - - - - {% endfor %} - -
TypeURLAvailable Actions
{{ url.urltype.name }}{{ url }} - {% if not camp.read_only and request.resolver_match.app_name == "program" and eventproposal.user == request.user %} - Update - Delete - {% endif %} -
diff --git a/src/program/templates/includes/speaker_proposal_table.html b/src/program/templates/includes/speaker_proposal_table.html index e2589fbf..9b233689 100644 --- a/src/program/templates/includes/speaker_proposal_table.html +++ b/src/program/templates/includes/speaker_proposal_table.html @@ -13,41 +13,41 @@ - {% for speakerproposal in speakerproposals %} + {% for speaker_proposal in speaker_proposals %} - {{ speakerproposal.name }} - {{ speakerproposal.email }} + {{ speaker_proposal.name }} + {{ speaker_proposal.email }} - {% if speakerproposal.eventproposals.all %} - {% for ep in speakerproposal.eventproposals.all %} - + {% if speaker_proposal.event_proposals.all %} + {% for ep in speaker_proposal.event_proposals.all %} + {% endfor %} {% else %} N/A {% endif %} - {% for url in speakerproposal.urls.all %} - + {% for url in speaker_proposal.urls.all %} + {% empty %} N/A {% endfor %} - {{ speakerproposal.proposal_status }} + {{ speaker_proposal.proposal_status }} - {% if speakerproposal.speaker %} - Show Speaker + {% if speaker_proposal.speaker %} + Show Speaker {% else %} {% endif %} {% if request.resolver_match.app_name == "program" %} - + Details - {% if camp.call_for_participation_open and not camp.read_only and eventproposal and eventproposal.speakers.count > 1 %} - Remove {{ eventproposal.event_type.host_title }} + {% if camp.call_for_participation_open and not camp.read_only and event_proposal and event_proposal.speakers.count > 1 %} + Remove {{ event_proposal.event_type.host_title }} {% endif %} {% endif %} diff --git a/src/program/templates/includes/speakerproposalurl_table.html b/src/program/templates/includes/speaker_proposal_url_table.html similarity index 51% rename from src/program/templates/includes/speakerproposalurl_table.html rename to src/program/templates/includes/speaker_proposal_url_table.html index db01bae9..abdb2e41 100644 --- a/src/program/templates/includes/speakerproposalurl_table.html +++ b/src/program/templates/includes/speaker_proposal_url_table.html @@ -2,21 +2,21 @@ Type - URLs + URL {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} Available Actions {% endif %} - {% for url in speakerproposal.urls.all %} + {% for url in speaker_proposal.urls.all %} - {{ url.urltype.name }} + {{ url.url_type.name }} {{ url }} {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} - Update - Delete + Update + Delete {% endif %} diff --git a/src/program/templates/includes/speakerproposal_detail.html b/src/program/templates/includes/speakerproposal_detail.html deleted file mode 100644 index f3eba71e..00000000 --- a/src/program/templates/includes/speakerproposal_detail.html +++ /dev/null @@ -1,40 +0,0 @@ -{% load commonmark %} -
-
{{ speakerproposal.name }}
-
- {{ speakerproposal.biography|untrustedcommonmark }} - {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} - Modify - {% endif %} -
- -
- -
-
URLs for {{ speakerproposal.name }}
-
- {% if speakerproposal.urls.exists %} - {% include 'includes/speakerproposalurl_table.html' %} - {% else %} - Nothing found. - {% endif %} - {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} - Add URL - {% endif %} -
-
- -
-
Events for {{ speakerproposal.name }}
-
- {% if speakerproposal.eventproposals.exists %} - {% include 'includes/event_proposal_table.html' with eventproposals=speakerproposal.eventproposals.all %} - {% else %} - Nothing found. - {% endif %} - {% if camp.call_for_participation_open and not camp.read_only and request.resolver_match.app_name == "program" %} - Add New Event - {% endif %} -
-
- diff --git a/src/program/templates/noscript_schedule_view.html b/src/program/templates/noscript_schedule_view.html index 29ed2a53..827f13f3 100644 --- a/src/program/templates/noscript_schedule_view.html +++ b/src/program/templates/noscript_schedule_view.html @@ -6,39 +6,44 @@ {% block program_content %}
- +

Schedule for {{ camp.title }}. All times are {{ event_slots.0.when.lower|date:"T" }}!

+ - {% for instance in eventinstances %} - - {% ifchanged instance.when.lower.date %} - - - - {% endifchanged %} - + {% for slot in event_slots %} + {% ifchanged slot.when.lower.date %} - + + + {% endifchanged %} + + + + + - - {% endfor %}
When? What? Where? TypeTags
{{ instance.when.lower.date|date:"l Y-m-d" }}
{{ instance.when.lower|date:"H:i" }}-{{ instance.when.upper|date:"H:i" }}{{ slot.when.lower.date|date:"l Y-m-d" }}
{{ slot.when.lower|date:"H:i" }}-{{ slot.when.upper|date:"H:i" }} - - {{ instance.event.title }} + + {{ slot.event.title }} + {{ slot.event_location.icon_html }} {{ slot.event_location.name }}{{ slot.event_type.icon_html }} {{ slot.event.event_type }} + {% for tag in slot.event.tags.all %} + {{ tag }} + {% empty %} + N/A + {% endfor %} {{ instance.location.name }}{{ instance.event.event_type }}
-
{% endblock %} diff --git a/src/program/templates/program_base.html b/src/program/templates/program_base.html index 13d6d3e2..28afdb44 100644 --- a/src/program/templates/program_base.html +++ b/src/program/templates/program_base.html @@ -2,7 +2,7 @@ {% block content %} -{% with url_name=request.resolver_match.url_name proposal_urls="proposal_list,speakerproposal_create,speakerproposal_detail,speakerproposal_update,speakerproposal_submit,speakerproposal_picture,eventproposal_create,eventproposal_detail,eventproposal_update,eventproposal_submit" %} +{% with url_name=request.resolver_match.url_name proposal_urls="proposal_list,speaker_proposal_create,speaker_proposal_detail,speaker_proposal_update,speaker_proposal_submit,speaker_proposal_picture,event_proposal_create,event_proposal_detail,event_proposal_update,event_proposal_submit" %}