Séparation des vues messages

This commit is contained in:
SebF 2025-04-14 18:01:22 +02:00
parent 001a1652bd
commit 94950e148f
5 changed files with 196 additions and 181 deletions

View File

@ -36,7 +36,6 @@ from .views import (
# General pages # General pages
about, about,
activite, activite,
delete_cm_spam,
home, home,
import_requirements, import_requirements,
mentions_legales, mentions_legales,
@ -48,7 +47,6 @@ from .views import (
add_import, add_import,
cancel_import, cancel_import,
update_orphan_events, update_orphan_events,
view_messages,
# Import récurrent # Import récurrent
RecurrentImportCreateView, RecurrentImportCreateView,
RecurrentImportDeleteView, RecurrentImportDeleteView,
@ -58,6 +56,12 @@ from .views import (
run_all_rimports, run_all_rimports,
run_rimport, run_rimport,
view_rimport, view_rimport,
# Messages
delete_cm_spam,
MessageCreateView,
MessageDeleteView,
MessageUpdateView,
view_messages,
# Moderation # Moderation
EventModerateView, EventModerateView,
moderate_event_next, moderate_event_next,
@ -69,15 +73,6 @@ from .views import (
OrganisationDetailViewPast, OrganisationDetailViewPast,
OrganisationListView, OrganisationListView,
OrganisationUpdateView, OrganisationUpdateView,
# Tags
view_tag,
view_tag_past,
TagUpdateView,
tag_list,
TagDeleteView,
rename_tag,
delete_tag,
TagCreateView,
# Places # Places
PlaceCreateView, PlaceCreateView,
PlaceDeleteView, PlaceDeleteView,
@ -93,6 +88,15 @@ from .views import (
# Search # Search
event_search, event_search,
event_search_full, event_search_full,
# Tags
view_tag,
view_tag_past,
TagUpdateView,
tag_list,
TagDeleteView,
rename_tag,
delete_tag,
TagCreateView,
# TODO pas encore trié # TODO pas encore trié
week_view, week_view,
month_view, month_view,
@ -103,12 +107,10 @@ from .views import (
administration, administration,
clear_cache, clear_cache,
export_event_ical, export_event_ical,
MessageDeleteView,
EventDetailView, EventDetailView,
EventUpdateView, EventUpdateView,
StaticContentCreateView, StaticContentCreateView,
StaticContentUpdateView, StaticContentUpdateView,
MessageCreateView,
EventCreateView, EventCreateView,
update_from_source, update_from_source,
change_status_event, change_status_event,
@ -116,7 +118,6 @@ from .views import (
import_event_proxy, import_event_proxy,
import_from_url, import_from_url,
import_from_urls, import_from_urls,
MessageUpdateView,
UserProfileUpdateView, UserProfileUpdateView,
) )
@ -191,14 +192,12 @@ urlpatterns = [
# General pages # General pages
path("a-propos", about, name="about"), path("a-propos", about, name="about"),
path("activite/", activite, name="activite"), path("activite/", activite, name="activite"),
path("messages/spams/delete", delete_cm_spam, name="delete_cm_spam"),
path("", home, name="home"), path("", home, name="home"),
path("besoin-pour-import", import_requirements, name="import_requirements"), path("besoin-pour-import", import_requirements, name="import_requirements"),
path("mentions-legales", mentions_legales, name="mentions_legales"), path("mentions-legales", mentions_legales, name="mentions_legales"),
path("regles-de-moderation", moderation_rules, name="moderation_rules"), path("regles-de-moderation", moderation_rules, name="moderation_rules"),
path("statistiques", statistics, name="statistics"), path("statistiques", statistics, name="statistics"),
path("merci", thank_you, name="thank_you"), path("merci", thank_you, name="thank_you"),
path("messages", view_messages, name="messages"),
# Import batch # Import batch
path("imports/", imports, name="imports"), path("imports/", imports, name="imports"),
path("imports/add", add_import, name="add_import"), path("imports/add", add_import, name="add_import"),
@ -235,6 +234,25 @@ urlpatterns = [
), ),
path("rimports/<int:pk>/run", run_rimport, name="run_rimport"), path("rimports/<int:pk>/run", run_rimport, name="run_rimport"),
path("rimports/<int:pk>/view", view_rimport, name="view_rimport"), path("rimports/<int:pk>/view", view_rimport, name="view_rimport"),
# Messages
path("messages/spams/delete", delete_cm_spam, name="delete_cm_spam"),
path(
"event/<int:pk>/message",
MessageCreateView.as_view(),
name="message_for_event",
),
path("contact", MessageCreateView.as_view(), name="contact"),
path(
"message/<int:pk>/delete",
MessageDeleteView.as_view(),
name="delete_message",
),
path(
"message/<int:pk>",
MessageUpdateView.as_view(),
name="message",
),
path("messages", view_messages, name="messages"),
# Moderation # Moderation
path("moderate", EventModerateView.as_view(), name="moderate"), path("moderate", EventModerateView.as_view(), name="moderate"),
path( path(
@ -358,6 +376,19 @@ urlpatterns = [
# Search # Search
path("rechercher", event_search, name="event_search"), path("rechercher", event_search, name="event_search"),
path("rechercher/complet/", event_search_full, name="event_search_full"), path("rechercher/complet/", event_search_full, name="event_search_full"),
# Tags
path("tag/<t>/", view_tag, name="view_tag"),
path("tag/<t>/past", view_tag_past, name="view_tag_past"),
path("tag/<int:pk>/edit", TagUpdateView.as_view(), name="edit_tag"),
path("tags/", tag_list, name="view_all_tags"),
path(
"tag/<int:pk>/delete",
TagDeleteView.as_view(),
name="delete_object_tag",
),
path("tag/<t>/rename", rename_tag, name="rename_tag"),
path("tag/<t>/delete", delete_tag, name="delete_tag"),
path("tags/add", TagCreateView.as_view(), name="add_tag"),
# TODO pas encore trié # TODO pas encore trié
path("cat:<cat>/", home, name="home_category"), path("cat:<cat>/", home, name="home_category"),
path( path(
@ -400,19 +431,7 @@ urlpatterns = [
), ),
path("cette-semaine/", week_view, name="cette_semaine"), path("cette-semaine/", week_view, name="cette_semaine"),
path("ce-mois-ci", month_view, name="ce_mois_ci"), path("ce-mois-ci", month_view, name="ce_mois_ci"),
path("tag/<t>/", view_tag, name="view_tag"),
path("tag/<tag>/ical", export_ical, name="export_ical_tag"), path("tag/<tag>/ical", export_ical, name="export_ical_tag"),
path("tag/<t>/past", view_tag_past, name="view_tag_past"),
path("tags/", tag_list, name="view_all_tags"),
path("tag/<int:pk>/edit", TagUpdateView.as_view(), name="edit_tag"),
path(
"tag/<int:pk>/delete",
TagDeleteView.as_view(),
name="delete_object_tag",
),
path("tag/<t>/rename", rename_tag, name="rename_tag"),
path("tag/<t>/delete", delete_tag, name="delete_tag"),
path("tags/add", TagCreateView.as_view(), name="add_tag"),
path("recent/", recent, name="recent"), path("recent/", recent, name="recent"),
path("administration/", administration, name="administration"), path("administration/", administration, name="administration"),
path( path(
@ -435,11 +454,6 @@ urlpatterns = [
EventUpdateView.as_view(), EventUpdateView.as_view(),
name="clone_edit", name="clone_edit",
), ),
path(
"event/<int:pk>/message",
MessageCreateView.as_view(),
name="message_for_event",
),
path( path(
"event/<int:pk>/update-from-source", "event/<int:pk>/update-from-source",
update_from_source, update_from_source,
@ -468,17 +482,6 @@ urlpatterns = [
StaticContentUpdateView.as_view(), StaticContentUpdateView.as_view(),
name="edit_static_content", name="edit_static_content",
), ),
path("contact", MessageCreateView.as_view(), name="contact"),
path(
"message/<int:pk>",
MessageUpdateView.as_view(),
name="message",
),
path(
"message/<int:pk>/delete",
MessageDeleteView.as_view(),
name="delete_message",
),
path("rimports/<int:pk>/stats", statistics, name="stats_rimport"), path("rimports/<int:pk>/stats", statistics, name="stats_rimport"),
path( path(
"organisme/<int:organisation_pk>/ical", "organisme/<int:organisation_pk>/ical",

View File

@ -5,6 +5,7 @@ from .errors import *
from .general_pages_views import * from .general_pages_views import *
from .import_batch_views import * from .import_batch_views import *
from .import_recurrent_views import * from .import_recurrent_views import *
from .message_views import *
from .moderation_views import * from .moderation_views import *
from .organisations_views import * from .organisations_views import *
from .places_views import * from .places_views import *

View File

@ -2,19 +2,15 @@ import calendar as _calendar
from datetime import date, timedelta, datetime from datetime import date, timedelta, datetime
from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.decorators import login_required, permission_required
from django.core.checks import messages
from django.core.paginator import PageNotAnInteger, EmptyPage
from django.db.models import Count, F from django.db.models import Count, F
from django.db.models import Q, Min, Max, Avg, StdDev from django.db.models import Q, Min, Max, Avg, StdDev
from django.db.models.functions import TruncMonth, ExtractDay from django.db.models.functions import TruncMonth, ExtractDay
from django.http import HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from . import Median, week_view, PaginatorFilter from . import Median, week_view
from ..filters import MessagesFilterAdmin from ..models import RecurrentImport, Event
from ..models import RecurrentImport, Event, Message
def home(request, cat=None): def home(request, cat=None):
@ -202,52 +198,3 @@ def activite(request):
"weekly_modifications": weekly_modifications, "weekly_modifications": weekly_modifications,
}, },
) )
@login_required(login_url="/accounts/login/")
@permission_required("agenda_culturel.view_message")
def view_messages(request):
filter = MessagesFilterAdmin(
request.GET, queryset=Message.objects.all().order_by("-date")
)
paginator = PaginatorFilter(filter, 10, request)
page = request.GET.get("page")
nb_spams = Message.objects.filter(spam=True).count()
try:
response = paginator.page(page)
except PageNotAnInteger:
response = paginator.page(1)
except EmptyPage:
response = paginator.page(paginator.num_pages)
return render(
request,
"agenda_culturel/messages.html",
{"filter": filter, "nb_spams": nb_spams, "paginator_filter": response},
)
@login_required(login_url="/accounts/login/")
@permission_required("agenda_culturel.view_message")
def delete_cm_spam(request):
if request.method == "POST":
Message.objects.filter(spam=True).delete()
messages.success(request, _("Spam has been successfully deleted."))
return HttpResponseRedirect(reverse_lazy("messages"))
else:
nb_msgs = Message.objects.values("spam").annotate(total=Count("spam"))
nb_total = sum([nb["total"] for nb in nb_msgs])
nb_spams = sum([nb["total"] for nb in nb_msgs if nb["spam"]])
cancel_url = reverse_lazy("messages")
return render(
request,
"agenda_culturel/delete_spams_confirm.html",
{
"nb_total": nb_total,
"nb_spams": nb_spams,
"cancel_url": cancel_url,
},
)

View File

@ -0,0 +1,146 @@
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
from django.contrib.messages.views import SuccessMessageMixin
from django.core.checks import messages
from django.core.paginator import PageNotAnInteger, EmptyPage
from django.db.models import Count
from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from django.views.generic import DeleteView, UpdateView, CreateView
from honeypot.decorators import check_honeypot
from . import PaginatorFilter
from ..filters import MessagesFilterAdmin
from ..forms import MessageForm
from ..models import Event, Message
@method_decorator(check_honeypot, name="post")
class MessageCreateView(SuccessMessageMixin, CreateView):
model = Message
template_name = "agenda_culturel/message_create_form.html"
form_class = MessageForm
success_url = reverse_lazy("home")
success_message = _("Your message has been sent successfully.")
def __init__(self, *args, **kwargs):
self.event = None
super().__init__(*args, **kwargs)
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
return form_class(**self.get_form_kwargs())
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["event"] = self.event
if self.request.user.is_authenticated:
kwargs["internal"] = True
return kwargs
def form_valid(self, form):
if self.request.user.is_authenticated:
form.instance.user = self.request.user
form.instance.message_type = (
Message.TYPE.EVENT_REPORT
if "pk" in self.kwargs
else Message.TYPE.CONTACT_FORM
)
return super().form_valid(form)
def get_initial(self):
result = super().get_initial()
if "pk" in self.kwargs:
self.event = get_object_or_404(Event, pk=self.kwargs["pk"])
result["related_event"] = self.event
result["subject"] = _("Reporting the event {} on {}").format(
self.event.title, self.event.start_day
)
else:
result["related_event"] = None
return result
class MessageDeleteView(SuccessMessageMixin, DeleteView):
model = Message
success_message = _("The contact message has been successfully deleted.")
success_url = reverse_lazy("messages")
class MessageUpdateView(
SuccessMessageMixin,
PermissionRequiredMixin,
LoginRequiredMixin,
UpdateView,
):
model = Message
permission_required = "agenda_culturel.change_message"
template_name = "agenda_culturel/message_moderation_form.html"
fields = ("spam", "closed", "comments")
success_message = _(
"The contact message properties has been successfully modified."
)
success_url = reverse_lazy("messages")
def get_form_kwargs(self):
"""Return the keyword arguments for instantiating the form."""
kwargs = super().get_form_kwargs()
if hasattr(self, "object"):
kwargs.update({"instance": self.object})
return kwargs
@login_required(login_url="/accounts/login/")
@permission_required("agenda_culturel.view_message")
def view_messages(request):
filter = MessagesFilterAdmin(
request.GET, queryset=Message.objects.all().order_by("-date")
)
paginator = PaginatorFilter(filter, 10, request)
page = request.GET.get("page")
nb_spams = Message.objects.filter(spam=True).count()
try:
response = paginator.page(page)
except PageNotAnInteger:
response = paginator.page(1)
except EmptyPage:
response = paginator.page(paginator.num_pages)
return render(
request,
"agenda_culturel/messages.html",
{"filter": filter, "nb_spams": nb_spams, "paginator_filter": response},
)
@login_required(login_url="/accounts/login/")
@permission_required("agenda_culturel.view_message")
def delete_cm_spam(request):
if request.method == "POST":
Message.objects.filter(spam=True).delete()
messages.success(request, _("Spam has been successfully deleted."))
return HttpResponseRedirect(reverse_lazy("messages"))
else:
nb_msgs = Message.objects.values("spam").annotate(total=Count("spam"))
nb_total = sum([nb["total"] for nb in nb_msgs])
nb_spams = sum([nb["total"] for nb in nb_msgs if nb["spam"]])
cancel_url = reverse_lazy("messages")
return render(
request,
"agenda_culturel/delete_spams_confirm.html",
{
"nb_total": nb_total,
"nb_spams": nb_spams,
"cancel_url": cancel_url,
},
)

View File

@ -22,7 +22,6 @@ from django.http import (
) )
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.utils.decorators import method_decorator
from django.utils.html import escape from django.utils.html import escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.timezone import datetime from django.utils.timezone import datetime
@ -34,7 +33,6 @@ from django.views.generic.edit import (
ModelFormMixin, ModelFormMixin,
UpdateView, UpdateView,
) )
from honeypot.decorators import check_honeypot
from .utils import get_event_qs from .utils import get_event_qs
from ..calendar import CalendarList, CalendarMonth, CalendarWeek from ..calendar import CalendarList, CalendarMonth, CalendarWeek
@ -50,7 +48,6 @@ from ..forms import (
EventForm, EventForm,
EventFormWithContact, EventFormWithContact,
MessageEventForm, MessageEventForm,
MessageForm,
SimpleContactForm, SimpleContactForm,
URLSubmissionFormSet, URLSubmissionFormSet,
URLSubmissionFormWithContact, URLSubmissionFormWithContact,
@ -919,85 +916,6 @@ def export_ical(request, cat=None, tag=None, organisation_pk=None, place_pk=None
return response return response
@method_decorator(check_honeypot, name="post")
class MessageCreateView(SuccessMessageMixin, CreateView):
model = Message
template_name = "agenda_culturel/message_create_form.html"
form_class = MessageForm
success_url = reverse_lazy("home")
success_message = _("Your message has been sent successfully.")
def __init__(self, *args, **kwargs):
self.event = None
super().__init__(*args, **kwargs)
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
return form_class(**self.get_form_kwargs())
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["event"] = self.event
if self.request.user.is_authenticated:
kwargs["internal"] = True
return kwargs
def form_valid(self, form):
if self.request.user.is_authenticated:
form.instance.user = self.request.user
form.instance.message_type = (
Message.TYPE.EVENT_REPORT
if "pk" in self.kwargs
else Message.TYPE.CONTACT_FORM
)
return super().form_valid(form)
def get_initial(self):
result = super().get_initial()
if "pk" in self.kwargs:
self.event = get_object_or_404(Event, pk=self.kwargs["pk"])
result["related_event"] = self.event
result["subject"] = _("Reporting the event {} on {}").format(
self.event.title, self.event.start_day
)
else:
result["related_event"] = None
return result
class MessageDeleteView(SuccessMessageMixin, DeleteView):
model = Message
success_message = _("The contact message has been successfully deleted.")
success_url = reverse_lazy("messages")
class MessageUpdateView(
SuccessMessageMixin,
PermissionRequiredMixin,
LoginRequiredMixin,
UpdateView,
):
model = Message
permission_required = "agenda_culturel.change_message"
template_name = "agenda_culturel/message_moderation_form.html"
fields = ("spam", "closed", "comments")
success_message = _(
"The contact message properties has been successfully modified."
)
success_url = reverse_lazy("messages")
def get_form_kwargs(self):
"""Return the keyword arguments for instantiating the form."""
kwargs = super().get_form_kwargs()
if hasattr(self, "object"):
kwargs.update({"instance": self.object})
return kwargs
@login_required(login_url="/accounts/login/") @login_required(login_url="/accounts/login/")
@permission_required("agenda_culturel.view_event") @permission_required("agenda_culturel.view_event")
def administration(request): def administration(request):