From 0bc5e6ced503bd5ba12c10eec24b1943d5bc455f Mon Sep 17 00:00:00 2001
From: Lucas Brandstaetter <lucas@brandstaetter.tech>
Date: Mon, 9 Dec 2024 09:46:54 +0100
Subject: [PATCH] Add FormMesssageMixin

With this we can automate the addition of success and failure messages
to general form views.
---
 src/core/views/mixins.py | 66 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)
 create mode 100644 src/core/views/mixins.py

diff --git a/src/core/views/mixins.py b/src/core/views/mixins.py
new file mode 100644
index 000000000..e8b2eb537
--- /dev/null
+++ b/src/core/views/mixins.py
@@ -0,0 +1,66 @@
+from typing import Any
+
+from django.contrib.messages import ERROR, SUCCESS, add_message
+from django.forms import Form
+from django.http import HttpResponse
+
+
+class FormMesssageMixin:
+    """
+    Add a success message on successful form submission.
+    """
+
+    success_message = ''
+    success_message_code = SUCCESS
+    failure_message = ''
+    failure_message_code = ERROR
+
+    def form_valid(self, form: Form) -> HttpResponse:
+        """Set a success message on successful form submission.
+
+        Args:
+            form (Form): The form that was submitted.
+
+        Returns:
+            HTTPResponse: The response generated by the parent class.
+        """
+        response = super().form_valid(form)
+        success_message = self.get_form_message(self.success_message, form.cleaned_data)
+        if success_message:
+            add_message(
+                self.request,
+                self.success_message_code,
+                success_message,
+            )
+        return response
+
+    def form_invalid(self, form):
+        """Set a failure message on failed form submission.
+
+        Args:
+            form (Form): The form that was submitted.
+
+        Returns:
+            HTTPResponse: The response generated by the parent class.
+        """
+        response = super().form_invalid(form)
+        failure_message = self.get_form_message(self.failure_message, form.cleaned_data)
+        if failure_message:
+            add_message(
+                self.request,
+                self.failure_message_code,
+                self.get_form_message(self.failure_message, form.cleaned_data),
+            )
+        return response
+
+    def get_form_message(self, message: str, cleaned_data: dict[str, Any]) -> str:
+        """Try to generate a message from the message template.
+
+        Args:
+            message (str): The message template.
+            cleaned_data (dict[str, Any]): The cleaned data from the form.
+
+        Returns:
+            str: The formatted message.
+        """
+        return message % cleaned_data
-- 
GitLab