[Fix] AppDomain Leftovers (#161)

Co-authored-by: Tim Lorsbach <tim@lorsba.ch>
Reviewed-on: enviPath/enviPy#161
This commit is contained in:
2025-10-16 08:17:39 +13:00
parent 93dd811e39
commit d5ebb23622
4 changed files with 70 additions and 10 deletions

View File

@ -1,8 +1,10 @@
from django.apps import apps from django.apps import apps
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db.models import F, Value from django.db.models import F, Value, TextField, JSONField
from django.db.models.functions import Replace from django.db.models.functions import Replace, Cast
from epdb.models import EnviPathModel
class Command(BaseCommand): class Command(BaseCommand):
@ -49,3 +51,14 @@ class Command(BaseCommand):
obj_cls.objects.update( obj_cls.objects.update(
url=Replace(F("url"), Value(options["old"]), Value(options["new"])) url=Replace(F("url"), Value(options["old"]), Value(options["new"]))
) )
if issubclass(obj_cls, EnviPathModel):
obj_cls.objects.update(
kv=Cast(
Replace(
Cast(F("kv"), output_field=TextField()),
Value(options["old"]),
Value(options["new"]),
),
output_field=JSONField(),
)
)

View File

@ -1454,12 +1454,20 @@ def package_rule(request, package_uuid, rule_uuid):
logger.info( logger.info(
f"Rule {current_rule.uuid} returned multiple product sets on {smiles}, picking the first one." f"Rule {current_rule.uuid} returned multiple product sets on {smiles}, picking the first one."
) )
# Some Rules are touching unrelated areas which might result in ~ indicating
smirks = f"{stand_smiles}>>{'.'.join(sorted(res[0]))}" # any bond (-, =, #). For drawing we need a concrete bond. -> use single bond
product_smiles = [x.replace("~", "-") for x in res[0]]
smirks = f"{stand_smiles}>>{'.'.join(sorted(product_smiles))}"
# Usually the functional groups are a mapping of fg -> count # Usually the functional groups are a mapping of fg -> count
# As we are doing it on the fly here fake a high count to ensure that its properly highlighted # As we are doing it on the fly here fake a high count to ensure that its properly highlighted
educt_functional_groups = {x: 1000 for x in current_rule.reactants_smarts}
product_functional_groups = {x: 1000 for x in current_rule.products_smarts} if isinstance(current_rule, SimpleAmbitRule):
educt_functional_groups = {current_rule.reactants_smarts: 1000}
product_functional_groups = {current_rule.products_smarts: 1000}
else:
educt_functional_groups = {x: 1000 for x in current_rule.reactants_smarts}
product_functional_groups = {x: 1000 for x in current_rule.products_smarts}
return HttpResponse( return HttpResponse(
IndigoUtils.smirks_to_svg( IndigoUtils.smirks_to_svg(
smirks, smirks,
@ -1993,9 +2001,42 @@ def package_pathway_node(request, package_uuid, pathway_uuid, node_uuid):
if request.method == "GET": if request.method == "GET":
is_image_request = request.GET.get("image") is_image_request = request.GET.get("image")
is_highlight_request = request.GET.get("highlight", False)
is_highlight_reactivity = request.GET.get("highlightReactivity", False)
if is_image_request: if is_image_request:
if is_image_request == "svg": if is_image_request == "svg":
svg_data = current_node.as_svg # TODO optimize this chain
if is_highlight_request:
# User functional groups covered by the model training data
fgs = {}
if current_pathway.setting:
if current_pathway.setting.model:
if current_pathway.setting.model.app_domain:
fgs = current_pathway.setting.model.app_domain.functional_groups
svg_data = IndigoUtils.mol_to_svg(
current_node.default_node_label.smiles, functional_groups=fgs
)
elif is_highlight_reactivity:
# Use reactant smarts to show all reaction sites
# set a high count to obtain a strong color
ad_data = current_node.get_app_domain_assessment_data()
fgs = {}
for t in ad_data.get("assessment", {}).get("transformations", []):
r = Rule.objects.get(url=t["rule"]["url"])
if isinstance(r, SimpleAmbitRule):
fgs[r.reactants_smarts] = 1000
else:
for sr in r.srs:
fgs[sr.reactants_smarts] = 1000
svg_data = IndigoUtils.mol_to_svg(
current_node.default_node_label.smiles, functional_groups=fgs
)
else:
svg_data = current_node.as_svg
return HttpResponse(svg_data, content_type="image/svg+xml") return HttpResponse(svg_data, content_type="image/svg+xml")
context = get_base_context(request) context = get_base_context(request)

View File

@ -646,8 +646,8 @@ function handleAssessmentResponse(depict_url, data) {
var reactivityCentersImgSrc = null; var reactivityCentersImgSrc = null;
if (data['assessment']['node'] !== undefined) { if (data['assessment']['node'] !== undefined) {
functionalGroupsImgSrc = "<img width='400' src='" + data['assessment']['node']['image'] + "'>"; functionalGroupsImgSrc = "<img width='400' src='" + data['assessment']['node']['image'] + "&highlight=true'>";
reactivityCentersImgSrc = "<img width='400' src='" + data['assessment']['node']['image'] + "'>" reactivityCentersImgSrc = "<img width='400' src='" + data['assessment']['node']['image'] + "&highlightReactivity=true'>"
} else { } else {
functionalGroupsImgSrc = "<img width='400' src=\"" + depict_url + "?smiles=" + encodeURIComponent(data['assessment']['smiles']) + "\">"; functionalGroupsImgSrc = "<img width='400' src=\"" + depict_url + "?smiles=" + encodeURIComponent(data['assessment']['smiles']) + "\">";
reactivityCentersImgSrc = "<img width='400' src=\"" + depict_url + "?smiles=" + encodeURIComponent(data['assessment']['smiles']) + "\">" reactivityCentersImgSrc = "<img width='400' src=\"" + depict_url + "?smiles=" + encodeURIComponent(data['assessment']['smiles']) + "\">"
@ -784,4 +784,4 @@ function handleAssessmentResponse(depict_url, data) {
$("#appDomainAssessmentResultTable").append(res); $("#appDomainAssessmentResultTable").append(res);
} }

View File

@ -729,6 +729,7 @@ class IndigoUtils(object):
height: int = 0, height: int = 0,
educt_functional_groups: Dict[str, int] = None, educt_functional_groups: Dict[str, int] = None,
product_functional_groups: Dict[str, int] = None, product_functional_groups: Dict[str, int] = None,
debug: bool = False,
): ):
if educt_functional_groups is None: if educt_functional_groups is None:
educt_functional_groups = {} educt_functional_groups = {}
@ -739,6 +740,11 @@ class IndigoUtils(object):
i = Indigo() i = Indigo()
renderer = IndigoRenderer(i) renderer = IndigoRenderer(i)
if debug:
i.setOption("render-atom-ids-visible", True)
i.setOption("render-bond-ids-visible", False)
i.setOption("render-atom-bond-ids-from-one", True)
i.setOption("render-output-format", "svg") i.setOption("render-output-format", "svg")
i.setOption("render-coloring", True) i.setOption("render-coloring", True)
i.setOption("render-image-size", width, height) i.setOption("render-image-size", width, height)