PonyConf/proposals/views.py

187 lines
6.7 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
from django.core.urlresolvers import reverse
2016-07-03 20:39:29 +00:00
from django.db.models import Q
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, UpdateView
2016-07-06 16:30:15 +00:00
from django.http import JsonResponse
from django.core.exceptions import ObjectDoesNotExist
2016-06-07 20:59:13 +00:00
2016-07-06 16:30:15 +00:00
from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin, SuperuserRequiredMixin
from accounts.models import Participation
from accounts.utils import is_orga
2016-07-06 16:30:15 +00:00
from .forms import TalkForm, TopicForm
from .models import Talk, Topic, Vote
2016-07-03 20:39:29 +00:00
from .utils import allowed_talks
2016-07-06 16:19:00 +00:00
from .signals import *
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):
return render(request, 'proposals/talks.html', {
'my_talks': Talk.on_site.filter(Q(speakers=request.user) | Q(proposer=request.user)).distinct(),
2016-07-03 20:39:29 +00:00
'other_talks': allowed_talks(Talk.on_site.exclude(speakers=request.user, proposer=request.user), request)
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-07-03 20:39:29 +00:00
talks = allowed_talks(Talk.on_site.filter(topics=topic), request)
return render(request, 'proposals/talk_list.html', {'title': 'Talks related to %s:' % topic, 'talk_list': talks})
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:
2016-06-25 14:27:35 +00:00
talk = get_object_or_404(Talk, slug=talk, site=get_current_site(request))
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
else:
form.fields['speakers'].initial = [request.user]
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()
2016-07-06 16:19:00 +00:00
talk_edited.send(talk.__class__, instance=talk, author=request.user)
2016-06-07 20:59:13 +00:00
messages.success(request, 'Talk modified successfully!')
else:
form.instance.site = get_current_site(request)
form.instance.proposer = request.user
talk = form.save()
2016-07-06 16:19:00 +00:00
talk_added.send(talk.__class__, instance=talk, author=request.user)
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()
def get_context_data(self, **ctx):
user = self.request.user
if self.object.is_moderable_by(user):
vote = Vote.objects.filter(talk=self.object, user=Participation.on_site.get(user=user)).first()
ctx.update(edit_perm=True, moderate_perm=True, vote=vote,
form_url=reverse('talk-conversation', kwargs={'talk': self.object.slug}))
else:
ctx['edit_perm'] = self.object.is_editable_by(user)
return super().get_context_data(**ctx)
2016-06-07 20:59:13 +00:00
2016-06-11 13:47:08 +00:00
2016-07-06 16:30:15 +00:00
class TopicMixin(object):
2016-06-12 16:35:59 +00:00
model = Topic
2016-07-06 16:30:15 +00:00
queryset = Topic.on_site.all()
form_class = TopicForm
2016-06-07 20:59:13 +00:00
2016-06-11 13:47:08 +00:00
2016-07-06 16:30:15 +00:00
class TopicList(LoginRequiredMixin, TopicMixin, ListView):
pass
2016-07-06 16:30:15 +00:00
class TopicCreate(OrgaRequiredMixin, TopicMixin, CreateView):
def form_valid(self, form):
form.instance.site = get_current_site(self.request)
return super(TopicCreate, self).form_valid(form)
2016-07-06 16:30:15 +00:00
class TopicUpdate(SuperuserRequiredMixin, TopicMixin, UpdateView):
pass
2016-07-06 16:30:15 +00:00
class TopicDetail(StaffRequiredMixin, TopicMixin, DetailView):
pass
2016-07-06 16:30:15 +00:00
@login_required
def topic_add_reviewer(request, slug):
if not Participation.objects.get(user=request.user).is_orga():
raise PermissionDenied()
topic = get_object_or_404(Topic, slug=slug)
if request.method == 'POST':
user = request.POST.get('user')
try:
user = User.objects.get(username=user)
except ObjectDoesNotExist:
messages.error(request, 'User not found.')
else:
participation, created = Participation.on_site.get_or_create(user=user, site=get_current_site(request))
if participation in topic.reviewers.all():
messages.info(request, 'User is already a reviewer of this topic.')
else:
topic.reviewers.add(participation)
topic.save()
messages.success(request, 'User add to reviewer of this topic successfully.')
return redirect(topic.get_absolute_url())
else:
term = request.GET.get('term')
if not term:
raise Http404()
query = Q(username__icontains=term) \
| Q(first_name__icontains=term) \
| Q(last_name__icontains=term)
users = User.objects \
.exclude(id__in=topic.reviewers.values('user__id')) \
.filter(query)[:10]
response = []
for user in users:
response += [{
'label': str(user.profile),
'value': user.username,
}]
return JsonResponse(response, safe=False)
@login_required
def topic_remove_reviewer(request, slug, username):
if not Participation.objects.get(user=request.user).is_orga():
raise PermissionDenied()
topic = get_object_or_404(Topic, slug=slug)
participation = get_object_or_404(Participation, user__username=username)
topic.reviewers.remove(participation)
return redirect(topic.get_absolute_url())
2016-06-25 13:43:33 +00:00
class SpeakerList(StaffRequiredMixin, ListView):
queryset = Participation.on_site.filter(user__talk__in=Talk.on_site.all()).distinct()
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
@login_required
def vote(request, talk, score):
site = get_current_site(request)
talk = get_object_or_404(Talk, site=site, slug=talk)
user = Participation.on_site.get(user=request.user)
if not talk.is_moderable_by(request.user):
raise PermissionDenied()
vote, created = Vote.objects.get_or_create(talk=talk, user=user)
vote.vote = int(score)
vote.save()
messages.success(request, "Vote successfully %s" % ('created' if created else 'updated'))
return redirect(talk.get_absolute_url())
2016-06-07 20:59:13 +00:00
@login_required
def user_details(request, username):
speaker = get_object_or_404(User, username=username)
2016-06-07 20:59:13 +00:00
return render(request, 'proposals/user_details.html', {
'profile': speaker.profile,
'talk_list': allowed_talks(Talk.on_site.filter(speakers=speaker), request),
2016-06-07 20:59:13 +00:00
})