Fix PEP8 whitespace issues

autopep8 -r polymorphic/ example/ -i
--select=E112,E113,E115,E116,E122,E123,E125,E127,E128,E201,E202,E203,E211,E225,E226,E227,E228,E231,E251,E261,E262,E271,E272,E273,E274,E301,E302,E303,E304,E309,E711,E713,W291,W293,W391
--exclude migrations,south_migrations

(line conditiation fixes: E123,E125,E122,E127,E128)
fix_request_path_info
Diederik van der Boor 2015-12-28 14:53:32 +01:00
parent f656ec438e
commit aaf06c71a5
17 changed files with 304 additions and 180 deletions

View File

@ -14,6 +14,7 @@ class ProjectChildAdmin(PolymorphicChildModelAdmin):
}), }),
) )
class ProjectAdmin(PolymorphicParentModelAdmin): class ProjectAdmin(PolymorphicParentModelAdmin):
base_model = Project base_model = Project
list_filter = (PolymorphicChildModelFilter,) list_filter = (PolymorphicChildModelFilter,)
@ -26,10 +27,10 @@ class ProjectAdmin(PolymorphicParentModelAdmin):
admin.site.register(Project, ProjectAdmin) admin.site.register(Project, ProjectAdmin)
class ModelAChildAdmin(PolymorphicChildModelAdmin): class ModelAChildAdmin(PolymorphicChildModelAdmin):
base_model = ModelA base_model = ModelA
class ModelAAdmin(PolymorphicParentModelAdmin): class ModelAAdmin(PolymorphicParentModelAdmin):
base_model = ModelA base_model = ModelA
list_filter = (PolymorphicChildModelFilter,) list_filter = (PolymorphicChildModelFilter,)
@ -45,6 +46,7 @@ admin.site.register(ModelA, ModelAAdmin)
class Model2AChildAdmin(PolymorphicChildModelAdmin): class Model2AChildAdmin(PolymorphicChildModelAdmin):
base_model = Model2A base_model = Model2A
class Model2AAdmin(PolymorphicParentModelAdmin): class Model2AAdmin(PolymorphicParentModelAdmin):
base_model = Model2A base_model = Model2A
list_filter = (PolymorphicChildModelFilter,) list_filter = (PolymorphicChildModelFilter,)
@ -60,6 +62,7 @@ admin.site.register(Model2A, Model2AAdmin)
class UUIDModelAChildAdmin(PolymorphicChildModelAdmin): class UUIDModelAChildAdmin(PolymorphicChildModelAdmin):
base_model = UUIDModelA base_model = UUIDModelA
class UUIDModelAAdmin(PolymorphicParentModelAdmin): class UUIDModelAAdmin(PolymorphicParentModelAdmin):
base_model = UUIDModelA base_model = UUIDModelA
list_filter = (PolymorphicChildModelFilter,) list_filter = (PolymorphicChildModelFilter,)
@ -75,6 +78,7 @@ admin.site.register(UUIDModelA, UUIDModelAAdmin)
class ProxyChildAdmin(PolymorphicChildModelAdmin): class ProxyChildAdmin(PolymorphicChildModelAdmin):
base_model = ProxyBase base_model = ProxyBase
class ProxyAdmin(PolymorphicParentModelAdmin): class ProxyAdmin(PolymorphicParentModelAdmin):
base_model = ProxyBase base_model = ProxyBase
list_filter = (PolymorphicChildModelFilter,) list_filter = (PolymorphicChildModelFilter,)

View File

