def test_formfield_issues_no_queries(self): trait_type = Trait._meta.get_field('trait_type') with self.assertNumQueries(0): formfield = trait_type.formfield() self.assertSetEqual(set(formfield.queryset), { get_content_type(Trait), get_content_type(AcknowledgedTrait), })
def test_invalid_type(self): trait = Trait.objects.create() snake_type = get_content_type(Snake) trait.mammal_type = snake_type trait.snake_type = snake_type with self.assertRaisesMessage( ValidationError, 'Specified content type is not of a subclass of Mammal.'): trait.full_clean()
def test_field_deconstruction(self): test_apps = Apps() class Foo(PolymorphicModel): foo = PolymorphicTypeField('self', on_delete=models.CASCADE) class Meta: apps = test_apps app_label = 'polymodels' class Bar(models.Model): foo = PolymorphicTypeField('Foo', on_delete=models.CASCADE) foo_null = PolymorphicTypeField(Foo, on_delete=models.CASCADE, null=True) foo_default = PolymorphicTypeField( Foo, on_delete=models.CASCADE, default=get_content_type(Foo).pk) class Meta: apps = test_apps app_label = 'polymodels' def django_version_agnostic(deconstruction): # As of Django 1.9+ on_delete is a required parameter and # doesn't default to models.CASCADE anymore. if django.VERSION >= (1, 9): deconstruction['on_delete'] = models.CASCADE return deconstruction self.assertDeconstructionEqual( Foo._meta.get_field('foo'), ('foo', 'polymodels.fields.PolymorphicTypeField', [], django_version_agnostic({ 'polymorphic_type': 'polymodels.Foo', }))) self.assertDeconstructionEqual( Bar._meta.get_field('foo'), ('foo', 'polymodels.fields.PolymorphicTypeField', [], django_version_agnostic({ 'polymorphic_type': 'polymodels.Foo', }))) self.assertDeconstructionEqual( Bar._meta.get_field('foo_null'), ('foo_null', 'polymodels.fields.PolymorphicTypeField', [], django_version_agnostic({ 'polymorphic_type': 'polymodels.Foo', 'null': True, }))) self.assertDeconstructionEqual( Bar._meta.get_field('foo_default'), ('foo_default', 'polymodels.fields.PolymorphicTypeField', [], django_version_agnostic({ 'polymorphic_type': 'polymodels.Foo', 'default': get_content_type(Foo).pk, })))
def test_invalid_type(self): trait = Trait.objects.create() snake_type = get_content_type(Snake) trait.mammal_type = snake_type trait.snake_type = snake_type with self.assertRaisesMessage( ValidationError, 'Specified content type is not of a subclass of Mammal.' ): trait.full_clean()
class Bar(models.Model): foo = PolymorphicTypeField('Foo', on_delete=models.CASCADE) foo_null = PolymorphicTypeField(Foo, on_delete=models.CASCADE, null=True) foo_default = PolymorphicTypeField( Foo, on_delete=models.CASCADE, default=get_content_type(Foo).pk) class Meta: apps = test_apps app_label = 'polymodels'
def test_field_deconstruction(self): test_apps = Apps() class Foo(PolymorphicModel): foo = PolymorphicTypeField('self', on_delete=models.CASCADE) class Meta: apps = test_apps app_label = 'polymodels' class Bar(models.Model): foo = PolymorphicTypeField('Foo', on_delete=models.CASCADE) foo_null = PolymorphicTypeField(Foo, on_delete=models.CASCADE, null=True) foo_default = PolymorphicTypeField( Foo, on_delete=models.CASCADE, default=get_content_type(Foo).pk) class Meta: apps = test_apps app_label = 'polymodels' self.assertDeconstructionEqual( Foo._meta.get_field('foo'), ('foo', 'polymodels.fields.PolymorphicTypeField', [], { 'polymorphic_type': 'polymodels.Foo', 'on_delete': models.CASCADE, })) self.assertDeconstructionEqual( Bar._meta.get_field('foo'), ('foo', 'polymodels.fields.PolymorphicTypeField', [], { 'polymorphic_type': 'polymodels.Foo', 'on_delete': models.CASCADE, })) self.assertDeconstructionEqual( Bar._meta.get_field('foo_null'), ('foo_null', 'polymodels.fields.PolymorphicTypeField', [], { 'polymorphic_type': 'polymodels.Foo', 'null': True, 'on_delete': models.CASCADE, })) self.assertDeconstructionEqual( Bar._meta.get_field('foo_default'), ('foo_default', 'polymodels.fields.PolymorphicTypeField', [], { 'polymorphic_type': 'polymodels.Foo', 'default': get_content_type(Foo).pk, 'on_delete': models.CASCADE, }))
def test_field_deconstruction(self): test_apps = Apps() class Foo(PolymorphicModel): foo = PolymorphicTypeField('self', on_delete=models.CASCADE) class Meta: apps = test_apps app_label = 'polymodels' class Bar(models.Model): foo = PolymorphicTypeField('Foo', on_delete=models.CASCADE) foo_null = PolymorphicTypeField(Foo, on_delete=models.CASCADE, null=True) foo_default = PolymorphicTypeField(Foo, on_delete=models.CASCADE, default=get_content_type(Foo).pk) class Meta: apps = test_apps app_label = 'polymodels' def django_version_agnostic(deconstruction): # As of Django 1.9+ on_delete is a required parameter and # doesn't default to models.CASCADE anymore. if django.VERSION >= (1, 9): deconstruction['on_delete'] = models.CASCADE return deconstruction self.assertDeconstructionEqual(Foo._meta.get_field('foo'), ( 'foo', 'polymodels.fields.PolymorphicTypeField', [], django_version_agnostic({ 'polymorphic_type': 'polymodels.Foo', }) )) self.assertDeconstructionEqual(Bar._meta.get_field('foo'), ( 'foo', 'polymodels.fields.PolymorphicTypeField', [], django_version_agnostic({ 'polymorphic_type': 'polymodels.Foo', }) )) self.assertDeconstructionEqual(Bar._meta.get_field('foo_null'), ( 'foo_null', 'polymodels.fields.PolymorphicTypeField', [], django_version_agnostic({ 'polymorphic_type': 'polymodels.Foo', 'null': True, }) )) self.assertDeconstructionEqual(Bar._meta.get_field('foo_default'), ( 'foo_default', 'polymodels.fields.PolymorphicTypeField', [], django_version_agnostic({ 'polymorphic_type': 'polymodels.Foo', 'default': get_content_type(Foo).pk, }) ))
def test_valid_proxy_subclass(self): trait = Trait.objects.create() trait.trait_type = get_content_type(AcknowledgedTrait) trait.full_clean()
def test_valid_subclass(self): trait = Trait.objects.create() trait.snake_type = get_content_type(HugeSnake) trait.full_clean()
def test_retreival(self): self.assertEqual(self.reference(), get_content_type(Snake).pk)
def get_content_type(self, obj=None, **kwargs): if obj: return get_content_type(obj.__class__, obj._state.db) else: return super(ProxyAwareGenericForeignKey, self).get_content_type(obj, **kwargs)
def get_content_type(cls): return get_content_type(cls)