Reformat all files with isort and black
This commit is contained in:
@@ -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
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
+492
-362
File diff suppressed because it is too large
Load Diff
@@ -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]
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user