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 ] + urls
return 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): def sort_view(self, request):
""" """
Custom admin view that displays the objects as a list whose sort 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) \ jquery_lib_path = 'admin/js/jquery.js' if VERSION < (1, 9) \
else 'admin/js/vendor/jquery/jquery.js' 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 # Determine if we need to regroup objects relative to a
# foreign key specified on the model class that is extending Sortable. # foreign key specified on the model class that is extending Sortable.
# Legacy support for 'sortable_by' defined as a model property # 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_display_name = \
sortable_by_class_is_sortable = None sortable_by_class_is_sortable = None
objects = self.get_sort_view_queryset(request, sortable_by_expression)
if sortable_by_property or sortable_by_fk: if sortable_by_property or sortable_by_fk:
# Order the objects by the property they are sortable by, # Order the objects by the property they are sortable by,
# then by the order, otherwise the regroup # then by the order, otherwise the regroup

View File

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

View File

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

View File

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

View File

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