From 93390b349b01a1385643c64c411d344f4c1eb067 Mon Sep 17 00:00:00 2001 From: Tim Lorsbach Date: Thu, 12 Feb 2026 14:03:10 +0100 Subject: [PATCH] Initial --- bayer/__init__.py | 0 bayer/admin.py | 3 + bayer/apps.py | 6 + bayer/migrations/0001_initial.py | 35 + bayer/migrations/0002_initial.py | 22 + bayer/migrations/__init__.py | 0 bayer/models.py | 95 ++ bayer/templates/objects/package.html | 97 ++ bayer/tests.py | 3 + bayer/views.py | 3 + envipath/settings.py | 8 +- epdb/migrations/0001_initial.py | 336 ++++-- ...abilitydomain_url_compound_url_and_more.py | 1020 ----------------- ...111_1413.py => 0002_auto_20260212_1240.py} | 4 +- ...atabase_alter_apitoken_options_and_more.py | 128 --- ...abilitydomain_url_compound_url_and_more.py | 228 ---- ...er_mlrelativereasoning_options_and_more.py | 55 - .../0005_alter_group_group_member.py | 18 - ...elativereasoning_multigen_eval_and_more.py | 23 - ..._options_enviformer_app_domain_and_more.py | 53 - epdb/migrations/0008_enzymelink.py | 64 -- epdb/migrations/0009_joblog.py | 66 -- epdb/migrations/0010_license_cc_string.py | 18 - ...2_node_stereo_removed_pathway_predicted.py | 22 - .../0013_setting_expansion_schema.py | 25 - ...pansion_schema_setting_expansion_scheme.py | 17 - epdb/migrations/0015_user_is_reviewer.py | 17 - 27 files changed, 495 insertions(+), 1871 deletions(-) create mode 100644 bayer/__init__.py create mode 100644 bayer/admin.py create mode 100644 bayer/apps.py create mode 100644 bayer/migrations/0001_initial.py create mode 100644 bayer/migrations/0002_initial.py create mode 100644 bayer/migrations/__init__.py create mode 100644 bayer/models.py create mode 100644 bayer/templates/objects/package.html create mode 100644 bayer/tests.py create mode 100644 bayer/views.py delete mode 100644 epdb/migrations/0001_squashed_0003_applicabilitydomain_url_compound_url_and_more.py rename epdb/migrations/{0011_auto_20251111_1413.py => 0002_auto_20260212_1240.py} (95%) delete mode 100644 epdb/migrations/0002_externaldatabase_alter_apitoken_options_and_more.py delete mode 100644 epdb/migrations/0003_applicabilitydomain_url_compound_url_and_more.py delete mode 100644 epdb/migrations/0004_alter_mlrelativereasoning_options_and_more.py delete mode 100644 epdb/migrations/0005_alter_group_group_member.py delete mode 100644 epdb/migrations/0006_mlrelativereasoning_multigen_eval_and_more.py delete mode 100644 epdb/migrations/0007_alter_enviformer_options_enviformer_app_domain_and_more.py delete mode 100644 epdb/migrations/0008_enzymelink.py delete mode 100644 epdb/migrations/0009_joblog.py delete mode 100644 epdb/migrations/0010_license_cc_string.py delete mode 100644 epdb/migrations/0012_node_stereo_removed_pathway_predicted.py delete mode 100644 epdb/migrations/0013_setting_expansion_schema.py delete mode 100644 epdb/migrations/0014_rename_expansion_schema_setting_expansion_scheme.py delete mode 100644 epdb/migrations/0015_user_is_reviewer.py diff --git a/bayer/__init__.py b/bayer/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bayer/admin.py b/bayer/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/bayer/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/bayer/apps.py b/bayer/apps.py new file mode 100644 index 00000000..3821be18 --- /dev/null +++ b/bayer/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BayerConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'bayer' diff --git a/bayer/migrations/0001_initial.py b/bayer/migrations/0001_initial.py new file mode 100644 index 00000000..7ae66197 --- /dev/null +++ b/bayer/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# Generated by Django 5.2.7 on 2026-02-12 12:36 + +import django.utils.timezone +import model_utils.fields +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Package', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), + ('name', models.TextField(default='no name', verbose_name='Name')), + ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), + ('kv', models.JSONField(blank=True, default=dict, null=True)), + ('reviewed', models.BooleanField(default=False, verbose_name='Reviewstatus')), + ('classification_level', models.IntegerField(choices=[(0, 'Internal'), (10, 'Restricted'), (20, 'Secret')], default=10)), + ], + options={ + 'db_table': 'epdb_package', + }, + ), + ] diff --git a/bayer/migrations/0002_initial.py b/bayer/migrations/0002_initial.py new file mode 100644 index 00000000..83b8d7b0 --- /dev/null +++ b/bayer/migrations/0002_initial.py @@ -0,0 +1,22 @@ +# Generated by Django 5.2.7 on 2026-02-12 12:36 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('bayer', '0001_initial'), + ('epdb', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='package', + name='license', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.license', verbose_name='License'), + ), + ] diff --git a/bayer/migrations/__init__.py b/bayer/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bayer/models.py b/bayer/models.py new file mode 100644 index 00000000..07f499da --- /dev/null +++ b/bayer/models.py @@ -0,0 +1,95 @@ +from typing import List + +from django.conf import settings as s +from django.db import models +from django.db.models import QuerySet + +from epdb.models import ( + EnviPathModel, + ParallelRule, + SequentialRule, + SimpleAmbitRule, + SimpleRDKitRule, +) + + +class Package(EnviPathModel): + reviewed = models.BooleanField(verbose_name="Reviewstatus", default=False) + license = models.ForeignKey( + "epdb.License", on_delete=models.SET_NULL, blank=True, null=True, verbose_name="License" + ) + + class Classification(models.IntegerChoices): + INTERNAL = 0, "Internal" + RESTRICTED = 10 , "Restricted" + SECRET = 20, "Secret" + + classification_level = models.IntegerField( + choices=Classification, + default=Classification.RESTRICTED, + ) + + def delete(self, *args, **kwargs): + # explicitly handle related Rules + for r in self.rules.all(): + r.delete() + super().delete(*args, **kwargs) + + def __str__(self): + return f"{self.name} (pk={self.pk})" + + @property + def compounds(self) -> QuerySet: + return self.compound_set.all() + + @property + def rules(self) -> QuerySet: + return self.rule_set.all() + + @property + def reactions(self) -> QuerySet: + return self.reaction_set.all() + + @property + def pathways(self) -> QuerySet: + return self.pathway_set.all() + + @property + def scenarios(self) -> QuerySet: + return self.scenario_set.all() + + @property + def models(self) -> QuerySet: + return self.epmodel_set.all() + + def _url(self): + return "{}/package/{}".format(s.SERVER_URL, self.uuid) + + def get_applicable_rules(self) -> List["Rule"]: + """ + Returns a ordered set of rules where the following applies: + 1. All Composite will be added to result + 2. All SimpleRules will be added if theres no CompositeRule present using the SimpleRule + Ordering is based on "url" field. + """ + rules = [] + rule_qs = self.rules + + reflected_simple_rules = set() + + for r in rule_qs: + if isinstance(r, ParallelRule) or isinstance(r, SequentialRule): + rules.append(r) + for sr in r.simple_rules.all(): + reflected_simple_rules.add(sr) + + for r in rule_qs: + if isinstance(r, SimpleAmbitRule) or isinstance(r, SimpleRDKitRule): + if r not in reflected_simple_rules: + rules.append(r) + + rules = sorted(rules, key=lambda x: x.url) + return rules + + class Meta: + db_table = "epdb_package" \ No newline at end of file diff --git a/bayer/templates/objects/package.html b/bayer/templates/objects/package.html new file mode 100644 index 00000000..001785a2 --- /dev/null +++ b/bayer/templates/objects/package.html @@ -0,0 +1,97 @@ +{% extends "framework_modern.html" %} + +{% block content %} + + {% block action_modals %} + {% include "modals/objects/edit_package_modal.html" %} + {% include "modals/objects/edit_package_permissions_modal.html" %} + {% include "modals/objects/publish_package_modal.html" %} + {% include "modals/objects/set_license_modal.html" %} + {% include "modals/objects/export_package_modal.html" %} + {% include "modals/objects/generic_delete_modal.html" %} + {% endblock action_modals %} + +
+ +
+
+
+

{{ package.name }} - {{ package.get_classification_level_display }}

+ +
+

{{ package.description|safe }}

