Source code for control_chart.multiform

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
View class to create at Form at of multiple ModelsForms
"""

from django.http import HttpResponseForbidden, HttpResponseRedirect
from django.views.generic.base import ContextMixin, TemplateResponseMixin
from django.views.generic.edit import ProcessFormView


[docs]class MultiFormMixin(ContextMixin): """ Mixin Class to handle the data of a MultiFormView """ form_classes = {} prefixes = {} success_urls = {} grouped_forms = {} initial = {} prefix = None success_url = None
[docs] def get_form_classes(self): """ Retruns a dictonary with the classes of the used ModelForms """ return self.form_classes
[docs] def get_forms(self, form_classes, form_names=None, bind_all=False): """ Creates the form instances out of the given form classes :param form_classes: Dictonary with form classes :param form_names: List of forms which data should be used in the kwargs :param bind_all: Set True to use the data of all forms :return: Dictonary with the created form instances """ return dict( [(key, self._create_form( key, cls, (form_names and key in form_names) or bind_all)) \ for key, cls in form_classes.items()])
[docs] def get_form_kwargs(self, form_name, bind_form=False): """ Gets the prefix, initials and POST arguments from a given form :param form_name: Name of the form :param bind_form: Set True to read the POST data :return: Dictionary with the following keys ['initial', 'prefix' and 'data', files (only if bind_form)] """ kwargs = {} kwargs.update({'initial': self.get_initial(form_name)}) kwargs.update({'prefix': self.get_prefix(form_name)}) if bind_form: kwargs.update(self._bind_form_data()) return kwargs
[docs] def forms_valid(self, forms, form_name): """ Calls the form_valid method of the given form :param forms: Dictonary of all Form classes :param form_name: Form name which should check :return: Returns the result of the from_valid method or redirects to the success_url if the form has no valid method """ form_valid_method = '%s_form_valid' % form_name if hasattr(self, form_valid_method): return getattr(self, form_valid_method)(forms[form_name]) else: return HttpResponseRedirect(self.get_success_url(form_name))
[docs] def forms_invalid(self, forms): """ Renders the forms """ return self.render_to_response(self.get_context_data(forms=forms))
[docs] def get_initial(self, form_name): """ Calls the get_initial method for the given fomr :param form_name: Name of the form :return: Dictonary with initial data """ initial_method = 'get_%s_initial' % form_name if hasattr(self, initial_method): return getattr(self, initial_method)() else: return self.initial.copy()
[docs] def get_prefix(self, form_name): """ Prefix of the given form """ return self.prefixes.get(form_name, self.prefix)
[docs] def get_success_url(self, form_name=None): """ Returns the success_url form the given form or if no form_name given the success_url of the MultiForm """ return self.success_urls.get(form_name, self.success_url)
def _create_form(self, form_name, klass, bind_form): form_kwargs = self.get_form_kwargs(form_name, bind_form) 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 _bind_form_data(self): if self.request.method in ('POST', 'PUT'): return {'data': self.request.POST, 'files': self.request.FILES, } return {}
[docs]class MultiFormsView(TemplateResponseMixin, MultiFormMixin, ProcessFormView): """ View class to create at Form at of multiple ModelsForms """ 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 post(self, request, *args, **kwargs): form_classes = self.get_form_classes() form_name = request.POST.get('action') if self._individual_exists(form_name): return self._process_individual_form(form_name, form_classes) elif self._group_exists(form_name): return self._process_grouped_forms(form_name, form_classes) else: return self._process_all_forms(form_classes) def _individual_exists(self, form_name): return form_name in self.form_classes def _group_exists(self, group_name): return group_name in self.grouped_forms def _process_individual_form(self, form_name, form_classes): forms = self.get_forms(form_classes, (form_name,)) form = forms.get(form_name) if not form: return HttpResponseForbidden() elif form.is_valid(): return self.forms_valid(forms, form_name) else: return self.forms_invalid(forms) def _process_grouped_forms(self, group_name, form_classes): form_names = self.grouped_forms[group_name] forms = self.get_forms(form_classes, form_names) if all([forms.get(form_name).is_valid() for form_name in form_names.values()]): return self.forms_valid(forms, '') else: return self.forms_invalid(forms) def _process_all_forms(self, form_classes): forms = self.get_forms(form_classes, None, True) if all([form.is_valid() for form in forms.values()]): return self.forms_valid(forms, '') else: return self.forms_invalid(forms)