forked from enviPath/enviPy
Compare commits
2 Commits
feature/le
...
feature/te
| Author | SHA1 | Date | |
|---|---|---|---|
| 62e890245e | |||
| 138846d84d |
@ -52,6 +52,28 @@ INSTALLED_APPS = [
|
|||||||
"migration",
|
"migration",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# Add the TENANT providing implementations for
|
||||||
|
# Required
|
||||||
|
# - Package
|
||||||
|
# - Compound (TODO)
|
||||||
|
# - CompoundStructure (TODO)
|
||||||
|
# Optional
|
||||||
|
# - PackageManager (TODO)
|
||||||
|
# - GroupManager (TODO)
|
||||||
|
# - SettingManager (TODO)
|
||||||
|
TENANT = os.environ.get("TENANT", "public")
|
||||||
|
INSTALLED_APPS.append(TENANT)
|
||||||
|
PACKAGE_IMPLEMENTATION = f"{TENANT}.Package"
|
||||||
|
PACKAGE_MODULE_PATH = f"{TENANT}.models.Package"
|
||||||
|
|
||||||
|
|
||||||
|
def GET_PACKAGE_MODEL():
|
||||||
|
from django.apps import apps
|
||||||
|
|
||||||
|
return apps.get_model(TENANT, "Package")
|
||||||
|
|
||||||
|
|
||||||
AUTHENTICATION_BACKENDS = [
|
AUTHENTICATION_BACKENDS = [
|
||||||
"django.contrib.auth.backends.ModelBackend",
|
"django.contrib.auth.backends.ModelBackend",
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from django.conf import settings as s
|
||||||
|
|
||||||
from .models import (
|
from .models import (
|
||||||
User,
|
User,
|
||||||
UserPackagePermission,
|
UserPackagePermission,
|
||||||
Group,
|
Group,
|
||||||
GroupPackagePermission,
|
GroupPackagePermission,
|
||||||
Package,
|
|
||||||
MLRelativeReasoning,
|
MLRelativeReasoning,
|
||||||
EnviFormer,
|
EnviFormer,
|
||||||
Compound,
|
Compound,
|
||||||
@ -24,6 +24,9 @@ from .models import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class UserAdmin(admin.ModelAdmin):
|
class UserAdmin(admin.ModelAdmin):
|
||||||
list_display = ["username", "email", "is_active"]
|
list_display = ["username", "email", "is_active"]
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
from typing import List, Dict, Optional, Any
|
from typing import List, Dict, Optional, Any
|
||||||
|
|
||||||
|
from django.conf import settings as s
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
@ -10,7 +11,6 @@ from .logic import PackageManager, UserManager, SettingManager
|
|||||||
from .models import (
|
from .models import (
|
||||||
Compound,
|
Compound,
|
||||||
CompoundStructure,
|
CompoundStructure,
|
||||||
Package,
|
|
||||||
User,
|
User,
|
||||||
UserPackagePermission,
|
UserPackagePermission,
|
||||||
Rule,
|
Rule,
|
||||||
@ -23,6 +23,9 @@ from .models import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
def _anonymous_or_real(request):
|
def _anonymous_or_real(request):
|
||||||
if request.user.is_authenticated and not request.user.is_anonymous:
|
if request.user.is_authenticated and not request.user.is_anonymous:
|
||||||
return request.user
|
return request.user
|
||||||
|
|||||||
@ -11,7 +11,6 @@ from pydantic import ValidationError
|
|||||||
|
|
||||||
from epdb.models import (
|
from epdb.models import (
|
||||||
User,
|
User,
|
||||||
Package,
|
|
||||||
UserPackagePermission,
|
UserPackagePermission,
|
||||||
GroupPackagePermission,
|
GroupPackagePermission,
|
||||||
Permission,
|
Permission,
|
||||||
@ -33,6 +32,8 @@ from utilities.misc import PackageImporter, PackageExporter
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class EPDBURLParser:
|
class EPDBURLParser:
|
||||||
UUID_PATTERN = r"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"
|
UUID_PATTERN = r"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"
|
||||||
|
|||||||
@ -2,7 +2,9 @@ from django.conf import settings as s
|
|||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
|
||||||
from epdb.models import MLRelativeReasoning, EnviFormer, Package
|
from epdb.models import EnviFormer, MLRelativeReasoning
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
@ -75,11 +77,13 @@ class Command(BaseCommand):
|
|||||||
return packages
|
return packages
|
||||||
|
|
||||||
# Iteratively create models in options["model_names"]
|
# Iteratively create models in options["model_names"]
|
||||||
print(f"Creating models: {options['model_names']}\n"
|
print(
|
||||||
f"Data packages: {options['data_packages']}\n"
|
f"Creating models: {options['model_names']}\n"
|
||||||
f"Rule Packages (only for MLRR): {options['rule_packages']}\n"
|
f"Data packages: {options['data_packages']}\n"
|
||||||
f"Eval Packages: {options['eval_packages']}\n"
|
f"Rule Packages (only for MLRR): {options['rule_packages']}\n"
|
||||||
f"Threshold: {options['threshold']:.2f}")
|
f"Eval Packages: {options['eval_packages']}\n"
|
||||||
|
f"Threshold: {options['threshold']:.2f}"
|
||||||
|
)
|
||||||
data_packages = decode_packages(options["data_packages"])
|
data_packages = decode_packages(options["data_packages"])
|
||||||
eval_packages = decode_packages(options["eval_packages"])
|
eval_packages = decode_packages(options["eval_packages"])
|
||||||
rule_packages = decode_packages(options["rule_packages"])
|
rule_packages = decode_packages(options["rule_packages"])
|
||||||
@ -90,10 +94,10 @@ class Command(BaseCommand):
|
|||||||
pack,
|
pack,
|
||||||
data_packages=data_packages,
|
data_packages=data_packages,
|
||||||
eval_packages=eval_packages,
|
eval_packages=eval_packages,
|
||||||
threshold=options['threshold'],
|
threshold=options["threshold"],
|
||||||
name=f"EnviFormer - {', '.join(options['data_packages'])} - T{options['threshold']:.2f}",
|
name=f"EnviFormer - {', '.join(options['data_packages'])} - T{options['threshold']:.2f}",
|
||||||
description=f"EnviFormer transformer trained on {options['data_packages']} "
|
description=f"EnviFormer transformer trained on {options['data_packages']} "
|
||||||
f"evaluated on {options['eval_packages']}.",
|
f"evaluated on {options['eval_packages']}.",
|
||||||
)
|
)
|
||||||
elif model_name == "mlrr":
|
elif model_name == "mlrr":
|
||||||
model = MLRelativeReasoning.create(
|
model = MLRelativeReasoning.create(
|
||||||
@ -101,10 +105,10 @@ class Command(BaseCommand):
|
|||||||
rule_packages=rule_packages,
|
rule_packages=rule_packages,
|
||||||
data_packages=data_packages,
|
data_packages=data_packages,
|
||||||
eval_packages=eval_packages,
|
eval_packages=eval_packages,
|
||||||
threshold=options['threshold'],
|
threshold=options["threshold"],
|
||||||
name=f"ECC - {', '.join(options['data_packages'])} - T{options['threshold']:.2f}",
|
name=f"ECC - {', '.join(options['data_packages'])} - T{options['threshold']:.2f}",
|
||||||
description=f"ML Relative Reasoning trained on {options['data_packages']} with rules from "
|
description=f"ML Relative Reasoning trained on {options['data_packages']} with rules from "
|
||||||
f"{options['rule_packages']} and evaluated on {options['eval_packages']}.",
|
f"{options['rule_packages']} and evaluated on {options['eval_packages']}.",
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Cannot create model of type {model_name}, unknown model type")
|
raise ValueError(f"Cannot create model of type {model_name}, unknown model type")
|
||||||
|
|||||||
@ -8,7 +8,9 @@ from django.conf import settings as s
|
|||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
|
||||||
from epdb.models import EnviFormer, Package
|
from epdb.models import EnviFormer
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
|
from django.conf import settings as s
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
from django.db.models import F, JSONField, TextField, Value
|
||||||
from django.db.models import F, Value, TextField, JSONField
|
from django.db.models.functions import Cast, Replace
|
||||||
from django.db.models.functions import Replace, Cast
|
|
||||||
|
|
||||||
from epdb.models import EnviPathModel
|
from epdb.models import EnviPathModel
|
||||||
|
|
||||||
@ -23,10 +23,13 @@ class Command(BaseCommand):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
print("Localizing urls for Package")
|
||||||
|
Package.objects.update(url=Replace(F("url"), Value(options["old"]), Value(options["new"])))
|
||||||
|
|
||||||
MODELS = [
|
MODELS = [
|
||||||
"User",
|
"User",
|
||||||
"Group",
|
"Group",
|
||||||
"Package",
|
|
||||||
"Compound",
|
"Compound",
|
||||||
"CompoundStructure",
|
"CompoundStructure",
|
||||||
"Pathway",
|
"Pathway",
|
||||||
|
|||||||
@ -0,0 +1,190 @@
|
|||||||
|
# Generated by Django 5.2.7 on 2025-10-29 13:32
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
("epdb", "0009_joblog"),
|
||||||
|
("public", "0001_initial"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="userpackagepermission",
|
||||||
|
name="package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Permission on",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="grouppackagepermission",
|
||||||
|
name="package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Permission on",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="epmodel",
|
||||||
|
name="package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Package",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="rule",
|
||||||
|
name="package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Package",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="compound",
|
||||||
|
name="package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Package",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="scenario",
|
||||||
|
name="package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Package",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="pathway",
|
||||||
|
name="package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Package",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="reaction",
|
||||||
|
name="package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Package",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="user",
|
||||||
|
name="default_package",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
null=True,
|
||||||
|
on_delete=django.db.models.deletion.SET_NULL,
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Default Package",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="enviformer",
|
||||||
|
name="data_packages",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
related_name="%(app_label)s_%(class)s_data_packages",
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Data Packages",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="enviformer",
|
||||||
|
name="eval_packages",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
related_name="%(app_label)s_%(class)s_eval_packages",
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Evaluation Packages",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="enviformer",
|
||||||
|
name="rule_packages",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
related_name="%(app_label)s_%(class)s_rule_packages",
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Rule Packages",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="mlrelativereasoning",
|
||||||
|
name="data_packages",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
related_name="%(app_label)s_%(class)s_data_packages",
|
||||||
|
to="public.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="public.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="public.package",
|
||||||
|
verbose_name="Rule Packages",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="rulebasedrelativereasoning",
|
||||||
|
name="data_packages",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
related_name="%(app_label)s_%(class)s_data_packages",
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Data Packages",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="rulebasedrelativereasoning",
|
||||||
|
name="eval_packages",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
related_name="%(app_label)s_%(class)s_eval_packages",
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Evaluation Packages",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="rulebasedrelativereasoning",
|
||||||
|
name="rule_packages",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
related_name="%(app_label)s_%(class)s_rule_packages",
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Rule Packages",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="setting",
|
||||||
|
name="rule_packages",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
blank=True,
|
||||||
|
related_name="setting_rule_packages",
|
||||||
|
to="public.package",
|
||||||
|
verbose_name="Setting Rule Packages",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name="Package",
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -7,7 +7,7 @@ import secrets
|
|||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Union, List, Optional, Dict, Tuple, Set, Any
|
from typing import Union, List, Optional, Dict, Tuple, Set, Any, TYPE_CHECKING
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
import math
|
import math
|
||||||
import joblib
|
import joblib
|
||||||
@ -32,6 +32,8 @@ from utilities.ml import Dataset, ApplicabilityDomainPCA, EnsembleClassifierChai
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
##########################
|
##########################
|
||||||
# User/Groups/Permission #
|
# User/Groups/Permission #
|
||||||
@ -45,7 +47,10 @@ class User(AbstractUser):
|
|||||||
)
|
)
|
||||||
url = models.TextField(blank=False, null=True, verbose_name="URL", unique=True)
|
url = models.TextField(blank=False, null=True, verbose_name="URL", unique=True)
|
||||||
default_package = models.ForeignKey(
|
default_package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Default Package", null=True, on_delete=models.SET_NULL
|
s.PACKAGE_IMPLEMENTATION,
|
||||||
|
verbose_name="Default Package",
|
||||||
|
null=True,
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
)
|
)
|
||||||
default_group = models.ForeignKey(
|
default_group = models.ForeignKey(
|
||||||
"Group",
|
"Group",
|
||||||
@ -235,7 +240,7 @@ class UserPackagePermission(Permission):
|
|||||||
)
|
)
|
||||||
user = models.ForeignKey("User", verbose_name="Permission to", on_delete=models.CASCADE)
|
user = models.ForeignKey("User", verbose_name="Permission to", on_delete=models.CASCADE)
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Permission on", on_delete=models.CASCADE
|
s.PACKAGE_IMPLEMENTATION, verbose_name="Permission on", on_delete=models.CASCADE
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@ -251,7 +256,7 @@ class GroupPackagePermission(Permission):
|
|||||||
)
|
)
|
||||||
group = models.ForeignKey("Group", verbose_name="Permission to", on_delete=models.CASCADE)
|
group = models.ForeignKey("Group", verbose_name="Permission to", on_delete=models.CASCADE)
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Permission on", on_delete=models.CASCADE
|
s.PACKAGE_IMPLEMENTATION, verbose_name="Permission on", on_delete=models.CASCADE
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@ -651,7 +656,7 @@ class License(models.Model):
|
|||||||
image_link = models.URLField(blank=False, null=False, verbose_name="Image link")
|
image_link = models.URLField(blank=False, null=False, verbose_name="Image link")
|
||||||
|
|
||||||
|
|
||||||
class Package(EnviPathModel):
|
class AbstractPackage(EnviPathModel):
|
||||||
reviewed = models.BooleanField(verbose_name="Reviewstatus", default=False)
|
reviewed = models.BooleanField(verbose_name="Reviewstatus", default=False)
|
||||||
license = models.ForeignKey(
|
license = models.ForeignKey(
|
||||||
"epdb.License", on_delete=models.SET_NULL, blank=True, null=True, verbose_name="License"
|
"epdb.License", on_delete=models.SET_NULL, blank=True, null=True, verbose_name="License"
|
||||||
@ -719,10 +724,13 @@ class Package(EnviPathModel):
|
|||||||
rules = sorted(rules, key=lambda x: x.url)
|
rules = sorted(rules, key=lambda x: x.url)
|
||||||
return rules
|
return rules
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
class Compound(EnviPathModel, AliasMixin, ScenarioMixin, ChemicalIdentifierMixin):
|
class Compound(EnviPathModel, AliasMixin, ScenarioMixin, ChemicalIdentifierMixin):
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
s.PACKAGE_IMPLEMENTATION, verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
||||||
)
|
)
|
||||||
default_structure = models.ForeignKey(
|
default_structure = models.ForeignKey(
|
||||||
"CompoundStructure",
|
"CompoundStructure",
|
||||||
@ -772,7 +780,7 @@ class Compound(EnviPathModel, AliasMixin, ScenarioMixin, ChemicalIdentifierMixin
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def create(
|
def create(
|
||||||
package: Package, smiles: str, name: str = None, description: str = None, *args, **kwargs
|
package: "Package", smiles: str, name: str = None, description: str = None, *args, **kwargs
|
||||||
) -> "Compound":
|
) -> "Compound":
|
||||||
if smiles is None or smiles.strip() == "":
|
if smiles is None or smiles.strip() == "":
|
||||||
raise ValueError("SMILES is required")
|
raise ValueError("SMILES is required")
|
||||||
@ -1050,7 +1058,7 @@ class EnzymeLink(EnviPathModel, KEGGIdentifierMixin):
|
|||||||
|
|
||||||
class Rule(PolymorphicModel, EnviPathModel, AliasMixin, ScenarioMixin):
|
class Rule(PolymorphicModel, EnviPathModel, AliasMixin, ScenarioMixin):
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
s.PACKAGE_IMPLEMENTATION, verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
||||||
)
|
)
|
||||||
|
|
||||||
# # https://github.com/django-polymorphic/django-polymorphic/issues/229
|
# # https://github.com/django-polymorphic/django-polymorphic/issues/229
|
||||||
@ -1156,7 +1164,7 @@ class SimpleAmbitRule(SimpleRule):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def create(
|
def create(
|
||||||
package: Package,
|
package: "Package",
|
||||||
name: str = None,
|
name: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
smirks: str = None,
|
smirks: str = None,
|
||||||
@ -1222,6 +1230,7 @@ class SimpleAmbitRule(SimpleRule):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def related_reactions(self):
|
def related_reactions(self):
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
qs = Package.objects.filter(reviewed=True)
|
qs = Package.objects.filter(reviewed=True)
|
||||||
return self.reaction_rule.filter(package__in=qs).order_by("name")
|
return self.reaction_rule.filter(package__in=qs).order_by("name")
|
||||||
|
|
||||||
@ -1314,7 +1323,7 @@ class SequentialRuleOrdering(models.Model):
|
|||||||
|
|
||||||
class Reaction(EnviPathModel, AliasMixin, ScenarioMixin, ReactionIdentifierMixin):
|
class Reaction(EnviPathModel, AliasMixin, ScenarioMixin, ReactionIdentifierMixin):
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
s.PACKAGE_IMPLEMENTATION, verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
||||||
)
|
)
|
||||||
educts = models.ManyToManyField(
|
educts = models.ManyToManyField(
|
||||||
"epdb.CompoundStructure", verbose_name="Educts", related_name="reaction_educts"
|
"epdb.CompoundStructure", verbose_name="Educts", related_name="reaction_educts"
|
||||||
@ -1336,7 +1345,7 @@ class Reaction(EnviPathModel, AliasMixin, ScenarioMixin, ReactionIdentifierMixin
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def create(
|
def create(
|
||||||
package: Package,
|
package: "Package",
|
||||||
name: str = None,
|
name: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
educts: Union[List[str], List[CompoundStructure]] = None,
|
educts: Union[List[str], List[CompoundStructure]] = None,
|
||||||
@ -1496,7 +1505,7 @@ class Reaction(EnviPathModel, AliasMixin, ScenarioMixin, ReactionIdentifierMixin
|
|||||||
|
|
||||||
class Pathway(EnviPathModel, AliasMixin, ScenarioMixin):
|
class Pathway(EnviPathModel, AliasMixin, ScenarioMixin):
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
s.PACKAGE_IMPLEMENTATION, verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
||||||
)
|
)
|
||||||
setting = models.ForeignKey(
|
setting = models.ForeignKey(
|
||||||
"epdb.Setting", verbose_name="Setting", on_delete=models.CASCADE, null=True, blank=True
|
"epdb.Setting", verbose_name="Setting", on_delete=models.CASCADE, null=True, blank=True
|
||||||
@ -2052,7 +2061,7 @@ class Edge(EnviPathModel, AliasMixin, ScenarioMixin):
|
|||||||
|
|
||||||
class EPModel(PolymorphicModel, EnviPathModel):
|
class EPModel(PolymorphicModel, EnviPathModel):
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
s.PACKAGE_IMPLEMENTATION, verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
||||||
)
|
)
|
||||||
|
|
||||||
def _url(self):
|
def _url(self):
|
||||||
@ -2061,17 +2070,17 @@ class EPModel(PolymorphicModel, EnviPathModel):
|
|||||||
|
|
||||||
class PackageBasedModel(EPModel):
|
class PackageBasedModel(EPModel):
|
||||||
rule_packages = models.ManyToManyField(
|
rule_packages = models.ManyToManyField(
|
||||||
"Package",
|
s.PACKAGE_IMPLEMENTATION,
|
||||||
verbose_name="Rule Packages",
|
verbose_name="Rule Packages",
|
||||||
related_name="%(app_label)s_%(class)s_rule_packages",
|
related_name="%(app_label)s_%(class)s_rule_packages",
|
||||||
)
|
)
|
||||||
data_packages = models.ManyToManyField(
|
data_packages = models.ManyToManyField(
|
||||||
"Package",
|
s.PACKAGE_IMPLEMENTATION,
|
||||||
verbose_name="Data Packages",
|
verbose_name="Data Packages",
|
||||||
related_name="%(app_label)s_%(class)s_data_packages",
|
related_name="%(app_label)s_%(class)s_data_packages",
|
||||||
)
|
)
|
||||||
eval_packages = models.ManyToManyField(
|
eval_packages = models.ManyToManyField(
|
||||||
"Package",
|
s.PACKAGE_IMPLEMENTATION,
|
||||||
verbose_name="Evaluation Packages",
|
verbose_name="Evaluation Packages",
|
||||||
related_name="%(app_label)s_%(class)s_eval_packages",
|
related_name="%(app_label)s_%(class)s_eval_packages",
|
||||||
)
|
)
|
||||||
@ -3439,7 +3448,7 @@ class PluginModel(EPModel):
|
|||||||
|
|
||||||
class Scenario(EnviPathModel):
|
class Scenario(EnviPathModel):
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
s.PACKAGE_IMPLEMENTATION, verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
||||||
)
|
)
|
||||||
scenario_date = models.CharField(max_length=256, null=False, blank=False, default="No date")
|
scenario_date = models.CharField(max_length=256, null=False, blank=False, default="No date")
|
||||||
scenario_type = models.CharField(
|
scenario_type = models.CharField(
|
||||||
@ -3590,7 +3599,7 @@ class Setting(EnviPathModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
rule_packages = models.ManyToManyField(
|
rule_packages = models.ManyToManyField(
|
||||||
"Package",
|
s.PACKAGE_IMPLEMENTATION,
|
||||||
verbose_name="Setting Rule Packages",
|
verbose_name="Setting Rule Packages",
|
||||||
related_name="setting_rule_packages",
|
related_name="setting_rule_packages",
|
||||||
blank=True,
|
blank=True,
|
||||||
|
|||||||
@ -7,9 +7,12 @@ from uuid import uuid4
|
|||||||
|
|
||||||
from celery import shared_task
|
from celery import shared_task
|
||||||
from celery.utils.functional import LRUCache
|
from celery.utils.functional import LRUCache
|
||||||
|
from django.conf import settings as s
|
||||||
|
|
||||||
from epdb.logic import SPathway
|
from epdb.logic import SPathway
|
||||||
from epdb.models import EPModel, JobLog, Node, Package, Pathway, Rule, Setting, User, Edge
|
from epdb.models import Edge, EPModel, JobLog, Node, Pathway, Rule, Setting, User
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
ML_CACHE = LRUCache(3) # Cache the three most recent ML models to reduce load times.
|
ML_CACHE = LRUCache(3) # Cache the three most recent ML models to reduce load times.
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from typing import List, Dict, Any
|
from typing import Any, Dict, List
|
||||||
|
|
||||||
from django.conf import settings as s
|
from django.conf import settings as s
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.http import JsonResponse, HttpResponse, HttpResponseNotAllowed, HttpResponseBadRequest
|
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed, JsonResponse
|
||||||
from django.shortcuts import render, redirect
|
from django.shortcuts import redirect, render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
from envipy_additional_information import NAME_MAPPING
|
from envipy_additional_information import NAME_MAPPING
|
||||||
@ -14,42 +14,43 @@ from oauth2_provider.decorators import protected_resource
|
|||||||
from utilities.chem import FormatConverter, IndigoUtils
|
from utilities.chem import FormatConverter, IndigoUtils
|
||||||
from utilities.decorators import package_permission_required
|
from utilities.decorators import package_permission_required
|
||||||
from utilities.misc import HTMLGenerator
|
from utilities.misc import HTMLGenerator
|
||||||
|
|
||||||
from .logic import (
|
from .logic import (
|
||||||
|
EPDBURLParser,
|
||||||
GroupManager,
|
GroupManager,
|
||||||
PackageManager,
|
PackageManager,
|
||||||
UserManager,
|
|
||||||
SettingManager,
|
|
||||||
SearchManager,
|
SearchManager,
|
||||||
EPDBURLParser,
|
SettingManager,
|
||||||
|
UserManager,
|
||||||
)
|
)
|
||||||
from .models import (
|
from .models import (
|
||||||
Package,
|
APIToken,
|
||||||
GroupPackagePermission,
|
|
||||||
Group,
|
|
||||||
CompoundStructure,
|
|
||||||
Compound,
|
Compound,
|
||||||
|
CompoundStructure,
|
||||||
|
Edge,
|
||||||
|
EnviFormer,
|
||||||
|
EnzymeLink,
|
||||||
|
EPModel,
|
||||||
|
ExternalDatabase,
|
||||||
|
ExternalIdentifier,
|
||||||
|
Group,
|
||||||
|
GroupPackagePermission,
|
||||||
|
JobLog,
|
||||||
|
License,
|
||||||
|
MLRelativeReasoning,
|
||||||
|
Node,
|
||||||
|
Pathway,
|
||||||
|
Permission,
|
||||||
Reaction,
|
Reaction,
|
||||||
Rule,
|
Rule,
|
||||||
Pathway,
|
|
||||||
Node,
|
|
||||||
EPModel,
|
|
||||||
EnviFormer,
|
|
||||||
MLRelativeReasoning,
|
|
||||||
RuleBasedRelativeReasoning,
|
RuleBasedRelativeReasoning,
|
||||||
Scenario,
|
Scenario,
|
||||||
SimpleAmbitRule,
|
SimpleAmbitRule,
|
||||||
APIToken,
|
|
||||||
UserPackagePermission,
|
|
||||||
Permission,
|
|
||||||
License,
|
|
||||||
User,
|
User,
|
||||||
Edge,
|
UserPackagePermission,
|
||||||
ExternalDatabase,
|
|
||||||
ExternalIdentifier,
|
|
||||||
EnzymeLink,
|
|
||||||
JobLog,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ -82,8 +83,7 @@ def login(request):
|
|||||||
return render(request, "static/login.html", context)
|
return render(request, "static/login.html", context)
|
||||||
|
|
||||||
elif request.method == "POST":
|
elif request.method == "POST":
|
||||||
from django.contrib.auth import authenticate
|
from django.contrib.auth import authenticate, login
|
||||||
from django.contrib.auth import login
|
|
||||||
|
|
||||||
username = request.POST.get("username")
|
username = request.POST.get("username")
|
||||||
password = request.POST.get("password")
|
password = request.POST.get("password")
|
||||||
@ -832,7 +832,7 @@ def package_models(request, package_uuid):
|
|||||||
request, "Invalid model type.", f'Model type "{model_type}" is not supported."'
|
request, "Invalid model type.", f'Model type "{model_type}" is not supported."'
|
||||||
)
|
)
|
||||||
|
|
||||||
from .tasks import dispatch, build_model
|
from .tasks import build_model, dispatch
|
||||||
|
|
||||||
dispatch(current_user, build_model, mod.pk)
|
dispatch(current_user, build_model, mod.pk)
|
||||||
|
|
||||||
@ -2325,9 +2325,9 @@ def package_scenarios(request, package_uuid):
|
|||||||
context["unreviewed_objects"] = unreviewed_scenario_qs
|
context["unreviewed_objects"] = unreviewed_scenario_qs
|
||||||
|
|
||||||
from envipy_additional_information import (
|
from envipy_additional_information import (
|
||||||
|
SEDIMENT_ADDITIONAL_INFORMATION,
|
||||||
SLUDGE_ADDITIONAL_INFORMATION,
|
SLUDGE_ADDITIONAL_INFORMATION,
|
||||||
SOIL_ADDITIONAL_INFORMATION,
|
SOIL_ADDITIONAL_INFORMATION,
|
||||||
SEDIMENT_ADDITIONAL_INFORMATION,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
context["scenario_types"] = {
|
context["scenario_types"] = {
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@ -1,22 +1,19 @@
|
|||||||
import gzip
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os.path
|
import os.path
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from django.conf import settings as s
|
from django.conf import settings as s
|
||||||
from django.http import HttpResponseNotAllowed
|
from django.http import HttpResponseNotAllowed
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
|
||||||
from epdb.logic import PackageManager
|
|
||||||
from epdb.models import Rule, SimpleAmbitRule, Package, CompoundStructure
|
|
||||||
from epdb.views import get_base_context, _anonymous_or_real
|
|
||||||
from utilities.chem import FormatConverter
|
|
||||||
|
|
||||||
|
|
||||||
from rdkit import Chem
|
from rdkit import Chem
|
||||||
from rdkit.Chem.MolStandardize import rdMolStandardize
|
from rdkit.Chem.MolStandardize import rdMolStandardize
|
||||||
|
|
||||||
|
from epdb.models import CompoundStructure, Rule, SimpleAmbitRule
|
||||||
|
from epdb.views import get_base_context
|
||||||
|
from utilities.chem import FormatConverter
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ -59,9 +56,7 @@ def run_both_engines(SMILES, SMIRKS):
|
|||||||
set(
|
set(
|
||||||
[
|
[
|
||||||
normalize_smiles(str(x))
|
normalize_smiles(str(x))
|
||||||
for x in FormatConverter.sanitize_smiles(
|
for x in FormatConverter.sanitize_smiles([str(s) for s in all_rdkit_prods])[0]
|
||||||
[str(s) for s in all_rdkit_prods]
|
|
||||||
)[0]
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -85,8 +80,7 @@ def migration(request):
|
|||||||
url="http://localhost:8000/package/32de3cf4-e3e6-4168-956e-32fa5ddb0ce1"
|
url="http://localhost:8000/package/32de3cf4-e3e6-4168-956e-32fa5ddb0ce1"
|
||||||
)
|
)
|
||||||
ALL_SMILES = [
|
ALL_SMILES = [
|
||||||
cs.smiles
|
cs.smiles for cs in CompoundStructure.objects.filter(compound__package=BBD)
|
||||||
for cs in CompoundStructure.objects.filter(compound__package=BBD)
|
|
||||||
]
|
]
|
||||||
RULES = SimpleAmbitRule.objects.filter(package=BBD)
|
RULES = SimpleAmbitRule.objects.filter(package=BBD)
|
||||||
|
|
||||||
@ -142,9 +136,7 @@ def migration(request):
|
|||||||
)
|
)
|
||||||
|
|
||||||
for r in migration_status["results"]:
|
for r in migration_status["results"]:
|
||||||
r["detail_url"] = r["detail_url"].replace(
|
r["detail_url"] = r["detail_url"].replace("http://localhost:8000", s.SERVER_URL)
|
||||||
"http://localhost:8000", s.SERVER_URL
|
|
||||||
)
|
|
||||||
|
|
||||||
context.update(**migration_status)
|
context.update(**migration_status)
|
||||||
|
|
||||||
@ -152,8 +144,6 @@ def migration(request):
|
|||||||
|
|
||||||
|
|
||||||
def migration_detail(request, package_uuid, rule_uuid):
|
def migration_detail(request, package_uuid, rule_uuid):
|
||||||
current_user = _anonymous_or_real(request)
|
|
||||||
|
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
context = get_base_context(request)
|
context = get_base_context(request)
|
||||||
|
|
||||||
@ -235,9 +225,7 @@ def compare(request):
|
|||||||
context["smirks"] = (
|
context["smirks"] = (
|
||||||
"[#1,#6:6][#7;X3;!$(NC1CC1)!$([N][C]=O)!$([!#8]CNC=O):1]([#1,#6:7])[#6;A;X4:2][H:3]>>[#1,#6:6][#7;X3:1]([#1,#6:7])[H:3].[#6;A:2]=O"
|
"[#1,#6:6][#7;X3;!$(NC1CC1)!$([N][C]=O)!$([!#8]CNC=O):1]([#1,#6:7])[#6;A;X4:2][H:3]>>[#1,#6:6][#7;X3:1]([#1,#6:7])[H:3].[#6;A:2]=O"
|
||||||
)
|
)
|
||||||
context["smiles"] = (
|
context["smiles"] = "C(CC(=O)N[C@@H](CS[Se-])C(=O)NCC(=O)[O-])[C@@H](C(=O)[O-])N"
|
||||||
"C(CC(=O)N[C@@H](CS[Se-])C(=O)NCC(=O)[O-])[C@@H](C(=O)[O-])N"
|
|
||||||
)
|
|
||||||
return render(request, "compare.html", context)
|
return render(request, "compare.html", context)
|
||||||
|
|
||||||
elif request.method == "POST":
|
elif request.method == "POST":
|
||||||
|
|||||||
0
public/__init__.py
Normal file
0
public/__init__.py
Normal file
1
public/admin.py
Normal file
1
public/admin.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Register your models here.
|
||||||
6
public/apps.py
Normal file
6
public/apps.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class PublicConfig(AppConfig):
|
||||||
|
default_auto_field = "django.db.models.BigAutoField"
|
||||||
|
name = "public"
|
||||||
56
public/migrations/0001_initial.py
Normal file
56
public/migrations/0001_initial.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# Generated by Django 5.2.7 on 2025-10-29 13:32
|
||||||
|
|
||||||
|
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")),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
"db_table": "epdb_package",
|
||||||
|
"managed": False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
16
public/migrations/0002_alter_package_options.py
Normal file
16
public/migrations/0002_alter_package_options.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Generated by Django 5.2.7 on 2025-10-29 18:39
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
("public", "0001_initial"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name="package",
|
||||||
|
options={},
|
||||||
|
),
|
||||||
|
]
|
||||||
25
public/migrations/0003_package_license.py
Normal file
25
public/migrations/0003_package_license.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Generated by Django 5.2.7 on 2025-10-29 18:40
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
("epdb", "0010_alter_userpackagepermission_package_and_more"),
|
||||||
|
("public", "0002_alter_package_options"),
|
||||||
|
]
|
||||||
|
|
||||||
|
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",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
0
public/migrations/__init__.py
Normal file
0
public/migrations/__init__.py
Normal file
6
public/models.py
Normal file
6
public/models.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from epdb.models import AbstractPackage
|
||||||
|
|
||||||
|
|
||||||
|
class Package(AbstractPackage):
|
||||||
|
class Meta:
|
||||||
|
db_table = "epdb_package"
|
||||||
1
public/tests.py
Normal file
1
public/tests.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Create your tests here.
|
||||||
1
public/views.py
Normal file
1
public/views.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Create your views here.
|
||||||
@ -1,10 +1,15 @@
|
|||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from tempfile import TemporaryDirectory
|
from tempfile import TemporaryDirectory
|
||||||
|
|
||||||
|
from django.conf import settings as s
|
||||||
from django.test import TestCase, tag
|
from django.test import TestCase, tag
|
||||||
|
|
||||||
from epdb.logic import PackageManager
|
from epdb.logic import PackageManager
|
||||||
from epdb.models import User, EnviFormer, Package, Setting
|
from epdb.models import EnviFormer, Setting, User
|
||||||
from epdb.tasks import predict_simple, predict
|
from epdb.tasks import predict, predict_simple
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
def measure_predict(mod, pathway_pk=None):
|
def measure_predict(mod, pathway_pk=None):
|
||||||
|
|||||||
@ -1,10 +1,13 @@
|
|||||||
from tempfile import TemporaryDirectory
|
from tempfile import TemporaryDirectory
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from django.conf import settings as s
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
from epdb.logic import PackageManager
|
from epdb.logic import PackageManager
|
||||||
from epdb.models import User, MLRelativeReasoning, Package
|
from epdb.models import MLRelativeReasoning, User
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class ModelTest(TestCase):
|
class ModelTest(TestCase):
|
||||||
|
|||||||
@ -1,8 +1,12 @@
|
|||||||
|
from django.conf import settings as s
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from networkx.utils.misc import graphs_equal
|
from networkx.utils.misc import graphs_equal
|
||||||
|
|
||||||
from epdb.logic import PackageManager, SPathway
|
from epdb.logic import PackageManager, SPathway
|
||||||
from epdb.models import Pathway, User, Package
|
from epdb.models import Pathway, User
|
||||||
from utilities.ml import multigen_eval, pathway_edit_eval, graph_from_pathway
|
from utilities.ml import graph_from_pathway, multigen_eval, pathway_edit_eval
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class MultiGenTest(TestCase):
|
class MultiGenTest(TestCase):
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
from unittest.mock import patch, MagicMock, PropertyMock
|
from unittest.mock import MagicMock, PropertyMock, patch
|
||||||
|
|
||||||
|
from django.conf import settings as s
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
from epdb.logic import PackageManager
|
from epdb.logic import PackageManager
|
||||||
from epdb.models import User, SimpleAmbitRule
|
from epdb.models import SimpleAmbitRule, User
|
||||||
|
|
||||||
|
|
||||||
class SimpleAmbitRuleTest(TestCase):
|
class SimpleAmbitRuleTest(TestCase):
|
||||||
@ -209,7 +210,7 @@ class SimpleAmbitRuleTest(TestCase):
|
|||||||
|
|
||||||
self.assertEqual(rule.products_smarts, expected_products)
|
self.assertEqual(rule.products_smarts, expected_products)
|
||||||
|
|
||||||
@patch("epdb.models.Package.objects")
|
@patch(f"{s.PACKAGE_MODULE_PATH}.objects")
|
||||||
def test_related_reactions_property(self, mock_package_objects):
|
def test_related_reactions_property(self, mock_package_objects):
|
||||||
"""Test related_reactions property returns correct queryset."""
|
"""Test related_reactions property returns correct queryset."""
|
||||||
mock_qs = MagicMock()
|
mock_qs = MagicMock()
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
|
from django.conf import settings as s
|
||||||
from django.test import TestCase, override_settings
|
from django.test import TestCase, override_settings
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.conf import settings as s
|
|
||||||
|
|
||||||
from epdb.logic import UserManager
|
from epdb.logic import UserManager
|
||||||
from epdb.models import Package, User
|
from epdb.models import User
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
@override_settings(MODEL_DIR=s.FIXTURE_DIRS[0] / "models", CELERY_TASK_ALWAYS_EAGER=True)
|
@override_settings(MODEL_DIR=s.FIXTURE_DIRS[0] / "models", CELERY_TASK_ALWAYS_EAGER=True)
|
||||||
|
|||||||
@ -4,7 +4,9 @@ from django.test import TestCase, tag
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from epdb.logic import UserManager
|
from epdb.logic import UserManager
|
||||||
from epdb.models import Package, UserPackagePermission, Permission, GroupPackagePermission, Group
|
from epdb.models import Group, GroupPackagePermission, Permission, UserPackagePermission
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class PackageViewTest(TestCase):
|
class PackageViewTest(TestCase):
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
|
from django.conf import settings as s
|
||||||
from django.test import TestCase, override_settings
|
from django.test import TestCase, override_settings
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.conf import settings as s
|
|
||||||
|
|
||||||
from epdb.logic import UserManager, PackageManager
|
from epdb.logic import PackageManager, UserManager
|
||||||
from epdb.models import Pathway, Edge
|
from epdb.models import Edge, Pathway
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
@override_settings(MODEL_DIR=s.FIXTURE_DIRS[0] / "models", CELERY_TASK_ALWAYS_EAGER=True)
|
@override_settings(MODEL_DIR=s.FIXTURE_DIRS[0] / "models", CELERY_TASK_ALWAYS_EAGER=True)
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
|
from django.conf import settings as s
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from envipy_additional_information import Temperature, Interval
|
from envipy_additional_information import Interval, Temperature
|
||||||
|
|
||||||
from epdb.logic import UserManager, PackageManager
|
from epdb.logic import PackageManager, UserManager
|
||||||
from epdb.models import Reaction, Scenario, ExternalDatabase
|
from epdb.models import ExternalDatabase, Reaction, Scenario
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class ReactionViewTest(TestCase):
|
class ReactionViewTest(TestCase):
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
|
from django.conf import settings as s
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from django.urls import reverse
|
||||||
|
|
||||||
from epdb.logic import PackageManager
|
from epdb.logic import PackageManager
|
||||||
from epdb.models import Package, User
|
from epdb.models import User
|
||||||
from django.urls import reverse
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
|
|
||||||
class UserViewTest(TestCase):
|
class UserViewTest(TestCase):
|
||||||
|
|||||||
@ -1,10 +1,12 @@
|
|||||||
# decorators.py
|
# decorators.py
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
|
||||||
|
from django.conf import settings as s
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
|
|
||||||
from epdb.logic import PackageManager
|
from epdb.logic import PackageManager
|
||||||
from epdb.models import Package
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
# Map HTTP methods to required permissions
|
# Map HTTP methods to required permissions
|
||||||
DEFAULT_METHOD_PERMISSIONS = {
|
DEFAULT_METHOD_PERMISSIONS = {
|
||||||
|
|||||||
@ -11,6 +11,7 @@ from enum import Enum
|
|||||||
from types import NoneType
|
from types import NoneType
|
||||||
from typing import Any, Dict, List
|
from typing import Any, Dict, List
|
||||||
|
|
||||||
|
from django.conf import settings as s
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from envipy_additional_information import NAME_MAPPING, EnviPyModel, Interval
|
from envipy_additional_information import NAME_MAPPING, EnviPyModel, Interval
|
||||||
from pydantic import BaseModel, HttpUrl
|
from pydantic import BaseModel, HttpUrl
|
||||||
@ -26,7 +27,6 @@ from epdb.models import (
|
|||||||
License,
|
License,
|
||||||
MLRelativeReasoning,
|
MLRelativeReasoning,
|
||||||
Node,
|
Node,
|
||||||
Package,
|
|
||||||
ParallelRule,
|
ParallelRule,
|
||||||
Pathway,
|
Pathway,
|
||||||
PluginModel,
|
PluginModel,
|
||||||
@ -41,6 +41,8 @@ from epdb.models import (
|
|||||||
)
|
)
|
||||||
from utilities.chem import FormatConverter
|
from utilities.chem import FormatConverter
|
||||||
|
|
||||||
|
Package = s.GET_PACKAGE_MODEL()
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user