Files @ d7ac51055503
Branch filter:

Location: symposion_app/symposion/schedule/views.py - annotation

Brian Rosner
Added Slot.content_override

Slots can now be controlled through content_override if custom content is
needed in non-talk slots.
7c102aefa3a5
b48d66fd9de6
db908372fffb
b48d66fd9de6
0a4e626dfe9b
d6a59f2e4f3b
d6a59f2e4f3b
db908372fffb
13bc9ffacb95
7601791e8cd0
0a4e626dfe9b
0a4e626dfe9b
1b2cdeffb0e9
0a4e626dfe9b
d6a59f2e4f3b
bec6903ca1c9
1b3ef8d4247d
1b3ef8d4247d
0a4e626dfe9b
0a4e626dfe9b
0a4e626dfe9b
0a4e626dfe9b
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
d6a59f2e4f3b
6a1e59812adf
6a1e59812adf
6a1e59812adf
0a4e626dfe9b
0a4e626dfe9b
6a1e59812adf
0a4e626dfe9b
7601791e8cd0
0a4e626dfe9b
0a4e626dfe9b
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
1b2cdeffb0e9
13bc9ffacb95
c47907b29ee5
13bc9ffacb95
13bc9ffacb95
13bc9ffacb95
13bc9ffacb95
13bc9ffacb95
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
b48d66fd9de6
d6a59f2e4f3b
0a4e626dfe9b
d6a59f2e4f3b
d6a59f2e4f3b
d6a59f2e4f3b
d6a59f2e4f3b
1b2cdeffb0e9
d6a59f2e4f3b
f3e9cc9a5db3
f3e9cc9a5db3
0a4e626dfe9b
0a4e626dfe9b
f3e9cc9a5db3
0a4e626dfe9b
7601791e8cd0
db908372fffb
db908372fffb
d6a59f2e4f3b
1b2cdeffb0e9
d6a59f2e4f3b
d6a59f2e4f3b
d6a59f2e4f3b
d6a59f2e4f3b
1b2cdeffb0e9
db908372fffb
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
7c102aefa3a5
f98a3f2f9a46
7c102aefa3a5
7c102aefa3a5
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
d354e2b0176b
7c102aefa3a5
f98a3f2f9a46
7c102aefa3a5
1b2cdeffb0e9
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
1b3ef8d4247d
1b3ef8d4247d
1b3ef8d4247d
1b3ef8d4247d
1b3ef8d4247d
1b3ef8d4247d
1b3ef8d4247d
1b3ef8d4247d
1b3ef8d4247d
1b3ef8d4247d
from django.core.exceptions import ObjectDoesNotExist
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 symposion.schedule.forms import SlotEditForm
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_detail(request, slug=None):
    schedule = fetch_schedule(slug)
    
    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).order_by("id")
    
    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(mimetype="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)
    
    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_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)
    
    # slot content
    try:
        content = slot.content
    except ObjectDoesNotExist:
        content = None
    
    if request.method == "POST":
        form = SlotEditForm(request.POST, content=content)
        if form.is_valid():
            presentation = form.cleaned_data["presentation"]
            if presentation is None:
                slot.unassign()
            else:
                slot.assign(presentation)
        return redirect("schedule_edit")
    else:
        form = SlotEditForm(content=content)
        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)
    
    ctx = {
        "presentation": presentation,
    }
    return render(request, "schedule/presentation_detail.html", ctx)