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
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
from typing import List, Set, Dict, Tuple, Optional
|
|
3
|
-
import json
|
|
4
|
-
from jsonschema import validate
|
|
5
|
-
|
|
6
|
-
from ..models.helpers import Actions, BaseError, Context, Cardinality
|
|
7
|
-
from ..models.langstring import Languages, LangStringParam, LangString
|
|
8
|
-
from ..models.connection import Connection
|
|
9
|
-
from ..models.project import Project
|
|
10
|
-
from ..models.listnode import ListNode
|
|
11
|
-
from ..models.group import Group
|
|
12
|
-
from ..models.user import User
|
|
13
|
-
from ..models.ontology import Ontology
|
|
14
|
-
from ..models.propertyclass import PropertyClass
|
|
15
|
-
from ..models.resourceclass import ResourceClass
|
|
16
|
-
|
|
17
|
-
from .onto_commons import list_creator
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def create_ontology(input_file: str,
|
|
21
|
-
lists_file: str,
|
|
22
|
-
server: str,
|
|
23
|
-
user: str,
|
|
24
|
-
password: str,
|
|
25
|
-
verbose: bool,
|
|
26
|
-
dump: bool) -> bool:
|
|
27
|
-
current_dir = os.path.dirname(os.path.realpath(__file__))
|
|
28
|
-
|
|
29
|
-
# let's read the schema for the data model definition
|
|
30
|
-
with open(os.path.join(current_dir, 'knora-schema.json')) as s:
|
|
31
|
-
schema = json.load(s)
|
|
32
|
-
|
|
33
|
-
# read the data model definition
|
|
34
|
-
with open(input_file) as f:
|
|
35
|
-
datamodel = json.load(f)
|
|
36
|
-
|
|
37
|
-
# validate the data model definition in order to be sure that it is correct
|
|
38
|
-
validate(datamodel, schema)
|
|
39
|
-
if verbose:
|
|
40
|
-
print("Data model is syntactically correct and passed validation!")
|
|
41
|
-
|
|
42
|
-
#
|
|
43
|
-
# Connect to the DaSCH Service Platform API
|
|
44
|
-
#
|
|
45
|
-
con = Connection(server)
|
|
46
|
-
con.login(user, password)
|
|
47
|
-
if dump:
|
|
48
|
-
con.start_logging()
|
|
49
|
-
|
|
50
|
-
# --------------------------------------------------------------------------
|
|
51
|
-
# let's read the prefixes of external ontologies that may be used
|
|
52
|
-
#
|
|
53
|
-
context = Context(datamodel["prefixes"])
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
# --------------------------------------------------------------------------
|
|
57
|
-
# Let's create the project...
|
|
58
|
-
#
|
|
59
|
-
project = None
|
|
60
|
-
try:
|
|
61
|
-
# we try to read the project to see if it's existing....
|
|
62
|
-
project = Project(
|
|
63
|
-
con=con,
|
|
64
|
-
shortcode=datamodel["project"]["shortcode"],
|
|
65
|
-
).read()
|
|
66
|
-
#
|
|
67
|
-
# we got it, update the project data if necessary...
|
|
68
|
-
#
|
|
69
|
-
if project.shortname != datamodel["project"]["shortname"]:
|
|
70
|
-
project.shortname = datamodel["project"]["shortname"]
|
|
71
|
-
if project.longname != datamodel["project"]["longname"]:
|
|
72
|
-
project.longname == datamodel["project"]["longname"]
|
|
73
|
-
project.description = datamodel["project"].get("descriptions")
|
|
74
|
-
project.keywords = set(datamodel["project"].get("keywords"))
|
|
75
|
-
nproject = project.update()
|
|
76
|
-
if nproject is not None:
|
|
77
|
-
project = nproject
|
|
78
|
-
if verbose:
|
|
79
|
-
print("Modified project:")
|
|
80
|
-
project.print()
|
|
81
|
-
except:
|
|
82
|
-
#
|
|
83
|
-
# The project doesn't exist yet – let's create it
|
|
84
|
-
#
|
|
85
|
-
try:
|
|
86
|
-
project = Project(
|
|
87
|
-
con=con,
|
|
88
|
-
shortcode=datamodel["project"]["shortcode"],
|
|
89
|
-
shortname=datamodel["project"]["shortname"],
|
|
90
|
-
longname=datamodel["project"]["longname"],
|
|
91
|
-
description=LangString(datamodel["project"].get("descriptions")),
|
|
92
|
-
keywords=set(datamodel["project"].get("keywords")),
|
|
93
|
-
selfjoin=False,
|
|
94
|
-
status=True
|
|
95
|
-
).create()
|
|
96
|
-
except BaseError as err:
|
|
97
|
-
print("Creating project failed: " + err.message)
|
|
98
|
-
return False
|
|
99
|
-
if verbose:
|
|
100
|
-
print("Created project:")
|
|
101
|
-
project.print()
|
|
102
|
-
assert project is not None
|
|
103
|
-
|
|
104
|
-
# --------------------------------------------------------------------------
|
|
105
|
-
# now let's create the lists
|
|
106
|
-
#
|
|
107
|
-
if verbose:
|
|
108
|
-
print("Creating lists...")
|
|
109
|
-
lists = datamodel["project"].get('lists')
|
|
110
|
-
listrootnodes = {}
|
|
111
|
-
if lists is not None:
|
|
112
|
-
for rootnode in lists:
|
|
113
|
-
if verbose is not None:
|
|
114
|
-
print(" Creating list:" + rootnode['name'])
|
|
115
|
-
root_list_node = ListNode(
|
|
116
|
-
con=con,
|
|
117
|
-
project=project,
|
|
118
|
-
label=rootnode['labels'],
|
|
119
|
-
comment=rootnode.get('comments'),
|
|
120
|
-
name=rootnode['name']
|
|
121
|
-
).create()
|
|
122
|
-
listnodes = list_creator(con, project, root_list_node, rootnode['nodes'])
|
|
123
|
-
listrootnodes[rootnode['name']] = {
|
|
124
|
-
"id": root_list_node.id,
|
|
125
|
-
"nodes": listnodes
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
with open('lists.json', 'w', encoding="utf-8") as fp:
|
|
129
|
-
json.dump(listrootnodes, fp, indent=3, sort_keys=True)
|
|
130
|
-
print("The definitions of the node-id's can be found in \"{}\"!".format('lists.json'))
|
|
131
|
-
|
|
132
|
-
# --------------------------------------------------------------------------
|
|
133
|
-
# now let's add the groups (if there are groups defined...)
|
|
134
|
-
#
|
|
135
|
-
if verbose:
|
|
136
|
-
print("Adding groups...")
|
|
137
|
-
|
|
138
|
-
new_groups = {}
|
|
139
|
-
groups = datamodel["project"].get('groups')
|
|
140
|
-
if groups is not None:
|
|
141
|
-
for group in groups:
|
|
142
|
-
try:
|
|
143
|
-
new_group = Group(con=con,
|
|
144
|
-
name=group["name"],
|
|
145
|
-
description=group["description"],
|
|
146
|
-
project=project,
|
|
147
|
-
status=group["status"] if group.get("status") is not None else True,
|
|
148
|
-
selfjoin=group["selfjoin"] if group.get("selfjoin") is not None else False).create()
|
|
149
|
-
except BaseError as err:
|
|
150
|
-
print("Creating group failed: " + err.message)
|
|
151
|
-
return False
|
|
152
|
-
new_groups[new_group.name] = new_group
|
|
153
|
-
if verbose:
|
|
154
|
-
print("Groups:")
|
|
155
|
-
new_group.print()
|
|
156
|
-
#project.set_default_permissions(new_group.id)
|
|
157
|
-
# --------------------------------------------------------------------------
|
|
158
|
-
# now let's add the users (if there are users defined...)
|
|
159
|
-
#
|
|
160
|
-
if verbose:
|
|
161
|
-
print("Adding users...")
|
|
162
|
-
all_groups: List[Group] = []
|
|
163
|
-
all_projects: List[Project] = []
|
|
164
|
-
users = datamodel["project"].get('users')
|
|
165
|
-
if users is not None:
|
|
166
|
-
for user in users:
|
|
167
|
-
sysadmin = False
|
|
168
|
-
group_ids: Set[str] = set()
|
|
169
|
-
for groupname in user["groups"]:
|
|
170
|
-
#
|
|
171
|
-
# First we determine the groups the user is in because we can do this in one call
|
|
172
|
-
# groupname has the form [proj_shortname]:groupname|"SystemAdmin"
|
|
173
|
-
# (projectname omitted = current project)
|
|
174
|
-
#
|
|
175
|
-
tmp = groupname.split(':')
|
|
176
|
-
if len(tmp) > 1:
|
|
177
|
-
group = None
|
|
178
|
-
if tmp[0] and tmp[0] != '':
|
|
179
|
-
# we have 'proj_shortname:groupname
|
|
180
|
-
if not all_groups:
|
|
181
|
-
all_groups = Group.getAllGroups(con)
|
|
182
|
-
tmp_group = list(filter(lambda g: g.project.shortname == tmp[0] and g.name == tmp[1], all_groups))
|
|
183
|
-
assert len(tmp_group) == 1
|
|
184
|
-
group = tmp_group[0]
|
|
185
|
-
else:
|
|
186
|
-
# we have ':groupname' and add to current project
|
|
187
|
-
group = new_groups.get(tmp[1])
|
|
188
|
-
assert group is not None
|
|
189
|
-
group_ids.add(group.id)
|
|
190
|
-
else:
|
|
191
|
-
if tmp[0] == "SystemAdmin":
|
|
192
|
-
sysadmin = True
|
|
193
|
-
|
|
194
|
-
project_infos: Dict[str, bool] = {}
|
|
195
|
-
for projectname in user["projects"]:
|
|
196
|
-
#
|
|
197
|
-
# now we determine the project memberships of the user
|
|
198
|
-
# projectname has the form [projectname]:"member"|"admin" (projectname omitted = current project)
|
|
199
|
-
#
|
|
200
|
-
tmp = projectname.split(':')
|
|
201
|
-
assert len(tmp) == 2
|
|
202
|
-
if tmp[0]:
|
|
203
|
-
# we have 'proj_shortname:"member"|"admin"'
|
|
204
|
-
if not all_projects:
|
|
205
|
-
all_projects = project.getAllProjects(con)
|
|
206
|
-
tmp_project = list(filter(lambda g: g.shortname == tmp[0], all_projects))
|
|
207
|
-
assert len(tmp_project) == 1
|
|
208
|
-
in_project = tmp_project[0]
|
|
209
|
-
else:
|
|
210
|
-
# we have ':"member"|"admin"'
|
|
211
|
-
in_project = project
|
|
212
|
-
if tmp[1] == "admin":
|
|
213
|
-
project_infos[in_project.id] = True
|
|
214
|
-
else:
|
|
215
|
-
project_infos[in_project.id] = False
|
|
216
|
-
user_existing = False;
|
|
217
|
-
tmp_user = None
|
|
218
|
-
try:
|
|
219
|
-
tmp_user = User(con, username=user["username"]).read()
|
|
220
|
-
except BaseError as err:
|
|
221
|
-
pass
|
|
222
|
-
if tmp_user is None:
|
|
223
|
-
try:
|
|
224
|
-
tmp_user = User(con, email=user["email"]).read()
|
|
225
|
-
except BaseError as err:
|
|
226
|
-
pass
|
|
227
|
-
if tmp_user:
|
|
228
|
-
#
|
|
229
|
-
# The user is already in the database – let's update its settings
|
|
230
|
-
#
|
|
231
|
-
if tmp_user.username != user["username"]:
|
|
232
|
-
tmp_user.username = user["username"]
|
|
233
|
-
if tmp_user.email != user["email"]:
|
|
234
|
-
tmp_user.email = user["email"]
|
|
235
|
-
if tmp_user.givenName != user["givenName"]:
|
|
236
|
-
tmp_user.givenName = user["givenName"]
|
|
237
|
-
if tmp_user.familyName != user["familyName"]:
|
|
238
|
-
tmp_user.familyName = user["familyName"]
|
|
239
|
-
if tmp_user.password != user["password"]:
|
|
240
|
-
tmp_user.password = user["password"]
|
|
241
|
-
if user.get("status") and tmp_user.status != user["status"]:
|
|
242
|
-
tmp_user.status = user["status"]
|
|
243
|
-
if user.get("lang") and tmp_user.lang != user["lang"]:
|
|
244
|
-
tmp_user.lang = user["lang"]
|
|
245
|
-
if tmp_user.sysadmin != sysadmin:
|
|
246
|
-
tmp_user.sysadmin = sysadmin
|
|
247
|
-
try:
|
|
248
|
-
tmp_user.update()
|
|
249
|
-
except BaseError as err:
|
|
250
|
-
tmp_user.print()
|
|
251
|
-
print("Updating user failed: " + err.message)
|
|
252
|
-
return False
|
|
253
|
-
#
|
|
254
|
-
# now we update group and project membership
|
|
255
|
-
# Note: we do NOT remove any mambership here, we just add!
|
|
256
|
-
#
|
|
257
|
-
tmp_in_groups = tmp_user.in_groups
|
|
258
|
-
add_groups = group_ids - tmp_in_groups
|
|
259
|
-
for g in add_groups:
|
|
260
|
-
User.addToGroup(g)
|
|
261
|
-
rm_groups = tmp_in_groups - group_ids
|
|
262
|
-
# we do no remove a user from a group here!
|
|
263
|
-
tmp_in_projects = tmp_user.in_projects
|
|
264
|
-
for p in project_infos.items():
|
|
265
|
-
if tmp_in_projects.get(p[0]) and tmp_in_projects[p[0]] == p[1]:
|
|
266
|
-
continue
|
|
267
|
-
User.addToProject(p[0], p[1])
|
|
268
|
-
else:
|
|
269
|
-
#
|
|
270
|
-
# The user does not exist yet, let's create a new one
|
|
271
|
-
#
|
|
272
|
-
try:
|
|
273
|
-
new_user = User(
|
|
274
|
-
con=con,
|
|
275
|
-
username=user["username"],
|
|
276
|
-
email=user["email"],
|
|
277
|
-
givenName=user["givenName"],
|
|
278
|
-
familyName=user["familyName"],
|
|
279
|
-
password=user["password"],
|
|
280
|
-
status=user["status"] if user.get("status") is not None else True,
|
|
281
|
-
lang=user["lang"] if user.get("lang") is not None else "en",
|
|
282
|
-
sysadmin=sysadmin,
|
|
283
|
-
in_projects=project_infos,
|
|
284
|
-
in_groups=group_ids
|
|
285
|
-
).create()
|
|
286
|
-
except BaseError as err:
|
|
287
|
-
print("Creating user failed: " + err.message)
|
|
288
|
-
return False
|
|
289
|
-
if verbose:
|
|
290
|
-
print("New user:")
|
|
291
|
-
new_user.print()
|
|
292
|
-
|
|
293
|
-
# --------------------------------------------------------------------------
|
|
294
|
-
# now let's create the ontologies
|
|
295
|
-
#
|
|
296
|
-
ontologies = datamodel["project"]["ontologies"]
|
|
297
|
-
for ontology in ontologies:
|
|
298
|
-
newontology = Ontology(
|
|
299
|
-
con=con,
|
|
300
|
-
project=project,
|
|
301
|
-
label=ontology["label"],
|
|
302
|
-
name=ontology["name"]
|
|
303
|
-
).create()
|
|
304
|
-
last_modification_date = newontology.lastModificationDate
|
|
305
|
-
if verbose:
|
|
306
|
-
print("Created empty ontology:")
|
|
307
|
-
newontology.print()
|
|
308
|
-
|
|
309
|
-
#
|
|
310
|
-
# add prefixes defined in json file...
|
|
311
|
-
#
|
|
312
|
-
for prefix, iri in context:
|
|
313
|
-
if not prefix in newontology.context:
|
|
314
|
-
s = iri.iri + ("#" if iri.hashtag else "")
|
|
315
|
-
newontology.context.add_context(prefix, s)
|
|
316
|
-
|
|
317
|
-
#
|
|
318
|
-
# First we create the empty resource classes
|
|
319
|
-
#
|
|
320
|
-
resclasses = ontology["resources"]
|
|
321
|
-
newresclasses: Dict[str, ResourceClass] = {}
|
|
322
|
-
for resclass in resclasses:
|
|
323
|
-
resname = resclass.get("name")
|
|
324
|
-
super_classes = resclass.get("super")
|
|
325
|
-
if isinstance(super_classes, str):
|
|
326
|
-
super_classes = [super_classes]
|
|
327
|
-
reslabel = LangString(resclass.get("labels"))
|
|
328
|
-
rescomment = resclass.get("comment")
|
|
329
|
-
if rescomment is not None:
|
|
330
|
-
rescomment = LangString(rescomment)
|
|
331
|
-
try:
|
|
332
|
-
last_modification_date, newresclass = ResourceClass(
|
|
333
|
-
con=con,
|
|
334
|
-
context=newontology.context,
|
|
335
|
-
ontology_id=newontology.id,
|
|
336
|
-
name=resname,
|
|
337
|
-
superclasses=super_classes,
|
|
338
|
-
label=reslabel,
|
|
339
|
-
comment=rescomment
|
|
340
|
-
).create(last_modification_date)
|
|
341
|
-
newontology.lastModificationDate = last_modification_date
|
|
342
|
-
except BaseError as err:
|
|
343
|
-
print("Creating resource class failed: " + err.message)
|
|
344
|
-
exit(105)
|
|
345
|
-
newresclasses[newresclass.id] = newresclass
|
|
346
|
-
if verbose is not None:
|
|
347
|
-
print("New resource class:")
|
|
348
|
-
newresclass.print()
|
|
349
|
-
|
|
350
|
-
#
|
|
351
|
-
# Then we create the property classes
|
|
352
|
-
#
|
|
353
|
-
propclasses = ontology["properties"]
|
|
354
|
-
newpropclasses: Dict[str, ResourceClass] = {}
|
|
355
|
-
for propclass in propclasses:
|
|
356
|
-
propname = propclass.get("name")
|
|
357
|
-
proplabel = LangString(propclass.get("labels"))
|
|
358
|
-
#
|
|
359
|
-
# get the super-property/ies if defined. Valid forms are:
|
|
360
|
-
# - "prefix:superproperty" : fully qualified name of property in another ontology. The prefix has to
|
|
361
|
-
# be defined in the prefixes part.
|
|
362
|
-
# - "superproperty" : Use of super-property defined in the knora-api ontology
|
|
363
|
-
# if omitted, automatically "knora-api:hasValue" is assumed
|
|
364
|
-
#
|
|
365
|
-
if propclass.get("super") is not None:
|
|
366
|
-
super_props = list(map(lambda a: a if ':' in a else "knora-api:" + a, propclass["super"]))
|
|
367
|
-
else:
|
|
368
|
-
super_props = ["knora-api:hasValue"]
|
|
369
|
-
#
|
|
370
|
-
# now we get the "object" if defined. Valid forms are:
|
|
371
|
-
# - "prefix:object_name" : fully qualified object. The prefix has to be defined in the prefixes part.
|
|
372
|
-
# - ":object_name" : The object is defined in the current ontology.
|
|
373
|
-
# - "object_name" : The object is defined in "knora-api"
|
|
374
|
-
#
|
|
375
|
-
if propclass.get("object") is not None:
|
|
376
|
-
tmp = propclass["object"].split(':')
|
|
377
|
-
if len(tmp) > 1:
|
|
378
|
-
if tmp[0]:
|
|
379
|
-
object = propclass["object"] # fully qualified name
|
|
380
|
-
else:
|
|
381
|
-
newontology.print()
|
|
382
|
-
object = newontology.name + ':' + tmp[1]
|
|
383
|
-
else:
|
|
384
|
-
object = "knora-api:" + propclass["object"]
|
|
385
|
-
else:
|
|
386
|
-
object = None
|
|
387
|
-
|
|
388
|
-
if propclass.get("subject") is not None:
|
|
389
|
-
subject = propclass["subject"]
|
|
390
|
-
else:
|
|
391
|
-
subject = None
|
|
392
|
-
gui_element = propclass.get("gui_element")
|
|
393
|
-
gui_attributes = propclass.get("gui_attributes")
|
|
394
|
-
if gui_attributes is not None and gui_attributes.get("hlist") is not None:
|
|
395
|
-
gui_attributes['hlist'] = "<" + listrootnodes[gui_attributes['hlist']]["id"] + ">"
|
|
396
|
-
propcomment = propclass.get("comment")
|
|
397
|
-
if propcomment is not None:
|
|
398
|
-
propcomment = LangString(propcomment)
|
|
399
|
-
else:
|
|
400
|
-
propcomment = "no comment given"
|
|
401
|
-
try:
|
|
402
|
-
last_modification_date, newpropclass = PropertyClass(
|
|
403
|
-
con=con,
|
|
404
|
-
context=newontology.context,
|
|
405
|
-
label=proplabel,
|
|
406
|
-
name=propname,
|
|
407
|
-
ontology_id=newontology.id,
|
|
408
|
-
superproperties=super_props,
|
|
409
|
-
object=object,
|
|
410
|
-
subject=subject,
|
|
411
|
-
gui_element="salsah-gui:" + gui_element,
|
|
412
|
-
gui_attributes=gui_attributes,
|
|
413
|
-
comment=propcomment
|
|
414
|
-
).create(last_modification_date)
|
|
415
|
-
newontology.lastModificationDate = last_modification_date
|
|
416
|
-
except BaseError as err:
|
|
417
|
-
print("Creating property class failed: " + err.message)
|
|
418
|
-
return False
|
|
419
|
-
newpropclasses[newpropclass.id] = newpropclass
|
|
420
|
-
if verbose:
|
|
421
|
-
print("New property class:")
|
|
422
|
-
newpropclass.print()
|
|
423
|
-
|
|
424
|
-
#
|
|
425
|
-
# Add cardinalities
|
|
426
|
-
#
|
|
427
|
-
switcher = {
|
|
428
|
-
"1": Cardinality.C_1,
|
|
429
|
-
"0-1": Cardinality.C_0_1,
|
|
430
|
-
"0-n": Cardinality.C_0_n,
|
|
431
|
-
"1-n": Cardinality.C_1_n
|
|
432
|
-
}
|
|
433
|
-
for resclass in resclasses:
|
|
434
|
-
for cardinfo in resclass["cardinalities"]:
|
|
435
|
-
rc = newresclasses.get(newontology.id + '#' + resclass["name"])
|
|
436
|
-
cardinality = switcher[cardinfo["cardinality"]]
|
|
437
|
-
tmp = cardinfo["propname"].split(':')
|
|
438
|
-
if len(tmp) > 1:
|
|
439
|
-
if tmp[0]:
|
|
440
|
-
propid = cardinfo["propname"] # fully qualified name
|
|
441
|
-
else:
|
|
442
|
-
propid = newontology.name + ':' + tmp[1]
|
|
443
|
-
else:
|
|
444
|
-
propid = "knora-api:" + cardinfo["propname"]
|
|
445
|
-
gui_order = cardinfo.get('gui_order')
|
|
446
|
-
last_modification_date = rc.addProperty(property_id=propid,
|
|
447
|
-
cardinality=cardinality,
|
|
448
|
-
gui_order=gui_order,
|
|
449
|
-
last_modification_date=last_modification_date)
|
|
450
|
-
newontology.lastModificationDate = last_modification_date
|
|
451
|
-
return True
|
knora/dsplib/utils/onto_get.py
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
from typing import List, Set, Dict, Tuple, Optional, Any, Union
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import re
|
|
5
|
-
|
|
6
|
-
from ..models.connection import Connection
|
|
7
|
-
from ..models.project import Project
|
|
8
|
-
from ..models.listnode import ListNode
|
|
9
|
-
from ..models.ontology import Ontology
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def get_ontology(projident: str, outfile: str, server: str, user: str, password: str, verbose: bool) -> bool:
|
|
13
|
-
con = Connection(server)
|
|
14
|
-
# con.login(user, password)
|
|
15
|
-
if re.match("^[0-9aAbBcCdDeEfF]{4}$", projident):
|
|
16
|
-
project = Project(con=con, shortcode=projident)
|
|
17
|
-
elif re.match("^[\\w-]+$", projident):
|
|
18
|
-
project = Project(con=con, shortname=projident)
|
|
19
|
-
elif re.match("^(http)s?://([\\w\\.\\-~]+:?\\d{,4})(/[\\w\\-~]+)+$", projident):
|
|
20
|
-
project = Project(con=con, shortname=projident)
|
|
21
|
-
else:
|
|
22
|
-
print("Invalid project identification!")
|
|
23
|
-
return False
|
|
24
|
-
|
|
25
|
-
project = project.read()
|
|
26
|
-
|
|
27
|
-
projectobj = project.createDefinitionFileObj()
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
# now collect the lists
|
|
31
|
-
#
|
|
32
|
-
listroots = ListNode.getAllLists(con=con, project_iri=project.id)
|
|
33
|
-
listobj = []
|
|
34
|
-
for listroot in listroots:
|
|
35
|
-
complete_list = listroot.getAllNodes()
|
|
36
|
-
listobj.append(complete_list.createDefinitionFileObj())
|
|
37
|
-
projectobj["lists"] = listobj
|
|
38
|
-
|
|
39
|
-
projectobj["ontologies"] = []
|
|
40
|
-
prefixes: Dict[str, str] = {}
|
|
41
|
-
ontologies = Ontology.getProjectOntologies(con, project.id)
|
|
42
|
-
ontology_ids = [x.id for x in ontologies]
|
|
43
|
-
for ontology in ontology_ids:
|
|
44
|
-
oparts = ontology.split("/")
|
|
45
|
-
name = oparts[len(oparts) - 2]
|
|
46
|
-
shortcode = oparts[len(oparts) - 3]
|
|
47
|
-
ontology = Ontology.getOntologyFromServer(con=con, shortcode=shortcode, name=name)
|
|
48
|
-
projectobj["ontologies"].append(ontology.createDefinitionFileObj())
|
|
49
|
-
prefixes.update(ontology.context.get_externals_used())
|
|
50
|
-
|
|
51
|
-
umbrella = {
|
|
52
|
-
"prefixes": prefixes,
|
|
53
|
-
"project": projectobj
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
with open(outfile, 'w', encoding='utf8') as outfile:
|
|
57
|
-
json.dump(umbrella, outfile, indent=3, ensure_ascii=False)
|
|
58
|
-
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import json
|
|
3
|
-
from jsonschema import validate
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def validate_list(input_file: str) -> None:
|
|
7
|
-
current_dir = os.path.dirname(os.path.realpath(__file__))
|
|
8
|
-
|
|
9
|
-
# let's read the schema for the data model definition
|
|
10
|
-
with open(os.path.join(current_dir, 'knora-schema-lists.json')) as s:
|
|
11
|
-
schema = json.load(s)
|
|
12
|
-
# read the data model definition
|
|
13
|
-
with open(input_file) as f:
|
|
14
|
-
datamodel = json.load(f)
|
|
15
|
-
|
|
16
|
-
# validate the data model definition in order to be sure that it is correct
|
|
17
|
-
validate(datamodel, schema)
|
|
18
|
-
print("Data model is syntactically correct and passed validation!")
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def validate_ontology(input_file: str) -> None:
|
|
22
|
-
current_dir = os.path.dirname(os.path.realpath(__file__))
|
|
23
|
-
|
|
24
|
-
with open(os.path.join(current_dir, 'knora-schema.json')) as s:
|
|
25
|
-
schema = json.load(s)
|
|
26
|
-
# read the data model definition
|
|
27
|
-
with open(input_file) as f:
|
|
28
|
-
datamodel = json.load(f)
|
|
29
|
-
|
|
30
|
-
# validate the data model definition in order to be sure that it is correct
|
|
31
|
-
validate(datamodel, schema)
|
|
32
|
-
print("Data model is syntactically correct and passed validation!")
|
|
33
|
-
|