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,438 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module implements the handling (CRUD) of DSP users.
|
|
3
|
+
|
|
4
|
+
CREATE:
|
|
5
|
+
* Instantiate a new object of the class User with all required parameters
|
|
6
|
+
* Call the ``create``-method on the instance to create the new user
|
|
7
|
+
|
|
8
|
+
READ:
|
|
9
|
+
* Instantiate a new objects with ``iri`` given
|
|
10
|
+
* Call the ``read``-method on the instance
|
|
11
|
+
* Access the information that has been ptovided to the instance
|
|
12
|
+
|
|
13
|
+
In addition there is a static methods ``getAllProjects`` which returns a list of all projects
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import urllib.parse
|
|
19
|
+
from typing import Any
|
|
20
|
+
from typing import Optional
|
|
21
|
+
from typing import Union
|
|
22
|
+
from urllib.parse import quote_plus
|
|
23
|
+
|
|
24
|
+
from dsp_tools.clients.connection import Connection
|
|
25
|
+
from dsp_tools.commands.get.legacy_models.group import Group
|
|
26
|
+
from dsp_tools.commands.get.legacy_models.model import Model
|
|
27
|
+
from dsp_tools.error.exceptions import BaseError
|
|
28
|
+
from dsp_tools.legacy_models.langstring import Languages
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class User(Model):
|
|
32
|
+
"""
|
|
33
|
+
This class represents a user in DSP.
|
|
34
|
+
|
|
35
|
+
Attributes
|
|
36
|
+
----------
|
|
37
|
+
|
|
38
|
+
iri : str
|
|
39
|
+
IRI of the user [readonly, cannot be modified after creation of instance]
|
|
40
|
+
|
|
41
|
+
username : str
|
|
42
|
+
Unique identifier (not an IRI) of the user [read/write]
|
|
43
|
+
|
|
44
|
+
email : str
|
|
45
|
+
Email of the user [read/write]
|
|
46
|
+
|
|
47
|
+
givenName : str
|
|
48
|
+
Given name (firstname) of the user [read/write]
|
|
49
|
+
|
|
50
|
+
familyName : str
|
|
51
|
+
Family name of user (lastname) [read/write]
|
|
52
|
+
|
|
53
|
+
password : str
|
|
54
|
+
Password of user [write only]
|
|
55
|
+
|
|
56
|
+
lang : Language
|
|
57
|
+
Preferred language of the user. For setting can be Language instance or string "EN", "DE", "FR", "IT"
|
|
58
|
+
|
|
59
|
+
status : bool
|
|
60
|
+
Status of the user, If active, is set to True, otherwise false [read/write]
|
|
61
|
+
|
|
62
|
+
in_groups : set[str]
|
|
63
|
+
Set of group IRI's the user is member of [readonly].
|
|
64
|
+
|
|
65
|
+
in_projects : set[str]
|
|
66
|
+
Set of project IRI's the user belongs to
|
|
67
|
+
Use ``addToproject``and ``rmFromproject`` to modify project membership
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
Methods
|
|
71
|
+
-------
|
|
72
|
+
|
|
73
|
+
create : DSP user information object
|
|
74
|
+
Creates a new user and returns the information about this user as it is in DSP
|
|
75
|
+
|
|
76
|
+
read : DSP user information object
|
|
77
|
+
Read user data
|
|
78
|
+
|
|
79
|
+
getAllUsers : list of user
|
|
80
|
+
Get a list of all users
|
|
81
|
+
|
|
82
|
+
print : None
|
|
83
|
+
Prints the user information to stdout
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
ROUTE: str = "/admin/users"
|
|
89
|
+
IRI: str = ROUTE + "/iri/"
|
|
90
|
+
PROJECT_MEMBERSHIPS: str = "/project-memberships/"
|
|
91
|
+
PROJECT_ADMIN_MEMBERSHIPS: str = "/project-admin-memberships/"
|
|
92
|
+
GROUP_MEMBERSHIPS: str = "/group-memberships/"
|
|
93
|
+
|
|
94
|
+
_iri: str
|
|
95
|
+
_username: str
|
|
96
|
+
_email: str
|
|
97
|
+
_givenName: str
|
|
98
|
+
_familyName: str
|
|
99
|
+
_password: str
|
|
100
|
+
_lang: Languages
|
|
101
|
+
_status: bool
|
|
102
|
+
_in_groups: set[str]
|
|
103
|
+
_in_projects: dict[str, bool]
|
|
104
|
+
_add_to_project: dict[str, bool]
|
|
105
|
+
_rm_from_project: dict[str, bool]
|
|
106
|
+
_add_to_group: set[str]
|
|
107
|
+
_rm_from_group: set[str]
|
|
108
|
+
_change_admin: dict[str, bool]
|
|
109
|
+
|
|
110
|
+
def __init__(
|
|
111
|
+
self,
|
|
112
|
+
con: Connection,
|
|
113
|
+
iri: Optional[str] = None,
|
|
114
|
+
username: Optional[str] = None,
|
|
115
|
+
email: Optional[str] = None,
|
|
116
|
+
givenName: Optional[str] = None,
|
|
117
|
+
familyName: Optional[str] = None,
|
|
118
|
+
password: Optional[str] = None,
|
|
119
|
+
lang: Optional[Union[str, Languages]] = None,
|
|
120
|
+
status: Optional[bool] = None,
|
|
121
|
+
in_projects: Optional[dict[str, bool]] = None,
|
|
122
|
+
in_groups: Optional[set[str]] = None,
|
|
123
|
+
):
|
|
124
|
+
"""
|
|
125
|
+
Constructor for User
|
|
126
|
+
|
|
127
|
+
The constructor is user internally or externally, when a new user should be created in DSP.
|
|
128
|
+
|
|
129
|
+
:param con: Connection instance [required]
|
|
130
|
+
:param iri: IRI of the user [required for CREATE, READ]
|
|
131
|
+
:param username: Username [required for CREATE]
|
|
132
|
+
:param email: Email address [required for CREATE]
|
|
133
|
+
:param givenName: Given name (firstname) of user [required for CREATE]
|
|
134
|
+
:param familyName: Family name (lastname) of user [required for CREATE]
|
|
135
|
+
:param password: Password [required for CREATE]
|
|
136
|
+
:param lang: Preferred language of the user [optional]
|
|
137
|
+
:param status: Status (active = True, inactive/deleted = False) [optional]
|
|
138
|
+
:param in_projects: Dict with project-IRI as key, boolean(True=project admin) as value [optional]
|
|
139
|
+
:param in_groups: Set with group-IRI's the user should belong to [optional]
|
|
140
|
+
"""
|
|
141
|
+
super().__init__(con)
|
|
142
|
+
self._iri = iri
|
|
143
|
+
self._username = str(username) if username is not None else None
|
|
144
|
+
self._email = str(email) if email is not None else None
|
|
145
|
+
self._givenName = str(givenName) if givenName is not None else None
|
|
146
|
+
self._familyName = str(familyName) if familyName is not None else None
|
|
147
|
+
self._password = str(password) if password is not None else None
|
|
148
|
+
if lang is not None:
|
|
149
|
+
if isinstance(lang, Languages):
|
|
150
|
+
self._lang = lang
|
|
151
|
+
else:
|
|
152
|
+
lmap = {a.value: a for a in Languages}
|
|
153
|
+
if lmap.get(lang) is None:
|
|
154
|
+
raise BaseError('Invalid language string "' + lang + '"!')
|
|
155
|
+
self._lang = lmap[lang]
|
|
156
|
+
else:
|
|
157
|
+
self._lang = None
|
|
158
|
+
self._status = None if status is None else bool(status)
|
|
159
|
+
|
|
160
|
+
if in_projects is None or isinstance(in_projects, dict):
|
|
161
|
+
self._in_projects = in_projects if in_projects is not None else {}
|
|
162
|
+
else:
|
|
163
|
+
raise BaseError("In_project must be tuple (project-iri: str, is-admin: bool)!")
|
|
164
|
+
|
|
165
|
+
if in_groups is None or isinstance(in_groups, set):
|
|
166
|
+
self._in_groups = in_groups if in_groups is not None else set()
|
|
167
|
+
else:
|
|
168
|
+
raise BaseError("In_groups must be a set of strings or None!")
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def iri(self) -> Optional[str]:
|
|
172
|
+
"""IRI of this user"""
|
|
173
|
+
return self._iri
|
|
174
|
+
|
|
175
|
+
@property
|
|
176
|
+
def username(self) -> Optional[str]:
|
|
177
|
+
"""Username of this user"""
|
|
178
|
+
return self._username
|
|
179
|
+
|
|
180
|
+
@username.setter
|
|
181
|
+
def username(self, value: Optional[str]) -> None:
|
|
182
|
+
if value is None:
|
|
183
|
+
return
|
|
184
|
+
self._username = str(value)
|
|
185
|
+
self._changed.add("username")
|
|
186
|
+
|
|
187
|
+
@property
|
|
188
|
+
def email(self) -> Optional[str]:
|
|
189
|
+
"""Email address of this user"""
|
|
190
|
+
return self._email
|
|
191
|
+
|
|
192
|
+
@email.setter
|
|
193
|
+
def email(self, value: Optional[str]) -> None:
|
|
194
|
+
if value is None:
|
|
195
|
+
return
|
|
196
|
+
self._email = str(value)
|
|
197
|
+
self._changed.add("email")
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def password(self) -> Optional[str]:
|
|
201
|
+
"""Password of this user"""
|
|
202
|
+
return self._password
|
|
203
|
+
|
|
204
|
+
@password.setter
|
|
205
|
+
def password(self, value: Optional[str]) -> None:
|
|
206
|
+
if value is None:
|
|
207
|
+
return
|
|
208
|
+
self._password = value
|
|
209
|
+
self._changed.add("password")
|
|
210
|
+
|
|
211
|
+
@property
|
|
212
|
+
def givenName(self) -> Optional[str]:
|
|
213
|
+
"""Given name (firstname) of this user"""
|
|
214
|
+
return self._givenName
|
|
215
|
+
|
|
216
|
+
@givenName.setter
|
|
217
|
+
def givenName(self, value: Optional[str]) -> None:
|
|
218
|
+
if value is None:
|
|
219
|
+
return
|
|
220
|
+
self._givenName = str(value)
|
|
221
|
+
self._changed.add("givenName")
|
|
222
|
+
|
|
223
|
+
@property
|
|
224
|
+
def familyName(self) -> Optional[str]:
|
|
225
|
+
"""Family name (lastname) of this user"""
|
|
226
|
+
return self._familyName
|
|
227
|
+
|
|
228
|
+
@familyName.setter
|
|
229
|
+
def familyName(self, value: Optional[str]) -> None:
|
|
230
|
+
if value is None:
|
|
231
|
+
return
|
|
232
|
+
self._familyName = str(value)
|
|
233
|
+
self._changed.add("familyName")
|
|
234
|
+
|
|
235
|
+
@property
|
|
236
|
+
def lang(self) -> Optional[Languages]:
|
|
237
|
+
"""Language of this user"""
|
|
238
|
+
return self._lang
|
|
239
|
+
|
|
240
|
+
@lang.setter
|
|
241
|
+
def lang(self, value: Optional[Union[str, Languages]]) -> None:
|
|
242
|
+
if value is None:
|
|
243
|
+
return
|
|
244
|
+
if isinstance(value, Languages):
|
|
245
|
+
self._lang = value
|
|
246
|
+
self._changed.add("lang")
|
|
247
|
+
else:
|
|
248
|
+
lmap = {a.value: a for a in Languages}
|
|
249
|
+
if lmap.get(value) is None:
|
|
250
|
+
raise BaseError('Invalid language string "' + value + '"!')
|
|
251
|
+
self._lang = lmap[value]
|
|
252
|
+
self._changed.add("lang")
|
|
253
|
+
|
|
254
|
+
@property
|
|
255
|
+
def status(self) -> bool:
|
|
256
|
+
"""Status of this user (True=active, False=inactive)"""
|
|
257
|
+
return self._status
|
|
258
|
+
|
|
259
|
+
@status.setter
|
|
260
|
+
def status(self, value: Optional[bool]) -> None:
|
|
261
|
+
self._status = None if value is None else bool(value)
|
|
262
|
+
if value is not None:
|
|
263
|
+
self._changed.add("status")
|
|
264
|
+
|
|
265
|
+
@property
|
|
266
|
+
def in_groups(self) -> set[str]:
|
|
267
|
+
"""Set of group IRI's the user is member of"""
|
|
268
|
+
return self._in_groups
|
|
269
|
+
|
|
270
|
+
@property
|
|
271
|
+
def in_projects(self) -> dict[str, bool]:
|
|
272
|
+
"""dict with project-IRI as key, boolean(True=project admin) as value"""
|
|
273
|
+
return self._in_projects
|
|
274
|
+
|
|
275
|
+
@classmethod
|
|
276
|
+
def _make_fromJsonObj(cls, con: Connection, json_obj: dict[str, Any]) -> User:
|
|
277
|
+
User._check_if_jsonObj_has_required_info(json_obj)
|
|
278
|
+
|
|
279
|
+
in_groups, in_projects = cls._update_permissions_and_groups(json_obj)
|
|
280
|
+
|
|
281
|
+
return cls(
|
|
282
|
+
con=con,
|
|
283
|
+
iri=json_obj["id"],
|
|
284
|
+
username=json_obj["username"],
|
|
285
|
+
email=json_obj["email"],
|
|
286
|
+
givenName=json_obj.get("givenName"),
|
|
287
|
+
familyName=json_obj.get("familyName"),
|
|
288
|
+
lang=json_obj.get("lang"),
|
|
289
|
+
status=json_obj["status"],
|
|
290
|
+
in_projects=in_projects,
|
|
291
|
+
in_groups=in_groups,
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
@staticmethod
|
|
295
|
+
def _check_if_jsonObj_has_required_info(json_obj: dict[str, Any]) -> None:
|
|
296
|
+
problems = []
|
|
297
|
+
if json_obj.get("id") is None:
|
|
298
|
+
problems.append('User "iri" is missing in JSON from DSP')
|
|
299
|
+
|
|
300
|
+
if json_obj.get("email") is None:
|
|
301
|
+
problems.append('User "email" is missing in JSON from DSP')
|
|
302
|
+
|
|
303
|
+
if json_obj.get("username") is None:
|
|
304
|
+
problems.append('User "email" is missing in JSON from DSP')
|
|
305
|
+
|
|
306
|
+
if json_obj.get("status") is None:
|
|
307
|
+
problems.append('User "email" is missing in JSON from DSP')
|
|
308
|
+
|
|
309
|
+
if problems:
|
|
310
|
+
raise BaseError("\n".join(problems))
|
|
311
|
+
|
|
312
|
+
@classmethod
|
|
313
|
+
def _update_permissions_and_groups(cls, json_obj: dict[str, Any]) -> tuple[set[str], dict[str, bool]]:
|
|
314
|
+
in_projects: dict[str, bool] = {}
|
|
315
|
+
in_groups: set[str] = set()
|
|
316
|
+
if json_obj.get("permissions") is not None and json_obj["permissions"].get("groupsPerProject") is not None:
|
|
317
|
+
for project_iri, group_memberships in json_obj["permissions"]["groupsPerProject"].items():
|
|
318
|
+
for group in group_memberships:
|
|
319
|
+
if group == Group.PROJECT_MEMBER_GROUP:
|
|
320
|
+
if in_projects.get(project_iri) is None:
|
|
321
|
+
in_projects[project_iri] = False
|
|
322
|
+
elif group == Group.PROJECT_ADMIN_GROUP:
|
|
323
|
+
in_projects[project_iri] = True
|
|
324
|
+
else:
|
|
325
|
+
in_groups.add(group)
|
|
326
|
+
return in_groups, in_projects
|
|
327
|
+
return in_groups, in_projects
|
|
328
|
+
|
|
329
|
+
def create(self) -> User:
|
|
330
|
+
"""
|
|
331
|
+
Create new user in DSP
|
|
332
|
+
|
|
333
|
+
:return: JSON-object from DSP
|
|
334
|
+
"""
|
|
335
|
+
jsonobj = self._toJosonObj_create()
|
|
336
|
+
result = self._con.post(User.ROUTE, jsonobj)
|
|
337
|
+
iri = result["user"]["id"]
|
|
338
|
+
if self._in_projects is not None:
|
|
339
|
+
for project in self._in_projects:
|
|
340
|
+
result = self._con.post(User.IRI + quote_plus(iri) + User.PROJECT_MEMBERSHIPS + quote_plus(project))
|
|
341
|
+
if self._in_projects[project]:
|
|
342
|
+
result = self._con.post(
|
|
343
|
+
User.IRI + quote_plus(iri) + User.PROJECT_ADMIN_MEMBERSHIPS + quote_plus(project)
|
|
344
|
+
)
|
|
345
|
+
if self._in_groups is not None:
|
|
346
|
+
for group in self._in_groups:
|
|
347
|
+
result = self._con.post(User.IRI + quote_plus(iri) + User.GROUP_MEMBERSHIPS + quote_plus(group))
|
|
348
|
+
return User._make_fromJsonObj(self._con, result["user"])
|
|
349
|
+
|
|
350
|
+
def _toJosonObj_create(self):
|
|
351
|
+
tmp = {}
|
|
352
|
+
if self._username is None:
|
|
353
|
+
raise BaseError("There must be a valid username!")
|
|
354
|
+
tmp["username"] = self._username
|
|
355
|
+
if self._email is None:
|
|
356
|
+
raise BaseError("'email' is mandatory!")
|
|
357
|
+
tmp["email"] = self._email
|
|
358
|
+
if self._givenName is None:
|
|
359
|
+
raise BaseError("'givenName is mandatory!")
|
|
360
|
+
tmp["givenName"] = self._givenName
|
|
361
|
+
if self._familyName is None:
|
|
362
|
+
raise BaseError("'familyName' is mandatory!")
|
|
363
|
+
tmp["familyName"] = self._familyName
|
|
364
|
+
if self._password is None:
|
|
365
|
+
raise BaseError("'password' is mandatory!")
|
|
366
|
+
tmp["password"] = self._password
|
|
367
|
+
if self._lang is None:
|
|
368
|
+
raise BaseError("'language' is mandatory!")
|
|
369
|
+
tmp["lang"] = self._lang.value
|
|
370
|
+
tmp["status"] = True if self._status is None else self._status
|
|
371
|
+
# the API expects the key "systemAdmin" to be present. DSP-TOOLS doesn't support creating SystemAdmins any more.
|
|
372
|
+
tmp["systemAdmin"] = False
|
|
373
|
+
return tmp
|
|
374
|
+
|
|
375
|
+
def read(self) -> User:
|
|
376
|
+
"""
|
|
377
|
+
Read the user information from DSP. The User object must have a valid iri or email!
|
|
378
|
+
|
|
379
|
+
:return: JSON-object from DSP
|
|
380
|
+
"""
|
|
381
|
+
if self._iri is not None:
|
|
382
|
+
result = self._con.get(User.IRI + quote_plus(self._iri))
|
|
383
|
+
elif self._email is not None:
|
|
384
|
+
result = self._con.get(User.ROUTE + "/email/" + quote_plus(self._email))
|
|
385
|
+
elif self._username is not None:
|
|
386
|
+
result = self._con.get(User.ROUTE + "/username/" + quote_plus(self._username))
|
|
387
|
+
else:
|
|
388
|
+
raise BaseError("Either user-iri or email is required!")
|
|
389
|
+
return User._make_fromJsonObj(self._con, result["user"])
|
|
390
|
+
|
|
391
|
+
@staticmethod
|
|
392
|
+
def getAllUsersForProject(con: Connection, proj_shortcode: str) -> Optional[list[User]]:
|
|
393
|
+
"""
|
|
394
|
+
Get a list of all users that belong to a project (static method)
|
|
395
|
+
|
|
396
|
+
:param con: Connection instance
|
|
397
|
+
:project_shortcode: Shortcode of the project
|
|
398
|
+
:return: List of users belonging to that project
|
|
399
|
+
"""
|
|
400
|
+
members = con.get(f"/admin/projects/shortcode/{proj_shortcode}/members")
|
|
401
|
+
if members is None or len(members) < 1:
|
|
402
|
+
return None
|
|
403
|
+
res: list[User] = [User._make_fromJsonObj(con, a) for a in members["members"]]
|
|
404
|
+
res.reverse()
|
|
405
|
+
return res
|
|
406
|
+
|
|
407
|
+
def createDefinitionFileObj(
|
|
408
|
+
self,
|
|
409
|
+
con: Connection,
|
|
410
|
+
proj_shortname: str,
|
|
411
|
+
proj_iri: str,
|
|
412
|
+
) -> dict[str, Union[str, list[str], bool, None]]:
|
|
413
|
+
"""Create a JSON object that can be used to create a project definition file"""
|
|
414
|
+
user: dict[str, Union[str, list[str], bool, None]] = {
|
|
415
|
+
"username": self.username,
|
|
416
|
+
"email": self._email,
|
|
417
|
+
"givenName": self._givenName,
|
|
418
|
+
"familyName": self._familyName,
|
|
419
|
+
"password": "",
|
|
420
|
+
}
|
|
421
|
+
if self._lang:
|
|
422
|
+
user["lang"] = self._lang.value
|
|
423
|
+
groups = list()
|
|
424
|
+
for group_iri in self._in_groups:
|
|
425
|
+
group_info = con.get(f"/admin/groups/{urllib.parse.quote_plus(group_iri)}")
|
|
426
|
+
if "group" in group_info and "name" in group_info["group"]:
|
|
427
|
+
groupname = group_info["group"]["name"]
|
|
428
|
+
groups.append(f"{proj_shortname}:{groupname}")
|
|
429
|
+
user["groups"] = groups
|
|
430
|
+
user["projects"] = list()
|
|
431
|
+
for proj, is_admin in self._in_projects.items():
|
|
432
|
+
if proj == proj_iri:
|
|
433
|
+
if is_admin:
|
|
434
|
+
user["projects"].append(f"{proj_shortname}:admin")
|
|
435
|
+
else:
|
|
436
|
+
user["projects"].append(f"{proj_shortname}:member")
|
|
437
|
+
user["status"] = self._status
|
|
438
|
+
return user
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@dataclass
|
|
6
|
+
class DoapCategories:
|
|
7
|
+
class_doaps: list[dict[str, Any]]
|
|
8
|
+
prop_doaps: list[dict[str, Any]]
|
|
9
|
+
has_img_all_classes_doaps: list[dict[str, Any]]
|
|
10
|
+
has_img_specific_class_doaps: list[dict[str, Any]]
|