forked from enviPath/enviPy
[Feature] Attach AdditionalInformation to Nodes (#428)
Co-authored-by: Tim Lorsbach <tim@lorsba.ch> Reviewed-on: enviPath/enviPy#428
This commit is contained in:
@ -9,8 +9,8 @@ from envipy_additional_information import registry
|
||||
from envipy_additional_information.groups import GroupEnum
|
||||
from epapi.utils.schema_transformers import build_rjsf_output
|
||||
from epapi.utils.validation_errors import handle_validation_error
|
||||
from epdb.models import AdditionalInformation
|
||||
from ..dal import get_scenario_for_read, get_scenario_for_write
|
||||
from epdb.models import AdditionalInformation, Scenario, Node
|
||||
from ..dal import get_scenario_for_read, get_scenario_for_write, get_package_for_write
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -58,6 +58,61 @@ def list_scenario_info(request, scenario_uuid: UUID):
|
||||
return result
|
||||
|
||||
|
||||
@router.post("/information/{model_name}/")
|
||||
def add_object_info(request, model_name: str, payload: Dict[str, Any] = Body(...)):
|
||||
from epdb.views import EPDBURLParser
|
||||
|
||||
cls = registry.get_model(model_name.lower())
|
||||
if not cls:
|
||||
raise HttpError(404, f"Unknown model: {model_name}")
|
||||
|
||||
try:
|
||||
instance = cls(**payload) # Pydantic validates
|
||||
except ValidationError as e:
|
||||
handle_validation_error(e)
|
||||
|
||||
if "attach_obj_url" in payload:
|
||||
url_parser = EPDBURLParser(payload["attach_obj_url"])
|
||||
|
||||
if url_parser.contains_package_url():
|
||||
package = get_package_for_write(request.user, url_parser.get_objects()[0].uuid)
|
||||
attach_obj = url_parser.get_object()
|
||||
|
||||
if "scenario_uuid" in payload:
|
||||
scenario = get_scenario_for_read(request.user, payload["scenario_uuid"])
|
||||
else:
|
||||
scenario = Scenario.create(
|
||||
package,
|
||||
name=f"Scenario {Scenario.objects.filter(package=package).count() + 1}",
|
||||
description="no description",
|
||||
scenario_date=None,
|
||||
scenario_type=None,
|
||||
additional_information=[],
|
||||
)
|
||||
|
||||
if isinstance(attach_obj, Node):
|
||||
ai = add_info_to_node(package, instance, scenario, attach_obj)
|
||||
else:
|
||||
raise HttpError(404, f"Bad request - Not implemented for {type(attach_obj)}!")
|
||||
|
||||
return {"status": "created", "uuid": ai.uuid}
|
||||
|
||||
raise HttpError(404, "Bad request!")
|
||||
|
||||
|
||||
def add_info_to_node(package, add_inf, scenario, node):
|
||||
ai = AdditionalInformation.create(
|
||||
package,
|
||||
add_inf,
|
||||
scenario=scenario,
|
||||
content_object=node,
|
||||
)
|
||||
|
||||
node.pathway.scenarios.add(scenario)
|
||||
|
||||
return ai
|
||||
|
||||
|
||||
@router.post("/scenario/{uuid:scenario_uuid}/information/{model_name}/")
|
||||
def add_scenario_info(
|
||||
request, scenario_uuid: UUID, model_name: str, payload: Dict[str, Any] = Body(...)
|
||||
|
||||
Reference in New Issue
Block a user