Files @ 1fccc11354e7
Branch filter:

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

bsturmfels
Add report for reviewing speakers/talks across all tracks
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
2b7f5546a094
1fccc11354e7
1fccc11354e7
2b7f5546a094
ef420b2d4300
2b7f5546a094
2b7f5546a094
d5986de87043
252697b842c0
3207621058b8
2b7f5546a094
2b7f5546a094
347617ead3c3
2b7f5546a094
2b7f5546a094
252697b842c0
252697b842c0
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
36ab6d599ffc
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
36ab6d599ffc
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
3207621058b8
2b7f5546a094
2b7f5546a094
347617ead3c3
11f697d13757
11f697d13757
347617ead3c3
347617ead3c3
347617ead3c3
347617ead3c3
4c385bafd5b1
4c385bafd5b1
347617ead3c3
347617ead3c3
36ab6d599ffc
347617ead3c3
347617ead3c3
347617ead3c3
347617ead3c3
36ab6d599ffc
347617ead3c3
347617ead3c3
36ab6d599ffc
347617ead3c3
347617ead3c3
347617ead3c3
347617ead3c3
3207621058b8
347617ead3c3
347617ead3c3
347617ead3c3
36ab6d599ffc
11f697d13757
11f697d13757
2b7f5546a094
2b7f5546a094
2b7f5546a094
4a5e4dc6ea33
2b7f5546a094
2b7f5546a094
2b7f5546a094
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
2b7f5546a094
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
4a5e4dc6ea33
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
5944bb5577f2
2b7f5546a094
2b7f5546a094
2b7f5546a094
36ab6d599ffc
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
2b7f5546a094
36ab6d599ffc
11f697d13757
11f697d13757
2b7f5546a094
2b7f5546a094
2b7f5546a094
ef420b2d4300
9e794bd66a19
2b7f5546a094
c1ff1546fe43
c1ff1546fe43
2b7f5546a094
36ab6d599ffc
11f697d13757
2b7f5546a094
c1ff1546fe43
9e794bd66a19
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
1fccc11354e7
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