posting.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. from importlib import import_module
  2. from django.utils import timezone
  3. from misago.conf import settings
  4. from misago.core import forms
  5. from misago.threads.models import Prefix
  6. START = 0
  7. REPLY = 1
  8. EDIT = 2
  9. class EditorFormset(object):
  10. """
  11. This is gigantozaurus that handles entire posting process
  12. * It stores context in which we are acting
  13. * It inits forms for posting view
  14. *
  15. """
  16. def __init__(self, **kwargs):
  17. self.errors = []
  18. self._forms_list = []
  19. self._forms_dict = {}
  20. self.kwargs = kwargs
  21. self.__dict__.update(kwargs)
  22. self.datetime = timezone.now()
  23. self.middlewares = []
  24. self._load_middlewares()
  25. @property
  26. def start_form(self):
  27. return self.mode == START
  28. @property
  29. def reply_form(self):
  30. return self.mode == REPLY
  31. @property
  32. def edit_form(self):
  33. return self.mode == EDIT
  34. def _load_middlewares(self):
  35. kwargs = self.kwargs.copy()
  36. kwargs.update({
  37. 'datetime': self.datetime,
  38. 'parsing_result': {},
  39. })
  40. for middleware in settings.MISAGO_POSTING_MIDDLEWARE:
  41. module_name = '.'.join(middleware.split('.')[:-1])
  42. class_name = middleware.split('.')[-1]
  43. middleware_module = import_module(module_name)
  44. middleware_class = getattr(middleware_module, class_name)
  45. middleware_obj = middleware_class(prefix=middleware, **kwargs)
  46. self.middlewares.append((middleware, middleware_obj))
  47. def get_forms_list(self):
  48. """return list of forms belonging to formset"""
  49. if not self._forms_list:
  50. self._build_forms_cache()
  51. return self._forms_list
  52. def get_forms_dict(self):
  53. """return list of forms belonging to formset"""
  54. if not self._forms_dict:
  55. self._build_forms_cache()
  56. return self._forms_dict
  57. def _build_forms_cache(self):
  58. for middleware, obj in self.middlewares:
  59. form = obj.make_form()
  60. if form:
  61. self._forms_dict[middleware] = form
  62. self._forms_list.append(form)
  63. def get_main_forms(self):
  64. """return list of main forms"""
  65. main_forms = []
  66. for form in self.get_forms_list():
  67. try:
  68. if form.is_main and form.legend:
  69. main_forms.append(form)
  70. except AttributeError:
  71. pass
  72. return main_forms
  73. def get_supporting_forms(self):
  74. """return list of supporting forms"""
  75. supporting_forms = []
  76. for form in self.get_forms_list():
  77. try:
  78. if form.is_supporting and form.legend:
  79. supporting_forms.append(form)
  80. except AttributeError:
  81. pass
  82. return supporting_forms
  83. def is_valid(self):
  84. """validate all forms"""
  85. all_forms_valid = True
  86. for form in self.get_forms_list():
  87. if not form.is_valid():
  88. all_forms_valid = False
  89. return all_forms_valid
  90. def save(self):
  91. """change state"""
  92. forms_dict = self.get_forms_dict()
  93. for middleware, obj in self.middlewares:
  94. obj.pre_save(forms_dict.get(middleware))
  95. for middleware, obj in self.middlewares:
  96. obj.save(forms_dict.get(middleware))
  97. for middleware, obj in self.middlewares:
  98. obj.post_save(forms_dict.get(middleware))
  99. def update(self):
  100. """handle POST that shouldn't result in state change"""
  101. forms_dict = self.get_forms_dict()
  102. for middleware, obj in self.middlewares:
  103. obj.pre_save(forms_dict.get(middleware))
  104. class EditorFormsetMiddleware(object):
  105. """
  106. Abstract middleware classes
  107. """
  108. def __init__(self, **kwargs):
  109. self.kwargs = kwargs
  110. self.__dict__.update(kwargs)
  111. def make_form(self):
  112. pass
  113. def pre_save(self, form):
  114. pass
  115. def save(self, form):
  116. pass
  117. def post_save(self, form):
  118. pass