diff --git a/epdb/legacy_api.py b/epdb/legacy_api.py index 4d2538af..079ea3d0 100644 --- a/epdb/legacy_api.py +++ b/epdb/legacy_api.py @@ -1,3 +1,4 @@ +from collections import defaultdict from typing import Any, Dict, List, Optional import nh3 @@ -11,8 +12,16 @@ from ninja.security import SessionAuth from utilities.chem import FormatConverter from utilities.misc import PackageExporter -from .logic import GroupManager, PackageManager, SearchManager, SettingManager, UserManager +from .logic import ( + EPDBURLParser, + GroupManager, + PackageManager, + SearchManager, + SettingManager, + UserManager, +) from .models import ( + AdditionalInformation, Compound, CompoundStructure, Edge, @@ -1329,7 +1338,14 @@ class ScenarioSchema(Schema): @staticmethod def resolve_collection(obj: Scenario): - return obj.additional_information + res = defaultdict(list) + + for ai in obj.get_additional_information(direct_only=False): + data = ai.data + data["related"] = ai.content_object.simple_json() if ai.content_object else None + res[ai.type].append(data) + + return res @staticmethod def resolve_review_status(obj: Rule): @@ -1394,7 +1410,11 @@ def create_package_scenario(request, package_uuid): study_type = request.POST.get("type") ais = [] - types = request.POST.get("adInfoTypes[]", "").split(",") + types = request.POST.get("adInfoTypes[]", []) + + if types: + types = types.split(",") + for t in types: ais.append(build_additional_information_from_request(request, t)) @@ -1436,6 +1456,49 @@ def delete_scenario(request, package_uuid, scenario_uuid): } +@router.post( + "/package/{uuid:package_uuid}/additional-information", response={200: str | Any, 403: Error} +) +def create_package_additional_information(request, package_uuid): + from utilities.legacy import build_additional_information_from_request + + try: + p = get_package_for_write(request.user, package_uuid) + + scen = request.POST.get("scenario") + scenario = Scenario.objects.get(package=p, url=scen) + + url_parser = EPDBURLParser(request.POST.get("attach_obj")) + attach_obj = url_parser.get_object() + + if not hasattr(attach_obj, "additional_information"): + raise ValueError("Can't attach additional information to this object!") + + if not attach_obj.url.startswith(p.url): + raise ValueError( + "Additional Information can only be set to objects stored in the same package!" + ) + + types = request.POST.get("adInfoTypes[]", "").split(",") + + for t in types: + ai = build_additional_information_from_request(request, t) + + AdditionalInformation.create( + p, + ai, + scenario=scenario, + content_object=attach_obj, + ) + + # TODO implement additional information endpoint ? + return redirect(f"{scenario.url}") + except ValueError: + return 403, { + "message": f"Getting Package with id {package_uuid} failed due to insufficient rights!" + } + + ########### # Pathway # ########### diff --git a/epdb/models.py b/epdb/models.py index 558eae66..5e011ae6 100644 --- a/epdb/models.py +++ b/epdb/models.py @@ -4191,7 +4191,6 @@ class AdditionalInformation(models.Model): ai: "EnviPyModel", scenario=None, content_object=None, - skip_cleaning=False, ): add_inf = AdditionalInformation() add_inf.package = package diff --git a/static/js/alpine/components/schema-form.js b/static/js/alpine/components/schema-form.js index 223981a7..5257bb52 100644 --- a/static/js/alpine/components/schema-form.js +++ b/static/js/alpine/components/schema-form.js @@ -88,6 +88,7 @@ document.addEventListener("alpine:init", () => { options.debugErrors ?? (typeof window !== "undefined" && window.location?.search?.includes("debugErrors=1")), + attach_object: options.attach_object || null, async init() { if (options.schemaUrl) { diff --git a/templates/components/schema_form.html b/templates/components/schema_form.html index 3036b4b5..75cc9591 100644 --- a/templates/components/schema_form.html +++ b/templates/components/schema_form.html @@ -18,8 +18,25 @@