Work in progress on refactoring the Sortable class into a non-obtrusive mixin.

master
Brandon Taylor 2015-08-23 22:23:45 -04:00
parent 422343ff93
commit b14d747f82
3 changed files with 63 additions and 39 deletions

View File

@ -4,7 +4,7 @@ from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from adminsortable.fields import SortableForeignKey
from adminsortable.models import Sortable
from adminsortable.models import Sortable, SortableMixin
@python_2_unicode_compatible
@ -19,59 +19,65 @@ class SimpleModel(models.Model):
# A model that is sortable
class Category(SimpleModel, Sortable):
class Meta(Sortable.Meta):
"""
Classes that inherit from Sortable must define an inner
Meta class that inherits from Sortable.Meta or ordering
won't work as expected
"""
class Category(SimpleModel, SortableMixin):
class Meta:
verbose_name_plural = 'Categories'
ordering = ['order']
order = models.PositiveIntegerField(default=0, editable=False)
# A model with an override of its queryset for admin
@python_2_unicode_compatible
class Widget(SimpleModel, Sortable):
class Meta(Sortable.Meta):
pass
class Widget(SimpleModel, SortableMixin):
class Meta:
ordering = ['order']
def __str__(self):
return self.title
order = models.PositiveIntegerField(default=0, editable=False)
# 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
class Project(SimpleModel, SortableMixin):
class Meta:
ordering = ['order']
category = SortableForeignKey(Category)
description = models.TextField()
order = models.PositiveIntegerField(default=0, editable=False)
# Registered as a tabular inline on `Project`
@python_2_unicode_compatible
class Credit(Sortable):
class Meta(Sortable.Meta):
pass
class Credit(SortableMixin):
class Meta:
ordering = ['order']
project = models.ForeignKey(Project)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
order = models.PositiveIntegerField(default=0, editable=False)
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
class Note(SortableMixin):
class Meta:
ordering = ['order']
project = models.ForeignKey(Project)
text = models.CharField(max_length=100)
order = models.PositiveIntegerField(default=0, editable=False)
def __str__(self):
return self.text
@ -99,15 +105,17 @@ class NonSortableNote(models.Model):
# A generic bound model
@python_2_unicode_compatible
class GenericNote(SimpleModel, Sortable):
class GenericNote(SimpleModel, SortableMixin):
content_type = models.ForeignKey(ContentType,
verbose_name=u"Content type", related_name="generic_notes")
object_id = models.PositiveIntegerField(u"Content id")
content_object = generic.GenericForeignKey(ct_field='content_type',
fk_field='object_id')
class Meta(Sortable.Meta):
pass
order = models.PositiveIntegerField(default=0, editable=False)
class Meta:
ordering = ['order']
def __str__(self):
return u'{0}: {1}'.format(self.title, self.content_object)
@ -115,25 +123,30 @@ class GenericNote(SimpleModel, Sortable):
# An model registered as an inline that has a custom queryset
@python_2_unicode_compatible
class Component(SimpleModel, Sortable):
class Meta(Sortable.Meta):
pass
class Component(SimpleModel, SortableMixin):
class Meta:
ordering = ['order']
widget = SortableForeignKey(Widget)
order = models.PositiveIntegerField(default=0, editable=False)
def __str__(self):
return self.title
@python_2_unicode_compatible
class Person(Sortable):
class Meta(Sortable.Meta):
class Person(SortableMixin):
class Meta:
ordering = ['order']
verbose_name_plural = 'People'
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
is_board_member = models.BooleanField('Board Member', default=False)
order = models.PositiveIntegerField(default=0, editable=False)
# Sorting Filters allow you to set up sub-sets of objects that need
# to have independent sorting. They are listed in order, from left
# to right in the sorting change list. You can use any standard
@ -158,26 +171,32 @@ class NonSortableCategory(SimpleModel):
@python_2_unicode_compatible
class SortableCategoryWidget(SimpleModel, Sortable):
class Meta(Sortable.Meta):
class SortableCategoryWidget(SimpleModel, SortableMixin):
class Meta:
ordering = ['order']
verbose_name = 'Sortable Category Widget'
verbose_name_plural = 'Sortable Category Widgets'
non_sortable_category = SortableForeignKey(NonSortableCategory)
order = models.PositiveIntegerField(default=0, editable=False)
def __str__(self):
return self.title
@python_2_unicode_compatible
class SortableNonInlineCategory(SimpleModel, Sortable):
class SortableNonInlineCategory(SimpleModel, SortableMixin):
"""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):
order = models.PositiveIntegerField(default=0, editable=False)
class Meta:
ordering = ['order']
verbose_name = 'Sortable Non-Inline Category'
verbose_name_plural = 'Sortable Non-Inline Categories'

View File

@ -10,14 +10,19 @@ from django.db import models
from django.test import TestCase
from django.test.client import Client
from adminsortable.models import Sortable
from adminsortable.models import SortableMixin
from adminsortable.utils import get_is_sortable
from app.models import Category, Person, Project
class TestSortableModel(Sortable):
class TestSortableModel(SortableMixin):
title = models.CharField(max_length=100)
order = models.PositiveIntegerField(default=0, editable=False)
class Meta:
ordering = ['order']
def __unicode__(self):
return self.title