diff --git a/src/agenda_culturel/urls.py b/src/agenda_culturel/urls.py index d5ea35d..2d57292 100644 --- a/src/agenda_culturel/urls.py +++ b/src/agenda_culturel/urls.py @@ -36,7 +36,6 @@ from .views import ( # General pages about, activite, - delete_cm_spam, home, import_requirements, mentions_legales, @@ -48,7 +47,6 @@ from .views import ( add_import, cancel_import, update_orphan_events, - view_messages, # Import récurrent RecurrentImportCreateView, RecurrentImportDeleteView, @@ -58,6 +56,12 @@ from .views import ( run_all_rimports, run_rimport, view_rimport, + # Messages + delete_cm_spam, + MessageCreateView, + MessageDeleteView, + MessageUpdateView, + view_messages, # Moderation EventModerateView, moderate_event_next, @@ -69,15 +73,6 @@ from .views import ( OrganisationDetailViewPast, OrganisationListView, OrganisationUpdateView, - # Tags - view_tag, - view_tag_past, - TagUpdateView, - tag_list, - TagDeleteView, - rename_tag, - delete_tag, - TagCreateView, # Places PlaceCreateView, PlaceDeleteView, @@ -93,6 +88,15 @@ from .views import ( # Search event_search, event_search_full, + # Tags + view_tag, + view_tag_past, + TagUpdateView, + tag_list, + TagDeleteView, + rename_tag, + delete_tag, + TagCreateView, # TODO pas encore trié week_view, month_view, @@ -103,12 +107,10 @@ from .views import ( administration, clear_cache, export_event_ical, - MessageDeleteView, EventDetailView, EventUpdateView, StaticContentCreateView, StaticContentUpdateView, - MessageCreateView, EventCreateView, update_from_source, change_status_event, @@ -116,7 +118,6 @@ from .views import ( import_event_proxy, import_from_url, import_from_urls, - MessageUpdateView, UserProfileUpdateView, ) @@ -191,14 +192,12 @@ urlpatterns = [ # General pages path("a-propos", about, name="about"), path("activite/", activite, name="activite"), - path("messages/spams/delete", delete_cm_spam, name="delete_cm_spam"), path("", home, name="home"), path("besoin-pour-import", import_requirements, name="import_requirements"), path("mentions-legales", mentions_legales, name="mentions_legales"), path("regles-de-moderation", moderation_rules, name="moderation_rules"), path("statistiques", statistics, name="statistics"), path("merci", thank_you, name="thank_you"), - path("messages", view_messages, name="messages"), # Import batch path("imports/", imports, name="imports"), path("imports/add", add_import, name="add_import"), @@ -235,6 +234,25 @@ urlpatterns = [ ), path("rimports//run", run_rimport, name="run_rimport"), path("rimports//view", view_rimport, name="view_rimport"), + # Messages + path("messages/spams/delete", delete_cm_spam, name="delete_cm_spam"), + path( + "event//message", + MessageCreateView.as_view(), + name="message_for_event", + ), + path("contact", MessageCreateView.as_view(), name="contact"), + path( + "message//delete", + MessageDeleteView.as_view(), + name="delete_message", + ), + path( + "message/", + MessageUpdateView.as_view(), + name="message", + ), + path("messages", view_messages, name="messages"), # Moderation path("moderate", EventModerateView.as_view(), name="moderate"), path( @@ -358,6 +376,19 @@ urlpatterns = [ # Search path("rechercher", event_search, name="event_search"), path("rechercher/complet/", event_search_full, name="event_search_full"), + # Tags + path("tag//", view_tag, name="view_tag"), + path("tag//past", view_tag_past, name="view_tag_past"), + path("tag//edit", TagUpdateView.as_view(), name="edit_tag"), + path("tags/", tag_list, name="view_all_tags"), + path( + "tag//delete", + TagDeleteView.as_view(), + name="delete_object_tag", + ), + path("tag//rename", rename_tag, name="rename_tag"), + path("tag//delete", delete_tag, name="delete_tag"), + path("tags/add", TagCreateView.as_view(), name="add_tag"), # TODO pas encore trié path("cat:/", home, name="home_category"), path( @@ -400,19 +431,7 @@ urlpatterns = [ ), path("cette-semaine/", week_view, name="cette_semaine"), path("ce-mois-ci", month_view, name="ce_mois_ci"), - path("tag//", view_tag, name="view_tag"), path("tag//ical", export_ical, name="export_ical_tag"), - path("tag//past", view_tag_past, name="view_tag_past"), - path("tags/", tag_list, name="view_all_tags"), - path("tag//edit", TagUpdateView.as_view(), name="edit_tag"), - path( - "tag//delete", - TagDeleteView.as_view(), - name="delete_object_tag", - ), - path("tag//rename", rename_tag, name="rename_tag"), - path("tag//delete", delete_tag, name="delete_tag"), - path("tags/add", TagCreateView.as_view(), name="add_tag"), path("recent/", recent, name="recent"), path("administration/", administration, name="administration"), path( @@ -435,11 +454,6 @@ urlpatterns = [ EventUpdateView.as_view(), name="clone_edit", ), - path( - "event//message", - MessageCreateView.as_view(), - name="message_for_event", - ), path( "event//update-from-source", update_from_source, @@ -468,17 +482,6 @@ urlpatterns = [ StaticContentUpdateView.as_view(), name="edit_static_content", ), - path("contact", MessageCreateView.as_view(), name="contact"), - path( - "message/", - MessageUpdateView.as_view(), - name="message", - ), - path( - "message//delete", - MessageDeleteView.as_view(), - name="delete_message", - ), path("rimports//stats", statistics, name="stats_rimport"), path( "organisme//ical", diff --git a/src/agenda_culturel/views/__init__.py b/src/agenda_culturel/views/__init__.py index 25a6309..5374993 100644 --- a/src/agenda_culturel/views/__init__.py +++ b/src/agenda_culturel/views/__init__.py @@ -5,6 +5,7 @@ from .errors import * from .general_pages_views import * from .import_batch_views import * from .import_recurrent_views import * +from .message_views import * from .moderation_views import * from .organisations_views import * from .places_views import * diff --git a/src/agenda_culturel/views/general_pages_views.py b/src/agenda_culturel/views/general_pages_views.py index 0619d0f..685954a 100644 --- a/src/agenda_culturel/views/general_pages_views.py +++ b/src/agenda_culturel/views/general_pages_views.py @@ -2,19 +2,15 @@ import calendar as _calendar from datetime import date, timedelta, datetime 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 Q, Min, Max, Avg, StdDev from django.db.models.functions import TruncMonth, ExtractDay -from django.http import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ -from . import Median, week_view, PaginatorFilter -from ..filters import MessagesFilterAdmin -from ..models import RecurrentImport, Event, Message +from . import Median, week_view +from ..models import RecurrentImport, Event def home(request, cat=None): @@ -202,52 +198,3 @@ def activite(request): "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, - }, - ) diff --git a/src/agenda_culturel/views/message_views.py b/src/agenda_culturel/views/message_views.py new file mode 100644 index 0000000..fce5c24 --- /dev/null +++ b/src/agenda_culturel/views/message_views.py @@ -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, + }, + ) diff --git a/src/agenda_culturel/views/oldviews.py b/src/agenda_culturel/views/oldviews.py index 4b76559..f4efc10 100644 --- a/src/agenda_culturel/views/oldviews.py +++ b/src/agenda_culturel/views/oldviews.py @@ -22,7 +22,6 @@ from django.http import ( ) from django.shortcuts import get_object_or_404, render from django.urls import reverse, reverse_lazy -from django.utils.decorators import method_decorator from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.timezone import datetime @@ -34,7 +33,6 @@ from django.views.generic.edit import ( ModelFormMixin, UpdateView, ) -from honeypot.decorators import check_honeypot from .utils import get_event_qs from ..calendar import CalendarList, CalendarMonth, CalendarWeek @@ -50,7 +48,6 @@ from ..forms import ( EventForm, EventFormWithContact, MessageEventForm, - MessageForm, SimpleContactForm, URLSubmissionFormSet, URLSubmissionFormWithContact, @@ -919,85 +916,6 @@ def export_ical(request, cat=None, tag=None, organisation_pk=None, place_pk=None 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/") @permission_required("agenda_culturel.view_event") def administration(request):