diff --git a/src/core/views/mixins.py b/src/core/views/mixins.py new file mode 100644 index 0000000000000000000000000000000000000000..e8b2eb5377bf0989a334150366950ef624e80880 --- /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