Browse Source

WIP: delete posts from thread

Rafał Pitoń 10 years ago
parent
commit
8633db5484

+ 1 - 1
misago/threads/models/thread.py

@@ -58,7 +58,7 @@ class Thread(models.Model):
         return self.title
         return self.title
 
 
     def lock(self):
     def lock(self):
-        return Forum.objects.select_for_update().get(id=self.id)
+        return Thread.objects.select_for_update().get(id=self.id)
 
 
     def delete(self, *args, **kwargs):
     def delete(self, *args, **kwargs):
         from misago.threads.signals import delete_thread
         from misago.threads.signals import delete_thread

+ 41 - 0
misago/threads/moderation/posts.py

@@ -1 +1,42 @@
+from django.db.transaction import atomic
+from django.utils.translation import ugettext as _
+
 from misago.threads.moderation.exceptions import ModerationError
 from misago.threads.moderation.exceptions import ModerationError
+
+
+@atomic
+def unhide_post(user, post):
+    if post.pk == post.thread.first_post_id:
+        raise ModerationError(_("You can't make original post "
+                                " visible without revealing thread."))
+
+    if post.is_hidden:
+        post.is_hidden = False
+        post.save(update_fields=['is_hidden'])
+        return True
+    else:
+        return False
+
+
+@atomic
+def hide_post(user, post):
+    if post.pk == post.thread.first_post_id:
+        raise ModerationError(_("You can't hide original "
+                                "post without hiding thread."))
+
+    if not post.is_hidden:
+        post.is_hidden = True
+        post.save(update_fields=['is_hidden'])
+        return True
+    else:
+        return False
+
+
+@atomic
+def delete_post(user, post):
+    if post.pk == post.thread.first_post_id:
+        raise ModerationError(_("You can't delete original "
+                                "post without deleting thread."))
+
+    post.delete()
+    return True

+ 1 - 1
misago/threads/moderation/threads.py

@@ -1,5 +1,5 @@
 from django.db.transaction import atomic
 from django.db.transaction import atomic
-from django.utils.translation import ugettext_lazy, ugettext as _
+from django.utils.translation import ugettext as _
 
 
 from misago.threads.events import record_event
 from misago.threads.events import record_event
 
 

+ 73 - 2
misago/threads/views/generic/thread/postsactions.py

@@ -1,3 +1,5 @@
+from django.contrib import messages
+from django.db.transaction import atomic
 from django.utils.translation import ungettext, ugettext_lazy, ugettext as _
 from django.utils.translation import ungettext, ugettext_lazy, ugettext as _
 
 
 from misago.threads import moderation
 from misago.threads import moderation
@@ -7,6 +9,26 @@ from misago.threads.views.generic.actions import ActionsBase
 __all__ = ['PostsActions']
 __all__ = ['PostsActions']
 
 
 
 
+def atomic_post_action(f):
+    def decorator(self, request, posts):
+        with atomic():
+            self.forum.lock()
+            self.thread.lock()
+
+            for post in posts:
+                post.thread = self.thread
+
+            response = f(self, request, posts)
+
+            self.thread.synchronize()
+            self.thread.save()
+            self.forum.synchronize()
+            self.forum.save()
+
+            return response
+    return decorator
+
+
 class PostsActions(ActionsBase):
 class PostsActions(ActionsBase):
     select_items_message = ugettext_lazy(
     select_items_message = ugettext_lazy(
         "You have to select at least one post.")
         "You have to select at least one post.")
@@ -40,11 +62,60 @@ class PostsActions(ActionsBase):
 
 
         return actions
         return actions
 
 
+    @atomic_post_action
     def action_unhide(self, request, posts):
     def action_unhide(self, request, posts):
-        pass
+        changed_posts = 0
+        for post in posts:
+            if moderation.unhide_post(request.user, post):
+                changed_posts += 1
 
 
+        if changed_posts:
+            message = ungettext(
+                '%(changed)d post was made visible.',
+                '%(changed)d posts were made visible.',
+            changed_posts)
+            messages.success(request, message % {'changed': changed_posts})
+        else:
+            message = _("No posts were made visible.")
+            messages.info(request, message)
+
+    @atomic_post_action
     def action_hide(self, request, posts):
     def action_hide(self, request, posts):
+        changed_posts = 0
+        for post in posts:
+            if moderation.hide_post(request.user, post):
+                changed_posts += 1
+
+        if changed_posts:
+            message = ungettext(
+                '%(changed)d post was hidden.',
+                '%(changed)d posts were hidden.',
+            changed_posts)
+            messages.success(request, message % {'changed': changed_posts})
+        else:
+            message = _("No posts were hidden.")
+            messages.info(request, message)
         pass
         pass
 
 
+    @atomic_post_action
     def action_delete(self, request, posts):
     def action_delete(self, request, posts):
-        pass
+        changed_posts = 0
+        first_deleted = None
+
+        for post in posts:
+            if moderation.delete_post(request.user, post):
+                changed_posts += 1
+                if not first_deleted:
+                    first_deleted = post
+
+        if changed_posts:
+            message = ungettext(
+                '%(changed)d post was deleted.',
+                '%(changed)d posts were deleted.',
+            changed_posts)
+            messages.success(request, message % {'changed': changed_posts})
+
+
+        else:
+            message = _("No posts were deleted.")
+            messages.info(request, message)

+ 4 - 3
misago/threads/views/generic/thread/view.py

@@ -71,18 +71,19 @@ class ThreadView(ViewBase):
         thread_actions = self.ThreadActions(user=request.user, thread=thread)
         thread_actions = self.ThreadActions(user=request.user, thread=thread)
         posts_actions = self.PostsActions(user=request.user, thread=thread)
         posts_actions = self.PostsActions(user=request.user, thread=thread)
 
 
-        page, posts = self.get_posts(request.user, forum, thread, kwargs)
-
         if request.method == 'POST':
         if request.method == 'POST':
             if thread_actions.query_key in request.POST:
             if thread_actions.query_key in request.POST:
                 response = thread_actions.handle_post(request, thread)
                 response = thread_actions.handle_post(request, thread)
                 if response:
                 if response:
                     return response
                     return response
             if posts_actions.query_key in request.POST:
             if posts_actions.query_key in request.POST:
-                response = posts_actions.handle_post(request, posts)
+                queryset = self.get_posts_queryset(request.user, forum, thread)
+                response = posts_actions.handle_post(request, queryset)
                 if response:
                 if response:
                     return response
                     return response
 
 
+        page, posts = self.get_posts(request.user, forum, thread, kwargs)
+
         threadstracker.make_posts_read_aware(request.user, thread, posts)
         threadstracker.make_posts_read_aware(request.user, thread, posts)
         threadstracker.read_thread(request.user, thread, posts[-1])
         threadstracker.read_thread(request.user, thread, posts[-1])