symposion_app/symposion/schedule/views.py
Patrick Altman f3614fcf52 Merge branch 'master' of https://github.com/pyohio/symposion into pyohio-master
Conflicts:
	README.md
	symposion/boxes/urls.py
	symposion/cms/urls.py
	symposion/proposals/actions.py
	symposion/proposals/urls.py
	symposion/proposals/views.py
	symposion/reviews/tests.py
	symposion/reviews/urls.py
	symposion/reviews/views.py
	symposion/schedule/forms.py
	symposion/schedule/models.py
	symposion/schedule/views.py
	symposion/speakers/fixture_gen.py
	symposion/sponsorship/urls.py
	symposion/templates/cms/file_create.html
	symposion/templates/cms/file_index.html
	symposion/templates/conference/user_list.html
	symposion/templates/dashboard.html
	symposion/templates/emails/proposal_new_message/message.html
	symposion/templates/emails/proposal_updated/message.html
	symposion/templates/emails/speaker_addition/message.html
	symposion/templates/emails/speaker_invite/message.html
	symposion/templates/proposals/_pending_proposal_row.html
	symposion/templates/proposals/_proposal_fields.html
	symposion/templates/proposals/_proposal_row.html
	symposion/templates/proposals/proposal_cancel.html
	symposion/templates/proposals/proposal_detail.html
	symposion/templates/proposals/proposal_edit.html
	symposion/templates/proposals/proposal_speaker_manage.html
	symposion/templates/proposals/proposal_submit.html
	symposion/templates/reviews/_review_table.html
	symposion/templates/reviews/base.html
	symposion/templates/reviews/result_notification.html
	symposion/templates/reviews/result_notification_prepare.html
	symposion/templates/reviews/review_admin.html
	symposion/templates/reviews/review_assignment.html
	symposion/templates/reviews/review_detail.html
	symposion/templates/reviews/review_review.html
	symposion/templates/reviews/review_stats.html
	symposion/templates/schedule/_edit_grid.html
	symposion/templates/schedule/_grid.html
	symposion/templates/schedule/_slot_edit.html
	symposion/templates/schedule/presentation_detail.html
	symposion/templates/schedule/schedule_list.html
	symposion/templates/speakers/speaker_create.html
	symposion/templates/speakers/speaker_edit.html
	symposion/templates/speakers/speaker_profile.html
	symposion/templates/sponsorship/add.html
	symposion/templates/sponsorship/apply.html
	symposion/templates/sponsorship/detail.html
	symposion/templates/sponsorship/list.html
	symposion/templates/teams/team_detail.html
2014-12-15 16:07:37 -06:00

233 lines
7 KiB
Python

