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
knora/dsplib/utils/xml_upload.py
DELETED
|
@@ -1,540 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import re
|
|
3
|
-
|
|
4
|
-
from typing import List, Set, Dict, Tuple, Optional, Union
|
|
5
|
-
from lxml import etree
|
|
6
|
-
from pprint import pprint
|
|
7
|
-
|
|
8
|
-
from dsplib.models.connection import Connection
|
|
9
|
-
from dsplib.models.group import Group
|
|
10
|
-
from dsplib.models.helpers import IriTest
|
|
11
|
-
from dsplib.models.project import Project
|
|
12
|
-
from dsplib.models.resource import ResourceInstanceFactory
|
|
13
|
-
from dsplib.models.value import BooleanValue, ColorValue, DateValue, DecimalValue, IntValue, IntervalValue, TextValue, \
|
|
14
|
-
UriValue, KnoraStandoffXml, make_value
|
|
15
|
-
from dsplib.models.permission import PermissionValue, Permissions
|
|
16
|
-
from dsplib.models.sipi import Sipi
|
|
17
|
-
|
|
18
|
-
StrDict = Dict[str, str]
|
|
19
|
-
|
|
20
|
-
StrObj = Union[str, StrDict]
|
|
21
|
-
|
|
22
|
-
VarStrObj = Union[StrObj, List[StrObj]]
|
|
23
|
-
|
|
24
|
-
richtext_tags = [
|
|
25
|
-
'p', 'em', 'strong', 'u', 'sub', 'strike', 'a', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'ul', 'li', 'tbody',
|
|
26
|
-
'table', 'tr', 'td', 'br', 'hr', 'pre', 'cite', 'blockquote', 'code'
|
|
27
|
-
]
|
|
28
|
-
|
|
29
|
-
class XmlError(BaseException):
|
|
30
|
-
|
|
31
|
-
def __init__(self, msg: str):
|
|
32
|
-
self._message = msg
|
|
33
|
-
|
|
34
|
-
def __str__(self):
|
|
35
|
-
return 'XML-ERROR: ' + self._message
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class ProjectContext:
|
|
39
|
-
_projects: Project
|
|
40
|
-
_groups: Group
|
|
41
|
-
_projectmap: Dict[str, str]
|
|
42
|
-
_invprojectmap: Dict[str, str]
|
|
43
|
-
_groupmap: Dict[str, str]
|
|
44
|
-
_shortcode: Union[str, None]
|
|
45
|
-
_project_name: Union[str, None]
|
|
46
|
-
|
|
47
|
-
def __init__(self, con: Connection, shortcode: Optional[str] = None):
|
|
48
|
-
self._shortcode = shortcode
|
|
49
|
-
self._projects = Project.getAllProjects(con=con)
|
|
50
|
-
self._projectmap: Dict[str, str] = {x.shortname: x.id for x in self._projects}
|
|
51
|
-
invprojectmap: Dict[str, str] = {x.id: x.shortname for x in self._projects}
|
|
52
|
-
self._groups = Group.getAllGroups(con=con)
|
|
53
|
-
self._groupmap: Dict[str, str] = {invprojectmap[x.project] + ':' + x.name: x.id for x in self._groups}
|
|
54
|
-
self._project_name = None
|
|
55
|
-
if self._shortcode:
|
|
56
|
-
for p in self._projects:
|
|
57
|
-
if p.shortcode == self._shortcode:
|
|
58
|
-
self._project_name = p.shortname
|
|
59
|
-
break
|
|
60
|
-
|
|
61
|
-
@property
|
|
62
|
-
def groupmap(self):
|
|
63
|
-
return self._groupmap
|
|
64
|
-
|
|
65
|
-
@property
|
|
66
|
-
def shortcode(self) -> Union[str, None]:
|
|
67
|
-
return self._shortcode
|
|
68
|
-
|
|
69
|
-
@shortcode.setter
|
|
70
|
-
def shortcode(self, val: str) -> None:
|
|
71
|
-
for p in self._projects:
|
|
72
|
-
if p.shortcode == self._shortcode:
|
|
73
|
-
self._project_name = p.shortname
|
|
74
|
-
break
|
|
75
|
-
|
|
76
|
-
@property
|
|
77
|
-
def project_name(self) -> Union[str, None]:
|
|
78
|
-
return self._project_name
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class KnoraValue:
|
|
82
|
-
_value: Union[str, KnoraStandoffXml]
|
|
83
|
-
_resrefs: List[str]
|
|
84
|
-
_comment: str
|
|
85
|
-
_permissions: str
|
|
86
|
-
is_richtext: bool
|
|
87
|
-
|
|
88
|
-
def __init__(self,
|
|
89
|
-
node: etree.Element,
|
|
90
|
-
valtype: str,
|
|
91
|
-
listname: Optional[str] = None) -> None:
|
|
92
|
-
|
|
93
|
-
self._resrefs = None
|
|
94
|
-
self._comment = node.get('comment')
|
|
95
|
-
self._permissions = node.get('permissions')
|
|
96
|
-
if node.get('encoding') == 'xml':
|
|
97
|
-
node.attrib.clear()
|
|
98
|
-
xmlstr = etree.tostring(node, encoding="unicode", method="xml")
|
|
99
|
-
xmlstr = xmlstr.replace('<text xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">', '')
|
|
100
|
-
xmlstr = xmlstr.replace('</text>', '')
|
|
101
|
-
self._value = KnoraStandoffXml(xmlstr)
|
|
102
|
-
tmpidlist = self._value.findall()
|
|
103
|
-
if tmpidlist:
|
|
104
|
-
refs = set()
|
|
105
|
-
for tmpid in tmpidlist:
|
|
106
|
-
refs.add(tmpid.split(':')[1])
|
|
107
|
-
self._resrefs = list(refs)
|
|
108
|
-
else:
|
|
109
|
-
if valtype == 'list':
|
|
110
|
-
self._value = listname + ':' + "".join(node.itertext())
|
|
111
|
-
else:
|
|
112
|
-
self._value = "".join(node.itertext())
|
|
113
|
-
|
|
114
|
-
@property
|
|
115
|
-
def value(self):
|
|
116
|
-
return self._value
|
|
117
|
-
|
|
118
|
-
@property
|
|
119
|
-
def resrefs(self):
|
|
120
|
-
return self._resrefs
|
|
121
|
-
|
|
122
|
-
@property
|
|
123
|
-
def comment(self):
|
|
124
|
-
return self._comment
|
|
125
|
-
|
|
126
|
-
@property
|
|
127
|
-
def permissions(self):
|
|
128
|
-
return self._permissions
|
|
129
|
-
|
|
130
|
-
def print(self) -> None:
|
|
131
|
-
"""
|
|
132
|
-
Print value to stdout for debugging...
|
|
133
|
-
|
|
134
|
-
:return: None
|
|
135
|
-
"""
|
|
136
|
-
print(' Value: ' + str(self._value))
|
|
137
|
-
if self._comment:
|
|
138
|
-
print(' Comment:' + self._comment)
|
|
139
|
-
if self._resrefs is not None:
|
|
140
|
-
for i in self._resrefs:
|
|
141
|
-
print(' resref: ' + i)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
class KnoraProperty:
|
|
145
|
-
_name: str
|
|
146
|
-
_valtype: str
|
|
147
|
-
_values: List[KnoraValue]
|
|
148
|
-
|
|
149
|
-
def __init__(self, node: etree.Element, valtype: str, default_ontology: Optional[str] = None):
|
|
150
|
-
tmp = node.attrib['name'].split(':')
|
|
151
|
-
if len(tmp) > 1:
|
|
152
|
-
if tmp[0]:
|
|
153
|
-
self._name = node.attrib['name']
|
|
154
|
-
else:
|
|
155
|
-
self._name = default_ontology + ':' + tmp[1]
|
|
156
|
-
else:
|
|
157
|
-
self._name = 'knora-admin:' + tmp[0]
|
|
158
|
-
listname = node.attrib.get('list') # safe the list name if given (only for lists)
|
|
159
|
-
self._valtype = valtype
|
|
160
|
-
self._values = []
|
|
161
|
-
|
|
162
|
-
for subnode in node:
|
|
163
|
-
if subnode.tag == valtype: # the subnode must correspond to the expected value type
|
|
164
|
-
self._values.append(KnoraValue(subnode, valtype, listname))
|
|
165
|
-
else:
|
|
166
|
-
raise XmlError('Unexpected tag: "{}" <property> may contain only <value> tags!'.format(subnode.tag))
|
|
167
|
-
|
|
168
|
-
@property
|
|
169
|
-
def name(self):
|
|
170
|
-
return self._name
|
|
171
|
-
|
|
172
|
-
@property
|
|
173
|
-
def valtype(self):
|
|
174
|
-
return self._valtype
|
|
175
|
-
|
|
176
|
-
@property
|
|
177
|
-
def values(self):
|
|
178
|
-
return self._values
|
|
179
|
-
|
|
180
|
-
def print(self) -> None:
|
|
181
|
-
print(' Property: {} Type: {}'.format(self._name, self._valtype))
|
|
182
|
-
for value in self._values:
|
|
183
|
-
value.print()
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
class KnoraResource:
|
|
187
|
-
_id: str
|
|
188
|
-
_label: str
|
|
189
|
-
_restype: str
|
|
190
|
-
_permissions: str
|
|
191
|
-
_bitstream: str
|
|
192
|
-
_properties: List[KnoraProperty]
|
|
193
|
-
|
|
194
|
-
def __init__(self, node: etree.Element, default_ontology: Optional[str] = None) -> None:
|
|
195
|
-
"""
|
|
196
|
-
Constructor that parses a resource node from the XML DOM
|
|
197
|
-
|
|
198
|
-
:param context: Context for DOM node traversal
|
|
199
|
-
:param node: The DOM node to be processed (representing a resource)
|
|
200
|
-
"""
|
|
201
|
-
self._id = node.attrib['id'] # safe the unique id
|
|
202
|
-
self._label = node.attrib['label']
|
|
203
|
-
tmp = node.attrib['restype'].split(':')
|
|
204
|
-
if len(tmp) > 1:
|
|
205
|
-
if tmp[0]:
|
|
206
|
-
self._restype = node.attrib['restype']
|
|
207
|
-
else:
|
|
208
|
-
self._restype = default_ontology + ':' + tmp[1]
|
|
209
|
-
else:
|
|
210
|
-
self._restype = 'knora-admin:' + tmp[0]
|
|
211
|
-
self._permissions = node.attrib['permissions']
|
|
212
|
-
self._bitstream = None
|
|
213
|
-
self._properties = []
|
|
214
|
-
for subnode in node:
|
|
215
|
-
if subnode.tag == 'bitstream':
|
|
216
|
-
self._bitstream = subnode.text
|
|
217
|
-
elif subnode.tag is etree.Comment:
|
|
218
|
-
continue
|
|
219
|
-
else:
|
|
220
|
-
ptype, dummy = subnode.tag.split('-')
|
|
221
|
-
self._properties.append(KnoraProperty(subnode, ptype, default_ontology))
|
|
222
|
-
|
|
223
|
-
@property
|
|
224
|
-
def id(self) -> str:
|
|
225
|
-
return self._id
|
|
226
|
-
|
|
227
|
-
@property
|
|
228
|
-
def label(self) -> str:
|
|
229
|
-
return self._label
|
|
230
|
-
|
|
231
|
-
@property
|
|
232
|
-
def restype(self) -> str:
|
|
233
|
-
return self._restype
|
|
234
|
-
|
|
235
|
-
@property
|
|
236
|
-
def bitstream(self) -> str:
|
|
237
|
-
return self._bitstream
|
|
238
|
-
|
|
239
|
-
@property
|
|
240
|
-
def permissions(self):
|
|
241
|
-
return self._permissions
|
|
242
|
-
|
|
243
|
-
def print(self):
|
|
244
|
-
print(f'Resource: id={self._id} restype: {self._restype} label: {self._label}')
|
|
245
|
-
if self._bitstream is not None:
|
|
246
|
-
print(' Bitstream: ' + self._bitstream)
|
|
247
|
-
for property in self._properties:
|
|
248
|
-
property.print()
|
|
249
|
-
|
|
250
|
-
def get_resptrs(self) -> List[str]:
|
|
251
|
-
"""
|
|
252
|
-
Return a list of all reesource id's that a referenced by this resource
|
|
253
|
-
:return: List of resources identified by their unique id's
|
|
254
|
-
"""
|
|
255
|
-
resptrs: List[str] = []
|
|
256
|
-
for property in self._properties:
|
|
257
|
-
if property.valtype == 'resptr':
|
|
258
|
-
for value in property.values:
|
|
259
|
-
resptrs.append(value.value)
|
|
260
|
-
elif property.valtype == 'text':
|
|
261
|
-
for value in property.values:
|
|
262
|
-
if value.resrefs is not None:
|
|
263
|
-
resptrs.extend(value.resrefs)
|
|
264
|
-
return resptrs
|
|
265
|
-
|
|
266
|
-
def get_propvals(self,
|
|
267
|
-
resiri_lookup: StrDict,
|
|
268
|
-
permissions_lookup: StrDict) -> Dict[str, VarStrObj]:
|
|
269
|
-
"""
|
|
270
|
-
A function which retrieves...
|
|
271
|
-
|
|
272
|
-
:param resiri_lookup: Is used to solve internal unique_id's of resourcs to real IRI's
|
|
273
|
-
:param permissions_lookup: Is usd to resolve thee permission ID's to permission sets
|
|
274
|
-
:return: A dict of values with the property name as key and a single value. This dict represents
|
|
275
|
-
the JSON structure that Knora.create_resource() expects.
|
|
276
|
-
"""
|
|
277
|
-
propdata = {}
|
|
278
|
-
for property in self._properties:
|
|
279
|
-
vals: List[StrObj] = [] # == List[Union[str,StrDict]
|
|
280
|
-
for value in property.values:
|
|
281
|
-
v: str
|
|
282
|
-
if property.valtype == 'resptr': # we have a resptr, therefore simple lookup or IRI
|
|
283
|
-
iri = resiri_lookup.get(value.value)
|
|
284
|
-
if iri is not None:
|
|
285
|
-
v = iri
|
|
286
|
-
else:
|
|
287
|
-
v = value.value # if we do not find the unique_id, we assume it's a valid knora IRI
|
|
288
|
-
elif property.valtype == 'text':
|
|
289
|
-
if isinstance(value.value, KnoraStandoffXml):
|
|
290
|
-
irirefs = value.value.findall() # The IRI's must be embedded as "...IRI:unique_id:IRI..."
|
|
291
|
-
for iriref in irirefs:
|
|
292
|
-
resid = iriref.split(':')[1]
|
|
293
|
-
iri = resiri_lookup.get(resid)
|
|
294
|
-
value.value.replace(iriref, iri)
|
|
295
|
-
v = value.value
|
|
296
|
-
else:
|
|
297
|
-
v = value.value
|
|
298
|
-
|
|
299
|
-
if value.comment is None and value.permissions is None:
|
|
300
|
-
# no comment or permissions
|
|
301
|
-
vals.append(v)
|
|
302
|
-
else:
|
|
303
|
-
# we have comment or permissions
|
|
304
|
-
tmp = {'value': v}
|
|
305
|
-
if value.comment is not None:
|
|
306
|
-
tmp['comment'] = value.comment
|
|
307
|
-
if value.permissions is not None:
|
|
308
|
-
tmp['permissions'] = permissions_lookup.get(value.permissions)
|
|
309
|
-
vals.append(tmp)
|
|
310
|
-
propdata[property.name] = vals if len(vals) > 1 else vals[0] # append a Union[StrObj,List[StrObj]]
|
|
311
|
-
return propdata
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
class XmlAllow:
|
|
315
|
-
_group: str
|
|
316
|
-
_permission: str
|
|
317
|
-
|
|
318
|
-
def __init__(self, node: etree.Element, project_context: ProjectContext) -> None:
|
|
319
|
-
"""
|
|
320
|
-
Constructor which parses the XML DOM allow element
|
|
321
|
-
|
|
322
|
-
:param context: Context for DOM node traversal
|
|
323
|
-
:param node: The DOM node to be processed (representing an single right in a permission set)
|
|
324
|
-
"""
|
|
325
|
-
tmp = node.attrib['group'].split(':')
|
|
326
|
-
sysgroups = ['UnknownUser', 'KnownUser', 'ProjectMember', 'Creator', 'ProjectAdmin', 'SystemAdmin']
|
|
327
|
-
if len(tmp) > 1:
|
|
328
|
-
if tmp[0]:
|
|
329
|
-
if tmp[0] == 'knora-admin' and tmp[1] in sysgroups:
|
|
330
|
-
self._group = node.attrib['group']
|
|
331
|
-
else:
|
|
332
|
-
self._group = project_context.groupmap.get(node.attrib['group'])
|
|
333
|
-
if self._group is None:
|
|
334
|
-
raise XmlError("Group \"{}\" is not known: Cannot find project!".format(node.attrib['group']))
|
|
335
|
-
else:
|
|
336
|
-
if project_context.project_name is None:
|
|
337
|
-
raise XmlError("Project shortcode has not been set in ProjectContext")
|
|
338
|
-
self._group = project_context.project_name + ':' + tmp[1]
|
|
339
|
-
else:
|
|
340
|
-
if tmp[0] in sysgroups:
|
|
341
|
-
self._group = 'knora-admin:' + node.attrib['group']
|
|
342
|
-
else:
|
|
343
|
-
raise XmlError("Group \"{}\" is not known: ".format(node.attrib['group']))
|
|
344
|
-
self._permission = node.text
|
|
345
|
-
|
|
346
|
-
@property
|
|
347
|
-
def group(self):
|
|
348
|
-
return self._group
|
|
349
|
-
|
|
350
|
-
@property
|
|
351
|
-
def permission(self):
|
|
352
|
-
return self._permission
|
|
353
|
-
|
|
354
|
-
def print(self):
|
|
355
|
-
print(" group=", self._group, " permission=", self._permission)
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
class XmlPermission:
|
|
359
|
-
"""
|
|
360
|
-
A class representing a permission set
|
|
361
|
-
"""
|
|
362
|
-
_id: str
|
|
363
|
-
_allows: List[XmlAllow]
|
|
364
|
-
|
|
365
|
-
def __init__(self, node: etree.Element, project_context: ProjectContext) -> None:
|
|
366
|
-
"""
|
|
367
|
-
Constructor which parses a XML DOM permissions element representing an named permission set
|
|
368
|
-
|
|
369
|
-
:param context: Context for DOM node traversal
|
|
370
|
-
:param node: The DOM node to be processed (representing an a permission set)
|
|
371
|
-
"""
|
|
372
|
-
self._allows = []
|
|
373
|
-
self._id = node.attrib['id']
|
|
374
|
-
for allow_node in node:
|
|
375
|
-
self._allows.append(XmlAllow(allow_node, project_context))
|
|
376
|
-
|
|
377
|
-
@property
|
|
378
|
-
def id(self) -> str:
|
|
379
|
-
return self._id
|
|
380
|
-
|
|
381
|
-
@property
|
|
382
|
-
def allows(self) -> List[XmlAllow]:
|
|
383
|
-
return self._allows
|
|
384
|
-
|
|
385
|
-
def get_permission_instance(self) -> Permissions:
|
|
386
|
-
permissions = Permissions()
|
|
387
|
-
for allow in self._allows:
|
|
388
|
-
permissions.add(allow.permission, allow.group)
|
|
389
|
-
return permissions
|
|
390
|
-
|
|
391
|
-
def __str__(self):
|
|
392
|
-
allowstrs: List[str] = []
|
|
393
|
-
for allow in self._allows:
|
|
394
|
-
allowstrs.append("{} {}".format(allow.permission, allow.group))
|
|
395
|
-
return '|'.join(allowstrs)
|
|
396
|
-
|
|
397
|
-
def print(self):
|
|
398
|
-
print('Permission: ', self._id)
|
|
399
|
-
for a in self._allows:
|
|
400
|
-
a.print()
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
def do_sortorder(resources: List[KnoraResource]) -> List[KnoraResource]:
|
|
404
|
-
"""
|
|
405
|
-
Sort the list of resources such that resources that reference other resources are
|
|
406
|
-
added after the referenced resources. It will fail with an error if there are circular
|
|
407
|
-
references.
|
|
408
|
-
|
|
409
|
-
:param resources: List of resources before sorting
|
|
410
|
-
:return: Sorted list of resources
|
|
411
|
-
"""
|
|
412
|
-
#
|
|
413
|
-
# here we sort the resources according to outgoing resptrs
|
|
414
|
-
#
|
|
415
|
-
ok_resources: [KnoraResource] = []
|
|
416
|
-
notok_resources: [KnoraResource] = []
|
|
417
|
-
ok_resids : [str] = []
|
|
418
|
-
cnt = 0
|
|
419
|
-
notok_len = 9999999
|
|
420
|
-
while len(resources) > 0 and cnt < 10000:
|
|
421
|
-
for resource in resources:
|
|
422
|
-
resptrs = resource.get_resptrs()
|
|
423
|
-
if len(resptrs) == 0:
|
|
424
|
-
ok_resources.append(resource)
|
|
425
|
-
ok_resids.append(resource.id)
|
|
426
|
-
else:
|
|
427
|
-
ok = True
|
|
428
|
-
for resptr in resptrs:
|
|
429
|
-
if resptr in ok_resids:
|
|
430
|
-
pass
|
|
431
|
-
else:
|
|
432
|
-
ok = False;
|
|
433
|
-
if ok:
|
|
434
|
-
ok_resources.append(resource)
|
|
435
|
-
ok_resids.append(resource.id)
|
|
436
|
-
else:
|
|
437
|
-
notok_resources.append(resource)
|
|
438
|
-
resources = notok_resources
|
|
439
|
-
if not len(notok_resources) < notok_len:
|
|
440
|
-
print('Cannot resolve resptr dependencies. Giving up....')
|
|
441
|
-
print(len(notok_resources))
|
|
442
|
-
for r in notok_resources:
|
|
443
|
-
print('Resource {} has unresolvable resptrs to: '.format(r.id), end=' ')
|
|
444
|
-
for x in r.get_resptrs():
|
|
445
|
-
print(x, end=' ')
|
|
446
|
-
print('')
|
|
447
|
-
print('=============')
|
|
448
|
-
exit(5)
|
|
449
|
-
notok_len = len(notok_resources)
|
|
450
|
-
notok_resources = []
|
|
451
|
-
cnt += 1
|
|
452
|
-
print('{}. Ordering pass Finished!'.format(cnt))
|
|
453
|
-
print('Remaining: {}'.format(len(resources)))
|
|
454
|
-
return ok_resources
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
def xml_upload(input_file: str,
|
|
458
|
-
server: str,
|
|
459
|
-
user: str,
|
|
460
|
-
password: str,
|
|
461
|
-
imgdir: str,
|
|
462
|
-
sipi: str,
|
|
463
|
-
verbose: bool,
|
|
464
|
-
validate: bool) -> bool:
|
|
465
|
-
current_dir = os.path.dirname(os.path.realpath(__file__))
|
|
466
|
-
|
|
467
|
-
xmlschema_doc = etree.parse(os.path.join(current_dir, 'knora-data-schema.xsd'))
|
|
468
|
-
xmlschema = etree.XMLSchema(xmlschema_doc)
|
|
469
|
-
doc = etree.parse(input_file)
|
|
470
|
-
xmlschema.assertValid(doc)
|
|
471
|
-
|
|
472
|
-
del xmlschema
|
|
473
|
-
del doc
|
|
474
|
-
del xmlschema_doc
|
|
475
|
-
|
|
476
|
-
if validate:
|
|
477
|
-
return
|
|
478
|
-
|
|
479
|
-
print("The input data file is syntactically correct and passed validation!")
|
|
480
|
-
|
|
481
|
-
#
|
|
482
|
-
# Connect to the DaSCH Service Platform API
|
|
483
|
-
#
|
|
484
|
-
con = Connection(server)
|
|
485
|
-
con.login(user, password)
|
|
486
|
-
|
|
487
|
-
proj_context = ProjectContext(con=con)
|
|
488
|
-
|
|
489
|
-
resources: List[KnoraResource] = []
|
|
490
|
-
permissions: Dict[str, XmlPermission] = {}
|
|
491
|
-
shortcode: Union[str, None] = None
|
|
492
|
-
default_ontology = None
|
|
493
|
-
|
|
494
|
-
#
|
|
495
|
-
# read the XML file containing the data, including project shortcode
|
|
496
|
-
#
|
|
497
|
-
tree = etree.parse(input_file)
|
|
498
|
-
knora = tree.getroot()
|
|
499
|
-
default_ontology = knora.attrib['default-ontology']
|
|
500
|
-
shortcode = knora.attrib['shortcode']
|
|
501
|
-
for child in knora:
|
|
502
|
-
if child.tag == "permissions":
|
|
503
|
-
permission = XmlPermission(child, proj_context)
|
|
504
|
-
permissions[permission.id] = permission
|
|
505
|
-
elif child.tag == "resource":
|
|
506
|
-
resources.append(KnoraResource(child, default_ontology))
|
|
507
|
-
|
|
508
|
-
#
|
|
509
|
-
# sort the resources so that resources which do not link to others come first
|
|
510
|
-
#
|
|
511
|
-
resources = do_sortorder(resources)
|
|
512
|
-
|
|
513
|
-
sipi = Sipi(sipi, con.get_token())
|
|
514
|
-
|
|
515
|
-
factory = ResourceInstanceFactory(con, shortcode)
|
|
516
|
-
|
|
517
|
-
permissions_lookup: Dict[str, Permissions] = {}
|
|
518
|
-
for key, perm in permissions.items():
|
|
519
|
-
permissions_lookup[key] = perm.get_permission_instance()
|
|
520
|
-
|
|
521
|
-
resclassnames = factory.get_resclass_names()
|
|
522
|
-
resclasses: Dict[str, type] = {}
|
|
523
|
-
for resclassname in resclassnames:
|
|
524
|
-
resclasses[resclassname] = factory.get_resclass(resclassname)
|
|
525
|
-
resiri_lookup: StrDict = {}
|
|
526
|
-
|
|
527
|
-
for resource in resources:
|
|
528
|
-
#resource.print()
|
|
529
|
-
if resource.bitstream:
|
|
530
|
-
img = sipi.upload_bitstream(os.path.join(imgdir, resource.bitstream))
|
|
531
|
-
bitstream = img['uploadedFiles'][0]['internalFilename']
|
|
532
|
-
else:
|
|
533
|
-
bitstream = None
|
|
534
|
-
instance = resclasses[resource.restype](con=con,
|
|
535
|
-
label=resource.label,
|
|
536
|
-
permissions=permissions_lookup.get(resource.permissions),
|
|
537
|
-
bitstream=bitstream,
|
|
538
|
-
values=resource.get_propvals(resiri_lookup, permissions_lookup)).create()
|
|
539
|
-
resiri_lookup[resource.id] = instance.iri
|
|
540
|
-
print("Created:", instance.iri)
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
from typing import Any, Union, List, Set, Dict, Tuple, Optional, Callable, TypedDict
|
|
2
|
-
|
|
3
|
-
import wx
|
|
4
|
-
|
|
5
|
-
class DoublePasswordCtrl(wx.Control):
|
|
6
|
-
|
|
7
|
-
def __init__(self,
|
|
8
|
-
parent: wx.Window,
|
|
9
|
-
id: int = wx.ID_ANY,
|
|
10
|
-
pos: wx.Point = wx.DefaultPosition,
|
|
11
|
-
size: wx.Size = wx.DefaultSize,
|
|
12
|
-
style: int = wx.NO_BORDER,
|
|
13
|
-
validator: wx.Validator = wx.DefaultValidator,
|
|
14
|
-
name: str = "DoublePassword",
|
|
15
|
-
value: str = ""):
|
|
16
|
-
super().__init__(parent=parent,
|
|
17
|
-
id=id,
|
|
18
|
-
pos=pos,
|
|
19
|
-
size=size,
|
|
20
|
-
style=style,
|
|
21
|
-
validator=validator,
|
|
22
|
-
name=name)
|
|
23
|
-
|
|
24
|
-
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
25
|
-
halfheight = size.GetHeight()
|
|
26
|
-
if halfheight > 0:
|
|
27
|
-
halfheight = halfheight / 2
|
|
28
|
-
self.password1 = wx.TextCtrl(parent=self,
|
|
29
|
-
name=name + '1',
|
|
30
|
-
value=value if value is not None else "",
|
|
31
|
-
size=wx.Size(size.GetWidth(), halfheight),
|
|
32
|
-
style=style | wx.TE_PASSWORD)
|
|
33
|
-
self.password1.Bind(wx.EVT_TEXT, self.text1_changed)
|
|
34
|
-
sizer.Add(self.password1)
|
|
35
|
-
|
|
36
|
-
self.password2 = wx.TextCtrl(parent=self,
|
|
37
|
-
name=name + '2',
|
|
38
|
-
value=value if value is not None else "",
|
|
39
|
-
size=wx.Size(size.GetWidth(), halfheight),
|
|
40
|
-
style=style | wx.TE_PASSWORD)
|
|
41
|
-
self.password2.Bind(wx.EVT_TEXT, self.text2_changed)
|
|
42
|
-
sizer.Add(self.password2)
|
|
43
|
-
self.SetSizerAndFit(sizer)
|
|
44
|
-
|
|
45
|
-
def text1_changed(self, event: wx.CommandEvent) -> None:
|
|
46
|
-
self.text_changed()
|
|
47
|
-
event.Skip()
|
|
48
|
-
|
|
49
|
-
def text2_changed(self, event: wx.CommandEvent) -> None:
|
|
50
|
-
self.text_changed()
|
|
51
|
-
event.Skip()
|
|
52
|
-
|
|
53
|
-
def text_changed(self) -> None:
|
|
54
|
-
event = wx.PyCommandEvent(wx.EVT_TEXT.typeId, self.GetId())
|
|
55
|
-
self.GetEventHandler().ProcessEvent(event)
|
|
56
|
-
|
|
57
|
-
def GetValue(self) -> Union[str, None]:
|
|
58
|
-
if self.password1.GetValue() == self.password2.GetValue():
|
|
59
|
-
return self.password1.GetValue()
|
|
60
|
-
else:
|
|
61
|
-
return None
|
|
62
|
-
|
|
63
|
-
def SetValue(self, value: str) -> None:
|
|
64
|
-
self.password1.SetValue(value)
|
|
65
|
-
self.password2.SetValue(value)
|
|
66
|
-
|
|
67
|
-
def SetBackgroundColour(self, color):
|
|
68
|
-
self.password1.SetBackgroundColour(color)
|
|
69
|
-
self.password2.SetBackgroundColour(color)
|
|
70
|
-
|
|
71
|
-
def SetFocus(self):
|
|
72
|
-
self.password1.SetFocus()
|
|
73
|
-
|
|
74
|
-
def Refresh(self):
|
|
75
|
-
self.password1.Refresh()
|
|
76
|
-
self.password2.Refresh()
|
|
77
|
-
|
|
78
|
-
def SetValidator(self, validator: wx.Validator = wx.DefaultValidator):
|
|
79
|
-
self.password1.SetValidator(validator)
|
|
80
|
-
self.password2.SetValidator(validator)
|