87 lines
3 KiB
Python
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"
|