Reformat all files with isort and black

This commit is contained in:
Diederik van der Boor
2019-07-15 09:50:03 +02:00
parent d314dce4a2
commit 59c020ee50
50 changed files with 4069 additions and 2419 deletions
+56 -32
View File
@@ -12,6 +12,7 @@ class AdminTestCase(TestCase):
"""
Testing the admin site
"""
#: The model to test
model = None
#: The admin class to test
@@ -20,7 +21,9 @@ class AdminTestCase(TestCase):
@classmethod
def setUpClass(cls):
super(AdminTestCase, cls).setUpClass()
cls.admin_user = User.objects.create_superuser('admin', 'admin@example.org', password='admin')
cls.admin_user = User.objects.create_superuser(
"admin", "admin@example.org", password="admin"
)
def setUp(self):
super(AdminTestCase, self).setUp()
@@ -37,9 +40,11 @@ class AdminTestCase(TestCase):
def register(self, model):
"""Decorator, like admin.register()"""
def _dec(admin_class):
self.admin_register(model, admin_class)
return admin_class
return _dec
def admin_register(self, model, admin_site):
@@ -48,9 +53,7 @@ class AdminTestCase(TestCase):
# Make sure the URLs are reachable by reverse()
clear_url_caches()
set_urlconf(tuple([
url('^tmp-admin/', self.admin_site.urls)
]))
set_urlconf(tuple([url("^tmp-admin/", self.admin_site.urls)]))
def get_admin_instance(self, model):
try:
@@ -66,40 +69,42 @@ class AdminTestCase(TestCase):
def get_add_url(self, model):
admin_instance = self.get_admin_instance(model)
return reverse(admin_urlname(admin_instance.opts, 'add'))
return reverse(admin_urlname(admin_instance.opts, "add"))
def get_changelist_url(self, model):
admin_instance = self.get_admin_instance(model)
return reverse(admin_urlname(admin_instance.opts, 'changelist'))
return reverse(admin_urlname(admin_instance.opts, "changelist"))
def get_change_url(self, model, object_id):
admin_instance = self.get_admin_instance(model)
return reverse(admin_urlname(admin_instance.opts, 'change'), args=(object_id,))
return reverse(admin_urlname(admin_instance.opts, "change"), args=(object_id,))
def get_history_url(self, model, object_id):
admin_instance = self.get_admin_instance(model)
return reverse(admin_urlname(admin_instance.opts, 'history'), args=(object_id,))
return reverse(admin_urlname(admin_instance.opts, "history"), args=(object_id,))
def get_delete_url(self, model, object_id):
admin_instance = self.get_admin_instance(model)
return reverse(admin_urlname(admin_instance.opts, 'delete'), args=(object_id,))
return reverse(admin_urlname(admin_instance.opts, "delete"), args=(object_id,))
def admin_get_add(self, model, qs=''):
def admin_get_add(self, model, qs=""):
"""
Make a direct "add" call to the admin page, circumvening login checks.
"""
admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('get', self.get_add_url(model) + qs)
request = self.create_admin_request("get", self.get_add_url(model) + qs)
response = admin_instance.add_view(request)
self.assertEqual(response.status_code, 200)
return response
def admin_post_add(self, model, formdata, qs=''):
def admin_post_add(self, model, formdata, qs=""):
"""
Make a direct "add" call to the admin page, circumvening login checks.
"""
admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('post', self.get_add_url(model) + qs, data=formdata)
request = self.create_admin_request(
"post", self.get_add_url(model) + qs, data=formdata
)
response = admin_instance.add_view(request)
self.assertFormSuccess(request.path, response)
return response
@@ -109,7 +114,7 @@ class AdminTestCase(TestCase):
Make a direct "add" call to the admin page, circumvening login checks.
"""
admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('get', self.get_changelist_url(model))
request = self.create_admin_request("get", self.get_changelist_url(model))
response = admin_instance.changelist_view(request)
self.assertEqual(response.status_code, 200)
return response
@@ -119,7 +124,9 @@ class AdminTestCase(TestCase):
Perform a GET request on the admin page
"""
admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('get', self.get_change_url(model, object_id), data=query, **extra)
request = self.create_admin_request(
"get", self.get_change_url(model, object_id), data=query, **extra
)
response = admin_instance.change_view(request, str(object_id))
self.assertEqual(response.status_code, 200)
return response
@@ -129,7 +136,9 @@ class AdminTestCase(TestCase):
Make a direct "add" call to the admin page, circumvening login checks.
"""
admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('post', self.get_change_url(model, object_id), data=formdata, **extra)
request = self.create_admin_request(
"post", self.get_change_url(model, object_id), data=formdata, **extra
)
response = admin_instance.change_view(request, str(object_id))
self.assertFormSuccess(request.path, response)
return response
@@ -139,7 +148,9 @@ class AdminTestCase(TestCase):
Perform a GET request on the admin page
"""
admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('get', self.get_history_url(model, object_id), data=query, **extra)
request = self.create_admin_request(
"get", self.get_history_url(model, object_id), data=query, **extra
)
response = admin_instance.history_view(request, str(object_id))
self.assertEqual(response.status_code, 200)
return response
@@ -149,7 +160,9 @@ class AdminTestCase(TestCase):
Perform a GET request on the admin delete page
"""
admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('get', self.get_delete_url(model, object_id), data=query, **extra)
request = self.create_admin_request(
"get", self.get_delete_url(model, object_id), data=query, **extra
)
response = admin_instance.delete_view(request, str(object_id))
self.assertEqual(response.status_code, 200)
return response
@@ -159,12 +172,16 @@ class AdminTestCase(TestCase):
Make a direct "add" call to the admin page, circumvening login checks.
"""
if not extra:
extra = {'data': {'post': 'yes'}}
extra = {"data": {"post": "yes"}}
admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('post', self.get_delete_url(model, object_id), **extra)
request = self.create_admin_request(
"post", self.get_delete_url(model, object_id), **extra
)
response = admin_instance.delete_view(request, str(object_id))
self.assertEqual(response.status_code, 302, "Form errors in calling {0}".format(request.path))
self.assertEqual(
response.status_code, 302, "Form errors in calling {0}".format(request.path)
)
return response
def create_admin_request(self, method, url, data=None, **extra):
@@ -174,8 +191,8 @@ class AdminTestCase(TestCase):
factory_method = getattr(RequestFactory(), method)
if data is not None:
if method != 'get':
data['csrfmiddlewaretoken'] = 'foo'
if method != "get":
data["csrfmiddlewaretoken"] = "foo"
dummy_request = factory_method(url, data=data)
dummy_request.user = self.admin_user
@@ -185,7 +202,7 @@ class AdminTestCase(TestCase):
# data = base_data
request = factory_method(url, data=data, **extra)
request.COOKIES[settings.CSRF_COOKIE_NAME] = 'foo'
request.COOKIES[settings.CSRF_COOKIE_NAME] = "foo"
request.csrf_processing_done = True
# Add properties which middleware would typically do
@@ -201,14 +218,21 @@ class AdminTestCase(TestCase):
self.assertIn(response.status_code, [200, 302])
if response.status_code != 302:
context_data = response.context_data
if 'errors' in context_data:
errors = response.context_data['errors']
elif 'form' in context_data:
errors = context_data['form'].errors
if "errors" in context_data:
errors = response.context_data["errors"]
elif "form" in context_data:
errors = context_data["form"].errors
else:
raise KeyError("Unknown field for errors in the TemplateResponse!")
self.assertEqual(response.status_code, 302,
"Form errors in calling {0}:\n{1}".format(request_url, errors.as_text()))
self.assertTrue('/login/?next=' not in response['Location'],
"Received login response for {0}".format(request_url))
self.assertEqual(
response.status_code,
302,
"Form errors in calling {0}:\n{1}".format(
request_url, errors.as_text()
),
)
self.assertTrue(
"/login/?next=" not in response["Location"],
"Received login response for {0}".format(request_url),
)
File diff suppressed because it is too large Load Diff
+57 -33
View File
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
import django
import uuid
import django
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models.query import QuerySet
@@ -9,7 +9,11 @@ from django.db.models.query import QuerySet
from polymorphic.managers import PolymorphicManager
from polymorphic.models import PolymorphicModel
from polymorphic.query import PolymorphicQuerySet
from polymorphic.showfields import ShowFieldContent, ShowFieldType, ShowFieldTypeAndContent
from polymorphic.showfields import (
ShowFieldContent,
ShowFieldType,
ShowFieldTypeAndContent,
)
class PlainA(models.Model):
@@ -59,17 +63,17 @@ class ModelExtraExternal(models.Model):
class ModelShow1(ShowFieldType, PolymorphicModel):
field1 = models.CharField(max_length=10)
m2m = models.ManyToManyField('self')
m2m = models.ManyToManyField("self")
class ModelShow2(ShowFieldContent, PolymorphicModel):
field1 = models.CharField(max_length=10)
m2m = models.ManyToManyField('self')
m2m = models.ManyToManyField("self")
class ModelShow3(ShowFieldTypeAndContent, PolymorphicModel):
field1 = models.CharField(max_length=10)
m2m = models.ManyToManyField('self')
m2m = models.ManyToManyField("self")
class ModelShow1_plain(PolymorphicModel):
@@ -108,8 +112,10 @@ class Enhance_Inherit(Enhance_Base, Enhance_Plain):
class RelationBase(ShowFieldTypeAndContent, PolymorphicModel):
field_base = models.CharField(max_length=10)
fk = models.ForeignKey('self', on_delete=models.CASCADE, null=True, related_name='relationbase_set')
m2m = models.ManyToManyField('self')
fk = models.ForeignKey(
"self", on_delete=models.CASCADE, null=True, related_name="relationbase_set"
)
m2m = models.ManyToManyField("self")
class RelationA(RelationBase):
@@ -143,21 +149,24 @@ class ModelUnderRelParent(PolymorphicModel):
class ModelUnderRelChild(PolymorphicModel):
parent = models.ForeignKey(ModelUnderRelParent, on_delete=models.CASCADE, related_name='children')
parent = models.ForeignKey(
ModelUnderRelParent, on_delete=models.CASCADE, related_name="children"
)
_private2 = models.CharField(max_length=10)
class MyManagerQuerySet(PolymorphicQuerySet):
def my_queryset_foo(self):
return self.all() # Just a method to prove the existance of the custom queryset.
return (
self.all()
) # Just a method to prove the existance of the custom queryset.
class MyManager(PolymorphicManager):
queryset_class = MyManagerQuerySet
def get_queryset(self):
return super(MyManager, self).get_queryset().order_by('-field1')
return super(MyManager, self).get_queryset().order_by("-field1")
def my_queryset_foo(self):
return self.all().my_queryset_foo()
@@ -196,12 +205,15 @@ class MROBase2(MROBase1):
class MROBase3(models.Model):
base_3_id = models.AutoField(primary_key=True) # make sure 'id' field doesn't clash, detected by Django 1.11
base_3_id = models.AutoField(
primary_key=True
) # make sure 'id' field doesn't clash, detected by Django 1.11
objects = models.Manager()
class MRODerived(MROBase2, MROBase3):
if django.VERSION < (3, 0):
class Meta:
manager_inheritance_from_future = True
@@ -212,18 +224,20 @@ class ParentModelWithManager(PolymorphicModel):
class ChildModelWithManager(PolymorphicModel):
# Also test whether foreign keys receive the manager:
fk = models.ForeignKey(ParentModelWithManager, on_delete=models.CASCADE, related_name='childmodel_set')
fk = models.ForeignKey(
ParentModelWithManager, on_delete=models.CASCADE, related_name="childmodel_set"
)
objects = MyManager()
class PlainMyManagerQuerySet(QuerySet):
def my_queryset_foo(self):
return self.all() # Just a method to prove the existence of the custom queryset.
return (
self.all()
) # Just a method to prove the existence of the custom queryset.
class PlainMyManager(models.Manager):
def my_queryset_foo(self):
return self.get_queryset().my_queryset_foo()
@@ -236,7 +250,11 @@ class PlainParentModelWithManager(models.Model):
class PlainChildModelWithManager(models.Model):
fk = models.ForeignKey(PlainParentModelWithManager, on_delete=models.CASCADE, related_name='childmodel_set')
fk = models.ForeignKey(
PlainParentModelWithManager,
on_delete=models.CASCADE,
related_name="childmodel_set",
)
objects = PlainMyManager()
@@ -270,14 +288,14 @@ class InitTestModel(ShowFieldType, PolymorphicModel):
bar = models.CharField(max_length=100)
def __init__(self, *args, **kwargs):
kwargs['bar'] = self.x()
kwargs["bar"] = self.x()
super(InitTestModel, self).__init__(*args, **kwargs)
class InitTestModelSubclass(InitTestModel):
def x(self):
return 'XYZ'
return "XYZ"
# models from github issue
@@ -319,6 +337,7 @@ class UUIDPlainB(UUIDPlainA):
class UUIDPlainC(UUIDPlainB):
field3 = models.CharField(max_length=10)
# base -> proxy
@@ -327,7 +346,6 @@ class ProxyBase(PolymorphicModel):
class ProxyChild(ProxyBase):
class Meta:
proxy = True
@@ -335,6 +353,7 @@ class ProxyChild(ProxyBase):
class NonProxyChild(ProxyBase):
name = models.CharField(max_length=10)
# base -> proxy -> real models
@@ -343,7 +362,6 @@ class ProxiedBase(ShowFieldTypeAndContent, PolymorphicModel):
class ProxyModelBase(ProxiedBase):
class Meta:
proxy = True
@@ -364,14 +382,20 @@ class ProxyModelB(ProxyModelBase):
# with related field 'ContentType.relatednameclash_set'." (reported by Andrew Ingram)
# fixed with related_name
class RelatedNameClash(ShowFieldType, PolymorphicModel):
ctype = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, editable=False)
ctype = models.ForeignKey(
ContentType, on_delete=models.CASCADE, null=True, editable=False
)
# class with a parent_link to superclass, and a related_name back to subclass
class TestParentLinkAndRelatedName(ModelShow1_plain):
superclass = models.OneToOneField(
ModelShow1_plain, on_delete=models.CASCADE, parent_link=True, related_name='related_name_subclass'
ModelShow1_plain,
on_delete=models.CASCADE,
parent_link=True,
related_name="related_name_subclass",
)
@@ -398,7 +422,7 @@ class AbstractModel(PolymorphicModel):
class SwappableModel(AbstractModel):
class Meta:
swappable = 'POLYMORPHIC_TEST_SWAPPABLE'
swappable = "POLYMORPHIC_TEST_SWAPPABLE"
class SwappedModel(AbstractModel):
@@ -410,7 +434,9 @@ class InlineParent(models.Model):
class InlineModelA(PolymorphicModel):
parent = models.ForeignKey(InlineParent, related_name='inline_children', on_delete=models.CASCADE)
parent = models.ForeignKey(
InlineParent, related_name="inline_children", on_delete=models.CASCADE
)
field1 = models.CharField(max_length=10)
@@ -434,13 +460,11 @@ class Duck(PolymorphicModel):
class RedheadDuck(Duck):
class Meta:
proxy = True
class RubberDuck(Duck):
class Meta:
proxy = True
@@ -454,22 +478,22 @@ class MultiTableDerived(MultiTableBase):
class SubclassSelectorAbstractBaseModel(PolymorphicModel):
base_field = models.CharField(max_length=10, default='test_bf')
base_field = models.CharField(max_length=10, default="test_bf")
class SubclassSelectorAbstractModel(SubclassSelectorAbstractBaseModel):
abstract_field = models.CharField(max_length=10, default='test_af')
abstract_field = models.CharField(max_length=10, default="test_af")
class Meta:
abstract = True
class SubclassSelectorAbstractConcreteModel(SubclassSelectorAbstractModel):
concrete_field = models.CharField(max_length=10, default='test_cf')
concrete_field = models.CharField(max_length=10, default="test_cf")
class SubclassSelectorProxyBaseModel(PolymorphicModel):
base_field = models.CharField(max_length=10, default='test_bf')
base_field = models.CharField(max_length=10, default="test_bf")
class SubclassSelectorProxyModel(SubclassSelectorProxyBaseModel):
@@ -478,4 +502,4 @@ class SubclassSelectorProxyModel(SubclassSelectorProxyBaseModel):
class SubclassSelectorProxyConcreteModel(SubclassSelectorProxyModel):
concrete_field = models.CharField(max_length=10, default='test_cf')
concrete_field = models.CharField(max_length=10, default="test_cf")
+60 -49
View File
@@ -2,18 +2,31 @@ from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.utils.html import escape
from polymorphic.admin import PolymorphicChildModelAdmin, PolymorphicChildModelFilter, PolymorphicInlineSupportMixin, \
PolymorphicParentModelAdmin, StackedPolymorphicInline
from polymorphic.admin import (
PolymorphicChildModelAdmin,
PolymorphicChildModelFilter,
PolymorphicInlineSupportMixin,
PolymorphicParentModelAdmin,
StackedPolymorphicInline,
)
from polymorphic.tests.admintestcase import AdminTestCase
from polymorphic.tests.models import InlineModelA, InlineModelB, InlineParent, Model2A, Model2B, Model2C, Model2D
from polymorphic.tests.models import (
InlineModelA,
InlineModelB,
InlineParent,
Model2A,
Model2B,
Model2C,
Model2D,
)
class PolymorphicAdminTests(AdminTestCase):
def test_admin_registration(self):
"""
Test how the registration works
"""
@self.register(Model2A)
class Model2Admin(PolymorphicParentModelAdmin):
base_model = Model2A
@@ -25,48 +38,42 @@ class PolymorphicAdminTests(AdminTestCase):
@self.register(Model2D)
class Model2ChildAdmin(PolymorphicChildModelAdmin):
base_model = Model2A
base_fieldsets = (
("Base fields", {
'fields': ('field1',)
}),
)
base_fieldsets = (("Base fields", {"fields": ("field1",)}),)
# -- add page
ct_id = ContentType.objects.get_for_model(Model2D).pk
self.admin_get_add(Model2A) # shows type page
self.admin_get_add(Model2A, qs='?ct_id={}'.format(ct_id)) # shows type page
self.admin_get_add(Model2A, qs="?ct_id={}".format(ct_id)) # shows type page
self.admin_get_add(Model2A) # shows type page
self.admin_post_add(Model2A, {
'field1': 'A',
'field2': 'B',
'field3': 'C',
'field4': 'D'
}, qs='?ct_id={}'.format(ct_id))
self.admin_post_add(
Model2A,
{"field1": "A", "field2": "B", "field3": "C", "field4": "D"},
qs="?ct_id={}".format(ct_id),
)
d_obj = Model2A.objects.all()[0]
self.assertEqual(d_obj.__class__, Model2D)
self.assertEqual(d_obj.field1, 'A')
self.assertEqual(d_obj.field2, 'B')
self.assertEqual(d_obj.field1, "A")
self.assertEqual(d_obj.field2, "B")
# -- list page
self.admin_get_changelist(Model2A) # asserts 200
# -- edit
response = self.admin_get_change(Model2A, d_obj.pk)
self.assertContains(response, 'field4')
self.admin_post_change(Model2A, d_obj.pk, {
'field1': 'A2',
'field2': 'B2',
'field3': 'C2',
'field4': 'D2'
})
self.assertContains(response, "field4")
self.admin_post_change(
Model2A,
d_obj.pk,
{"field1": "A2", "field2": "B2", "field3": "C2", "field4": "D2"},
)
d_obj.refresh_from_db()
self.assertEqual(d_obj.field1, 'A2')
self.assertEqual(d_obj.field2, 'B2')
self.assertEqual(d_obj.field3, 'C2')
self.assertEqual(d_obj.field4, 'D2')
self.assertEqual(d_obj.field1, "A2")
self.assertEqual(d_obj.field2, "B2")
self.assertEqual(d_obj.field3, "C2")
self.assertEqual(d_obj.field4, "D2")
# -- history
self.admin_get_history(Model2A, d_obj.pk)
@@ -80,6 +87,7 @@ class PolymorphicAdminTests(AdminTestCase):
"""
Test the registration of inline models.
"""
class InlineModelAChild(StackedPolymorphicInline.Child):
model = InlineModelA
@@ -88,43 +96,46 @@ class PolymorphicAdminTests(AdminTestCase):
class Inline(StackedPolymorphicInline):
model = InlineModelA
child_inlines = (
InlineModelAChild,
InlineModelBChild,
)
child_inlines = (InlineModelAChild, InlineModelBChild)
@self.register(InlineParent)
class InlineParentAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin):
inlines = (Inline,)
parent = InlineParent.objects.create(title='FOO')
parent = InlineParent.objects.create(title="FOO")
self.assertEqual(parent.inline_children.count(), 0)
# -- get edit page
response = self.admin_get_change(InlineParent, parent.pk)
# Make sure the fieldset has the right data exposed in data-inline-formset
self.assertContains(response, 'childTypes')
self.assertContains(response, "childTypes")
self.assertContains(response, escape('"type": "inlinemodela"'))
self.assertContains(response, escape('"type": "inlinemodelb"'))
# -- post edit page
self.admin_post_change(InlineParent, parent.pk, {
'title': 'FOO2',
'inline_children-INITIAL_FORMS': 0,
'inline_children-TOTAL_FORMS': 1,
'inline_children-MIN_NUM_FORMS': 0,
'inline_children-MAX_NUM_FORMS': 1000,
'inline_children-0-parent': parent.pk,
'inline_children-0-polymorphic_ctype': ContentType.objects.get_for_model(InlineModelB).pk,
'inline_children-0-field1': 'A2',
'inline_children-0-field2': 'B2',
})
self.admin_post_change(
InlineParent,
parent.pk,
{
"title": "FOO2",
"inline_children-INITIAL_FORMS": 0,
"inline_children-TOTAL_FORMS": 1,
"inline_children-MIN_NUM_FORMS": 0,
"inline_children-MAX_NUM_FORMS": 1000,
"inline_children-0-parent": parent.pk,
"inline_children-0-polymorphic_ctype": ContentType.objects.get_for_model(
InlineModelB
).pk,
"inline_children-0-field1": "A2",
"inline_children-0-field2": "B2",
},
)
parent.refresh_from_db()
self.assertEqual(parent.title, 'FOO2')
self.assertEqual(parent.title, "FOO2")
self.assertEqual(parent.inline_children.count(), 1)
child = parent.inline_children.all()[0]
self.assertEqual(child.__class__, InlineModelB)
self.assertEqual(child.field1, 'A2')
self.assertEqual(child.field2, 'B2')
self.assertEqual(child.field1, "A2")
self.assertEqual(child.field2, "B2")
+5 -9
View File
@@ -1,10 +1,7 @@
from unittest import TestCase
from polymorphic.contrib.guardian import get_polymorphic_base_content_type
from polymorphic.tests.models import (
Model2D,
PlainC,
)
from polymorphic.tests.models import Model2D, PlainC
class ContribTests(TestCase):
@@ -12,20 +9,19 @@ class ContribTests(TestCase):
The test suite
"""
def test_contrib_guardian(self):
# Regular Django inheritance should return the child model content type.
obj = PlainC()
ctype = get_polymorphic_base_content_type(obj)
self.assertEqual(ctype.name, 'plain c')
self.assertEqual(ctype.name, "plain c")
ctype = get_polymorphic_base_content_type(PlainC)
self.assertEqual(ctype.name, 'plain c')
self.assertEqual(ctype.name, "plain c")
# Polymorphic inheritance should return the parent model content type.
obj = Model2D()
ctype = get_polymorphic_base_content_type(obj)
self.assertEqual(ctype.name, 'model2a')
self.assertEqual(ctype.name, "model2a")
ctype = get_polymorphic_base_content_type(Model2D)
self.assertEqual(ctype.name, 'model2a')
self.assertEqual(ctype.name, "model2a")
+37 -27
View File
@@ -23,29 +23,29 @@ class MultipleDatabasesTests(TestCase):
multi_db = True
def test_save_to_non_default_database(self):
Model2A.objects.db_manager('secondary').create(field1='A1')
Model2C(field1='C1', field2='C2', field3='C3').save(using='secondary')
Model2B.objects.create(field1='B1', field2='B2')
Model2D(field1='D1', field2='D2', field3='D3', field4='D4').save()
Model2A.objects.db_manager("secondary").create(field1="A1")
Model2C(field1="C1", field2="C2", field3="C3").save(using="secondary")
Model2B.objects.create(field1="B1", field2="B2")
Model2D(field1="D1", field2="D2", field3="D3", field4="D4").save()
self.assertQuerysetEqual(
Model2A.objects.order_by('id'),
Model2A.objects.order_by("id"),
[Model2B, Model2D],
transform=lambda o: o.__class__,
)
self.assertQuerysetEqual(
Model2A.objects.db_manager('secondary').order_by('id'),
Model2A.objects.db_manager("secondary").order_by("id"),
[Model2A, Model2C],
transform=lambda o: o.__class__,
)
def test_instance_of_filter_on_non_default_database(self):
Base.objects.db_manager('secondary').create(field_b='B1')
ModelX.objects.db_manager('secondary').create(field_b='B', field_x='X')
ModelY.objects.db_manager('secondary').create(field_b='Y', field_y='Y')
Base.objects.db_manager("secondary").create(field_b="B1")
ModelX.objects.db_manager("secondary").create(field_b="B", field_x="X")
ModelY.objects.db_manager("secondary").create(field_b="Y", field_y="Y")
objects = Base.objects.db_manager('secondary').filter(instance_of=Base)
objects = Base.objects.db_manager("secondary").filter(instance_of=Base)
self.assertQuerysetEqual(
objects,
[Base, ModelX, ModelY],
@@ -54,19 +54,19 @@ class MultipleDatabasesTests(TestCase):
)
self.assertQuerysetEqual(
Base.objects.db_manager('secondary').filter(instance_of=ModelX),
Base.objects.db_manager("secondary").filter(instance_of=ModelX),
[ModelX],
transform=lambda o: o.__class__,
)
self.assertQuerysetEqual(
Base.objects.db_manager('secondary').filter(instance_of=ModelY),
Base.objects.db_manager("secondary").filter(instance_of=ModelY),
[ModelY],
transform=lambda o: o.__class__,
)
self.assertQuerysetEqual(
Base.objects.db_manager('secondary').filter(
Base.objects.db_manager("secondary").filter(
Q(instance_of=ModelX) | Q(instance_of=ModelY)
),
[ModelX, ModelY],
@@ -76,10 +76,14 @@ class MultipleDatabasesTests(TestCase):
def test_forward_many_to_one_descriptor_on_non_default_database(self):
def func():
blog = BlogA.objects.db_manager('secondary').create(name='Blog', info='Info')
entry = BlogEntry.objects.db_manager('secondary').create(blog=blog, text='Text')
blog = BlogA.objects.db_manager("secondary").create(
name="Blog", info="Info"
)
entry = BlogEntry.objects.db_manager("secondary").create(
blog=blog, text="Text"
)
ContentType.objects.clear_cache()
entry = BlogEntry.objects.db_manager('secondary').get(pk=entry.id)
entry = BlogEntry.objects.db_manager("secondary").get(pk=entry.id)
self.assertEqual(blog, entry.blog)
# Ensure no queries are made using the default database.
@@ -87,21 +91,27 @@ class MultipleDatabasesTests(TestCase):
def test_reverse_many_to_one_descriptor_on_non_default_database(self):
def func():
blog = BlogA.objects.db_manager('secondary').create(name='Blog', info='Info')
entry = BlogEntry.objects.db_manager('secondary').create(blog=blog, text='Text')
blog = BlogA.objects.db_manager("secondary").create(
name="Blog", info="Info"
)
entry = BlogEntry.objects.db_manager("secondary").create(
blog=blog, text="Text"
)
ContentType.objects.clear_cache()
blog = BlogA.objects.db_manager('secondary').get(pk=blog.id)
self.assertEqual(entry, blog.blogentry_set.using('secondary').get())
blog = BlogA.objects.db_manager("secondary").get(pk=blog.id)
self.assertEqual(entry, blog.blogentry_set.using("secondary").get())
# Ensure no queries are made using the default database.
self.assertNumQueries(0, func)
def test_reverse_one_to_one_descriptor_on_non_default_database(self):
def func():
m2a = Model2A.objects.db_manager('secondary').create(field1='A1')
one2one = One2OneRelatingModel.objects.db_manager('secondary').create(one2one=m2a, field1='121')
m2a = Model2A.objects.db_manager("secondary").create(field1="A1")
one2one = One2OneRelatingModel.objects.db_manager("secondary").create(
one2one=m2a, field1="121"
)
ContentType.objects.clear_cache()
m2a = Model2A.objects.db_manager('secondary').get(pk=m2a.id)
m2a = Model2A.objects.db_manager("secondary").get(pk=m2a.id)
self.assertEqual(one2one, m2a.one2onerelatingmodel)
# Ensure no queries are made using the default database.
@@ -109,12 +119,12 @@ class MultipleDatabasesTests(TestCase):
def test_many_to_many_descriptor_on_non_default_database(self):
def func():
m2a = Model2A.objects.db_manager('secondary').create(field1='A1')
rm = RelatingModel.objects.db_manager('secondary').create()
m2a = Model2A.objects.db_manager("secondary").create(field1="A1")
rm = RelatingModel.objects.db_manager("secondary").create()
rm.many2many.add(m2a)
ContentType.objects.clear_cache()
m2a = Model2A.objects.db_manager('secondary').get(pk=m2a.id)
self.assertEqual(rm, m2a.relatingmodel_set.using('secondary').get())
m2a = Model2A.objects.db_manager("secondary").get(pk=m2a.id)
self.assertEqual(rm, m2a.relatingmodel_set.using("secondary").get())
# Ensure no queries are made using the default database.
self.assertNumQueries(0, func)
File diff suppressed because it is too large Load Diff
+10 -4
View File
@@ -1,9 +1,9 @@
from django.test import TestCase
from polymorphic.tests.models import Bottom, Middle, Top
class RegressionTests(TestCase):
def test_for_query_result_incomplete_with_inheritance(self):
""" https://github.com/bconstantin/django_polymorphic/issues/15 """
@@ -15,10 +15,16 @@ class RegressionTests(TestCase):
bottom.save()
expected_queryset = [top, middle, bottom]
self.assertQuerysetEqual(Top.objects.order_by('pk'), [repr(r) for r in expected_queryset])
self.assertQuerysetEqual(
Top.objects.order_by("pk"), [repr(r) for r in expected_queryset]
)
expected_queryset = [middle, bottom]
self.assertQuerysetEqual(Middle.objects.order_by('pk'), [repr(r) for r in expected_queryset])
self.assertQuerysetEqual(
Middle.objects.order_by("pk"), [repr(r) for r in expected_queryset]
)
expected_queryset = [bottom]
self.assertQuerysetEqual(Bottom.objects.order_by('pk'), [repr(r) for r in expected_queryset])
self.assertQuerysetEqual(
Bottom.objects.order_by("pk"), [repr(r) for r in expected_queryset]
)
+21 -15
View File
@@ -1,26 +1,36 @@
from django.test import TransactionTestCase
from polymorphic.models import PolymorphicTypeUndefined, PolymorphicModel
from polymorphic.tests.models import Model2A, Model2B, Model2C, Model2D, Enhance_Inherit, Enhance_Base
from polymorphic.utils import reset_polymorphic_ctype, sort_by_subclass, get_base_polymorphic_model
from polymorphic.models import PolymorphicModel, PolymorphicTypeUndefined
from polymorphic.tests.models import (
Enhance_Base,
Enhance_Inherit,
Model2A,
Model2B,
Model2C,
Model2D,
)
from polymorphic.utils import (
get_base_polymorphic_model,
reset_polymorphic_ctype,
sort_by_subclass,
)
class UtilsTests(TransactionTestCase):
def test_sort_by_subclass(self):
self.assertEqual(
sort_by_subclass(Model2D, Model2B, Model2D, Model2A, Model2C),
[Model2A, Model2B, Model2C, Model2D, Model2D]
[Model2A, Model2B, Model2C, Model2D, Model2D],
)
def test_reset_polymorphic_ctype(self):
"""
Test the the polymorphic_ctype_id can be restored.
"""
Model2A.objects.create(field1='A1')
Model2D.objects.create(field1='A1', field2='B2', field3='C3', field4='D4')
Model2B.objects.create(field1='A1', field2='B2')
Model2B.objects.create(field1='A1', field2='B2')
Model2A.objects.create(field1="A1")
Model2D.objects.create(field1="A1", field2="B2", field3="C3", field4="D4")
Model2B.objects.create(field1="A1", field2="B2")
Model2B.objects.create(field1="A1", field2="B2")
Model2A.objects.all().update(polymorphic_ctype_id=None)
with self.assertRaises(PolymorphicTypeUndefined):
@@ -30,12 +40,7 @@ class UtilsTests(TransactionTestCase):
self.assertQuerysetEqual(
Model2A.objects.order_by("pk"),
[
Model2A,
Model2D,
Model2B,
Model2B,
],
[Model2A, Model2D, Model2B, Model2B],
transform=lambda o: o.__class__,
)
@@ -59,6 +64,7 @@ class UtilsTests(TransactionTestCase):
"""
Skipping abstract models that can't be used for querying.
"""
class A(PolymorphicModel):
class Meta:
abstract = True