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

239 lines
8 KiB
Python

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 reports_list(request):
return render(request, 'symposion/speakers/reports_list.html')
@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
@login_required
@user_passes_test(lambda u: u.is_staff)
def speaker_talks_report(request):
query = """
SELECT speaker.name speaker, email, telephone, COUNT(*) num_talks, STRING_agg(title, '; ') tracks
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
GROUP BY speaker.id, auth_user.id
ORDER BY num_talks desc
"""
response = HttpResponse(content_type='text/csv')
filename = 'speaker_talks_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
@login_required
@user_passes_test(lambda u: u.is_staff)
def presentations_report(request):
query = """
SELECT day.date,
room.name AS room,
start,
"end",
slot.name AS slot,
p.title,
s.name AS "primary speaker",
STRING_AGG(s2.name, ', ') AS "additional speakers"
FROM symposion_schedule_presentation p
INNER JOIN symposion_speakers_speaker s ON p.speaker_id = s.id
LEFT OUTER JOIN symposion_schedule_presentation_additional_speakers a ON p.id = a.presentation_id
LEFT OUTER JOIN symposion_speakers_speaker s2 ON a.speaker_id = s2.id
INNER JOIN symposion_schedule_slot slot ON p.slot_id = slot.id
INNER JOIN symposion_schedule_day day ON slot.day_id = day.id
INNER JOIN symposion_schedule_slotroom sr ON slot.id = sr.slot_id
INNER JOIN symposion_schedule_room room ON sr.room_id = room.id
GROUP BY p.id,
s.id,
slot.id,
day.id,
room.id
"""
response = HttpResponse(content_type='text/csv')
filename = 'presentations_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