+ +
+
+
+ + +{% endblock content %} diff --git a/bayer/tests.py b/bayer/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/bayer/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/bayer/views.py b/bayer/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/bayer/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/envipath/settings.py b/envipath/settings.py index 8d7ff657..b7361eab 100644 --- a/envipath/settings.py +++ b/envipath/settings.py @@ -53,6 +53,7 @@ INSTALLED_APPS = [ "epapi", # API endpoints (v1, etc.) "epdb", "migration", + "bayer", ] TENANT = os.environ.get("TENANT", "public") @@ -93,10 +94,15 @@ if os.environ.get("REGISTRATION_MANDATORY", False) == "True": ROOT_URLCONF = "envipath.urls" +TEMPLATE_DIRS = [ + os.path.join(BASE_DIR, "bayer", "templates"), + os.path.join(BASE_DIR, "templates"), +] + TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": (os.path.join(BASE_DIR, "templates"),), + "DIRS": TEMPLATE_DIRS, "APP_DIRS": True, "OPTIONS": { "context_processors": [ diff --git a/epdb/migrations/0001_initial.py b/epdb/migrations/0001_initial.py index e6cc4f69..6b788ac1 100644 --- a/epdb/migrations/0001_initial.py +++ b/epdb/migrations/0001_initial.py @@ -1,6 +1,5 @@ -# Generated by Django 5.2.1 on 2025-07-22 20:58 +# Generated by Django 5.2.7 on 2026-02-12 12:36 -import datetime import django.contrib.auth.models import django.contrib.auth.validators import django.contrib.postgres.fields @@ -19,11 +18,12 @@ class Migration(migrations.Migration): dependencies = [ ('auth', '0012_alter_user_first_name_max_length'), ('contenttypes', '0002_remove_content_type_name'), + migrations.swappable_dependency(settings.EPDB_PACKAGE_MODEL), ] operations = [ migrations.CreateModel( - name='Compound', + name='ApplicabilityDomain', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), @@ -31,9 +31,33 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), + ('kv', models.JSONField(blank=True, default=dict, null=True)), + ('num_neighbours', models.IntegerField(default=5)), + ('reliability_threshold', models.FloatField(default=0.5)), + ('local_compatibilty_threshold', models.FloatField(default=0.5)), + ('functional_groups', models.JSONField(blank=True, default=dict, null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Edge', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), + ('name', models.TextField(default='no name', verbose_name='Name')), + ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), ('aliases', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, verbose_name='Aliases')), ], + options={ + 'abstract': False, + }, ), migrations.CreateModel( name='EPModel', @@ -44,7 +68,9 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Package')), ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype')), ], options={ @@ -52,6 +78,27 @@ class Migration(migrations.Migration): 'base_manager_name': 'objects', }, ), + migrations.CreateModel( + name='ExternalDatabase', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('name', models.CharField(max_length=100, unique=True, verbose_name='Database Name')), + ('full_name', models.CharField(blank=True, max_length=255, verbose_name='Full Database Name')), + ('description', models.TextField(blank=True, verbose_name='Description')), + ('base_url', models.URLField(blank=True, null=True, verbose_name='Base URL')), + ('url_pattern', models.CharField(blank=True, help_text="URL pattern with {id} placeholder, e.g., 'https://pubchem.ncbi.nlm.nih.gov/compound/{id}'", max_length=500, verbose_name='URL Pattern')), + ('is_active', models.BooleanField(default=True, verbose_name='Is Active')), + ], + options={ + 'verbose_name': 'External Database', + 'verbose_name_plural': 'External Databases', + 'db_table': 'epdb_external_database', + 'ordering': ['name'], + }, + ), migrations.CreateModel( name='Permission', fields=[ @@ -65,6 +112,7 @@ class Migration(migrations.Migration): name='License', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cc_string', models.TextField(verbose_name='CC string')), ('link', models.URLField(verbose_name='link')), ('image_link', models.URLField(verbose_name='Image link')), ], @@ -78,8 +126,11 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), ('aliases', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, verbose_name='Aliases')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Package')), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype')), ], options={ 'abstract': False, @@ -101,6 +152,9 @@ class Migration(migrations.Migration): ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('email', models.EmailField(max_length=254, unique=True)), ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), + ('is_reviewer', models.BooleanField(default=False)), + ('default_package', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Default Package')), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), ], @@ -117,11 +171,34 @@ class Migration(migrations.Migration): name='APIToken', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('hashed_key', models.CharField(max_length=128, unique=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('expires_at', models.DateTimeField(blank=True, default=datetime.datetime(2025, 10, 20, 20, 58, 48, 351675, tzinfo=datetime.timezone.utc), null=True)), - ('name', models.CharField(blank=True, help_text='Optional name for the token', max_length=100)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('hashed_key', models.CharField(help_text='SHA-256 hash of the token key', max_length=128, unique=True)), + ('expires_at', models.DateTimeField(blank=True, help_text='Token expiration time (null for no expiration)', null=True)), + ('name', models.CharField(help_text='Descriptive name for this token', max_length=100)), + ('is_active', models.BooleanField(default=True, help_text='Whether this token is active')), + ('user', models.ForeignKey(help_text='User who owns this token', on_delete=django.db.models.deletion.CASCADE, related_name='api_tokens', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'API Token', + 'verbose_name_plural': 'API Tokens', + 'db_table': 'epdb_api_token', + 'ordering': ['-created'], + }, + ), + migrations.CreateModel( + name='Compound', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), + ('name', models.TextField(default='no name', verbose_name='Name')), + ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), + ('kv', models.JSONField(blank=True, default=dict, null=True)), + ('aliases', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, verbose_name='Aliases')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Package')), ], ), migrations.CreateModel( @@ -133,6 +210,7 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), ('aliases', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, verbose_name='Aliases')), ('smiles', models.TextField(verbose_name='SMILES')), @@ -150,36 +228,6 @@ class Migration(migrations.Migration): name='default_structure', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='compound_default_structure', to='epdb.compoundstructure', verbose_name='Default Structure'), ), - migrations.CreateModel( - name='Edge', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('aliases', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, verbose_name='Aliases')), - ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - ), - migrations.CreateModel( - name='EnviFormer', - fields=[ - ('epmodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='epdb.epmodel')), - ('threshold', models.FloatField(default=0.5)), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.epmodel',), - ), migrations.CreateModel( name='PluginModel', fields=[ @@ -191,17 +239,6 @@ class Migration(migrations.Migration): }, bases=('epdb.epmodel',), ), - migrations.CreateModel( - name='RuleBaseRelativeReasoning', - fields=[ - ('epmodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='epdb.epmodel')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.epmodel',), - ), migrations.CreateModel( name='Group', fields=[ @@ -209,10 +246,11 @@ class Migration(migrations.Migration): ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('name', models.TextField(verbose_name='Group name')), ('public', models.BooleanField(default=False, verbose_name='Public Group')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('group_member', models.ManyToManyField(related_name='groups_in_group', to='epdb.group', verbose_name='Group member')), + ('group_member', models.ManyToManyField(blank=True, related_name='groups_in_group', to='epdb.group', verbose_name='Group member')), ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Group Owner')), ('user_member', models.ManyToManyField(related_name='users_in_group', to=settings.AUTH_USER_MODEL, verbose_name='User members')), ], @@ -225,6 +263,41 @@ class Migration(migrations.Migration): name='default_group', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_group', to='epdb.group', verbose_name='Default Group'), ), + migrations.CreateModel( + name='JobLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('task_id', models.UUIDField(unique=True)), + ('job_name', models.TextField()), + ('status', models.CharField(choices=[('INITIAL', 'Initial'), ('SUCCESS', 'Success'), ('FAILURE', 'Failure'), ('REVOKED', 'Revoked'), ('IGNORED', 'Ignored')], default='INITIAL', max_length=20)), + ('done_at', models.DateTimeField(blank=True, default=None, null=True)), + ('task_result', models.TextField(blank=True, default=None, null=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Package', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), + ('name', models.TextField(default='no name', verbose_name='Name')), + ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), + ('kv', models.JSONField(blank=True, default=dict, null=True)), + ('reviewed', models.BooleanField(default=False, verbose_name='Reviewstatus')), + ('license', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.license', verbose_name='License')), + ], + options={ + 'swappable': 'EPDB_PACKAGE_MODEL', + }, + ), migrations.CreateModel( name='Node', fields=[ @@ -234,9 +307,11 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), ('aliases', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, verbose_name='Aliases')), ('depth', models.IntegerField(verbose_name='Node depth')), + ('stereo_removed', models.BooleanField(default=False)), ('default_node_label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='default_node_structure', to='epdb.compoundstructure', verbose_name='Default Node Label')), ('node_labels', models.ManyToManyField(related_name='node_structures', to='epdb.compoundstructure', verbose_name='All Node Labels')), ('out_edges', models.ManyToManyField(to='epdb.edge', verbose_name='Outgoing Edges')), @@ -255,38 +330,6 @@ class Migration(migrations.Migration): name='start_nodes', field=models.ManyToManyField(related_name='edge_educts', to='epdb.node', verbose_name='Start Nodes'), ), - migrations.CreateModel( - name='Package', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('reviewed', models.BooleanField(default=False, verbose_name='Reviewstatus')), - ('license', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.license', verbose_name='License')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='epmodel', - name='package', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', verbose_name='Package'), - ), - migrations.AddField( - model_name='compound', - name='package', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', verbose_name='Package'), - ), - migrations.AddField( - model_name='user', - name='default_package', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.package', verbose_name='Default Package'), - ), migrations.CreateModel( name='SequentialRule', fields=[ @@ -309,16 +352,6 @@ class Migration(migrations.Migration): }, bases=('epdb.rule',), ), - migrations.AddField( - model_name='rule', - name='package', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', verbose_name='Package'), - ), - migrations.AddField( - model_name='rule', - name='polymorphic_ctype', - field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype'), - ), migrations.CreateModel( name='Pathway', fields=[ @@ -328,9 +361,11 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), ('aliases', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, verbose_name='Aliases')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', verbose_name='Package')), + ('predicted', models.BooleanField(default=False)), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Package')), ], options={ 'abstract': False, @@ -355,12 +390,13 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), ('aliases', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, verbose_name='Aliases')), ('multi_step', models.BooleanField(verbose_name='Multistep Reaction')), ('medline_references', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), null=True, size=None, verbose_name='Medline References')), ('educts', models.ManyToManyField(related_name='reaction_educts', to='epdb.compoundstructure', verbose_name='Educts')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', verbose_name='Package')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Package')), ('products', models.ManyToManyField(related_name='reaction_products', to='epdb.compoundstructure', verbose_name='Products')), ('rules', models.ManyToManyField(related_name='reaction_rule', to='epdb.rule', verbose_name='Rule')), ], @@ -368,6 +404,28 @@ class Migration(migrations.Migration): 'abstract': False, }, ), + migrations.CreateModel( + name='EnzymeLink', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), + ('name', models.TextField(default='no name', verbose_name='Name')), + ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), + ('kv', models.JSONField(blank=True, default=dict, null=True)), + ('ec_number', models.TextField(verbose_name='EC Number')), + ('classification_level', models.IntegerField(verbose_name='Classification Level')), + ('linking_method', models.TextField(verbose_name='Linking Method')), + ('edge_evidence', models.ManyToManyField(to='epdb.edge')), + ('rule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.rule')), + ('reaction_evidence', models.ManyToManyField(to='epdb.reaction')), + ], + options={ + 'abstract': False, + }, + ), migrations.AddField( model_name='edge', name='edge_label', @@ -382,11 +440,12 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), ('scenario_date', models.CharField(default='No date', max_length=256)), ('scenario_type', models.CharField(default='Not specified', max_length=256)), ('additional_information', models.JSONField(verbose_name='Additional Information')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', verbose_name='Package')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Package')), ('parent', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='epdb.scenario')), ], options={ @@ -437,14 +496,16 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), ('name', models.TextField(default='no name', verbose_name='Name')), ('description', models.TextField(default='no description', verbose_name='Descriptions')), + ('url', models.TextField(null=True, unique=True, verbose_name='URL')), ('kv', models.JSONField(blank=True, default=dict, null=True)), ('public', models.BooleanField(default=False)), ('global_default', models.BooleanField(default=False)), ('max_depth', models.IntegerField(default=5, verbose_name='Setting Max Depth')), ('max_nodes', models.IntegerField(default=30, verbose_name='Setting Max Number of Nodes')), ('model_threshold', models.FloatField(blank=True, default=0.25, null=True, verbose_name='Setting Model Threshold')), + ('expansion_scheme', models.CharField(choices=[('BFS', 'Breadth First Search'), ('DFS', 'Depth First Search'), ('GREEDY', 'Greedy')], default='BFS', max_length=20)), ('model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.epmodel', verbose_name='Setting EPModel')), - ('rule_packages', models.ManyToManyField(blank=True, related_name='setting_rule_packages', to='epdb.package', verbose_name='Setting Rule Packages')), + ('rule_packages', models.ManyToManyField(blank=True, related_name='setting_rule_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Setting Rule Packages')), ], options={ 'abstract': False, @@ -461,39 +522,86 @@ class Migration(migrations.Migration): field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.setting', verbose_name='The users default settings'), ), migrations.CreateModel( - name='MLRelativeReasoning', + name='EnviFormer', fields=[ ('epmodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='epdb.epmodel')), ('threshold', models.FloatField(default=0.5)), - ('model_status', models.CharField(choices=[('INITIAL', 'Initial'), ('INITIALIZING', 'Model is initializing.'), ('BUILDING', 'Model is building.'), ('BUILT_NOT_EVALUATED', 'Model is built and can be used for predictions, Model is not evaluated yet.'), ('EVALUATING', 'Model is evaluating'), ('FINISHED', 'Model has finished building and evaluation.'), ('ERROR', 'Model has failed.')], default='INITIAL')), ('eval_results', models.JSONField(blank=True, default=dict, null=True)), - ('data_packages', models.ManyToManyField(related_name='data_packages', to='epdb.package', verbose_name='Data Packages')), - ('eval_packages', models.ManyToManyField(related_name='eval_packages', to='epdb.package', verbose_name='Evaluation Packages')), - ('rule_packages', models.ManyToManyField(related_name='rule_packages', to='epdb.package', verbose_name='Rule Packages')), + ('multigen_eval', models.BooleanField(default=False)), + ('model_status', models.CharField(choices=[('INITIAL', 'Initial'), ('INITIALIZING', 'Model is initializing.'), ('BUILDING', 'Model is building.'), ('BUILT_NOT_EVALUATED', 'Model is built and can be used for predictions, Model is not evaluated yet.'), ('EVALUATING', 'Model is evaluating'), ('FINISHED', 'Model has finished building and evaluation.'), ('ERROR', 'Model has failed.')], default='INITIAL')), + ('app_domain', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.applicabilitydomain')), + ('data_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_data_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Data Packages')), + ('eval_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_eval_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Evaluation Packages')), + ('rule_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_rule_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Rule Packages')), ], options={ 'abstract': False, - 'base_manager_name': 'objects', }, bases=('epdb.epmodel',), ), migrations.CreateModel( - name='ApplicabilityDomain', + name='MLRelativeReasoning', + fields=[ + ('epmodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='epdb.epmodel')), + ('threshold', models.FloatField(default=0.5)), + ('eval_results', models.JSONField(blank=True, default=dict, null=True)), + ('multigen_eval', models.BooleanField(default=False)), + ('model_status', models.CharField(choices=[('INITIAL', 'Initial'), ('INITIALIZING', 'Model is initializing.'), ('BUILDING', 'Model is building.'), ('BUILT_NOT_EVALUATED', 'Model is built and can be used for predictions, Model is not evaluated yet.'), ('EVALUATING', 'Model is evaluating'), ('FINISHED', 'Model has finished building and evaluation.'), ('ERROR', 'Model has failed.')], default='INITIAL')), + ('app_domain', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.applicabilitydomain')), + ('data_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_data_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Data Packages')), + ('eval_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_eval_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Evaluation Packages')), + ('rule_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_rule_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Rule Packages')), + ], + options={ + 'abstract': False, + }, + bases=('epdb.epmodel',), + ), + migrations.AddField( + model_name='applicabilitydomain', + name='model', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.mlrelativereasoning'), + ), + migrations.CreateModel( + name='RuleBasedRelativeReasoning', + fields=[ + ('epmodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='epdb.epmodel')), + ('threshold', models.FloatField(default=0.5)), + ('eval_results', models.JSONField(blank=True, default=dict, null=True)), + ('multigen_eval', models.BooleanField(default=False)), + ('model_status', models.CharField(choices=[('INITIAL', 'Initial'), ('INITIALIZING', 'Model is initializing.'), ('BUILDING', 'Model is building.'), ('BUILT_NOT_EVALUATED', 'Model is built and can be used for predictions, Model is not evaluated yet.'), ('EVALUATING', 'Model is evaluating'), ('FINISHED', 'Model has finished building and evaluation.'), ('ERROR', 'Model has failed.')], default='INITIAL')), + ('min_count', models.IntegerField(default=10)), + ('max_count', models.IntegerField(default=0)), + ('app_domain', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.applicabilitydomain')), + ('data_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_data_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Data Packages')), + ('eval_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_eval_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Evaluation Packages')), + ('rule_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_rule_packages', to=settings.EPDB_PACKAGE_MODEL, verbose_name='Rule Packages')), + ], + options={ + 'abstract': False, + }, + bases=('epdb.epmodel',), + ), + migrations.CreateModel( + name='ExternalIdentifier', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('num_neighbours', models.FloatField(default=5)), - ('reliability_threshold', models.FloatField(default=0.5)), - ('local_compatibilty_threshold', models.FloatField(default=0.5)), - ('model', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.mlrelativereasoning')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('object_id', models.IntegerField()), + ('identifier_value', models.CharField(max_length=255, verbose_name='Identifier Value')), + ('url', models.URLField(blank=True, null=True, verbose_name='Direct URL')), + ('is_primary', models.BooleanField(default=False, help_text='Mark this as the primary identifier for this database', verbose_name='Is Primary')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), + ('database', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.externaldatabase', verbose_name='External Database')), ], options={ - 'abstract': False, + 'verbose_name': 'External Identifier', + 'verbose_name_plural': 'External Identifiers', + 'db_table': 'epdb_external_identifier', + 'indexes': [models.Index(fields=['content_type', 'object_id'], name='epdb_extern_content_b76813_idx'), models.Index(fields=['database', 'identifier_value'], name='epdb_extern_databas_486422_idx')], + 'unique_together': {('content_type', 'object_id', 'database', 'identifier_value')}, }, ), migrations.CreateModel( @@ -558,7 +666,7 @@ class Migration(migrations.Migration): ('permission_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='epdb.permission')), ('uuid', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False, verbose_name='UUID of this object')), ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.group', verbose_name='Permission to')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', verbose_name='Permission on')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Permission on')), ], options={ 'unique_together': {('package', 'group')}, @@ -570,7 +678,7 @@ class Migration(migrations.Migration): fields=[ ('permission_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='epdb.permission')), ('uuid', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False, verbose_name='UUID of this object')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', verbose_name='Permission on')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.EPDB_PACKAGE_MODEL, verbose_name='Permission on')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Permission to')), ], options={ diff --git a/epdb/migrations/0001_squashed_0003_applicabilitydomain_url_compound_url_and_more.py b/epdb/migrations/0001_squashed_0003_applicabilitydomain_url_compound_url_and_more.py deleted file mode 100644 index a6eb8f50..00000000 --- a/epdb/migrations/0001_squashed_0003_applicabilitydomain_url_compound_url_and_more.py +++ /dev/null @@ -1,1020 +0,0 @@ -# Generated by Django 5.2.1 on 2025-08-26 18:11 - -import django.contrib.auth.models -import django.contrib.auth.validators -import django.contrib.postgres.fields -import django.db.migrations.operations.special -import django.db.models.deletion -import django.utils.timezone -import model_utils.fields -import uuid -from django.conf import settings -from django.db import migrations, models - - -def populate_url(apps, schema_editor): - MODELS = [ - 'User', - 'Group', - 'Package', - 'Compound', - 'CompoundStructure', - 'Pathway', - 'Edge', - 'Node', - 'Reaction', - 'SimpleAmbitRule', - 'SimpleRDKitRule', - 'ParallelRule', - 'SequentialRule', - 'Scenario', - 'Setting', - 'MLRelativeReasoning', - 'EnviFormer', - 'ApplicabilityDomain', - ] - for model in MODELS: - obj_cls = apps.get_model("epdb", model) - for obj in obj_cls.objects.all(): - obj.url = assemble_url(obj) - if obj.url is None: - raise ValueError(f"Could not assemble url for {obj}") - obj.save() - - -def assemble_url(obj): - from django.conf import settings as s - match obj.__class__.__name__: - case 'User': - return '{}/user/{}'.format(s.SERVER_URL, obj.uuid) - case 'Group': - return '{}/group/{}'.format(s.SERVER_URL, obj.uuid) - case 'Package': - return '{}/package/{}'.format(s.SERVER_URL, obj.uuid) - case 'Compound': - return '{}/compound/{}'.format(obj.package.url, obj.uuid) - case 'CompoundStructure': - return '{}/structure/{}'.format(obj.compound.url, obj.uuid) - case 'SimpleAmbitRule': - return '{}/simple-ambit-rule/{}'.format(obj.package.url, obj.uuid) - case 'SimpleRDKitRule': - return '{}/simple-rdkit-rule/{}'.format(obj.package.url, obj.uuid) - case 'ParallelRule': - return '{}/parallel-rule/{}'.format(obj.package.url, obj.uuid) - case 'SequentialRule': - return '{}/sequential-rule/{}'.format(obj.compound.url, obj.uuid) - case 'Reaction': - return '{}/reaction/{}'.format(obj.package.url, obj.uuid) - case 'Pathway': - return '{}/pathway/{}'.format(obj.package.url, obj.uuid) - case 'Node': - return '{}/node/{}'.format(obj.pathway.url, obj.uuid) - case 'Edge': - return '{}/edge/{}'.format(obj.pathway.url, obj.uuid) - case 'MLRelativeReasoning': - return '{}/model/{}'.format(obj.package.url, obj.uuid) - case 'EnviFormer': - return '{}/model/{}'.format(obj.package.url, obj.uuid) - case 'ApplicabilityDomain': - return '{}/model/{}/applicability-domain/{}'.format(obj.model.package.url, obj.model.uuid, obj.uuid) - case 'Scenario': - return '{}/scenario/{}'.format(obj.package.url, obj.uuid) - case 'Setting': - return '{}/setting/{}'.format(s.SERVER_URL, obj.uuid) - case _: - raise ValueError(f"Unknown model {obj.__class__.__name__}") - - -class Migration(migrations.Migration): - replaces = [('epdb', '0001_initial'), ('epdb', '0002_externaldatabase_alter_apitoken_options_and_more'), - ('epdb', '0003_applicabilitydomain_url_compound_url_and_more')] - - initial = True - - dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ('contenttypes', '0002_remove_content_type_name'), - ] - - operations = [ - migrations.CreateModel( - name='Compound', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('aliases', - django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, - verbose_name='Aliases')), - ], - ), - migrations.CreateModel( - name='EPModel', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('polymorphic_ctype', - models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='polymorphic_%(app_label)s.%(class)s_set+', - to='contenttypes.contenttype')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - ), - migrations.CreateModel( - name='Permission', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('permission', - models.CharField(choices=[('read', 'Read'), ('write', 'Write'), ('all', 'All')], max_length=32)), - ], - ), - migrations.CreateModel( - name='License', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('link', models.URLField(verbose_name='link')), - ('image_link', models.URLField(verbose_name='Image link')), - ], - ), - migrations.CreateModel( - name='Rule', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('aliases', - django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, - verbose_name='Aliases')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - ), - migrations.CreateModel( - name='User', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, - help_text='Designates that this user has all permissions without explicitly assigning them.', - verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, - help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', - max_length=150, unique=True, - validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], - verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('is_staff', models.BooleanField(default=False, - help_text='Designates whether the user can log into this admin site.', - verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, - help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', - verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('email', models.EmailField(max_length=254, unique=True)), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('groups', models.ManyToManyField(blank=True, - help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', - related_name='user_set', related_query_name='user', to='auth.group', - verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', - related_name='user_set', related_query_name='user', - to='auth.permission', verbose_name='user permissions')), - ], - options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, - }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - migrations.CreateModel( - name='CompoundStructure', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('aliases', - django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, - verbose_name='Aliases')), - ('smiles', models.TextField(verbose_name='SMILES')), - ('canonical_smiles', models.TextField(verbose_name='Canonical SMILES')), - ('inchikey', models.TextField(max_length=27, verbose_name='InChIKey')), - ('normalized_structure', models.BooleanField(default=False)), - ('compound', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.compound')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='compound', - name='default_structure', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='compound_default_structure', to='epdb.compoundstructure', - verbose_name='Default Structure'), - ), - migrations.CreateModel( - name='Edge', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('aliases', - django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, - verbose_name='Aliases')), - ('polymorphic_ctype', - models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='polymorphic_%(app_label)s.%(class)s_set+', - to='contenttypes.contenttype')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - ), - migrations.CreateModel( - name='EnviFormer', - fields=[ - ('epmodel_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.epmodel')), - ('threshold', models.FloatField(default=0.5)), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.epmodel',), - ), - migrations.CreateModel( - name='PluginModel', - fields=[ - ('epmodel_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.epmodel')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.epmodel',), - ), - migrations.CreateModel( - name='RuleBaseRelativeReasoning', - fields=[ - ('epmodel_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.epmodel')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.epmodel',), - ), - migrations.CreateModel( - name='Group', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(verbose_name='Group name')), - ('public', models.BooleanField(default=False, verbose_name='Public Group')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('group_member', - models.ManyToManyField(related_name='groups_in_group', to='epdb.group', verbose_name='Group member')), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, - verbose_name='Group Owner')), - ('user_member', models.ManyToManyField(related_name='users_in_group', to=settings.AUTH_USER_MODEL, - verbose_name='User members')), - ('url', models.TextField(null=True, verbose_name='URL')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='user', - name='default_group', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, - related_name='default_group', to='epdb.group', verbose_name='Default Group'), - ), - migrations.CreateModel( - name='Node', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('aliases', - django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, - verbose_name='Aliases')), - ('depth', models.IntegerField(verbose_name='Node depth')), - ('default_node_label', - models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='default_node_structure', - to='epdb.compoundstructure', verbose_name='Default Node Label')), - ('node_labels', models.ManyToManyField(related_name='node_structures', to='epdb.compoundstructure', - verbose_name='All Node Labels')), - ('out_edges', models.ManyToManyField(to='epdb.edge', verbose_name='Outgoing Edges')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='edge', - name='end_nodes', - field=models.ManyToManyField(related_name='edge_products', to='epdb.node', verbose_name='End Nodes'), - ), - migrations.AddField( - model_name='edge', - name='start_nodes', - field=models.ManyToManyField(related_name='edge_educts', to='epdb.node', verbose_name='Start Nodes'), - ), - migrations.CreateModel( - name='Package', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('reviewed', models.BooleanField(default=False, verbose_name='Reviewstatus')), - ('license', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, - to='epdb.license', verbose_name='License')), - ('url', models.TextField(null=True, verbose_name='URL')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='epmodel', - name='package', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', - verbose_name='Package'), - ), - migrations.AddField( - model_name='compound', - name='package', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', - verbose_name='Package'), - ), - migrations.AddField( - model_name='user', - name='default_package', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.package', - verbose_name='Default Package'), - ), - migrations.CreateModel( - name='SequentialRule', - fields=[ - ('rule_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.rule')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.rule',), - ), - migrations.CreateModel( - name='SimpleRule', - fields=[ - ('rule_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.rule')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.rule',), - ), - migrations.AddField( - model_name='rule', - name='package', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', - verbose_name='Package'), - ), - migrations.AddField( - model_name='rule', - name='polymorphic_ctype', - field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='polymorphic_%(app_label)s.%(class)s_set+', - to='contenttypes.contenttype'), - ), - migrations.CreateModel( - name='Pathway', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('aliases', - django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, - verbose_name='Aliases')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', - verbose_name='Package')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='node', - name='pathway', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.pathway', - verbose_name='belongs to'), - ), - migrations.AddField( - model_name='edge', - name='pathway', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.pathway', - verbose_name='belongs to'), - ), - migrations.CreateModel( - name='Reaction', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('aliases', - django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), default=list, size=None, - verbose_name='Aliases')), - ('multi_step', models.BooleanField(verbose_name='Multistep Reaction')), - ('medline_references', - django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), null=True, size=None, - verbose_name='Medline References')), - ('educts', models.ManyToManyField(related_name='reaction_educts', to='epdb.compoundstructure', - verbose_name='Educts')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', - verbose_name='Package')), - ('products', models.ManyToManyField(related_name='reaction_products', to='epdb.compoundstructure', - verbose_name='Products')), - ('rules', models.ManyToManyField(related_name='reaction_rule', to='epdb.rule', verbose_name='Rule')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='edge', - name='edge_label', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.reaction', - verbose_name='Edge label'), - ), - migrations.CreateModel( - name='Scenario', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('scenario_date', models.CharField(default='No date', max_length=256)), - ('scenario_type', models.CharField(default='Not specified', max_length=256)), - ('additional_information', models.JSONField(verbose_name='Additional Information')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', - verbose_name='Package')), - ('parent', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, - to='epdb.scenario')), - ('url', models.TextField(null=True, verbose_name='URL')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='rule', - name='scenarios', - field=models.ManyToManyField(to='epdb.scenario', verbose_name='Attached Scenarios'), - ), - migrations.AddField( - model_name='reaction', - name='scenarios', - field=models.ManyToManyField(to='epdb.scenario', verbose_name='Attached Scenarios'), - ), - migrations.AddField( - model_name='pathway', - name='scenarios', - field=models.ManyToManyField(to='epdb.scenario', verbose_name='Attached Scenarios'), - ), - migrations.AddField( - model_name='node', - name='scenarios', - field=models.ManyToManyField(to='epdb.scenario', verbose_name='Attached Scenarios'), - ), - migrations.AddField( - model_name='edge', - name='scenarios', - field=models.ManyToManyField(to='epdb.scenario', verbose_name='Attached Scenarios'), - ), - migrations.AddField( - model_name='compoundstructure', - name='scenarios', - field=models.ManyToManyField(to='epdb.scenario', verbose_name='Attached Scenarios'), - ), - migrations.AddField( - model_name='compound', - name='scenarios', - field=models.ManyToManyField(to='epdb.scenario', verbose_name='Attached Scenarios'), - ), - migrations.CreateModel( - name='Setting', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('public', models.BooleanField(default=False)), - ('global_default', models.BooleanField(default=False)), - ('max_depth', models.IntegerField(default=5, verbose_name='Setting Max Depth')), - ('max_nodes', models.IntegerField(default=30, verbose_name='Setting Max Number of Nodes')), - ('model_threshold', - models.FloatField(blank=True, default=0.25, null=True, verbose_name='Setting Model Threshold')), - ('model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, - to='epdb.epmodel', verbose_name='Setting EPModel')), - ('rule_packages', - models.ManyToManyField(blank=True, related_name='setting_rule_packages', to='epdb.package', - verbose_name='Setting Rule Packages')), - ('url', models.TextField(null=True, verbose_name='URL')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='pathway', - name='setting', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - to='epdb.setting', verbose_name='Setting'), - ), - migrations.AddField( - model_name='user', - name='default_setting', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.setting', - verbose_name='The users default settings'), - ), - migrations.CreateModel( - name='MLRelativeReasoning', - fields=[ - ('epmodel_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.epmodel')), - ('threshold', models.FloatField(default=0.5)), - ('model_status', models.CharField( - choices=[('INITIAL', 'Initial'), ('INITIALIZING', 'Model is initializing.'), - ('BUILDING', 'Model is building.'), ('BUILT_NOT_EVALUATED', - 'Model is built and can be used for predictions, Model is not evaluated yet.'), - ('EVALUATING', 'Model is evaluating'), - ('FINISHED', 'Model has finished building and evaluation.'), - ('ERROR', 'Model has failed.')], default='INITIAL')), - ('eval_results', models.JSONField(blank=True, default=dict, null=True)), - ('data_packages', - models.ManyToManyField(related_name='data_packages', to='epdb.package', verbose_name='Data Packages')), - ('eval_packages', models.ManyToManyField(related_name='eval_packages', to='epdb.package', - verbose_name='Evaluation Packages')), - ('rule_packages', - models.ManyToManyField(related_name='rule_packages', to='epdb.package', verbose_name='Rule Packages')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.epmodel',), - ), - migrations.CreateModel( - name='SimpleAmbitRule', - fields=[ - ('simplerule_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.simplerule')), - ('smirks', models.TextField(verbose_name='SMIRKS')), - ('reactant_filter_smarts', models.TextField(null=True, verbose_name='Reactant Filter SMARTS')), - ('product_filter_smarts', models.TextField(null=True, verbose_name='Product Filter SMARTS')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.simplerule',), - ), - migrations.CreateModel( - name='SimpleRDKitRule', - fields=[ - ('simplerule_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.simplerule')), - ('reaction_smarts', models.TextField(verbose_name='SMIRKS')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.simplerule',), - ), - migrations.CreateModel( - name='SequentialRuleOrdering', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order_index', models.IntegerField()), - ('sequential_rule', - models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.sequentialrule')), - ('simple_rule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.simplerule')), - ], - ), - migrations.AddField( - model_name='sequentialrule', - name='simple_rules', - field=models.ManyToManyField(through='epdb.SequentialRuleOrdering', to='epdb.simplerule', - verbose_name='Simple rules'), - ), - migrations.CreateModel( - name='ParallelRule', - fields=[ - ('rule_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - primary_key=True, serialize=False, to='epdb.rule')), - ('simple_rules', models.ManyToManyField(to='epdb.simplerule', verbose_name='Simple rules')), - ], - options={ - 'abstract': False, - 'base_manager_name': 'objects', - }, - bases=('epdb.rule',), - ), - migrations.AlterUniqueTogether( - name='compound', - unique_together={('uuid', 'package')}, - ), - migrations.CreateModel( - name='GroupPackagePermission', - fields=[ - ('permission_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - to='epdb.permission')), - ('uuid', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False, - verbose_name='UUID of this object')), - ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.group', - verbose_name='Permission to')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', - verbose_name='Permission on')), - ], - options={ - 'unique_together': {('package', 'group')}, - }, - bases=('epdb.permission',), - ), - migrations.CreateModel( - name='UserPackagePermission', - fields=[ - ('permission_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - to='epdb.permission')), - ('uuid', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False, - verbose_name='UUID of this object')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.package', - verbose_name='Permission on')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, - verbose_name='Permission to')), - ], - options={ - 'unique_together': {('package', 'user')}, - }, - bases=('epdb.permission',), - ), - migrations.CreateModel( - name='UserSettingPermission', - fields=[ - ('permission_ptr', - models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, - to='epdb.permission')), - ('uuid', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False, - verbose_name='UUID of this object')), - ('setting', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.setting', - verbose_name='Permission on')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, - verbose_name='Permission to')), - ], - options={ - 'unique_together': {('setting', 'user')}, - }, - bases=('epdb.permission',), - ), - migrations.CreateModel( - name='ExternalDatabase', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), - ('name', models.CharField(max_length=100, unique=True, verbose_name='Database Name')), - ('full_name', models.CharField(blank=True, max_length=255, verbose_name='Full Database Name')), - ('description', models.TextField(blank=True, verbose_name='Description')), - ('base_url', models.URLField(blank=True, null=True, verbose_name='Base URL')), - ('url_pattern', models.CharField(blank=True, - help_text="URL pattern with {id} placeholder, e.g., 'https://pubchem.ncbi.nlm.nih.gov/compound/{id}'", - max_length=500, verbose_name='URL Pattern')), - ('is_active', models.BooleanField(default=True, verbose_name='Is Active')), - ], - options={ - 'verbose_name': 'External Database', - 'verbose_name_plural': 'External Databases', - 'db_table': 'epdb_external_database', - 'ordering': ['name'], - }, - ), - migrations.AlterModelOptions( - name='edge', - options={}, - ), - migrations.RemoveField( - model_name='edge', - name='polymorphic_ctype', - ), - migrations.CreateModel( - name='ApplicabilityDomain', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID of this object')), - ('name', models.TextField(default='no name', verbose_name='Name')), - ('description', models.TextField(default='no description', verbose_name='Descriptions')), - ('kv', models.JSONField(blank=True, default=dict, null=True)), - ('num_neighbours', models.IntegerField(default=5)), - ('reliability_threshold', models.FloatField(default=0.5)), - ('local_compatibilty_threshold', models.FloatField(default=0.5)), - ('model', - models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.mlrelativereasoning')), - ('functional_groups', models.JSONField(blank=True, default=dict, null=True)), - ('url', models.TextField(null=True, verbose_name='URL')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='mlrelativereasoning', - name='app_domain', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, - to='epdb.applicabilitydomain'), - ), - migrations.CreateModel( - name='APIToken', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('hashed_key', - models.CharField(help_text='SHA-256 hash of the token key', max_length=128, unique=True)), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('expires_at', - models.DateTimeField(blank=True, help_text='Token expiration time (null for no expiration)', - null=True)), - ('name', models.CharField(help_text='Descriptive name for this token', max_length=100)), - ('user', - models.ForeignKey(help_text='User who owns this token', on_delete=django.db.models.deletion.CASCADE, - related_name='api_tokens', to=settings.AUTH_USER_MODEL)), - ('is_active', models.BooleanField(default=True, help_text='Whether this token is active')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ], - options={ - 'ordering': ['-created'], - 'verbose_name': 'API Token', - 'verbose_name_plural': 'API Tokens', - 'db_table': 'epdb_api_token', - }, - ), - migrations.CreateModel( - name='ExternalIdentifier', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, - verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, - verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), - ('object_id', models.IntegerField()), - ('identifier_value', models.CharField(max_length=255, verbose_name='Identifier Value')), - ('url', models.URLField(blank=True, null=True, verbose_name='Direct URL')), - ('is_primary', - models.BooleanField(default=False, help_text='Mark this as the primary identifier for this database', - verbose_name='Is Primary')), - ('content_type', - models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), - ('database', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.externaldatabase', - verbose_name='External Database')), - ], - options={ - 'verbose_name': 'External Identifier', - 'verbose_name_plural': 'External Identifiers', - 'db_table': 'epdb_external_identifier', - 'indexes': [models.Index(fields=['content_type', 'object_id'], name='epdb_extern_content_b76813_idx'), - models.Index(fields=['database', 'identifier_value'], - name='epdb_extern_databas_486422_idx')], - 'unique_together': {('content_type', 'object_id', 'database', 'identifier_value')}, - }, - ), - migrations.AddField( - model_name='compound', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='compoundstructure', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='edge', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='epmodel', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='node', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='pathway', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='reaction', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='rule', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='user', - name='url', - field=models.TextField(null=True, verbose_name='URL'), - ), - migrations.RunPython( - code=populate_url, - reverse_code=django.db.migrations.operations.special.RunPython.noop, - ), - migrations.AlterField( - model_name='applicabilitydomain', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='compound', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='compoundstructure', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='edge', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='epmodel', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='group', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='node', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='package', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='pathway', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='reaction', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='rule', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='scenario', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='setting', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='user', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - ] diff --git a/epdb/migrations/0011_auto_20251111_1413.py b/epdb/migrations/0002_auto_20260212_1240.py similarity index 95% rename from epdb/migrations/0011_auto_20251111_1413.py rename to epdb/migrations/0002_auto_20260212_1240.py index d0a3463a..034dd412 100644 --- a/epdb/migrations/0011_auto_20251111_1413.py +++ b/epdb/migrations/0002_auto_20260212_1240.py @@ -40,7 +40,7 @@ def set_cc(apps, schema_editor): row["cc_string"]: (row["lowest_pk"], row["all_pks"]) for row in license_lookup_qs } - Packages = apps.get_model("epdb", "Package") + Packages = apps.get_model("bayer", "Package") for k, v in license_lookup.items(): # Set min pk to all packages pointing to any of the duplicates @@ -53,7 +53,7 @@ def set_cc(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ("epdb", "0010_license_cc_string"), + ("epdb", "0001_initial"), ] operations = [migrations.RunPython(set_cc)] diff --git a/epdb/migrations/0002_externaldatabase_alter_apitoken_options_and_more.py b/epdb/migrations/0002_externaldatabase_alter_apitoken_options_and_more.py deleted file mode 100644 index 44215433..00000000 --- a/epdb/migrations/0002_externaldatabase_alter_apitoken_options_and_more.py +++ /dev/null @@ -1,128 +0,0 @@ -# Generated by Django 5.2.1 on 2025-08-25 18:07 - -import django.db.models.deletion -import django.utils.timezone -import model_utils.fields -import uuid -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - ('epdb', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='ExternalDatabase', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), - ('name', models.CharField(max_length=100, unique=True, verbose_name='Database Name')), - ('full_name', models.CharField(blank=True, max_length=255, verbose_name='Full Database Name')), - ('description', models.TextField(blank=True, verbose_name='Description')), - ('base_url', models.URLField(blank=True, null=True, verbose_name='Base URL')), - ('url_pattern', models.CharField(blank=True, help_text="URL pattern with {id} placeholder, e.g., 'https://pubchem.ncbi.nlm.nih.gov/compound/{id}'", max_length=500, verbose_name='URL Pattern')), - ('is_active', models.BooleanField(default=True, verbose_name='Is Active')), - ], - options={ - 'verbose_name': 'External Database', - 'verbose_name_plural': 'External Databases', - 'db_table': 'epdb_external_database', - 'ordering': ['name'], - }, - ), - migrations.AlterModelOptions( - name='apitoken', - options={'ordering': ['-created'], 'verbose_name': 'API Token', 'verbose_name_plural': 'API Tokens'}, - ), - migrations.AlterModelOptions( - name='edge', - options={}, - ), - migrations.RemoveField( - model_name='edge', - name='polymorphic_ctype', - ), - migrations.AddField( - model_name='apitoken', - name='is_active', - field=models.BooleanField(default=True, help_text='Whether this token is active'), - ), - migrations.AddField( - model_name='apitoken', - name='modified', - field=model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified'), - ), - migrations.AddField( - model_name='applicabilitydomain', - name='functional_groups', - field=models.JSONField(blank=True, default=dict, null=True), - ), - migrations.AddField( - model_name='mlrelativereasoning', - name='app_domain', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.applicabilitydomain'), - ), - migrations.AlterField( - model_name='apitoken', - name='created', - field=model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created'), - ), - migrations.AlterField( - model_name='apitoken', - name='expires_at', - field=models.DateTimeField(blank=True, help_text='Token expiration time (null for no expiration)', null=True), - ), - migrations.AlterField( - model_name='apitoken', - name='hashed_key', - field=models.CharField(help_text='SHA-256 hash of the token key', max_length=128, unique=True), - ), - migrations.AlterField( - model_name='apitoken', - name='name', - field=models.CharField(help_text='Descriptive name for this token', max_length=100), - ), - migrations.AlterField( - model_name='apitoken', - name='user', - field=models.ForeignKey(help_text='User who owns this token', on_delete=django.db.models.deletion.CASCADE, related_name='api_tokens', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='applicabilitydomain', - name='num_neighbours', - field=models.IntegerField(default=5), - ), - migrations.AlterModelTable( - name='apitoken', - table='epdb_api_token', - ), - migrations.CreateModel( - name='ExternalIdentifier', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), - ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), - ('object_id', models.IntegerField()), - ('identifier_value', models.CharField(max_length=255, verbose_name='Identifier Value')), - ('url', models.URLField(blank=True, null=True, verbose_name='Direct URL')), - ('is_primary', models.BooleanField(default=False, help_text='Mark this as the primary identifier for this database', verbose_name='Is Primary')), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), - ('database', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epdb.externaldatabase', verbose_name='External Database')), - ], - options={ - 'verbose_name': 'External Identifier', - 'verbose_name_plural': 'External Identifiers', - 'db_table': 'epdb_external_identifier', - 'indexes': [models.Index(fields=['content_type', 'object_id'], name='epdb_extern_content_b76813_idx'), models.Index(fields=['database', 'identifier_value'], name='epdb_extern_databas_486422_idx')], - 'unique_together': {('content_type', 'object_id', 'database', 'identifier_value')}, - }, - ), - ] diff --git a/epdb/migrations/0003_applicabilitydomain_url_compound_url_and_more.py b/epdb/migrations/0003_applicabilitydomain_url_compound_url_and_more.py deleted file mode 100644 index 5cb39127..00000000 --- a/epdb/migrations/0003_applicabilitydomain_url_compound_url_and_more.py +++ /dev/null @@ -1,228 +0,0 @@ -# Generated by Django 5.2.1 on 2025-08-26 17:05 - -from django.db import migrations, models - - -def populate_url(apps, schema_editor): - MODELS = [ - 'User', - 'Group', - 'Package', - 'Compound', - 'CompoundStructure', - 'Pathway', - 'Edge', - 'Node', - 'Reaction', - 'SimpleAmbitRule', - 'SimpleRDKitRule', - 'ParallelRule', - 'SequentialRule', - 'Scenario', - 'Setting', - 'MLRelativeReasoning', - 'EnviFormer', - 'ApplicabilityDomain', - ] - for model in MODELS: - obj_cls = apps.get_model("epdb", model) - for obj in obj_cls.objects.all(): - obj.url = assemble_url(obj) - if obj.url is None: - raise ValueError(f"Could not assemble url for {obj}") - obj.save() - - -def assemble_url(obj): - from django.conf import settings as s - match obj.__class__.__name__: - case 'User': - return '{}/user/{}'.format(s.SERVER_URL, obj.uuid) - case 'Group': - return '{}/group/{}'.format(s.SERVER_URL, obj.uuid) - case 'Package': - return '{}/package/{}'.format(s.SERVER_URL, obj.uuid) - case 'Compound': - return '{}/compound/{}'.format(obj.package.url, obj.uuid) - case 'CompoundStructure': - return '{}/structure/{}'.format(obj.compound.url, obj.uuid) - case 'SimpleAmbitRule': - return '{}/simple-ambit-rule/{}'.format(obj.package.url, obj.uuid) - case 'SimpleRDKitRule': - return '{}/simple-rdkit-rule/{}'.format(obj.package.url, obj.uuid) - case 'ParallelRule': - return '{}/parallel-rule/{}'.format(obj.package.url, obj.uuid) - case 'SequentialRule': - return '{}/sequential-rule/{}'.format(obj.compound.url, obj.uuid) - case 'Reaction': - return '{}/reaction/{}'.format(obj.package.url, obj.uuid) - case 'Pathway': - return '{}/pathway/{}'.format(obj.package.url, obj.uuid) - case 'Node': - return '{}/node/{}'.format(obj.pathway.url, obj.uuid) - case 'Edge': - return '{}/edge/{}'.format(obj.pathway.url, obj.uuid) - case 'MLRelativeReasoning': - return '{}/model/{}'.format(obj.package.url, obj.uuid) - case 'EnviFormer': - return '{}/model/{}'.format(obj.package.url, obj.uuid) - case 'ApplicabilityDomain': - return '{}/model/{}/applicability-domain/{}'.format(obj.model.package.url, obj.model.uuid, obj.uuid) - case 'Scenario': - return '{}/scenario/{}'.format(obj.package.url, obj.uuid) - case 'Setting': - return '{}/setting/{}'.format(s.SERVER_URL, obj.uuid) - case _: - raise ValueError(f"Unknown model {obj.__class__.__name__}") - - -class Migration(migrations.Migration): - dependencies = [ - ('epdb', '0002_externaldatabase_alter_apitoken_options_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='applicabilitydomain', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='compound', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='compoundstructure', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='edge', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='epmodel', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='group', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='node', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='package', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='pathway', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='reaction', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='rule', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='scenario', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='setting', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - migrations.AddField( - model_name='user', - name='url', - field=models.TextField(null=True, unique=False, verbose_name='URL'), - ), - - migrations.RunPython(populate_url, reverse_code=migrations.RunPython.noop), - - migrations.AlterField( - model_name='applicabilitydomain', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='compound', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='compoundstructure', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='edge', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='epmodel', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='group', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='node', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='package', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='pathway', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='reaction', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='rule', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='scenario', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='setting', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - migrations.AlterField( - model_name='user', - name='url', - field=models.TextField(null=True, unique=True, verbose_name='URL'), - ), - ] diff --git a/epdb/migrations/0004_alter_mlrelativereasoning_options_and_more.py b/epdb/migrations/0004_alter_mlrelativereasoning_options_and_more.py deleted file mode 100644 index 674a73dc..00000000 --- a/epdb/migrations/0004_alter_mlrelativereasoning_options_and_more.py +++ /dev/null @@ -1,55 +0,0 @@ -# Generated by Django 5.2.1 on 2025-09-09 09:21 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('epdb', '0001_squashed_0003_applicabilitydomain_url_compound_url_and_more'), - ] - - operations = [ - migrations.AlterModelOptions( - name='mlrelativereasoning', - options={}, - ), - migrations.AlterField( - model_name='mlrelativereasoning', - name='data_packages', - field=models.ManyToManyField(related_name='%(app_label)s_%(class)s_data_packages', to='epdb.package', verbose_name='Data Packages'), - ), - migrations.AlterField( - model_name='mlrelativereasoning', - name='eval_packages', - field=models.ManyToManyField(related_name='%(app_label)s_%(class)s_eval_packages', to='epdb.package', verbose_name='Evaluation Packages'), - ), - migrations.AlterField( - model_name='mlrelativereasoning', - name='rule_packages', - field=models.ManyToManyField(related_name='%(app_label)s_%(class)s_rule_packages', to='epdb.package', verbose_name='Rule Packages'), - ), - migrations.CreateModel( - name='RuleBasedRelativeReasoning', - fields=[ - ('epmodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='epdb.epmodel')), - ('threshold', models.FloatField(default=0.5)), - ('eval_results', models.JSONField(blank=True, default=dict, null=True)), - ('model_status', models.CharField(choices=[('INITIAL', 'Initial'), ('INITIALIZING', 'Model is initializing.'), ('BUILDING', 'Model is building.'), ('BUILT_NOT_EVALUATED', 'Model is built and can be used for predictions, Model is not evaluated yet.'), ('EVALUATING', 'Model is evaluating'), ('FINISHED', 'Model has finished building and evaluation.'), ('ERROR', 'Model has failed.')], default='INITIAL')), - ('min_count', models.IntegerField(default=10)), - ('max_count', models.IntegerField(default=0)), - ('app_domain', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.applicabilitydomain')), - ('data_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_data_packages', to='epdb.package', verbose_name='Data Packages')), - ('eval_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_eval_packages', to='epdb.package', verbose_name='Evaluation Packages')), - ('rule_packages', models.ManyToManyField(related_name='%(app_label)s_%(class)s_rule_packages', to='epdb.package', verbose_name='Rule Packages')), - ], - options={ - 'abstract': False, - }, - bases=('epdb.epmodel',), - ), - migrations.DeleteModel( - name='RuleBaseRelativeReasoning', - ), - ] diff --git a/epdb/migrations/0005_alter_group_group_member.py b/epdb/migrations/0005_alter_group_group_member.py deleted file mode 100644 index 62aa724a..00000000 --- a/epdb/migrations/0005_alter_group_group_member.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.1 on 2025-09-11 06:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('epdb', '0004_alter_mlrelativereasoning_options_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='group', - name='group_member', - field=models.ManyToManyField(blank=True, related_name='groups_in_group', to='epdb.group', verbose_name='Group member'), - ), - ] diff --git a/epdb/migrations/0006_mlrelativereasoning_multigen_eval_and_more.py b/epdb/migrations/0006_mlrelativereasoning_multigen_eval_and_more.py deleted file mode 100644 index 008214ae..00000000 --- a/epdb/migrations/0006_mlrelativereasoning_multigen_eval_and_more.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.2.1 on 2025-09-18 06:42 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('epdb', '0005_alter_group_group_member'), - ] - - operations = [ - migrations.AddField( - model_name='mlrelativereasoning', - name='multigen_eval', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='rulebasedrelativereasoning', - name='multigen_eval', - field=models.BooleanField(default=False), - ), - ] diff --git a/epdb/migrations/0007_alter_enviformer_options_enviformer_app_domain_and_more.py b/epdb/migrations/0007_alter_enviformer_options_enviformer_app_domain_and_more.py deleted file mode 100644 index 5ffbe7f6..00000000 --- a/epdb/migrations/0007_alter_enviformer_options_enviformer_app_domain_and_more.py +++ /dev/null @@ -1,53 +0,0 @@ -# Generated by Django 5.2.1 on 2025-10-07 08:19 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('epdb', '0006_mlrelativereasoning_multigen_eval_and_more'), - ] - - operations = [ - migrations.AlterModelOptions( - name='enviformer', - options={}, - ), - migrations.AddField( - model_name='enviformer', - name='app_domain', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='epdb.applicabilitydomain'), - ), - migrations.AddField( - model_name='enviformer', - name='data_packages', - field=models.ManyToManyField(related_name='%(app_label)s_%(class)s_data_packages', to='epdb.package', verbose_name='Data Packages'), - ), - migrations.AddField( - model_name='enviformer', - name='eval_packages', - field=models.ManyToManyField(related_name='%(app_label)s_%(class)s_eval_packages', to='epdb.package', verbose_name='Evaluation Packages'), - ), - migrations.AddField( - model_name='enviformer', - name='eval_results', - field=models.JSONField(blank=True, default=dict, null=True), - ), - migrations.AddField( - model_name='enviformer', - name='model_status', - field=models.CharField(choices=[('INITIAL', 'Initial'), ('INITIALIZING', 'Model is initializing.'), ('BUILDING', 'Model is building.'), ('BUILT_NOT_EVALUATED', 'Model is built and can be used for predictions, Model is not evaluated yet.'), ('EVALUATING', 'Model is evaluating'), ('FINISHED', 'Model has finished building and evaluation.'), ('ERROR', 'Model has failed.')], default='INITIAL'), - ), - migrations.AddField( - model_name='enviformer', - name='multigen_eval', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='enviformer', - name='rule_packages', - field=models.ManyToManyField(related_name='%(app_label)s_%(class)s_rule_packages', to='epdb.package', verbose_name='Rule Packages'), - ), - ] diff --git a/epdb/migrations/0008_enzymelink.py b/epdb/migrations/0008_enzymelink.py deleted file mode 100644 index 35d0a950..00000000 --- a/epdb/migrations/0008_enzymelink.py +++ /dev/null @@ -1,64 +0,0 @@ -# Generated by Django 5.2.7 on 2025-10-10 06:58 - -import django.db.models.deletion -import django.utils.timezone -import model_utils.fields -import uuid -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("epdb", "0007_alter_enviformer_options_enviformer_app_domain_and_more"), - ] - - operations = [ - migrations.CreateModel( - name="EnzymeLink", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name="ID" - ), - ), - ( - "created", - model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, editable=False, verbose_name="created" - ), - ), - ( - "modified", - model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, editable=False, verbose_name="modified" - ), - ), - ( - "uuid", - models.UUIDField( - default=uuid.uuid4, unique=True, verbose_name="UUID of this object" - ), - ), - ("name", models.TextField(default="no name", verbose_name="Name")), - ( - "description", - models.TextField(default="no description", verbose_name="Descriptions"), - ), - ("url", models.TextField(null=True, unique=True, verbose_name="URL")), - ("kv", models.JSONField(blank=True, default=dict, null=True)), - ("ec_number", models.TextField(verbose_name="EC Number")), - ("classification_level", models.IntegerField(verbose_name="Classification Level")), - ("linking_method", models.TextField(verbose_name="Linking Method")), - ("edge_evidence", models.ManyToManyField(to="epdb.edge")), - ("reaction_evidence", models.ManyToManyField(to="epdb.reaction")), - ( - "rule", - models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="epdb.rule"), - ), - ], - options={ - "abstract": False, - }, - ), - ] diff --git a/epdb/migrations/0009_joblog.py b/epdb/migrations/0009_joblog.py deleted file mode 100644 index 5c731eb1..00000000 --- a/epdb/migrations/0009_joblog.py +++ /dev/null @@ -1,66 +0,0 @@ -# Generated by Django 5.2.7 on 2025-10-27 09:39 - -import django.db.models.deletion -import django.utils.timezone -import model_utils.fields -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("epdb", "0008_enzymelink"), - ] - - operations = [ - migrations.CreateModel( - name="JobLog", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name="ID" - ), - ), - ( - "created", - model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, editable=False, verbose_name="created" - ), - ), - ( - "modified", - model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, editable=False, verbose_name="modified" - ), - ), - ("task_id", models.UUIDField(unique=True)), - ("job_name", models.TextField()), - ( - "status", - models.CharField( - choices=[ - ("INITIAL", "Initial"), - ("SUCCESS", "Success"), - ("FAILURE", "Failure"), - ("REVOKED", "Revoked"), - ("IGNORED", "Ignored"), - ], - default="INITIAL", - max_length=20, - ), - ), - ("done_at", models.DateTimeField(blank=True, default=None, null=True)), - ("task_result", models.TextField(blank=True, default=None, null=True)), - ( - "user", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL - ), - ), - ], - options={ - "abstract": False, - }, - ), - ] diff --git a/epdb/migrations/0010_license_cc_string.py b/epdb/migrations/0010_license_cc_string.py deleted file mode 100644 index 5594c756..00000000 --- a/epdb/migrations/0010_license_cc_string.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.7 on 2025-11-11 14:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("epdb", "0009_joblog"), - ] - - operations = [ - migrations.AddField( - model_name="license", - name="cc_string", - field=models.TextField(default="by-nc-sa", verbose_name="CC string"), - preserve_default=False, - ), - ] diff --git a/epdb/migrations/0012_node_stereo_removed_pathway_predicted.py b/epdb/migrations/0012_node_stereo_removed_pathway_predicted.py deleted file mode 100644 index 648090d7..00000000 --- a/epdb/migrations/0012_node_stereo_removed_pathway_predicted.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 5.2.7 on 2025-12-02 13:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("epdb", "0011_auto_20251111_1413"), - ] - - operations = [ - migrations.AddField( - model_name="node", - name="stereo_removed", - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name="pathway", - name="predicted", - field=models.BooleanField(default=False), - ), - ] diff --git a/epdb/migrations/0013_setting_expansion_schema.py b/epdb/migrations/0013_setting_expansion_schema.py deleted file mode 100644 index 9a981795..00000000 --- a/epdb/migrations/0013_setting_expansion_schema.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 5.2.7 on 2025-12-14 11:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("epdb", "0012_node_stereo_removed_pathway_predicted"), - ] - - operations = [ - migrations.AddField( - model_name="setting", - name="expansion_schema", - field=models.CharField( - choices=[ - ("BFS", "Breadth First Search"), - ("DFS", "Depth First Search"), - ("GREEDY", "Greedy"), - ], - default="BFS", - max_length=20, - ), - ), - ] diff --git a/epdb/migrations/0014_rename_expansion_schema_setting_expansion_scheme.py b/epdb/migrations/0014_rename_expansion_schema_setting_expansion_scheme.py deleted file mode 100644 index b7332fee..00000000 --- a/epdb/migrations/0014_rename_expansion_schema_setting_expansion_scheme.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.7 on 2025-12-14 16:02 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("epdb", "0013_setting_expansion_schema"), - ] - - operations = [ - migrations.RenameField( - model_name="setting", - old_name="expansion_schema", - new_name="expansion_scheme", - ), - ] diff --git a/epdb/migrations/0015_user_is_reviewer.py b/epdb/migrations/0015_user_is_reviewer.py deleted file mode 100644 index b26db739..00000000 --- a/epdb/migrations/0015_user_is_reviewer.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.7 on 2026-01-19 19:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("epdb", "0014_rename_expansion_schema_setting_expansion_scheme"), - ] - - operations = [ - migrations.AddField( - model_name="user", - name="is_reviewer", - field=models.BooleanField(default=False), - ), - ]