Fixed the inline stacked sortable template by passing in the original object rather than passing in the model type id of the original object.
Various PEP8 enhancements.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
VERSION = (1, 3, 5) # following PEP 386
|
||||
VERSION = (1, 3, 5, 1) # following PEP 386
|
||||
DEV_N = None
|
||||
|
||||
|
||||
|
||||
+28
-27
@@ -17,7 +17,8 @@ STATIC_URL = settings.STATIC_URL
|
||||
|
||||
class SortableAdmin(ModelAdmin):
|
||||
"""
|
||||
|
||||
Admin class to add template overrides and context objects to enable drag-and-drop
|
||||
ordering.
|
||||
"""
|
||||
ordering = ('order', 'id')
|
||||
|
||||
@@ -55,9 +56,9 @@ class SortableAdmin(ModelAdmin):
|
||||
admin_urls = patterns('',
|
||||
url(r'^sorting/do-sorting/(?P<model_type_id>\d+)/$',
|
||||
self.admin_site.admin_view(self.do_sorting_view),
|
||||
name=('%s_do_sorting' % self.model._meta.app_label)), #this view changes the order
|
||||
name='{0}_do_sorting'.format(self.model._meta.app_label)), # this view changes the order
|
||||
url(r'^sort/$', self.admin_site.admin_view(self.sort_view),
|
||||
name=('%s_sort' % self.model._meta.app_label)), #this view shows a link to the drag-and-drop view
|
||||
name='{0}_sort'.format(self.model._meta.app_label)), # this view shows a link to the drag-and-drop view
|
||||
)
|
||||
return admin_urls + urls
|
||||
|
||||
@@ -67,22 +68,22 @@ class SortableAdmin(ModelAdmin):
|
||||
changed via drag-and-drop.
|
||||
"""
|
||||
opts = self.model._meta
|
||||
has_perm = request.user.has_perm(opts.app_label + '.' + opts.get_change_permission())
|
||||
has_perm = request.user.has_perm('{0}.{1}'.format(opts.app_label, opts.get_change_permission()))
|
||||
objects = self.model.objects.all()
|
||||
|
||||
#Determine if we need to regroup objects relative to a foreign key specified on the
|
||||
# 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
|
||||
# Legacy support for 'sortable_by' defined as a model property
|
||||
sortable_by_property = getattr(self.model, 'sortable_by', None)
|
||||
|
||||
#`sortable_by` defined as a SortableForeignKey
|
||||
# `sortable_by` defined as a SortableForeignKey
|
||||
sortable_by_fk = self._get_sortable_foreign_key()
|
||||
|
||||
if sortable_by_property:
|
||||
#backwards compatibility for < 1.1.1, where sortable_by was a classmethod instead of a property
|
||||
# backwards compatibility for < 1.1.1, where sortable_by was a classmethod instead of a property
|
||||
try:
|
||||
sortable_by_class, sortable_by_expression = sortable_by_property()
|
||||
except TypeError, ValueError:
|
||||
except (TypeError, ValueError):
|
||||
sortable_by_class = self.model.sortable_by
|
||||
sortable_by_expression = sortable_by_class.__name__.lower()
|
||||
|
||||
@@ -90,7 +91,7 @@ class SortableAdmin(ModelAdmin):
|
||||
sortable_by_class_is_sortable = sortable_by_class.is_sortable()
|
||||
|
||||
elif sortable_by_fk:
|
||||
#get sortable by properties from the SortableForeignKey field - supported in 1.3+
|
||||
# get sortable by properties from the SortableForeignKey field - supported in 1.3+
|
||||
sortable_by_class_display_name = sortable_by_fk.rel.to._meta.verbose_name_plural
|
||||
sortable_by_class = sortable_by_fk.rel.to
|
||||
sortable_by_expression = sortable_by_fk.name.lower()
|
||||
@@ -100,8 +101,8 @@ class SortableAdmin(ModelAdmin):
|
||||
sortable_by_class_is_sortable = False
|
||||
|
||||
else:
|
||||
#model is not sortable by another model
|
||||
sortable_by_class = sortable_by_expression = sortable_by_class_display_name =\
|
||||
# model is not sortable by another model
|
||||
sortable_by_class = sortable_by_expression = sortable_by_class_display_name = \
|
||||
sortable_by_class_is_sortable = None
|
||||
|
||||
if sortable_by_property or sortable_by_fk:
|
||||
@@ -116,15 +117,15 @@ class SortableAdmin(ModelAdmin):
|
||||
verbose_name_plural = opts.verbose_name_plural
|
||||
|
||||
context = {
|
||||
'title' : 'Drag and drop %s to change display order' % capfirst(verbose_name_plural),
|
||||
'opts' : opts,
|
||||
'app_label' : opts.app_label,
|
||||
'has_perm' : has_perm,
|
||||
'objects' : objects,
|
||||
'group_expression' : sortable_by_expression,
|
||||
'sortable_by_class' : sortable_by_class,
|
||||
'sortable_by_class_is_sortable' : sortable_by_class_is_sortable,
|
||||
'sortable_by_class_display_name' : sortable_by_class_display_name,
|
||||
'title': 'Drag and drop %s to change display order' % capfirst(verbose_name_plural),
|
||||
'opts': opts,
|
||||
'app_label': opts.app_label,
|
||||
'has_perm': has_perm,
|
||||
'objects': objects,
|
||||
'group_expression': sortable_by_expression,
|
||||
'sortable_by_class': sortable_by_class,
|
||||
'sortable_by_class_is_sortable': sortable_by_class_is_sortable,
|
||||
'sortable_by_class_display_name': sortable_by_class_display_name,
|
||||
'sortable_javascript_includes_template': self.sortable_javascript_includes_template
|
||||
}
|
||||
return render(request, self.sortable_change_list_template, context)
|
||||
@@ -144,8 +145,8 @@ class SortableAdmin(ModelAdmin):
|
||||
self.change_form_template = self.sortable_change_form_template
|
||||
extra_context = {
|
||||
'sortable_javascript_includes_template': self.sortable_javascript_includes_template,
|
||||
'has_sortable_tabular_inlines' : self.has_sortable_tabular_inlines,
|
||||
'has_sortable_stacked_inlines' : self.has_sortable_stacked_inlines
|
||||
'has_sortable_tabular_inlines': self.has_sortable_tabular_inlines,
|
||||
'has_sortable_stacked_inlines': self.has_sortable_stacked_inlines
|
||||
}
|
||||
return super(SortableAdmin, self).change_view(request, object_id, extra_context=extra_context)
|
||||
|
||||
@@ -160,11 +161,11 @@ class SortableAdmin(ModelAdmin):
|
||||
indexes = map(str, request.POST.get('indexes', []).split(','))
|
||||
klass = ContentType.objects.get(id=model_type_id).model_class()
|
||||
objects_dict = dict([(str(obj.pk), obj) for obj in klass.objects.filter(pk__in=indexes)])
|
||||
if '-order' in klass._meta.ordering: #desc order
|
||||
if '-order' in klass._meta.ordering: # desc order
|
||||
start_object = max(objects_dict.values(), key=lambda x: getattr(x, 'order'))
|
||||
start_index = getattr(start_object, 'order') or len(indexes)
|
||||
step = -1
|
||||
else: #'order' is default, asc order
|
||||
else: # 'order' is default, asc order
|
||||
start_object = min(objects_dict.values(), key=lambda x: getattr(x, 'order'))
|
||||
start_index = getattr(start_object, 'order') or 0
|
||||
step = 1
|
||||
@@ -174,11 +175,11 @@ class SortableAdmin(ModelAdmin):
|
||||
setattr(obj, 'order', start_index)
|
||||
obj.save()
|
||||
start_index += step
|
||||
response = {'objects_sorted' : True}
|
||||
response = {'objects_sorted': True}
|
||||
except (KeyError, IndexError, klass.DoesNotExist, AttributeError):
|
||||
pass
|
||||
else:
|
||||
response = {'objects_sorted' : False}
|
||||
response = {'objects_sorted': False}
|
||||
return HttpResponse(json.dumps(response, ensure_ascii=False), mimetype='application/json')
|
||||
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ class SortableForeignKey(ForeignKey):
|
||||
def south_field_triple(self):
|
||||
try:
|
||||
from south.modelsinspector import introspector
|
||||
cls_name = '%s.%s' % (self.__class__.__module__ , self.__class__.__name__)
|
||||
cls_name = '{0}.{1}'.format(self.__class__.__module__, self.__class__.__name__)
|
||||
args, kwargs = introspector(self)
|
||||
return cls_name, args, kwargs
|
||||
except ImportError:
|
||||
|
||||
@@ -31,7 +31,7 @@ class Sortable(models.Model):
|
||||
|
||||
order = models.PositiveIntegerField(editable=False, default=1, db_index=True)
|
||||
|
||||
#legacy support
|
||||
# legacy support
|
||||
sortable_by = None
|
||||
|
||||
class Meta:
|
||||
@@ -53,7 +53,7 @@ class Sortable(models.Model):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(Sortable, self).__init__(*args, **kwargs)
|
||||
|
||||
#Validate that model only contains at most one SortableForeignKey
|
||||
# Validate that model only contains at most one SortableForeignKey
|
||||
sortable_foreign_keys = []
|
||||
for field in self._meta.fields:
|
||||
if isinstance(field, SortableForeignKey):
|
||||
@@ -65,7 +65,7 @@ class Sortable(models.Model):
|
||||
if not self.id:
|
||||
try:
|
||||
self.order = self.__class__.objects.aggregate(models.Max('order'))['order__max'] + 1
|
||||
except TypeError, IndexError:
|
||||
except (TypeError, IndexError):
|
||||
pass
|
||||
|
||||
super(Sortable, self).save(*args, **kwargs)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
{% if inline_admin_form.form.non_field_errors %}
|
||||
<tr><td colspan="{{ inline_admin_form|cell_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>
|
||||
{% endif %}
|
||||
<tr class="{% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last %} empty-form{% endif %}"
|
||||
<tr class="sortable {% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last %} empty-form{% endif %}"
|
||||
id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
|
||||
<td class="original">
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ register = template.Library()
|
||||
|
||||
|
||||
@register.simple_tag(takes_context=True)
|
||||
def render_sortable_objects(context, objects,
|
||||
sortable_objects_template='adminsortable/shared/objects.html'):
|
||||
def render_sortable_objects(context, objects,
|
||||
sortable_objects_template='adminsortable/shared/objects.html'):
|
||||
context.update({'objects': objects})
|
||||
tmpl = template.loader.get_template(sortable_objects_template)
|
||||
return tmpl.render(context)
|
||||
@@ -14,22 +14,23 @@ def render_sortable_objects(context, objects,
|
||||
|
||||
@register.simple_tag(takes_context=True)
|
||||
def render_nested_sortable_objects(context, objects, group_expression,
|
||||
sortable_nested_objects_template = 'adminsortable/shared/nested_objects.html'):
|
||||
sortable_nested_objects_template='adminsortable/shared/nested_objects.html'):
|
||||
context.update({'objects': objects, 'group_expression': group_expression})
|
||||
tmpl = template.loader.get_template(sortable_nested_objects_template)
|
||||
return tmpl.render(context)
|
||||
|
||||
|
||||
@register.simple_tag(takes_context=True)
|
||||
def render_list_items(context, list_objects,
|
||||
sortable_list_items_template='adminsortable/shared/list_items.html'):
|
||||
def render_list_items(context, list_objects,
|
||||
sortable_list_items_template='adminsortable/shared/list_items.html'):
|
||||
context.update({'list_objects': list_objects})
|
||||
tmpl = template.loader.get_template(sortable_list_items_template)
|
||||
return tmpl.render(context)
|
||||
|
||||
|
||||
@register.simple_tag(takes_context=True)
|
||||
def render_object_rep(context, obj, sortable_object_rep_template='adminsortable/shared/object_rep.html'):
|
||||
def render_object_rep(context, obj,
|
||||
sortable_object_rep_template='adminsortable/shared/object_rep.html'):
|
||||
context.update({'object': obj})
|
||||
tmpl = template.loader.get_template(sortable_object_rep_template)
|
||||
return tmpl.render(context)
|
||||
@@ -37,4 +38,5 @@ def render_object_rep(context, obj, sortable_object_rep_template='adminsortable/
|
||||
|
||||
@register.simple_tag(takes_context=False)
|
||||
def get_do_sorting_url(obj):
|
||||
return reverse('admin:%s_do_sorting' % obj._meta.app_label, kwargs={'model_type_id': obj.model_type_id() })
|
||||
return reverse('admin:%s_do_sorting' % obj._meta.app_label,
|
||||
kwargs={'model_type_id': obj.model_type_id()})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from itertools import groupby
|
||||
from django import template
|
||||
from django import template, TemplateSyntaxError
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@@ -43,6 +43,7 @@ class DynamicRegroupNode(template.Node):
|
||||
|
||||
return ''
|
||||
|
||||
|
||||
@register.tag
|
||||
def dynamic_regroup(parser, token):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user