gestiojeux/suggestions/views.py
2020-12-30 00:44:45 +01:00

87 lines
3 KiB
Python

from django.views.generic import ListView, DetailView, FormView, RedirectView
from django.views.generic.detail import SingleObjectMixin
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
from django.shortcuts import redirect
from django.db.models import Count
from comments.views import AddCommentView, ModifyCommentView
from .models import Suggestion, SuggestionComment
from .forms import AddSuggestionForm
class SuggestionListView(ListView):
model = Suggestion
template_name = "suggestions/suggestion_list.html"
def get_queryset(self):
return Suggestion.objects.annotate(
num_upvotes=Count("upvoting_users")
).order_by("-num_upvotes")
class AddSuggestionView(LoginRequiredMixin, FormView):
template_name = "suggestions/add_suggestion.html"
form_class = AddSuggestionForm
def form_valid(self, form):
suggestion = form.save()
suggestion.upvoting_users.add(self.request.user)
suggestion.comments.create(
author=self.request.user, text=form.cleaned_data["comment"]
)
messages.success(self.request, "Votre suggestion est enregistrée")
return redirect("suggestions:suggestion", suggestion.slug)
class SuggestionView(DetailView):
model = Suggestion
template_name = "suggestions/suggestion.html"
class UpvoteSuggestionView(LoginRequiredMixin, SingleObjectMixin, RedirectView):
model = Suggestion
pattern_name = "suggestions:suggestion"
def get_redirect_url(self, *args, **kwargs):
suggestion = self.get_object()
if self.request.user not in suggestion.upvoting_users.all():
suggestion.upvoting_users.add(self.request.user)
messages.success(
self.request, "Votre vote pour cette suggestion est enregistré"
)
else:
messages.error(self.request, "Vous avez déjà voté pour cette suggestion")
return super().get_redirect_url(*args, **kwargs)
class DownvoteSuggestionView(LoginRequiredMixin, SingleObjectMixin, RedirectView):
model = Suggestion
pattern_name = "suggestions:suggestion"
def get_redirect_url(self, *args, **kwargs):
suggestion = self.get_object()
if self.request.user in suggestion.upvoting_users.all():
suggestion.upvoting_users.remove(self.request.user)
messages.success(
self.request, "Votre vote pour cette suggestion a été retiré"
)
else:
messages.error(
self.request, "Vous ne votiez déjà pas pour cette suggestion"
)
return super().get_redirect_url(*args, **kwargs)
class AddSuggestionCommentView(AddCommentView):
model = Suggestion
comment_model = SuggestionComment
pattern_name = "suggestions:suggestion"
class ModifySuggestionCommentView(ModifyCommentView):
model = Suggestion
comment_model = SuggestionComment
template_name = "suggestions/suggestion.html"
success_pattern_name = "suggestions:suggestion"