@ -12,12 +12,15 @@ import time,sys
from pexp.models import * from pexp.models import *
def reset_queries(): def reset_queries():
connection.queries = [] connection.queries = []
def show_queries(): def show_queries():
print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = [] print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = []
def print_timing(func, message='', iterations=1): def print_timing(func, message='', iterations=1):
def wrapper(*arg): def wrapper(*arg):
results = [] results = []
@ -39,6 +42,7 @@ def print_timing(func, message='', iterations=1):
sys.stdout.flush() sys.stdout.flush()
return wrapper return wrapper
class Command(NoArgsCommand): class Command(NoArgsCommand):
help = "" help = ""
@ -79,6 +83,7 @@ from django.db import connection, transaction
from random import Random from random import Random
rnd = Random() rnd = Random()
def poly_sql_query(): def poly_sql_query():
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute(""" cursor.execute("""
@ -94,6 +99,7 @@ def poly_sql_query():
#row=cursor.fetchone() #row=cursor.fetchone()
return return
def poly_sql_query2(): def poly_sql_query2():
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute(""" cursor.execute("""

View File

@ -9,12 +9,15 @@ from pprint import pprint
from pexp.models import * from pexp.models import *
def reset_queries(): def reset_queries():
connection.queries = [] connection.queries = []
def show_queries(): def show_queries():
print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = [] print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = []
class Command(NoArgsCommand): class Command(NoArgsCommand):
help = "" help = ""
@ -32,4 +35,3 @@ class Command(NoArgsCommand):
c = ModelC.objects.create(field1='C1', field2='C2', field3='C3') c = ModelC.objects.create(field1='C1', field2='C2', field3='C3')
print ModelA.objects.all() print ModelA.objects.all()
print print

View File

@ -11,9 +11,11 @@ from pexp.models import *
num_objects = 1000 num_objects = 1000
def reset_queries(): def reset_queries():
connection.queries = [] connection.queries = []
def show_queries(): def show_queries():
print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; reset_queries() print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; reset_queries()
@ -22,6 +24,7 @@ import time
################################################################################### ###################################################################################
### benchmark wrappers ### benchmark wrappers
def print_timing(func, message='', iterations=1): def print_timing(func, message='', iterations=1):
def wrapper(*arg): def wrapper(*arg):
results = [] results = []
@ -42,6 +45,7 @@ def print_timing(func, message='', iterations=1):
sys.stdout.flush() sys.stdout.flush()
return wrapper return wrapper
def run_vanilla_any_poly(func, iterations=1): def run_vanilla_any_poly(func, iterations=1):
f = print_timing(func, ' ', iterations) f = print_timing(func, ' ', iterations)
f(nModelC) f(nModelC)
@ -57,21 +61,25 @@ def bench_create(model):
model.objects.create(field1='abc' + str(i), field2='abcd' + str(i), field3='abcde' + str(i)) model.objects.create(field1='abc' + str(i), field2='abcd' + str(i), field3='abcde' + str(i))
#print 'count:',model.objects.count() #print 'count:',model.objects.count()
def bench_load1(model): def bench_load1(model):
for o in model.objects.all(): for o in model.objects.all():
pass pass
def bench_load1_short(model): def bench_load1_short(model):
for i in xrange(num_objects / 100): for i in xrange(num_objects / 100):
for o in model.objects.all()[:100]: for o in model.objects.all()[:100]:
pass pass
def bench_load2(model): def bench_load2(model):
for o in model.objects.all(): for o in model.objects.all():
f1 = o.field1 f1 = o.field1
f2 = o.field2 f2 = o.field2
f3 = o.field3 f3 = o.field3
def bench_load2_short(model): def bench_load2_short(model):
for i in xrange(num_objects / 100): for i in xrange(num_objects / 100):
for o in model.objects.all()[:100]: for o in model.objects.all()[:100]:
@ -79,12 +87,14 @@ def bench_load2_short(model):
f2 = o.field2 f2 = o.field2
f3 = o.field3 f3 = o.field3
def bench_delete(model): def bench_delete(model):
model.objects.all().delete() model.objects.all().delete()
################################################################################### ###################################################################################
### Command ### Command
class Command(NoArgsCommand): class Command(NoArgsCommand):
help = "" help = ""

View File

@ -9,12 +9,15 @@ from pprint import pprint
from pexp.models import * from pexp.models import *
def reset_queries(): def reset_queries():
connection.queries = [] connection.queries = []
def show_queries(): def show_queries():
print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = [] print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = []
class Command(NoArgsCommand): class Command(NoArgsCommand):
help = "" help = ""
@ -25,6 +28,3 @@ class Command(NoArgsCommand):
o = ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter") o = ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")
print Project.objects.all() print Project.objects.all()
print print

View File

@ -6,32 +6,52 @@ from django.db import models
from polymorphic.models import PolymorphicModel from polymorphic.models import PolymorphicModel
from polymorphic.showfields import ShowFieldContent, ShowFieldType, ShowFieldTypeAndContent from polymorphic.showfields import ShowFieldContent, ShowFieldType, ShowFieldTypeAndContent
class Project(ShowFieldContent, PolymorphicModel): class Project(ShowFieldContent, PolymorphicModel):
topic = models.CharField(max_length=30) topic = models.CharField(max_length=30)
class ArtProject(Project): class ArtProject(Project):
artist = models.CharField(max_length=30) artist = models.CharField(max_length=30)
class ResearchProject(Project): class ResearchProject(Project):
supervisor = models.CharField(max_length=30) supervisor = models.CharField(max_length=30)
class ModelA(ShowFieldTypeAndContent, PolymorphicModel): class ModelA(ShowFieldTypeAndContent, PolymorphicModel):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class ModelB(ModelA): class ModelB(ModelA):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class ModelC(ModelB): class ModelC(ModelB):
field3 = models.CharField(max_length=10) field3 = models.CharField(max_length=10)
field4 = models.ManyToManyField(ModelB, related_name='related_c') field4 = models.ManyToManyField(ModelB, related_name='related_c')
class nModelA(models.Model): class nModelA(models.Model):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class nModelB(nModelA): class nModelB(nModelA):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class nModelC(nModelB): class nModelC(nModelB):
field3 = models.CharField(max_length=10) field3 = models.CharField(max_length=10)
class Model2A(PolymorphicModel): class Model2A(PolymorphicModel):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class Model2B(Model2A): class Model2B(Model2A):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class Model2C(Model2B): class Model2C(Model2B):
field3 = models.CharField(max_length=10) field3 = models.CharField(max_length=10)
@ -40,14 +60,20 @@ if django.VERSION < (1,8):
else: else:
from django.db.models import UUIDField from django.db.models import UUIDField
class UUIDModelA(ShowFieldTypeAndContent, PolymorphicModel): class UUIDModelA(ShowFieldTypeAndContent, PolymorphicModel):
uuid_primary_key = UUIDField(primary_key=True) uuid_primary_key = UUIDField(primary_key=True)
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class UUIDModelB(UUIDModelA): class UUIDModelB(UUIDModelA):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class UUIDModelC(UUIDModelB): class UUIDModelC(UUIDModelB):
field3 = models.CharField(max_length=10) field3 = models.CharField(max_length=10)
class ProxyBase(PolymorphicModel): class ProxyBase(PolymorphicModel):
title = models.CharField(max_length=200) title = models.CharField(max_length=200)
@ -57,14 +83,18 @@ class ProxyBase(PolymorphicModel):
class Meta: class Meta:
ordering = ('title',) ordering = ('title',)
class ProxyA(ProxyBase): class ProxyA(ProxyBase):
class Meta: class Meta:
proxy = True proxy = True
def __unicode__(self): def __unicode__(self):
return u"<ProxyA: {0}>".format(self.title) return u"<ProxyA: {0}>".format(self.title)
class ProxyB(ProxyBase): class ProxyB(ProxyBase):
class Meta: class Meta:
proxy = True proxy = True

View File

@ -39,4 +39,3 @@ if django.VERSION[:2] < (1, 5):
ContentTypeManager.get_for_model__original = ContentTypeManager.get_for_model ContentTypeManager.get_for_model__original = ContentTypeManager.get_for_model
ContentTypeManager.get_for_model = get_for_model ContentTypeManager.get_for_model = get_for_model

View File

@ -42,6 +42,7 @@ class RegistrationClosed(RuntimeError):
"The admin model can't be registered anymore at this point." "The admin model can't be registered anymore at this point."
pass pass
class ChildAdminNotRegistered(RuntimeError): class ChildAdminNotRegistered(RuntimeError):
"The admin site for the model is not registered." "The admin site for the model is not registered."
pass pass
@ -122,13 +123,11 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
#: If your primary key consists of string values, update this regular expression. #: If your primary key consists of string values, update this regular expression.
pk_regex = '(\d+|__fk__)' pk_regex = '(\d+|__fk__)'
def __init__(self, model, admin_site, *args, **kwargs): def __init__(self, model, admin_site, *args, **kwargs):
super(PolymorphicParentModelAdmin, self).__init__(model, admin_site, *args, **kwargs) super(PolymorphicParentModelAdmin, self).__init__(model, admin_site, *args, **kwargs)
self._child_admin_site = self.admin_site.__class__(name=self.admin_site.name) self._child_admin_site = self.admin_site.__class__(name=self.admin_site.name)
self._is_setup = False self._is_setup = False
def _lazy_setup(self): def _lazy_setup(self):
if self._is_setup: if self._is_setup:
return return
@ -150,7 +149,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
self._child_admin_site._registry = complete_registry self._child_admin_site._registry = complete_registry
self._is_setup = True self._is_setup = True
def register_child(self, model, model_admin): def register_child(self, model, model_admin):
""" """
Register a model with admin to display. Register a model with admin to display.
@ -167,7 +165,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
self._child_admin_site.register(model, model_admin) self._child_admin_site.register(model, model_admin)
def get_child_models(self): def get_child_models(self):
""" """
Return the derived model classes which this admin should handle. Return the derived model classes which this admin should handle.
@ -181,7 +178,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
return self.child_models return self.child_models
def get_child_type_choices(self, request, action): def get_child_type_choices(self, request, action):
""" """
Return a list of polymorphic types for which the user has the permission to perform the given action. Return a list of polymorphic types for which the user has the permission to perform the given action.
@ -197,7 +193,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
choices.append((ct.id, model._meta.verbose_name)) choices.append((ct.id, model._meta.verbose_name))
return choices return choices
def _get_real_admin(self, object_id): def _get_real_admin(self, object_id):
try: try:
obj = self.model.objects.non_polymorphic() \ obj = self.model.objects.non_polymorphic() \
@ -206,7 +201,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
raise Http404 raise Http404
return self._get_real_admin_by_ct(obj['polymorphic_ctype']) return self._get_real_admin_by_ct(obj['polymorphic_ctype'])
def _get_real_admin_by_ct(self, ct_id): def _get_real_admin_by_ct(self, ct_id):
try: try:
ct = ContentType.objects.get_for_id(ct_id) ct = ContentType.objects.get_for_id(ct_id)
@ -219,7 +213,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
return self._get_real_admin_by_model(model_class) return self._get_real_admin_by_model(model_class)
def _get_real_admin_by_model(self, model_class): def _get_real_admin_by_model(self, model_class):
# In case of a ?ct_id=### parameter, the view is already checked for permissions. # In case of a ?ct_id=### parameter, the view is already checked for permissions.
# Hence, make sure this is a derived object, or risk exposing other admin interfaces. # Hence, make sure this is a derived object, or risk exposing other admin interfaces.
@ -233,7 +226,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
except KeyError: except KeyError:
raise ChildAdminNotRegistered("No child admin site was registered for a '{0}' model.".format(model_class)) raise ChildAdminNotRegistered("No child admin site was registered for a '{0}' model.".format(model_class))
def get_queryset(self, request): def get_queryset(self, request):
# optimize the list display. # optimize the list display.
qs = super(PolymorphicParentModelAdmin, self).get_queryset(request) qs = super(PolymorphicParentModelAdmin, self).get_queryset(request)
@ -241,7 +233,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
qs = qs.non_polymorphic() qs = qs.non_polymorphic()
return qs return qs
# For Django 1.5: # For Django 1.5:
def queryset(self, request): def queryset(self, request):
qs = super(PolymorphicParentModelAdmin, self).queryset(request) qs = super(PolymorphicParentModelAdmin, self).queryset(request)
@ -249,7 +240,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
qs = qs.non_polymorphic() qs = qs.non_polymorphic()
return qs return qs
def add_view(self, request, form_url='', extra_context=None): def add_view(self, request, form_url='', extra_context=None):
"""Redirect the add view to the real admin.""" """Redirect the add view to the real admin."""
ct_id = int(request.GET.get('ct_id', 0)) ct_id = int(request.GET.get('ct_id', 0))
@ -266,13 +256,11 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
) )
return real_admin.add_view(request, form_url, extra_context) return real_admin.add_view(request, form_url, extra_context)
def change_view(self, request, object_id, *args, **kwargs): def change_view(self, request, object_id, *args, **kwargs):
"""Redirect the change view to the real admin.""" """Redirect the change view to the real admin."""
real_admin = self._get_real_admin(object_id) real_admin = self._get_real_admin(object_id)
return real_admin.change_view(request, object_id, *args, **kwargs) return real_admin.change_view(request, object_id, *args, **kwargs)
def delete_view(self, request, object_id, extra_context=None): def delete_view(self, request, object_id, extra_context=None):
"""Redirect the delete view to the real admin.""" """Redirect the delete view to the real admin."""
real_admin = self._get_real_admin(object_id) real_admin = self._get_real_admin(object_id)
@ -331,7 +319,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
return urls + custom_urls + dummy_urls return urls + custom_urls + dummy_urls
def subclass_view(self, request, path): def subclass_view(self, request, path):
""" """
Forward any request to a custom view of the real admin. Forward any request to a custom view of the real admin.
@ -350,7 +337,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
ct_id = self.model.objects.values_list('polymorphic_ctype_id', flat=True).get(pk=object_id) ct_id = self.model.objects.values_list('polymorphic_ctype_id', flat=True).get(pk=object_id)
real_admin = self._get_real_admin_by_ct(ct_id) real_admin = self._get_real_admin_by_ct(ct_id)
resolver = RegexURLResolver('^', real_admin.urls) resolver = RegexURLResolver('^', real_admin.urls)
resolvermatch = resolver.resolve(path) # May raise Resolver404 resolvermatch = resolver.resolve(path) # May raise Resolver404
@ -359,7 +345,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
return resolvermatch.func(request, *resolvermatch.args, **resolvermatch.kwargs) return resolvermatch.func(request, *resolvermatch.args, **resolvermatch.kwargs)
def add_type_view(self, request, form_url=''): def add_type_view(self, request, form_url=''):
""" """
Display a choice form to select which page type to add. Display a choice form to select which page type to add.
@ -402,7 +387,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
} }
return self.render_add_type_form(request, context, form_url) return self.render_add_type_form(request, context, form_url)
def render_add_type_form(self, request, context, form_url=''): def render_add_type_form(self, request, context, form_url=''):
""" """
Render the page type choice form. Render the page type choice form.
@ -426,7 +410,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
"admin/add_type_form.html" "admin/add_type_form.html"
], context, context_instance=context_instance) ], context, context_instance=context_instance)
@property @property
def change_list_template(self): def change_list_template(self):
opts = self.model._meta opts = self.model._meta
@ -446,7 +429,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
] ]
class PolymorphicChildModelAdmin(admin.ModelAdmin): class PolymorphicChildModelAdmin(admin.ModelAdmin):
""" """
The *optional* base class for the admin interface of derived models. The *optional* base class for the admin interface of derived models.
@ -465,7 +447,6 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
base_fieldsets = None base_fieldsets = None
extra_fieldset_title = _("Contents") # Default title for extra fieldset extra_fieldset_title = _("Contents") # Default title for extra fieldset
def get_form(self, request, obj=None, **kwargs): def get_form(self, request, obj=None, **kwargs):
# The django admin validation requires the form to have a 'class Meta: model = ..' # The django admin validation requires the form to have a 'class Meta: model = ..'
# attribute, or it will complain that the fields are missing. # attribute, or it will complain that the fields are missing.
@ -482,7 +463,6 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
return super(PolymorphicChildModelAdmin, self).get_form(request, obj, **kwargs) return super(PolymorphicChildModelAdmin, self).get_form(request, obj, **kwargs)
@property @property
def change_form_template(self): def change_form_template(self):
opts = self.model._meta opts = self.model._meta
@ -502,7 +482,6 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
"admin/change_form.html" "admin/change_form.html"
] ]
@property @property
def delete_confirmation_template(self): def delete_confirmation_template(self):
opts = self.model._meta opts = self.model._meta
@ -522,21 +501,18 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
"admin/delete_confirmation.html" "admin/delete_confirmation.html"
] ]
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
context.update({ context.update({
'base_opts': self.base_model._meta, 'base_opts': self.base_model._meta,
}) })
return super(PolymorphicChildModelAdmin, self).render_change_form(request, context, add=add, change=change, form_url=form_url, obj=obj) return super(PolymorphicChildModelAdmin, self).render_change_form(request, context, add=add, change=change, form_url=form_url, obj=obj)
def delete_view(self, request, object_id, context=None): def delete_view(self, request, object_id, context=None):
extra_context = { extra_context = {
'base_opts': self.base_model._meta, 'base_opts': self.base_model._meta,
} }
return super(PolymorphicChildModelAdmin, self).delete_view(request, object_id, extra_context) return super(PolymorphicChildModelAdmin, self).delete_view(request, object_id, extra_context)
# ---- Extra: improving the form/fieldset default display ---- # ---- Extra: improving the form/fieldset default display ----
def get_fieldsets(self, request, obj=None): def get_fieldsets(self, request, obj=None):
@ -557,7 +533,6 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
else: else:
return self.base_fieldsets return self.base_fieldsets
def get_subclass_fields(self, request, obj=None): def get_subclass_fields(self, request, obj=None):
# Find out how many fields would really be on the form, # Find out how many fields would really be on the form,
# if it weren't restricted by declared fields. # if it weren't restricted by declared fields.

