messages.push(e?.detail)"
- @notification-delete="messages = []">
+ @quick-notification-add="(e) => messages.push(e?.detail)"
+ @quick-notification-delete="messages = []">
diff --git a/core/views/mixins.py b/core/views/mixins.py
index 2a18955c..bdfb2908 100644
--- a/core/views/mixins.py
+++ b/core/views/mixins.py
@@ -2,7 +2,6 @@ import copy
import inspect
from typing import Any, ClassVar, LiteralString, Protocol, Unpack
-from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.http import HttpRequest, HttpResponse
from django.template.loader import render_to_string
@@ -41,36 +40,6 @@ class TabedViewMixin(View):
return kwargs
-class QuickNotifMixin:
- quick_notif_list = []
-
- def dispatch(self, request, *arg, **kwargs):
- # In some cases, the class can stay instanciated, so we need to reset the list
- self.quick_notif_list = []
- return super().dispatch(request, *arg, **kwargs)
-
- def get_success_url(self):
- ret = super().get_success_url()
- if hasattr(self, "quick_notif_url_arg"):
- if "?" in ret:
- ret += "&" + self.quick_notif_url_arg
- else:
- ret += "?" + self.quick_notif_url_arg
- return ret
-
- def get_context_data(self, **kwargs):
- """Add quick notifications to context."""
- kwargs = super().get_context_data(**kwargs)
- kwargs["quick_notifs"] = []
- for n in self.quick_notif_list:
- kwargs["quick_notifs"].append(settings.SITH_QUICK_NOTIF[n])
- for key, val in settings.SITH_QUICK_NOTIF.items():
- for gk in self.request.GET:
- if key == gk:
- kwargs["quick_notifs"].append(val)
- return kwargs
-
-
class AllowFragment:
"""Add `is_fragment` to templates. It's only True if the request is emitted by htmx"""
diff --git a/core/views/user.py b/core/views/user.py
index 376950d2..ba7beaa9 100644
--- a/core/views/user.py
+++ b/core/views/user.py
@@ -65,7 +65,7 @@ from core.views.forms import (
UserGroupsForm,
UserProfileForm,
)
-from core.views.mixins import QuickNotifMixin, TabedViewMixin, UseFragmentsMixin
+from core.views.mixins import TabedViewMixin, UseFragmentsMixin
from counter.models import Counter, Refilling, Selling
from eboutic.models import Invoice
from subscription.models import Subscription
@@ -564,7 +564,7 @@ class UserUpdateGroupView(UserTabsMixin, CanEditPropMixin, UpdateView):
current_tab = "groups"
-class UserToolsView(LoginRequiredMixin, QuickNotifMixin, UserTabsMixin, TemplateView):
+class UserToolsView(LoginRequiredMixin, UserTabsMixin, TemplateView):
"""Displays the logged user's tools."""
template_name = "core/user_tools.jinja"
diff --git a/docs/reference/core/mixins.md b/docs/reference/core/mixins.md
index d08c1ee8..08ba0367 100644
--- a/docs/reference/core/mixins.md
+++ b/docs/reference/core/mixins.md
@@ -4,7 +4,6 @@
heading_level: 3
members:
- TabedViewMixin
- - QuickNotifMixin
- AllowFragment
- FragmentMixin
- UseFragmentsMixin
\ No newline at end of file
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index 0c9cd5e5..f2d4ee53 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-09-22 14:29+0200\n"
+"POT-Creation-Date: 2025-09-23 20:02+0200\n"
"PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Maréchal \n"
@@ -1261,6 +1261,10 @@ msgstr "Liste d'écrans"
msgid "All incoming events"
msgstr "Tous les événements à venir"
+#: com/views.py
+msgid "Weekmail sent successfully"
+msgstr "Weekmail envoyé avec succès"
+
#: com/views.py
msgid "Delete and save to regenerate"
msgstr "Supprimer et sauver pour régénérer"
@@ -1269,6 +1273,26 @@ msgstr "Supprimer et sauver pour régénérer"
msgid "Weekmail of the "
msgstr "Weekmail du "
+#: com/views.py
+#, python-format
+msgid "%(title)s moved up in the Weekmail"
+msgstr "%(title)s monté dans le Weekmail"
+
+#: com/views.py
+#, python-format
+msgid "%(title)s moved down in the Weekmail"
+msgstr "%(title)s descendu dans le Weekmail"
+
+#: com/views.py
+#, python-format
+msgid "%(title)s added to the Weekmail"
+msgstr "%(title)s ajouté dans Weekmail"
+
+#: com/views.py
+#, python-format
+msgid "%(title)s removed from the Weekmail"
+msgstr "%(title)s retiré du Weekmail"
+
#: com/views.py
msgid ""
"You must be a board member of the selected club to post in the Weekmail."
@@ -4548,22 +4572,6 @@ msgstr "Signaler ce commentaire"
msgid "Edit UE"
msgstr "Éditer l'UE"
-#: pedagogy/templates/pedagogy/uv_edit.jinja
-msgid "Import from UTBM"
-msgstr "Importer depuis l'UTBM"
-
-#: pedagogy/templates/pedagogy/uv_edit.jinja
-msgid "Unknown UE code"
-msgstr "Code d'UE inconnu"
-
-#: pedagogy/templates/pedagogy/uv_edit.jinja
-msgid "Successful autocomplete"
-msgstr "Autocomplétion réussite"
-
-#: pedagogy/templates/pedagogy/uv_edit.jinja
-msgid "An error occurred: "
-msgstr "Une erreur est survenue : "
-
#: rootplace/forms.py
msgid "User that will be kept"
msgstr "Utilisateur qui sera conservé"
@@ -5116,26 +5124,6 @@ msgstr "Vous avez acheté %s"
msgid "You have a notification"
msgstr "Vous avez une notification"
-#: sith/settings.py
-msgid "Success!"
-msgstr "Succès !"
-
-#: sith/settings.py
-msgid "Fail!"
-msgstr "Échec !"
-
-#: sith/settings.py
-msgid "You successfully posted an article in the Weekmail"
-msgstr "Article posté avec succès dans le Weekmail"
-
-#: sith/settings.py
-msgid "You successfully edited an article in the Weekmail"
-msgstr "Article édité avec succès dans le Weekmail"
-
-#: sith/settings.py
-msgid "You successfully sent the Weekmail"
-msgstr "Weekmail envoyé avec succès"
-
#: sith/settings.py
msgid "AE tee-shirt"
msgstr "Tee-shirt AE"
@@ -5178,8 +5166,8 @@ msgstr "Vous ne pouvez pas cotiser plusieurs fois pour la même période"
#: subscription/templates/subscription/forms/create_existing_user.jinja
msgid ""
-"If the subscription is done using the AE account, you must also click "
-"it on the AE counter."
+"If the subscription is done using the AE account, you must also click it on "
+"the AE counter."
msgstr ""
"Si la cotisation est faite en utilisant le compte AE, vous devez également "
"la cliquer sur le comptoir AE."
@@ -5447,10 +5435,38 @@ msgstr "Mes photos"
msgid "Admin tools"
msgstr "Admin Trombi"
+#: trombi/views.py
+msgid "Trombi modified"
+msgstr "Trombi modifié"
+
+#: trombi/views.py
+msgid "User added to the trombi"
+msgstr "Utilisateur ajouté au trombi"
+
+#: trombi/views.py
+msgid "User couldn't be added to the trombi"
+msgstr "L'utilisateur n'a pas pu être ajouté au trombi"
+
+#: trombi/views.py
+msgid "User removed from the trombi"
+msgstr "Utilisateur retiré du trombi"
+
#: trombi/views.py
msgid "Explain why you rejected the comment"
msgstr "Expliquez pourquoi vous refusez le commentaire"
+#: trombi/views.py
+msgid "Comment accepted"
+msgstr "Commentaire accepté"
+
+#: trombi/views.py
+msgid "Comment rejected"
+msgstr "Commentaire rejeté"
+
+#: trombi/views.py
+msgid "Comment removed"
+msgstr "Commentaire retiré"
+
#: trombi/views.py
msgid "Rejected comment"
msgstr "Commentaire rejeté"
@@ -5503,6 +5519,10 @@ msgstr "Téléphone"
msgid "Native town"
msgstr "Ville d'origine"
+#: trombi/views.py
+msgid "User modified"
+msgstr "Utilisateur modifié"
+
#: trombi/views.py
msgid ""
"You can not yet write comment, you must wait for the subscription deadline "
diff --git a/sith/settings.py b/sith/settings.py
index 7595ddd0..68e75173 100644
--- a/sith/settings.py
+++ b/sith/settings.py
@@ -685,14 +685,6 @@ SITH_PERMANENT_NOTIFICATIONS = {
"SAS_MODERATION": "sas.models.sas_notification_callback",
}
-SITH_QUICK_NOTIF = {
- "qn_success": _("Success!"),
- "qn_fail": _("Fail!"),
- "qn_weekmail_new_article": _("You successfully posted an article in the Weekmail"),
- "qn_weekmail_article_edit": _("You successfully edited an article in the Weekmail"),
- "qn_weekmail_send_success": _("You successfully sent the Weekmail"),
-}
-
# Mailing related settings
SITH_MAILING_DOMAIN = "utbm.fr"
diff --git a/trombi/views.py b/trombi/views.py
index f44458ee..2b93422a 100644
--- a/trombi/views.py
+++ b/trombi/views.py
@@ -26,6 +26,7 @@ from datetime import date
from django import forms
from django.conf import settings
+from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.exceptions import PermissionDenied
from django.db import IntegrityError
@@ -46,7 +47,7 @@ from core.auth.mixins import (
)
from core.models import User
from core.views.forms import SelectDate
-from core.views.mixins import QuickNotifMixin, TabedViewMixin
+from core.views.mixins import TabedViewMixin
from core.views.widgets.ajax_select import AutoCompleteSelectUser
from trombi.models import Trombi, TrombiClubMembership, TrombiComment, TrombiUser
@@ -142,7 +143,8 @@ class TrombiEditView(CanEditPropMixin, TrombiTabsMixin, UpdateView):
current_tab = "admin_tools"
def get_success_url(self):
- return super().get_success_url() + "?qn_success"
+ messages.success(self.request, _("Trombi modified"))
+ return super().get_success_url()
class AddUserForm(forms.Form):
@@ -155,7 +157,7 @@ class AddUserForm(forms.Form):
)
-class TrombiDetailView(CanEditMixin, QuickNotifMixin, TrombiTabsMixin, DetailView):
+class TrombiDetailView(CanEditMixin, TrombiTabsMixin, DetailView):
model = Trombi
template_name = "trombi/detail.jinja"
pk_url_kwarg = "trombi_id"
@@ -167,9 +169,9 @@ class TrombiDetailView(CanEditMixin, QuickNotifMixin, TrombiTabsMixin, DetailVie
if form.is_valid():
try:
TrombiUser(user=form.cleaned_data["user"], trombi=self.object).save()
- self.quick_notif_list.append("qn_success")
+ messages.success(self.request, _("User added to the trombi"))
except IntegrityError: # We don't care about duplicate keys
- self.quick_notif_list.append("qn_fail")
+ messages.error(self.request, _("User couldn't be added to the trombi"))
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
@@ -192,15 +194,11 @@ class TrombiDeleteUserView(CanEditPropMixin, TrombiTabsMixin, DeleteView):
current_tab = "admin_tools"
def get_success_url(self):
- return (
- reverse("trombi:detail", kwargs={"trombi_id": self.object.trombi.id})
- + "?qn_success"
- )
+ messages.success(self.request, _("User removed from the trombi"))
+ return reverse("trombi:detail", kwargs={"trombi_id": self.object.trombi.id})
-class TrombiModerateCommentsView(
- CanEditPropMixin, QuickNotifMixin, TrombiTabsMixin, DetailView
-):
+class TrombiModerateCommentsView(CanEditPropMixin, TrombiTabsMixin, DetailView):
model = Trombi
template_name = "trombi/comment_moderation.jinja"
pk_url_kwarg = "trombi_id"
@@ -235,16 +233,18 @@ class TrombiModerateCommentView(DetailView):
if request.POST["action"] == "accept":
self.object.is_moderated = True
self.object.save()
+ messages.success(self.request, _("Comment accepted"))
return redirect(
reverse(
"trombi:moderate_comments",
kwargs={"trombi_id": self.object.author.trombi.id},
)
- + "?qn_success"
)
elif request.POST["action"] == "reject":
+ messages.success(self.request, _("Comment rejected"))
return super().get(request, *args, **kwargs)
elif request.POST["action"] == "delete" and "reason" in request.POST:
+ messages.success(self.request, _("Comment removed"))
self.object.author.user.email_user(
subject="[%s] %s" % (settings.SITH_NAME, _("Rejected comment")),
message=_(
@@ -265,7 +265,6 @@ class TrombiModerateCommentView(DetailView):
"trombi:moderate_comments",
kwargs={"trombi_id": self.object.author.trombi.id},
)
- + "?qn_success"
)
raise Http404
@@ -299,9 +298,7 @@ class UserTrombiForm(forms.Form):
)
-class UserTrombiToolsView(
- LoginRequiredMixin, QuickNotifMixin, TrombiTabsMixin, TemplateView
-):
+class UserTrombiToolsView(LoginRequiredMixin, TrombiTabsMixin, TemplateView):
"""Display a user's trombi tools."""
template_name = "trombi/user_tools.jinja"
@@ -318,7 +315,6 @@ class UserTrombiToolsView(
user=request.user, trombi=self.form.cleaned_data["trombi"]
)
trombi_user.save()
- self.quick_notif_list += ["qn_success"]
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
@@ -345,12 +341,10 @@ class UserTrombiEditPicturesView(TrombiTabsMixin, UserIsInATrombiMixin, UpdateVi
return self.request.user.trombi_user
def get_success_url(self):
- return reverse("trombi:user_tools") + "?qn_success"
+ return reverse("trombi:user_tools")
-class UserTrombiEditProfileView(
- QuickNotifMixin, TrombiTabsMixin, UserIsInATrombiMixin, UpdateView
-):
+class UserTrombiEditProfileView(TrombiTabsMixin, UserIsInATrombiMixin, UpdateView):
model = User
form_class = modelform_factory(
User,
@@ -375,7 +369,8 @@ class UserTrombiEditProfileView(
return self.request.user
def get_success_url(self):
- return reverse("trombi:user_tools") + "?qn_success"
+ messages.success(self.request, _("User modified"))
+ return reverse("trombi:user_tools")
class UserTrombiResetClubMembershipsView(UserIsInATrombiMixin, RedirectView):
@@ -387,7 +382,7 @@ class UserTrombiResetClubMembershipsView(UserIsInATrombiMixin, RedirectView):
return redirect(self.get_success_url())
def get_success_url(self):
- return reverse("trombi:profile") + "?qn_success"
+ return reverse("trombi:profile")
class UserTrombiDeleteMembershipView(TrombiTabsMixin, CanEditMixin, DeleteView):
@@ -398,7 +393,7 @@ class UserTrombiDeleteMembershipView(TrombiTabsMixin, CanEditMixin, DeleteView):
current_tab = "profile"
def get_success_url(self):
- return super().get_success_url() + "?qn_success"
+ return super().get_success_url()
# Used by admins when someone does not have every club in his list
@@ -436,7 +431,7 @@ class UserTrombiEditMembershipView(CanEditMixin, TrombiTabsMixin, UpdateView):
current_tab = "profile"
def get_success_url(self):
- return super().get_success_url() + "?qn_success"
+ return super().get_success_url()
class UserTrombiProfileView(TrombiTabsMixin, DetailView):
@@ -496,7 +491,7 @@ class TrombiCommentFormView(LoginRequiredMixin, View):
)
def get_success_url(self):
- return reverse("trombi:user_tools") + "?qn_success"
+ return reverse("trombi:user_tools")
def get_context_data(self, **kwargs):
kwargs = super().get_context_data(**kwargs)