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.
Files changed (348) hide show
  1. dsp_tools/__init__.py +5 -0
  2. dsp_tools/cli/args.py +47 -0
  3. dsp_tools/cli/call_action.py +85 -0
  4. dsp_tools/cli/call_action_files_only.py +101 -0
  5. dsp_tools/cli/call_action_with_network.py +207 -0
  6. dsp_tools/cli/create_parsers.py +479 -0
  7. dsp_tools/cli/entry_point.py +322 -0
  8. dsp_tools/cli/utils.py +87 -0
  9. dsp_tools/clients/CLAUDE.md +420 -0
  10. dsp_tools/clients/authentication_client.py +14 -0
  11. dsp_tools/clients/authentication_client_live.py +66 -0
  12. dsp_tools/clients/connection.py +35 -0
  13. dsp_tools/clients/connection_live.py +233 -0
  14. dsp_tools/clients/fuseki_metrics.py +60 -0
  15. dsp_tools/clients/group_user_clients.py +35 -0
  16. dsp_tools/clients/group_user_clients_live.py +181 -0
  17. dsp_tools/clients/legal_info_client.py +23 -0
  18. dsp_tools/clients/legal_info_client_live.py +132 -0
  19. dsp_tools/clients/list_client.py +49 -0
  20. dsp_tools/clients/list_client_live.py +166 -0
  21. dsp_tools/clients/metadata_client.py +24 -0
  22. dsp_tools/clients/metadata_client_live.py +47 -0
  23. dsp_tools/clients/ontology_clients.py +49 -0
  24. dsp_tools/clients/ontology_create_client_live.py +166 -0
  25. dsp_tools/clients/ontology_get_client_live.py +80 -0
  26. dsp_tools/clients/permissions_client.py +68 -0
  27. dsp_tools/clients/project_client.py +16 -0
  28. dsp_tools/clients/project_client_live.py +66 -0
  29. dsp_tools/commands/create/communicate_problems.py +24 -0
  30. dsp_tools/commands/create/create.py +134 -0
  31. dsp_tools/commands/create/create_on_server/cardinalities.py +111 -0
  32. dsp_tools/commands/create/create_on_server/classes.py +99 -0
  33. dsp_tools/commands/create/create_on_server/complete_ontologies.py +116 -0
  34. dsp_tools/commands/create/create_on_server/default_permissions.py +134 -0
  35. dsp_tools/commands/create/create_on_server/group_users.py +165 -0
  36. dsp_tools/commands/create/create_on_server/lists.py +163 -0
  37. dsp_tools/commands/create/create_on_server/mappers.py +12 -0
  38. dsp_tools/commands/create/create_on_server/onto_utils.py +74 -0
  39. dsp_tools/commands/create/create_on_server/ontology.py +52 -0
  40. dsp_tools/commands/create/create_on_server/project.py +68 -0
  41. dsp_tools/commands/create/create_on_server/properties.py +119 -0
  42. dsp_tools/commands/create/exceptions.py +29 -0
  43. dsp_tools/commands/create/lists_only.py +66 -0
  44. dsp_tools/commands/create/models/create_problems.py +87 -0
  45. dsp_tools/commands/create/models/parsed_ontology.py +88 -0
  46. dsp_tools/commands/create/models/parsed_project.py +81 -0
  47. dsp_tools/commands/create/models/rdf_ontology.py +12 -0
  48. dsp_tools/commands/create/models/server_project_info.py +100 -0
  49. dsp_tools/commands/create/parsing/parse_lists.py +45 -0
  50. dsp_tools/commands/create/parsing/parse_ontology.py +243 -0
  51. dsp_tools/commands/create/parsing/parse_project.py +149 -0
  52. dsp_tools/commands/create/parsing/parsing_utils.py +40 -0
  53. dsp_tools/commands/create/project_validate.py +595 -0
  54. dsp_tools/commands/create/serialisation/ontology.py +119 -0
  55. dsp_tools/commands/create/serialisation/project.py +44 -0
  56. dsp_tools/commands/excel2json/CLAUDE.md +101 -0
  57. dsp_tools/commands/excel2json/json_header.py +321 -0
  58. dsp_tools/commands/excel2json/lists/__init__.py +0 -0
  59. dsp_tools/commands/excel2json/lists/compliance_checks.py +292 -0
  60. dsp_tools/commands/excel2json/lists/make_lists.py +247 -0
  61. dsp_tools/commands/excel2json/lists/models/__init__.py +0 -0
  62. dsp_tools/commands/excel2json/lists/models/deserialise.py +30 -0
  63. dsp_tools/commands/excel2json/lists/models/input_error.py +216 -0
  64. dsp_tools/commands/excel2json/lists/models/serialise.py +57 -0
  65. dsp_tools/commands/excel2json/lists/utils.py +81 -0
  66. dsp_tools/commands/excel2json/models/__init__.py +0 -0
  67. dsp_tools/commands/excel2json/models/input_error.py +416 -0
  68. dsp_tools/commands/excel2json/models/json_header.py +175 -0
  69. dsp_tools/commands/excel2json/models/list_node_name.py +16 -0
  70. dsp_tools/commands/excel2json/models/ontology.py +76 -0
  71. dsp_tools/commands/excel2json/old_lists.py +328 -0
  72. dsp_tools/commands/excel2json/project.py +280 -0
  73. dsp_tools/commands/excel2json/properties.py +370 -0
  74. dsp_tools/commands/excel2json/resources.py +336 -0
  75. dsp_tools/commands/excel2json/utils.py +352 -0
  76. dsp_tools/commands/excel2xml/__init__.py +7 -0
  77. dsp_tools/commands/excel2xml/excel2xml_cli.py +523 -0
  78. dsp_tools/commands/excel2xml/excel2xml_lib.py +1953 -0
  79. dsp_tools/commands/excel2xml/propertyelement.py +47 -0
  80. dsp_tools/commands/get/__init__.py +0 -0
  81. dsp_tools/commands/get/get.py +166 -0
  82. dsp_tools/commands/get/get_permissions.py +257 -0
  83. dsp_tools/commands/get/get_permissions_legacy.py +89 -0
  84. dsp_tools/commands/get/legacy_models/__init__.py +0 -0
  85. dsp_tools/commands/get/legacy_models/context.py +318 -0
  86. dsp_tools/commands/get/legacy_models/group.py +241 -0
  87. dsp_tools/commands/get/legacy_models/helpers.py +47 -0
  88. dsp_tools/commands/get/legacy_models/listnode.py +390 -0
  89. dsp_tools/commands/get/legacy_models/model.py +12 -0
  90. dsp_tools/commands/get/legacy_models/ontology.py +324 -0
  91. dsp_tools/commands/get/legacy_models/project.py +366 -0
  92. dsp_tools/commands/get/legacy_models/propertyclass.py +417 -0
  93. dsp_tools/commands/get/legacy_models/resourceclass.py +676 -0
  94. dsp_tools/commands/get/legacy_models/user.py +438 -0
  95. dsp_tools/commands/get/models/__init__.py +0 -0
  96. dsp_tools/commands/get/models/permissions_models.py +10 -0
  97. dsp_tools/commands/id2iri.py +258 -0
  98. dsp_tools/commands/ingest_xmlupload/__init__.py +0 -0
  99. dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +178 -0
  100. dsp_tools/commands/ingest_xmlupload/create_resources/__init__.py +0 -0
  101. dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +69 -0
  102. dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +166 -0
  103. dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +121 -0
  104. dsp_tools/commands/ingest_xmlupload/ingest_files/__init__.py +0 -0
  105. dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +64 -0
  106. dsp_tools/commands/ingest_xmlupload/upload_files/__init__.py +0 -0
  107. dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +20 -0
  108. dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +57 -0
  109. dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +66 -0
  110. dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +67 -0
  111. dsp_tools/commands/resume_xmlupload/__init__.py +0 -0
  112. dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +96 -0
  113. dsp_tools/commands/start_stack.py +428 -0
  114. dsp_tools/commands/update_legal/CLAUDE.md +344 -0
  115. dsp_tools/commands/update_legal/__init__.py +0 -0
  116. dsp_tools/commands/update_legal/core.py +182 -0
  117. dsp_tools/commands/update_legal/csv_operations.py +135 -0
  118. dsp_tools/commands/update_legal/models.py +87 -0
  119. dsp_tools/commands/update_legal/xml_operations.py +247 -0
  120. dsp_tools/commands/validate_data/CLAUDE.md +159 -0
  121. dsp_tools/commands/validate_data/__init__.py +0 -0
  122. dsp_tools/commands/validate_data/constants.py +59 -0
  123. dsp_tools/commands/validate_data/mappers.py +143 -0
  124. dsp_tools/commands/validate_data/models/__init__.py +0 -0
  125. dsp_tools/commands/validate_data/models/api_responses.py +45 -0
  126. dsp_tools/commands/validate_data/models/input_problems.py +119 -0
  127. dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
  128. dsp_tools/commands/validate_data/models/validation.py +106 -0
  129. dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
  130. dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
  131. dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
  132. dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
  133. dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
  134. dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
  135. dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
  136. dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
  137. dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
  138. dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
  139. dsp_tools/commands/validate_data/sparql/cardinality_shacl.py +209 -0
  140. dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
  141. dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
  142. dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
  143. dsp_tools/commands/validate_data/utils.py +59 -0
  144. dsp_tools/commands/validate_data/validate_data.py +283 -0
  145. dsp_tools/commands/validate_data/validation/__init__.py +0 -0
  146. dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
  147. dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
  148. dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
  149. dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
  150. dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
  151. dsp_tools/commands/xmlupload/__init__.py +0 -0
  152. dsp_tools/commands/xmlupload/iri_resolver.py +21 -0
  153. dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
  154. dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
  155. dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
  156. dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
  157. dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
  158. dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
  159. dsp_tools/commands/xmlupload/models/__init__.py +0 -0
  160. dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
  161. dsp_tools/commands/xmlupload/models/formatted_text_value.py +10 -0
  162. dsp_tools/commands/xmlupload/models/ingest.py +143 -0
  163. dsp_tools/commands/xmlupload/models/input_problems.py +58 -0
  164. dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
  165. dsp_tools/commands/xmlupload/models/permission.py +45 -0
  166. dsp_tools/commands/xmlupload/models/permissions_parsed.py +93 -0
  167. dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
  168. dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
  169. dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
  170. dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
  171. dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
  172. dsp_tools/commands/xmlupload/models/upload_clients.py +14 -0
  173. dsp_tools/commands/xmlupload/models/upload_state.py +20 -0
  174. dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
  175. dsp_tools/commands/xmlupload/prepare_xml_input/ark2iri.py +55 -0
  176. dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
  177. dsp_tools/commands/xmlupload/prepare_xml_input/iiif_uri_validator.py +50 -0
  178. dsp_tools/commands/xmlupload/prepare_xml_input/list_client.py +120 -0
  179. dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
  180. dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
  181. dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
  182. dsp_tools/commands/xmlupload/resource_create_client.py +25 -0
  183. dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
  184. dsp_tools/commands/xmlupload/stash/__init__.py +0 -0
  185. dsp_tools/commands/xmlupload/stash/analyse_circular_reference_graph.py +236 -0
  186. dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
  187. dsp_tools/commands/xmlupload/stash/graph_models.py +87 -0
  188. dsp_tools/commands/xmlupload/stash/stash_circular_references.py +68 -0
  189. dsp_tools/commands/xmlupload/stash/stash_models.py +109 -0
  190. dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +106 -0
  191. dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +196 -0
  192. dsp_tools/commands/xmlupload/upload_config.py +76 -0
  193. dsp_tools/commands/xmlupload/write_diagnostic_info.py +27 -0
  194. dsp_tools/commands/xmlupload/xmlupload.py +516 -0
  195. dsp_tools/config/__init__.py +0 -0
  196. dsp_tools/config/logger_config.py +69 -0
  197. dsp_tools/config/warnings_config.py +32 -0
  198. dsp_tools/error/__init__.py +0 -0
  199. dsp_tools/error/custom_warnings.py +39 -0
  200. dsp_tools/error/exceptions.py +204 -0
  201. dsp_tools/error/problems.py +10 -0
  202. dsp_tools/error/xmllib_errors.py +20 -0
  203. dsp_tools/error/xmllib_warnings.py +54 -0
  204. dsp_tools/error/xmllib_warnings_util.py +159 -0
  205. dsp_tools/error/xsd_validation_error_msg.py +19 -0
  206. dsp_tools/legacy_models/__init__.py +0 -0
  207. dsp_tools/legacy_models/datetimestamp.py +81 -0
  208. dsp_tools/legacy_models/langstring.py +253 -0
  209. dsp_tools/legacy_models/projectContext.py +49 -0
  210. dsp_tools/py.typed +0 -0
  211. dsp_tools/resources/schema/data.xsd +648 -0
  212. dsp_tools/resources/schema/lists-only.json +72 -0
  213. dsp_tools/resources/schema/project.json +1258 -0
  214. dsp_tools/resources/schema/properties-only.json +874 -0
  215. dsp_tools/resources/schema/resources-only.json +140 -0
  216. dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
  217. dsp_tools/resources/start-stack/docker-compose.override.yml +11 -0
  218. dsp_tools/resources/start-stack/docker-compose.yml +88 -0
  219. dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
  220. dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
  221. dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
  222. dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
  223. dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
  224. dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
  225. dsp_tools/utils/__init__.py +0 -0
  226. dsp_tools/utils/ansi_colors.py +32 -0
  227. dsp_tools/utils/data_formats/__init__.py +0 -0
  228. dsp_tools/utils/data_formats/date_util.py +166 -0
  229. dsp_tools/utils/data_formats/iri_util.py +30 -0
  230. dsp_tools/utils/data_formats/shared.py +81 -0
  231. dsp_tools/utils/data_formats/uri_util.py +76 -0
  232. dsp_tools/utils/fuseki_bloating.py +63 -0
  233. dsp_tools/utils/json_parsing.py +22 -0
  234. dsp_tools/utils/rdf_constants.py +42 -0
  235. dsp_tools/utils/rdflib_utils.py +10 -0
  236. dsp_tools/utils/replace_id_with_iri.py +66 -0
  237. dsp_tools/utils/request_utils.py +238 -0
  238. dsp_tools/utils/xml_parsing/__init__.py +0 -0
  239. dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
  240. dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
  241. dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
  242. dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
  243. dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
  244. dsp_tools/xmllib/CLAUDE.md +302 -0
  245. dsp_tools/xmllib/__init__.py +49 -0
  246. dsp_tools/xmllib/general_functions.py +877 -0
  247. dsp_tools/xmllib/internal/__init__.py +0 -0
  248. dsp_tools/xmllib/internal/checkers.py +162 -0
  249. dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
  250. dsp_tools/xmllib/internal/constants.py +46 -0
  251. dsp_tools/xmllib/internal/input_converters.py +155 -0
  252. dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
  253. dsp_tools/xmllib/internal/serialise_resource.py +177 -0
  254. dsp_tools/xmllib/internal/serialise_values.py +152 -0
  255. dsp_tools/xmllib/internal/type_aliases.py +11 -0
  256. dsp_tools/xmllib/models/__init__.py +0 -0
  257. dsp_tools/xmllib/models/config_options.py +28 -0
  258. dsp_tools/xmllib/models/date_formats.py +48 -0
  259. dsp_tools/xmllib/models/dsp_base_resources.py +1542 -0
  260. dsp_tools/xmllib/models/internal/__init__.py +0 -0
  261. dsp_tools/xmllib/models/internal/file_values.py +172 -0
  262. dsp_tools/xmllib/models/internal/geometry.py +162 -0
  263. dsp_tools/xmllib/models/internal/migration_metadata.py +55 -0
  264. dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
  265. dsp_tools/xmllib/models/internal/values.py +342 -0
  266. dsp_tools/xmllib/models/licenses/__init__.py +0 -0
  267. dsp_tools/xmllib/models/licenses/other.py +59 -0
  268. dsp_tools/xmllib/models/licenses/recommended.py +107 -0
  269. dsp_tools/xmllib/models/permissions.py +41 -0
  270. dsp_tools/xmllib/models/res.py +1782 -0
  271. dsp_tools/xmllib/models/root.py +348 -0
  272. dsp_tools/xmllib/value_checkers.py +434 -0
  273. dsp_tools/xmllib/value_converters.py +777 -0
  274. dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
  275. dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
  276. dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
  277. dsp_tools-18.3.0.post13.dist-info/entry_points.txt +3 -0
  278. dsp_tools-0.9.13.dist-info/LICENSE +0 -674
  279. dsp_tools-0.9.13.dist-info/METADATA +0 -144
  280. dsp_tools-0.9.13.dist-info/RECORD +0 -71
  281. dsp_tools-0.9.13.dist-info/WHEEL +0 -5
  282. dsp_tools-0.9.13.dist-info/entry_points.txt +0 -3
  283. dsp_tools-0.9.13.dist-info/top_level.txt +0 -1
  284. dsplib/models/connection.py +0 -272
  285. dsplib/models/group.py +0 -296
  286. dsplib/models/helpers.py +0 -505
  287. dsplib/models/langstring.py +0 -277
  288. dsplib/models/listnode.py +0 -578
  289. dsplib/models/model.py +0 -20
  290. dsplib/models/ontology.py +0 -448
  291. dsplib/models/permission.py +0 -112
  292. dsplib/models/project.py +0 -547
  293. dsplib/models/propertyclass.py +0 -505
  294. dsplib/models/resource.py +0 -366
  295. dsplib/models/resourceclass.py +0 -810
  296. dsplib/models/sipi.py +0 -30
  297. dsplib/models/user.py +0 -731
  298. dsplib/models/value.py +0 -1000
  299. dsplib/utils/knora-data-schema.xsd +0 -454
  300. dsplib/utils/knora-schema-lists.json +0 -83
  301. dsplib/utils/knora-schema.json +0 -434
  302. dsplib/utils/onto_commons.py +0 -24
  303. dsplib/utils/onto_create_lists.py +0 -73
  304. dsplib/utils/onto_create_ontology.py +0 -442
  305. dsplib/utils/onto_get.py +0 -58
  306. dsplib/utils/onto_validate.py +0 -33
  307. dsplib/utils/xml_upload.py +0 -539
  308. dsplib/widgets/doublepassword.py +0 -80
  309. knora/MLS-import-libraries.py +0 -84
  310. knora/dsp_tools.py +0 -96
  311. knora/dsplib/models/connection.py +0 -272
  312. knora/dsplib/models/group.py +0 -296
  313. knora/dsplib/models/helpers.py +0 -506
  314. knora/dsplib/models/langstring.py +0 -277
  315. knora/dsplib/models/listnode.py +0 -578
  316. knora/dsplib/models/model.py +0 -20
  317. knora/dsplib/models/ontology.py +0 -448
  318. knora/dsplib/models/permission.py +0 -112
  319. knora/dsplib/models/project.py +0 -583
  320. knora/dsplib/models/propertyclass.py +0 -505
  321. knora/dsplib/models/resource.py +0 -416
  322. knora/dsplib/models/resourceclass.py +0 -811
  323. knora/dsplib/models/sipi.py +0 -35
  324. knora/dsplib/models/user.py +0 -731
  325. knora/dsplib/models/value.py +0 -1000
  326. knora/dsplib/utils/knora-data-schema.xsd +0 -464
  327. knora/dsplib/utils/knora-schema-lists.json +0 -83
  328. knora/dsplib/utils/knora-schema.json +0 -444
  329. knora/dsplib/utils/onto_commons.py +0 -24
  330. knora/dsplib/utils/onto_create_lists.py +0 -73
  331. knora/dsplib/utils/onto_create_ontology.py +0 -451
  332. knora/dsplib/utils/onto_get.py +0 -58
  333. knora/dsplib/utils/onto_validate.py +0 -33
  334. knora/dsplib/utils/xml_upload.py +0 -540
  335. knora/dsplib/widgets/doublepassword.py +0 -80
  336. knora/knora.py +0 -2108
  337. knora/test.py +0 -99
  338. knora/testit.py +0 -76
  339. knora/xml2knora.py +0 -633
  340. {dsplib → dsp_tools/cli}/__init__.py +0 -0
  341. {dsplib/models → dsp_tools/clients}/__init__.py +0 -0
  342. {dsplib/utils → dsp_tools/commands}/__init__.py +0 -0
  343. {dsplib/widgets → dsp_tools/commands/create}/__init__.py +0 -0
  344. {knora → dsp_tools/commands/create/create_on_server}/__init__.py +0 -0
  345. {knora/dsplib → dsp_tools/commands/create/models}/__init__.py +0 -0
  346. {knora/dsplib/models → dsp_tools/commands/create/parsing}/__init__.py +0 -0
  347. {knora/dsplib/utils → dsp_tools/commands/create/serialisation}/__init__.py +0 -0
  348. {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]]