Added SortableForeignKey field to replace sortable_by model property.
Refactored how the sortable_by properties get populated by looping over the model fields until we get to the SortableForeignKey, then grabbing properties from the field and its related data.
This commit is contained in:
Executable → Regular
Executable → Regular
Executable → Regular
BIN
Binary file not shown.
Executable → Regular
Executable → Regular
+1
-2
@@ -1,7 +1,7 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from adminsortable.admin import SortableAdmin, SortableTabularInline, SortableStackedInline
|
||||
from app.models import Category, Project, Credit, Note, Sample
|
||||
from app.models import Category, Project, Credit, Note
|
||||
|
||||
|
||||
admin.site.register(Category, SortableAdmin)
|
||||
@@ -20,4 +20,3 @@ class ProjectAdmin(SortableAdmin):
|
||||
list_display = ['__unicode__', 'category']
|
||||
|
||||
admin.site.register(Project, ProjectAdmin)
|
||||
admin.site.register(Sample, SortableAdmin)
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
[
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "app.category",
|
||||
"fields": {
|
||||
"order": 1,
|
||||
"title": "Test 1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 2,
|
||||
"model": "app.category",
|
||||
"fields": {
|
||||
"order": 2,
|
||||
"title": "Test 2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 3,
|
||||
"model": "app.category",
|
||||
"fields": {
|
||||
"order": 3,
|
||||
"title": "Test 3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "app.project",
|
||||
"fields": {
|
||||
"category": 1,
|
||||
"description": "Test",
|
||||
"order": 1,
|
||||
"title": "Test Project 1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 2,
|
||||
"model": "app.project",
|
||||
"fields": {
|
||||
"category": 1,
|
||||
"description": "Test",
|
||||
"order": 2,
|
||||
"title": "Test Project 2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 3,
|
||||
"model": "app.project",
|
||||
"fields": {
|
||||
"category": 2,
|
||||
"description": "Test",
|
||||
"order": 3,
|
||||
"title": "Test Project 3"
|
||||
}
|
||||
}
|
||||
]
|
||||
Executable → Regular
@@ -1,77 +0,0 @@
|
||||
# encoding: 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 'Category'
|
||||
db.create_table('app_category', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('order', self.gf('django.db.models.fields.PositiveIntegerField')(default=1, db_index=True)),
|
||||
('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
|
||||
))
|
||||
db.send_create_signal('app', ['Category'])
|
||||
|
||||
# Adding model 'Project'
|
||||
db.create_table('app_project', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('order', self.gf('django.db.models.fields.PositiveIntegerField')(default=1, db_index=True)),
|
||||
('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
|
||||
('category', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['app.Category'])),
|
||||
('description', self.gf('django.db.models.fields.TextField')()),
|
||||
))
|
||||
db.send_create_signal('app', ['Project'])
|
||||
|
||||
# Adding model 'Credit'
|
||||
db.create_table('app_credit', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('order', self.gf('django.db.models.fields.PositiveIntegerField')(default=1, db_index=True)),
|
||||
('project', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['app.Project'])),
|
||||
('first_name', self.gf('django.db.models.fields.CharField')(max_length=30)),
|
||||
('last_name', self.gf('django.db.models.fields.CharField')(max_length=30)),
|
||||
))
|
||||
db.send_create_signal('app', ['Credit'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting model 'Category'
|
||||
db.delete_table('app_category')
|
||||
|
||||
# Deleting model 'Project'
|
||||
db.delete_table('app_project')
|
||||
|
||||
# Deleting model 'Credit'
|
||||
db.delete_table('app_credit')
|
||||
|
||||
|
||||
models = {
|
||||
'app.category': {
|
||||
'Meta': {'ordering': "['order', 'id']", 'object_name': 'Category'},
|
||||
'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'})
|
||||
},
|
||||
'app.credit': {
|
||||
'Meta': {'ordering': "['order', 'id']", 'object_name': 'Credit'},
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
|
||||
'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': "orm['app.Project']"})
|
||||
},
|
||||
'app.project': {
|
||||
'Meta': {'ordering': "['order', 'id']", 'object_name': 'Project'},
|
||||
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['app.Category']"}),
|
||||
'description': ('django.db.models.fields.TextField', [], {}),
|
||||
'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'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['app']
|
||||
@@ -1,59 +0,0 @@
|
||||
# encoding: 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 'Note'
|
||||
db.create_table('app_note', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('order', self.gf('django.db.models.fields.PositiveIntegerField')(default=1, db_index=True)),
|
||||
('project', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['app.Project'])),
|
||||
('text', self.gf('django.db.models.fields.CharField')(max_length=100)),
|
||||
))
|
||||
db.send_create_signal('app', ['Note'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting model 'Note'
|
||||
db.delete_table('app_note')
|
||||
|
||||
|
||||
models = {
|
||||
'app.category': {
|
||||
'Meta': {'ordering': "['order', 'id']", 'object_name': 'Category'},
|
||||
'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'})
|
||||
},
|
||||
'app.credit': {
|
||||
'Meta': {'ordering': "['order', 'id']", 'object_name': 'Credit'},
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
|
||||
'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': "orm['app.Project']"})
|
||||
},
|
||||
'app.note': {
|
||||
'Meta': {'ordering': "['order', 'id']", 'object_name': 'Note'},
|
||||
'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': "orm['app.Project']"}),
|
||||
'text': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'app.project': {
|
||||
'Meta': {'ordering': "['order', 'id']", 'object_name': 'Project'},
|
||||
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['app.Category']"}),
|
||||
'description': ('django.db.models.fields.TextField', [], {}),
|
||||
'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'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['app']
|
||||
@@ -1,68 +0,0 @@
|
||||
# encoding: 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 'Sample'
|
||||
db.create_table('app_sample', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('order', self.gf('django.db.models.fields.PositiveIntegerField')(default=1, db_index=True)),
|
||||
('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
|
||||
('category', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['app.Category'])),
|
||||
('description', self.gf('django.db.models.fields.TextField')()),
|
||||
))
|
||||
db.send_create_signal('app', ['Sample'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting model 'Sample'
|
||||
db.delete_table('app_sample')
|
||||
|
||||
|
||||
models = {
|
||||
'app.category': {
|
||||
'Meta': {'ordering': "['order']", 'object_name': 'Category'},
|
||||
'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'})
|
||||
},
|
||||
'app.credit': {
|
||||
'Meta': {'ordering': "['order']", 'object_name': 'Credit'},
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
|
||||
'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': "orm['app.Project']"})
|
||||
},
|
||||
'app.note': {
|
||||
'Meta': {'ordering': "['order']", 'object_name': 'Note'},
|
||||
'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': "orm['app.Project']"}),
|
||||
'text': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'app.project': {
|
||||
'Meta': {'ordering': "['order']", 'object_name': 'Project'},
|
||||
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['app.Category']"}),
|
||||
'description': ('django.db.models.fields.TextField', [], {}),
|
||||
'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'})
|
||||
},
|
||||
'app.sample': {
|
||||
'Meta': {'ordering': "['order']", 'object_name': 'Sample'},
|
||||
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['app.Category']"}),
|
||||
'description': ('django.db.models.fields.TextField', [], {}),
|
||||
'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'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['app']
|
||||
Executable → Regular
+5
-22
@@ -1,5 +1,6 @@
|
||||
from django.db import models
|
||||
|
||||
from adminsortable.fields import SortableForeignKey
|
||||
from adminsortable.models import Sortable
|
||||
|
||||
|
||||
@@ -25,34 +26,16 @@ class Category(SimpleModel, Sortable):
|
||||
|
||||
|
||||
#a model that is sortable relative to a foreign key that is also sortable
|
||||
#uses SortableForeignKey field. Works with versions 1.3+
|
||||
class Project(SimpleModel, Sortable):
|
||||
class Meta(Sortable.Meta):
|
||||
pass
|
||||
|
||||
#deprecated: shown for backward compatibility only. Reference class "Sample" for proper
|
||||
# designation of `sortable_by` as a property
|
||||
@classmethod
|
||||
def sortable_by(cls):
|
||||
return Category, 'category'
|
||||
|
||||
category = models.ForeignKey(Category)
|
||||
category = SortableForeignKey(Category)
|
||||
description = models.TextField()
|
||||
|
||||
|
||||
#a model that is sortable relative to a foreign key that is also sortable
|
||||
class Sample(SimpleModel, Sortable):
|
||||
class Meta(Sortable.Meta):
|
||||
ordering = Sortable.Meta.ordering + ['category']
|
||||
|
||||
category = models.ForeignKey(Category)
|
||||
description = models.TextField()
|
||||
|
||||
#field to define which foreign key the model is sortable by.
|
||||
#works with versions > 1.1.1
|
||||
sortable_by = Category
|
||||
|
||||
|
||||
#registered as a tabular inline on project
|
||||
#registered as a tabular inline on `Project`
|
||||
class Credit(Sortable):
|
||||
class Meta(Sortable.Meta):
|
||||
pass
|
||||
@@ -65,7 +48,7 @@ class Credit(Sortable):
|
||||
return '%s %s' % (self.first_name, self.last_name)
|
||||
|
||||
|
||||
#registered as a stacked inline on project
|
||||
#registered as a stacked inline on `Project`
|
||||
class Note(Sortable):
|
||||
class Meta(Sortable.Meta):
|
||||
pass
|
||||
|
||||
Executable → Regular
+8
-3
@@ -7,8 +7,14 @@ from django.db import models
|
||||
from django.test import TestCase
|
||||
from django.test.client import Client, RequestFactory
|
||||
|
||||
from models import Sortable
|
||||
from app.models import Category
|
||||
from adminsortable.fields import SortableForeignKey
|
||||
from adminsortable.models import Sortable, MultipleSortableForeignKeyException
|
||||
from app.models import Category, Credit, Note
|
||||
|
||||
|
||||
class BadSortableModel(models.Model):
|
||||
note = SortableForeignKey(Note)
|
||||
credit = SortableForeignKey(Credit)
|
||||
|
||||
|
||||
class TestSortableModel(Sortable):
|
||||
@@ -19,7 +25,6 @@ class TestSortableModel(Sortable):
|
||||
|
||||
|
||||
class SortableTestCase(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
self.factory = RequestFactory()
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Reference in New Issue
Block a user