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,390 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module implements the handling (CRUD) of list nodes and adds some function to read whole lists.
|
|
3
|
+
|
|
4
|
+
CREATE:
|
|
5
|
+
* Instantiate a new object of the class ListNode
|
|
6
|
+
* Call the ``create`` method on the instance
|
|
7
|
+
|
|
8
|
+
READ:
|
|
9
|
+
* Instantiate a new object with ``iri`` (IRI of listnode)
|
|
10
|
+
* Call the ``read`` method on the instance
|
|
11
|
+
* Access information about the instance
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from typing import Any
|
|
17
|
+
from typing import Optional
|
|
18
|
+
from typing import Union
|
|
19
|
+
from urllib.parse import quote_plus
|
|
20
|
+
|
|
21
|
+
from dsp_tools.clients.connection import Connection
|
|
22
|
+
from dsp_tools.commands.get.legacy_models.model import Model
|
|
23
|
+
from dsp_tools.commands.get.legacy_models.project import Project
|
|
24
|
+
from dsp_tools.error.exceptions import BaseError
|
|
25
|
+
from dsp_tools.legacy_models.langstring import LangString
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ListNode(Model):
|
|
29
|
+
"""
|
|
30
|
+
This class represents a list node
|
|
31
|
+
|
|
32
|
+
Attributes
|
|
33
|
+
----------
|
|
34
|
+
|
|
35
|
+
con : Connection
|
|
36
|
+
A Connection instance to a DSP server (for some operation a login has to be performed with valid credentials)
|
|
37
|
+
|
|
38
|
+
iri : str
|
|
39
|
+
IRI of the list node [readonly, cannot be modified after creation of instance]
|
|
40
|
+
|
|
41
|
+
project : str
|
|
42
|
+
IRI of project. Only used for the creation of a new list (root node) [write].
|
|
43
|
+
|
|
44
|
+
label : LangString
|
|
45
|
+
A LangString instance with language dependent labels. Setting this attribute overwrites all entries
|
|
46
|
+
with the new ones.
|
|
47
|
+
At least one label is required [read/write].
|
|
48
|
+
|
|
49
|
+
comments : LangString
|
|
50
|
+
A LangString instance with language dependent comments. Setting this attributes overwrites all entries
|
|
51
|
+
with the new ones.
|
|
52
|
+
|
|
53
|
+
name : str
|
|
54
|
+
A unique name for the ListNode (unique inside this list) [read/write].
|
|
55
|
+
|
|
56
|
+
parent : IRI | ListNode
|
|
57
|
+
Is required and allowed only for the CREATE operation. Otherwise use the
|
|
58
|
+
"children" attribute [write].
|
|
59
|
+
|
|
60
|
+
isRootNode : bool
|
|
61
|
+
Is True if the ListNode is the root node of a list. Cannot be set [read].
|
|
62
|
+
|
|
63
|
+
children : list[ListNode]
|
|
64
|
+
Contains a list of child nodes. This attribute is only available for nodes that have been read by the
|
|
65
|
+
method "getAllNodes()" [read].
|
|
66
|
+
|
|
67
|
+
rootNodeIri : str
|
|
68
|
+
IRI of the root node. This attribute is only available for nodes that have been read by the
|
|
69
|
+
method "getAllNodes()" [read].
|
|
70
|
+
|
|
71
|
+
Methods
|
|
72
|
+
-------
|
|
73
|
+
|
|
74
|
+
create : ListNode information object
|
|
75
|
+
Creates a new list (node) and returns the information from the list (node). Use it to create new lists
|
|
76
|
+
or append new ListNodes to an existing list.
|
|
77
|
+
|
|
78
|
+
read : ListNode information object
|
|
79
|
+
Returns information about a single list node
|
|
80
|
+
|
|
81
|
+
getAllNodes : ListNode
|
|
82
|
+
Get all nodes of a list. The IRI of the root node has to be supplied.
|
|
83
|
+
|
|
84
|
+
getAllLists [static]:
|
|
85
|
+
Returns all lists of a project.
|
|
86
|
+
|
|
87
|
+
print : None
|
|
88
|
+
Prints the ListNode information to stdout (not recursive)
|
|
89
|
+
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
ROUTE = "/admin/lists"
|
|
93
|
+
ROUTE_SLASH = ROUTE + "/"
|
|
94
|
+
|
|
95
|
+
_id: Optional[str]
|
|
96
|
+
_project: Optional[str]
|
|
97
|
+
_label: Optional[LangString]
|
|
98
|
+
_comments: Optional[LangString]
|
|
99
|
+
_name: Optional[str]
|
|
100
|
+
_parent: Optional[str]
|
|
101
|
+
_isRootNode: bool
|
|
102
|
+
_children: Optional[list[ListNode]]
|
|
103
|
+
_rootNodeIri: Optional[str]
|
|
104
|
+
|
|
105
|
+
def __init__(
|
|
106
|
+
self,
|
|
107
|
+
con: Connection,
|
|
108
|
+
iri: Optional[str] = None,
|
|
109
|
+
project: Optional[Union[Project, str]] = None,
|
|
110
|
+
label: Optional[LangString] = None,
|
|
111
|
+
comments: Optional[LangString] = None,
|
|
112
|
+
name: Optional[str] = None,
|
|
113
|
+
parent: Optional[Union[ListNode, str]] = None,
|
|
114
|
+
isRootNode: bool = False,
|
|
115
|
+
children: Optional[list[ListNode]] = None,
|
|
116
|
+
rootNodeIri: Optional[str] = None,
|
|
117
|
+
) -> None:
|
|
118
|
+
"""
|
|
119
|
+
This is the constructor for the ListNode object. For
|
|
120
|
+
|
|
121
|
+
CREATE:
|
|
122
|
+
* The "con" and at least one "label" are required
|
|
123
|
+
READ:
|
|
124
|
+
* The "con" and "iri" attributes are required
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
con: A valid Connection instance with a user logged in that has the appropriate permissions
|
|
128
|
+
iri: IRI of the project [readonly, cannot be modified after creation of instance]
|
|
129
|
+
project: IRI of project. Only used for the creation of a new list (root node) [write].
|
|
130
|
+
label: LangString with lang dependent labels. At least one label is required [read/write].
|
|
131
|
+
comments: A LangString instance with language dependent comments.
|
|
132
|
+
name: A unique name for the ListNode (unique regarding the whole list) [read/write].
|
|
133
|
+
parent: Required and allowed only for the CREATE operation. Otherwise use the "children" attribute [write].
|
|
134
|
+
isRootNode: Is True if the ListNode is a root node of a list Cannot be set [read].
|
|
135
|
+
children: list of children nodes. Only available for nodes that have been read by getAllNodes()
|
|
136
|
+
rootNodeIri: IRI of the root node. Only available for nodes that have been read by the method getAllNodes()
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
super().__init__(con)
|
|
140
|
+
|
|
141
|
+
self._project = project.iri if isinstance(project, Project) else str(project) if project else None
|
|
142
|
+
self._id = iri
|
|
143
|
+
self._label = LangString(label)
|
|
144
|
+
self._comments = LangString(comments) if comments else None
|
|
145
|
+
self._name = name
|
|
146
|
+
if parent and isinstance(parent, ListNode):
|
|
147
|
+
self._parent = parent.iri
|
|
148
|
+
else:
|
|
149
|
+
self._parent = str(parent) if parent else None
|
|
150
|
+
self._isRootNode = isRootNode
|
|
151
|
+
if children:
|
|
152
|
+
if isinstance(children, list) and len(children) > 0 and isinstance(children[0], ListNode):
|
|
153
|
+
self._children = children
|
|
154
|
+
else:
|
|
155
|
+
raise BaseError("ERROR Children must be list of ListNodes!")
|
|
156
|
+
else:
|
|
157
|
+
self._children = None
|
|
158
|
+
if not isinstance(rootNodeIri, str) and rootNodeIri:
|
|
159
|
+
raise BaseError("ERROR rootNodeIri must be of type string")
|
|
160
|
+
self._rootNodeIri = rootNodeIri
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def iri(self) -> Optional[str]:
|
|
164
|
+
return self._id
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def project(self) -> Optional[str]:
|
|
168
|
+
return self._project
|
|
169
|
+
|
|
170
|
+
@project.setter
|
|
171
|
+
def project(self, value: str) -> None:
|
|
172
|
+
if self._project:
|
|
173
|
+
raise BaseError("Project id cannot be modified!")
|
|
174
|
+
else:
|
|
175
|
+
self._project = value
|
|
176
|
+
|
|
177
|
+
@property
|
|
178
|
+
def label(self) -> LangString:
|
|
179
|
+
return self._label or LangString({})
|
|
180
|
+
|
|
181
|
+
@label.setter
|
|
182
|
+
def label(self, value: Optional[Union[LangString, str]]) -> None:
|
|
183
|
+
self._label = LangString(value)
|
|
184
|
+
self._changed.add("label")
|
|
185
|
+
|
|
186
|
+
@property
|
|
187
|
+
def comments(self) -> LangString:
|
|
188
|
+
return self._comments or LangString({})
|
|
189
|
+
|
|
190
|
+
@comments.setter
|
|
191
|
+
def comments(self, value: Optional[Union[LangString, str]]) -> None:
|
|
192
|
+
self._comments = LangString(value)
|
|
193
|
+
self._changed.add("comments")
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
def name(self) -> Optional[str]:
|
|
197
|
+
return self._name
|
|
198
|
+
|
|
199
|
+
@name.setter
|
|
200
|
+
def name(self, value: str) -> None:
|
|
201
|
+
self._name = value
|
|
202
|
+
self._changed.add("name")
|
|
203
|
+
|
|
204
|
+
@property
|
|
205
|
+
def parent(self) -> Optional[str]:
|
|
206
|
+
return self._parent if self._parent else None
|
|
207
|
+
|
|
208
|
+
@parent.setter
|
|
209
|
+
def parent(self, value: Union[str, ListNode]) -> None:
|
|
210
|
+
if isinstance(value, ListNode):
|
|
211
|
+
self._parent = value.iri
|
|
212
|
+
else:
|
|
213
|
+
self._parent = value
|
|
214
|
+
|
|
215
|
+
@property
|
|
216
|
+
def isRootNode(self) -> Optional[bool]:
|
|
217
|
+
return self._isRootNode
|
|
218
|
+
|
|
219
|
+
@property
|
|
220
|
+
def children(self) -> list[ListNode]:
|
|
221
|
+
return self._children or []
|
|
222
|
+
|
|
223
|
+
@children.setter
|
|
224
|
+
def children(self, value: list[ListNode]) -> None:
|
|
225
|
+
self._children = value
|
|
226
|
+
|
|
227
|
+
@staticmethod
|
|
228
|
+
def __getChildren(
|
|
229
|
+
con: Connection,
|
|
230
|
+
parent_iri: str,
|
|
231
|
+
project_iri: str,
|
|
232
|
+
children: list[Any],
|
|
233
|
+
) -> Optional[list[ListNode]]:
|
|
234
|
+
"""
|
|
235
|
+
Internal method! Should not be used directly!
|
|
236
|
+
|
|
237
|
+
Static method gets a recursive List of children nodes
|
|
238
|
+
|
|
239
|
+
:param con: Valid Connection instance
|
|
240
|
+
:param children: json object of children
|
|
241
|
+
:return: List of ListNode instances
|
|
242
|
+
"""
|
|
243
|
+
if children:
|
|
244
|
+
child_nodes: list[Any] = []
|
|
245
|
+
for child in children:
|
|
246
|
+
if "parentNodeIri" not in child:
|
|
247
|
+
child["parentNodeIri"] = parent_iri
|
|
248
|
+
if "projectIri" not in child:
|
|
249
|
+
child["projectIri"] = project_iri
|
|
250
|
+
child_node = ListNode.fromJsonObj(con, child)
|
|
251
|
+
child_nodes.append(child_node)
|
|
252
|
+
return child_nodes
|
|
253
|
+
else:
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
@property
|
|
257
|
+
def rootNodeIri(self) -> Optional[str]:
|
|
258
|
+
return self._rootNodeIri
|
|
259
|
+
|
|
260
|
+
@classmethod
|
|
261
|
+
def fromJsonObj(cls, con: Connection, json_obj: Any) -> ListNode:
|
|
262
|
+
"""
|
|
263
|
+
Internal method! Should not be used directly!
|
|
264
|
+
|
|
265
|
+
This method is used to create a ListNode instance from the JSON data returned by DSP
|
|
266
|
+
|
|
267
|
+
:param con: Connection instance
|
|
268
|
+
:param json_obj: JSON data returned by DSP as python3 object
|
|
269
|
+
:return: ListNode instance
|
|
270
|
+
"""
|
|
271
|
+
|
|
272
|
+
iri = json_obj.get("id")
|
|
273
|
+
if iri is None:
|
|
274
|
+
raise BaseError("ListNode id is missing")
|
|
275
|
+
project = json_obj.get("projectIri")
|
|
276
|
+
label = LangString.fromJsonObj(json_obj.get("labels"))
|
|
277
|
+
comments = LangString.fromJsonObj(json_obj.get("comments"))
|
|
278
|
+
if json_obj.get("name"):
|
|
279
|
+
name = json_obj["name"]
|
|
280
|
+
else:
|
|
281
|
+
name = iri.rsplit("/", 1)[-1]
|
|
282
|
+
parent = json_obj.get("parentNodeIri")
|
|
283
|
+
isRootNode = json_obj.get("isRootNode")
|
|
284
|
+
|
|
285
|
+
child_info = json_obj.get("children")
|
|
286
|
+
children = None
|
|
287
|
+
if child_info:
|
|
288
|
+
children = ListNode.__getChildren(con=con, parent_iri=iri, project_iri=project, children=child_info)
|
|
289
|
+
rootNodeIri = json_obj.get("hasRootNode")
|
|
290
|
+
|
|
291
|
+
return cls(
|
|
292
|
+
con=con,
|
|
293
|
+
iri=iri,
|
|
294
|
+
project=project,
|
|
295
|
+
label=label,
|
|
296
|
+
comments=comments,
|
|
297
|
+
name=name,
|
|
298
|
+
parent=parent,
|
|
299
|
+
isRootNode=isRootNode,
|
|
300
|
+
children=children,
|
|
301
|
+
rootNodeIri=rootNodeIri,
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
def read(self) -> Any:
|
|
305
|
+
"""
|
|
306
|
+
Read a project from DSP-API
|
|
307
|
+
|
|
308
|
+
:return: JSON-object from DSP-API
|
|
309
|
+
"""
|
|
310
|
+
|
|
311
|
+
result = self._con.get(ListNode.ROUTE_SLASH + "nodes/" + quote_plus(self._id))
|
|
312
|
+
if result.get("nodeinfo"):
|
|
313
|
+
return self.fromJsonObj(self._con, result["nodeinfo"])
|
|
314
|
+
elif result.get("listinfo"):
|
|
315
|
+
return self.fromJsonObj(self._con, result["listinfo"])
|
|
316
|
+
else:
|
|
317
|
+
return None
|
|
318
|
+
|
|
319
|
+
def getAllNodes(self) -> ListNode:
|
|
320
|
+
"""
|
|
321
|
+
Get all nodes of the list. Must be called from a ListNode instance that has at least set the
|
|
322
|
+
list iri!
|
|
323
|
+
|
|
324
|
+
:return: Root node of list with recursive ListNodes ("children"-attributes)
|
|
325
|
+
"""
|
|
326
|
+
|
|
327
|
+
result = self._con.get(ListNode.ROUTE_SLASH + quote_plus(self._id))
|
|
328
|
+
if "list" not in result:
|
|
329
|
+
raise BaseError("Request got no list!")
|
|
330
|
+
if "listinfo" not in result["list"]:
|
|
331
|
+
raise BaseError("Request got no proper list information!")
|
|
332
|
+
root = ListNode.fromJsonObj(self._con, result["list"]["listinfo"])
|
|
333
|
+
if "children" in result["list"]:
|
|
334
|
+
root.children = ListNode.__getChildren(
|
|
335
|
+
con=self._con, parent_iri=root.iri, project_iri=root.project, children=result["list"]["children"]
|
|
336
|
+
)
|
|
337
|
+
return root
|
|
338
|
+
|
|
339
|
+
@staticmethod
|
|
340
|
+
def getAllLists(con: Connection, project_iri: Optional[str] = None) -> list[ListNode]:
|
|
341
|
+
"""
|
|
342
|
+
Get all lists. If a project IRI is given, it returns the lists of the specified project
|
|
343
|
+
|
|
344
|
+
:param con: Connection instance
|
|
345
|
+
:param project_iri: Iri/id of project
|
|
346
|
+
:return: list of ListNodes
|
|
347
|
+
"""
|
|
348
|
+
if project_iri is None:
|
|
349
|
+
result = con.get(ListNode.ROUTE)
|
|
350
|
+
else:
|
|
351
|
+
result = con.get(ListNode.ROUTE + "?projectIri=" + quote_plus(project_iri))
|
|
352
|
+
if "lists" not in result:
|
|
353
|
+
raise BaseError("Request got no lists!")
|
|
354
|
+
return list(map(lambda a: ListNode.fromJsonObj(con, a), result["lists"]))
|
|
355
|
+
|
|
356
|
+
def _createDefinitionFileObj(self, children: list[ListNode]) -> list[dict[str, Any]]:
|
|
357
|
+
"""
|
|
358
|
+
Create an object that corresponds to the syntax of the input to "create_onto".
|
|
359
|
+
Node: This method must be used only internally (for recursion)!!
|
|
360
|
+
|
|
361
|
+
:param children: List of children nodes
|
|
362
|
+
:return: A python object that can be jsonfied to correspond to the syntax of the input to "create_onto".
|
|
363
|
+
"""
|
|
364
|
+
listnodeobjs = []
|
|
365
|
+
for listnode in children:
|
|
366
|
+
listnodeobj = {
|
|
367
|
+
"name": listnode.name,
|
|
368
|
+
"labels": listnode.label.createDefinitionFileObj(),
|
|
369
|
+
}
|
|
370
|
+
if not listnode.comments.isEmpty():
|
|
371
|
+
listnodeobj["comments"] = listnode.comments.createDefinitionFileObj()
|
|
372
|
+
if listnode.children:
|
|
373
|
+
listnodeobj["nodes"] = self._createDefinitionFileObj(listnode.children)
|
|
374
|
+
listnodeobjs.append(listnodeobj)
|
|
375
|
+
return listnodeobjs
|
|
376
|
+
|
|
377
|
+
def createDefinitionFileObj(self) -> dict[str, Any]:
|
|
378
|
+
"""
|
|
379
|
+
Create an object that corresponds to the syntax of the input to "create_onto".
|
|
380
|
+
:return: A python object that can be jsonfied to correspond to the syntax of the input to "create_onto".
|
|
381
|
+
"""
|
|
382
|
+
listnode = {
|
|
383
|
+
"name": self._name,
|
|
384
|
+
"labels": self._label.createDefinitionFileObj(),
|
|
385
|
+
}
|
|
386
|
+
if not self._comments.isEmpty():
|
|
387
|
+
listnode["comments"] = self._comments.createDefinitionFileObj()
|
|
388
|
+
if self._children:
|
|
389
|
+
listnode["nodes"] = self._createDefinitionFileObj(self._children)
|
|
390
|
+
return listnode
|