summaryrefslogtreecommitdiff
path: root/tests/modeltests/proxy_models/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/modeltests/proxy_models/models.py')
-rw-r--r--tests/modeltests/proxy_models/models.py140
1 files changed, 139 insertions, 1 deletions
diff --git a/tests/modeltests/proxy_models/models.py b/tests/modeltests/proxy_models/models.py
index ab381129cf..baa58cba03 100644
--- a/tests/modeltests/proxy_models/models.py
+++ b/tests/modeltests/proxy_models/models.py
@@ -82,6 +82,87 @@ class MyPersonProxy(MyPerson):
class LowerStatusPerson(MyPersonProxy):
status = models.CharField(max_length=80)
+class User(models.Model):
+ name = models.CharField(max_length=100)
+
+ def __unicode__(self):
+ return self.name
+
+class UserProxy(User):
+ class Meta:
+ proxy = True
+
+class UserProxyProxy(UserProxy):
+ class Meta:
+ proxy = True
+
+# We can still use `select_related()` to include related models in our querysets.
+class Country(models.Model):
+ name = models.CharField(max_length=50)
+
+class State(models.Model):
+ name = models.CharField(max_length=50)
+ country = models.ForeignKey(Country)
+
+ def __unicode__(self):
+ return self.name
+
+class StateProxy(State):
+ class Meta:
+ proxy = True
+
+# Proxy models still works with filters (on related fields)
+# and select_related, even when mixed with model inheritance
+class BaseUser(models.Model):
+ name = models.CharField(max_length=255)
+
+class TrackerUser(BaseUser):
+ status = models.CharField(max_length=50)
+
+class ProxyTrackerUser(TrackerUser):
+ class Meta:
+ proxy = True
+
+
+class Issue(models.Model):
+ summary = models.CharField(max_length=255)
+ assignee = models.ForeignKey(TrackerUser)
+
+ def __unicode__(self):
+ return ':'.join((self.__class__.__name__,self.summary,))
+
+class Bug(Issue):
+ version = models.CharField(max_length=50)
+ reporter = models.ForeignKey(BaseUser)
+
+class ProxyBug(Bug):
+ """
+ Proxy of an inherited class
+ """
+ class Meta:
+ proxy = True
+
+
+class ProxyProxyBug(ProxyBug):
+ """
+ A proxy of proxy model with related field
+ """
+ class Meta:
+ proxy = True
+
+class Improvement(Issue):
+ """
+ A model that has relation to a proxy model
+ or to a proxy of proxy model
+ """
+ version = models.CharField(max_length=50)
+ reporter = models.ForeignKey(ProxyTrackerUser)
+ associated_bug = models.ForeignKey(ProxyProxyBug)
+
+class ProxyImprovement(Improvement):
+ class Meta:
+ proxy = True
+
__test__ = {'API_TESTS' : """
# The MyPerson model should be generating the same database queries as the
# Person model (when the same manager is used in each case).
@@ -119,6 +200,11 @@ False
>>> LowerStatusPerson.objects.all()
[<LowerStatusPerson: homer>]
+# Correct type when querying a proxy of proxy
+
+>>> MyPersonProxy.objects.all()
+[<MyPersonProxy: Bazza del Frob>, <MyPersonProxy: Foo McBar>, <MyPersonProxy: homer>]
+
# And now for some things that shouldn't work...
#
# All base classes must be non-abstract
@@ -178,6 +264,58 @@ FieldError: Proxy model 'NoNewFields' contains model fields.
>>> ctype = ContentType.objects.get_for_model
>>> ctype(Person) is ctype(OtherPerson)
True
-"""}
+>>> MyPersonProxy.objects.all()
+[<MyPersonProxy: barney>, <MyPersonProxy: fred>]
+
+>>> u = User.objects.create(name='Bruce')
+>>> User.objects.all()
+[<User: Bruce>]
+>>> UserProxy.objects.all()
+[<UserProxy: Bruce>]
+>>> UserProxyProxy.objects.all()
+[<UserProxyProxy: Bruce>]
+
+# We can still use `select_related()` to include related models in our querysets.
+>>> country = Country.objects.create(name='Australia')
+>>> state = State.objects.create(name='New South Wales', country=country)
+
+>>> State.objects.select_related()
+[<State: New South Wales>]
+>>> StateProxy.objects.select_related()
+[<StateProxy: New South Wales>]
+>>> StateProxy.objects.get(name='New South Wales')
+<StateProxy: New South Wales>
+>>> StateProxy.objects.select_related().get(name='New South Wales')
+<StateProxy: New South Wales>
+>>> contributor = TrackerUser.objects.create(name='Contributor',status='contrib')
+>>> someone = BaseUser.objects.create(name='Someone')
+>>> _ = Bug.objects.create(summary='fix this', version='1.1beta',
+... assignee=contributor, reporter=someone)
+>>> pcontributor = ProxyTrackerUser.objects.create(name='OtherContributor',
+... status='proxy')
+>>> _ = Improvement.objects.create(summary='improve that', version='1.1beta',
+... assignee=contributor, reporter=pcontributor,
+... associated_bug=ProxyProxyBug.objects.all()[0])
+
+# Related field filter on proxy
+>>> ProxyBug.objects.get(version__icontains='beta')
+<ProxyBug: ProxyBug:fix this>
+
+# Select related + filter on proxy
+>>> ProxyBug.objects.select_related().get(version__icontains='beta')
+<ProxyBug: ProxyBug:fix this>
+
+# Proxy of proxy, select_related + filter
+>>> ProxyProxyBug.objects.select_related().get(version__icontains='beta')
+<ProxyProxyBug: ProxyProxyBug:fix this>
+
+# Select related + filter on a related proxy field
+>>> ProxyImprovement.objects.select_related().get(reporter__name__icontains='butor')
+<ProxyImprovement: ProxyImprovement:improve that>
+
+# Select related + filter on a related proxy of proxy field
+>>> ProxyImprovement.objects.select_related().get(associated_bug__summary__icontains='fix')
+<ProxyImprovement: ProxyImprovement:improve that>
+"""}