Browse Source

small code cleanup, optimize attachments massdeletion

Rafał Pitoń 8 years ago
parent
commit
cfb8f4456e
2 changed files with 110 additions and 105 deletions
  1. 102 102
      misago/admin/views/generic/list.py
  2. 8 3
      misago/threads/views/admin/attachments.py

+ 102 - 102
misago/admin/views/generic/list.py

@@ -65,6 +65,108 @@ class ListView(AdminView):
     def get_queryset(self):
         return self.get_model().objects.all()
 
+    """
+    Dispatch response
+    """
+    def dispatch(self, request, *args, **kwargs):
+        mass_actions_list = self.mass_actions or []
+        extra_actions_list = self.extra_actions or []
+
+        refresh_querystring = False
+
+        context = {
+            'items': self.get_queryset(),
+
+            'paginator': None,
+            'page': None,
+
+            'order_by': [],
+            'order': None,
+
+            'search_form': None,
+            'active_filters': {},
+
+            'querystring': '',
+            'query_order': {},
+            'query_filters': {},
+
+            'selected_items': [],
+            'selection_label': self.selection_label,
+            'empty_selection_label': self.empty_selection_label,
+            'mass_actions': mass_actions_list,
+
+            'extra_actions': extra_actions_list,
+            'extra_actions_len': len(extra_actions_list),
+        }
+
+        if request.method == 'POST' and mass_actions_list:
+            try:
+                response = self.handle_mass_action(request, context)
+                if response:
+                    return response
+                else:
+                    return redirect(request.path)
+            except MassActionError as e:
+                messages.error(request, e.args[0])
+
+        if self.ordering:
+            ordering_methods = self.get_ordering_methods(request)
+            used_method = self.get_ordering_method_to_use(ordering_methods)
+            self.set_ordering_in_context(context, used_method)
+
+            if (ordering_methods['GET'] and
+                    ordering_methods['GET'] != ordering_methods['session']):
+                # Store GET ordering in session for future requests
+                session_key = self.ordering_session_key
+                request.session[session_key] = ordering_methods['GET']
+
+            if context['order_by'] and not ordering_methods['GET']:
+                # Make view redirect to itself with querystring,
+                # So address ball contains copy-friendly link
+                refresh_querystring = True
+
+        SearchForm = self.get_search_form(request)
+        if SearchForm:
+            filtering_methods = self.get_filtering_methods(request)
+            active_filters = self.get_filtering_method_to_use(
+                filtering_methods)
+            if request.GET.get('clear_filters'):
+                # Clear filters from querystring
+                request.session.pop(self.filters_session_key, None)
+                active_filters = {}
+            self.apply_filtering_on_context(
+                context, active_filters, SearchForm)
+
+            if (filtering_methods['GET'] and
+                    filtering_methods['GET'] != filtering_methods['session']):
+                # Store GET filters in session for future requests
+                session_key = self.filters_session_key
+                request.session[session_key] = filtering_methods['GET']
+            if request.GET.get('set_filters'):
+                # Force store filters in session
+                session_key = self.filters_session_key
+                request.session[session_key] = context['active_filters']
+                refresh_querystring = True
+
+            if context['active_filters'] and not filtering_methods['GET']:
+                # Make view redirect to itself with querystring,
+                # So address ball contains copy-friendly link
+                refresh_querystring = True
+
+        self.make_querystrings(context)
+
+        if self.items_per_page:
+            try:
+                self.paginate_items(context, kwargs.get('page', 0))
+            except EmptyPage:
+                return redirect(
+                    '%s%s' % (reverse(self.root_link), context['querystring']))
+
+        if refresh_querystring:
+            return redirect('%s%s' % (request.path, context['querystring']))
+
+        return self.render(request, context)
+
     def paginate_items(self, context, page):
         try:
             page = int(page)
@@ -258,105 +360,3 @@ class ListView(AdminView):
             context['query_order'] = order_values
         if filter_values:
             context['query_filters'] = filter_values
