Rafał Pitoń 10 лет назад
Родитель
Сommit
760dcf1c1b

+ 3 - 0
misago/conf/defaults.py

@@ -173,6 +173,9 @@ MISAGO_MARKUP_EXTENSIONS = ()
 
 MISAGO_POSTING_MIDDLEWARE = (
     'misago.threads.posting.reply.ReplyFormMiddleware',
+    'misago.threads.posting.recordedit.RecordEditMiddleware',
+    'misago.threads.posting.updatestats.UpdateStatsMiddleware',
+    'misago.threads.posting.savechanges.SaveChangesMiddleware',
 )
 
 

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

@@ -133,7 +133,7 @@ class EditorFormset(object):
             obj.pre_save(forms_dict.get(middleware))
 
 
-class EditorFormsetMiddleware(object):
+class PostingMiddleware(object):
     """
     Abstract middleware classes
     """

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

@@ -1,9 +1,9 @@
 from django.db.models import F
 
-from misago.threads.posting import EditorFormsetMiddleware, EDIT
+from misago.threads.posting import PostingMiddleware, EDIT
 
 
-class RecordEditMiddleware(EditorFormsetMiddleware):
+class RecordEditMiddleware(PostingMiddleware):
     def __init__(self, **kwargs):
         super(RecordEditMiddleware, self).__init__(**kwargs)
 

+ 24 - 43
misago/threads/posting/reply.py

@@ -1,14 +1,12 @@
-from django.db.models import F
-
 from misago.markup import Editor
 
 from misago.threads.checksums import update_post_checksum
 from misago.threads.forms.reply import (ReplyForm, ThreadForm,
                                         PrefixedThreadForm)
-from misago.threads.posting import EditorFormsetMiddleware, START, REPLY, EDIT
+from misago.threads.posting import PostingMiddleware, START, REPLY, EDIT
 
 
-class ReplyFormMiddleware(EditorFormsetMiddleware):
+class ReplyFormMiddleware(PostingMiddleware):
     def make_form(self):
         initial_data = {'title': self.thread.title, 'post': self.post.original}
 
@@ -30,54 +28,37 @@ class ReplyFormMiddleware(EditorFormsetMiddleware):
         self.parsing_result.update(form.parsing_result)
 
     def save(self, form):
-        # if we are starting new thread, create empty model
         if self.mode == START:
-            self.thread.set_title(form.cleaned_data['title'])
-            self.thread.starter_name = '-'
-            self.thread.starter_slug = '-'
-            self.thread.last_poster_name = '-'
-            self.thread.last_poster_slug = '-'
-            self.thread.started_on = self.datetime
-            self.thread.last_post_on = self.datetime
-            self.thread.save()
+            self.new_thread(form)
 
-        # make changes/set data on post
-        self.post.updated_on = self.datetime
         if self.mode == EDIT:
-            self.post.last_editor_name = self.user
-            self.post.poster_name = self.user.username
-            self.post.poster_slug = self.user.slug
+            self.edit_post()
         else:
-            self.post.thread = self.thread
-            self.post.poster = self.user
-            self.post.poster_name = self.user.username
-            self.post.poster_ip = self.request._misago_real_ip
-            self.post.posted_on = self.datetime
+            self.new_post()
 
+        self.post.updated_on = self.datetime
         self.post.post_checksum = update_post_checksum(self.post)
         self.post.save()
 
-        # Update thread
-        if self.mode == START:
-            self.forum.threads += 1
-            self.thread.set_first_post(self.post)
-
-        if self.mode != EDIT:
-            self.thread.set_last_post(self.post)
-        if self.mode != REPLY:
-            self.thread.replies += 1
+    def new_thread(self, form):
+        self.thread.set_title(form.cleaned_data['title'])
+        self.thread.starter_name = self.user.username
+        self.thread.starter_slug = self.user.slug
+        self.thread.last_poster_name = self.user.username
+        self.thread.last_poster_slug = self.user.slug
+        self.thread.started_on = self.datetime
+        self.thread.last_post_on = self.datetime
         self.thread.save()
 
-        # update forum
-        if self.mode != EDIT:
-            self.forum.set_last_thread(self.thread)
-            self.forum.posts += 1
-            self.forum.save()
+    def edit_post(self):
+        self.post.last_editor_name = self.user
+        self.post.poster_name = self.user.username
+        self.post.poster_slug = self.user.slug
 
-        # update poster
-        if self.mode == START:
-            self.user.threads = F('threads') + 1
+    def new_post(self):
+        self.post.thread = self.thread
+        self.post.poster = self.user
+        self.post.poster_name = self.user.username
+        self.post.poster_ip = self.request._misago_real_ip
+        self.post.posted_on = self.datetime
 
-        if self.mode != EDIT:
-            self.user.posts = F('posts') + 1
-        self.user.save(update_fields=['threads', 'posts'])

+ 28 - 0
misago/threads/posting/savechanges.py

@@ -0,0 +1,28 @@
+from misago.threads.posting import PostingMiddleware
+
+
+class SaveChangesMiddleware(PostingMiddleware):
+    def __init__(self, **kwargs):
+        super(SaveChangesMiddleware, self).__init__(**kwargs)
+
+        self.user.save_model = False
+        self.forum.save_model = False
+        self.thread.save_model = False
+        self.post.save_model = False
+
+        self.user.update_fields = []
+        self.forum.update_fields = []
+        self.thread.update_fields = []
+        self.post.update_fields = []
+
+    def save(self, form):
+        self.save_model(self.user)
+        self.save_model(self.forum)
+        self.save_model(self.thread)
+        self.save_model(self.post)
+
+    def save_model(self, model):
+        if model.save_model:
+            model.save()
+        elif model.update_fields:
+           model.save(update_fields=model.update_fields)

+ 40 - 0
misago/threads/posting/updatestats.py

@@ -0,0 +1,40 @@
+from django.db.models import F
+
+from misago.threads.posting import PostingMiddleware, START, REPLY, EDIT
+
+
+class UpdateStatsMiddleware(PostingMiddleware):
+    def save(self, form):
+        self.update_thread()
+        self.update_forum()
+        self.update_user()
+
+    def update_forum(self):
+        if self.mode == START:
+            self.forum.threads += F('threads') + 1
+
+        if self.mode != EDIT:
+            self.forum.set_last_thread(self.thread)
+            self.forum.posts += F('posts') + 1
+            self.forum.save_model = True
+
+    def update_thread(self):
+        if self.mode == START:
+            self.thread.set_first_post(self.post)
+
+        if self.mode != EDIT:
+            self.thread.set_last_post(self.post)
+
+        if self.mode != REPLY:
+            self.thread.replies += F('replies') + 1
+
+        self.thread.save_model = True
+
+    def update_user(self):
+        if self.mode == START:
+            self.user.threads = F('threads') + 1
+            self.user.update_fields.append('threads')
+
+        if self.mode != EDIT:
+            self.user.posts = F('posts') + 1
+            self.user.update_fields.append('posts')