Merge pull request #185 from ixc/ixc/improve-performance-master

Fixed #162 -- Improve performance of sort view.
master
Brandon Taylor 2018-03-19 21:19:20 -04:00 committed by GitHub
commit f6522d0a49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 29 additions and 57 deletions

View File

@ -102,6 +102,24 @@ class SortableAdmin(SortableAdminBase, ModelAdmin):
] + urls
return urls
def get_sort_view_queryset(self, request, sortable_by_expression):
"""
Return a queryset, optionally filtered based on request and
`sortable_by_expression` to be used in the sort view.
"""
# get sort group index from querystring if present
sort_filter_index = request.GET.get('sort_filter')
filters = {}
if sort_filter_index:
try:
filters = self.model.sorting_filters[int(sort_filter_index)][1]
except (IndexError, ValueError):
pass
# Apply any sort filters to create a subset of sortable objects
return self.get_queryset(request).filter(**filters)
def sort_view(self, request):
"""
Custom admin view that displays the objects as a list whose sort
@ -115,19 +133,6 @@ class SortableAdmin(SortableAdminBase, ModelAdmin):
jquery_lib_path = 'admin/js/jquery.js' if VERSION < (1, 9) \
else 'admin/js/vendor/jquery/jquery.js'
# get sort group index from querystring if present
sort_filter_index = request.GET.get('sort_filter')
filters = {}
if sort_filter_index:
try:
filters = self.model.sorting_filters[int(sort_filter_index)][1]
except (IndexError, ValueError):
pass
# Apply any sort filters to create a subset of sortable objects
objects = self.get_queryset(request).filter(**filters)
# Determine if we need to regroup objects relative to a
# foreign key specified on the model class that is extending Sortable.
# Legacy support for 'sortable_by' defined as a model property
@ -175,6 +180,8 @@ class SortableAdmin(SortableAdminBase, ModelAdmin):
sortable_by_class_display_name = \
sortable_by_class_is_sortable = None
objects = self.get_sort_view_queryset(request, sortable_by_expression)
if sortable_by_property or sortable_by_fk:
# Order the objects by the property they are sortable by,
# then by the order, otherwise the regroup

View File

@ -1,5 +1,5 @@
{% extends "admin/base_site.html" %}
{% load i18n admin_urls static admin_list adminsortable_tags %}
{% load i18n admin_urls static admin_list %}
{% block extrastyle %}
{{ block.super }}
@ -86,9 +86,9 @@
{% if objects %}
<div id="sortable">
{% if group_expression %}
{% render_nested_sortable_objects objects group_expression %}
{% include "adminsortable/shared/nested_objects.html" %}
{% else %}
{% render_sortable_objects objects %}
{% include "adminsortable/shared/objects.html" %}
{% endif %}
{% csrf_token %}
</div>

View File

@ -1,9 +1,8 @@
{% load adminsortable_tags %}
{% with list_objects_length=list_objects|length %}
{% for object in list_objects %}
<li>
{% if list_objects_length > 1 %}
{% render_object_rep object forloop %}
{% include "adminsortable/shared/object_rep.html" %}
{% else %}
{{ object }}
{% endif %}

View File

@ -1,4 +1,4 @@
{% load django_template_additions adminsortable_tags %}
{% load django_template_additions %}
{% dynamic_regroup objects by group_expression as regrouped_objects %}
{% if regrouped_objects %}
<ul {% if sortable_by_class_is_sortable %}class="sortable"{% endif %}>
@ -6,7 +6,7 @@
{% with object=regrouped_object.grouper %}
{% if object %}
<li class="parent">{% if sortable_by_class_is_sortable %}
{% render_object_rep object forloop %}
{% include "adminsortable/shared/object_rep.html" %}
{% else %}
{{ object }}
{% endif %}
@ -14,7 +14,7 @@
{% if regrouped_object.list %}
{% with regrouped_object_list_length=regrouped_object.list|length %}
<ul {% if regrouped_object_list_length > 1 %}class="sortable"{% endif %}>
{% render_list_items regrouped_object.list %}
{% include "adminsortable/shared/list_items.html" with list_objects=regrouped_object.list %}
</ul>
{% endwith %}
{% endif %}

View File

@ -1,4 +1,4 @@
{% load adminsortable_tags admin_urls %}
{% load admin_urls %}
<form>
<input name="pk" type="hidden" value="{{ object.pk }}" />

View File

@ -1,7 +1,5 @@
{% load adminsortable_tags %}
{% if objects %}
<ul class="sortable single">
{% render_list_items objects %}
{% include "adminsortable/shared/list_items.html" with list_objects=objects %}
</ul>
{% endif %}

View File

@ -1,32 +0,0 @@
from django.template.loader import render_to_string
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def render_sortable_objects(context, objects,
sortable_objects_template='adminsortable/shared/objects.html'):
context.update({'objects': objects})
return render_to_string(sortable_objects_template, context.flatten())
@register.simple_tag(takes_context=True)
def render_nested_sortable_objects(context, objects, group_expression,
sortable_nested_objects_template='adminsortable/shared/nested_objects.html'):
context.update({'objects': objects, 'group_expression': group_expression})
return render_to_string(sortable_nested_objects_template, context.flatten())
@register.simple_tag(takes_context=True)
def render_list_items(context, list_objects,
sortable_list_items_template='adminsortable/shared/list_items.html'):
context.update({'list_objects': list_objects})
return render_to_string(sortable_list_items_template, context.flatten())
@register.simple_tag(takes_context=True)
def render_object_rep(context, obj, forloop,
sortable_object_rep_template='adminsortable/shared/object_rep.html'):
context.update({'object': obj, 'forloop': forloop})
return render_to_string(sortable_object_rep_template, context.flatten())