-
-    """
-    Dispatch response
-    """
-    def dispatch(self, request, *args, **kwargs):
-        mass_actions_list = self.mass_actions or []
-        extra_actions_list = self.extra_actions or []
-
-        refresh_querystring = False
-
-        context = {
-            'items': self.get_queryset(),
-
-            'paginator': None,
-            'page': None,
-
-            'order_by': [],
-            'order': None,
-
-            'search_form': None,
-            'active_filters': {},
-
-            'querystring': '',
-            'query_order': {},
-            'query_filters': {},
-
-            'selected_items': [],
-            'selection_label': self.selection_label,
-            'empty_selection_label': self.empty_selection_label,
-            'mass_actions': mass_actions_list,
-
-            'extra_actions': extra_actions_list,
-            'extra_actions_len': len(extra_actions_list),
-        }
-
-        if request.method == 'POST' and mass_actions_list:
-            try:
-                response = self.handle_mass_action(request, context)
-                if response:
-                    return response
-                else:
-                    return redirect(request.path)
-            except MassActionError as e:
-                messages.error(request, e.args[0])
-
-        if self.ordering:
-            ordering_methods = self.get_ordering_methods(request)
-            used_method = self.get_ordering_method_to_use(ordering_methods)
-            self.set_ordering_in_context(context, used_method)
-
-            if (ordering_methods['GET'] and
-                    ordering_methods['GET'] != ordering_methods['session']):
-                # Store GET ordering in session for future requests
-                session_key = self.ordering_session_key
-                request.session[session_key] = ordering_methods['GET']
-
-            if context['order_by'] and not ordering_methods['GET']:
-                # Make view redirect to itself with querystring,
-                # So address ball contains copy-friendly link
-                refresh_querystring = True
-
-        SearchForm = self.get_search_form(request)
-        if SearchForm:
-            filtering_methods = self.get_filtering_methods(request)
-            active_filters = self.get_filtering_method_to_use(
-                filtering_methods)
-            if request.GET.get('clear_filters'):
-                # Clear filters from querystring
-                request.session.pop(self.filters_session_key, None)
-                active_filters = {}
-            self.apply_filtering_on_context(
-                context, active_filters, SearchForm)
-
-            if (filtering_methods['GET'] and
-                    filtering_methods['GET'] != filtering_methods['session']):
-                # Store GET filters in session for future requests
-                session_key = self.filters_session_key
-                request.session[session_key] = filtering_methods['GET']
-            if request.GET.get('set_filters'):
-                # Force store filters in session
-                session_key = self.filters_session_key
-                request.session[session_key] = context['active_filters']
-                refresh_querystring = True
-
-            if context['active_filters'] and not filtering_methods['GET']:
-                # Make view redirect to itself with querystring,
-                # So address ball contains copy-friendly link
-                refresh_querystring = True
-
-        self.make_querystrings(context)
-
-        if self.items_per_page:
-            try:
-                self.paginate_items(context, kwargs.get('page', 0))
-            except EmptyPage:
-                return redirect(
-                    '%s%s' % (reverse(self.root_link), context['querystring']))
-
-        if refresh_querystring:
-            return redirect('%s%s' % (request.path, context['querystring']))
-
-        return self.render(request, context)

+ 8 - 3
misago/threads/views/admin/attachments.py

@@ -1,5 +1,6 @@
 from django.contrib import messages
 from django.core.urlresolvers import reverse
+from django.db import transaction
 from django.db.models import Count
 from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
@@ -39,6 +40,7 @@ class AttachmentsList(AttachmentAdmin, generic.ListView):
             'name': _("Delete attachments"),
             'icon': 'fa fa-times-circle',
             'confirmation': _("Are you sure you want to delete selected attachments?"),
+            'is_atomic': False
         }
     ]
 
@@ -53,11 +55,14 @@ class AttachmentsList(AttachmentAdmin, generic.ListView):
             if attachment.post:
                 deleted_attachments.append(attachment.pk)
                 desynced_posts.append(attachment.post_id)
-            attachment.delete()
 
         if desynced_posts:
-            for post in Post.objects.select_for_update().filter(id__in=desynced_posts):
-                self.delete_from_cache(post, deleted_attachments)
+            with transaction.atomic():
+                for post in Post.objects.select_for_update().filter(id__in=desynced_posts):
+                    self.delete_from_cache(post, deleted_attachments)
+
+        for attachment in attachments:
+            attachment.delete()
 
         message = _("Selected attachments have been deleted.")
         messages.success(request, message)