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,390 @@
1
+ """
2
+ This module implements the handling (CRUD) of list nodes and adds some function to read whole lists.
3
+
4
+ CREATE:
5
+ * Instantiate a new object of the class ListNode
6
+ * Call the ``create`` method on the instance
7
+
8
+ READ:
9
+ * Instantiate a new object with ``iri`` (IRI of listnode)
10
+ * Call the ``read`` method on the instance
11
+ * Access information about the instance
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from typing import Any
17
+ from typing import Optional
18
+ from typing import Union
19
+ from urllib.parse import quote_plus
20
+
21
+ from dsp_tools.clients.connection import Connection
22
+ from dsp_tools.commands.get.legacy_models.model import Model
23
+ from dsp_tools.commands.get.legacy_models.project import Project
24
+ from dsp_tools.error.exceptions import BaseError
25
+ from dsp_tools.legacy_models.langstring import LangString
26
+
27
+
28
+ class ListNode(Model):
29
+ """
30
+ This class represents a list node
31
+
32
+ Attributes
33
+ ----------
34
+
35
+ con : Connection
36
+ A Connection instance to a DSP server (for some operation a login has to be performed with valid credentials)
37
+
38
+ iri : str
39
+ IRI of the list node [readonly, cannot be modified after creation of instance]
40
+
41
+ project : str
42
+ IRI of project. Only used for the creation of a new list (root node) [write].
43
+
44
+ label : LangString
45
+ A LangString instance with language dependent labels. Setting this attribute overwrites all entries
46
+ with the new ones.
47
+ At least one label is required [read/write].
48
+
49
+ comments : LangString
50
+ A LangString instance with language dependent comments. Setting this attributes overwrites all entries
51
+ with the new ones.
52
+
53
+ name : str
54
+ A unique name for the ListNode (unique inside this list) [read/write].
55
+
56
+ parent : IRI | ListNode
57
+ Is required and allowed only for the CREATE operation. Otherwise use the
58
+ "children" attribute [write].
59
+
60
+ isRootNode : bool
61
+ Is True if the ListNode is the root node of a list. Cannot be set [read].
62
+
63
+ children : list[ListNode]
64
+ Contains a list of child nodes. This attribute is only available for nodes that have been read by the
65
+ method "getAllNodes()" [read].
66
+
67
+ rootNodeIri : str
68
+ IRI of the root node. This attribute is only available for nodes that have been read by the
69
+ method "getAllNodes()" [read].
70
+
71
+ Methods
72
+ -------
73
+
74
+ create : ListNode information object
75
+ Creates a new list (node) and returns the information from the list (node). Use it to create new lists
76
+ or append new ListNodes to an existing list.
77
+
78
+ read : ListNode information object
79
+ Returns information about a single list node
80
+
81
+ getAllNodes : ListNode
82
+ Get all nodes of a list. The IRI of the root node has to be supplied.
83
+
84
+ getAllLists [static]:
85
+ Returns all lists of a project.
86
+
87
+ print : None
88
+ Prints the ListNode information to stdout (not recursive)
89
+
90
+ """
91
+
92
+ ROUTE = "/admin/lists"
93
+ ROUTE_SLASH = ROUTE + "/"
94
+
95
+ _id: Optional[str]
96
+ _project: Optional[str]
97
+ _label: Optional[LangString]
98
+ _comments: Optional[LangString]
99
+ _name: Optional[str]
100
+ _parent: Optional[str]
101
+ _isRootNode: bool
102
+ _children: Optional[list[ListNode]]
103
+ _rootNodeIri: Optional[str]
104
+
105
+ def __init__(
106
+ self,
107
+ con: Connection,
108
+ iri: Optional[str] = None,
109
+ project: Optional[Union[Project, str]] = None,
110
+ label: Optional[LangString] = None,
111
+ comments: Optional[LangString] = None,
112
+ name: Optional[str] = None,
113
+ parent: Optional[Union[ListNode, str]] = None,
114
+ isRootNode: bool = False,
115
+ children: Optional[list[ListNode]] = None,
116
+ rootNodeIri: Optional[str] = None,
117
+ ) -> None:
118
+ """
119
+ This is the constructor for the ListNode object. For
120
+
121
+ CREATE:
122
+ * The "con" and at least one "label" are required
123
+ READ:
124
+ * The "con" and "iri" attributes are required
125
+
126
+ Args:
127
+ con: A valid Connection instance with a user logged in that has the appropriate permissions
128
+ iri: IRI of the project [readonly, cannot be modified after creation of instance]
129
+ project: IRI of project. Only used for the creation of a new list (root node) [write].
130
+ label: LangString with lang dependent labels. At least one label is required [read/write].
131
+ comments: A LangString instance with language dependent comments.
132
+ name: A unique name for the ListNode (unique regarding the whole list) [read/write].
133
+ parent: Required and allowed only for the CREATE operation. Otherwise use the "children" attribute [write].
134
+ isRootNode: Is True if the ListNode is a root node of a list Cannot be set [read].
135
+ children: list of children nodes. Only available for nodes that have been read by getAllNodes()
136
+ rootNodeIri: IRI of the root node. Only available for nodes that have been read by the method getAllNodes()
137
+ """
138
+
139
+ super().__init__(con)
140
+
141
+ self._project = project.iri if isinstance(project, Project) else str(project) if project else None
142
+ self._id = iri
143
+ self._label = LangString(label)
144
+ self._comments = LangString(comments) if comments else None
145
+ self._name = name
146
+ if parent and isinstance(parent, ListNode):
147
+ self._parent = parent.iri
148
+ else:
149
+ self._parent = str(parent) if parent else None
150
+ self._isRootNode = isRootNode
151
+ if children:
152
+ if isinstance(children, list) and len(children) > 0 and isinstance(children[0], ListNode):
153
+ self._children = children
154
+ else:
155
+ raise BaseError("ERROR Children must be list of ListNodes!")
156
+ else:
157
+ self._children = None
158
+ if not isinstance(rootNodeIri, str) and rootNodeIri:
159
+ raise BaseError("ERROR rootNodeIri must be of type string")
160
+ self._rootNodeIri = rootNodeIri
161
+
162
+ @property
163
+ def iri(self) -> Optional[str]:
164
+ return self._id
165
+
166
+ @property
167
+ def project(self) -> Optional[str]:
168
+ return self._project
169
+
170
+ @project.setter
171
+ def project(self, value: str) -> None:
172
+ if self._project:
173
+ raise BaseError("Project id cannot be modified!")
174
+ else:
175
+ self._project = value
176
+
177
+ @property
178
+ def label(self) -> LangString:
179
+ return self._label or LangString({})
180
+
181
+ @label.setter
182
+ def label(self, value: Optional[Union[LangString, str]]) -> None:
183
+ self._label = LangString(value)
184
+ self._changed.add("label")
185
+
186
+ @property
187
+ def comments(self) -> LangString:
188
+ return self._comments or LangString({})
189
+
190
+ @comments.setter
191
+ def comments(self, value: Optional[Union[LangString, str]]) -> None:
192
+ self._comments = LangString(value)
193
+ self._changed.add("comments")
194
+
195
+ @property
196
+ def name(self) -> Optional[str]:
197
+ return self._name
198
+
199
+ @name.setter
200
+ def name(self, value: str) -> None:
201
+ self._name = value
202
+ self._changed.add("name")
203
+
204
+ @property
205
+ def parent(self) -> Optional[str]:
206
+ return self._parent if self._parent else None
207
+
208
+ @parent.setter
209
+ def parent(self, value: Union[str, ListNode]) -> None:
210
+ if isinstance(value, ListNode):
211
+ self._parent = value.iri
212
+ else:
213
+ self._parent = value
214
+
215
+ @property
216
+ def isRootNode(self) -> Optional[bool]:
217
+ return self._isRootNode
218
+
219
+ @property
220
+ def children(self) -> list[ListNode]:
221
+ return self._children or []
222
+
223
+ @children.setter
224
+ def children(self, value: list[ListNode]) -> None:
225
+ self._children = value
226
+
227
+ @staticmethod
228
+ def __getChildren(
229
+ con: Connection,
230
+ parent_iri: str,
231
+ project_iri: str,
232
+ children: list[Any],
233
+ ) -> Optional[list[ListNode]]:
234
+ """
235
+ Internal method! Should not be used directly!
236
+
237
+ Static method gets a recursive List of children nodes
238
+
239
+ :param con: Valid Connection instance
240
+ :param children: json object of children
241
+ :return: List of ListNode instances
242
+ """
243
+ if children:
244
+ child_nodes: list[Any] = []
245
+ for child in children:
246
+ if "parentNodeIri" not in child:
247
+ child["parentNodeIri"] = parent_iri
248
+ if "projectIri" not in child:
249
+ child["projectIri"] = project_iri
250
+ child_node = ListNode.fromJsonObj(con, child)
251
+ child_nodes.append(child_node)
252
+ return child_nodes
253
+ else:
254
+ return None
255
+
256
+ @property
257
+ def rootNodeIri(self) -> Optional[str]:
258
+ return self._rootNodeIri
259
+
260
+ @classmethod
261
+ def fromJsonObj(cls, con: Connection, json_obj: Any) -> ListNode:
262
+ """
263
+ Internal method! Should not be used directly!
264
+
265
+ This method is used to create a ListNode instance from the JSON data returned by DSP
266
+
267
+ :param con: Connection instance
268
+ :param json_obj: JSON data returned by DSP as python3 object
269
+ :return: ListNode instance
270
+ """
271
+
272
+ iri = json_obj.get("id")
273
+ if iri is None:
274
+ raise BaseError("ListNode id is missing")
275
+ project = json_obj.get("projectIri")
276
+ label = LangString.fromJsonObj(json_obj.get("labels"))
277
+ comments = LangString.fromJsonObj(json_obj.get("comments"))
278
+ if json_obj.get("name"):
279
+ name = json_obj["name"]
280
+ else:
281
+ name = iri.rsplit("/", 1)[-1]
282
+ parent = json_obj.get("parentNodeIri")
283
+ isRootNode = json_obj.get("isRootNode")
284
+
285
+ child_info = json_obj.get("children")
286
+ children = None
287
+ if child_info:
288
+ children = ListNode.__getChildren(con=con, parent_iri=iri, project_iri=project, children=child_info)
289
+ rootNodeIri = json_obj.get("hasRootNode")
290
+
291
+ return cls(
292
+ con=con,
293
+ iri=iri,
294
+ project=project,
295
+ label=label,
296
+ comments=comments,
297
+ name=name,
298
+ parent=parent,
299
+ isRootNode=isRootNode,
300
+ children=children,
301
+ rootNodeIri=rootNodeIri,
302
+ )
303
+
304
+ def read(self) -> Any:
305
+ """
306
+ Read a project from DSP-API
307
+
308
+ :return: JSON-object from DSP-API
309
+ """
310
+
311
+ result = self._con.get(ListNode.ROUTE_SLASH + "nodes/" + quote_plus(self._id))
312
+ if result.get("nodeinfo"):
313
+ return self.fromJsonObj(self._con, result["nodeinfo"])
314
+ elif result.get("listinfo"):
315
+ return self.fromJsonObj(self._con, result["listinfo"])
316
+ else:
317
+ return None
318
+
319
+ def getAllNodes(self) -> ListNode:
320
+ """
321
+ Get all nodes of the list. Must be called from a ListNode instance that has at least set the
322
+ list iri!
323
+
324
+ :return: Root node of list with recursive ListNodes ("children"-attributes)
325
+ """
326
+
327
+ result = self._con.get(ListNode.ROUTE_SLASH + quote_plus(self._id))
328
+ if "list" not in result:
329
+ raise BaseError("Request got no list!")
330
+ if "listinfo" not in result["list"]:
331
+ raise BaseError("Request got no proper list information!")
332
+ root = ListNode.fromJsonObj(self._con, result["list"]["listinfo"])
333
+ if "children" in result["list"]:
334
+ root.children = ListNode.__getChildren(
335
+ con=self._con, parent_iri=root.iri, project_iri=root.project, children=result["list"]["children"]
336
+ )
337
+ return root
338
+
339
+ @staticmethod
340
+ def getAllLists(con: Connection, project_iri: Optional[str] = None) -> list[ListNode]:
341
+ """
342
+ Get all lists. If a project IRI is given, it returns the lists of the specified project
343
+
344
+ :param con: Connection instance
345
+ :param project_iri: Iri/id of project
346
+ :return: list of ListNodes
347
+ """
348
+ if project_iri is None:
349
+ result = con.get(ListNode.ROUTE)
350
+ else:
351
+ result = con.get(ListNode.ROUTE + "?projectIri=" + quote_plus(project_iri))
352
+ if "lists" not in result:
353
+ raise BaseError("Request got no lists!")
354
+ return list(map(lambda a: ListNode.fromJsonObj(con, a), result["lists"]))
355
+
356
+ def _createDefinitionFileObj(self, children: list[ListNode]) -> list[dict[str, Any]]:
357
+ """
358
+ Create an object that corresponds to the syntax of the input to "create_onto".
359
+ Node: This method must be used only internally (for recursion)!!
360
+
361
+ :param children: List of children nodes
362
+ :return: A python object that can be jsonfied to correspond to the syntax of the input to "create_onto".
363
+ """
364
+ listnodeobjs = []
365
+ for listnode in children:
366
+ listnodeobj = {
367
+ "name": listnode.name,
368
+ "labels": listnode.label.createDefinitionFileObj(),
369
+ }
370
+ if not listnode.comments.isEmpty():
371
+ listnodeobj["comments"] = listnode.comments.createDefinitionFileObj()
372
+ if listnode.children:
373
+ listnodeobj["nodes"] = self._createDefinitionFileObj(listnode.children)
374
+ listnodeobjs.append(listnodeobj)
375
+ return listnodeobjs
376
+
377
+ def createDefinitionFileObj(self) -> dict[str, Any]:
378
+ """
379
+ Create an object that corresponds to the syntax of the input to "create_onto".
380
+ :return: A python object that can be jsonfied to correspond to the syntax of the input to "create_onto".
381
+ """
382
+ listnode = {
383
+ "name": self._name,
384
+ "labels": self._label.createDefinitionFileObj(),
385
+ }
386
+ if not self._comments.isEmpty():
387
+ listnode["comments"] = self._comments.createDefinitionFileObj()
388
+ if self._children:
389
+ listnode["nodes"] = self._createDefinitionFileObj(self._children)
390
+ return listnode
@@ -0,0 +1,12 @@
1
+ from dsp_tools.clients.connection import Connection
2
+
3
+
4
+ class Model:
5
+ """Base class for other classes"""
6
+
7
+ _con: Connection
8
+ _changed: set[str]
9
+
10
+ def __init__(self, con: Connection):
11
+ self._con = con
12
+ self._changed = set()