diff --git a/mayan/apps/common/views.py b/mayan/apps/common/views.py index 1cfc265521..18a82b045e 100644 --- a/mayan/apps/common/views.py +++ b/mayan/apps/common/views.py @@ -14,6 +14,7 @@ from django.shortcuts import redirect, render_to_response from django.template import RequestContext from django.utils.http import urlencode from django.utils.translation import ugettext_lazy as _ +from django.views.generic import FormView from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.list import ListView @@ -394,3 +395,73 @@ class SingleObjectListView(MayanPermissionCheckMixin, ExtraContextMixin, MayanVi return queryset else: return queryset + + +class MultiFormView(FormView): + prefixes = {} + + prefix = None + + def get_form_kwargs(self, form_name): + kwargs = {} + kwargs.update({'initial': self.get_initial(form_name)}) + kwargs.update({'prefix': self.get_prefix(form_name)}) + + if self.request.method in ('POST', 'PUT'): + kwargs.update({ + 'data': self.request.POST, + 'files': self.request.FILES, + }) + + return kwargs + + def _create_form(self, form_name, klass): + form_kwargs = self.get_form_kwargs(form_name) + form_create_method = 'create_%s_form' % form_name + if hasattr(self, form_create_method): + form = getattr(self, form_create_method)(**form_kwargs) + else: + form = klass(**form_kwargs) + return form + + def get_forms(self, form_classes): + return dict([(key, self._create_form(key, klass)) for key, klass in form_classes.items()]) + + def get_initial(self, form_name): + initial_method = 'get_%s_initial' % form_name + if hasattr(self, initial_method): + return getattr(self, initial_method)() + else: + return self.initial.copy() + + def get_prefix(self, form_name): + return self.prefixes.get(form_name, self.prefix) + + def get(self, request, *args, **kwargs): + form_classes = self.get_form_classes() + forms = self.get_forms(form_classes) + return self.render_to_response(self.get_context_data(forms=forms)) + + def forms_valid(self, forms): + for form_name, form in forms.items(): + form_valid_method = '%s_form_valid' % form_name + + if hasattr(self, form_valid_method): + return getattr(self, form_valid_method)(form) + + self.all_forms_valid(forms) + + return HttpResponseRedirect(self.get_success_url()) + + def forms_invalid(self, forms): + return self.render_to_response(self.get_context_data(forms=forms)) + + def post(self, request, *args, **kwargs): + form_classes = self.get_form_classes() + form_name = request.POST.get('action') + forms = self.get_forms(form_classes) + + if all([form.is_valid() for form in forms.values()]): + return self.forms_valid(forms) + else: + return self.forms_invalid(forms) diff --git a/mayan/apps/main/templates/main/generic_multiform_subtemplate.html b/mayan/apps/main/templates/main/generic_multiform_subtemplate.html index 32bc7b409d..78c7f12e2f 100644 --- a/mayan/apps/main/templates/main/generic_multiform_subtemplate.html +++ b/mayan/apps/main/templates/main/generic_multiform_subtemplate.html @@ -11,7 +11,7 @@