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
dsplib/models/user.py
DELETED
|
@@ -1,731 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import sys
|
|
3
|
-
import json
|
|
4
|
-
from pystrict import strict
|
|
5
|
-
from typing import List, Set, Dict, Tuple, Optional, Any, Union, NewType
|
|
6
|
-
from urllib.parse import quote_plus
|
|
7
|
-
|
|
8
|
-
path = os.path.abspath(os.path.dirname(__file__))
|
|
9
|
-
(head, tail) = os.path.split(path)
|
|
10
|
-
if not head in sys.path:
|
|
11
|
-
sys.path.insert(0, head)
|
|
12
|
-
if not path in sys.path:
|
|
13
|
-
sys.path.insert(0, path)
|
|
14
|
-
|
|
15
|
-
from .helpers import Actions, BaseError
|
|
16
|
-
from .langstring import Languages
|
|
17
|
-
from .connection import Connection
|
|
18
|
-
from .model import Model
|
|
19
|
-
from .group import Group
|
|
20
|
-
from .project import Project
|
|
21
|
-
|
|
22
|
-
"""
|
|
23
|
-
This module implements the handling (CRUD) of Knora users.
|
|
24
|
-
|
|
25
|
-
CREATE:
|
|
26
|
-
* Instantiate a new object of the class User with all required parameters
|
|
27
|
-
* Call the ``create``-method on the instance to create the new user
|
|
28
|
-
|
|
29
|
-
READ:
|
|
30
|
-
* Instantiate a new objects with ``id``(IRI of user) given
|
|
31
|
-
* Call the ``read``-method on the instance
|
|
32
|
-
* Access the information that has been ptovided to the instance
|
|
33
|
-
|
|
34
|
-
UPDATE:
|
|
35
|
-
* You need an instance of an existing User by reading an instance
|
|
36
|
-
* Change the attributes by assigning the new values
|
|
37
|
-
* Call the ``update```method on the instance
|
|
38
|
-
|
|
39
|
-
DELETE
|
|
40
|
-
* Instantiate a new objects with ``id``(IRI of user) given, or use any instance that has the id set
|
|
41
|
-
* Call the ``delete``-method on the instance
|
|
42
|
-
|
|
43
|
-
In addition there is a static methods ``getAllProjects`` which returns a list of all projects
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
@strict
|
|
47
|
-
class User(Model):
|
|
48
|
-
"""
|
|
49
|
-
This class represents a user in Knora.
|
|
50
|
-
|
|
51
|
-
Attributes
|
|
52
|
-
----------
|
|
53
|
-
|
|
54
|
-
id : str
|
|
55
|
-
IRI of the user [readonly, cannot be modified after creation of instance]
|
|
56
|
-
|
|
57
|
-
username : str
|
|
58
|
-
Unique identifier (not an IRI) of the user [read/write]
|
|
59
|
-
|
|
60
|
-
email : str
|
|
61
|
-
Email of the user [read/write]
|
|
62
|
-
|
|
63
|
-
givenName : str
|
|
64
|
-
Given name (firstname) of the user [read/write]
|
|
65
|
-
|
|
66
|
-
familyName : str
|
|
67
|
-
Family name of user (lastname) [read/write]
|
|
68
|
-
|
|
69
|
-
password : str
|
|
70
|
-
Password of user [write only]
|
|
71
|
-
|
|
72
|
-
lang : Language
|
|
73
|
-
Preferred language of the user. For setting can be Language instance or string "EN", "DE", "FR", "IT"
|
|
74
|
-
|
|
75
|
-
status : bool
|
|
76
|
-
Status of the user, If active, is set to True, otherwise false [read/write]
|
|
77
|
-
|
|
78
|
-
sysadmin : bool
|
|
79
|
-
True, if user is system administrator [read/write]
|
|
80
|
-
|
|
81
|
-
in_groups : Set[str]
|
|
82
|
-
Set of group IRI's the user is member of [readonly].
|
|
83
|
-
Use ``addToGroup``and ``rmFromGroup`` to modify group membership
|
|
84
|
-
|
|
85
|
-
in_projects : Set[str]
|
|
86
|
-
Set of project IRI's the user belongs to
|
|
87
|
-
Use ``addToproject``and ``rmFromproject`` to modify project membership
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
Methods
|
|
91
|
-
-------
|
|
92
|
-
|
|
93
|
-
create : Knora user information object
|
|
94
|
-
Creates a new user and returns the information about this user as it is in Knora
|
|
95
|
-
|
|
96
|
-
read : Knora user information object
|
|
97
|
-
Read user data
|
|
98
|
-
|
|
99
|
-
update : Knora user information object
|
|
100
|
-
Updates the changed attributes of a user and returns the updated information as it is in Knora
|
|
101
|
-
|
|
102
|
-
delete : Knora result code
|
|
103
|
-
Deletes a user and returns the result code
|
|
104
|
-
|
|
105
|
-
addToGroup : None
|
|
106
|
-
Add the user to the given group (will be executed when calling ``update``)
|
|
107
|
-
|
|
108
|
-
rmFromGroup : None
|
|
109
|
-
Remove a user from a group (will be executed when calling ``update``)
|
|
110
|
-
|
|
111
|
-
addToProject : None
|
|
112
|
-
adds a user to a project, optional as project administrator (will be executed when calling ``update``)
|
|
113
|
-
|
|
114
|
-
rmFromProject : None
|
|
115
|
-
removes a user from a project (will be executed when calling ``update``)
|
|
116
|
-
|
|
117
|
-
makeProjectAdmin : None
|
|
118
|
-
Promote user to project admin of given project
|
|
119
|
-
|
|
120
|
-
unmakeProjectAdmin : None
|
|
121
|
-
Revoke project admin flog for user for given project
|
|
122
|
-
|
|
123
|
-
getAllUsers : list of user
|
|
124
|
-
Get a list of all users
|
|
125
|
-
|
|
126
|
-
print : None
|
|
127
|
-
Prints the user information to stdout
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
"""
|
|
131
|
-
|
|
132
|
-
_id: str
|
|
133
|
-
_username: str
|
|
134
|
-
_email: str
|
|
135
|
-
_givenName: str
|
|
136
|
-
_familyName: str
|
|
137
|
-
_password: str
|
|
138
|
-
_lang: Languages
|
|
139
|
-
_status: bool
|
|
140
|
-
_sysadmin: bool
|
|
141
|
-
_in_groups: Set[str]
|
|
142
|
-
_in_projects: Dict[str, bool]
|
|
143
|
-
_add_to_project: Dict[str, bool]
|
|
144
|
-
_rm_from_project: Dict[str, bool]
|
|
145
|
-
_add_to_group: Set[str]
|
|
146
|
-
_rm_from_group: Set[str]
|
|
147
|
-
_change_admin: Set[str]
|
|
148
|
-
|
|
149
|
-
def __init__(self,
|
|
150
|
-
con: Connection,
|
|
151
|
-
id: Optional[str] = None,
|
|
152
|
-
username: Optional[str] = None,
|
|
153
|
-
email: Optional[str] = None,
|
|
154
|
-
givenName: Optional[str] = None,
|
|
155
|
-
familyName: Optional[str] = None,
|
|
156
|
-
password: Optional[str] = None,
|
|
157
|
-
lang: Optional[Union[str,Languages]] = None,
|
|
158
|
-
status: Optional[bool] = None,
|
|
159
|
-
sysadmin: Optional[bool] = None,
|
|
160
|
-
in_projects: Optional[Dict[str, bool]] = None,
|
|
161
|
-
in_groups: Optional[Set[str]] = None):
|
|
162
|
-
"""
|
|
163
|
-
Constructor for User
|
|
164
|
-
|
|
165
|
-
The constructor is user internally or externally, when a new user should be created in Knora.
|
|
166
|
-
|
|
167
|
-
:param con: Connection instance [required]
|
|
168
|
-
:param id: IRI of the user [required for CREATE, READ]
|
|
169
|
-
:param username: Username [required for CREATE]
|
|
170
|
-
:param email: Email address [required for CREATE]
|
|
171
|
-
:param givenName: Given name (firstname) of user [required for CREATE]
|
|
172
|
-
:param familyName: Family name (lastname) of user [required for CREATE]
|
|
173
|
-
:param password: Password [required for CREATE]
|
|
174
|
-
:param lang: Preferred language of the user [optional]
|
|
175
|
-
:param status: Status (active = True, inactive/deleted = False) [optional]
|
|
176
|
-
:param sysadmin: User has system administration privileges [optional]
|
|
177
|
-
:param in_projects: Dict with project-IRI as key, boolean(True=project admin) as value [optional]
|
|
178
|
-
:param in_groups: Set with group-IRI's the user should belong to [optional]
|
|
179
|
-
"""
|
|
180
|
-
super().__init__(con)
|
|
181
|
-
self._id = str(id) if id is not None else None
|
|
182
|
-
self._username = str(username) if username is not None else None
|
|
183
|
-
self._email = str(email) if email is not None else None
|
|
184
|
-
self._givenName = str(givenName) if givenName is not None else None
|
|
185
|
-
self._familyName = str(familyName) if familyName is not None else None
|
|
186
|
-
self._password = str(password) if password is not None else None
|
|
187
|
-
if lang is not None:
|
|
188
|
-
if isinstance(lang, Languages):
|
|
189
|
-
self._lang = lang
|
|
190
|
-
else:
|
|
191
|
-
lmap = dict(map(lambda a: (a.value, a), Languages))
|
|
192
|
-
if lmap.get(lang) is None:
|
|
193
|
-
raise BaseError('Invalid language string "' + lang + '"!')
|
|
194
|
-
self._lang = lmap[lang]
|
|
195
|
-
else:
|
|
196
|
-
self._lang = None
|
|
197
|
-
self._status = None if status is None else bool(status)
|
|
198
|
-
|
|
199
|
-
if in_projects is None or isinstance(in_projects, dict):
|
|
200
|
-
self._in_projects = in_projects if in_projects is not None else {}
|
|
201
|
-
else:
|
|
202
|
-
raise BaseError("In_project must be tuple (project-iri: str, is-admin: bool)!")
|
|
203
|
-
|
|
204
|
-
if in_groups is None or isinstance(in_groups, set):
|
|
205
|
-
self._in_groups = in_groups if in_groups is not None else set()
|
|
206
|
-
else:
|
|
207
|
-
raise BaseError('In_groups must be a set of strings or None!')
|
|
208
|
-
|
|
209
|
-
self._sysadmin = None if sysadmin is None else bool(sysadmin)
|
|
210
|
-
self._add_to_project = {}
|
|
211
|
-
self._rm_from_project = {}
|
|
212
|
-
self._change_admin = {}
|
|
213
|
-
self._add_to_group = set()
|
|
214
|
-
self._rm_from_group = set()
|
|
215
|
-
|
|
216
|
-
@property
|
|
217
|
-
def id(self) -> Optional[str]:
|
|
218
|
-
return self._id
|
|
219
|
-
|
|
220
|
-
@id.setter
|
|
221
|
-
def id(self, value: str) -> None:
|
|
222
|
-
raise BaseError('User id cannot be modified!')
|
|
223
|
-
|
|
224
|
-
@property
|
|
225
|
-
def username(self) -> Optional[str]:
|
|
226
|
-
return self._username
|
|
227
|
-
|
|
228
|
-
@username.setter
|
|
229
|
-
def username(self, value: Optional[str]):
|
|
230
|
-
if value is None:
|
|
231
|
-
return
|
|
232
|
-
self._username = str(value)
|
|
233
|
-
self._changed.add('username')
|
|
234
|
-
|
|
235
|
-
@property
|
|
236
|
-
def email(self) -> Optional[str]:
|
|
237
|
-
return self._email
|
|
238
|
-
|
|
239
|
-
@email.setter
|
|
240
|
-
def email(self, value: Optional[str]):
|
|
241
|
-
if value is None:
|
|
242
|
-
return
|
|
243
|
-
self._email = str(value)
|
|
244
|
-
self._changed.add('email')
|
|
245
|
-
|
|
246
|
-
@property
|
|
247
|
-
def givenName(self) -> Optional[str]:
|
|
248
|
-
return self._givenName
|
|
249
|
-
|
|
250
|
-
@givenName.setter
|
|
251
|
-
def givenName(self, value: Optional[str]):
|
|
252
|
-
if value is None:
|
|
253
|
-
return
|
|
254
|
-
self._givenName = str(value)
|
|
255
|
-
self._changed.add('givenName')
|
|
256
|
-
|
|
257
|
-
@property
|
|
258
|
-
def familyName(self) -> Optional[str]:
|
|
259
|
-
return self._familyName
|
|
260
|
-
|
|
261
|
-
@familyName.setter
|
|
262
|
-
def familyName(self, value: Optional[str]):
|
|
263
|
-
if value is None:
|
|
264
|
-
return
|
|
265
|
-
self._familyName = str(value)
|
|
266
|
-
self._changed.add('familyName')
|
|
267
|
-
|
|
268
|
-
@property
|
|
269
|
-
def password(self) -> Optional[str]:
|
|
270
|
-
return None
|
|
271
|
-
|
|
272
|
-
@password.setter
|
|
273
|
-
def password(self, value: Optional[str]):
|
|
274
|
-
if value is None:
|
|
275
|
-
return
|
|
276
|
-
self._password = str(value)
|
|
277
|
-
self._changed.add('password')
|
|
278
|
-
|
|
279
|
-
@property
|
|
280
|
-
def lang(self) -> Optional[Languages]:
|
|
281
|
-
return self._lang
|
|
282
|
-
|
|
283
|
-
@lang.setter
|
|
284
|
-
def lang(self, value: Optional[Union[str, Languages]]):
|
|
285
|
-
if value is None:
|
|
286
|
-
return
|
|
287
|
-
if isinstance(value, Languages):
|
|
288
|
-
self._lang = value
|
|
289
|
-
self._changed.add('lang')
|
|
290
|
-
else:
|
|
291
|
-
lmap = dict(map(lambda a: (a.value, a), Languages))
|
|
292
|
-
if lmap.get(value) is None:
|
|
293
|
-
raise BaseError('Invalid language string "' + value + '"!')
|
|
294
|
-
self._lang = lmap[value]
|
|
295
|
-
self._changed.add('lang')
|
|
296
|
-
|
|
297
|
-
@property
|
|
298
|
-
def status(self) -> bool:
|
|
299
|
-
return self._status
|
|
300
|
-
|
|
301
|
-
@status.setter
|
|
302
|
-
def status(self, value: Optional[bool]) -> None:
|
|
303
|
-
self._status = None if value is None else bool(value)
|
|
304
|
-
if value is not None:
|
|
305
|
-
self._changed.add('status')
|
|
306
|
-
|
|
307
|
-
@property
|
|
308
|
-
def sysadmin(self) -> bool:
|
|
309
|
-
return self._sysadmin
|
|
310
|
-
|
|
311
|
-
@sysadmin.setter
|
|
312
|
-
def sysadmin(self, value: bool):
|
|
313
|
-
self._sysadmin = None if value is None else bool(value)
|
|
314
|
-
if value is not None:
|
|
315
|
-
self._changed.add('sysadmin')
|
|
316
|
-
|
|
317
|
-
@property
|
|
318
|
-
def in_groups(self) -> Set[str]:
|
|
319
|
-
return self._in_groups
|
|
320
|
-
|
|
321
|
-
@in_groups.setter
|
|
322
|
-
def in_groups(self, value: Any):
|
|
323
|
-
raise BaseError('Group membership cannot be modified directly! Use methods "addToGroup" and "rmFromGroup"')
|
|
324
|
-
|
|
325
|
-
def addToGroup(self, value: str):
|
|
326
|
-
"""
|
|
327
|
-
Add the user to the given group (executed at next update)
|
|
328
|
-
|
|
329
|
-
:param value: IRI of the group
|
|
330
|
-
:return: None
|
|
331
|
-
"""
|
|
332
|
-
|
|
333
|
-
if value in self._rm_from_group:
|
|
334
|
-
self._rm_from_group.pop(value)
|
|
335
|
-
elif value not in self._in_groups:
|
|
336
|
-
self._add_to_group.add(value)
|
|
337
|
-
self._changed.add('in_groups')
|
|
338
|
-
else:
|
|
339
|
-
raise BaseError("Already member of this group!")
|
|
340
|
-
|
|
341
|
-
def rmFromGroup(self, value: str):
|
|
342
|
-
"""
|
|
343
|
-
Remove the user from the given group (executed at next update)
|
|
344
|
-
|
|
345
|
-
:param value: Group IRI
|
|
346
|
-
:return: None
|
|
347
|
-
"""
|
|
348
|
-
|
|
349
|
-
if value in self._add_to_group:
|
|
350
|
-
self._add_to_group.discard(value)
|
|
351
|
-
elif value in self._in_groups:
|
|
352
|
-
self._rm_from_group.add(value)
|
|
353
|
-
self._changed.add('in_groups')
|
|
354
|
-
else:
|
|
355
|
-
raise BaseError("User is not in groups!")
|
|
356
|
-
|
|
357
|
-
@property
|
|
358
|
-
def in_projects(self) -> Dict[str, bool]:
|
|
359
|
-
return self._in_projects
|
|
360
|
-
|
|
361
|
-
@in_projects.setter
|
|
362
|
-
def in_project(self, value: Any):
|
|
363
|
-
raise BaseError('Project membership cannot be modified directly! Use methods "addToProject" and "rmFromProject"')
|
|
364
|
-
|
|
365
|
-
def addToProject(self, value: str, padmin: bool = False):
|
|
366
|
-
"""
|
|
367
|
-
Add the user to the given project (executed at next update)
|
|
368
|
-
|
|
369
|
-
:param value: project IRI
|
|
370
|
-
:param padmin: True, if user should be project admin, False otherwise
|
|
371
|
-
:return: None
|
|
372
|
-
"""
|
|
373
|
-
|
|
374
|
-
if value in self._rm_from_project:
|
|
375
|
-
self._rm_from_project.pop(value)
|
|
376
|
-
elif value not in self._in_projects:
|
|
377
|
-
self._add_to_project[value] = padmin
|
|
378
|
-
self._changed.add('in_projects')
|
|
379
|
-
else:
|
|
380
|
-
raise BaseError("Already member of this project!")
|
|
381
|
-
|
|
382
|
-
def rmFromProject(self, value: str):
|
|
383
|
-
"""
|
|
384
|
-
Remove the user from the given project (executed at next update)
|
|
385
|
-
|
|
386
|
-
:param value: Project IRI
|
|
387
|
-
:return: None
|
|
388
|
-
"""
|
|
389
|
-
|
|
390
|
-
if value in self._add_to_project:
|
|
391
|
-
self._add_to_project.pop(value)
|
|
392
|
-
elif value in self._in_projects:
|
|
393
|
-
self._rm_from_project[value] = self._in_projects[value]
|
|
394
|
-
self._changed.add('in_projects')
|
|
395
|
-
else:
|
|
396
|
-
raise BaseError("Project is not in list of member projects!")
|
|
397
|
-
|
|
398
|
-
def makeProjectAdmin(self, value: str):
|
|
399
|
-
"""
|
|
400
|
-
Make the user project administrator in the given project (executed at next update)
|
|
401
|
-
|
|
402
|
-
:param value: Project IRI
|
|
403
|
-
:return: None
|
|
404
|
-
"""
|
|
405
|
-
|
|
406
|
-
if value in self._in_projects:
|
|
407
|
-
self._change_admin[value] = True
|
|
408
|
-
self._changed.add('in_projects')
|
|
409
|
-
elif value in self._add_to_project:
|
|
410
|
-
self._add_to_project[value] = True
|
|
411
|
-
else:
|
|
412
|
-
raise BaseError("User is not member of project!")
|
|
413
|
-
|
|
414
|
-
def unmakeProjectAdmin(self, value: str):
|
|
415
|
-
"""
|
|
416
|
-
Revoke project administrator right for the user from the given project (executed at next update)
|
|
417
|
-
|
|
418
|
-
:param value: Project IRI
|
|
419
|
-
:return: None
|
|
420
|
-
"""
|
|
421
|
-
if value in self._in_projects:
|
|
422
|
-
self._change_admin[value] = False
|
|
423
|
-
self._changed.add('in_projects')
|
|
424
|
-
elif value in self._add_to_project:
|
|
425
|
-
self._add_to_project[value] = False
|
|
426
|
-
else:
|
|
427
|
-
raise BaseError("User is not member of project!")
|
|
428
|
-
|
|
429
|
-
@property
|
|
430
|
-
def changed(self) -> Set[str]:
|
|
431
|
-
return self._changed
|
|
432
|
-
|
|
433
|
-
def has_changed(self, name: str):
|
|
434
|
-
return name in self._changed
|
|
435
|
-
|
|
436
|
-
@classmethod
|
|
437
|
-
def fromJsonObj(cls, con: Connection, json_obj: Any):
|
|
438
|
-
"""
|
|
439
|
-
Internal method! Should not be used directly!
|
|
440
|
-
|
|
441
|
-
This method is used to create a User instance from the JSON data returned by Knora
|
|
442
|
-
|
|
443
|
-
:param con: Connection instance
|
|
444
|
-
:param json_obj: JSON data returned by Knora as python3 object
|
|
445
|
-
:return: User instance
|
|
446
|
-
"""
|
|
447
|
-
|
|
448
|
-
id = json_obj.get('id')
|
|
449
|
-
if id is None:
|
|
450
|
-
raise BaseError('User "id" is missing in JSON from knora')
|
|
451
|
-
email = json_obj.get('email')
|
|
452
|
-
if email is None:
|
|
453
|
-
raise BaseError('User "email" is missing in JSON from knora')
|
|
454
|
-
username = json_obj.get('username')
|
|
455
|
-
if username is None:
|
|
456
|
-
raise BaseError('User "username" is missing in JSON from knora')
|
|
457
|
-
familyName = json_obj.get('familyName')
|
|
458
|
-
givenName = json_obj.get('givenName')
|
|
459
|
-
lang = json_obj.get('lang')
|
|
460
|
-
status = json_obj.get('status')
|
|
461
|
-
if status is None:
|
|
462
|
-
raise BaseError("Status is missing in JSON from knora")
|
|
463
|
-
|
|
464
|
-
in_projects: Dict[str, bool] = {}
|
|
465
|
-
in_groups: Set[str] = set()
|
|
466
|
-
if json_obj.get('permissions') is not None and json_obj['permissions'].get('groupsPerProject') is not None:
|
|
467
|
-
sysadmin = False
|
|
468
|
-
project_groups = json_obj['permissions']['groupsPerProject']
|
|
469
|
-
for project in project_groups:
|
|
470
|
-
if project == Project.SYSTEM_PROJECT:
|
|
471
|
-
if Group.PROJECT_SYSTEMADMIN_GROUP in project_groups[project]:
|
|
472
|
-
sysadmin = True
|
|
473
|
-
else:
|
|
474
|
-
for group in project_groups[project]:
|
|
475
|
-
if group == Group.PROJECT_MEMBER_GROUP:
|
|
476
|
-
if in_projects.get(project) is None:
|
|
477
|
-
in_projects[project] = False
|
|
478
|
-
elif group == Group.PROJECT_ADMIN_GROUP:
|
|
479
|
-
in_projects[project] = True
|
|
480
|
-
else:
|
|
481
|
-
in_groups.add(group)
|
|
482
|
-
return cls(con=con,
|
|
483
|
-
id=id,
|
|
484
|
-
username=username,
|
|
485
|
-
email=email,
|
|
486
|
-
givenName=givenName,
|
|
487
|
-
familyName=familyName,
|
|
488
|
-
lang=lang,
|
|
489
|
-
status=status,
|
|
490
|
-
sysadmin=sysadmin,
|
|
491
|
-
in_projects=in_projects,
|
|
492
|
-
in_groups=in_groups)
|
|
493
|
-
|
|
494
|
-
def toJsonObj(self, action: Actions):
|
|
495
|
-
"""
|
|
496
|
-
Internal method! Should not be used directly!
|
|
497
|
-
|
|
498
|
-
Creates a JSON-object from the Project instance that can be used to call Knora
|
|
499
|
-
|
|
500
|
-
:param action: Action the object is used for (Action.CREATE or Action.UPDATE)
|
|
501
|
-
:return: JSON-object
|
|
502
|
-
"""
|
|
503
|
-
|
|
504
|
-
tmp = {}
|
|
505
|
-
if action == Actions.Create:
|
|
506
|
-
if self._username is None:
|
|
507
|
-
raise BaseError("There must be a valid username!")
|
|
508
|
-
tmp['username'] = self._username
|
|
509
|
-
if self._email is None:
|
|
510
|
-
raise BaseError("'email' is mandatory!")
|
|
511
|
-
tmp['email'] = self._email
|
|
512
|
-
if self._givenName is None:
|
|
513
|
-
raise BaseError("'givenName is mandatory!")
|
|
514
|
-
tmp['givenName'] = self._givenName
|
|
515
|
-
if self._familyName is None:
|
|
516
|
-
raise BaseError("'familyName' is mandatory!")
|
|
517
|
-
tmp['familyName'] = self._familyName
|
|
518
|
-
if self._password is None:
|
|
519
|
-
raise BaseError("'password' is mandatory!")
|
|
520
|
-
tmp['password'] = self._password
|
|
521
|
-
if self._lang is None:
|
|
522
|
-
raise BaseError("'language' is mandatory!")
|
|
523
|
-
tmp['lang'] = self._lang.value
|
|
524
|
-
tmp['status'] = True if self._status is None else self._status
|
|
525
|
-
tmp['systemAdmin'] = False if self._sysadmin is None else self._sysadmin
|
|
526
|
-
elif action == Actions.Update:
|
|
527
|
-
tmp_changed = False
|
|
528
|
-
if self._username is not None and 'username' in self._changed:
|
|
529
|
-
tmp['username'] = self._username
|
|
530
|
-
tmp_changed = self._username
|
|
531
|
-
if self._email is not None and 'email' in self._changed:
|
|
532
|
-
tmp['email'] = self._email
|
|
533
|
-
tmp_changed = True
|
|
534
|
-
if self._givenName is not None and 'givenName' in self._changed:
|
|
535
|
-
tmp['givenName'] = self._givenName
|
|
536
|
-
tmp_changed = True
|
|
537
|
-
if self._familyName is not None and 'familyName' in self._changed:
|
|
538
|
-
tmp['familyName'] = self._familyName
|
|
539
|
-
tmp_changed = True
|
|
540
|
-
if self._lang is not None and 'lang' in self._changed:
|
|
541
|
-
tmp['lang'] = self._lang.value
|
|
542
|
-
tmp_changed = True
|
|
543
|
-
if not tmp_changed:
|
|
544
|
-
tmp = {}
|
|
545
|
-
return tmp
|
|
546
|
-
|
|
547
|
-
def create(self) -> Any:
|
|
548
|
-
"""
|
|
549
|
-
Create new user in Knora
|
|
550
|
-
|
|
551
|
-
:return: JSON-object from Knora
|
|
552
|
-
"""
|
|
553
|
-
|
|
554
|
-
jsonobj = self.toJsonObj(Actions.Create)
|
|
555
|
-
jsondata = json.dumps(jsonobj)
|
|
556
|
-
result = self._con.post('/admin/users', jsondata)
|
|
557
|
-
id = result['user']['id']
|
|
558
|
-
if self._in_projects is not None:
|
|
559
|
-
for project in self._in_projects:
|
|
560
|
-
result = self._con.post('/admin/users/iri/' + quote_plus(id) + '/project-memberships/' + quote_plus(project))
|
|
561
|
-
if self._in_projects[project]:
|
|
562
|
-
result = self._con.post('/admin/users/iri/' + quote_plus(id) + '/project-admin-memberships/' + quote_plus(project))
|
|
563
|
-
if self._in_groups is not None:
|
|
564
|
-
for group in self._in_groups:
|
|
565
|
-
result = self._con.post('/admin/users/iri/' + quote_plus(id) + '/group-memberships/' + quote_plus(group))
|
|
566
|
-
return User.fromJsonObj(self._con, result['user'])
|
|
567
|
-
|
|
568
|
-
def read(self) -> Any:
|
|
569
|
-
"""
|
|
570
|
-
Read the user information from Knora. The User object must have a valid id or email!
|
|
571
|
-
|
|
572
|
-
:return: JSON-object from Knora
|
|
573
|
-
"""
|
|
574
|
-
if self._id is not None:
|
|
575
|
-
result = self._con.get('/admin/users/iri/' + quote_plus(self._id))
|
|
576
|
-
elif self._email is not None:
|
|
577
|
-
result = self._con.get('/admin/users/email/' + quote_plus(self._email))
|
|
578
|
-
elif self._username is not None:
|
|
579
|
-
result = self._con.get('/admin/users/username/' + quote_plus(self._username))
|
|
580
|
-
else:
|
|
581
|
-
raise BaseError('Either user-id or email is required!')
|
|
582
|
-
return User.fromJsonObj(self._con, result['user'])
|
|
583
|
-
|
|
584
|
-
def update(self, requesterPassword: Optional[str] = None) -> Any:
|
|
585
|
-
"""
|
|
586
|
-
Udate the user info in Knora with the modified data in this user instance
|
|
587
|
-
|
|
588
|
-
:param requesterPassword: Old password if a user wants to change it's own password
|
|
589
|
-
:return: JSON-object from Knora
|
|
590
|
-
"""
|
|
591
|
-
|
|
592
|
-
jsonobj = self.toJsonObj(Actions.Update)
|
|
593
|
-
if jsonobj:
|
|
594
|
-
jsondata = json.dumps(jsonobj)
|
|
595
|
-
result = self._con.put('/admin/users/iri/' + quote_plus(self.id) + '/BasicUserInformation', jsondata)
|
|
596
|
-
if 'status' in self._changed:
|
|
597
|
-
jsonobj = {'status': self._status}
|
|
598
|
-
jsondata = json.dumps(jsonobj)
|
|
599
|
-
result = self._con.put('/admin/users/iri/' + quote_plus(self.id) + '/Status', jsondata)
|
|
600
|
-
if 'password' in self._changed:
|
|
601
|
-
if requesterPassword is None:
|
|
602
|
-
raise BaseError("Requester's password is missing!")
|
|
603
|
-
jsonobj = {
|
|
604
|
-
"requesterPassword": requesterPassword,
|
|
605
|
-
"newPassword": self._password
|
|
606
|
-
}
|
|
607
|
-
jsondata = json.dumps(jsonobj)
|
|
608
|
-
result = self._con.put('/admin/users/iri/' + quote_plus(self.id) + '/Password', jsondata)
|
|
609
|
-
if 'sysadmin' in self._changed:
|
|
610
|
-
jsonobj = {'systemAdmin': self._sysadmin}
|
|
611
|
-
jsondata = json.dumps(jsonobj)
|
|
612
|
-
result = self._con.put('/admin/users/iri/' + quote_plus(self.id) + '/SystemAdmin', jsondata)
|
|
613
|
-
for p in self._add_to_project.items():
|
|
614
|
-
result = self._con.post('/admin/users/iri/' + quote_plus(self._id) + '/project-memberships/' + quote_plus(p[0]))
|
|
615
|
-
if p[1]:
|
|
616
|
-
result = self._con.post('/admin/users/iri/' + quote_plus(self._id) + '/project-admin-memberships/' + quote_plus(p[0]))
|
|
617
|
-
|
|
618
|
-
for p in self._rm_from_project:
|
|
619
|
-
if self._in_projects.get(p) is not None and self._in_projects[p]:
|
|
620
|
-
result = self._con.delete('/admin/users/iri/' + quote_plus(self._id) + '/project-admin-memberships/' + quote_plus(p))
|
|
621
|
-
result = self._con.delete('/admin/users/iri/' + quote_plus(self._id) + '/project-memberships/' + quote_plus(p))
|
|
622
|
-
|
|
623
|
-
for p in self._change_admin.items():
|
|
624
|
-
if not p[0] in self._in_projects:
|
|
625
|
-
raise BaseError('user must be member of project!')
|
|
626
|
-
if p[1]:
|
|
627
|
-
result = self._con.post('/admin/users/iri/' + quote_plus(self._id) + '/project-admin-memberships/' + quote_plus(p[0]))
|
|
628
|
-
else:
|
|
629
|
-
result = self._con.delete('/admin/users/iri/' + quote_plus(self._id) + '/project-admin-memberships/' + quote_plus(p[0]))
|
|
630
|
-
|
|
631
|
-
for p in self._add_to_group:
|
|
632
|
-
print('/admin/users/iri/' + quote_plus(self._id) + '/group-memberships/' + quote_plus(p))
|
|
633
|
-
result = self._con.post('/admin/users/iri/' + quote_plus(self._id) + '/group-memberships/' + quote_plus(p))
|
|
634
|
-
for p in self._rm_from_group:
|
|
635
|
-
result = self._con.delete('/admin/users/iri/' + quote_plus(self._id) + '/group-memberships/' + quote_plus(p))
|
|
636
|
-
user = User(con=self._con, id=self._id).read()
|
|
637
|
-
return user
|
|
638
|
-
|
|
639
|
-
def delete(self):
|
|
640
|
-
"""
|
|
641
|
-
Delete the user in nore (NOT YET IMPLEMENTED)
|
|
642
|
-
:return: None
|
|
643
|
-
"""
|
|
644
|
-
result = self._con.delete('/admin/users/iri/' + quote_plus(self._id))
|
|
645
|
-
return User.fromJsonObj(self._con, result['user'])
|
|
646
|
-
|
|
647
|
-
@staticmethod
|
|
648
|
-
def getAllUsers(con: Connection) -> List[Any]:
|
|
649
|
-
"""
|
|
650
|
-
Get a list of all users (static method)
|
|
651
|
-
|
|
652
|
-
:param con: Connection instance
|
|
653
|
-
:return: List of users
|
|
654
|
-
"""
|
|
655
|
-
|
|
656
|
-
result = con.get('/admin/users')
|
|
657
|
-
if 'users' not in result:
|
|
658
|
-
raise BaseError("Request got no users!")
|
|
659
|
-
return list(map(lambda a: User.fromJsonObj(con, a), result['users']))
|
|
660
|
-
|
|
661
|
-
def print(self) -> None:
|
|
662
|
-
"""
|
|
663
|
-
Prin user info to stdout
|
|
664
|
-
|
|
665
|
-
:return: None
|
|
666
|
-
"""
|
|
667
|
-
|
|
668
|
-
print('User info:')
|
|
669
|
-
print(' Id: {}'.format(self._id))
|
|
670
|
-
print(' Username: {}'.format(self._username))
|
|
671
|
-
print(' Family name: {}'.format(self._familyName))
|
|
672
|
-
print(' Given name: {}'.format(self._givenName))
|
|
673
|
-
print(' Language: {}'.format(self._lang.value))
|
|
674
|
-
print(' Status: {}'.format(self._status))
|
|
675
|
-
print(' Sysadmin: {}'.format(self._sysadmin))
|
|
676
|
-
print(' In projects:')
|
|
677
|
-
if self._in_projects is not None:
|
|
678
|
-
for p in self._in_projects:
|
|
679
|
-
print(' {} : project admin: {}'.format(p, self._in_projects[p]))
|
|
680
|
-
print(' In groups:')
|
|
681
|
-
if self._in_groups is not None:
|
|
682
|
-
for g in self._in_groups:
|
|
683
|
-
print(' {}'.format(g))
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
if __name__ == '__main__':
|
|
688
|
-
con = Connection('http://0.0.0.0:3333')
|
|
689
|
-
con.login('root@example.com', 'test')
|
|
690
|
-
|
|
691
|
-
users = User.getAllUsers(con)
|
|
692
|
-
for u in users:
|
|
693
|
-
uu = u.read()
|
|
694
|
-
uu.print()
|
|
695
|
-
|
|
696
|
-
print('======================================')
|
|
697
|
-
|
|
698
|
-
new_user = User(
|
|
699
|
-
con=con,
|
|
700
|
-
username="lrosenth",
|
|
701
|
-
email="lukas.rosenthaler@gmail.com",
|
|
702
|
-
givenName="Lukas",
|
|
703
|
-
familyName="Rosenthaler",
|
|
704
|
-
password="test",
|
|
705
|
-
status=True,
|
|
706
|
-
lang=Languages.DE,
|
|
707
|
-
sysadmin=True,
|
|
708
|
-
in_projects= {
|
|
709
|
-
"http://rdfh.ch/projects/0001": True,
|
|
710
|
-
"http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF": False
|
|
711
|
-
},
|
|
712
|
-
in_groups={"http://rdfh.ch/groups/00FF/images-reviewer"}
|
|
713
|
-
).create()
|
|
714
|
-
new_user.print()
|
|
715
|
-
|
|
716
|
-
new_user.status = False
|
|
717
|
-
new_user = new_user.update()
|
|
718
|
-
new_user.print()
|
|
719
|
-
|
|
720
|
-
new_user.status = True
|
|
721
|
-
#new_user.givenName = '--Lukas--'
|
|
722
|
-
new_user.familyName = '--Rosenthaler--'
|
|
723
|
-
new_user.password = 'gaga'
|
|
724
|
-
new_user = new_user.update("test")
|
|
725
|
-
new_user.print()
|
|
726
|
-
|
|
727
|
-
new_user.addToProject("http://rdfh.ch/projects/0803", True)
|
|
728
|
-
new_user.rmFromProject('http://rdfh.ch/projects/0001')
|
|
729
|
-
new_user.makeProjectAdmin('http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF')
|
|
730
|
-
new_user = new_user.update()
|
|
731
|
-
new_user.print()
|