123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- from importlib import import_module
- from django.utils import timezone
- from misago.conf import settings
- from misago.core import forms
- from misago.threads.models import Prefix
- START = 0
- REPLY = 1
- EDIT = 2
- class EditorFormset(object):
- """
- This is gigantozaurus that handles entire posting process
- * It stores context in which we are acting
- * It inits forms for posting view
- *
- """
- def __init__(self, **kwargs):
- self.errors = []
- self._forms_list = []
- self._forms_dict = {}
- self.kwargs = kwargs
- self.__dict__.update(kwargs)
- self.datetime = timezone.now()
- self.middlewares = []
- self._load_middlewares()
- @property
- def start_form(self):
- return self.mode == START
- @property
- def reply_form(self):
- return self.mode == REPLY
- @property
- def edit_form(self):
- return self.mode == EDIT
- def _load_middlewares(self):
- kwargs = self.kwargs.copy()
- kwargs['datetime'] = self.datetime
- for middleware in settings.MISAGO_POSTING_MIDDLEWARE:
- module_name = '.'.join(middleware.split('.')[:-1])
- class_name = middleware.split('.')[-1]
- middleware_module = import_module(module_name)
- middleware_class = getattr(middleware_module, class_name)
- middleware_obj = middleware_class(prefix=middleware, **kwargs)
- self.middlewares.append((middleware, middleware_obj))
- def get_forms_list(self):
- """return list of forms belonging to formset"""
- if not self._forms_list:
- self._build_forms_cache()
- return self._forms_list
- def get_forms_dict(self):
- """return list of forms belonging to formset"""
- if not self._forms_dict:
- self._build_forms_cache()
- return self._forms_dict
- def _build_forms_cache(self):
- for middleware, obj in self.middlewares:
- form = obj.make_form()
- if form:
- self._forms_dict[middleware] = form
- self._forms_list.append(form)
- def get_main_forms(self):
- """return list of main forms"""
- main_forms = []
- for form in self.get_forms_list():
- try:
- if form.is_main and form.legend:
- main_forms.append(form)
- except AttributeError:
- pass
- return main_forms
- def get_supporting_forms(self):
- """return list of supporting forms"""
- supporting_forms = []
- for form in self.get_forms_list():
- try:
- if form.is_supporting and form.legend:
- supporting_forms.append(form)
- except AttributeError:
- pass
- return supporting_forms
- def is_valid(self):
- """validate all forms"""
- all_forms_valid = True
- for form in self.get_forms_list():
- if not form.is_valid():
- all_forms_valid = False
- return all_forms_valid
- def save(self):
- """change state"""
- forms_dict = self.get_forms_dict()
- for middleware, obj in self.middlewares:
- obj.pre_save(forms_dict.get(middleware))
- for middleware, obj in self.middlewares:
- obj.save(forms_dict.get(middleware))
- for middleware, obj in self.middlewares:
- obj.post_save(forms_dict.get(middleware))
- def update(self):
- """handle POST that shouldn't result in state change"""
- forms_dict = self.get_forms_dict()
- for middleware, obj in self.middlewares:
- obj.pre_save(forms_dict.get(middleware))
- class EditorFormsetMiddleware(object):
- """
- Abstract middleware classes
- """
- def __init__(self, **kwargs):
- self.kwargs = kwargs
- self.__dict__.update(kwargs)
- def make_form(self):
- pass
- def pre_save(self, form):
- pass
- def save(self, form):
- pass
- def post_save(self, form):
- pass
|