mirror of
https://github.com/ae-utbm/sith.git
synced 2026-08-28 08:09:16 +00:00
Use HTMX in UE details
This commit is contained in:
+73
-31
@@ -24,11 +24,13 @@
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.mixins import PermissionRequiredMixin
|
||||
from django.db.models import Exists, OuterRef
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.views.generic import (
|
||||
CreateView,
|
||||
DeleteView,
|
||||
DetailView,
|
||||
FormView,
|
||||
TemplateView,
|
||||
UpdateView,
|
||||
@@ -36,7 +38,7 @@ from django.views.generic import (
|
||||
|
||||
from core.auth.mixins import PermissionOrAuthorRequiredMixin
|
||||
from core.models import Notification, User
|
||||
from core.views import DetailFormView
|
||||
from core.views.mixins import AllowFragment, FragmentMixin, UseFragmentsMixin
|
||||
from pedagogy.forms import (
|
||||
UECommentForm,
|
||||
UECommentModerationForm,
|
||||
@@ -46,37 +48,56 @@ from pedagogy.forms import (
|
||||
from pedagogy.models import UE, UEComment, UECommentReport
|
||||
|
||||
|
||||
class UEDetailFormView(PermissionRequiredMixin, DetailFormView):
|
||||
"""Display every comment of an UE and detailed infos about it.
|
||||
|
||||
Allow to comment the UE.
|
||||
"""
|
||||
|
||||
model = UE
|
||||
pk_url_kwarg = "ue_id"
|
||||
template_name = "pedagogy/ue_detail.jinja"
|
||||
class UECommentCreateView(PermissionRequiredMixin, FragmentMixin, CreateView):
|
||||
model = UEComment
|
||||
template_name = "pedagogy/fragments/ue_comment_form.jinja"
|
||||
form_class = UECommentForm
|
||||
permission_required = "pedagogy.view_ue"
|
||||
permission_required = "pedagogy.add_uecomment"
|
||||
object = None # Avoid initialisation bug with FragmentMixin
|
||||
|
||||
@property
|
||||
def ue(self):
|
||||
if hasattr(self, "_ue"):
|
||||
return self._ue
|
||||
self._ue = get_object_or_404(UE, id=self.kwargs.get("ue_id"))
|
||||
return self._ue
|
||||
|
||||
def has_permission(self):
|
||||
if self.request.method == "POST" and not self.request.user.has_perm(
|
||||
"pedagogy.add_uecomment"
|
||||
):
|
||||
# if it's a POST request, the user is trying to add a new UEComment
|
||||
# thus he also needs the "add_uecomment" permission
|
||||
if self.ue.has_user_already_commented(self.request.user):
|
||||
return False
|
||||
return super().has_permission()
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs["author_id"] = self.request.user.id
|
||||
kwargs["ue_id"] = self.object.id
|
||||
kwargs["ue_id"] = self.ue.id
|
||||
kwargs["is_creation"] = True
|
||||
return kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
form.save()
|
||||
return super().form_valid(form)
|
||||
def get_context_data(self, **kwargs):
|
||||
return super().get_context_data(**kwargs) | {
|
||||
"action": reverse("pedagogy:comment_create", kwargs={"ue_id": self.ue.id})
|
||||
}
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse("pedagogy:comment_detail", kwargs={"comment_id": self.object.id})
|
||||
|
||||
|
||||
class UEDetailView(
|
||||
PermissionRequiredMixin, UseFragmentsMixin, AllowFragment, DetailView
|
||||
):
|
||||
"""Display every comment of an UE and detailed infos about it."""
|
||||
|
||||
model = UE
|
||||
pk_url_kwarg = "ue_id"
|
||||
template_name = "pedagogy/ue_detail.jinja"
|
||||
permission_required = "pedagogy.view_ue"
|
||||
fragments = {
|
||||
"add_comment_form": UECommentCreateView,
|
||||
}
|
||||
|
||||
def get_fragment_data(self):
|
||||
return {"add_comment_form": {"ue_id": self.object.id}}
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
return super().get_context_data(**kwargs) | {
|
||||
@@ -85,22 +106,33 @@ class UEDetailFormView(PermissionRequiredMixin, DetailFormView):
|
||||
.annotate_is_reported()
|
||||
.select_related("author")
|
||||
.order_by("-publish_date")
|
||||
)
|
||||
),
|
||||
}
|
||||
|
||||
def get_success_url(self):
|
||||
# once the new ue comment has been saved
|
||||
# redirect to the same page we are currently
|
||||
return self.request.path
|
||||
|
||||
class UECommentDetailView(PermissionRequiredMixin, DetailView):
|
||||
model = UEComment
|
||||
pk_url_kwarg = "comment_id"
|
||||
template_name = "pedagogy/fragments/ue_comment.jinja"
|
||||
permission_required = "pedagogy.view_ue"
|
||||
context_object_name = "comment"
|
||||
|
||||
def dispatch(self, *args, **kwargs):
|
||||
res: HttpResponse = super().dispatch(*args, **kwargs)
|
||||
res.headers["HX-Trigger"] = "CommentUpdate"
|
||||
return res
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
return super().get_context_data(**kwargs) | {"ue": self.object.ue}
|
||||
|
||||
|
||||
class UECommentUpdateView(PermissionOrAuthorRequiredMixin, UpdateView):
|
||||
class UECommentUpdateView(PermissionOrAuthorRequiredMixin, AllowFragment, UpdateView):
|
||||
"""Allow edit of a given comment."""
|
||||
|
||||
model = UEComment
|
||||
form_class = UECommentForm
|
||||
pk_url_kwarg = "comment_id"
|
||||
template_name = "core/edit.jinja"
|
||||
template_name = "pedagogy/fragments/ue_comment_form.jinja"
|
||||
permission_required = "pedagogy.change_uecomment"
|
||||
author_field = "author"
|
||||
|
||||
@@ -111,11 +143,18 @@ class UECommentUpdateView(PermissionOrAuthorRequiredMixin, UpdateView):
|
||||
kwargs["is_creation"] = False
|
||||
return kwargs
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
return super().get_context_data(**kwargs) | {
|
||||
"action": reverse(
|
||||
"pedagogy:comment_update", kwargs={"comment_id": self.object.id}
|
||||
)
|
||||
}
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse("pedagogy:ue_detail", kwargs={"ue_id": self.object.ue_id})
|
||||
return reverse("pedagogy:comment_detail", kwargs={"comment_id": self.object.id})
|
||||
|
||||
|
||||
class UECommentDeleteView(PermissionOrAuthorRequiredMixin, DeleteView):
|
||||
class UECommentDeleteView(PermissionOrAuthorRequiredMixin, AllowFragment, DeleteView):
|
||||
"""Allow to delete a given comment."""
|
||||
|
||||
model = UEComment
|
||||
@@ -124,8 +163,11 @@ class UECommentDeleteView(PermissionOrAuthorRequiredMixin, DeleteView):
|
||||
permission_required = "pedagogy.delete_uecomment"
|
||||
author_field = "author"
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse("pedagogy:ue_detail", kwargs={"ue_id": self.object.ue_id})
|
||||
def form_valid(self, form):
|
||||
self.object.delete()
|
||||
response = HttpResponse(status=200)
|
||||
response.headers["HX-Trigger"] = "CommentUpdate"
|
||||
return response
|
||||
|
||||
|
||||
class UEGuideView(PermissionRequiredMixin, TemplateView):
|
||||
|
||||
Reference in New Issue
Block a user