From d0bbdcdfcf56fa105d2669c3f085ea93cfd71147 Mon Sep 17 00:00:00 2001 From: Sli Date: Sun, 6 Sep 2026 14:46:29 +0200 Subject: [PATCH] Use partials everywhere --- core/static/bundled/base-bundle-index.ts | 19 +++-- pedagogy/static/pedagogy/css/pedagogy.scss | 5 +- .../pedagogy/fragments/comment_report.jinja | 27 +++--- .../pedagogy/fragments/ue_comment.jinja | 83 ------------------- .../pedagogy/fragments/ue_comment_form.jinja | 4 +- .../fragments/ue_details/comments.jinja | 83 ++++++++++++++++++- pedagogy/templates/pedagogy/ue_detail.jinja | 4 +- pedagogy/urls.py | 6 -- pedagogy/views.py | 39 +++------ 9 files changed, 127 insertions(+), 143 deletions(-) delete mode 100644 pedagogy/templates/pedagogy/fragments/ue_comment.jinja diff --git a/core/static/bundled/base-bundle-index.ts b/core/static/bundled/base-bundle-index.ts index 3c7140e1..3434c8f2 100644 --- a/core/static/bundled/base-bundle-index.ts +++ b/core/static/bundled/base-bundle-index.ts @@ -7,7 +7,7 @@ */ // Must be loaded before Apline -import htmx, { HtmxResponse } from "htmx.org"; +import htmx from "htmx.org"; import "htmx.org/dist/ext/hx-alpine-compat.js"; import "htmx.org/dist/ext/hx-prompt.js"; import "htmx.org/dist/ext/hx-download.js"; @@ -48,13 +48,20 @@ polyfillCountryFlagEmojis(); /** * HTMX */ -document.body.addEventListener("htmx:before:request", (event) => { - event.target.ariaBusy = true; +htmx.registerExtension("aria-busy", { + // biome-ignore lint/style/useNamingConvention: api's name + // biome-ignore lint/suspicious/noExplicitAny: no type hint + htmx_before_request: (_: HTMLElement, detail: any) => { + detail.ctx.target.ariaBusy = "true"; + }, + // biome-ignore lint/style/useNamingConvention: api's name + // biome-ignore lint/suspicious/noExplicitAny: no type hint + htmx_before_swap: (elt: HTMLElement, detail: any) => { + detail.ctx.target.ariaBusy = "null"; + }, }); -document.body.addEventListener("htmx:before:swap", (event) => { - event.target.ariaBusy = null; -}); +htmx.config.transitions = true; Object.assign(window, { htmx }); diff --git a/pedagogy/static/pedagogy/css/pedagogy.scss b/pedagogy/static/pedagogy/css/pedagogy.scss index a177ee4e..ca7cc368 100644 --- a/pedagogy/static/pedagogy/css/pedagogy.scss +++ b/pedagogy/static/pedagogy/css/pedagogy.scss @@ -69,6 +69,7 @@ $pedagogy-white-text: #f0f0f0; input[type="checkbox"] { display: none; } + margin-top: 10px; margin-bottom: 0; color: white; @@ -399,6 +400,7 @@ $pedagogy-white-text: #f0f0f0; a { color: $pedagogy-white-text; + cursor: pointer; } a:hover { @@ -442,7 +444,8 @@ details.accordion>.accordion-content { border-right: none; } -.right { +.buttons { display: flex; justify-content: flex-end; + align-items: center; } \ No newline at end of file diff --git a/pedagogy/templates/pedagogy/fragments/comment_report.jinja b/pedagogy/templates/pedagogy/fragments/comment_report.jinja index d729f545..39f9e6f6 100644 --- a/pedagogy/templates/pedagogy/fragments/comment_report.jinja +++ b/pedagogy/templates/pedagogy/fragments/comment_report.jinja @@ -1,11 +1,10 @@
{% csrf_token %} {{ form.non_field_errors() }} @@ -16,15 +15,17 @@ {{ form.reporter }} {{ form.comment }} - +
+ -

- -

