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