Browse Source

Small changes in posting process

Rafał Pitoń 10 years ago
parent
commit
d64812c337

+ 2 - 2
misago/conf/defaults.py

@@ -170,12 +170,12 @@ MISAGO_ACL_EXTENSIONS = (
 
 MISAGO_MARKUP_EXTENSIONS = ()
 
-
-MISAGO_POSTING_MIDDLEWARE = (
+MISAGO_POSTING_MIDDLEWARES = (
     'misago.threads.posting.reply.ReplyFormMiddleware',
     'misago.threads.posting.threadstate.ThreadStateFormMiddleware',
     'misago.threads.posting.recordedit.RecordEditMiddleware',
     'misago.threads.posting.updatestats.UpdateStatsMiddleware',
+    # Note: always keep SaveChangesMiddleware middleware last one
     'misago.threads.posting.savechanges.SaveChangesMiddleware',
 )
 

+ 30 - 14
misago/threads/posting/__init__.py

@@ -16,10 +16,10 @@ REPLY = 1
 EDIT = 2
 
 
-class InterruptChanges(Exception):
+class PostingInterrupt(Exception):
     def __init__(self, message):
         if not message:
-            raise ValueError("You have to provide InterruptChanges message.")
+            raise ValueError("You have to provide PostingInterrupt message.")
         self.message = message
 
 
@@ -57,15 +57,20 @@ class EditorFormset(object):
             'parsing_result': {},
         })
 
-        for middleware in settings.MISAGO_POSTING_MIDDLEWARE:
+        for middleware in settings.MISAGO_POSTING_MIDDLEWARES:
             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))
+            try:
+                middleware_obj = middleware_class(prefix=middleware, **kwargs)
+                if middleware_obj.use_this_middleware():
+                    self.middlewares.append((middleware, middleware_obj))
+            except PostingInterrupt:
+                raise ValueError("Posting process can only be "
+                                 "interrupted during pre_save phase")
 
     def get_forms_list(self):
         """return list of forms belonging to formset"""
@@ -80,11 +85,15 @@ class EditorFormset(object):
         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)
+        try:
+            for middleware, obj in self.middlewares:
+                form = obj.make_form()
+                if form:
+                    self._forms_dict[middleware] = form
+                    self._forms_list.append(form)
+        except PostingInterrupt:
+            raise ValueError("Posting process can only be "
+                             "interrupted during pre_save phase")
 
     def get_main_forms(self):
         """return list of main forms"""
@@ -121,10 +130,14 @@ class EditorFormset(object):
         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))
+        try:
+            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))
+        except PostingInterrupt:
+            raise ValueError("Posting process can only be "
+                             "interrupted during pre_save phase")
 
     def update(self):
         """handle POST that shouldn't result in state change"""
@@ -141,6 +154,9 @@ class PostingMiddleware(object):
         self.kwargs = kwargs
         self.__dict__.update(kwargs)
 
+    def use_this_middleware(self):
+        return True
+
     def make_form(self):
         pass
 

+ 1 - 1
misago/threads/posting/reply.py

@@ -42,7 +42,7 @@ class ReplyFormMiddleware(PostingMiddleware):
             self.post.save()# We need post id for checksum
 
         self.post.post_checksum = update_post_checksum(self.post)
-        self.post.save(update_fields=['checksum'])
+        self.post.update_fields.append('checksum')
 
     def new_thread(self, form):
         self.thread.set_title(form.cleaned_data['title'])

+ 19 - 7
misago/threads/posting/savechanges.py

@@ -1,28 +1,40 @@
+from collections import OrderedDict
+
 from misago.threads.posting import PostingMiddleware
 
 
 class SaveChangesMiddleware(PostingMiddleware):
     def __init__(self, **kwargs):
         super(SaveChangesMiddleware, self).__init__(**kwargs)
+        self.reset_state()
 
-        self.user.save_model = False
-        self.forum.save_model = False
-        self.thread.save_model = False
-        self.post.save_model = False
+    def reset_state(self):
+        self.user.update_all = False
+        self.forum.update_all = False
+        self.thread.update_all = False
+        self.post.update_all = False
 
         self.user.update_fields = []
         self.forum.update_fields = []
         self.thread.update_fields = []
         self.post.update_fields = []
 
-    def save(self, form):
+    def save_models(self):
         self.save_model(self.user)
         self.save_model(self.forum)
         self.save_model(self.thread)
         self.save_model(self.post)
+        self.reset_state()
 
     def save_model(self, model):
-        if model.save_model:
+        if model.update_all:
             model.save()
         elif model.update_fields:
-           model.save(update_fields=model.update_fields)
+            update_fields = list(OrderedDict.fromkeys(model.update_fields))
+            model.save(update_fields=update_fields)
+
+    def save(self, form):
+        self.save_models()
+
+    def post_save(self, form):
+        self.save_models(self.user)

+ 2 - 2
misago/threads/posting/updatestats.py

@@ -16,7 +16,7 @@ class UpdateStatsMiddleware(PostingMiddleware):
         if self.mode != EDIT:
             self.forum.set_last_thread(self.thread)
             self.forum.posts += F('posts') + 1
-            self.forum.save_model = True
+            self.forum.update_all = True
 
     def update_thread(self):
         if self.mode == START:
@@ -28,7 +28,7 @@ class UpdateStatsMiddleware(PostingMiddleware):
         if self.mode == REPLY:
             self.thread.replies += F('replies') + 1
 
-        self.thread.save_model = True
+        self.thread.update_all = True
 
     def update_user(self):
         if self.mode == START:

+ 2 - 2
misago/threads/views/generic.py

@@ -13,7 +13,7 @@ from misago.forums.lists import get_forums_list, get_forum_path
 from misago.forums.models import Forum
 from misago.forums.permissions import allow_see_forum, allow_browse_forum
 
-from misago.threads.posting import (InterruptChanges, EditorFormset,
+from misago.threads.posting import (PostingInterrupt, EditorFormset,
                                     START, REPLY, EDIT)
 from misago.threads.models import ANNOUNCEMENT, Thread, Post
 from misago.threads.permissions import allow_see_thread, allow_start_thread
@@ -316,7 +316,7 @@ class EditorView(ViewBase):
                 try:
                     formset.save()
                     return redirect(thread.get_absolute_url())
-                except InterruptChanges as e:
+                except PostingInterrupt as e:
                     messages.error(request, e.message)
             else:
                 formset.update()