Просмотр исходного кода

#466: maintain right page after deletion

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

+ 12 - 1
misago/threads/views/generic/actions.py

@@ -7,7 +7,11 @@ from misago.core.exceptions import AjaxError
 from misago.threads.moderation import ModerationError
 from misago.threads.moderation import ModerationError
 
 
 
 
-__all__ = ['ActionsBase']
+__all__ = ['ActionsBase', 'ReloadAfterDelete']
+
+
+class ReloadAfterDelete(object):
+    pass
 
 
 
 
 class ActionsBase(object):
 class ActionsBase(object):
@@ -82,6 +86,9 @@ class ActionsBase(object):
                 response = action(request, filtered_queryset, action_arg)
                 response = action(request, filtered_queryset, action_arg)
             else:
             else:
                 response = action(request, filtered_queryset)
                 response = action(request, filtered_queryset)
+
+            if isinstance(response, ReloadAfterDelete):
+                return self.redirect_after_deletion(request, queryset)
             if response:
             if response:
                 return response
                 return response
             elif request.is_ajax():
             elif request.is_ajax():
@@ -92,6 +99,10 @@ class ActionsBase(object):
         else:
         else:
             raise ModerationError(self.select_items_message)
             raise ModerationError(self.select_items_message)
 
 
+    def redirect_after_deletion(self, request, queryset):
+        raise NotImplementedError("action handlers should declare their own "
+                                  "redirect_after_deletion methods")
+
     def handle_single_action(self, request, target):
     def handle_single_action(self, request, target):
         action, action_arg = self.resolve_action(request)
         action, action_arg = self.resolve_action(request)
 
 

+ 4 - 2
misago/threads/views/generic/forum/actions.py

@@ -9,10 +9,10 @@ from misago.forums.lists import get_forum_path
 from misago.threads import moderation
 from misago.threads import moderation
 from misago.threads.forms.moderation import MergeThreadsForm, MoveThreadsForm
 from misago.threads.forms.moderation import MergeThreadsForm, MoveThreadsForm
 from misago.threads.models import Thread
 from misago.threads.models import Thread
-from misago.threads.views.generic.threads import Actions
+from misago.threads.views.generic.threads import Actions, ReloadAfterDelete
 
 
 
 
-__all__ = ['ForumActions']
+__all__ = ['ForumActions', 'ReloadAfterDelete']
 
 
 
 
 class ForumActions(Actions):
 class ForumActions(Actions):
@@ -379,6 +379,8 @@ class ForumActions(Actions):
                 '%(changed)d threads were deleted.',
                 '%(changed)d threads were deleted.',
             changed_threads)
             changed_threads)
             messages.success(request, message % {'changed': changed_threads})
             messages.success(request, message % {'changed': changed_threads})
+
+            return ReloadAfterDelete()
         else:
         else:
             message = _("No threads were deleted.")
             message = _("No threads were deleted.")
             messages.info(request, message)
             messages.info(request, message)

+ 20 - 3
misago/threads/views/generic/thread/postsactions.py

@@ -1,9 +1,12 @@
 from django.contrib import messages
 from django.contrib import messages
 from django.db.transaction import atomic
 from django.db.transaction import atomic
+from django.http import Http404
+from django.shortcuts import redirect
 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
-from misago.threads.views.generic.actions import ActionsBase
+from misago.threads.paginator import Paginator
+from misago.threads.views.generic.actions import ActionsBase, ReloadAfterDelete
 
 
 
 
 __all__ = ['PostsActions']
 __all__ = ['PostsActions']
@@ -34,6 +37,21 @@ class PostsActions(ActionsBase):
         "You have to select at least one post.")
         "You have to select at least one post.")
     is_mass_action = True
     is_mass_action = True
 
 
+    def redirect_after_deletion(self, request, queryset):
+        paginator = Paginator(queryset, 10, 3)
+        current_page = int(request.resolver_match.kwargs.get('page', 0))
+
+        if paginator.num_pages < current_page:
+            namespace = request.resolver_match.namespace
+            url_name = request.resolver_match.url_name
+            kwars = request.resolver_match.kwargs
+            kwars['page'] = paginator.num_pages
+            if kwars['page'] == 1:
+                del kwars['page']
+            return redirect('%s:%s' % (namespace, url_name), **kwars)
+        else:
+            return redirect(request.path)
+
     def get_available_actions(self, kwargs):
     def get_available_actions(self, kwargs):
         self.thread = kwargs['thread']
         self.thread = kwargs['thread']
         self.forum = self.thread.forum
         self.forum = self.thread.forum
@@ -114,8 +132,7 @@ class PostsActions(ActionsBase):
                 '%(changed)d posts were deleted.',
                 '%(changed)d posts were deleted.',
             changed_posts)
             changed_posts)
             messages.success(request, message % {'changed': changed_posts})
             messages.success(request, message % {'changed': changed_posts})
-
-
+            return ReloadAfterDelete()
         else:
         else:
             message = _("No posts were deleted.")
             message = _("No posts were deleted.")
             messages.info(request, message)
             messages.info(request, message)

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

@@ -1,5 +1,6 @@
 # flake8: noqa
 # flake8: noqa
-from misago.threads.views.generic.threads.actions import Actions
+from misago.threads.views.generic.threads.actions import (Actions,
+                                                          ReloadAfterDelete)
 from misago.threads.views.generic.threads.sorting import Sorting
 from misago.threads.views.generic.threads.sorting import Sorting
 from misago.threads.views.generic.threads.threads import Threads
 from misago.threads.views.generic.threads.threads import Threads
 from misago.threads.views.generic.threads.view import ThreadsView
 from misago.threads.views.generic.threads.view import ThreadsView

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

@@ -1,12 +1,13 @@
 from django.contrib import messages
 from django.contrib import messages
+from django.core.paginator import Paginator
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 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
-from misago.threads.views.generic.actions import ActionsBase
+from misago.threads.views.generic.actions import ActionsBase, ReloadAfterDelete
 
 
 
 
-__all__ = ['Actions']
+__all__ = ['Actions', 'ReloadAfterDelete']
 
 
 
 
 class Actions(ActionsBase):
 class Actions(ActionsBase):
@@ -14,6 +15,21 @@ class Actions(ActionsBase):
         "You have to select at least one thread.")
         "You have to select at least one thread.")
     is_mass_action = True
     is_mass_action = True
 
 
+    def redirect_after_deletion(self, request, queryset):
+        paginator = Paginator(queryset, 20, 10)
+        current_page = int(request.resolver_match.kwargs.get('page', 0))
+
+        if paginator.num_pages < current_page:
+            namespace = request.resolver_match.namespace
+            url_name = request.resolver_match.url_name
+            kwars = request.resolver_match.kwargs
+            kwars['page'] = paginator.num_pages
+            if kwars['page'] == 1:
+                del kwars['page']
+            return redirect('%s:%s' % (namespace, url_name), **kwars)
+        else:
+            return redirect(request.path)
+
     def action_approve(self, request, threads):
     def action_approve(self, request, threads):
         changed_threads = 0
         changed_threads = 0
         for thread in threads:
         for thread in threads: