diff --git a/adminsortable/admin.py b/adminsortable/admin.py index 78609a5..4ad25cb 100644 --- a/adminsortable/admin.py +++ b/adminsortable/admin.py @@ -35,7 +35,12 @@ class SortableAdminBase(object): object_tools block to take people to the view to change the sorting. """ - if get_is_sortable(self.queryset(request)): + if self.model.ordering_subset() is not None: + objects = self.model.ordering_subset() + else: + objects = self.queryset(request) + + if get_is_sortable(objects): self.change_list_template = \ self.sortable_change_list_with_sort_link_template self.is_sortable = True @@ -102,7 +107,10 @@ class SortableAdmin(SortableAdminBase, ModelAdmin): has_perm = request.user.has_perm('{}.{}'.format(opts.app_label, opts.get_change_permission())) - objects = self.queryset(request) + if self.model.ordering_subset() is not None: + objects = self.model.ordering_subset() + else: + objects = self.queryset(request) # Determine if we need to regroup objects relative to a # foreign key specified on the model class that is extending Sortable. diff --git a/adminsortable/models.py b/adminsortable/models.py index 48df4a7..52cad36 100644 --- a/adminsortable/models.py +++ b/adminsortable/models.py @@ -43,6 +43,10 @@ class Sortable(models.Model): def model_type_id(cls): return ContentType.objects.get_for_model(cls).id + @classmethod + def ordering_subset(cls): + return None + def __init__(self, *args, **kwargs): super(Sortable, self).__init__(*args, **kwargs) diff --git a/sample_project/app/admin.py b/sample_project/app/admin.py index 181b2fb..b0079e4 100644 --- a/sample_project/app/admin.py +++ b/sample_project/app/admin.py @@ -4,7 +4,7 @@ from adminsortable.admin import (SortableAdmin, SortableTabularInline, SortableStackedInline, SortableGenericStackedInline) from adminsortable.utils import get_is_sortable from app.models import (Category, Widget, Project, Credit, Note, GenericNote, - Component) + Component, Person) admin.site.register(Category, SortableAdmin) @@ -58,3 +58,6 @@ class ProjectAdmin(SortableAdmin): list_display = ['__unicode__', 'category'] admin.site.register(Project, ProjectAdmin) + + +admin.site.register(Person, SortableAdmin) diff --git a/sample_project/app/fixtures/initial_data.json b/sample_project/app/fixtures/initial_data.json new file mode 100644 index 0000000..b110f06 --- /dev/null +++ b/sample_project/app/fixtures/initial_data.json @@ -0,0 +1,37 @@ +[{ + "pk": 1, + "model": "app.person", + "fields": { + "first_name": "Bob", + "last_name": "Smith", + "order": 1, + "is_board_member": true + } +}, { + "pk": 2, + "model": "app.person", + "fields": { + "first_name": "Sally", + "last_name": "Sue", + "order": 2, + "is_board_member": false + } +}, { + "pk": 3, + "model": "app.person", + "fields": { + "first_name": "Mike", + "last_name": "Wilson", + "order": 3, + "is_board_member": true + } +}, { + "pk": 4, + "model": "app.person", + "fields": { + "first_name": "Robert", + "last_name": "Roberts", + "order": 2, + "is_board_member": true + } +}] diff --git a/sample_project/app/migrations/0004_add_person.py b/sample_project/app/migrations/0004_add_person.py new file mode 100644 index 0000000..d2ef25c --- /dev/null +++ b/sample_project/app/migrations/0004_add_person.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Person' + db.create_table(u'app_person', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('order', self.gf('django.db.models.fields.PositiveIntegerField')(default=1, db_index=True)), + ('first_name', self.gf('django.db.models.fields.CharField')(max_length=50)), + ('last_name', self.gf('django.db.models.fields.CharField')(max_length=50)), + ('is_board_member', self.gf('django.db.models.fields.BooleanField')(default=False)), + )) + db.send_create_signal(u'app', ['Person']) + + + def backwards(self, orm): + # Deleting model 'Person' + db.delete_table(u'app_person') + + + models = { + u'app.category': { + 'Meta': {'ordering': "['order']", 'object_name': 'Category'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'app.component': { + 'Meta': {'ordering': "['order']", 'object_name': 'Component'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'widget': ('adminsortable.fields.SortableForeignKey', [], {'to': u"orm['app.Widget']"}) + }, + u'app.credit': { + 'Meta': {'ordering': "['order']", 'object_name': 'Credit'}, + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['app.Project']"}) + }, + u'app.genericnote': { + 'Meta': {'ordering': "['order']", 'object_name': 'GenericNote'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'generic_notes'", 'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'app.note': { + 'Meta': {'ordering': "['order']", 'object_name': 'Note'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['app.Project']"}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'app.person': { + 'Meta': {'ordering': "['order']", 'object_name': 'Person'}, + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_board_member': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}) + }, + u'app.project': { + 'Meta': {'ordering': "['order']", 'object_name': 'Project'}, + 'category': ('adminsortable.fields.SortableForeignKey', [], {'to': u"orm['app.Category']"}), + 'description': ('django.db.models.fields.TextField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'app.widget': { + 'Meta': {'ordering': "['order']", 'object_name': 'Widget'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['app'] \ No newline at end of file diff --git a/sample_project/app/models.py b/sample_project/app/models.py index b3622b1..26c1b48 100644 --- a/sample_project/app/models.py +++ b/sample_project/app/models.py @@ -95,3 +95,19 @@ class Component(SimpleModel, Sortable): def __unicode__(self): return self.title + + +class Person(Sortable): + class Meta(Sortable.Meta): + verbose_name_plural = 'People' + + first_name = models.CharField(max_length=50) + last_name = models.CharField(max_length=50) + is_board_member = models.BooleanField(default=False) + + def __unicode__(self): + return '{} {}'.format(self.first_name, self.last_name) + + @classmethod + def ordering_subset(cls): + return cls.objects.filter(is_board_member=True) diff --git a/sample_project/database/test_project.sqlite b/sample_project/database/test_project.sqlite index 610bf66..2cd709f 100644 Binary files a/sample_project/database/test_project.sqlite and b/sample_project/database/test_project.sqlite differ