import json
from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponse
from django.shortcuts import render, get_object_or_404, redirect
from django.template import loader, Context
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.contrib.sites.models import Site
from symposion.schedule.forms import SlotEditForm, ScheduleSectionForm
from symposion.schedule.models import Schedule, Day, Slot, Presentation
from symposion.schedule.timetable import TimeTable
def fetch_schedule(slug):
qs = Schedule.objects.all()
if slug is None:
if qs.count() > 1:
raise Http404()
schedule = next(iter(qs), None)
if schedule is None:
raise Http404()
else:
schedule = get_object_or_404(qs, section__slug=slug)
return schedule
def schedule_conference(request):
schedules = Schedule.objects.filter(published=True, hidden=False)
sections = []
for schedule in schedules:
days_qs = Day.objects.filter(schedule=schedule)
days = [TimeTable(day) for day in days_qs]
sections.append({
"schedule": schedule,
"days": days,
})
ctx = {
"sections": sections,
}
return render(request, "schedule/schedule_conference.html", ctx)
def schedule_detail(request, slug=None):
schedule = fetch_schedule(slug)
if not schedule.published and not request.user.is_staff:
raise Http404()
days_qs = Day.objects.filter(schedule=schedule)
days = [TimeTable(day) for day in days_qs]
ctx = {
"schedule": schedule,
"days": days,
}
return render(request, "schedule/schedule_detail.html", ctx)
def schedule_list(request, slug=None):
schedule = fetch_schedule(slug)
presentations = Presentation.objects.filter(section=schedule.section)
presentations = presentations.exclude(cancelled=True)
ctx = {
"schedule": schedule,
"presentations": presentations,
}
return render(request, "schedule/schedule_list.html", ctx)
def schedule_list_csv(request, slug=None):
schedule = fetch_schedule(slug)
presentations = Presentation.objects.filter(section=schedule.section)
presentations = presentations.exclude(cancelled=True).order_by("id")
response = HttpResponse(content_type="text/csv")
if slug:
file_slug = slug
else:
file_slug = "presentations"
response["Content-Disposition"] = 'attachment; filename="%s.csv"' % file_slug
response.write(loader.get_template("schedule/schedule_list.csv").render(Context({
"presentations": presentations,
})))
return response
@login_required
def schedule_edit(request, slug=None):
if not request.user.is_staff:
raise Http404()
schedule = fetch_schedule(slug)
if request.method == "POST":
form = ScheduleSectionForm(
request.POST, request.FILES, schedule=schedule
)
if form.is_valid():
if 'submit' in form.data:
msg = form.build_schedule()
elif 'delete' in form.data:
msg = form.delete_schedule()
messages.add_message(request, msg[0], msg[1])
else:
form = ScheduleSectionForm(schedule=schedule)
days_qs = Day.objects.filter(schedule=schedule)
days = [TimeTable(day) for day in days_qs]
ctx = {
"schedule": schedule,
"days": days,
"form": form
}
return render(request, "schedule/schedule_edit.html", ctx)
@login_required
def schedule_slot_edit(request, slug, slot_pk):
if not request.user.is_staff:
raise Http404()
slot = get_object_or_404(Slot, day__schedule__section__slug=slug, pk=slot_pk)
if request.method == "POST":
form = SlotEditForm(request.POST, slot=slot)
if form.is_valid():
save = False
if "content_override" in form.cleaned_data:
slot.content_override = form.cleaned_data["content_override"]
save = True
if "presentation" in form.cleaned_data:
presentation = form.cleaned_data["presentation"]
if presentation is None:
slot.unassign()
else:
slot.assign(presentation)
if save:
slot.save()
return redirect("schedule_edit", slug)
else:
form = SlotEditForm(slot=slot)
ctx = {
"slug": slug,
"form": form,
"slot": slot,
}
return render(request, "schedule/_slot_edit.html", ctx)
def schedule_presentation_detail(request, pk):
presentation = get_object_or_404(Presentation, pk=pk)
if presentation.slot:
schedule = presentation.slot.day.schedule
else:
schedule = None
ctx = {
"presentation": presentation,
"schedule": schedule,
}
return render(request, "schedule/presentation_detail.html", ctx)
def schedule_json(request):
slots = Slot.objects.filter(
day__schedule__published=True,
day__schedule__hidden=False
).order_by("start")
protocol = request.META.get('HTTP_X_FORWARDED_PROTO', 'http')
data = []
for slot in slots:
slot_data = {
"room": ", ".join(room["name"] for room in slot.rooms.values()),
"rooms": [room["name"] for room in slot.rooms.values()],
"start": slot.start_datetime.isoformat(),
"end": slot.end_datetime.isoformat(),
"duration": slot.length_in_minutes,
"kind": slot.kind.label,
"section": slot.day.schedule.section.slug,
"conf_key": slot.pk,
# TODO: models should be changed.
# these are model features from other conferences that have forked symposion
# these have been used almost everywhere and are good candidates for
# base proposals
"license": "CC BY",
"tags": "",
"released": True,
"contact": [],
}
if hasattr(slot.content, "proposal"):
slot_data.update({
"name": slot.content.title,
"authors": [s.name for s in slot.content.speakers()],
"contact": [
s.email for s in slot.content.speakers()
] if request.user.is_staff else ["redacted"],
"abstract": slot.content.abstract.raw,
"description": slot.content.description.raw,
"conf_url": "%s://%s%s" % (
protocol,
Site.objects.get_current().domain,
reverse("schedule_presentation_detail", args=[slot.content.pk])
),
"cancelled": slot.content.cancelled,
})
else:
slot_data.update({
"name": slot.content_override.raw if slot.content_override else "Slot",
})
data.append(slot_data)
return HttpResponse(
json.dumps({'schedule': data}),
content_type="application/json"
)