from django.db import models
from nested_admin.tests.compat import python_2_unicode_compatible
[docs]@python_2_unicode_compatible
class Root(models.Model):
slug = models.SlugField(max_length=10, blank=True, null=True)
def __str__(self):
return "%s(%s)" % (type(self).__name__, self.slug)
[docs]@python_2_unicode_compatible
class A(models.Model):
root = models.ForeignKey(Root, related_name="a_set", on_delete=models.CASCADE)
position = models.PositiveIntegerField()
foo = models.CharField(max_length=10, blank=True, null=True)
a_type = models.CharField(max_length=1, choices=(('X', 'X'), ('Y', 'Y')))
default_a_type = None
class Meta:
ordering = ['position']
def __str__(self):
parts = ["A%s[%d](%s)" % (self.a_type, self.position, self.foo)]
if self.root:
parts.insert(0, "%s" % self.root)
return "/".join(parts)
[docs] def save(self, **kwargs):
self.a_type = self.default_a_type
super(A, self).save(**kwargs)
[docs]class AManager(models.Manager):
def __init__(self, a_type):
self.a_type = a_type
super(AManager, self).__init__()
[docs] def get_queryset(self):
return super(AManager, self).get_queryset().filter(a_type=self.a_type)
[docs]class AX(A):
default_a_type = 'X'
objects = AManager(default_a_type)
class Meta:
proxy = True
[docs]class AY(A):
default_a_type = 'Y'
objects = AManager(default_a_type)
class Meta:
proxy = True
[docs]@python_2_unicode_compatible
class B(models.Model):
a = models.ForeignKey(A, related_name="b_set", on_delete=models.CASCADE)
position = models.PositiveIntegerField()
bar = models.CharField(max_length=10, blank=True, null=True)
b_type = models.CharField(max_length=1, choices=(('X', 'X'), ('Y', 'Y')))
default_b_type = None
class Meta:
ordering = ['position']
def __str__(self):
parts = ["B%s[%d](%s)" % (self.b_type, self.position, self.bar)]
if self.a:
parts.insert(0, "%s" % self.a)
return "/".join(parts)
[docs] def save(self, **kwargs):
self.b_type = self.default_b_type
super(B, self).save(**kwargs)
[docs]class BManager(models.Manager):
def __init__(self, b_type):
self.b_type = b_type
super(BManager, self).__init__()
[docs] def get_queryset(self):
return super(BManager, self).get_queryset().filter(b_type=self.b_type)
[docs]class BX(B):
default_b_type = 'X'
objects = BManager(default_b_type)
class Meta:
proxy = True
[docs]class BY(B):
default_b_type = 'Y'
objects = BManager(default_b_type)
class Meta:
proxy = True