PonyConf/proposals/views.py

201 lines
7.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-23 10:03:12 +00:00
from django.utils.translation import ugettext as _
from django.views.decorators.http import require_http_methods
from django.http import HttpResponse
2016-06-07 20:59:13 +00:00
2016-09-05 15:17:49 +00:00
from accounts.models import Participation
2016-07-11 19:33:34 +00:00
from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin
from accounts.decorators import orga_required
2016-09-05 15:17:49 +00:00
from conversations.models import ConversationWithParticipant, ConversationAboutTalk, Message
from .forms import TalkForm, TopicCreateForm, TopicUpdateForm, ConferenceForm
from .models import Talk, Topic, Vote, Conference
2016-07-11 19:33:34 +00:00
from .signals import talk_added, talk_edited
from .utils import allowed_talks, markdown_to_html
@login_required
@require_http_methods(["POST"])
def markdown_preview(request):
content = request.POST.get('data', '')
return HttpResponse(markdown_to_html(content))
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
@orga_required
def conference(request):
conference = Conference.objects.get(site=get_current_site(request))
form = ConferenceForm(request.POST or None, instance=conference)
if request.method == 'POST' and form.is_valid():
form.save()
messages.success(request, 'Conference updated!')
return redirect(reverse('conference'))
return render(request, 'proposals/conference.html', {
'conference': conference,
'form': form,
})
2016-06-07 20:59:13 +00:00
@login_required
def talk_list(request):
2016-07-11 19:33:34 +00:00
talks = Talk.objects.filter(site=get_current_site(request))
2016-06-07 20:59:13 +00:00
return render(request, 'proposals/talks.html', {
2016-07-11 19:33:34 +00:00
'my_talks': talks.filter(Q(speakers=request.user) | Q(proposer=request.user)).distinct(),
'other_talks': allowed_talks(talks.exclude(Q(speakers=request.user) | Q(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-09 19:30:49 +00:00
talks = allowed_talks(Talk.objects.filter(site=topic.site, topics=topic), request)
2016-07-23 10:03:12 +00:00
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, site=get_current_site(request))
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-07-23 10:03:12 +00:00
messages.success(request, _('Talk modified successfully!'))
2016-06-07 20:59:13 +00:00
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-07-23 10:03:12 +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):
2016-07-09 19:30:49 +00:00
def get_queryset(self):
return Talk.objects.filter(site=get_current_site(self.request)).all()
def get_context_data(self, **ctx):
2016-07-11 19:33:34 +00:00
if self.object.is_moderable_by(self.request.user):
vote = Vote.objects.filter(talk=self.object, user=self.request.user).first()
ctx.update(edit_perm=True, moderate_perm=True, vote=vote,
form_url=reverse('talk-conversation', kwargs={'talk': self.object.slug}))
else:
2016-07-11 19:33:34 +00:00
ctx['edit_perm'] = self.object.is_editable_by(self.request.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-07-09 19:30:49 +00:00
def get_queryset(self):
return Topic.objects.filter(site=get_current_site(self.request)).all()
2016-06-07 20:59:13 +00:00
2016-06-11 13:47:08 +00:00
2016-07-11 22:50:23 +00:00
class TopicFormMixin(object):
def get_form_kwargs(self):
kwargs = super(TopicFormMixin, self).get_form_kwargs()
2016-07-11 22:56:50 +00:00
if self.get_form_class() == TopicCreateForm:
kwargs.update({'site_id': get_current_site(self.request).id})
2016-07-11 22:50:23 +00:00
return kwargs
2016-07-06 16:30:15 +00:00
class TopicList(LoginRequiredMixin, TopicMixin, ListView):
pass
2016-07-11 22:50:23 +00:00
class TopicCreate(OrgaRequiredMixin, TopicMixin, TopicFormMixin, CreateView):
2016-07-11 19:33:34 +00:00
model = Topic
form_class = TopicCreateForm
2016-07-11 19:33:34 +00:00
2016-07-06 16:30:15 +00:00
def form_valid(self, form):
form.instance.site = get_current_site(self.request)
2016-07-11 19:33:34 +00:00
return super().form_valid(form)
2016-07-11 22:50:23 +00:00
class TopicUpdate(OrgaRequiredMixin, TopicMixin, TopicFormMixin, UpdateView):
def get_form_class(self):
return TopicCreateForm if self.request.user.is_superuser else TopicUpdateForm
2016-07-06 16:30:15 +00:00
2016-06-25 13:43:33 +00:00
class SpeakerList(StaffRequiredMixin, ListView):
2016-06-12 19:09:52 +00:00
template_name = 'proposals/speaker_list.html'
2016-06-08 21:22:23 +00:00
2016-07-09 19:30:49 +00:00
def get_queryset(self):
2016-07-11 19:33:34 +00:00
site = get_current_site(self.request)
return User.objects.filter(talk__in=Talk.objects.filter(site=site)).all().distinct()
2016-07-09 19:30:49 +00:00
2016-06-11 13:47:08 +00:00
@login_required
def vote(request, talk, score):
2016-07-11 19:33:34 +00:00
talk = get_object_or_404(Talk, site=get_current_site(request), slug=talk)
if not talk.is_moderable_by(request.user):
raise PermissionDenied()
2016-07-11 19:33:34 +00:00
vote, created = Vote.objects.get_or_create(talk=talk, user=request.user)
vote.vote = int(score)
vote.save()
2016-07-23 10:03:12 +00:00
messages.success(request, _('Vote successfully created') if created else _('Vote successfully updated'))
return redirect(talk.get_absolute_url())
@login_required
def talk_decide(request, talk, accepted):
2016-09-05 15:17:49 +00:00
site = get_current_site(request)
talk = get_object_or_404(Talk, site=site, slug=talk)
if not talk.is_moderable_by(request.user):
raise PermissionDenied()
if request.method == 'POST':
2016-09-05 15:17:49 +00:00
# Does we need to send a notification to the proposer?
m = request.POST.get('message', '').strip()
if m:
participation = Participation.objects.get(site=site, user=talk.proposer)
conversation = ConversationWithParticipant.objects.get(participation=participation)
Message.objects.create(conversation=conversation, author=request.user, content=m)
# Save the decision in the talk's conversation
conversation = ConversationAboutTalk.objects.get(talk=talk)
if accepted:
note = "The talk has been accepted."
else:
note = "The talk has been declined."
Message.objects.create(conversation=conversation, author=request.user, content=note)
talk.accepted = accepted
talk.save()
messages.success(request, _('Decision taken in account'))
return redirect('show-talk', slug=talk.slug)
return render(request, 'proposals/talk_decide.html', {
'talk': talk,
'accept': accepted,
})
2016-06-07 20:59:13 +00:00
@login_required
def user_details(request, username):
2016-09-14 20:31:57 +00:00
user = get_object_or_404(User, username=username)
participation = get_object_or_404(Participation, user=user, site=get_current_site(request))
2016-06-07 20:59:13 +00:00
return render(request, 'proposals/user_details.html', {
2016-09-14 20:31:57 +00:00
'profile': user.profile,
'participation': participation,
'talk_list': allowed_talks(Talk.objects.filter(site=get_current_site(request), speakers=user), request),
2016-06-07 20:59:13 +00:00
})