From 9b275b48d1e9928fe7248943f730bf30c158d981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20M=C3=A9nager?= <herve.menager@pasteur.fr> Date: Mon, 29 Jun 2020 20:03:13 +0200 Subject: [PATCH] Use django-polymorphic to manage ProteinDomainComplex subclasses WIP on #225 --- ..._proteindomaincomplex_polymorphic_ctype.py | 34 +++++++++++++++++++ ippisite/ippidb/models.py | 11 +++++- ippisite/ippisite/settings.py | 1 + ippisite/ippisite/settings.template.py | 1 + ippisite/requirements-core.txt | 1 + 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 ippisite/ippidb/migrations/0064_proteindomaincomplex_polymorphic_ctype.py diff --git a/ippisite/ippidb/migrations/0064_proteindomaincomplex_polymorphic_ctype.py b/ippisite/ippidb/migrations/0064_proteindomaincomplex_polymorphic_ctype.py new file mode 100644 index 00000000..aa4370a4 --- /dev/null +++ b/ippisite/ippidb/migrations/0064_proteindomaincomplex_polymorphic_ctype.py @@ -0,0 +1,34 @@ +# Generated by Django 2.2.1 on 2020-06-29 06:51 + +from django.db import migrations, models +import django.db.models.deletion + + + +def forwards_func(apps, schema_editor): + # add the content type to the classes using django-polymorphic + # i.e. ProteinDomainBoundComplex and ProteinDomainPartnerComplex + # code is adapted from https://django-polymorphic.readthedocs.io/en/stable/migrating.html + ProteinDomainBoundComplex = apps.get_model('ippidb', 'ProteinDomainBoundComplex') + ProteinDomainPartnerComplex = apps.get_model('ippidb', 'ProteinDomainPartnerComplex') + ContentType = apps.get_model('contenttypes', 'ContentType') + pdbc_ct = ContentType.objects.get_for_model(ProteinDomainBoundComplex) + ProteinDomainBoundComplex.objects.filter(polymorphic_ctype__isnull=True).update(polymorphic_ctype=pdbc_ct) + pdpc_ct = ContentType.objects.get_for_model(ProteinDomainPartnerComplex) + ProteinDomainPartnerComplex.objects.filter(polymorphic_ctype__isnull=True).update(polymorphic_ctype=pdpc_ct) + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('ippidb', '0063_fill_drugbank_links'), + ] + + operations = [ + migrations.AddField( + model_name='proteindomaincomplex', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_ippidb.proteindomaincomplex_set+', to='contenttypes.ContentType'), + ), + migrations.RunPython(forwards_func, migrations.RunPython.noop), + ] diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py index fd6d9bde..aa3ce3de 100644 --- a/ippisite/ippidb/models.py +++ b/ippisite/ippidb/models.py @@ -20,6 +20,7 @@ from django.utils.translation import ugettext_lazy as _ from django_celery_results.models import TaskResult from django.dispatch import receiver from django.db.models.signals import post_save +from polymorphic.models import PolymorphicModel from .utils import FingerPrinter, smi2inchi, smi2inchikey from .ws import ( @@ -363,7 +364,7 @@ class ProteinDomainComplexGroup(models.Model): return str(self) -class ProteinDomainComplex(models.Model): +class ProteinDomainComplex(PolymorphicModel): """ Protein-Domain association """ @@ -405,6 +406,10 @@ class ProteinDomainBoundComplex(ProteinDomainComplex): ppp_copy_nb_per_p = models.IntegerField(_("ppp_copy_nb_per_p")) + @property + def complex_type(self): + return "Bound" + class Meta: verbose_name_plural = "bound complexes" @@ -427,6 +432,10 @@ class ProteinDomainPartnerComplex(ProteinDomainComplex): Protein-Domain association with a "partner complex" role """ + @property + def complex_type(self): + return "Partner" + class Meta: verbose_name_plural = "partner complexes" diff --git a/ippisite/ippisite/settings.py b/ippisite/ippisite/settings.py index eae1293b..1cd64c66 100644 --- a/ippisite/ippisite/settings.py +++ b/ippisite/ippisite/settings.py @@ -57,6 +57,7 @@ INSTALLED_APPS = [ "allauth.socialaccount", # "allauth.socialaccount.providers.github", "allauth.socialaccount.providers.orcid", + "polymorphic", ] MIDDLEWARE = [ diff --git a/ippisite/ippisite/settings.template.py b/ippisite/ippisite/settings.template.py index cc738033..8991371a 100644 --- a/ippisite/ippisite/settings.template.py +++ b/ippisite/ippisite/settings.template.py @@ -60,6 +60,7 @@ INSTALLED_APPS = [ "allauth.socialaccount", # "allauth.socialaccount.providers.github", "allauth.socialaccount.providers.orcid", + "polymorphic", ] MIDDLEWARE = [ diff --git a/ippisite/requirements-core.txt b/ippisite/requirements-core.txt index f1744c72..3cde9a19 100644 --- a/ippisite/requirements-core.txt +++ b/ippisite/requirements-core.txt @@ -28,3 +28,4 @@ git+https://gitlab.pasteur.fr/hmenager/django-diu.git#egg=django_diu #openbabel django-crispy-forms celery +django-polymorphic \ No newline at end of file -- GitLab