diff --git a/sample_project/app/admin.py b/sample_project/app/admin.py index 437b052..f575195 100644 --- a/sample_project/app/admin.py +++ b/sample_project/app/admin.py @@ -6,7 +6,8 @@ from adminsortable.admin import (SortableAdmin, SortableTabularInline, from adminsortable.utils import get_is_sortable from app.models import (Category, Widget, Project, Credit, Note, GenericNote, Component, Person, NonSortableCategory, SortableCategoryWidget, - SortableNonInlineCategory, NonSortableCredit, NonSortableNote) + SortableNonInlineCategory, NonSortableCredit, NonSortableNote, + CustomWidget, CustomWidgetComponent) admin.site.register(Category, SortableAdmin) @@ -93,4 +94,14 @@ class NonSortableCategoryAdmin(NonSortableParentAdmin): admin.site.register(NonSortableCategory, NonSortableCategoryAdmin) +class CustomWidgetComponentInline(SortableStackedInline): + model = CustomWidgetComponent + extra = 0 + + +class CustomWidgetAdmin(SortableAdmin): + inlines = [CustomWidgetComponentInline] + + admin.site.register(SortableNonInlineCategory, SortableAdmin) +admin.site.register(CustomWidget, CustomWidgetAdmin) diff --git a/sample_project/app/migrations/0001_initial.py b/sample_project/app/migrations/0001_initial.py new file mode 100644 index 0000000..fca30ca --- /dev/null +++ b/sample_project/app/migrations/0001_initial.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import adminsortable.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ], + options={ + 'ordering': ['order'], + 'verbose_name_plural': 'Categories', + }, + ), + migrations.CreateModel( + name='Component', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ], + options={ + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='Credit', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('first_name', models.CharField(max_length=30)), + ('last_name', models.CharField(max_length=30)), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ], + options={ + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='GenericNote', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('object_id', models.PositiveIntegerField(verbose_name='Content id')), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ('content_type', models.ForeignKey(related_name='generic_notes', verbose_name='Content type', to='contenttypes.ContentType')), + ], + options={ + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='NonSortableCategory', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ], + options={ + 'abstract': False, + 'verbose_name': 'Non-Sortable Category', + 'verbose_name_plural': 'Non-Sortable Categories', + }, + ), + migrations.CreateModel( + name='NonSortableCredit', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('first_name', models.CharField(max_length=30)), + ('last_name', models.CharField(max_length=30)), + ], + ), + migrations.CreateModel( + name='NonSortableNote', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('text', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Note', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('text', models.CharField(max_length=100)), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ], + options={ + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='Person', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('first_name', models.CharField(max_length=50)), + ('last_name', models.CharField(max_length=50)), + ('is_board_member', models.BooleanField(default=False, verbose_name=b'Board Member')), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ], + options={ + 'ordering': ['order'], + 'verbose_name_plural': 'People', + }, + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('description', models.TextField()), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ('category', adminsortable.fields.SortableForeignKey(to='app.Category')), + ], + options={ + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='SortableCategoryWidget', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ('non_sortable_category', adminsortable.fields.SortableForeignKey(to='app.NonSortableCategory')), + ], + options={ + 'ordering': ['order'], + 'verbose_name': 'Sortable Category Widget', + 'verbose_name_plural': 'Sortable Category Widgets', + }, + ), + migrations.CreateModel( + name='SortableNonInlineCategory', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ('non_sortable_category', adminsortable.fields.SortableForeignKey(to='app.NonSortableCategory')), + ], + options={ + 'ordering': ['order'], + 'verbose_name': 'Sortable Non-Inline Category', + 'verbose_name_plural': 'Sortable Non-Inline Categories', + }, + ), + migrations.CreateModel( + name='Widget', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('order', models.PositiveIntegerField(default=0, editable=False)), + ], + options={ + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='CustomWidget', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('custom_order_field', models.PositiveIntegerField(default=0, editable=False)), + ], + options={ + 'ordering': ['custom_order_field'], 'verbose_name': 'Custom Widget', 'verbose_name_plural': 'Custom Widgets' + }, + ), + migrations.AddField( + model_name='note', + name='project', + field=models.ForeignKey(to='app.Project'), + ), + migrations.AddField( + model_name='nonsortablenote', + name='project', + field=models.ForeignKey(to='app.Project'), + ), + migrations.AddField( + model_name='nonsortablecredit', + name='project', + field=models.ForeignKey(to='app.Project'), + ), + migrations.AddField( + model_name='credit', + name='project', + field=models.ForeignKey(to='app.Project'), + ), + migrations.AddField( + model_name='component', + name='widget', + field=adminsortable.fields.SortableForeignKey(to='app.Widget'), + ), + ] diff --git a/sample_project/app/migrations/0002_auto_20150824_0702.py b/sample_project/app/migrations/0002_auto_20150824_0702.py new file mode 100644 index 0000000..c8a4e13 --- /dev/null +++ b/sample_project/app/migrations/0002_auto_20150824_0702.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='CustomWidgetComponent', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('widget_order', models.PositiveIntegerField(default=0, editable=False, db_index=True)), + ], + options={ + 'ordering': ['widget_order'], + 'verbose_name': 'Custom Widget Component', + 'verbose_name_plural': 'Custom Widget Components', + }, + ), + migrations.AlterField( + model_name='customwidget', + name='custom_order_field', + field=models.PositiveIntegerField(default=0, editable=False, db_index=True), + ), + migrations.AddField( + model_name='customwidgetcomponent', + name='custom_widget', + field=models.ForeignKey(to='app.CustomWidget'), + ), + ] diff --git a/sample_project/app/migrations/__init__.py b/sample_project/app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sample_project/app/models.py b/sample_project/app/models.py index c4c44dd..4a472f0 100644 --- a/sample_project/app/models.py +++ b/sample_project/app/models.py @@ -202,3 +202,41 @@ class SortableNonInlineCategory(SimpleModel, SortableMixin): def __str__(self): return self.title + + +@python_2_unicode_compatible +class CustomWidget(SortableMixin, SimpleModel): + + # custom field for ordering + custom_order_field = models.PositiveIntegerField(default=0, db_index=True, + editable=False) + + order_field_name = 'custom_order_field' + + class Meta: + ordering = ['custom_order_field'] + verbose_name = 'Custom Widget' + verbose_name_plural = 'Custom Widgets' + + def __str__(self): + return self.title + + +@python_2_unicode_compatible +class CustomWidgetComponent(SortableMixin, SimpleModel): + + custom_widget = models.ForeignKey(CustomWidget) + + # custom field for ordering + widget_order = models.PositiveIntegerField(default=0, db_index=True, + editable=False) + + order_field_name = 'widget_order' + + class Meta: + ordering = ['widget_order'] + verbose_name = 'Custom Widget Component' + verbose_name_plural = 'Custom Widget Components' + + def __str__(self): + return self.title diff --git a/sample_project/database/test_project.sqlite b/sample_project/database/test_project.sqlite index af8ac53..7e4b0e7 100644 Binary files a/sample_project/database/test_project.sqlite and b/sample_project/database/test_project.sqlite differ