+ + +
\ No newline at end of file diff --git a/pedagogy/templates/pedagogy/fragments/ue_comment.jinja b/pedagogy/templates/pedagogy/fragments/ue_comment.jinja deleted file mode 100644 index 3a4e5cd6..00000000 --- a/pedagogy/templates/pedagogy/fragments/ue_comment.jinja +++ /dev/null @@ -1,83 +0,0 @@ -{% from "pedagogy/macros.jinja" import display_star %} -{% from "core/macros.jinja" import user_profile_link %} - -
- -
-
-

{% trans %}Global grade{% endtrans %}

-

{% trans %}Utility{% endtrans %}

-

{% trans %}Interest{% endtrans %}

-

{% trans %}Teaching{% endtrans %}

-

{% trans %}Work load{% endtrans %}

-
-
-

{{ display_star(comment.grade_global) }}

-

{{ display_star(comment.grade_utility) }}

-

{{ display_star(comment.grade_interest) }}

-

{{ display_star(comment.grade_teaching) }}

-

{{ display_star(comment.grade_work_load) }}

-
-
-
- -
-
- -
- {{ comment.comment|markdown }} -
- -
- {% if comment.is_reported %} -

- {% trans %}This comment has been reported{% endtrans %} -

- {% endif %} - - {% if comment.author_id == user.id or user.has_perm("pedagogy.change_comment") %} - - {% endif %} - {% if comment.author_id == user.id or user.has_perm("pedagogy.delete_comment") %} -
- {% csrf_token %} - -
- {% endif %} -
- -
- - -

{{ comment.publish_date.strftime('%d/%m/%Y') }}

- -

{{ user_profile_link(comment.author) }}

-
- -
\ No newline at end of file diff --git a/pedagogy/templates/pedagogy/fragments/ue_comment_form.jinja b/pedagogy/templates/pedagogy/fragments/ue_comment_form.jinja index ac5968d8..7ec115be 100644 --- a/pedagogy/templates/pedagogy/fragments/ue_comment_form.jinja +++ b/pedagogy/templates/pedagogy/fragments/ue_comment_form.jinja @@ -56,9 +56,9 @@ {{ form.comment }} -

+

-

+
{% if form.is_creation %} diff --git a/pedagogy/templates/pedagogy/fragments/ue_details/comments.jinja b/pedagogy/templates/pedagogy/fragments/ue_details/comments.jinja index fdc0e53c..04aee21a 100644 --- a/pedagogy/templates/pedagogy/fragments/ue_details/comments.jinja +++ b/pedagogy/templates/pedagogy/fragments/ue_details/comments.jinja @@ -1,3 +1,6 @@ +{% from "pedagogy/macros.jinja" import display_star %} +{% from "core/macros.jinja" import user_profile_link %} + {% if comments %}

{% trans %}Comments{% endtrans %}


@@ -5,6 +8,84 @@
{% for comment in comments %} - {% include "pedagogy/fragments/ue_comment.jinja" %} + +
+ +
+
+

{% trans %}Global grade{% endtrans %}

+

{% trans %}Utility{% endtrans %}

+

{% trans %}Interest{% endtrans %}

+

{% trans %}Teaching{% endtrans %}

+

{% trans %}Work load{% endtrans %}

+
+
+

{{ display_star(comment.grade_global) }}

+

{{ display_star(comment.grade_utility) }}

+

{{ display_star(comment.grade_interest) }}

+

{{ display_star(comment.grade_teaching) }}

+

{{ display_star(comment.grade_work_load) }}

+
+
+
+ +
+
+ +
+ {{ comment.comment|markdown }} +
+ +
+ {% if comment.is_reported %} +

+ {% trans %}This comment has been reported{% endtrans %} +

+ {% endif %} + + {% if comment.author_id == user.id or user.has_perm("pedagogy.change_comment") %} + + {% endif %} + {% if comment.author_id == user.id or user.has_perm("pedagogy.delete_comment") %} +
+ {% csrf_token %} + +
+ {% endif %} +
+ +
+ + +

{{ comment.publish_date.strftime('%d/%m/%Y') }}

+ +

{{ user_profile_link(comment.author) }}

