posting.py 4.2 KB

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