View File

@ -26,6 +26,7 @@ from .query_translate import translate_polymorphic_Q_object
################################################################################### ###################################################################################
### PolymorphicModel ### PolymorphicModel
class PolymorphicModel(six.with_metaclass(PolymorphicModelBase, models.Model)): class PolymorphicModel(six.with_metaclass(PolymorphicModelBase, models.Model)):
""" """
Abstract base class that provides polymorphic behaviour Abstract base class that provides polymorphic behaviour

View File

@ -338,6 +338,7 @@ class PolymorphicQuerySet(QuerySet):
return super(PolymorphicQuerySet, self).__repr__(*args, **kwargs) return super(PolymorphicQuerySet, self).__repr__(*args, **kwargs)
class _p_list_class(list): class _p_list_class(list):
def __repr__(self, *args, **kwargs): def __repr__(self, *args, **kwargs):
result = [repr(o) for o in self] result = [repr(o) for o in self]
return '[ ' + ',\n '.join(result) + ' ]' return '[ ' + ',\n '.join(result) + ' ]'

View File

@ -3,6 +3,7 @@
from django.db import models from django.db import models
from django.utils import six from django.utils import six
class ShowFieldBase(object): class ShowFieldBase(object):
""" base class for the ShowField... model mixins, does the work """ """ base class for the ShowField... model mixins, does the work """

