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
parent
f656ec438e
commit
aaf06c71a5
|
|
@ -14,6 +14,7 @@ class ProjectChildAdmin(PolymorphicChildModelAdmin):
|
|||
}),
|
||||
)
|
||||
|
||||
|
||||
class ProjectAdmin(PolymorphicParentModelAdmin):
|
||||
base_model = Project
|
||||
list_filter = (PolymorphicChildModelFilter,)
|
||||
|
|
@ -26,10 +27,10 @@ class ProjectAdmin(PolymorphicParentModelAdmin):
|
|||
admin.site.register(Project, ProjectAdmin)
|
||||
|
||||
|
||||
|
||||
class ModelAChildAdmin(PolymorphicChildModelAdmin):
|
||||
base_model = ModelA
|
||||
|
||||
|
||||
class ModelAAdmin(PolymorphicParentModelAdmin):
|
||||
base_model = ModelA
|
||||
list_filter = (PolymorphicChildModelFilter,)
|
||||
|
|
@ -45,6 +46,7 @@ admin.site.register(ModelA, ModelAAdmin)
|
|||
class Model2AChildAdmin(PolymorphicChildModelAdmin):
|
||||
base_model = Model2A
|
||||
|
||||
|
||||
class Model2AAdmin(PolymorphicParentModelAdmin):
|
||||
base_model = Model2A
|
||||
list_filter = (PolymorphicChildModelFilter,)
|
||||
|
|
@ -60,6 +62,7 @@ admin.site.register(Model2A, Model2AAdmin)
|
|||
class UUIDModelAChildAdmin(PolymorphicChildModelAdmin):
|
||||
base_model = UUIDModelA
|
||||
|
||||
|
||||
class UUIDModelAAdmin(PolymorphicParentModelAdmin):
|
||||
base_model = UUIDModelA
|
||||
list_filter = (PolymorphicChildModelFilter,)
|
||||
|
|
@ -75,6 +78,7 @@ admin.site.register(UUIDModelA, UUIDModelAAdmin)
|
|||
class ProxyChildAdmin(PolymorphicChildModelAdmin):
|
||||
base_model = ProxyBase
|
||||
|
||||
|
||||
class ProxyAdmin(PolymorphicParentModelAdmin):
|
||||
base_model = ProxyBase
|
||||
list_filter = (PolymorphicChildModelFilter,)
|
||||
|
|
|
|||
|
|
@ -12,12 +12,15 @@ import time,sys
|
|||
|
||||
from pexp.models import *
|
||||
|
||||
|
||||
def reset_queries():
|
||||
connection.queries = []
|
||||
|
||||
|
||||
def show_queries():
|
||||
print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = []
|
||||
|
||||
|
||||
def print_timing(func, message='', iterations=1):
|
||||
def wrapper(*arg):
|
||||
results = []
|
||||
|
|
@ -39,6 +42,7 @@ def print_timing(func, message='', iterations=1):
|
|||
sys.stdout.flush()
|
||||
return wrapper
|
||||
|
||||
|
||||
class Command(NoArgsCommand):
|
||||
help = ""
|
||||
|
||||
|
|
@ -79,6 +83,7 @@ from django.db import connection, transaction
|
|||
from random import Random
|
||||
rnd = Random()
|
||||
|
||||
|
||||
def poly_sql_query():
|
||||
cursor = connection.cursor()
|
||||
cursor.execute("""
|
||||
|
|
@ -94,6 +99,7 @@ def poly_sql_query():
|
|||
#row=cursor.fetchone()
|
||||
return
|
||||
|
||||
|
||||
def poly_sql_query2():
|
||||
cursor = connection.cursor()
|
||||
cursor.execute("""
|
||||
|
|
|
|||
|
|
@ -9,12 +9,15 @@ from pprint import pprint
|
|||
|
||||
from pexp.models import *
|
||||
|
||||
|
||||
def reset_queries():
|
||||
connection.queries = []
|
||||
|
||||
|
||||
def show_queries():
|
||||
print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = []
|
||||
|
||||
|
||||
class Command(NoArgsCommand):
|
||||
help = ""
|
||||
|
||||
|
|
@ -32,4 +35,3 @@ class Command(NoArgsCommand):
|
|||
c = ModelC.objects.create(field1='C1', field2='C2', field3='C3')
|
||||
print ModelA.objects.all()
|
||||
print
|
||||
|
||||
|
|
|
|||
|
|
@ -11,9 +11,11 @@ from pexp.models import *
|
|||
|
||||
num_objects = 1000
|
||||
|
||||
|
||||
def reset_queries():
|
||||
connection.queries = []
|
||||
|
||||
|
||||
def show_queries():
|
||||
print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; reset_queries()
|
||||
|
||||
|
|
@ -22,6 +24,7 @@ import time
|
|||
###################################################################################
|
||||
### benchmark wrappers
|
||||
|
||||
|
||||
def print_timing(func, message='', iterations=1):
|
||||
def wrapper(*arg):
|
||||
results = []
|
||||
|
|
@ -42,6 +45,7 @@ def print_timing(func, message='', iterations=1):
|
|||
sys.stdout.flush()
|
||||
return wrapper
|
||||
|
||||
|
||||
def run_vanilla_any_poly(func, iterations=1):
|
||||
f = print_timing(func, ' ', iterations)
|
||||
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))
|
||||
#print 'count:',model.objects.count()
|
||||
|
||||
|
||||
def bench_load1(model):
|
||||
for o in model.objects.all():
|
||||
pass
|
||||
|
||||
|
||||
def bench_load1_short(model):
|
||||
for i in xrange(num_objects / 100):
|
||||
for o in model.objects.all()[:100]:
|
||||
pass
|
||||
|
||||
|
||||
def bench_load2(model):
|
||||
for o in model.objects.all():
|
||||
f1 = o.field1
|
||||
f2 = o.field2
|
||||
f3 = o.field3
|
||||
|
||||
|
||||
def bench_load2_short(model):
|
||||
for i in xrange(num_objects / 100):
|
||||
for o in model.objects.all()[:100]:
|
||||
|
|
@ -79,12 +87,14 @@ def bench_load2_short(model):
|
|||
f2 = o.field2
|
||||
f3 = o.field3
|
||||
|
||||
|
||||
def bench_delete(model):
|
||||
model.objects.all().delete()
|
||||
|
||||
###################################################################################
|
||||
### Command
|
||||
|
||||
|
||||
class Command(NoArgsCommand):
|
||||
help = ""
|
||||
|
||||
|
|
|
|||
|
|
@ -9,12 +9,15 @@ from pprint import pprint
|
|||
|
||||
from pexp.models import *
|
||||
|
||||
|
||||
def reset_queries():
|
||||
connection.queries = []
|
||||
|
||||
|
||||
def show_queries():
|
||||
print; print 'QUERIES:', len(connection.queries); pprint(connection.queries); print; connection.queries = []
|
||||
|
||||
|
||||
class Command(NoArgsCommand):
|
||||
help = ""
|
||||
|
||||
|
|
@ -25,6 +28,3 @@ class Command(NoArgsCommand):
|
|||
o = ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")
|
||||
print Project.objects.all()
|
||||
print
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -6,32 +6,52 @@ from django.db import models
|
|||
from polymorphic.models import PolymorphicModel
|
||||
from polymorphic.showfields import ShowFieldContent, ShowFieldType, ShowFieldTypeAndContent
|
||||
|
||||
|
||||
class Project(ShowFieldContent, PolymorphicModel):
|
||||
topic = models.CharField(max_length=30)
|
||||
|
||||
|
||||
class ArtProject(Project):
|
||||
artist = models.CharField(max_length=30)
|
||||
|
||||
|
||||
class ResearchProject(Project):
|
||||
supervisor = models.CharField(max_length=30)
|
||||
|
||||
|
||||
class ModelA(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelB(ModelA):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelC(ModelB):
|
||||
field3 = models.CharField(max_length=10)
|
||||
field4 = models.ManyToManyField(ModelB, related_name='related_c')
|
||||
|
||||
|
||||
class nModelA(models.Model):
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class nModelB(nModelA):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class nModelC(nModelB):
|
||||
field3 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Model2A(PolymorphicModel):
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Model2B(Model2A):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Model2C(Model2B):
|
||||
field3 = models.CharField(max_length=10)
|
||||
|
||||
|
|
@ -40,14 +60,20 @@ if django.VERSION < (1,8):
|
|||
else:
|
||||
from django.db.models import UUIDField
|
||||
|
||||
|
||||
class UUIDModelA(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
uuid_primary_key = UUIDField(primary_key=True)
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class UUIDModelB(UUIDModelA):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class UUIDModelC(UUIDModelB):
|
||||
field3 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ProxyBase(PolymorphicModel):
|
||||
title = models.CharField(max_length=200)
|
||||
|
||||
|
|
@ -57,14 +83,18 @@ class ProxyBase(PolymorphicModel):
|
|||
class Meta:
|
||||
ordering = ('title',)
|
||||
|
||||
|
||||
class ProxyA(ProxyBase):
|
||||
|
||||
class Meta:
|
||||
proxy = True
|
||||
|
||||
def __unicode__(self):
|
||||
return u"<ProxyA: {0}>".format(self.title)
|
||||
|
||||
|
||||
class ProxyB(ProxyBase):
|
||||
|
||||
class Meta:
|
||||
proxy = True
|
||||
|
||||
|
|
|
|||
|
|
@ -39,4 +39,3 @@ if django.VERSION[:2] < (1, 5):
|
|||
|
||||
ContentTypeManager.get_for_model__original = ContentTypeManager.get_for_model
|
||||
ContentTypeManager.get_for_model = get_for_model
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ class RegistrationClosed(RuntimeError):
|
|||
"The admin model can't be registered anymore at this point."
|
||||
pass
|
||||
|
||||
|
||||
class ChildAdminNotRegistered(RuntimeError):
|
||||
"The admin site for the model is not registered."
|
||||
pass
|
||||
|
|
@ -122,13 +123,11 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
#: If your primary key consists of string values, update this regular expression.
|
||||
pk_regex = '(\d+|__fk__)'
|
||||
|
||||
|
||||
def __init__(self, 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._is_setup = False
|
||||
|
||||
|
||||
def _lazy_setup(self):
|
||||
if self._is_setup:
|
||||
return
|
||||
|
|
@ -150,7 +149,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
self._child_admin_site._registry = complete_registry
|
||||
self._is_setup = True
|
||||
|
||||
|
||||
def register_child(self, model, model_admin):
|
||||
"""
|
||||
Register a model with admin to display.
|
||||
|
|
@ -167,7 +165,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
|
||||
self._child_admin_site.register(model, model_admin)
|
||||
|
||||
|
||||
def get_child_models(self):
|
||||
"""
|
||||
Return the derived model classes which this admin should handle.
|
||||
|
|
@ -181,7 +178,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
|
||||
return self.child_models
|
||||
|
||||
|
||||
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.
|
||||
|
|
@ -197,7 +193,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
choices.append((ct.id, model._meta.verbose_name))
|
||||
return choices
|
||||
|
||||
|
||||
def _get_real_admin(self, object_id):
|
||||
try:
|
||||
obj = self.model.objects.non_polymorphic() \
|
||||
|
|
@ -206,7 +201,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
raise Http404
|
||||
return self._get_real_admin_by_ct(obj['polymorphic_ctype'])
|
||||
|
||||
|
||||
def _get_real_admin_by_ct(self, ct_id):
|
||||
try:
|
||||
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)
|
||||
|
||||
|
||||
def _get_real_admin_by_model(self, model_class):
|
||||
# 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.
|
||||
|
|
@ -233,7 +226,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
except KeyError:
|
||||
raise ChildAdminNotRegistered("No child admin site was registered for a '{0}' model.".format(model_class))
|
||||
|
||||
|
||||
def get_queryset(self, request):
|
||||
# optimize the list display.
|
||||
qs = super(PolymorphicParentModelAdmin, self).get_queryset(request)
|
||||
|
|
@ -241,7 +233,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
qs = qs.non_polymorphic()
|
||||
return qs
|
||||
|
||||
|
||||
# For Django 1.5:
|
||||
def queryset(self, request):
|
||||
qs = super(PolymorphicParentModelAdmin, self).queryset(request)
|
||||
|
|
@ -249,7 +240,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
qs = qs.non_polymorphic()
|
||||
return qs
|
||||
|
||||
|
||||
def add_view(self, request, form_url='', extra_context=None):
|
||||
"""Redirect the add view to the real admin."""
|
||||
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)
|
||||
|
||||
|
||||
def change_view(self, request, object_id, *args, **kwargs):
|
||||
"""Redirect the change view to the real admin."""
|
||||
real_admin = self._get_real_admin(object_id)
|
||||
return real_admin.change_view(request, object_id, *args, **kwargs)
|
||||
|
||||
|
||||
def delete_view(self, request, object_id, extra_context=None):
|
||||
"""Redirect the delete view to the real admin."""
|
||||
real_admin = self._get_real_admin(object_id)
|
||||
|
|
@ -331,7 +319,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
|
||||
return urls + custom_urls + dummy_urls
|
||||
|
||||
|
||||
def subclass_view(self, request, path):
|
||||
"""
|
||||
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)
|
||||
|
||||
|
||||
real_admin = self._get_real_admin_by_ct(ct_id)
|
||||
resolver = RegexURLResolver('^', real_admin.urls)
|
||||
resolvermatch = resolver.resolve(path) # May raise Resolver404
|
||||
|
|
@ -359,7 +345,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
|
||||
return resolvermatch.func(request, *resolvermatch.args, **resolvermatch.kwargs)
|
||||
|
||||
|
||||
def add_type_view(self, request, form_url=''):
|
||||
"""
|
||||
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)
|
||||
|
||||
|
||||
def render_add_type_form(self, request, context, form_url=''):
|
||||
"""
|
||||
Render the page type choice form.
|
||||
|
|
@ -426,7 +410,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
"admin/add_type_form.html"
|
||||
], context, context_instance=context_instance)
|
||||
|
||||
|
||||
@property
|
||||
def change_list_template(self):
|
||||
opts = self.model._meta
|
||||
|
|
@ -446,7 +429,6 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
|
|||
]
|
||||
|
||||
|
||||
|
||||
class PolymorphicChildModelAdmin(admin.ModelAdmin):
|
||||
"""
|
||||
The *optional* base class for the admin interface of derived models.
|
||||
|
|
@ -465,7 +447,6 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
|
|||
base_fieldsets = None
|
||||
extra_fieldset_title = _("Contents") # Default title for extra fieldset
|
||||
|
||||
|
||||
def get_form(self, request, obj=None, **kwargs):
|
||||
# The django admin validation requires the form to have a 'class Meta: model = ..'
|
||||
# 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)
|
||||
|
||||
|
||||
@property
|
||||
def change_form_template(self):
|
||||
opts = self.model._meta
|
||||
|
|
@ -502,7 +482,6 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
|
|||
"admin/change_form.html"
|
||||
]
|
||||
|
||||
|
||||
@property
|
||||
def delete_confirmation_template(self):
|
||||
opts = self.model._meta
|
||||
|
|
@ -522,21 +501,18 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
|
|||
"admin/delete_confirmation.html"
|
||||
]
|
||||
|
||||
|
||||
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
|
||||
context.update({
|
||||
'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)
|
||||
|
||||
|
||||
def delete_view(self, request, object_id, context=None):
|
||||
extra_context = {
|
||||
'base_opts': self.base_model._meta,
|
||||
}
|
||||
return super(PolymorphicChildModelAdmin, self).delete_view(request, object_id, extra_context)
|
||||
|
||||
|
||||
# ---- Extra: improving the form/fieldset default display ----
|
||||
|
||||
def get_fieldsets(self, request, obj=None):
|
||||
|
|
@ -557,7 +533,6 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin):
|
|||
else:
|
||||
return self.base_fieldsets
|
||||
|
||||
|
||||
def get_subclass_fields(self, request, obj=None):
|
||||
# Find out how many fields would really be on the form,
|
||||
# if it weren't restricted by declared fields.
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ from .query_translate import translate_polymorphic_Q_object
|
|||
###################################################################################
|
||||
### PolymorphicModel
|
||||
|
||||
|
||||
class PolymorphicModel(six.with_metaclass(PolymorphicModelBase, models.Model)):
|
||||
"""
|
||||
Abstract base class that provides polymorphic behaviour
|
||||
|
|
|
|||
|
|
@ -338,6 +338,7 @@ class PolymorphicQuerySet(QuerySet):
|
|||
return super(PolymorphicQuerySet, self).__repr__(*args, **kwargs)
|
||||
|
||||
class _p_list_class(list):
|
||||
|
||||
def __repr__(self, *args, **kwargs):
|
||||
result = [repr(o) for o in self]
|
||||
return '[ ' + ',\n '.join(result) + ' ]'
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
from django.db import models
|
||||
from django.utils import six
|
||||
|
||||
|
||||
class ShowFieldBase(object):
|
||||
""" base class for the ShowField... model mixins, does the work """
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ register = Library()
|
|||
|
||||
|
||||
class BreadcrumbScope(Node):
|
||||
|
||||
def __init__(self, base_opts, nodelist):
|
||||
self.base_opts = base_opts
|
||||
self.nodelist = nodelist # Note, takes advantage of Node.child_nodelists
|
||||
|
|
@ -25,7 +26,6 @@ class BreadcrumbScope(Node):
|
|||
else:
|
||||
raise TemplateSyntaxError("{0} tag expects 1 argument".format(token.contents[0]))
|
||||
|
||||
|
||||
def render(self, context):
|
||||
# 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.
|
||||
|
|
|
|||
|
|
@ -32,85 +32,133 @@ except ImportError:
|
|||
|
||||
class PlainA(models.Model):
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class PlainB(PlainA):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class PlainC(PlainB):
|
||||
field3 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Model2A(ShowFieldType, PolymorphicModel):
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Model2B(Model2A):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Model2C(Model2B):
|
||||
field3 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Model2D(Model2C):
|
||||
field4 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelExtraA(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelExtraB(ModelExtraA):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelExtraC(ModelExtraB):
|
||||
field3 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelExtraExternal(models.Model):
|
||||
topic = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelShow1(ShowFieldType, PolymorphicModel):
|
||||
field1 = models.CharField(max_length=10)
|
||||
m2m = models.ManyToManyField('self')
|
||||
|
||||
|
||||
class ModelShow2(ShowFieldContent, PolymorphicModel):
|
||||
field1 = models.CharField(max_length=10)
|
||||
m2m = models.ManyToManyField('self')
|
||||
|
||||
|
||||
class ModelShow3(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
field1 = models.CharField(max_length=10)
|
||||
m2m = models.ManyToManyField('self')
|
||||
|
||||
|
||||
class ModelShow1_plain(PolymorphicModel):
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelShow2_plain(ModelShow1_plain):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Base(ShowFieldType, PolymorphicModel):
|
||||
field_b = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelX(Base):
|
||||
field_x = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelY(Base):
|
||||
field_y = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Enhance_Plain(models.Model):
|
||||
field_p = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Enhance_Base(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
base_id = models.AutoField(primary_key=True)
|
||||
field_b = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class Enhance_Inherit(Enhance_Base, Enhance_Plain):
|
||||
field_i = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class RelationBase(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
field_base = models.CharField(max_length=10)
|
||||
fk = models.ForeignKey('self', null=True, related_name='relationbase_set')
|
||||
m2m = models.ManyToManyField('self')
|
||||
|
||||
|
||||
class RelationA(RelationBase):
|
||||
field_a = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class RelationB(RelationBase):
|
||||
field_b = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class RelationBC(RelationB):
|
||||
field_c = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class RelatingModel(models.Model):
|
||||
many2many = models.ManyToManyField(Model2A)
|
||||
|
||||
|
||||
class One2OneRelatingModel(PolymorphicModel):
|
||||
one2one = models.OneToOneField(Model2A)
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class One2OneRelatingModelDerived(One2OneRelatingModel):
|
||||
field2 = 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.
|
||||
|
||||
|
||||
class MyManager(PolymorphicManager):
|
||||
queryset_class = MyManagerQuerySet
|
||||
|
||||
|
|
@ -120,6 +168,7 @@ class MyManager(PolymorphicManager):
|
|||
# Django <= 1.5 compatibility
|
||||
get_query_set = get_queryset
|
||||
|
||||
|
||||
class ModelWithMyManager(ShowFieldTypeAndContent, Model2A):
|
||||
objects = MyManager()
|
||||
field4 = models.CharField(max_length=10)
|
||||
|
|
@ -129,18 +178,28 @@ if django.VERSION >= (1,7):
|
|||
objects = MyManagerQuerySet.as_manager()
|
||||
field4 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class MROBase1(ShowFieldType, PolymorphicModel):
|
||||
objects = MyManager()
|
||||
field1 = models.CharField(max_length=10) # needed as MyManager uses it
|
||||
|
||||
|
||||
class MROBase2(MROBase1):
|
||||
pass # Django vanilla inheritance does not inherit MyManager as _default_manager here
|
||||
|
||||
|
||||
class MROBase3(models.Model):
|
||||
objects = PolymorphicManager()
|
||||
|
||||
|
||||
class MRODerived(MROBase2, MROBase3):
|
||||
pass
|
||||
|
||||
|
||||
class ParentModelWithManager(PolymorphicModel):
|
||||
pass
|
||||
|
||||
|
||||
class ChildModelWithManager(PolymorphicModel):
|
||||
# Also test whether foreign keys receive the manager:
|
||||
fk = models.ForeignKey(ParentModelWithManager, related_name='childmodel_set')
|
||||
|
|
@ -148,10 +207,13 @@ class ChildModelWithManager(PolymorphicModel):
|
|||
|
||||
|
||||
class PlainMyManagerQuerySet(QuerySet):
|
||||
|
||||
def my_queryset_foo(self):
|
||||
return self.all() # Just a method to prove the existance of the custom queryset.
|
||||
|
||||
|
||||
class PlainMyManager(models.Manager):
|
||||
|
||||
def my_queryset_foo(self):
|
||||
return self.get_queryset().my_queryset_foo()
|
||||
|
||||
|
|
@ -161,9 +223,11 @@ class PlainMyManager(models.Manager):
|
|||
# Django <= 1.5 compatibility
|
||||
get_query_set = get_queryset
|
||||
|
||||
|
||||
class PlainParentModelWithManager(models.Model):
|
||||
pass
|
||||
|
||||
|
||||
class PlainChildModelWithManager(models.Model):
|
||||
fk = models.ForeignKey(PlainParentModelWithManager, related_name='childmodel_set')
|
||||
objects = PlainMyManager()
|
||||
|
|
@ -173,82 +237,132 @@ class MgrInheritA(models.Model):
|
|||
mgrA = models.Manager()
|
||||
mgrA2 = models.Manager()
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class MgrInheritB(MgrInheritA):
|
||||
mgrB = models.Manager()
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class MgrInheritC(ShowFieldTypeAndContent, MgrInheritB):
|
||||
pass
|
||||
|
||||
|
||||
class BlogBase(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
name = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class BlogA(BlogBase):
|
||||
info = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class BlogB(BlogBase):
|
||||
pass
|
||||
|
||||
|
||||
class BlogEntry(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
blog = models.ForeignKey(BlogA)
|
||||
text = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class BlogEntry_limit_choices_to(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
blog = models.ForeignKey(BlogBase)
|
||||
text = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ModelFieldNameTest(ShowFieldType, PolymorphicModel):
|
||||
modelfieldnametest = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class InitTestModel(ShowFieldType, PolymorphicModel):
|
||||
bar = models.CharField(max_length=100)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['bar'] = self.x()
|
||||
super(InitTestModel, self).__init__(*args, **kwargs)
|
||||
|
||||
|
||||
class InitTestModelSubclass(InitTestModel):
|
||||
|
||||
def x(self):
|
||||
return 'XYZ'
|
||||
|
||||
# models from github issue
|
||||
|
||||
|
||||
class Top(PolymorphicModel):
|
||||
name = models.CharField(max_length=50)
|
||||
|
||||
class Meta:
|
||||
ordering = ('pk',)
|
||||
|
||||
|
||||
class Middle(Top):
|
||||
description = models.TextField()
|
||||
|
||||
|
||||
class Bottom(Middle):
|
||||
author = models.CharField(max_length=50)
|
||||
|
||||
|
||||
class UUIDProject(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
uuid_primary_key = UUIDField(primary_key=True, default=uuid.uuid1)
|
||||
topic = models.CharField(max_length=30)
|
||||
|
||||
|
||||
class UUIDArtProject(UUIDProject):
|
||||
artist = models.CharField(max_length=30)
|
||||
|
||||
|
||||
class UUIDResearchProject(UUIDProject):
|
||||
supervisor = models.CharField(max_length=30)
|
||||
|
||||
|
||||
class UUIDPlainA(models.Model):
|
||||
uuid_primary_key = UUIDField(primary_key=True, default=uuid.uuid1)
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class UUIDPlainB(UUIDPlainA):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class UUIDPlainC(UUIDPlainB):
|
||||
field3 = models.CharField(max_length=10)
|
||||
|
||||
# base -> proxy
|
||||
|
||||
|
||||
class ProxyBase(PolymorphicModel):
|
||||
some_data = models.CharField(max_length=128)
|
||||
|
||||
|
||||
class ProxyChild(ProxyBase):
|
||||
|
||||
class Meta:
|
||||
proxy = True
|
||||
|
||||
|
||||
class NonProxyChild(ProxyBase):
|
||||
name = models.CharField(max_length=10)
|
||||
|
||||
# base -> proxy -> real models
|
||||
|
||||
|
||||
class ProxiedBase(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
name = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ProxyModelBase(ProxiedBase):
|
||||
|
||||
class Meta:
|
||||
proxy = True
|
||||
|
||||
|
||||
class ProxyModelA(ProxyModelBase):
|
||||
field1 = models.CharField(max_length=10)
|
||||
|
||||
|
||||
class ProxyModelB(ProxyModelBase):
|
||||
field2 = models.CharField(max_length=10)
|
||||
|
||||
|
|
@ -264,11 +378,16 @@ class RelatedNameClash(ShowFieldType, PolymorphicModel):
|
|||
ctype = models.ForeignKey(ContentType, 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, parent_link=True, related_name='related_name_subclass')
|
||||
|
||||
|
||||
class CustomPkBase(ShowFieldTypeAndContent, PolymorphicModel):
|
||||
b = models.CharField(max_length=1)
|
||||
|
||||
|
||||
class CustomPkInherit(CustomPkBase):
|
||||
custom_id = models.AutoField(primary_key=True)
|
||||
i = models.CharField(max_length=1)
|
||||
|
|
@ -347,7 +466,6 @@ class PolymorphicTests(TestCase):
|
|||
x = '\n' + repr(BlogBase.objects.order_by('-BlogA___info'))
|
||||
self.assertTrue(x == expected1 or x == expected2)
|
||||
|
||||
|
||||
def test_limit_choices_to(self):
|
||||
"""
|
||||
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')
|
||||
entry2 = BlogEntry_limit_choices_to.objects.create(blog=blog_b, text='bla2')
|
||||
|
||||
|
||||
def test_primary_key_custom_field_problem(self):
|
||||
"""
|
||||
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')
|
||||
Model2D.objects.create(field1='D1', field2='D2', field3='D3', field4='D4')
|
||||
|
||||
|
||||
def test_simple_inheritance(self):
|
||||
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[3]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>')
|
||||
|
||||
|
||||
def test_manual_get_real_instance(self):
|
||||
self.create_model2abcd()
|
||||
|
||||
o = Model2A.objects.non_polymorphic().get(field1='C1')
|
||||
self.assertEqual(repr(o.get_real_instance()), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
|
||||
|
||||
|
||||
def test_non_polymorphic(self):
|
||||
self.create_model2abcd()
|
||||
|
||||
|
|
@ -428,7 +542,6 @@ class PolymorphicTests(TestCase):
|
|||
self.assertEqual(repr(objects[2]), '<Model2A: id 3, field1 (CharField)>')
|
||||
self.assertEqual(repr(objects[3]), '<Model2A: id 4, field1 (CharField)>')
|
||||
|
||||
|
||||
def test_get_real_instances(self):
|
||||
self.create_model2abcd()
|
||||
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[3]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>')
|
||||
|
||||
|
||||
def test_translate_polymorphic_q_object(self):
|
||||
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[1]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>')
|
||||
|
||||
|
||||
def test_base_manager(self):
|
||||
def show_base_manager(model):
|
||||
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(One2OneRelatingModelDerived), "<class 'django.db.models.manager.Manager'> <class 'polymorphic.tests.One2OneRelatingModelDerived'>")
|
||||
|
||||
|
||||
def test_instance_default_manager(self):
|
||||
def show_default_manager(instance):
|
||||
return "{0} {1}".format(
|
||||
|
|
@ -508,7 +618,6 @@ class PolymorphicTests(TestCase):
|
|||
object2b = Model2B.base_objects.get(field1='C1')
|
||||
self.assertEqual(repr(object2b.model2c), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
|
||||
|
||||
|
||||
def test_onetoone_field(self):
|
||||
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(a.one2onerelatingmodel), '<One2OneRelatingModelDerived: One2OneRelatingModelDerived object>')
|
||||
|
||||
|
||||
def test_manytomany_field(self):
|
||||
# Model 1
|
||||
o = ModelShow1.objects.create(field1='abc')
|
||||
|
|
@ -550,7 +658,6 @@ class PolymorphicTests(TestCase):
|
|||
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>]')
|
||||
|
||||
|
||||
def test_extra_method(self):
|
||||
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(len(objects), 3)
|
||||
|
||||
|
||||
def test_instance_of_filter(self):
|
||||
self.create_model2abcd()
|
||||
|
||||
|
|
@ -606,7 +712,6 @@ class PolymorphicTests(TestCase):
|
|||
self.assertEqual(repr(objects[0]), '<Model2A: id 1, field1 (CharField)>')
|
||||
self.assertEqual(len(objects), 1)
|
||||
|
||||
|
||||
def test_polymorphic___filter(self):
|
||||
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[1]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
|
||||
|
||||
|
||||
def test_delete(self):
|
||||
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(len(objects), 3)
|
||||
|
||||
|
||||
def test_combine_querysets(self):
|
||||
ModelX.objects.create(field_x='x')
|
||||
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(len(qs), 2)
|
||||
|
||||
|
||||
def test_multiple_inheritance(self):
|
||||
# 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(len(objects), 2)
|
||||
|
||||
|
||||
def test_user_defined_manager(self):
|
||||
self.create_model2abcd()
|
||||
ModelWithMyManager.objects.create(field1='D1a', field4='D4a')
|
||||
|
|
@ -715,7 +816,6 @@ class PolymorphicTests(TestCase):
|
|||
self.assertEqual(type(ModelWithMyManager2._default_manager).__name__, 'PolymorphicManagerFromMyManagerQuerySet')
|
||||
self.assertIs(type(ModelWithMyManager2.base_objects), models.Manager)
|
||||
|
||||
|
||||
def test_manager_inheritance(self):
|
||||
# by choice of MRO, should be MyManager from MROBase1.
|
||||
self.assertIs(type(MRODerived.objects), MyManager)
|
||||
|
|
@ -726,7 +826,6 @@ class PolymorphicTests(TestCase):
|
|||
# Django vanilla inheritance does not inherit MyManager as _default_manager here
|
||||
self.assertIs(type(MROBase2._default_manager), MyManager)
|
||||
|
||||
|
||||
def test_queryset_assignment(self):
|
||||
# This is just a consistency check for now, testing standard Django behavior.
|
||||
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.
|
||||
self.assertIs(type(parent.childmodel_set.my_queryset_foo()), MyManagerQuerySet)
|
||||
|
||||
|
||||
def test_proxy_models(self):
|
||||
# prepare some data
|
||||
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)
|
||||
self.assertEqual(ProxyChild, ct.model_class())
|
||||
|
||||
|
||||
def test_proxy_model_inheritance(self):
|
||||
"""
|
||||
Polymorphic abilities should also work when the base model is a proxy object.
|
||||
|
|
@ -860,7 +957,6 @@ class PolymorphicTests(TestCase):
|
|||
t.delete()
|
||||
|
||||
|
||||
|
||||
class RegressionTests(TestCase):
|
||||
|
||||
def test_for_query_result_incomplete_with_inheritance(self):
|
||||
|
|
@ -881,4 +977,3 @@ class RegressionTests(TestCase):
|
|||
|
||||
expected_queryset = [bottom]
|
||||
self.assertQuerysetEqual(Bottom.objects.all(), [repr(r) for r in expected_queryset])
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue