PonyConf/proposals/views.py

106 lines
3.5 KiB
Python
Raw Normal View History

2016-06-07 20:59:13 +00:00
from django.contrib import messages
2016-06-11 13:47:08 +00:00
from django.contrib.auth.decorators import login_required
2016-06-12 16:35:59 +00:00
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
2016-06-11 13:47:08 +00:00
from django.contrib.sites.shortcuts import get_current_site
2016-06-07 20:59:13 +00:00
from django.core.exceptions import PermissionDenied
2016-06-11 13:47:08 +00:00
from django.shortcuts import get_object_or_404, redirect, render
from django.views.generic import CreateView, DetailView, ListView
2016-06-07 20:59:13 +00:00
from accounts.mixins import StaffRequiredMixin
from accounts.models import Participation
2016-06-11 13:47:08 +00:00
from proposals.forms import TalkForm
2016-06-12 21:39:04 +00:00
from proposals.models import Speech, Talk, Topic
2016-06-14 21:58:04 +00:00
from .signals import new_talk
2016-06-07 20:59:13 +00:00
def home(request):
return render(request, 'proposals/home.html')
2016-06-11 13:47:08 +00:00
2016-06-07 20:59:13 +00:00
@login_required
def talk_list(request):
participation = Participation.on_site.get(user=request.user)
2016-06-07 20:59:13 +00:00
return render(request, 'proposals/talks.html', {
'my_talks': Talk.on_site.filter(speakers=request.user),
'other_talks': Talk.on_site.exclude(speakers=request.user).filter(topics__reviewers=participation),
2016-06-07 20:59:13 +00:00
})
2016-06-11 13:47:08 +00:00
2016-06-07 20:59:13 +00:00
@login_required
def talk_list_by_topic(request, topic):
2016-06-12 16:35:59 +00:00
topic = get_object_or_404(Topic, slug=topic)
2016-06-07 20:59:13 +00:00
return render(request, 'proposals/talk_list.html', {
2016-06-12 16:35:59 +00:00
'title': 'Talks related to %s:' % topic,
2016-06-12 19:09:52 +00:00
'talk_list': Talk.on_site.filter(topics=topic),
2016-06-07 20:59:13 +00:00
})
2016-06-11 13:47:08 +00:00
2016-06-07 20:59:13 +00:00
@login_required
def talk_list_by_speaker(request, speaker):
speaker = get_object_or_404(User, username=speaker)
2016-06-07 20:59:13 +00:00
return render(request, 'proposals/talk_list.html', {
2016-06-11 15:28:39 +00:00
'title': 'Talks with %s:' % speaker,
2016-06-12 19:09:52 +00:00
'talk_list': Talk.on_site.filter(speakers=speaker),
2016-06-07 20:59:13 +00:00
})
2016-06-11 13:47:08 +00:00
2016-06-07 20:59:13 +00:00
@login_required
def talk_edit(request, talk=None):
if talk:
talk = get_object_or_404(Talk, slug=talk)
if talk.site != get_current_site(request):
raise PermissionDenied()
if not talk.is_editable_by(request.user):
2016-06-07 20:59:13 +00:00
raise PermissionDenied()
form = TalkForm(request.POST or None, instance=talk)
if talk:
form.fields['title'].disabled = True
form.fields['topics'].disabled = True
2016-06-07 20:59:13 +00:00
if request.method == 'POST' and form.is_valid():
if hasattr(talk, 'id'):
2016-06-07 20:59:13 +00:00
talk = form.save()
messages.success(request, 'Talk modified successfully!')
else:
talk = form.save(commit=False)
2016-06-14 21:58:04 +00:00
talk.site = get_current_site(request)
talk.proposer = request.user
2016-06-07 20:59:13 +00:00
talk.save()
2016-06-12 19:09:52 +00:00
form.save_m2m()
2016-06-12 21:39:04 +00:00
Speech.objects.create(speaker=request.user, talk=talk)
2016-06-14 21:58:04 +00:00
new_talk.send(talk.__class__, instance=talk)
2016-06-07 20:59:13 +00:00
messages.success(request, 'Talk proposed successfully!')
2016-06-12 16:35:59 +00:00
return redirect(talk.get_absolute_url())
2016-06-07 20:59:13 +00:00
return render(request, 'proposals/talk_edit.html', {
'form': form,
})
2016-06-11 13:47:08 +00:00
2016-06-12 16:35:59 +00:00
class TalkDetail(LoginRequiredMixin, DetailView):
queryset = Talk.on_site.all()
2016-06-14 21:58:04 +00:00
def get_context_data(self, **kwargs):
return super().get_context_data(edit_perm=self.object.is_editable_by(self.request.user), **kwargs)
2016-06-07 20:59:13 +00:00
2016-06-11 13:47:08 +00:00
2016-06-12 16:35:59 +00:00
class TopicList(LoginRequiredMixin, ListView):
model = Topic
2016-06-07 20:59:13 +00:00
2016-06-11 13:47:08 +00:00
class TopicCreate(StaffRequiredMixin, CreateView):
model = Topic
fields = ['name']
2016-06-25 13:43:33 +00:00
class SpeakerList(StaffRequiredMixin, ListView):
2016-06-12 21:39:04 +00:00
queryset = User.objects.filter(speech__talk=Talk.on_site.all())
2016-06-12 19:09:52 +00:00
template_name = 'proposals/speaker_list.html'
2016-06-08 21:22:23 +00:00
2016-06-11 13:47:08 +00:00
2016-06-07 20:59:13 +00:00
@login_required
def user_details(request, username):
return render(request, 'proposals/user_details.html', {
'user': get_object_or_404(User, username=username).profile,
2016-06-07 20:59:13 +00:00
})