167 lines
5.3 KiB
Python
167 lines
5.3 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 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
|