From 01403f1b8c81024fec3125eb889833e8aa24e64e Mon Sep 17 00:00:00 2001 From: Brandon Taylor Date: Mon, 22 Dec 2014 10:25:35 -0500 Subject: [PATCH] Merged pull request 97 --- adminsortable/admin.py | 3 +- .../adminsortable/shared/nested_objects.html | 1 + .../adminsortable/shared/object_rep.html | 2 +- adminsortable/utils.py | 3 +- sample_project/app/admin.py | 4 +- sample_project/app/models.py | 42 +++++++++++------- sample_project/database/test_project.sqlite | Bin 99328 -> 100352 bytes sample_project/sample_project/settings.py | 8 +++- 8 files changed, 41 insertions(+), 22 deletions(-) diff --git a/adminsortable/admin.py b/adminsortable/admin.py index bd7fab3..a4f498f 100644 --- a/adminsortable/admin.py +++ b/adminsortable/admin.py @@ -123,7 +123,7 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): # `sortable_by` defined as a SortableForeignKey sortable_by_fk = self.model.sortable_foreign_key - + print('sortable_by_fk: {}, {}'.format(sortable_by_fk, type(sortable_by_fk))) sortable_by_class_is_sortable = check_model_is_sortable(sortable_by_fk) if sortable_by_property: @@ -176,6 +176,7 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): 'sortable_by_class_is_sortable': sortable_by_class_is_sortable, 'sortable_by_class_display_name': sortable_by_class_display_name } + print(context['sortable_by_class_is_sortable']) return render(request, self.sortable_change_list_template, context) def add_view(self, request, form_url='', extra_context=None): diff --git a/adminsortable/templates/adminsortable/shared/nested_objects.html b/adminsortable/templates/adminsortable/shared/nested_objects.html index 7b4f36a..c2ea13f 100644 --- a/adminsortable/templates/adminsortable/shared/nested_objects.html +++ b/adminsortable/templates/adminsortable/shared/nested_objects.html @@ -6,6 +6,7 @@ {% with object=regrouped_object.grouper %} {% if object %}
  • + sortable fk is sortable: {{ sortable_by_class_is_sortable }} {% if sortable_by_class_is_sortable %} {% render_object_rep object %} {% else %} diff --git a/adminsortable/templates/adminsortable/shared/object_rep.html b/adminsortable/templates/adminsortable/shared/object_rep.html index 05dfb16..edec342 100644 --- a/adminsortable/templates/adminsortable/shared/object_rep.html +++ b/adminsortable/templates/adminsortable/shared/object_rep.html @@ -3,4 +3,4 @@
    -{{ object }} +{{ object }} diff --git a/adminsortable/utils.py b/adminsortable/utils.py index 82141d9..539e4eb 100644 --- a/adminsortable/utils.py +++ b/adminsortable/utils.py @@ -25,6 +25,5 @@ def check_model_is_sortable(cls): else: objects = cls.objects - if objects.count() > 1: - return True + return get_is_sortable(objects.all()) return False diff --git a/sample_project/app/admin.py b/sample_project/app/admin.py index 3fca3f2..437b052 100644 --- a/sample_project/app/admin.py +++ b/sample_project/app/admin.py @@ -71,13 +71,13 @@ class ProjectAdmin(SortableAdmin): CreditInline, NoteInline, GenericNoteInline, NonSortableCreditInline, NonSortableNoteInline ] - list_display = ['__unicode__', 'category'] + list_display = ['__str__', 'category'] admin.site.register(Project, ProjectAdmin) class PersonAdmin(SortableAdmin): - list_display = ['__unicode__', 'is_board_member'] + list_display = ['__str__', 'is_board_member'] admin.site.register(Person, PersonAdmin) diff --git a/sample_project/app/models.py b/sample_project/app/models.py index d882930..bf8b563 100644 --- a/sample_project/app/models.py +++ b/sample_project/app/models.py @@ -1,18 +1,20 @@ from django.contrib.contenttypes import generic from django.contrib.contenttypes.models import ContentType from django.db import models +from django.utils.encoding import python_2_unicode_compatible from adminsortable.fields import SortableForeignKey from adminsortable.models import Sortable +@python_2_unicode_compatible class SimpleModel(models.Model): class Meta: abstract = True title = models.CharField(max_length=50) - def __unicode__(self): + def __str__(self): return self.title @@ -28,11 +30,12 @@ class Category(SimpleModel, Sortable): # A model with an override of its queryset for admin +@python_2_unicode_compatible class Widget(SimpleModel, Sortable): class Meta(Sortable.Meta): pass - def __unicode__(self): + def __str__(self): return self.title @@ -47,6 +50,7 @@ class Project(SimpleModel, Sortable): # Registered as a tabular inline on `Project` +@python_2_unicode_compatible class Credit(Sortable): class Meta(Sortable.Meta): pass @@ -55,11 +59,12 @@ class Credit(Sortable): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) - def __unicode__(self): + def __str__(self): return '{0} {1}'.format(self.first_name, self.last_name) # Registered as a stacked inline on `Project` +@python_2_unicode_compatible class Note(Sortable): class Meta(Sortable.Meta): pass @@ -67,30 +72,33 @@ class Note(Sortable): project = models.ForeignKey(Project) text = models.CharField(max_length=100) - def __unicode__(self): + def __str__(self): return self.text # Registered as a tabular inline on `Project` which can't be sorted +@python_2_unicode_compatible class NonSortableCredit(models.Model): project = models.ForeignKey(Project) first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) - def __unicode__(self): + def __str__(self): return '{0} {1}'.format(self.first_name, self.last_name) # Registered as a stacked inline on `Project` which can't be sorted +@python_2_unicode_compatible class NonSortableNote(models.Model): project = models.ForeignKey(Project) text = models.CharField(max_length=100) - def __unicode__(self): + def __str__(self): return self.text # A generic bound model +@python_2_unicode_compatible class GenericNote(SimpleModel, Sortable): content_type = models.ForeignKey(ContentType, verbose_name=u"Content type", related_name="generic_notes") @@ -101,22 +109,23 @@ class GenericNote(SimpleModel, Sortable): class Meta(Sortable.Meta): pass - def __unicode__(self): + def __str__(self): return u'{0}: {1}'.format(self.title, self.content_object) # An model registered as an inline that has a custom queryset +@python_2_unicode_compatible class Component(SimpleModel, Sortable): class Meta(Sortable.Meta): pass widget = SortableForeignKey(Widget) - def __unicode__(self): + def __str__(self): return self.title - +@python_2_unicode_compatible class Person(Sortable): class Meta(Sortable.Meta): verbose_name_plural = 'People' @@ -134,19 +143,21 @@ class Person(Sortable): ('Non-Board Members', {'is_board_member': False}), ) - def __unicode__(self): + def __str__(self): return '{0} {1}'.format(self.first_name, self.last_name) +@python_2_unicode_compatible class NonSortableCategory(SimpleModel): class Meta(SimpleModel.Meta): verbose_name = 'Non-Sortable Category' verbose_name_plural = 'Non-Sortable Categories' - def __unicode__(self): + def __str__(self): return self.title +@python_2_unicode_compatible class SortableCategoryWidget(SimpleModel, Sortable): class Meta(Sortable.Meta): verbose_name = 'Sortable Category Widget' @@ -154,20 +165,21 @@ class SortableCategoryWidget(SimpleModel, Sortable): non_sortable_category = SortableForeignKey(NonSortableCategory) - def __unicode__(self): + def __str__(self): return self.title +@python_2_unicode_compatible class SortableNonInlineCategory(SimpleModel, Sortable): """Example of a model that is sortable, but has a SortableForeignKey that is *not* sortable, and is also not defined as an inline of the SortableForeignKey field.""" + non_sortable_category = SortableForeignKey(NonSortableCategory) + class Meta(Sortable.Meta): verbose_name = 'Sortable Non-Inline Category' verbose_name_plural = 'Sortable Non-Inline Categories' - non_sortable_category = SortableForeignKey(NonSortableCategory) - - def __unicode__(self): + def __str__(self): return self.title diff --git a/sample_project/database/test_project.sqlite b/sample_project/database/test_project.sqlite index 6bbcbecf4762523e9f5034fa08cb53c376b69135..8d67387c839c49d38ccebc44df46f0e029a4bdb1 100644 GIT binary patch delta 846 zcmaiy-%C?r7{}k|ea?? z=|W<1pxxJ%5J)XM7X@CmKR~(|iuMx%2{b}48d2}@!Vrqyi-(sl&-;14&zE=ZfiRa7 zaS_Nc+^n){O=?o+7VwarTAtEc!upD_WDHHo4V5#8$`(pkIF%l8xFXcxtP*Mv|k6_@o@5mBpTV_qfEqN$!vNgGn&ZGWaBN$)JRKgG#i^prKUy_;~rx(3oglKXGow$ zLW|7KYdSdZ_3*)kd;b5ukE%UdG;&St%Jj?(bo42~NN1)im6#q#^^XTr;dCex)Ix!% nXCN?^> delta 780 zcmZXSPe@cz6vpql-+OQ7iKdQ&3!&y2sf3KY_eLF?QWzW3h?z+l6^%$k8~igE<)Q`! z%}oobu?NknO|61JYO1$vXR9_6%ty(@f~0B1)s2< zE0q?J+dOwnM+IB8T$9gz!qj5wM!nxK{HFOYOm7N^Ff+G0SyNn$w@iY?@CsXa3`@k! zBIT7NMzu%`U7yfS4@?Xt$FJSg>b-DOeozgRk;K&6gQ6iym;V=FdbtxI9rT*dG7mxA zdSt~3xgS=!*R_jn(alfM%RAH*N|FpBud3-d=<-xg#SAc0h# z+gtEXqMfx{rBb7USvEBzXW!IOWp`gBdLtHzrFuug4e`XN9!>YA``XT=Vv&x9-bC1p zrNilXqDy#2jc8(UIGXAnjU}!IuXHpw|K+LsO{9VRuq9HgL_&}n)J+09EN6}e<*DtCTL)!sQt zWnMR5q&e2f?uiLn?Zr+Ckv-Qzr%0)jqq9?CD;3l1^m+2op(5O63Ume?Yj|NFO3-E0 z$os2n<)toBx{{QADa-}FYC5a(?1Lm7$*%TLbvDyORh|ODRKbeFbp<>4fX{YG6TL=t z9&4U`egm@GxhpP_BXj5KfLF=>eSvt14=-6E_c89{5kAcC@El*}zi