Files @ 1fccc11354e7
Branch filter:

Location: symposion_app/vendor/symposion/symposion/speakers/views.py

bsturmfels
Add report for reviewing speakers/talks across all tracks
import csv
import datetime

from django.contrib.auth.decorators import user_passes_test
from django.core.exceptions import ObjectDoesNotExist
from django.db import connection
from django.http import Http404, HttpResponse
from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.clickjacking import xframe_options_exempt

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth import get_user_model
from django.utils.translation import ugettext_lazy as _

from symposion.proposals.models import ProposalBase
from symposion.speakers.forms import SpeakerForm
from symposion.speakers.models import Speaker

User = get_user_model()


@login_required
def speaker_create(request):
    try:
        return redirect(request.user.speaker_profile)
    except ObjectDoesNotExist:
        pass

    if request.method == "POST":
        try:
            speaker = Speaker.objects.get(invite_email=request.user.email)
            found = True
        except Speaker.DoesNotExist:
            speaker = None
            found = False
        form = SpeakerForm(request.POST, request.FILES, instance=speaker)

        if form.is_valid():
            speaker = form.save(commit=False)
            speaker.user = request.user
            if not found:
                speaker.invite_email = None
            speaker.save()
            messages.success(request, _("Speaker profile created."))
            return redirect("dashboard")
    else:
        form = SpeakerForm(initial={"name": request.user.get_full_name()})
    return render(request, "symposion/speakers/speaker_create.html", {
        "speaker_form": form,
    })


@login_required
def speaker_create_staff(request, pk):
    user = get_object_or_404(User, pk=pk)
    if not request.user.is_staff:
        raise Http404

    try:
        return redirect(user.speaker_profile)
    except ObjectDoesNotExist:
        pass

    if request.method == "POST":
        form = SpeakerForm(request.POST, request.FILES)

        if form.is_valid():
            speaker = form.save(commit=False)
            speaker.user = user
            speaker.save()
            messages.success(request, _("Speaker profile created."))
            return redirect("user_list")
    else:
        form = SpeakerForm(initial={"name": user.get_full_name()})

    return render(request, "symposion/speakers/speaker_create.html", {
        "speaker_form": form,
    })


@login_required
def speaker_create_token(request, token):
    speaker = get_object_or_404(Speaker, invite_token=token)
    request.session["pending-token"] = token
    # check for speaker profile
    try:
        existing_speaker = request.user.speaker_profile
    except ObjectDoesNotExist:
        pass
    else:
        del request.session["pending-token"]
        additional_speakers = ProposalBase.additional_speakers.through
        additional_speakers._default_manager.filter(
            speaker=speaker
        ).update(
            speaker=existing_speaker
        )
        messages.info(request, _("You have been associated with all pending "
                                 "talk proposals"))
        return redirect("dashboard")
    return redirect("speaker_create")


@login_required
def speaker_edit(request, pk=None):
    if pk is None:
        try:
            speaker = request.user.speaker_profile
        except Speaker.DoesNotExist:
            return redirect("speaker_create")
    else:
        if request.user.is_staff:
            speaker = get_object_or_404(Speaker, pk=pk)
        else:
            raise Http404()

    if request.method == "POST":
        form = SpeakerForm(request.POST, request.FILES, instance=speaker)
        if form.is_valid():
            form.save()
            messages.success(request, "Speaker profile updated.")
            return redirect("dashboard")
    else:
        form = SpeakerForm(instance=speaker)

    return render(request, "symposion/speakers/speaker_edit.html", {
        "speaker_form": form,
    })


@xframe_options_exempt
def speaker_profile(request, pk):
    speaker = get_object_or_404(Speaker, pk=pk)
    presentations = speaker.all_presentations
    if not presentations and not request.user.is_staff:
        raise Http404()

    return render(request, "symposion/speakers/speaker_profile.html", {
        "speaker": speaker,
        "presentations": presentations,
    })


@login_required
@user_passes_test(lambda u: u.is_staff)
def speaker_track_report(request):
    query = """
        SELECT speaker.name speaker, email, telephone, kind.name track, title
        FROM symposion_proposals_proposalbase
        INNER JOIN symposion_speakers_speaker speaker ON speaker_id = speaker.id
        INNER JOIN symposion_proposals_proposalkind kind ON kind_id = kind.id
        INNER JOIN auth_user ON user_id = auth_user.id
        ORDER BY speaker.name, title, track
    """
    response = HttpResponse(content_type='text/csv')
    filename = 'speaker_track_report-{}.csv'.format(
        datetime.datetime.now().strftime('%Y-%m-%d'),
    )
    response['Content-Disposition'] = f'attachment; filename={filename}'
    writer = csv.writer(response)
    with connection.cursor() as cursor:
        cursor.execute(query)
        writer.writerow([i[0] for i in cursor.description])
        for row in cursor.fetchall():
            writer.writerow(row)
    return response