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