+
+ +
{% endfor %}
diff --git a/pedagogy/templates/pedagogy/ue_detail.jinja b/pedagogy/templates/pedagogy/ue_detail.jinja index aaec4bee..deb8fdf2 100644 --- a/pedagogy/templates/pedagogy/ue_detail.jinja +++ b/pedagogy/templates/pedagogy/ue_detail.jinja @@ -82,9 +82,7 @@
- {% for comment in comments %} - {% include "pedagogy/fragments/ue_comment.jinja" %} - {% endfor %} + {% include "pedagogy/fragments/ue_details/comments.jinja" %}
diff --git a/pedagogy/urls.py b/pedagogy/urls.py index cc296f73..4631df90 100644 --- a/pedagogy/urls.py +++ b/pedagogy/urls.py @@ -26,7 +26,6 @@ from django.urls import path from pedagogy.views import ( UECommentCreateView, UECommentDeleteView, - UECommentDetailView, UECommentReportCreateView, UECommentUpdateView, UECreateView, @@ -46,11 +45,6 @@ urlpatterns = [ UECommentCreateView.as_view(), name="comment_create", ), - path( - "comment//", - UECommentDetailView.as_view(), - name="comment_detail", - ), path( "comment//edit/", UECommentUpdateView.as_view(), diff --git a/pedagogy/views.py b/pedagogy/views.py index 036c47fc..ba2157f9 100644 --- a/pedagogy/views.py +++ b/pedagogy/views.py @@ -26,6 +26,7 @@ from django.contrib.auth.mixins import PermissionRequiredMixin from django.db.models import Exists, OuterRef from django.shortcuts import get_object_or_404 from django.urls import reverse, reverse_lazy +from django.utils.functional import cached_property from django.views.generic import ( CreateView, DeleteView, @@ -54,12 +55,9 @@ class UECommentCreateView(PermissionRequiredMixin, FragmentMixin, CreateView): permission_required = "pedagogy.add_uecomment" object = None # Avoid initialisation bug with FragmentMixin - @property + @cached_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 + return get_object_or_404(UE, id=self.kwargs.get("ue_id")) def has_permission(self): if self.ue.has_user_already_commented(self.request.user): @@ -112,24 +110,6 @@ class UEDetailView( } -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 get_queryset(self): - return ( - super().get_queryset().viewable_by(self.request.user).annotate_is_reported() - ) - - def get_context_data(self, **kwargs): - return super().get_context_data(**kwargs) | { - "ue": getattr(self.object, "ue", None) - } - - class UECommentUpdateView(PermissionOrAuthorRequiredMixin, AllowFragment, UpdateView): """Allow edit of a given comment.""" @@ -155,7 +135,7 @@ class UECommentUpdateView(PermissionOrAuthorRequiredMixin, AllowFragment, Update } def get_success_url(self): - return reverse("pedagogy:comment_detail", kwargs={"comment_id": self.object.id}) + return reverse("pedagogy:ue_detail", kwargs={"ue_id": self.object.ue.id}) class UECommentDeleteView(PermissionOrAuthorRequiredMixin, AllowFragment, DeleteView): @@ -173,7 +153,7 @@ class UECommentDeleteView(PermissionOrAuthorRequiredMixin, AllowFragment, Delete return response def get_success_url(self): - return reverse("pedagogy:comment_detail", kwargs={"comment_id": self.object.id}) + return reverse("pedagogy:ue_detail", kwargs={"ue_id": self.object.ue.id}) class UEGuideView(PermissionRequiredMixin, TemplateView): @@ -195,6 +175,10 @@ class UECommentReportCreateView(PermissionRequiredMixin, AllowFragment, CreateVi self.ue_comment = get_object_or_404(UEComment, pk=kwargs["comment_id"]) return super().dispatch(request, *args, **kwargs) + @cached_property + def ue_detail_url(self): + return reverse("pedagogy:ue_detail", kwargs={"ue_id": self.ue_comment.ue.id}) + def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs["reporter_id"] = self.request.user.id @@ -204,6 +188,7 @@ class UECommentReportCreateView(PermissionRequiredMixin, AllowFragment, CreateVi def get_context_data(self, **kwargs): return super().get_context_data() | { "comment_id": self.ue_comment.id, + "ue_detail_url": self.ue_detail_url, } def form_valid(self, form): @@ -224,9 +209,7 @@ class UECommentReportCreateView(PermissionRequiredMixin, AllowFragment, CreateVi return resp def get_success_url(self): - return reverse( - "pedagogy:comment_detail", kwargs={"comment_id": self.ue_comment.id} - ) + return self.ue_detail_url class UEModerationFormView(PermissionRequiredMixin, FormView):