Merge pull request #185 from ixc/ixc/improve-performance-master
Fixed #162 -- Improve performance of sort view.master
commit
f6522d0a49
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 %}
|
||||||
|
|
|
||||||
|
|
@ -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 %}
|
||||||
|
|
|
||||||
|
|
@ -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 }}" />
|
||||||
|
|
|
||||||
|
|
@ -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 %}
|
||||||
|
|
@ -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())
|
|
||||||
Loading…
Reference in New Issue