summaryrefslogtreecommitdiff
path: root/parts/django/tests/modeltests/proxy_models
diff options
context:
space:
mode:
Diffstat (limited to 'parts/django/tests/modeltests/proxy_models')
-rw-r--r--parts/django/tests/modeltests/proxy_models/__init__.py0
-rw-r--r--parts/django/tests/modeltests/proxy_models/fixtures/mypeople.json9
-rw-r--r--parts/django/tests/modeltests/proxy_models/models.py164
-rw-r--r--parts/django/tests/modeltests/proxy_models/tests.py314
4 files changed, 0 insertions, 487 deletions
diff --git a/parts/django/tests/modeltests/proxy_models/__init__.py b/parts/django/tests/modeltests/proxy_models/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/parts/django/tests/modeltests/proxy_models/__init__.py
+++ /dev/null
diff --git a/parts/django/tests/modeltests/proxy_models/fixtures/mypeople.json b/parts/django/tests/modeltests/proxy_models/fixtures/mypeople.json
deleted file mode 100644
index d20c8f2..0000000
--- a/parts/django/tests/modeltests/proxy_models/fixtures/mypeople.json
+++ /dev/null
@@ -1,9 +0,0 @@
-[
- {
- "pk": 100,
- "model": "proxy_models.myperson",
- "fields": {
- "name": "Elvis Presley"
- }
- }
-] \ No newline at end of file
diff --git a/parts/django/tests/modeltests/proxy_models/models.py b/parts/django/tests/modeltests/proxy_models/models.py
deleted file mode 100644
index 90d54d9..0000000
--- a/parts/django/tests/modeltests/proxy_models/models.py
+++ /dev/null
@@ -1,164 +0,0 @@
-"""
-By specifying the 'proxy' Meta attribute, model subclasses can specify that
-they will take data directly from the table of their base class table rather
-than using a new table of their own. This allows them to act as simple proxies,
-providing a modified interface to the data from the base class.
-"""
-
-from django.contrib.contenttypes.models import ContentType
-from django.db import models
-
-
-# A couple of managers for testing managing overriding in proxy model cases.
-
-class PersonManager(models.Manager):
- def get_query_set(self):
- return super(PersonManager, self).get_query_set().exclude(name="fred")
-
-class SubManager(models.Manager):
- def get_query_set(self):
- return super(SubManager, self).get_query_set().exclude(name="wilma")
-
-class Person(models.Model):
- """
- A simple concrete base class.
- """
- name = models.CharField(max_length=50)
-
- objects = PersonManager()
-
- def __unicode__(self):
- return self.name
-
-class Abstract(models.Model):
- """
- A simple abstract base class, to be used for error checking.
- """
- data = models.CharField(max_length=10)
-
- class Meta:
- abstract = True
-
-class MyPerson(Person):
- """
- A proxy subclass, this should not get a new table. Overrides the default
- manager.
- """
- class Meta:
- proxy = True
- ordering = ["name"]
-
- objects = SubManager()
- other = PersonManager()
-
- def has_special_name(self):
- return self.name.lower() == "special"
-
-class ManagerMixin(models.Model):
- excluder = SubManager()
-
- class Meta:
- abstract = True
-
-class OtherPerson(Person, ManagerMixin):
- """
- A class with the default manager from Person, plus an secondary manager.
- """
- class Meta:
- proxy = True
- ordering = ["name"]
-
-class StatusPerson(MyPerson):
- """
- A non-proxy subclass of a proxy, it should get a new table.
- """
- status = models.CharField(max_length=80)
-
-# We can even have proxies of proxies (and subclass of those).
-class MyPersonProxy(MyPerson):
- class Meta:
- proxy = True
-
-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 \ No newline at end of file
diff --git a/parts/django/tests/modeltests/proxy_models/tests.py b/parts/django/tests/modeltests/proxy_models/tests.py
deleted file mode 100644
index 346a2a3..0000000
--- a/parts/django/tests/modeltests/proxy_models/tests.py
+++ /dev/null
@@ -1,314 +0,0 @@
-from django.test import TestCase
-from django.db import models, DEFAULT_DB_ALIAS
-from django.db.models import signals
-from django.core import management
-from django.core.exceptions import FieldError
-
-from django.contrib.contenttypes.models import ContentType
-
-from models import MyPerson, Person, StatusPerson, LowerStatusPerson
-from models import MyPersonProxy, Abstract, OtherPerson, User, UserProxy
-from models import UserProxyProxy, Country, State, StateProxy, TrackerUser
-from models import BaseUser, Bug, ProxyTrackerUser, Improvement, ProxyProxyBug
-from models import ProxyBug, ProxyImprovement
-
-class ProxyModelTests(TestCase):
- def test_same_manager_queries(self):
- """
- The MyPerson model should be generating the same database queries as
- the Person model (when the same manager is used in each case).
- """
- my_person_sql = MyPerson.other.all().query.get_compiler(
- DEFAULT_DB_ALIAS).as_sql()
- person_sql = Person.objects.order_by("name").query.get_compiler(
- DEFAULT_DB_ALIAS).as_sql()
- self.assertEqual(my_person_sql, person_sql)
-
- def test_inheretance_new_table(self):
- """
- The StatusPerson models should have its own table (it's using ORM-level
- inheritance).
- """
- sp_sql = StatusPerson.objects.all().query.get_compiler(
- DEFAULT_DB_ALIAS).as_sql()
- p_sql = Person.objects.all().query.get_compiler(
- DEFAULT_DB_ALIAS).as_sql()
- self.assertNotEqual(sp_sql, p_sql)
-
- def test_basic_proxy(self):
- """
- Creating a Person makes them accessible through the MyPerson proxy.
- """
- Person.objects.create(name="Foo McBar")
- self.assertEqual(len(Person.objects.all()), 1)
- self.assertEqual(len(MyPerson.objects.all()), 1)
- self.assertEqual(MyPerson.objects.get(name="Foo McBar").id, 1)
- self.assertFalse(MyPerson.objects.get(id=1).has_special_name())
-
- def test_no_proxy(self):
- """
- Person is not proxied by StatusPerson subclass.
- """
- Person.objects.create(name="Foo McBar")
- self.assertEqual(list(StatusPerson.objects.all()), [])
-
- def test_basic_proxy_reverse(self):
- """
- A new MyPerson also shows up as a standard Person.
- """
- MyPerson.objects.create(name="Bazza del Frob")
- self.assertEqual(len(MyPerson.objects.all()), 1)
- self.assertEqual(len(Person.objects.all()), 1)
-
- LowerStatusPerson.objects.create(status="low", name="homer")
- lsps = [lsp.name for lsp in LowerStatusPerson.objects.all()]
- self.assertEqual(lsps, ["homer"])
-
- def test_correct_type_proxy_of_proxy(self):
- """
- Correct type when querying a proxy of proxy
- """
- Person.objects.create(name="Foo McBar")
- MyPerson.objects.create(name="Bazza del Frob")
- LowerStatusPerson.objects.create(status="low", name="homer")
- pp = sorted([mpp.name for mpp in MyPersonProxy.objects.all()])
- self.assertEqual(pp, ['Bazza del Frob', 'Foo McBar', 'homer'])
-
- def test_proxy_included_in_ancestors(self):
- """
- Proxy models are included in the ancestors for a model's DoesNotExist
- and MultipleObjectsReturned
- """
- Person.objects.create(name="Foo McBar")
- MyPerson.objects.create(name="Bazza del Frob")
- LowerStatusPerson.objects.create(status="low", name="homer")
- max_id = Person.objects.aggregate(max_id=models.Max('id'))['max_id']
-
- self.assertRaises(Person.DoesNotExist,
- MyPersonProxy.objects.get,
- name='Zathras'
- )
- self.assertRaises(Person.MultipleObjectsReturned,
- MyPersonProxy.objects.get,
- id__lt=max_id+1
- )
- self.assertRaises(Person.DoesNotExist,
- StatusPerson.objects.get,
- name='Zathras'
- )
-
- sp1 = StatusPerson.objects.create(name='Bazza Jr.')
- sp2 = StatusPerson.objects.create(name='Foo Jr.')
- max_id = Person.objects.aggregate(max_id=models.Max('id'))['max_id']
-
- self.assertRaises(Person.MultipleObjectsReturned,
- StatusPerson.objects.get,
- id__lt=max_id+1
- )
-
- def test_abc(self):
- """
- All base classes must be non-abstract
- """
- def build_abc():
- class NoAbstract(Abstract):
- class Meta:
- proxy = True
- self.assertRaises(TypeError, build_abc)
-
- def test_no_cbc(self):
- """
- The proxy must actually have one concrete base class
- """
- def build_no_cbc():
- class TooManyBases(Person, Abstract):
- class Meta:
- proxy = True
- self.assertRaises(TypeError, build_no_cbc)
-
- def test_no_base_classes(self):
- def build_no_base_classes():
- class NoBaseClasses(models.Model):
- class Meta:
- proxy = True
- self.assertRaises(TypeError, build_no_base_classes)
-
- def test_new_fields(self):
- def build_new_fields():
- class NoNewFields(Person):
- newfield = models.BooleanField()
- class Meta:
- proxy = True
- self.assertRaises(FieldError, build_new_fields)
-
- def test_myperson_manager(self):
- Person.objects.create(name="fred")
- Person.objects.create(name="wilma")
- Person.objects.create(name="barney")
-
- resp = [p.name for p in MyPerson.objects.all()]
- self.assertEqual(resp, ['barney', 'fred'])
-
- resp = [p.name for p in MyPerson._default_manager.all()]
- self.assertEqual(resp, ['barney', 'fred'])
-
- def test_otherperson_manager(self):
- Person.objects.create(name="fred")
- Person.objects.create(name="wilma")
- Person.objects.create(name="barney")
-
- resp = [p.name for p in OtherPerson.objects.all()]
- self.assertEqual(resp, ['barney', 'wilma'])
-
- resp = [p.name for p in OtherPerson.excluder.all()]
- self.assertEqual(resp, ['barney', 'fred'])
-
- resp = [p.name for p in OtherPerson._default_manager.all()]
- self.assertEqual(resp, ['barney', 'wilma'])
-
- def test_proxy_model_signals(self):
- """
- Test save signals for proxy models
- """
- output = []
-
- def make_handler(model, event):
- def _handler(*args, **kwargs):
- output.append('%s %s save' % (model, event))
- return _handler
-
- h1 = make_handler('MyPerson', 'pre')
- h2 = make_handler('MyPerson', 'post')
- h3 = make_handler('Person', 'pre')
- h4 = make_handler('Person', 'post')
-
- signals.pre_save.connect(h1, sender=MyPerson)
- signals.post_save.connect(h2, sender=MyPerson)
- signals.pre_save.connect(h3, sender=Person)
- signals.post_save.connect(h4, sender=Person)
-
- dino = MyPerson.objects.create(name=u"dino")
- self.assertEqual(output, [
- 'MyPerson pre save',
- 'MyPerson post save'
- ])
-
- output = []
-
- h5 = make_handler('MyPersonProxy', 'pre')
- h6 = make_handler('MyPersonProxy', 'post')
-
- signals.pre_save.connect(h5, sender=MyPersonProxy)
- signals.post_save.connect(h6, sender=MyPersonProxy)
-
- dino = MyPersonProxy.objects.create(name=u"pebbles")
-
- self.assertEqual(output, [
- 'MyPersonProxy pre save',
- 'MyPersonProxy post save'
- ])
-
- signals.pre_save.disconnect(h1, sender=MyPerson)
- signals.post_save.disconnect(h2, sender=MyPerson)
- signals.pre_save.disconnect(h3, sender=Person)
- signals.post_save.disconnect(h4, sender=Person)
- signals.pre_save.disconnect(h5, sender=MyPersonProxy)
- signals.post_save.disconnect(h6, sender=MyPersonProxy)
-
- def test_content_type(self):
- ctype = ContentType.objects.get_for_model
- self.assertTrue(ctype(Person) is ctype(OtherPerson))
-
- def test_user_userproxy_userproxyproxy(self):
- User.objects.create(name='Bruce')
-
- resp = [u.name for u in User.objects.all()]
- self.assertEqual(resp, ['Bruce'])
-
- resp = [u.name for u in UserProxy.objects.all()]
- self.assertEqual(resp, ['Bruce'])
-
- resp = [u.name for u in UserProxyProxy.objects.all()]
- self.assertEqual(resp, ['Bruce'])
-
- def test_proxy_delete(self):
- """
- Proxy objects can be deleted
- """
- User.objects.create(name='Bruce')
- u2 = UserProxy.objects.create(name='George')
-
- resp = [u.name for u in UserProxy.objects.all()]
- self.assertEqual(resp, ['Bruce', 'George'])
-
- u2.delete()
-
- resp = [u.name for u in UserProxy.objects.all()]
- self.assertEqual(resp, ['Bruce'])
-
- def test_select_related(self):
- """
- 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)
-
- resp = [s.name for s in State.objects.select_related()]
- self.assertEqual(resp, ['New South Wales'])
-
- resp = [s.name for s in StateProxy.objects.select_related()]
- self.assertEqual(resp, ['New South Wales'])
-
- self.assertEqual(StateProxy.objects.get(name='New South Wales').name,
- 'New South Wales')
-
- resp = StateProxy.objects.select_related().get(name='New South Wales')
- self.assertEqual(resp.name, 'New South Wales')
-
- def test_proxy_bug(self):
- 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
- resp = ProxyBug.objects.get(version__icontains='beta')
- self.assertEqual(repr(resp), '<ProxyBug: ProxyBug:fix this>')
-
- # Select related + filter on proxy
- resp = ProxyBug.objects.select_related().get(version__icontains='beta')
- self.assertEqual(repr(resp), '<ProxyBug: ProxyBug:fix this>')
-
- # Proxy of proxy, select_related + filter
- resp = ProxyProxyBug.objects.select_related().get(
- version__icontains='beta'
- )
- self.assertEqual(repr(resp), '<ProxyProxyBug: ProxyProxyBug:fix this>')
-
- # Select related + filter on a related proxy field
- resp = ProxyImprovement.objects.select_related().get(
- reporter__name__icontains='butor'
- )
- self.assertEqual(repr(resp),
- '<ProxyImprovement: ProxyImprovement:improve that>'
- )
-
- # Select related + filter on a related proxy of proxy field
- resp = ProxyImprovement.objects.select_related().get(
- associated_bug__summary__icontains='fix'
- )
- self.assertEqual(repr(resp),
- '<ProxyImprovement: ProxyImprovement:improve that>'
- )
-
- def test_proxy_load_from_fixture(self):
- management.call_command('loaddata', 'mypeople.json', verbosity=0, commit=False)
- p = MyPerson.objects.get(pk=100)
- self.assertEqual(p.name, 'Elvis Presley')