View File

@ -5,6 +5,7 @@ register = Library()
class BreadcrumbScope(Node): class BreadcrumbScope(Node):
def __init__(self, base_opts, nodelist): def __init__(self, base_opts, nodelist):
self.base_opts = base_opts self.base_opts = base_opts
self.nodelist = nodelist # Note, takes advantage of Node.child_nodelists self.nodelist = nodelist # Note, takes advantage of Node.child_nodelists
@ -25,7 +26,6 @@ class BreadcrumbScope(Node):
else: else:
raise TemplateSyntaxError("{0} tag expects 1 argument".format(token.contents[0])) raise TemplateSyntaxError("{0} tag expects 1 argument".format(token.contents[0]))
def render(self, context): def render(self, context):
# app_label is really hard to overwrite in the standard Django ModelAdmin. # app_label is really hard to overwrite in the standard Django ModelAdmin.
# To insert it in the template, the entire render_change_form() and delete_view() have to copied and adjusted. # To insert it in the template, the entire render_change_form() and delete_view() have to copied and adjusted.

View File

@ -32,85 +32,133 @@ except ImportError:
class PlainA(models.Model): class PlainA(models.Model):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class PlainB(PlainA): class PlainB(PlainA):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class PlainC(PlainB): class PlainC(PlainB):
field3 = models.CharField(max_length=10) field3 = models.CharField(max_length=10)
class Model2A(ShowFieldType, PolymorphicModel): class Model2A(ShowFieldType, PolymorphicModel):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class Model2B(Model2A): class Model2B(Model2A):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class Model2C(Model2B): class Model2C(Model2B):
field3 = models.CharField(max_length=10) field3 = models.CharField(max_length=10)
class Model2D(Model2C): class Model2D(Model2C):
field4 = models.CharField(max_length=10) field4 = models.CharField(max_length=10)
class ModelExtraA(ShowFieldTypeAndContent, PolymorphicModel): class ModelExtraA(ShowFieldTypeAndContent, PolymorphicModel):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class ModelExtraB(ModelExtraA): class ModelExtraB(ModelExtraA):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class ModelExtraC(ModelExtraB): class ModelExtraC(ModelExtraB):
field3 = models.CharField(max_length=10) field3 = models.CharField(max_length=10)
class ModelExtraExternal(models.Model): class ModelExtraExternal(models.Model):
topic = models.CharField(max_length=10) topic = models.CharField(max_length=10)
class ModelShow1(ShowFieldType, PolymorphicModel): class ModelShow1(ShowFieldType, PolymorphicModel):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
m2m = models.ManyToManyField('self') m2m = models.ManyToManyField('self')
class ModelShow2(ShowFieldContent, PolymorphicModel): class ModelShow2(ShowFieldContent, PolymorphicModel):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
m2m = models.ManyToManyField('self') m2m = models.ManyToManyField('self')
class ModelShow3(ShowFieldTypeAndContent, PolymorphicModel): class ModelShow3(ShowFieldTypeAndContent, PolymorphicModel):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
m2m = models.ManyToManyField('self') m2m = models.ManyToManyField('self')
class ModelShow1_plain(PolymorphicModel): class ModelShow1_plain(PolymorphicModel):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class ModelShow2_plain(ModelShow1_plain): class ModelShow2_plain(ModelShow1_plain):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class Base(ShowFieldType, PolymorphicModel): class Base(ShowFieldType, PolymorphicModel):
field_b = models.CharField(max_length=10) field_b = models.CharField(max_length=10)
class ModelX(Base): class ModelX(Base):
field_x = models.CharField(max_length=10) field_x = models.CharField(max_length=10)
class ModelY(Base): class ModelY(Base):
field_y = models.CharField(max_length=10) field_y = models.CharField(max_length=10)
class Enhance_Plain(models.Model): class Enhance_Plain(models.Model):
field_p = models.CharField(max_length=10) field_p = models.CharField(max_length=10)
class Enhance_Base(ShowFieldTypeAndContent, PolymorphicModel): class Enhance_Base(ShowFieldTypeAndContent, PolymorphicModel):
base_id = models.AutoField(primary_key=True) base_id = models.AutoField(primary_key=True)
field_b = models.CharField(max_length=10) field_b = models.CharField(max_length=10)
class Enhance_Inherit(Enhance_Base, Enhance_Plain): class Enhance_Inherit(Enhance_Base, Enhance_Plain):
field_i = models.CharField(max_length=10) field_i = models.CharField(max_length=10)
class RelationBase(ShowFieldTypeAndContent, PolymorphicModel): class RelationBase(ShowFieldTypeAndContent, PolymorphicModel):
field_base = models.CharField(max_length=10) field_base = models.CharField(max_length=10)
fk = models.ForeignKey('self', null=True, related_name='relationbase_set') fk = models.ForeignKey('self', null=True, related_name='relationbase_set')
m2m = models.ManyToManyField('self') m2m = models.ManyToManyField('self')
class RelationA(RelationBase): class RelationA(RelationBase):
field_a = models.CharField(max_length=10) field_a = models.CharField(max_length=10)
class RelationB(RelationBase): class RelationB(RelationBase):
field_b = models.CharField(max_length=10) field_b = models.CharField(max_length=10)
class RelationBC(RelationB): class RelationBC(RelationB):
field_c = models.CharField(max_length=10) field_c = models.CharField(max_length=10)
class RelatingModel(models.Model): class RelatingModel(models.Model):
many2many = models.ManyToManyField(Model2A) many2many = models.ManyToManyField(Model2A)
class One2OneRelatingModel(PolymorphicModel): class One2OneRelatingModel(PolymorphicModel):
one2one = models.OneToOneField(Model2A) one2one = models.OneToOneField(Model2A)
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class One2OneRelatingModelDerived(One2OneRelatingModel): class One2OneRelatingModelDerived(One2OneRelatingModel):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class MyManagerQuerySet(PolymorphicQuerySet): class MyManagerQuerySet(PolymorphicQuerySet):
def my_queryset_foo(self): 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): class MyManager(PolymorphicManager):
queryset_class = MyManagerQuerySet queryset_class = MyManagerQuerySet
@ -120,6 +168,7 @@ class MyManager(PolymorphicManager):
# Django <= 1.5 compatibility # Django <= 1.5 compatibility
get_query_set = get_queryset get_query_set = get_queryset
class ModelWithMyManager(ShowFieldTypeAndContent, Model2A): class ModelWithMyManager(ShowFieldTypeAndContent, Model2A):
objects = MyManager() objects = MyManager()
field4 = models.CharField(max_length=10) field4 = models.CharField(max_length=10)
@ -129,18 +178,28 @@ if django.VERSION >= (1,7):
objects = MyManagerQuerySet.as_manager() objects = MyManagerQuerySet.as_manager()
field4 = models.CharField(max_length=10) field4 = models.CharField(max_length=10)
class MROBase1(ShowFieldType, PolymorphicModel): class MROBase1(ShowFieldType, PolymorphicModel):
objects = MyManager() objects = MyManager()
field1 = models.CharField(max_length=10) # needed as MyManager uses it field1 = models.CharField(max_length=10) # needed as MyManager uses it
class MROBase2(MROBase1): class MROBase2(MROBase1):
pass # Django vanilla inheritance does not inherit MyManager as _default_manager here pass # Django vanilla inheritance does not inherit MyManager as _default_manager here
class MROBase3(models.Model): class MROBase3(models.Model):
objects = PolymorphicManager() objects = PolymorphicManager()
class MRODerived(MROBase2, MROBase3): class MRODerived(MROBase2, MROBase3):
pass pass
class ParentModelWithManager(PolymorphicModel): class ParentModelWithManager(PolymorphicModel):
pass pass
class ChildModelWithManager(PolymorphicModel): class ChildModelWithManager(PolymorphicModel):
# Also test whether foreign keys receive the manager: # Also test whether foreign keys receive the manager:
fk = models.ForeignKey(ParentModelWithManager, related_name='childmodel_set') fk = models.ForeignKey(ParentModelWithManager, related_name='childmodel_set')
@ -148,10 +207,13 @@ class ChildModelWithManager(PolymorphicModel):
class PlainMyManagerQuerySet(QuerySet): class PlainMyManagerQuerySet(QuerySet):
def my_queryset_foo(self): 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 PlainMyManager(models.Manager): class PlainMyManager(models.Manager):
def my_queryset_foo(self): def my_queryset_foo(self):
return self.get_queryset().my_queryset_foo() return self.get_queryset().my_queryset_foo()
@ -161,9 +223,11 @@ class PlainMyManager(models.Manager):
# Django <= 1.5 compatibility # Django <= 1.5 compatibility
get_query_set = get_queryset get_query_set = get_queryset
class PlainParentModelWithManager(models.Model): class PlainParentModelWithManager(models.Model):
pass pass
class PlainChildModelWithManager(models.Model): class PlainChildModelWithManager(models.Model):
fk = models.ForeignKey(PlainParentModelWithManager, related_name='childmodel_set') fk = models.ForeignKey(PlainParentModelWithManager, related_name='childmodel_set')
objects = PlainMyManager() objects = PlainMyManager()
@ -173,82 +237,132 @@ class MgrInheritA(models.Model):
mgrA = models.Manager() mgrA = models.Manager()
mgrA2 = models.Manager() mgrA2 = models.Manager()
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class MgrInheritB(MgrInheritA): class MgrInheritB(MgrInheritA):
mgrB = models.Manager() mgrB = models.Manager()
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class MgrInheritC(ShowFieldTypeAndContent, MgrInheritB): class MgrInheritC(ShowFieldTypeAndContent, MgrInheritB):
pass pass
class BlogBase(ShowFieldTypeAndContent, PolymorphicModel): class BlogBase(ShowFieldTypeAndContent, PolymorphicModel):
name = models.CharField(max_length=10) name = models.CharField(max_length=10)
class BlogA(BlogBase): class BlogA(BlogBase):
info = models.CharField(max_length=10) info = models.CharField(max_length=10)
class BlogB(BlogBase): class BlogB(BlogBase):
pass pass
class BlogEntry(ShowFieldTypeAndContent, PolymorphicModel): class BlogEntry(ShowFieldTypeAndContent, PolymorphicModel):
blog = models.ForeignKey(BlogA) blog = models.ForeignKey(BlogA)
text = models.CharField(max_length=10) text = models.CharField(max_length=10)
class BlogEntry_limit_choices_to(ShowFieldTypeAndContent, PolymorphicModel): class BlogEntry_limit_choices_to(ShowFieldTypeAndContent, PolymorphicModel):
blog = models.ForeignKey(BlogBase) blog = models.ForeignKey(BlogBase)
text = models.CharField(max_length=10) text = models.CharField(max_length=10)
class ModelFieldNameTest(ShowFieldType, PolymorphicModel): class ModelFieldNameTest(ShowFieldType, PolymorphicModel):
modelfieldnametest = models.CharField(max_length=10) modelfieldnametest = models.CharField(max_length=10)
class InitTestModel(ShowFieldType, PolymorphicModel): class InitTestModel(ShowFieldType, PolymorphicModel):
bar = models.CharField(max_length=100) bar = models.CharField(max_length=100)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
kwargs['bar'] = self.x() kwargs['bar'] = self.x()
super(InitTestModel, self).__init__(*args, **kwargs) super(InitTestModel, self).__init__(*args, **kwargs)
class InitTestModelSubclass(InitTestModel): class InitTestModelSubclass(InitTestModel):
def x(self): def x(self):
return 'XYZ' return 'XYZ'
# models from github issue # models from github issue
class Top(PolymorphicModel): class Top(PolymorphicModel):
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
class Meta: class Meta:
ordering = ('pk',) ordering = ('pk',)
class Middle(Top): class Middle(Top):
description = models.TextField() description = models.TextField()
class Bottom(Middle): class Bottom(Middle):
author = models.CharField(max_length=50) author = models.CharField(max_length=50)
class UUIDProject(ShowFieldTypeAndContent, PolymorphicModel): class UUIDProject(ShowFieldTypeAndContent, PolymorphicModel):
uuid_primary_key = UUIDField(primary_key=True, default=uuid.uuid1) uuid_primary_key = UUIDField(primary_key=True, default=uuid.uuid1)
topic = models.CharField(max_length=30) topic = models.CharField(max_length=30)
class UUIDArtProject(UUIDProject): class UUIDArtProject(UUIDProject):
artist = models.CharField(max_length=30) artist = models.CharField(max_length=30)
class UUIDResearchProject(UUIDProject): class UUIDResearchProject(UUIDProject):
supervisor = models.CharField(max_length=30) supervisor = models.CharField(max_length=30)
class UUIDPlainA(models.Model): class UUIDPlainA(models.Model):
uuid_primary_key = UUIDField(primary_key=True, default=uuid.uuid1) uuid_primary_key = UUIDField(primary_key=True, default=uuid.uuid1)
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class UUIDPlainB(UUIDPlainA): class UUIDPlainB(UUIDPlainA):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
class UUIDPlainC(UUIDPlainB): class UUIDPlainC(UUIDPlainB):
field3 = models.CharField(max_length=10) field3 = models.CharField(max_length=10)
# base -> proxy # base -> proxy
class ProxyBase(PolymorphicModel): class ProxyBase(PolymorphicModel):
some_data = models.CharField(max_length=128) some_data = models.CharField(max_length=128)
class ProxyChild(ProxyBase): class ProxyChild(ProxyBase):
class Meta: class Meta:
proxy = True proxy = True
class NonProxyChild(ProxyBase): class NonProxyChild(ProxyBase):
name = models.CharField(max_length=10) name = models.CharField(max_length=10)
# base -> proxy -> real models # base -> proxy -> real models
class ProxiedBase(ShowFieldTypeAndContent, PolymorphicModel): class ProxiedBase(ShowFieldTypeAndContent, PolymorphicModel):
name = models.CharField(max_length=10) name = models.CharField(max_length=10)
class ProxyModelBase(ProxiedBase): class ProxyModelBase(ProxiedBase):
class Meta: class Meta:
proxy = True proxy = True
class ProxyModelA(ProxyModelBase): class ProxyModelA(ProxyModelBase):
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
class ProxyModelB(ProxyModelBase): class ProxyModelB(ProxyModelBase):
field2 = models.CharField(max_length=10) field2 = models.CharField(max_length=10)
@ -264,11 +378,16 @@ class RelatedNameClash(ShowFieldType, PolymorphicModel):
ctype = models.ForeignKey(ContentType, null=True, editable=False) ctype = models.ForeignKey(ContentType, null=True, editable=False)
#class with a parent_link to superclass, and a related_name back to subclass #class with a parent_link to superclass, and a related_name back to subclass
class TestParentLinkAndRelatedName(ModelShow1_plain): class TestParentLinkAndRelatedName(ModelShow1_plain):
superclass = models.OneToOneField(ModelShow1_plain, parent_link=True, related_name='related_name_subclass') superclass = models.OneToOneField(ModelShow1_plain, parent_link=True, related_name='related_name_subclass')
class CustomPkBase(ShowFieldTypeAndContent, PolymorphicModel): class CustomPkBase(ShowFieldTypeAndContent, PolymorphicModel):
b = models.CharField(max_length=1) b = models.CharField(max_length=1)
class CustomPkInherit(CustomPkBase): class CustomPkInherit(CustomPkBase):
custom_id = models.AutoField(primary_key=True) custom_id = models.AutoField(primary_key=True)
i = models.CharField(max_length=1) i = models.CharField(max_length=1)
@ -347,7 +466,6 @@ class PolymorphicTests(TestCase):
x = '\n' + repr(BlogBase.objects.order_by('-BlogA___info')) x = '\n' + repr(BlogBase.objects.order_by('-BlogA___info'))
self.assertTrue(x == expected1 or x == expected2) self.assertTrue(x == expected1 or x == expected2)
def test_limit_choices_to(self): def test_limit_choices_to(self):
""" """
this is not really a testcase, as limit_choices_to only affects the Django admin this is not really a testcase, as limit_choices_to only affects the Django admin
@ -359,7 +477,6 @@ class PolymorphicTests(TestCase):
entry1 = BlogEntry_limit_choices_to.objects.create(blog=blog_b, text='bla2') entry1 = BlogEntry_limit_choices_to.objects.create(blog=blog_b, text='bla2')
entry2 = BlogEntry_limit_choices_to.objects.create(blog=blog_b, text='bla2') entry2 = BlogEntry_limit_choices_to.objects.create(blog=blog_b, text='bla2')
def test_primary_key_custom_field_problem(self): def test_primary_key_custom_field_problem(self):
""" """
object retrieval problem occuring with some custom primary key fields (UUIDField as test case) object retrieval problem occuring with some custom primary key fields (UUIDField as test case)
@ -401,7 +518,6 @@ class PolymorphicTests(TestCase):
Model2C.objects.create(field1='C1', field2='C2', field3='C3') Model2C.objects.create(field1='C1', field2='C2', field3='C3')
Model2D.objects.create(field1='D1', field2='D2', field3='D3', field4='D4') Model2D.objects.create(field1='D1', field2='D2', field3='D3', field4='D4')
def test_simple_inheritance(self): def test_simple_inheritance(self):
self.create_model2abcd() self.create_model2abcd()
@ -411,14 +527,12 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[2]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>') self.assertEqual(repr(objects[2]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
self.assertEqual(repr(objects[3]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>') self.assertEqual(repr(objects[3]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>')
def test_manual_get_real_instance(self): def test_manual_get_real_instance(self):
self.create_model2abcd() self.create_model2abcd()
o = Model2A.objects.non_polymorphic().get(field1='C1') o = Model2A.objects.non_polymorphic().get(field1='C1')
self.assertEqual(repr(o.get_real_instance()), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>') self.assertEqual(repr(o.get_real_instance()), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
def test_non_polymorphic(self): def test_non_polymorphic(self):
self.create_model2abcd() self.create_model2abcd()
@ -428,7 +542,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[2]), '<Model2A: id 3, field1 (CharField)>') self.assertEqual(repr(objects[2]), '<Model2A: id 3, field1 (CharField)>')
self.assertEqual(repr(objects[3]), '<Model2A: id 4, field1 (CharField)>') self.assertEqual(repr(objects[3]), '<Model2A: id 4, field1 (CharField)>')
def test_get_real_instances(self): def test_get_real_instances(self):
self.create_model2abcd() self.create_model2abcd()
qs = Model2A.objects.all().non_polymorphic() qs = Model2A.objects.all().non_polymorphic()
@ -447,7 +560,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[2]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>') self.assertEqual(repr(objects[2]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
self.assertEqual(repr(objects[3]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>') self.assertEqual(repr(objects[3]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>')
def test_translate_polymorphic_q_object(self): def test_translate_polymorphic_q_object(self):
self.create_model2abcd() self.create_model2abcd()
@ -456,7 +568,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[0]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>') self.assertEqual(repr(objects[0]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
self.assertEqual(repr(objects[1]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>') self.assertEqual(repr(objects[1]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>')
def test_base_manager(self): def test_base_manager(self):
def show_base_manager(model): def show_base_manager(model):
return "{0} {1}".format( return "{0} {1}".format(
@ -475,7 +586,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(show_base_manager(One2OneRelatingModel), "<class 'polymorphic.manager.PolymorphicManager'> <class 'polymorphic.tests.One2OneRelatingModel'>") self.assertEqual(show_base_manager(One2OneRelatingModel), "<class 'polymorphic.manager.PolymorphicManager'> <class 'polymorphic.tests.One2OneRelatingModel'>")
self.assertEqual(show_base_manager(One2OneRelatingModelDerived), "<class 'django.db.models.manager.Manager'> <class 'polymorphic.tests.One2OneRelatingModelDerived'>") self.assertEqual(show_base_manager(One2OneRelatingModelDerived), "<class 'django.db.models.manager.Manager'> <class 'polymorphic.tests.One2OneRelatingModelDerived'>")
def test_instance_default_manager(self): def test_instance_default_manager(self):
def show_default_manager(instance): def show_default_manager(instance):
return "{0} {1}".format( return "{0} {1}".format(
@ -508,7 +618,6 @@ class PolymorphicTests(TestCase):
object2b = Model2B.base_objects.get(field1='C1') object2b = Model2B.base_objects.get(field1='C1')
self.assertEqual(repr(object2b.model2c), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>') self.assertEqual(repr(object2b.model2c), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
def test_onetoone_field(self): def test_onetoone_field(self):
self.create_model2abcd() self.create_model2abcd()
@ -522,7 +631,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(c.one2one), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>') self.assertEqual(repr(c.one2one), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
self.assertEqual(repr(a.one2onerelatingmodel), '<One2OneRelatingModelDerived: One2OneRelatingModelDerived object>') self.assertEqual(repr(a.one2onerelatingmodel), '<One2OneRelatingModelDerived: One2OneRelatingModelDerived object>')
def test_manytomany_field(self): def test_manytomany_field(self):
# Model 1 # Model 1
o = ModelShow1.objects.create(field1='abc') o = ModelShow1.objects.create(field1='abc')
@ -550,7 +658,6 @@ class PolymorphicTests(TestCase):
ModelShow2_plain.objects.create(field1='abc', field2='def') ModelShow2_plain.objects.create(field1='abc', field2='def')
self.assertEqual(repr(ModelShow1_plain.objects.all()), '[<ModelShow1_plain: ModelShow1_plain object>, <ModelShow2_plain: ModelShow2_plain object>]') self.assertEqual(repr(ModelShow1_plain.objects.all()), '[<ModelShow1_plain: ModelShow1_plain object>, <ModelShow2_plain: ModelShow2_plain object>]')
def test_extra_method(self): def test_extra_method(self):
self.create_model2abcd() self.create_model2abcd()
@ -580,7 +687,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[2]), '<ModelExtraC: id 3, field1 (CharField) "C1", field2 (CharField) "C2", field3 (CharField) "C3" - Extra: topic (unicode) "extra3">') self.assertEqual(repr(objects[2]), '<ModelExtraC: id 3, field1 (CharField) "C1", field2 (CharField) "C2", field3 (CharField) "C3" - Extra: topic (unicode) "extra3">')
self.assertEqual(len(objects), 3) self.assertEqual(len(objects), 3)
def test_instance_of_filter(self): def test_instance_of_filter(self):
self.create_model2abcd() self.create_model2abcd()
@ -606,7 +712,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[0]), '<Model2A: id 1, field1 (CharField)>') self.assertEqual(repr(objects[0]), '<Model2A: id 1, field1 (CharField)>')
self.assertEqual(len(objects), 1) self.assertEqual(len(objects), 1)
def test_polymorphic___filter(self): def test_polymorphic___filter(self):
self.create_model2abcd() self.create_model2abcd()
@ -615,7 +720,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[0]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>') self.assertEqual(repr(objects[0]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>')
self.assertEqual(repr(objects[1]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>') self.assertEqual(repr(objects[1]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
def test_delete(self): def test_delete(self):
self.create_model2abcd() self.create_model2abcd()
@ -630,7 +734,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[2]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>') self.assertEqual(repr(objects[2]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>')
self.assertEqual(len(objects), 3) self.assertEqual(len(objects), 3)
def test_combine_querysets(self): def test_combine_querysets(self):
ModelX.objects.create(field_x='x') ModelX.objects.create(field_x='x')
ModelY.objects.create(field_y='y') ModelY.objects.create(field_y='y')
@ -640,7 +743,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(qs[1]), '<ModelY: id 2, field_b (CharField), field_y (CharField)>') self.assertEqual(repr(qs[1]), '<ModelY: id 2, field_b (CharField), field_y (CharField)>')
self.assertEqual(len(qs), 2) self.assertEqual(len(qs), 2)
def test_multiple_inheritance(self): def test_multiple_inheritance(self):
# multiple inheritance, subclassing third party models (mix PolymorphicModel with models.Model) # multiple inheritance, subclassing third party models (mix PolymorphicModel with models.Model)
@ -685,7 +787,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[1]), '<RelationB: id 3, field_base (CharField) "B1", fk (ForeignKey) RelationA, field_b (CharField) "B2", m2m (ManyToManyField) 1>') self.assertEqual(repr(objects[1]), '<RelationB: id 3, field_base (CharField) "B1", fk (ForeignKey) RelationA, field_b (CharField) "B2", m2m (ManyToManyField) 1>')
self.assertEqual(len(objects), 2) self.assertEqual(len(objects), 2)
def test_user_defined_manager(self): def test_user_defined_manager(self):
self.create_model2abcd() self.create_model2abcd()
ModelWithMyManager.objects.create(field1='D1a', field4='D4a') ModelWithMyManager.objects.create(field1='D1a', field4='D4a')
@ -715,7 +816,6 @@ class PolymorphicTests(TestCase):
self.assertEqual(type(ModelWithMyManager2._default_manager).__name__, 'PolymorphicManagerFromMyManagerQuerySet') self.assertEqual(type(ModelWithMyManager2._default_manager).__name__, 'PolymorphicManagerFromMyManagerQuerySet')
self.assertIs(type(ModelWithMyManager2.base_objects), models.Manager) self.assertIs(type(ModelWithMyManager2.base_objects), models.Manager)
def test_manager_inheritance(self): def test_manager_inheritance(self):
# by choice of MRO, should be MyManager from MROBase1. # by choice of MRO, should be MyManager from MROBase1.
self.assertIs(type(MRODerived.objects), MyManager) self.assertIs(type(MRODerived.objects), MyManager)
@ -726,7 +826,6 @@ class PolymorphicTests(TestCase):
# Django vanilla inheritance does not inherit MyManager as _default_manager here # Django vanilla inheritance does not inherit MyManager as _default_manager here
self.assertIs(type(MROBase2._default_manager), MyManager) self.assertIs(type(MROBase2._default_manager), MyManager)
def test_queryset_assignment(self): def test_queryset_assignment(self):
# This is just a consistency check for now, testing standard Django behavior. # This is just a consistency check for now, testing standard Django behavior.
parent = PlainParentModelWithManager.objects.create() parent = PlainParentModelWithManager.objects.create()
@ -750,7 +849,6 @@ class PolymorphicTests(TestCase):
# A related set is created using the model's _default_manager, so does gain extra methods. # A related set is created using the model's _default_manager, so does gain extra methods.
self.assertIs(type(parent.childmodel_set.my_queryset_foo()), MyManagerQuerySet) self.assertIs(type(parent.childmodel_set.my_queryset_foo()), MyManagerQuerySet)
def test_proxy_models(self): def test_proxy_models(self):
# prepare some data # prepare some data
for data in ('bleep bloop', 'I am a', 'computer'): for data in ('bleep bloop', 'I am a', 'computer'):
@ -792,7 +890,6 @@ class PolymorphicTests(TestCase):
ct = ContentType.objects.get_for_model(ProxyChild, for_concrete_model=False) ct = ContentType.objects.get_for_model(ProxyChild, for_concrete_model=False)
self.assertEqual(ProxyChild, ct.model_class()) self.assertEqual(ProxyChild, ct.model_class())
def test_proxy_model_inheritance(self): def test_proxy_model_inheritance(self):
""" """
Polymorphic abilities should also work when the base model is a proxy object. Polymorphic abilities should also work when the base model is a proxy object.
@ -860,7 +957,6 @@ class PolymorphicTests(TestCase):
t.delete() t.delete()
class RegressionTests(TestCase): class RegressionTests(TestCase):
def test_for_query_result_incomplete_with_inheritance(self): def test_for_query_result_incomplete_with_inheritance(self):
@ -881,4 +977,3 @@ class RegressionTests(TestCase):
expected_queryset = [bottom] expected_queryset = [bottom]
self.assertQuerysetEqual(Bottom.objects.all(), [repr(r) for r in expected_queryset]) self.assertQuerysetEqual(Bottom.objects.all(), [repr(r) for r in expected_queryset])