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
|
File without changes
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Collection
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Protocol
|
|
7
|
+
|
|
8
|
+
from dsp_tools.error.xmllib_warnings import MessageInfo
|
|
9
|
+
from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_type_mismatch_warning
|
|
10
|
+
from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_warning
|
|
11
|
+
from dsp_tools.utils.data_formats.uri_util import is_iiif_uri
|
|
12
|
+
from dsp_tools.xmllib.internal.checkers import check_and_warn_if_a_string_contains_a_potentially_empty_value
|
|
13
|
+
from dsp_tools.xmllib.internal.checkers import check_and_warn_potentially_empty_string
|
|
14
|
+
from dsp_tools.xmllib.internal.checkers import is_nonempty_value_internal
|
|
15
|
+
from dsp_tools.xmllib.internal.input_converters import check_and_fix_collection_input
|
|
16
|
+
from dsp_tools.xmllib.internal.input_converters import check_and_fix_is_non_empty_string
|
|
17
|
+
from dsp_tools.xmllib.models.licenses.recommended import License
|
|
18
|
+
from dsp_tools.xmllib.models.permissions import Permissions
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class AuthorshipLookup:
|
|
23
|
+
lookup: dict[tuple[str, ...], str]
|
|
24
|
+
|
|
25
|
+
def get_id(self, authors: tuple[str, ...] | None) -> str | None:
|
|
26
|
+
if authors is None:
|
|
27
|
+
return None
|
|
28
|
+
if not (found := self.lookup.get(authors)):
|
|
29
|
+
emit_xmllib_input_warning(MessageInfo(f"The input authors {authors} are not defined in the look-up."))
|
|
30
|
+
return " / ".join([str(x) for x in authors])
|
|
31
|
+
return found
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class Metadata:
|
|
36
|
+
license: License | None
|
|
37
|
+
copyright_holder: str | None
|
|
38
|
+
authorship: tuple[str, ...] | None
|
|
39
|
+
permissions: Permissions
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def new(
|
|
43
|
+
cls,
|
|
44
|
+
license: License | None,
|
|
45
|
+
copyright_holder: str | None,
|
|
46
|
+
authorship: Collection[str] | None,
|
|
47
|
+
permissions: Permissions | str,
|
|
48
|
+
resource_id: str,
|
|
49
|
+
) -> Metadata:
|
|
50
|
+
lic_ = license
|
|
51
|
+
if license is not None and not isinstance(license, License):
|
|
52
|
+
emit_xmllib_input_type_mismatch_warning(
|
|
53
|
+
expected_type="xmllib.License",
|
|
54
|
+
value=license,
|
|
55
|
+
res_id=resource_id,
|
|
56
|
+
value_field="license (bistream/iiif-uri)",
|
|
57
|
+
)
|
|
58
|
+
lic_ = None
|
|
59
|
+
if isinstance(permissions, Permissions):
|
|
60
|
+
pass
|
|
61
|
+
elif is_nonempty_value_internal(permissions):
|
|
62
|
+
permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
|
|
63
|
+
else:
|
|
64
|
+
emit_xmllib_input_type_mismatch_warning(
|
|
65
|
+
expected_type="xmllib.Permissions",
|
|
66
|
+
value=permissions,
|
|
67
|
+
res_id=resource_id,
|
|
68
|
+
value_field="permissions (bistream/iiif-uri)",
|
|
69
|
+
)
|
|
70
|
+
permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
|
|
71
|
+
if copyright_holder is not None:
|
|
72
|
+
copyright_holder = check_and_fix_is_non_empty_string(
|
|
73
|
+
value=copyright_holder,
|
|
74
|
+
res_id=resource_id,
|
|
75
|
+
value_field="copyright_holder (bistream/iiif-uri)",
|
|
76
|
+
)
|
|
77
|
+
if authorship is not None:
|
|
78
|
+
if not is_nonempty_value_internal(authorship):
|
|
79
|
+
emit_xmllib_input_type_mismatch_warning(
|
|
80
|
+
expected_type="list of authorship strings",
|
|
81
|
+
value=authorship,
|
|
82
|
+
res_id=resource_id,
|
|
83
|
+
value_field="authorship (bistream/iiif-uri)",
|
|
84
|
+
)
|
|
85
|
+
authors = None
|
|
86
|
+
else:
|
|
87
|
+
fixed_authors = set(
|
|
88
|
+
check_and_fix_collection_input(authorship, "authorship (bistream/iiif-uri)", resource_id)
|
|
89
|
+
)
|
|
90
|
+
fixed_authors_list = [
|
|
91
|
+
check_and_fix_is_non_empty_string(
|
|
92
|
+
value=x,
|
|
93
|
+
res_id=resource_id,
|
|
94
|
+
value_field="authorship (bistream/iiif-uri)",
|
|
95
|
+
)
|
|
96
|
+
for x in fixed_authors
|
|
97
|
+
]
|
|
98
|
+
authors = tuple(sorted(fixed_authors_list))
|
|
99
|
+
if len(authors) == 0:
|
|
100
|
+
authors = None
|
|
101
|
+
else:
|
|
102
|
+
authors = None
|
|
103
|
+
return cls(
|
|
104
|
+
license=lic_,
|
|
105
|
+
copyright_holder=copyright_holder,
|
|
106
|
+
authorship=authors,
|
|
107
|
+
permissions=permissions,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class AbstractFileValue(Protocol):
|
|
112
|
+
value: str
|
|
113
|
+
metadata: Metadata
|
|
114
|
+
comment: str | None
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@dataclass
|
|
118
|
+
class FileValue(AbstractFileValue):
|
|
119
|
+
value: str
|
|
120
|
+
metadata: Metadata
|
|
121
|
+
comment: str | None
|
|
122
|
+
|
|
123
|
+
@classmethod
|
|
124
|
+
def new(cls, value: str | Path, metadata: Metadata, comment: str | None, resource_id: str) -> FileValue:
|
|
125
|
+
if isinstance(value, Path):
|
|
126
|
+
if str(value) == ".":
|
|
127
|
+
value = ""
|
|
128
|
+
else:
|
|
129
|
+
value = str(value)
|
|
130
|
+
check_and_warn_potentially_empty_string(
|
|
131
|
+
value=value,
|
|
132
|
+
res_id=resource_id,
|
|
133
|
+
expected="file name",
|
|
134
|
+
field="bitstream",
|
|
135
|
+
)
|
|
136
|
+
if is_nonempty_value_internal(comment):
|
|
137
|
+
fixed_comment = str(comment)
|
|
138
|
+
check_and_warn_if_a_string_contains_a_potentially_empty_value(
|
|
139
|
+
value=comment,
|
|
140
|
+
res_id=resource_id,
|
|
141
|
+
field="comment on bitstream",
|
|
142
|
+
)
|
|
143
|
+
else:
|
|
144
|
+
fixed_comment = None
|
|
145
|
+
return cls(value=str(value), metadata=metadata, comment=fixed_comment)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@dataclass
|
|
149
|
+
class IIIFUri(AbstractFileValue):
|
|
150
|
+
value: str
|
|
151
|
+
metadata: Metadata
|
|
152
|
+
comment: str | None
|
|
153
|
+
|
|
154
|
+
@classmethod
|
|
155
|
+
def new(cls, value: str, metadata: Metadata, comment: str | None, resource_id: str) -> IIIFUri:
|
|
156
|
+
v = str(value)
|
|
157
|
+
if not is_iiif_uri(v):
|
|
158
|
+
emit_xmllib_input_type_mismatch_warning(
|
|
159
|
+
expected_type="IIIF uri",
|
|
160
|
+
value=value,
|
|
161
|
+
res_id=resource_id,
|
|
162
|
+
)
|
|
163
|
+
if is_nonempty_value_internal(comment):
|
|
164
|
+
fixed_comment = str(comment)
|
|
165
|
+
check_and_warn_if_a_string_contains_a_potentially_empty_value(
|
|
166
|
+
value=comment,
|
|
167
|
+
res_id=resource_id,
|
|
168
|
+
field="comment on iiif-uri",
|
|
169
|
+
)
|
|
170
|
+
else:
|
|
171
|
+
fixed_comment = None
|
|
172
|
+
return cls(value=v, metadata=metadata, comment=fixed_comment)
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Protocol
|
|
6
|
+
|
|
7
|
+
from dsp_tools.error.xmllib_warnings import MessageInfo
|
|
8
|
+
from dsp_tools.error.xmllib_warnings_util import raise_xmllib_input_error
|
|
9
|
+
from dsp_tools.xmllib.value_checkers import is_color
|
|
10
|
+
from dsp_tools.xmllib.value_checkers import is_decimal
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class GeometryShape(Protocol):
|
|
15
|
+
color: str
|
|
16
|
+
|
|
17
|
+
def to_json_string(self) -> str: ...
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class Rectangle(GeometryShape):
|
|
22
|
+
point1: GeometryPoint
|
|
23
|
+
point2: GeometryPoint
|
|
24
|
+
line_width: float
|
|
25
|
+
color: str
|
|
26
|
+
active: bool
|
|
27
|
+
resource_id: str
|
|
28
|
+
|
|
29
|
+
def __post_init__(self) -> None:
|
|
30
|
+
_check_warn_shape_info(self.color, self.line_width, self.resource_id)
|
|
31
|
+
|
|
32
|
+
def to_json_string(self) -> str:
|
|
33
|
+
json_dict = {
|
|
34
|
+
"status": "active" if self.active else "deleted",
|
|
35
|
+
"type": "rectangle",
|
|
36
|
+
"lineWidth": self.line_width,
|
|
37
|
+
"points": [self.point1.to_dict(), self.point2.to_dict()],
|
|
38
|
+
}
|
|
39
|
+
return json.dumps(json_dict)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class Polygon(GeometryShape):
|
|
44
|
+
points: list[GeometryPoint]
|
|
45
|
+
line_width: float
|
|
46
|
+
color: str
|
|
47
|
+
active: bool
|
|
48
|
+
resource_id: str
|
|
49
|
+
|
|
50
|
+
def __post_init__(self) -> None:
|
|
51
|
+
_check_warn_shape_info(self.color, self.line_width, self.resource_id)
|
|
52
|
+
if len(self.points) < 3:
|
|
53
|
+
msg = (
|
|
54
|
+
"The region shape is a polygon. Polygons should have at least 3 points. "
|
|
55
|
+
"If you would like to display a rectangle we recommend to use the designated rectangle shape."
|
|
56
|
+
)
|
|
57
|
+
raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
|
|
58
|
+
|
|
59
|
+
def to_json_string(self) -> str:
|
|
60
|
+
json_dict = {
|
|
61
|
+
"status": "active" if self.active else "deleted",
|
|
62
|
+
"type": "polygon",
|
|
63
|
+
"lineWidth": self.line_width,
|
|
64
|
+
"points": [x.to_dict() for x in self.points],
|
|
65
|
+
}
|
|
66
|
+
return json.dumps(json_dict)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass
|
|
70
|
+
class Circle(GeometryShape):
|
|
71
|
+
center: GeometryPoint
|
|
72
|
+
radius: Vector
|
|
73
|
+
line_width: float
|
|
74
|
+
color: str
|
|
75
|
+
active: bool
|
|
76
|
+
resource_id: str
|
|
77
|
+
|
|
78
|
+
def __post_init__(self) -> None:
|
|
79
|
+
_check_warn_shape_info(self.color, self.line_width, self.resource_id)
|
|
80
|
+
|
|
81
|
+
def to_json_string(self) -> str:
|
|
82
|
+
json_dict = {
|
|
83
|
+
"status": "active" if self.active else "deleted",
|
|
84
|
+
"type": "circle",
|
|
85
|
+
"lineWidth": self.line_width,
|
|
86
|
+
"points": [self.center.to_dict()],
|
|
87
|
+
"radius": self.radius.to_dict(),
|
|
88
|
+
}
|
|
89
|
+
return json.dumps(json_dict)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@dataclass
|
|
93
|
+
class GeometryPoint:
|
|
94
|
+
x: float
|
|
95
|
+
y: float
|
|
96
|
+
resource_id: str
|
|
97
|
+
|
|
98
|
+
def __post_init__(self) -> None:
|
|
99
|
+
if not all([is_decimal(self.x), is_decimal(self.y)]):
|
|
100
|
+
msg = f"The entered geometry points are not floats. x: '{self.x}', y: '{self.y}'"
|
|
101
|
+
raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
|
|
102
|
+
|
|
103
|
+
else:
|
|
104
|
+
info = []
|
|
105
|
+
if not 0 <= float(self.x) <= 1:
|
|
106
|
+
info.append(f"x: '{self.x}'")
|
|
107
|
+
if not 0 <= float(self.y) <= 1:
|
|
108
|
+
info.append(f"y: '{self.y}'")
|
|
109
|
+
if info:
|
|
110
|
+
msg = (
|
|
111
|
+
f"The geometry points must be larger/equal 0 and smaller/equal 1. "
|
|
112
|
+
f"The following points are not valid: {', '.join(info)}"
|
|
113
|
+
)
|
|
114
|
+
raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
|
|
115
|
+
self.x = float(self.x)
|
|
116
|
+
self.y = float(self.y)
|
|
117
|
+
|
|
118
|
+
def to_dict(self) -> dict[str, float]:
|
|
119
|
+
return {"x": self.x, "y": self.y}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@dataclass
|
|
123
|
+
class Vector:
|
|
124
|
+
x: float
|
|
125
|
+
y: float
|
|
126
|
+
resource_id: str
|
|
127
|
+
|
|
128
|
+
def __post_init__(self) -> None:
|
|
129
|
+
if not all([is_decimal(self.x), is_decimal(self.y)]):
|
|
130
|
+
msg = f"The radius vector are not floats. x: '{self.x}', y: '{self.y}'"
|
|
131
|
+
raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
|
|
132
|
+
else:
|
|
133
|
+
info = []
|
|
134
|
+
if not 0 <= float(self.x) <= 1:
|
|
135
|
+
info.append(f"x: '{self.x}'")
|
|
136
|
+
if not 0 <= float(self.y) <= 1:
|
|
137
|
+
info.append(f"y: '{self.y}'")
|
|
138
|
+
if info:
|
|
139
|
+
msg = (
|
|
140
|
+
f"The radius vector must be larger/equal 0 and smaller/equal 1. "
|
|
141
|
+
f"The following values are not valid: {', '.join(info)}"
|
|
142
|
+
)
|
|
143
|
+
raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
|
|
144
|
+
self.x = float(self.x)
|
|
145
|
+
self.y = float(self.y)
|
|
146
|
+
|
|
147
|
+
def to_dict(self) -> dict[str, float]:
|
|
148
|
+
return {"x": self.x, "y": self.y}
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _check_warn_shape_info(color: str, line_width: float, res_id: str) -> None:
|
|
152
|
+
problems = []
|
|
153
|
+
line_msg = f"The line width must be a number between 1-5. The provided value is not valid: {line_width}"
|
|
154
|
+
if not is_decimal(line_width):
|
|
155
|
+
problems.append(line_msg)
|
|
156
|
+
elif not 0 < int(line_width) <= 5:
|
|
157
|
+
problems.append(line_msg)
|
|
158
|
+
if not is_color(color):
|
|
159
|
+
problems.append(f"The color must be a valid hexadecimal color. The provided value is not valid: {color}")
|
|
160
|
+
if problems:
|
|
161
|
+
msg = f"Some of the shape values are not valid: \n- {'\n- '.join(problems)}"
|
|
162
|
+
raise_xmllib_input_error(MessageInfo(msg, res_id))
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from typing_extensions import deprecated
|
|
4
|
+
|
|
5
|
+
from dsp_tools.error.xmllib_warnings import MessageInfo
|
|
6
|
+
from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_warning
|
|
7
|
+
from dsp_tools.xmllib.value_checkers import is_dsp_ark
|
|
8
|
+
from dsp_tools.xmllib.value_checkers import is_dsp_iri
|
|
9
|
+
from dsp_tools.xmllib.value_checkers import is_timestamp
|
|
10
|
+
|
|
11
|
+
LIST_SEPARATOR = "\n - "
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class MigrationMetadata:
|
|
16
|
+
"""
|
|
17
|
+
Metadata originating from a SALSAH migration.
|
|
18
|
+
This will be deprecated in the future when all projects are migrated.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
creation_date: str | None
|
|
22
|
+
iri: str | None
|
|
23
|
+
ark: str | None
|
|
24
|
+
res_id: str
|
|
25
|
+
|
|
26
|
+
@deprecated("This is for salsah migration only and will be deleted in future releases.")
|
|
27
|
+
def __post_init__(self) -> None:
|
|
28
|
+
msg_list = []
|
|
29
|
+
if self.creation_date and not is_timestamp(self.creation_date):
|
|
30
|
+
msg_list.append(f"The value for creation date is not a valid timestamp: {self.creation_date}")
|
|
31
|
+
self.creation_date = str(self.creation_date)
|
|
32
|
+
if self.iri and not is_dsp_iri(self.iri):
|
|
33
|
+
msg_list.append(f"The provided IRI is not valid: {self.iri}")
|
|
34
|
+
self.creation_date = str(self.creation_date)
|
|
35
|
+
if self.ark and not is_dsp_ark(self.ark):
|
|
36
|
+
msg_list.append(f"The provided ARK is not valid: {self.ark}")
|
|
37
|
+
self.ark = str(self.ark)
|
|
38
|
+
if msg_list:
|
|
39
|
+
msg = f"The migration metadata has the following problem(s):{LIST_SEPARATOR}{LIST_SEPARATOR.join(msg_list)}"
|
|
40
|
+
emit_xmllib_input_warning(MessageInfo(msg, self.res_id))
|
|
41
|
+
|
|
42
|
+
def as_attrib(self) -> dict[str, str]:
|
|
43
|
+
attrib_dict = {}
|
|
44
|
+
if self.creation_date:
|
|
45
|
+
attrib_dict["creation_date"] = self.creation_date
|
|
46
|
+
if self.iri:
|
|
47
|
+
attrib_dict["iri"] = self.iri
|
|
48
|
+
if self.ark:
|
|
49
|
+
attrib_dict["ark"] = self.ark
|
|
50
|
+
if not attrib_dict:
|
|
51
|
+
msg = (
|
|
52
|
+
"The migration metadata of the resource does not contain any values. Please check if an error occurred."
|
|
53
|
+
)
|
|
54
|
+
emit_xmllib_input_warning(MessageInfo(msg, self.res_id))
|
|
55
|
+
return attrib_dict
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
from lxml import etree
|
|
4
|
+
|
|
5
|
+
from dsp_tools.xmllib.internal.constants import DASCH_SCHEMA
|
|
6
|
+
from dsp_tools.xmllib.internal.constants import XML_NAMESPACE_MAP
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PermissionTypes(Enum):
|
|
10
|
+
RV = "RV"
|
|
11
|
+
V = "V"
|
|
12
|
+
D = "D"
|
|
13
|
+
CR = "CR"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
PUBLIC = {
|
|
17
|
+
"UnknownUser": PermissionTypes.V,
|
|
18
|
+
"KnownUser": PermissionTypes.V,
|
|
19
|
+
"ProjectMember": PermissionTypes.D,
|
|
20
|
+
"ProjectAdmin": PermissionTypes.CR,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
PRIVATE = {
|
|
24
|
+
"ProjectMember": PermissionTypes.D,
|
|
25
|
+
"ProjectAdmin": PermissionTypes.CR,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
LIMITED_VIEW = {
|
|
29
|
+
"UnknownUser": PermissionTypes.RV,
|
|
30
|
+
"KnownUser": PermissionTypes.RV,
|
|
31
|
+
"ProjectMember": PermissionTypes.D,
|
|
32
|
+
"ProjectAdmin": PermissionTypes.CR,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class XMLPermissions:
|
|
37
|
+
def serialise(self, contains_old_permissions: bool, contains_new_permissions: bool = True) -> list[etree._Element]:
|
|
38
|
+
new_perms = [
|
|
39
|
+
self._serialise_one_permission_element("public", PUBLIC),
|
|
40
|
+
self._serialise_one_permission_element("private", PRIVATE),
|
|
41
|
+
self._serialise_one_permission_element("limited_view", LIMITED_VIEW),
|
|
42
|
+
]
|
|
43
|
+
old_perms = [
|
|
44
|
+
self._serialise_one_permission_element("open", PUBLIC),
|
|
45
|
+
self._serialise_one_permission_element("restricted", PRIVATE),
|
|
46
|
+
self._serialise_one_permission_element("restricted-view", LIMITED_VIEW),
|
|
47
|
+
]
|
|
48
|
+
res = []
|
|
49
|
+
if contains_new_permissions:
|
|
50
|
+
res.extend(new_perms)
|
|
51
|
+
if contains_old_permissions:
|
|
52
|
+
res.extend(old_perms)
|
|
53
|
+
return res
|
|
54
|
+
|
|
55
|
+
def _serialise_one_permission_element(
|
|
56
|
+
self, permission_name: str, groups: dict[str, PermissionTypes]
|
|
57
|
+
) -> etree._Element:
|
|
58
|
+
ele = etree.Element(f"{DASCH_SCHEMA}permissions", attrib={"id": permission_name}, nsmap=XML_NAMESPACE_MAP)
|
|
59
|
+
allows = [self._serialise_one_allow(g, name) for g, name in groups.items()]
|
|
60
|
+
ele.extend(allows)
|
|
61
|
+
return ele
|
|
62
|
+
|
|
63
|
+
def _serialise_one_allow(self, group: str, tag_text: PermissionTypes) -> etree._Element:
|
|
64
|
+
ele = etree.Element(f"{DASCH_SCHEMA}allow", attrib={"group": group}, nsmap=XML_NAMESPACE_MAP)
|
|
65
|
+
ele.text = tag_text.value
|
|
66
|
+
return ele
|