dsp-tools 0.9.13__py3-none-any.whl → 18.3.0.post13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dsp_tools/__init__.py +5 -0
- dsp_tools/cli/args.py +47 -0
- dsp_tools/cli/call_action.py +85 -0
- dsp_tools/cli/call_action_files_only.py +101 -0
- dsp_tools/cli/call_action_with_network.py +207 -0
- dsp_tools/cli/create_parsers.py +479 -0
- dsp_tools/cli/entry_point.py +322 -0
- dsp_tools/cli/utils.py +87 -0
- dsp_tools/clients/CLAUDE.md +420 -0
- dsp_tools/clients/authentication_client.py +14 -0
- dsp_tools/clients/authentication_client_live.py +66 -0
- dsp_tools/clients/connection.py +35 -0
- dsp_tools/clients/connection_live.py +233 -0
- dsp_tools/clients/fuseki_metrics.py +60 -0
- dsp_tools/clients/group_user_clients.py +35 -0
- dsp_tools/clients/group_user_clients_live.py +181 -0
- dsp_tools/clients/legal_info_client.py +23 -0
- dsp_tools/clients/legal_info_client_live.py +132 -0
- dsp_tools/clients/list_client.py +49 -0
- dsp_tools/clients/list_client_live.py +166 -0
- dsp_tools/clients/metadata_client.py +24 -0
- dsp_tools/clients/metadata_client_live.py +47 -0
- dsp_tools/clients/ontology_clients.py +49 -0
- dsp_tools/clients/ontology_create_client_live.py +166 -0
- dsp_tools/clients/ontology_get_client_live.py +80 -0
- dsp_tools/clients/permissions_client.py +68 -0
- dsp_tools/clients/project_client.py +16 -0
- dsp_tools/clients/project_client_live.py +66 -0
- dsp_tools/commands/create/communicate_problems.py +24 -0
- dsp_tools/commands/create/create.py +134 -0
- dsp_tools/commands/create/create_on_server/cardinalities.py +111 -0
- dsp_tools/commands/create/create_on_server/classes.py +99 -0
- dsp_tools/commands/create/create_on_server/complete_ontologies.py +116 -0
- dsp_tools/commands/create/create_on_server/default_permissions.py +134 -0
- dsp_tools/commands/create/create_on_server/group_users.py +165 -0
- dsp_tools/commands/create/create_on_server/lists.py +163 -0
- dsp_tools/commands/create/create_on_server/mappers.py +12 -0
- dsp_tools/commands/create/create_on_server/onto_utils.py +74 -0
- dsp_tools/commands/create/create_on_server/ontology.py +52 -0
- dsp_tools/commands/create/create_on_server/project.py +68 -0
- dsp_tools/commands/create/create_on_server/properties.py +119 -0
- dsp_tools/commands/create/exceptions.py +29 -0
- dsp_tools/commands/create/lists_only.py +66 -0
- dsp_tools/commands/create/models/create_problems.py +87 -0
- dsp_tools/commands/create/models/parsed_ontology.py +88 -0
- dsp_tools/commands/create/models/parsed_project.py +81 -0
- dsp_tools/commands/create/models/rdf_ontology.py +12 -0
- dsp_tools/commands/create/models/server_project_info.py +100 -0
- dsp_tools/commands/create/parsing/parse_lists.py +45 -0
- dsp_tools/commands/create/parsing/parse_ontology.py +243 -0
- dsp_tools/commands/create/parsing/parse_project.py +149 -0
- dsp_tools/commands/create/parsing/parsing_utils.py +40 -0
- dsp_tools/commands/create/project_validate.py +595 -0
- dsp_tools/commands/create/serialisation/ontology.py +119 -0
- dsp_tools/commands/create/serialisation/project.py +44 -0
- dsp_tools/commands/excel2json/CLAUDE.md +101 -0
- dsp_tools/commands/excel2json/json_header.py +321 -0
- dsp_tools/commands/excel2json/lists/__init__.py +0 -0
- dsp_tools/commands/excel2json/lists/compliance_checks.py +292 -0
- dsp_tools/commands/excel2json/lists/make_lists.py +247 -0
- dsp_tools/commands/excel2json/lists/models/__init__.py +0 -0
- dsp_tools/commands/excel2json/lists/models/deserialise.py +30 -0
- dsp_tools/commands/excel2json/lists/models/input_error.py +216 -0
- dsp_tools/commands/excel2json/lists/models/serialise.py +57 -0
- dsp_tools/commands/excel2json/lists/utils.py +81 -0
- dsp_tools/commands/excel2json/models/__init__.py +0 -0
- dsp_tools/commands/excel2json/models/input_error.py +416 -0
- dsp_tools/commands/excel2json/models/json_header.py +175 -0
- dsp_tools/commands/excel2json/models/list_node_name.py +16 -0
- dsp_tools/commands/excel2json/models/ontology.py +76 -0
- dsp_tools/commands/excel2json/old_lists.py +328 -0
- dsp_tools/commands/excel2json/project.py +280 -0
- dsp_tools/commands/excel2json/properties.py +370 -0
- dsp_tools/commands/excel2json/resources.py +336 -0
- dsp_tools/commands/excel2json/utils.py +352 -0
- dsp_tools/commands/excel2xml/__init__.py +7 -0
- dsp_tools/commands/excel2xml/excel2xml_cli.py +523 -0
- dsp_tools/commands/excel2xml/excel2xml_lib.py +1953 -0
- dsp_tools/commands/excel2xml/propertyelement.py +47 -0
- dsp_tools/commands/get/__init__.py +0 -0
- dsp_tools/commands/get/get.py +166 -0
- dsp_tools/commands/get/get_permissions.py +257 -0
- dsp_tools/commands/get/get_permissions_legacy.py +89 -0
- dsp_tools/commands/get/legacy_models/__init__.py +0 -0
- dsp_tools/commands/get/legacy_models/context.py +318 -0
- dsp_tools/commands/get/legacy_models/group.py +241 -0
- dsp_tools/commands/get/legacy_models/helpers.py +47 -0
- dsp_tools/commands/get/legacy_models/listnode.py +390 -0
- dsp_tools/commands/get/legacy_models/model.py +12 -0
- dsp_tools/commands/get/legacy_models/ontology.py +324 -0
- dsp_tools/commands/get/legacy_models/project.py +366 -0
- dsp_tools/commands/get/legacy_models/propertyclass.py +417 -0
- dsp_tools/commands/get/legacy_models/resourceclass.py +676 -0
- dsp_tools/commands/get/legacy_models/user.py +438 -0
- dsp_tools/commands/get/models/__init__.py +0 -0
- dsp_tools/commands/get/models/permissions_models.py +10 -0
- dsp_tools/commands/id2iri.py +258 -0
- dsp_tools/commands/ingest_xmlupload/__init__.py +0 -0
- dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +178 -0
- dsp_tools/commands/ingest_xmlupload/create_resources/__init__.py +0 -0
- dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +69 -0
- dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +166 -0
- dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +121 -0
- dsp_tools/commands/ingest_xmlupload/ingest_files/__init__.py +0 -0
- dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +64 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/__init__.py +0 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +20 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +57 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +66 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +67 -0
- dsp_tools/commands/resume_xmlupload/__init__.py +0 -0
- dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +96 -0
- dsp_tools/commands/start_stack.py +428 -0
- dsp_tools/commands/update_legal/CLAUDE.md +344 -0
- dsp_tools/commands/update_legal/__init__.py +0 -0
- dsp_tools/commands/update_legal/core.py +182 -0
- dsp_tools/commands/update_legal/csv_operations.py +135 -0
- dsp_tools/commands/update_legal/models.py +87 -0
- dsp_tools/commands/update_legal/xml_operations.py +247 -0
- dsp_tools/commands/validate_data/CLAUDE.md +159 -0
- dsp_tools/commands/validate_data/__init__.py +0 -0
- dsp_tools/commands/validate_data/constants.py +59 -0
- dsp_tools/commands/validate_data/mappers.py +143 -0
- dsp_tools/commands/validate_data/models/__init__.py +0 -0
- dsp_tools/commands/validate_data/models/api_responses.py +45 -0
- dsp_tools/commands/validate_data/models/input_problems.py +119 -0
- dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
- dsp_tools/commands/validate_data/models/validation.py +106 -0
- dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
- dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
- dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
- dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
- dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
- dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
- dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
- dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
- dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
- dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
- dsp_tools/commands/validate_data/sparql/cardinality_shacl.py +209 -0
- dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
- dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
- dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
- dsp_tools/commands/validate_data/utils.py +59 -0
- dsp_tools/commands/validate_data/validate_data.py +283 -0
- dsp_tools/commands/validate_data/validation/__init__.py +0 -0
- dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
- dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
- dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
- dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
- dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
- dsp_tools/commands/xmlupload/__init__.py +0 -0
- dsp_tools/commands/xmlupload/iri_resolver.py +21 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
- dsp_tools/commands/xmlupload/models/__init__.py +0 -0
- dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
- dsp_tools/commands/xmlupload/models/formatted_text_value.py +10 -0
- dsp_tools/commands/xmlupload/models/ingest.py +143 -0
- dsp_tools/commands/xmlupload/models/input_problems.py +58 -0
- dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
- dsp_tools/commands/xmlupload/models/permission.py +45 -0
- dsp_tools/commands/xmlupload/models/permissions_parsed.py +93 -0
- dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
- dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
- dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
- dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
- dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
- dsp_tools/commands/xmlupload/models/upload_clients.py +14 -0
- dsp_tools/commands/xmlupload/models/upload_state.py +20 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/ark2iri.py +55 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/iiif_uri_validator.py +50 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/list_client.py +120 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
- dsp_tools/commands/xmlupload/resource_create_client.py +25 -0
- dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
- dsp_tools/commands/xmlupload/stash/__init__.py +0 -0
- dsp_tools/commands/xmlupload/stash/analyse_circular_reference_graph.py +236 -0
- dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
- dsp_tools/commands/xmlupload/stash/graph_models.py +87 -0
- dsp_tools/commands/xmlupload/stash/stash_circular_references.py +68 -0
- dsp_tools/commands/xmlupload/stash/stash_models.py +109 -0
- dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +106 -0
- dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +196 -0
- dsp_tools/commands/xmlupload/upload_config.py +76 -0
- dsp_tools/commands/xmlupload/write_diagnostic_info.py +27 -0
- dsp_tools/commands/xmlupload/xmlupload.py +516 -0
- dsp_tools/config/__init__.py +0 -0
- dsp_tools/config/logger_config.py +69 -0
- dsp_tools/config/warnings_config.py +32 -0
- dsp_tools/error/__init__.py +0 -0
- dsp_tools/error/custom_warnings.py +39 -0
- dsp_tools/error/exceptions.py +204 -0
- dsp_tools/error/problems.py +10 -0
- dsp_tools/error/xmllib_errors.py +20 -0
- dsp_tools/error/xmllib_warnings.py +54 -0
- dsp_tools/error/xmllib_warnings_util.py +159 -0
- dsp_tools/error/xsd_validation_error_msg.py +19 -0
- dsp_tools/legacy_models/__init__.py +0 -0
- dsp_tools/legacy_models/datetimestamp.py +81 -0
- dsp_tools/legacy_models/langstring.py +253 -0
- dsp_tools/legacy_models/projectContext.py +49 -0
- dsp_tools/py.typed +0 -0
- dsp_tools/resources/schema/data.xsd +648 -0
- dsp_tools/resources/schema/lists-only.json +72 -0
- dsp_tools/resources/schema/project.json +1258 -0
- dsp_tools/resources/schema/properties-only.json +874 -0
- dsp_tools/resources/schema/resources-only.json +140 -0
- dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
- dsp_tools/resources/start-stack/docker-compose.override.yml +11 -0
- dsp_tools/resources/start-stack/docker-compose.yml +88 -0
- dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
- dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
- dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
- dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
- dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
- dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
- dsp_tools/utils/__init__.py +0 -0
- dsp_tools/utils/ansi_colors.py +32 -0
- dsp_tools/utils/data_formats/__init__.py +0 -0
- dsp_tools/utils/data_formats/date_util.py +166 -0
- dsp_tools/utils/data_formats/iri_util.py +30 -0
- dsp_tools/utils/data_formats/shared.py +81 -0
- dsp_tools/utils/data_formats/uri_util.py +76 -0
- dsp_tools/utils/fuseki_bloating.py +63 -0
- dsp_tools/utils/json_parsing.py +22 -0
- dsp_tools/utils/rdf_constants.py +42 -0
- dsp_tools/utils/rdflib_utils.py +10 -0
- dsp_tools/utils/replace_id_with_iri.py +66 -0
- dsp_tools/utils/request_utils.py +238 -0
- dsp_tools/utils/xml_parsing/__init__.py +0 -0
- dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
- dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
- dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
- dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
- dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
- dsp_tools/xmllib/CLAUDE.md +302 -0
- dsp_tools/xmllib/__init__.py +49 -0
- dsp_tools/xmllib/general_functions.py +877 -0
- dsp_tools/xmllib/internal/__init__.py +0 -0
- dsp_tools/xmllib/internal/checkers.py +162 -0
- dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
- dsp_tools/xmllib/internal/constants.py +46 -0
- dsp_tools/xmllib/internal/input_converters.py +155 -0
- dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
- dsp_tools/xmllib/internal/serialise_resource.py +177 -0
- dsp_tools/xmllib/internal/serialise_values.py +152 -0
- dsp_tools/xmllib/internal/type_aliases.py +11 -0
- dsp_tools/xmllib/models/__init__.py +0 -0
- dsp_tools/xmllib/models/config_options.py +28 -0
- dsp_tools/xmllib/models/date_formats.py +48 -0
- dsp_tools/xmllib/models/dsp_base_resources.py +1542 -0
- dsp_tools/xmllib/models/internal/__init__.py +0 -0
- dsp_tools/xmllib/models/internal/file_values.py +172 -0
- dsp_tools/xmllib/models/internal/geometry.py +162 -0
- dsp_tools/xmllib/models/internal/migration_metadata.py +55 -0
- dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
- dsp_tools/xmllib/models/internal/values.py +342 -0
- dsp_tools/xmllib/models/licenses/__init__.py +0 -0
- dsp_tools/xmllib/models/licenses/other.py +59 -0
- dsp_tools/xmllib/models/licenses/recommended.py +107 -0
- dsp_tools/xmllib/models/permissions.py +41 -0
- dsp_tools/xmllib/models/res.py +1782 -0
- dsp_tools/xmllib/models/root.py +348 -0
- dsp_tools/xmllib/value_checkers.py +434 -0
- dsp_tools/xmllib/value_converters.py +777 -0
- dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
- dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
- dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
- dsp_tools-18.3.0.post13.dist-info/entry_points.txt +3 -0
- dsp_tools-0.9.13.dist-info/LICENSE +0 -674
- dsp_tools-0.9.13.dist-info/METADATA +0 -144
- dsp_tools-0.9.13.dist-info/RECORD +0 -71
- dsp_tools-0.9.13.dist-info/WHEEL +0 -5
- dsp_tools-0.9.13.dist-info/entry_points.txt +0 -3
- dsp_tools-0.9.13.dist-info/top_level.txt +0 -1
- dsplib/models/connection.py +0 -272
- dsplib/models/group.py +0 -296
- dsplib/models/helpers.py +0 -505
- dsplib/models/langstring.py +0 -277
- dsplib/models/listnode.py +0 -578
- dsplib/models/model.py +0 -20
- dsplib/models/ontology.py +0 -448
- dsplib/models/permission.py +0 -112
- dsplib/models/project.py +0 -547
- dsplib/models/propertyclass.py +0 -505
- dsplib/models/resource.py +0 -366
- dsplib/models/resourceclass.py +0 -810
- dsplib/models/sipi.py +0 -30
- dsplib/models/user.py +0 -731
- dsplib/models/value.py +0 -1000
- dsplib/utils/knora-data-schema.xsd +0 -454
- dsplib/utils/knora-schema-lists.json +0 -83
- dsplib/utils/knora-schema.json +0 -434
- dsplib/utils/onto_commons.py +0 -24
- dsplib/utils/onto_create_lists.py +0 -73
- dsplib/utils/onto_create_ontology.py +0 -442
- dsplib/utils/onto_get.py +0 -58
- dsplib/utils/onto_validate.py +0 -33
- dsplib/utils/xml_upload.py +0 -539
- dsplib/widgets/doublepassword.py +0 -80
- knora/MLS-import-libraries.py +0 -84
- knora/dsp_tools.py +0 -96
- knora/dsplib/models/connection.py +0 -272
- knora/dsplib/models/group.py +0 -296
- knora/dsplib/models/helpers.py +0 -506
- knora/dsplib/models/langstring.py +0 -277
- knora/dsplib/models/listnode.py +0 -578
- knora/dsplib/models/model.py +0 -20
- knora/dsplib/models/ontology.py +0 -448
- knora/dsplib/models/permission.py +0 -112
- knora/dsplib/models/project.py +0 -583
- knora/dsplib/models/propertyclass.py +0 -505
- knora/dsplib/models/resource.py +0 -416
- knora/dsplib/models/resourceclass.py +0 -811
- knora/dsplib/models/sipi.py +0 -35
- knora/dsplib/models/user.py +0 -731
- knora/dsplib/models/value.py +0 -1000
- knora/dsplib/utils/knora-data-schema.xsd +0 -464
- knora/dsplib/utils/knora-schema-lists.json +0 -83
- knora/dsplib/utils/knora-schema.json +0 -444
- knora/dsplib/utils/onto_commons.py +0 -24
- knora/dsplib/utils/onto_create_lists.py +0 -73
- knora/dsplib/utils/onto_create_ontology.py +0 -451
- knora/dsplib/utils/onto_get.py +0 -58
- knora/dsplib/utils/onto_validate.py +0 -33
- knora/dsplib/utils/xml_upload.py +0 -540
- knora/dsplib/widgets/doublepassword.py +0 -80
- knora/knora.py +0 -2108
- knora/test.py +0 -99
- knora/testit.py +0 -76
- knora/xml2knora.py +0 -633
- {dsplib → dsp_tools/cli}/__init__.py +0 -0
- {dsplib/models → dsp_tools/clients}/__init__.py +0 -0
- {dsplib/utils → dsp_tools/commands}/__init__.py +0 -0
- {dsplib/widgets → dsp_tools/commands/create}/__init__.py +0 -0
- {knora → dsp_tools/commands/create/create_on_server}/__init__.py +0 -0
- {knora/dsplib → dsp_tools/commands/create/models}/__init__.py +0 -0
- {knora/dsplib/models → dsp_tools/commands/create/parsing}/__init__.py +0 -0
- {knora/dsplib/utils → dsp_tools/commands/create/serialisation}/__init__.py +0 -0
- {knora/dsplib/widgets → dsp_tools/commands/excel2json}/__init__.py +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from http import HTTPStatus
|
|
3
|
+
from typing import Any
|
|
4
|
+
from typing import cast
|
|
5
|
+
|
|
6
|
+
import requests
|
|
7
|
+
from requests import RequestException
|
|
8
|
+
|
|
9
|
+
from dsp_tools.clients.authentication_client import AuthenticationClient
|
|
10
|
+
from dsp_tools.clients.project_client import ProjectClient
|
|
11
|
+
from dsp_tools.error.exceptions import BadCredentialsError
|
|
12
|
+
from dsp_tools.error.exceptions import FatalNonOkApiResponseCode
|
|
13
|
+
from dsp_tools.error.exceptions import ProjectNotFoundError
|
|
14
|
+
from dsp_tools.utils.request_utils import RequestParameters
|
|
15
|
+
from dsp_tools.utils.request_utils import ResponseCodeAndText
|
|
16
|
+
from dsp_tools.utils.request_utils import log_and_raise_request_exception
|
|
17
|
+
from dsp_tools.utils.request_utils import log_request
|
|
18
|
+
from dsp_tools.utils.request_utils import log_response
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class ProjectClientLive(ProjectClient):
|
|
23
|
+
server: str
|
|
24
|
+
auth: AuthenticationClient
|
|
25
|
+
|
|
26
|
+
def get_project_iri(self, shortcode: str) -> str:
|
|
27
|
+
url = f"{self.server}/admin/projects/shortcode/{shortcode}"
|
|
28
|
+
timeout = 30
|
|
29
|
+
params = RequestParameters("GET", url, timeout)
|
|
30
|
+
log_request(params)
|
|
31
|
+
try:
|
|
32
|
+
response = requests.get(url, timeout=timeout)
|
|
33
|
+
except RequestException as err:
|
|
34
|
+
log_and_raise_request_exception(err)
|
|
35
|
+
|
|
36
|
+
log_response(response)
|
|
37
|
+
if response.ok:
|
|
38
|
+
result = response.json()
|
|
39
|
+
return cast(str, result["project"]["id"])
|
|
40
|
+
if response.status_code == HTTPStatus.NOT_FOUND:
|
|
41
|
+
raise ProjectNotFoundError(f"The project with the shortcode {shortcode} does not exist on this server. ")
|
|
42
|
+
raise FatalNonOkApiResponseCode(url, response.status_code, response.text)
|
|
43
|
+
|
|
44
|
+
def post_new_project(self, project_info: dict[str, Any]) -> str | ResponseCodeAndText:
|
|
45
|
+
url = f"{self.server}/admin/projects"
|
|
46
|
+
timeout = 10
|
|
47
|
+
headers = {"Authorization": f"Bearer {self.auth.get_token()}"}
|
|
48
|
+
params = RequestParameters("POST", url, timeout, headers=headers, data=project_info)
|
|
49
|
+
log_request(params)
|
|
50
|
+
try:
|
|
51
|
+
response = requests.post(
|
|
52
|
+
params.url, timeout=params.timeout, headers=params.headers, data=params.data_serialized
|
|
53
|
+
)
|
|
54
|
+
except RequestException as err:
|
|
55
|
+
log_and_raise_request_exception(err)
|
|
56
|
+
|
|
57
|
+
log_response(response)
|
|
58
|
+
if response.ok:
|
|
59
|
+
result = response.json()
|
|
60
|
+
return cast(str, result["project"]["id"])
|
|
61
|
+
if response.status_code == HTTPStatus.FORBIDDEN:
|
|
62
|
+
raise BadCredentialsError(
|
|
63
|
+
"Only a SystemAdmin can create a project, your permissions are insufficient for this action. "
|
|
64
|
+
"Please contact support@dasch.swiss if you require a new project."
|
|
65
|
+
)
|
|
66
|
+
return ResponseCodeAndText(response.status_code, response.text)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from loguru import logger
|
|
2
|
+
|
|
3
|
+
from dsp_tools.commands.create.models.create_problems import CollectedProblems
|
|
4
|
+
from dsp_tools.commands.create.models.create_problems import CreateProblem
|
|
5
|
+
from dsp_tools.utils.ansi_colors import BOLD_RED
|
|
6
|
+
from dsp_tools.utils.ansi_colors import RED
|
|
7
|
+
from dsp_tools.utils.ansi_colors import RESET_TO_DEFAULT
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def print_all_problem_collections(problems: list[CollectedProblems]) -> None:
|
|
11
|
+
for prob in problems:
|
|
12
|
+
print_problem_collection(prob)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def print_problem_collection(problem_collection: CollectedProblems) -> None:
|
|
16
|
+
individual_problems = _create_individual_problem_strings(problem_collection.problems)
|
|
17
|
+
logger.error(problem_collection.header + individual_problems)
|
|
18
|
+
print(BOLD_RED, problem_collection.header, RESET_TO_DEFAULT)
|
|
19
|
+
print(RED, individual_problems, RESET_TO_DEFAULT)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _create_individual_problem_strings(problems: list[CreateProblem]) -> str:
|
|
23
|
+
str_list = [f"{p.problematic_object}: {p.problem!s}" for p in problems]
|
|
24
|
+
return " - " + "\n - ".join(str_list)
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from dotenv import find_dotenv
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
7
|
+
from dsp_tools.cli.args import ServerCredentials
|
|
8
|
+
from dsp_tools.clients.authentication_client_live import AuthenticationClientLive
|
|
9
|
+
from dsp_tools.clients.group_user_clients_live import GroupClientLive
|
|
10
|
+
from dsp_tools.clients.permissions_client import PermissionsClient
|
|
11
|
+
from dsp_tools.commands.create.communicate_problems import print_all_problem_collections
|
|
12
|
+
from dsp_tools.commands.create.communicate_problems import print_problem_collection
|
|
13
|
+
from dsp_tools.commands.create.create_on_server.complete_ontologies import create_ontologies
|
|
14
|
+
from dsp_tools.commands.create.create_on_server.default_permissions import create_default_permissions
|
|
15
|
+
from dsp_tools.commands.create.create_on_server.group_users import create_groups
|
|
16
|
+
from dsp_tools.commands.create.create_on_server.group_users import create_users
|
|
17
|
+
from dsp_tools.commands.create.create_on_server.group_users import get_existing_group_to_iri_lookup
|
|
18
|
+
from dsp_tools.commands.create.create_on_server.lists import create_lists
|
|
19
|
+
from dsp_tools.commands.create.create_on_server.lists import get_existing_lists_on_server
|
|
20
|
+
from dsp_tools.commands.create.create_on_server.project import create_project
|
|
21
|
+
from dsp_tools.commands.create.models.parsed_project import ParsedProject
|
|
22
|
+
from dsp_tools.commands.create.project_validate import parse_and_validate_project
|
|
23
|
+
from dsp_tools.error.exceptions import InternalError
|
|
24
|
+
from dsp_tools.utils.ansi_colors import BOLD_GREEN
|
|
25
|
+
from dsp_tools.utils.ansi_colors import RESET_TO_DEFAULT
|
|
26
|
+
|
|
27
|
+
load_dotenv(dotenv_path=find_dotenv(usecwd=True))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def create(project_file: Path, creds: ServerCredentials, exit_if_exists: bool) -> bool:
|
|
31
|
+
parsing_result = parse_and_validate_project(project_file, creds.server)
|
|
32
|
+
match parsing_result:
|
|
33
|
+
case ParsedProject():
|
|
34
|
+
return _execute_create(parsing_result, creds, exit_if_exists)
|
|
35
|
+
case list():
|
|
36
|
+
print_all_problem_collections(parsing_result)
|
|
37
|
+
return False
|
|
38
|
+
case _:
|
|
39
|
+
raise InternalError("Unreachable result of project parsing.")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _execute_create(parsed_project: ParsedProject, creds: ServerCredentials, exit_if_exists: bool) -> bool:
|
|
43
|
+
msg = "JSON project file is syntactically correct and passed validation."
|
|
44
|
+
print(BOLD_GREEN + " JSON project file is syntactically correct and passed validation." + RESET_TO_DEFAULT)
|
|
45
|
+
logger.info(msg)
|
|
46
|
+
overall_success = True
|
|
47
|
+
auth = AuthenticationClientLive(creds.server, creds.user, creds.password)
|
|
48
|
+
|
|
49
|
+
# create project
|
|
50
|
+
project_iri = create_project(parsed_project.project_metadata, auth, exit_if_exists)
|
|
51
|
+
|
|
52
|
+
# create the lists
|
|
53
|
+
if parsed_project.lists:
|
|
54
|
+
list_name_2_iri, list_problems = create_lists(
|
|
55
|
+
parsed_lists=parsed_project.lists,
|
|
56
|
+
shortcode=parsed_project.project_metadata.shortcode,
|
|
57
|
+
auth=auth,
|
|
58
|
+
project_iri=project_iri,
|
|
59
|
+
)
|
|
60
|
+
if list_problems:
|
|
61
|
+
overall_success = False
|
|
62
|
+
print_problem_collection(list_problems)
|
|
63
|
+
else:
|
|
64
|
+
list_name_2_iri = get_existing_lists_on_server(parsed_project.project_metadata.shortcode, auth)
|
|
65
|
+
|
|
66
|
+
# create the groups
|
|
67
|
+
group_client = GroupClientLive(creds.server, auth)
|
|
68
|
+
group_lookup = get_existing_group_to_iri_lookup(
|
|
69
|
+
group_client, project_iri, parsed_project.project_metadata.shortname
|
|
70
|
+
)
|
|
71
|
+
if parsed_project.groups:
|
|
72
|
+
group_lookup, group_problems = create_groups(
|
|
73
|
+
groups=parsed_project.groups,
|
|
74
|
+
group_client=group_client,
|
|
75
|
+
project_iri=project_iri,
|
|
76
|
+
group_lookup=group_lookup,
|
|
77
|
+
)
|
|
78
|
+
if group_problems:
|
|
79
|
+
print_problem_collection(group_problems)
|
|
80
|
+
overall_success = False
|
|
81
|
+
|
|
82
|
+
if parsed_project.users:
|
|
83
|
+
user_problems = create_users(
|
|
84
|
+
users=parsed_project.users,
|
|
85
|
+
user_memberships=parsed_project.user_memberships,
|
|
86
|
+
group_lookup=group_lookup,
|
|
87
|
+
auth=auth,
|
|
88
|
+
project_iri=project_iri,
|
|
89
|
+
)
|
|
90
|
+
if user_problems:
|
|
91
|
+
print_problem_collection(user_problems)
|
|
92
|
+
overall_success = False
|
|
93
|
+
|
|
94
|
+
# create the ontologies
|
|
95
|
+
success = create_ontologies(
|
|
96
|
+
parsed_ontologies=parsed_project.ontologies,
|
|
97
|
+
list_name_2_iri=list_name_2_iri,
|
|
98
|
+
project_iri=project_iri,
|
|
99
|
+
shortcode=parsed_project.project_metadata.shortcode,
|
|
100
|
+
auth=auth,
|
|
101
|
+
)
|
|
102
|
+
if not success:
|
|
103
|
+
overall_success = False
|
|
104
|
+
|
|
105
|
+
# create the default permissions (DOAPs)
|
|
106
|
+
perm_client = PermissionsClient(auth, project_iri)
|
|
107
|
+
success = create_default_permissions(
|
|
108
|
+
perm_client=perm_client,
|
|
109
|
+
default_permissions=parsed_project.permissions.default_permissions,
|
|
110
|
+
default_permissions_overrule=parsed_project.permissions.default_permissions_overrule,
|
|
111
|
+
shortcode=parsed_project.project_metadata.shortcode,
|
|
112
|
+
)
|
|
113
|
+
if not success:
|
|
114
|
+
overall_success = False
|
|
115
|
+
|
|
116
|
+
# final steps
|
|
117
|
+
if overall_success:
|
|
118
|
+
msg = (
|
|
119
|
+
f"Successfully created project '{parsed_project.project_metadata.shortname}' "
|
|
120
|
+
f"({parsed_project.project_metadata.shortcode}) with all its ontologies. "
|
|
121
|
+
f"There were no problems during the creation process."
|
|
122
|
+
)
|
|
123
|
+
print(f"========================================================\n{msg}")
|
|
124
|
+
logger.info(msg)
|
|
125
|
+
else:
|
|
126
|
+
msg = (
|
|
127
|
+
f"The project '{parsed_project.project_metadata.shortname}' ({parsed_project.project_metadata.shortcode}) "
|
|
128
|
+
f"with its ontologies could be created, "
|
|
129
|
+
f"but during the creation process, some problems occurred. Please carefully check the console output."
|
|
130
|
+
)
|
|
131
|
+
print(f"========================================================\nWARNING: {msg}")
|
|
132
|
+
logger.warning(msg)
|
|
133
|
+
|
|
134
|
+
return overall_success
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
from loguru import logger
|
|
2
|
+
from rdflib import Literal
|
|
3
|
+
from rdflib import URIRef
|
|
4
|
+
from tqdm import tqdm
|
|
5
|
+
|
|
6
|
+
from dsp_tools.clients.ontology_clients import OntologyCreateClient
|
|
7
|
+
from dsp_tools.commands.create.models.create_problems import CollectedProblems
|
|
8
|
+
from dsp_tools.commands.create.models.create_problems import CreateProblem
|
|
9
|
+
from dsp_tools.commands.create.models.create_problems import UploadProblem
|
|
10
|
+
from dsp_tools.commands.create.models.create_problems import UploadProblemType
|
|
11
|
+
from dsp_tools.commands.create.models.parsed_ontology import ParsedClassCardinalities
|
|
12
|
+
from dsp_tools.commands.create.models.parsed_ontology import ParsedOntology
|
|
13
|
+
from dsp_tools.commands.create.models.parsed_ontology import ParsedPropertyCardinality
|
|
14
|
+
from dsp_tools.commands.create.models.server_project_info import CreatedIriCollection
|
|
15
|
+
from dsp_tools.commands.create.models.server_project_info import ProjectIriLookup
|
|
16
|
+
from dsp_tools.commands.create.serialisation.ontology import serialise_cardinality_graph_for_request
|
|
17
|
+
from dsp_tools.utils.data_formats.iri_util import from_dsp_iri_to_prefixed_iri
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def add_all_cardinalities(
|
|
21
|
+
ontologies: list[ParsedOntology],
|
|
22
|
+
project_iri_lookup: ProjectIriLookup,
|
|
23
|
+
created_iris: CreatedIriCollection,
|
|
24
|
+
onto_client: OntologyCreateClient,
|
|
25
|
+
) -> CollectedProblems | None:
|
|
26
|
+
all_problems = []
|
|
27
|
+
for onto in ontologies:
|
|
28
|
+
onto_iri = project_iri_lookup.onto_iris.get(onto.name)
|
|
29
|
+
# we do not inform about onto failures here, as it will have been done upstream
|
|
30
|
+
if onto_iri:
|
|
31
|
+
last_mod_date = onto_client.get_last_modification_date(project_iri_lookup.project_iri, onto_iri)
|
|
32
|
+
problems = _add_all_cardinalities_for_one_onto(
|
|
33
|
+
cardinalities=onto.cardinalities,
|
|
34
|
+
onto_iri=URIRef(onto_iri),
|
|
35
|
+
onto_name=onto.name,
|
|
36
|
+
last_modification_date=last_mod_date,
|
|
37
|
+
onto_client=onto_client,
|
|
38
|
+
created_iris=created_iris,
|
|
39
|
+
)
|
|
40
|
+
all_problems.extend(problems)
|
|
41
|
+
if all_problems:
|
|
42
|
+
return CollectedProblems(" While adding cardinalities the following problems occurred:", all_problems)
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _add_all_cardinalities_for_one_onto(
|
|
47
|
+
cardinalities: list[ParsedClassCardinalities],
|
|
48
|
+
onto_iri: URIRef,
|
|
49
|
+
onto_name: str,
|
|
50
|
+
last_modification_date: Literal,
|
|
51
|
+
onto_client: OntologyCreateClient,
|
|
52
|
+
created_iris: CreatedIriCollection,
|
|
53
|
+
) -> list[CreateProblem]:
|
|
54
|
+
problems: list[CreateProblem] = []
|
|
55
|
+
progress_bar = tqdm(
|
|
56
|
+
cardinalities, desc=f" Adding cardinalities to the ontology '{onto_name}'", dynamic_ncols=True
|
|
57
|
+
)
|
|
58
|
+
for c in progress_bar:
|
|
59
|
+
# we do not inform about classes failures here, as it will have been done upstream
|
|
60
|
+
if c.class_iri not in created_iris.created_classes:
|
|
61
|
+
logger.warning(f"CARDINALITY: Class '{c.class_iri}' not in successes, no cardinalities added.")
|
|
62
|
+
continue
|
|
63
|
+
last_modification_date, creation_problems = _add_cardinalities_for_one_class(
|
|
64
|
+
resource_card=c,
|
|
65
|
+
onto_iri=onto_iri,
|
|
66
|
+
last_modification_date=last_modification_date,
|
|
67
|
+
onto_client=onto_client,
|
|
68
|
+
successful_props=created_iris.created_properties,
|
|
69
|
+
)
|
|
70
|
+
problems.extend(creation_problems)
|
|
71
|
+
return problems
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _add_cardinalities_for_one_class(
|
|
75
|
+
resource_card: ParsedClassCardinalities,
|
|
76
|
+
onto_iri: URIRef,
|
|
77
|
+
last_modification_date: Literal,
|
|
78
|
+
onto_client: OntologyCreateClient,
|
|
79
|
+
successful_props: set[str],
|
|
80
|
+
) -> tuple[Literal, list[UploadProblem]]:
|
|
81
|
+
res_iri = URIRef(resource_card.class_iri)
|
|
82
|
+
problems = []
|
|
83
|
+
for one_card in resource_card.cards:
|
|
84
|
+
if one_card.propname not in successful_props:
|
|
85
|
+
problems.append(UploadProblem(one_card.propname, UploadProblemType.CARDINALITY_PROPERTY_NOT_FOUND))
|
|
86
|
+
continue
|
|
87
|
+
last_modification_date, problem = _add_one_cardinality(
|
|
88
|
+
one_card, res_iri, onto_iri, last_modification_date, onto_client
|
|
89
|
+
)
|
|
90
|
+
if problem:
|
|
91
|
+
problems.append(problem)
|
|
92
|
+
return last_modification_date, problems
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _add_one_cardinality(
|
|
96
|
+
card: ParsedPropertyCardinality,
|
|
97
|
+
res_iri: URIRef,
|
|
98
|
+
onto_iri: URIRef,
|
|
99
|
+
last_modification_date: Literal,
|
|
100
|
+
onto_client: OntologyCreateClient,
|
|
101
|
+
) -> tuple[Literal, UploadProblem | None]:
|
|
102
|
+
card_serialised = serialise_cardinality_graph_for_request(card, res_iri, onto_iri, last_modification_date)
|
|
103
|
+
new_mod_date = onto_client.post_resource_cardinalities(card_serialised)
|
|
104
|
+
if not new_mod_date:
|
|
105
|
+
prefixed_cls = from_dsp_iri_to_prefixed_iri(str(res_iri))
|
|
106
|
+
prefixed_prop = from_dsp_iri_to_prefixed_iri(card.propname)
|
|
107
|
+
return last_modification_date, UploadProblem(
|
|
108
|
+
f"{prefixed_cls} / {prefixed_prop}",
|
|
109
|
+
UploadProblemType.CARDINALITY_COULD_NOT_BE_ADDED,
|
|
110
|
+
)
|
|
111
|
+
return new_mod_date, None
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
from http import HTTPStatus
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import rustworkx as rx
|
|
5
|
+
from loguru import logger
|
|
6
|
+
from rdflib import Literal
|
|
7
|
+
from rdflib import URIRef
|
|
8
|
+
from tqdm import tqdm
|
|
9
|
+
|
|
10
|
+
from dsp_tools.clients.ontology_clients import OntologyCreateClient
|
|
11
|
+
from dsp_tools.commands.create.create_on_server.onto_utils import get_modification_date_onto_lookup
|
|
12
|
+
from dsp_tools.commands.create.create_on_server.onto_utils import should_retry_request
|
|
13
|
+
from dsp_tools.commands.create.create_on_server.onto_utils import sort_for_upload
|
|
14
|
+
from dsp_tools.commands.create.models.create_problems import CollectedProblems
|
|
15
|
+
from dsp_tools.commands.create.models.create_problems import CreateProblem
|
|
16
|
+
from dsp_tools.commands.create.models.create_problems import UploadProblem
|
|
17
|
+
from dsp_tools.commands.create.models.create_problems import UploadProblemType
|
|
18
|
+
from dsp_tools.commands.create.models.parsed_ontology import ParsedClass
|
|
19
|
+
from dsp_tools.commands.create.models.server_project_info import CreatedIriCollection
|
|
20
|
+
from dsp_tools.commands.create.models.server_project_info import OntoLastModDateLookup
|
|
21
|
+
from dsp_tools.commands.create.models.server_project_info import ProjectIriLookup
|
|
22
|
+
from dsp_tools.commands.create.serialisation.ontology import serialise_class_graph_for_request
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def create_all_classes(
|
|
26
|
+
classes: list[ParsedClass],
|
|
27
|
+
project_iri_lookup: ProjectIriLookup,
|
|
28
|
+
created_iris: CreatedIriCollection,
|
|
29
|
+
client: OntologyCreateClient,
|
|
30
|
+
) -> tuple[CreatedIriCollection, CollectedProblems | None]:
|
|
31
|
+
upload_order = _get_class_create_order(classes)
|
|
32
|
+
logger.debug(f"Class creation order: {upload_order}")
|
|
33
|
+
cls_lookup = {c.name: c for c in classes}
|
|
34
|
+
all_problems: list[CreateProblem] = []
|
|
35
|
+
onto_lookup = get_modification_date_onto_lookup(project_iri_lookup, client)
|
|
36
|
+
progress_bar = tqdm(upload_order, desc=" Creating classes", dynamic_ncols=True)
|
|
37
|
+
logger.debug("Starting class creation")
|
|
38
|
+
for c in progress_bar:
|
|
39
|
+
cls = cls_lookup[c]
|
|
40
|
+
if previous_blocker := _is_class_blocked(cls.name, set(cls.supers), created_iris):
|
|
41
|
+
all_problems.append(previous_blocker)
|
|
42
|
+
created_iris.failed_classes.add(cls.name)
|
|
43
|
+
else:
|
|
44
|
+
create_result = _create_one_class(cls, onto_lookup, client)
|
|
45
|
+
if isinstance(create_result, Literal):
|
|
46
|
+
onto_lookup.update_last_mod_date(cls.onto_iri, create_result)
|
|
47
|
+
created_iris.created_classes.add(cls.name)
|
|
48
|
+
else:
|
|
49
|
+
all_problems.append(create_result)
|
|
50
|
+
created_iris.failed_classes.add(cls.name)
|
|
51
|
+
upload_problems = None
|
|
52
|
+
if all_problems:
|
|
53
|
+
upload_problems = CollectedProblems(" While creating classes the following problems occurred:", all_problems)
|
|
54
|
+
return created_iris, upload_problems
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _get_class_create_order(classes: list[ParsedClass]) -> list[str]:
|
|
58
|
+
logger.debug("Creating class upload order.")
|
|
59
|
+
graph, node_to_iri = _make_graph_to_sort(classes)
|
|
60
|
+
return sort_for_upload(graph, node_to_iri)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _make_graph_to_sort(classes: list[ParsedClass]) -> tuple[rx.PyDiGraph, dict[int, str]]:
|
|
64
|
+
graph: rx.PyDiGraph[Any, Any] = rx.PyDiGraph()
|
|
65
|
+
cls_iris = [x.name for x in classes]
|
|
66
|
+
node_indices = list(graph.add_nodes_from(cls_iris))
|
|
67
|
+
iri_to_node = dict(zip(cls_iris, node_indices))
|
|
68
|
+
node_to_iri = dict(zip(node_indices, cls_iris))
|
|
69
|
+
for i, p in enumerate(classes):
|
|
70
|
+
for super_cls in p.supers:
|
|
71
|
+
if super_cls in cls_iris:
|
|
72
|
+
graph.add_edge(iri_to_node[p.name], iri_to_node[super_cls], i)
|
|
73
|
+
return graph, node_to_iri
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _is_class_blocked(cls_name: str, supers: set[str], created_iris: CreatedIriCollection) -> CreateProblem | None:
|
|
77
|
+
if created_iris.any_classes_failed(supers):
|
|
78
|
+
return UploadProblem(cls_name, UploadProblemType.CLASS_SUPER_FAILED)
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _create_one_class(
|
|
83
|
+
cls: ParsedClass, onto_lookup: OntoLastModDateLookup, client: OntologyCreateClient
|
|
84
|
+
) -> Literal | CreateProblem:
|
|
85
|
+
cls_serialised = serialise_class_graph_for_request(
|
|
86
|
+
cls, URIRef(cls.onto_iri), onto_lookup.get_last_mod_date(cls.onto_iri)
|
|
87
|
+
)
|
|
88
|
+
request_result = client.post_new_class(cls_serialised)
|
|
89
|
+
if isinstance(request_result, Literal):
|
|
90
|
+
return request_result
|
|
91
|
+
if should_retry_request(request_result):
|
|
92
|
+
new_mod_date = client.get_last_modification_date(onto_lookup.project_iri, cls.onto_iri)
|
|
93
|
+
cls_serialised = serialise_class_graph_for_request(cls, URIRef(cls.onto_iri), new_mod_date)
|
|
94
|
+
request_result = client.post_new_class(cls_serialised)
|
|
95
|
+
if isinstance(request_result, Literal):
|
|
96
|
+
return request_result
|
|
97
|
+
if request_result.status_code == HTTPStatus.BAD_REQUEST:
|
|
98
|
+
return UploadProblem(cls.name, request_result.text)
|
|
99
|
+
return UploadProblem(cls.name, UploadProblemType.CLASS_COULD_NOT_BE_CREATED)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
from loguru import logger
|
|
2
|
+
|
|
3
|
+
from dsp_tools.clients.authentication_client import AuthenticationClient
|
|
4
|
+
from dsp_tools.clients.ontology_clients import OntologyCreateClient
|
|
5
|
+
from dsp_tools.clients.ontology_create_client_live import OntologyCreateClientLive
|
|
6
|
+
from dsp_tools.commands.create.communicate_problems import print_problem_collection
|
|
7
|
+
from dsp_tools.commands.create.create_on_server.cardinalities import add_all_cardinalities
|
|
8
|
+
from dsp_tools.commands.create.create_on_server.classes import create_all_classes
|
|
9
|
+
from dsp_tools.commands.create.create_on_server.onto_utils import get_project_iri_lookup
|
|
10
|
+
from dsp_tools.commands.create.create_on_server.ontology import create_all_ontologies
|
|
11
|
+
from dsp_tools.commands.create.create_on_server.properties import create_all_properties
|
|
12
|
+
from dsp_tools.commands.create.models.create_problems import CollectedProblems
|
|
13
|
+
from dsp_tools.commands.create.models.parsed_ontology import ParsedOntology
|
|
14
|
+
from dsp_tools.commands.create.models.server_project_info import CreatedIriCollection
|
|
15
|
+
from dsp_tools.commands.create.models.server_project_info import ListNameToIriLookup
|
|
16
|
+
from dsp_tools.commands.create.models.server_project_info import ProjectIriLookup
|
|
17
|
+
from dsp_tools.utils.ansi_colors import BOLD
|
|
18
|
+
from dsp_tools.utils.ansi_colors import BOLD_RED
|
|
19
|
+
from dsp_tools.utils.ansi_colors import RESET_TO_DEFAULT
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def create_ontologies(
|
|
23
|
+
parsed_ontologies: list[ParsedOntology],
|
|
24
|
+
list_name_2_iri: ListNameToIriLookup,
|
|
25
|
+
project_iri: str,
|
|
26
|
+
shortcode: str,
|
|
27
|
+
auth: AuthenticationClient,
|
|
28
|
+
) -> bool:
|
|
29
|
+
success_collection = CreatedIriCollection()
|
|
30
|
+
onto_client = OntologyCreateClientLive(auth.server, auth)
|
|
31
|
+
overall_success = True
|
|
32
|
+
|
|
33
|
+
logger.info("Processing Ontology Section")
|
|
34
|
+
print(BOLD + "Processing Ontology Section:" + RESET_TO_DEFAULT)
|
|
35
|
+
project_iri_lookup, ontology_problems = _create_ontologies_on_server(
|
|
36
|
+
ontologies=parsed_ontologies,
|
|
37
|
+
project_iri=project_iri,
|
|
38
|
+
shortcode=shortcode,
|
|
39
|
+
client=onto_client,
|
|
40
|
+
)
|
|
41
|
+
if ontology_problems:
|
|
42
|
+
overall_success = False
|
|
43
|
+
print_problem_collection(ontology_problems)
|
|
44
|
+
if not project_iri_lookup.onto_iris:
|
|
45
|
+
msg = "No ontologies could be created on the server."
|
|
46
|
+
logger.error(msg)
|
|
47
|
+
print(BOLD_RED + " " + msg + RESET_TO_DEFAULT)
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
all_classes = []
|
|
51
|
+
for onto in parsed_ontologies:
|
|
52
|
+
all_classes.extend(onto.classes)
|
|
53
|
+
if all_classes:
|
|
54
|
+
print(BOLD + "Processing Classes:" + RESET_TO_DEFAULT)
|
|
55
|
+
success_collection, cls_problems = create_all_classes(
|
|
56
|
+
classes=all_classes,
|
|
57
|
+
project_iri_lookup=project_iri_lookup,
|
|
58
|
+
created_iris=success_collection,
|
|
59
|
+
client=onto_client,
|
|
60
|
+
)
|
|
61
|
+
if cls_problems:
|
|
62
|
+
overall_success = False
|
|
63
|
+
print_problem_collection(cls_problems)
|
|
64
|
+
else:
|
|
65
|
+
logger.info("No classes found in the ontology.")
|
|
66
|
+
|
|
67
|
+
all_props = []
|
|
68
|
+
for onto in parsed_ontologies:
|
|
69
|
+
all_props.extend(onto.properties)
|
|
70
|
+
if all_props:
|
|
71
|
+
print(BOLD + "Processing Properties:" + RESET_TO_DEFAULT)
|
|
72
|
+
success_collection, property_problems = create_all_properties(
|
|
73
|
+
properties=all_props,
|
|
74
|
+
project_iri_lookup=project_iri_lookup,
|
|
75
|
+
created_iris=success_collection,
|
|
76
|
+
list_lookup=list_name_2_iri,
|
|
77
|
+
client=onto_client,
|
|
78
|
+
)
|
|
79
|
+
if property_problems:
|
|
80
|
+
overall_success = False
|
|
81
|
+
print_problem_collection(property_problems)
|
|
82
|
+
else:
|
|
83
|
+
logger.info("No properties found in the ontology.")
|
|
84
|
+
|
|
85
|
+
print(BOLD + "Processing Cardinalities:" + RESET_TO_DEFAULT)
|
|
86
|
+
problems = add_all_cardinalities(
|
|
87
|
+
ontologies=parsed_ontologies,
|
|
88
|
+
project_iri_lookup=project_iri_lookup,
|
|
89
|
+
created_iris=success_collection,
|
|
90
|
+
onto_client=onto_client,
|
|
91
|
+
)
|
|
92
|
+
if problems:
|
|
93
|
+
overall_success = False
|
|
94
|
+
print_problem_collection(problems)
|
|
95
|
+
|
|
96
|
+
return overall_success
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _create_ontologies_on_server(
|
|
100
|
+
ontologies: list[ParsedOntology], project_iri: str, shortcode: str, client: OntologyCreateClient
|
|
101
|
+
) -> tuple[ProjectIriLookup, CollectedProblems | None]:
|
|
102
|
+
project_iri_lookup = get_project_iri_lookup(client.server, shortcode, project_iri)
|
|
103
|
+
new_ontologies = []
|
|
104
|
+
for parsed_onto in ontologies:
|
|
105
|
+
if not project_iri_lookup.does_onto_exist(parsed_onto.name):
|
|
106
|
+
new_ontologies.append(parsed_onto)
|
|
107
|
+
if not new_ontologies:
|
|
108
|
+
if len(ontologies) > 0:
|
|
109
|
+
msg = (
|
|
110
|
+
"No new ontologies were found in the project. "
|
|
111
|
+
"All ontologies already exist on the server. Continuing adding information to the ontologies."
|
|
112
|
+
)
|
|
113
|
+
logger.info(msg)
|
|
114
|
+
print(BOLD + " " + msg + RESET_TO_DEFAULT)
|
|
115
|
+
return project_iri_lookup, None
|
|
116
|
+
return create_all_ontologies(new_ontologies, project_iri_lookup, client)
|