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:
Brandon Taylor
2012-11-02 09:04:32 -04:00
parent c9a20b0838
commit 810f8a0dd4
25 changed files with 73 additions and 3058 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
VERSION = (1, 3, 5) # following PEP 386
VERSION = (1, 3, 5, 1) # following PEP 386
DEV_N = None
+28 -27
View File
@@ -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')
+1 -1
View File
@@ -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:
+3 -3
View File
@@ -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):
"""