122 lines
3.9 KiB
Python
122 lines
3.9 KiB
Python
|
from django.conf import settings
|
||
|
from django.core.exceptions import ObjectDoesNotExist
|
||
|
from django.db.models import Q
|
||
|
from django.http import Http404, HttpResponse
|
||
|
from django.shortcuts import render, redirect, get_object_or_404
|
||
|
from django.template import RequestContext
|
||
|
|
||
|
from django.contrib import messages
|
||
|
from django.contrib.auth.decorators import login_required
|
||
|
|
||
|
from symposion.proposals.models import ProposalBase
|
||
|
from symposion.speakers.forms import SpeakerForm #, SignupForm
|
||
|
from symposion.speakers.models import Speaker
|
||
|
|
||
|
|
||
|
@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, "speakers/speaker_create.html", {
|
||
|
"form": form,
|
||
|
})
|
||
|
|
||
|
|
||
|
def speaker_create_token(request, token):
|
||
|
speaker = get_object_or_404(Speaker, invite_token=token)
|
||
|
request.session["pending-token"] = token
|
||
|
if request.user.is_authenticated():
|
||
|
# 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")
|
||
|
else:
|
||
|
if not request.user.is_authenticated():
|
||
|
return redirect("account_login")
|
||
|
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.groups.filter(name="organizer").exists(): # @@@
|
||
|
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, "speakers/speaker_edit.html", {
|
||
|
"form": form,
|
||
|
})
|
||
|
|
||
|
|
||
|
def speaker_profile(request, pk, template_name="speakers/speaker_profile.html", extra_context=None):
|
||
|
|
||
|
if extra_context is None:
|
||
|
extra_context = {}
|
||
|
|
||
|
speaker = get_object_or_404(Speaker, pk=pk)
|
||
|
|
||
|
# schedule may not be installed so we need to check for sessions
|
||
|
if hasattr(speaker, "sessions"):
|
||
|
sessions = speaker.sessions.exclude(slot=None).order_by("slot__start")
|
||
|
else:
|
||
|
sessions = []
|
||
|
|
||
|
if not sessions:
|
||
|
raise Http404()
|
||
|
|
||
|
return render_to_response(template_name, dict({
|
||
|
"speaker": speaker,
|
||
|
"sessions": sessions,
|
||
|
"timezone": settings.SCHEDULE_TIMEZONE,
|
||
|
}, **extra_context), context_instance=RequestContext(request))
|