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
@@ -1,578 +0,0 @@
1
- import json
2
- from pystrict import strict
3
- from typing import List, Set, Dict, Tuple, Optional, Any, Union, NewType
4
- from urllib.parse import quote_plus
5
-
6
- from .helpers import Actions, BaseError
7
- from .langstring import Languages, LangStringParam, LangString
8
- from .connection import Connection
9
- from .model import Model
10
- from .project import Project
11
-
12
- from pprint import pprint
13
-
14
- class SetEncoder(json.JSONEncoder):
15
- def default(self, obj):
16
- if isinstance(obj, set):
17
- return list(obj)
18
- return json.JSONEncoder.default(self, obj)
19
-
20
- """
21
- This module implements the handling (CRUD) of Knora ListNodes and adds some function to read whole lists.
22
-
23
- CREATE:
24
- * Instantiate a new object of the class ListNode with all required parameters
25
- * Call the ``create``-method on the instance
26
-
27
- READ:
28
- * Instantiate a new object with ``id``(IRI of list(-node) given
29
- * Call the ``read``-method on the instance
30
- * Access the information that has been provided to the instance
31
-
32
- UPDATE:
33
- * Only partially implemented. Only "label" and "comment" attributes may be changed.
34
- * You need an instance of an existing ListNode by reading an instance
35
- * Change the attributes by assigning the new values
36
- * Call the ``update```method on the instance
37
-
38
- DELETE
39
- * NOT YET IMPLEMENTED BY Knora backend!
40
- * Instantiate a new objects with ``id``(IRI of project) 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
-
47
- @strict
48
- class ListNode(Model):
49
- """
50
- This class represents a list node or a while list from Knora
51
-
52
- Attributes
53
- ----------
54
-
55
- con : Connection
56
- A Connection instance to a Knora server (for some operation a login has to be performedwith valid credentials)
57
-
58
- id : str
59
- IRI of the project [readonly, cannot be modified after creation of instance]
60
-
61
- project : str
62
- IRI of project. Only used for the creation of a new list (root node) [write].
63
-
64
- label : LangString
65
- A LangString instance with language depenedent labels. Setting this attributes overwites all entries
66
- with the new ones. In order to add/remove a specific entry, use "addLabel" or "rmLabel".
67
- At least one label is required [read/write].
68
-
69
- comment : LangString
70
- A LangString instance with language depenedent comments. Setting this attributes overwites all entries
71
- with the new ones.In order to add/remove a specific entry, use "addComment" or "rmComment".
72
-
73
- name : str
74
- A unique name for the ListNode (unique regarding the whole list) [read/write].
75
-
76
- parent : IRI | ListNode
77
- Is required and allowed only for the CREATE operation. Otherwise use the
78
- "children" attribute [write].
79
-
80
- isRootNode : bool
81
- Is True if the ListNode is a root node of a list Cannot be set [read].
82
-
83
- children : List[ListNode]
84
- Contains a list of children nodes. This attribute is only avaliable for nodes that have been read by the
85
- method "getAllNodes()"! [read]
86
-
87
- rootNodeIri : str
88
- IRI of the root node. This attribute is only avaliable for nodes that have been read by the
89
- method "getAllNodes()"! [read]
90
-
91
- Methods
92
- -------
93
-
94
- create : Knora ListNode information object
95
- Creates a new project and returns the information from the project as it is in Knora. Used to create new lists
96
- or append new ListNodes to an existing list. If appending, the attribute "parent" must not be None!
97
-
98
- read : Knora ListNode information object
99
- Read single list node
100
-
101
- update : Knora ListNode information object
102
- Updates the changed attributes and returns the updated information from the ListNode as it is in Knora
103
-
104
- delete : Knora result code
105
- Deletes a ListNode and returns the result code [NOT YET IMPLEMENTED!]
106
-
107
- getAllNodes : ListNode
108
- Get all nodes of a list. The IRI of the root node must be supplied.
109
-
110
- getAllLists [static]:
111
- returns all lists of a given project.
112
-
113
- print : None
114
- Prints the ListNode information to stdout (no recursion for children!)
115
-
116
- """
117
-
118
- _id: Union[str, None]
119
- _project: Union[str, None]
120
- _label: LangString
121
- _comment: LangString
122
- _name: Union[str, None]
123
- _parent: Union[str, None]
124
- _isRootNode: bool
125
- _children: Union[List['ListNode'], None]
126
- _rootNodeIri: Union[str, None]
127
-
128
- def __init__(self,
129
- con: Connection,
130
- id: Optional[str] = None,
131
- project: Optional[Union[Project, str]] = None,
132
- label: LangStringParam = None,
133
- comment: LangStringParam = None,
134
- name: Optional[str] = None,
135
- parent: Optional[Union['ListNode', str]] = None,
136
- isRootNode: Optional[bool] = None,
137
- children: Optional[List['ListNode']] = None,
138
- rootNodeIri: Optional[str] = None):
139
- """
140
- This is the constructor for the ListNode object. For
141
-
142
- CREATE:
143
- * The "con" and at least one "label" are required
144
- READ:
145
- * The "con" and "id" attributes are required
146
- UPDATE:
147
- * Only "label", "comment" and "name" may be changed
148
- DELETE:
149
- * Not yet implemented in the Knora-backend
150
-
151
- :param con: A valid Connection instance with a user logged in that has the appropriate permissions
152
- :param id: IRI of the project [readonly, cannot be modified after creation of instance]
153
- :param project: IRI of project. Only used for the creation of a new list (root node) [write].
154
- :param label: A LangString instance with language depenedent labels. Setting this attributes overwites all entries with the new ones. In order to add/remove a specific entry, use "addLabel" or "rmLabel". At least one label is required [read/write].
155
- :param comment: A LangString instance with language depenedent comments. Setting this attributes overwites all entries with the new ones.In order to add/remove a specific entry, use "addComment" or "rmComment".
156
- :param name: A unique name for the ListNode (unique regarding the whole list) [read/write].
157
- :param parent: Is required and allowed only for the CREATE operation. Otherwise use the "children" attribute [write].
158
- :param isRootNode: Is True if the ListNode is a root node of a list Cannot be set [read].
159
- :param children: Contains a list of children nodes. This attribute is only avaliable for nodes that have been read by the method "getAllNodes()"! [read]
160
- :param rootNodeIri: IRI of the root node. This attribute is only avaliable for nodes that have been read by the method "getAllNodes()"! [read]
161
- """
162
-
163
- super().__init__(con)
164
-
165
- self._project = project.id if isinstance(project, Project) else str(project) if project is not None else None
166
- self._id = str(id) if id is not None else None
167
- self._label = LangString(label)
168
- self._comment = LangString(comment)
169
- self._name = str(name) if name is not None else None
170
- if parent and isinstance(parent, ListNode):
171
- self._parent = parent.id
172
- else:
173
- self._parent = str(parent) if parent else None
174
- self._isRootNode = isRootNode
175
- if children is not None:
176
- if isinstance(children, List) and len(children) > 0 and isinstance(children[0], ListNode):
177
- self._children = children
178
- else:
179
- raise BaseError('Children must be list of ListNodes!')
180
- else:
181
- self._children = None
182
- if not isinstance(rootNodeIri, str) and rootNodeIri is not None:
183
- raise BaseError('rootNodeIri must be a str!')
184
- self._rootNodeIri = rootNodeIri
185
-
186
- #
187
- # Here follows a list of getters/setters
188
- #
189
- @property
190
- def id(self) -> Optional[str]:
191
- return self._id
192
-
193
- @id.setter
194
- def id(self, value: str) -> None:
195
- raise BaseError('ListNode id cannot be modified!')
196
-
197
- @property
198
- def project(self) -> Optional[str]:
199
- return self._project
200
-
201
- @project.setter
202
- def project(self, value: str) -> None:
203
- if self._project:
204
- raise BaseError('Project id cannot be modified!')
205
- else:
206
- self._project = value
207
-
208
- @property
209
- def label(self) -> Optional[LangString]:
210
- return self._label
211
-
212
- @label.setter
213
- def label(self, value: Optional[Union[LangString, str]]) -> None:
214
- self._label = LangString(value)
215
- self._changed.add('label')
216
-
217
- def addLabel(self, lang: Union[Languages, str], value: str) -> None:
218
- """
219
- Add/replace a node label with the given language (executed at next update)
220
-
221
- :param lang: The language the label, either a string "EN", "DE", "FR", "IT" or a Language instance
222
- :param value: The text of the label
223
- :return: None
224
- """
225
-
226
- self._label[lang] = value
227
- self._changed.add('label')
228
-
229
- def rmLabel(self, lang: Union[Languages, str]) -> None:
230
- """
231
- Remove a label from a list node (executed at next update)
232
-
233
- :param lang: The language the label to be removed is in, either a string "EN", "DE", "FR", "IT" or a Language instance
234
- :return: None
235
- """
236
- del self._label[lang]
237
- self._changed.add('label')
238
-
239
- @property
240
- def comment(self) -> Optional[LangString]:
241
- return self._comment
242
-
243
- @comment.setter
244
- def comment(self, value: Optional[Union[LangString, str]]) -> None:
245
- self._comment = LangString(value)
246
- self._changed.add('comment')
247
-
248
- def addComment(self, lang: Union[Languages, str], value: str) -> None:
249
- """
250
- Add/replace a node comment with the given language (executed at next update)
251
-
252
- :param lang: The language the comment, either a string "EN", "DE", "FR", "IT" or a Language instance
253
- :param value: The text of the comment
254
- :return: None
255
- """
256
-
257
- self._comment[lang] = value
258
- self._changed.add('comment')
259
-
260
- def rmComment(self, lang: Union[Languages, str]) -> None:
261
- """
262
- Remove a comment from a list node (executed at next update)
263
-
264
- :param lang: The language the comment to be removed is in, either a string "EN", "DE", "FR", "IT" or a Language instance
265
- :return: None
266
- """
267
- del self._comment[lang]
268
- self._changed.add('comment')
269
-
270
- @property
271
- def name(self) -> Optional[str]:
272
- return self._name
273
-
274
- @name.setter
275
- def name(self, value: str) -> None:
276
- self._name = str(value)
277
- self._changed.add('name')
278
-
279
- @property
280
- def parent(self) -> Optional[str]:
281
- return self._parent if self._parent else None
282
-
283
- @parent.setter
284
- def parent(self, value: Union[str, 'ListNode']):
285
- if isinstance(value, ListNode):
286
- self._parent = value.id
287
- else:
288
- self._parent = value
289
-
290
- @property
291
- def isRootNode(self) -> Optional[bool]:
292
- return self._isRootNode
293
-
294
- @isRootNode.setter
295
- def isRootNode(self, value: bool) -> None:
296
- raise BaseError('Property isRootNode cannot be set!')
297
-
298
- @property
299
- def children(self) -> Optional[List['ListNode']]:
300
- return self._children
301
-
302
- @staticmethod
303
- def __getChildren(con: Connection,
304
- parent_iri: str,
305
- project_iri: str,
306
- children: List[Any]) -> Optional[List['ListNode']]:
307
- """
308
- Internal method! Should not be used directly!
309
-
310
- Static method gets a recursive List of children nodes
311
-
312
- :param con: Valid Connection instance
313
- :param children: json object of children
314
- :return: List of ListNode instances
315
- """
316
- if children:
317
- child_nodes: List[Any] = []
318
- for child in children:
319
-
320
- if 'parentNodeIri' not in child:
321
- child['parentNodeIri'] = parent_iri
322
- if 'projectIri' not in child:
323
- child['projectIri'] = project_iri
324
- child_node = ListNode.fromJsonObj(con, child)
325
- child_nodes.append(child_node)
326
- return child_nodes
327
- else:
328
- return None
329
-
330
- @property
331
- def rootNodeIri(self) -> Optional[str]:
332
- return self._rootNodeIri
333
-
334
- @rootNodeIri.setter
335
- def rootNodeIri(self, value: str):
336
- raise BaseError('rootNodeIri cannot be set!')
337
-
338
- def has_changed(self) -> bool:
339
- if self._changed:
340
- return True
341
- else:
342
- return False
343
-
344
- @classmethod
345
- def fromJsonObj(cls, con: Connection, json_obj: Any) -> Any:
346
- """
347
- Internal method! Should not be used directly!
348
-
349
- This method is used to create a ListNode instance from the JSON data returned by Knora
350
-
351
- :param con: Connection instance
352
- :param json_obj: JSON data returned by Knora as python3 object
353
- :return: ListNode instance
354
- """
355
-
356
- id = json_obj.get('id')
357
- if id is None:
358
- raise BaseError('ListNode id is missing')
359
- project = json_obj.get('projectIri')
360
- label = LangString.fromJsonObj(json_obj.get('labels'))
361
- comment = LangString.fromJsonObj(json_obj.get('comments'))
362
- name = json_obj.get('name')
363
- parent = json_obj.get('parentNodeIri')
364
- isRootNode = json_obj.get('isRootNode')
365
-
366
- child_info = json_obj.get('children')
367
- children = None
368
- if child_info is not None:
369
- children = ListNode.__getChildren(con=con,
370
- parent_iri=id,
371
- project_iri=project,
372
- children=child_info)
373
- rootNodeIri = json_obj.get('hasRootNode')
374
-
375
- return cls(con=con,
376
- id=id,
377
- project=project,
378
- label=label,
379
- comment=comment,
380
- name=name,
381
- parent=parent,
382
- isRootNode=isRootNode,
383
- children=children,
384
- rootNodeIri=rootNodeIri)
385
-
386
- def toJsonObj(self, action: Actions, listIri: str = None) -> Any:
387
- """
388
- Internal method! Should not be used directly!
389
-
390
- Creates a JSON-object from the ListNode instance that can be used to call Knora
391
-
392
- :param action: Action the object is used for (Action.CREATE or Action.UPDATE)
393
- :return: JSON-object
394
- """
395
-
396
- tmp = {}
397
- if action == Actions.Create:
398
- if self._project is None:
399
- raise BaseError("There must be a project id given!")
400
- tmp['projectIri'] = self._project
401
- if self._label.isEmpty():
402
- raise BaseError("There must be a valid ListNode label!")
403
- tmp['labels'] = self._label.toJsonObj()
404
- if not self._comment.isEmpty():
405
- tmp['comments'] = self._comment.toJsonObj()
406
- else:
407
- tmp['comments'] = []
408
- if self._name is not None:
409
- tmp['name'] = self._name
410
- if self._parent is not None:
411
- tmp['parentNodeIri'] = self._parent
412
- elif action == Actions.Update:
413
- if self.id is None:
414
- raise BaseError("There must be a node id given!")
415
- tmp['listIri'] = listIri
416
- if self._project is None:
417
- raise BaseError("There must be a project id given!")
418
- tmp['projectIri'] = self._project
419
- if not self._label.isEmpty() and 'label' in self._changed:
420
- tmp['labels'] = self._label.toJsonObj()
421
- if not self._comment.isEmpty() and 'comment' in self._changed:
422
- tmp['comments'] = self._comment.toJsonObj()
423
- if self._name is not None and 'name' in self._changed:
424
- tmp['name'] = self._name
425
- return tmp
426
-
427
- def create(self) -> 'ListNode':
428
- """
429
- Create a new List in Knora
430
-
431
- :return: JSON-object from Knora
432
- """
433
-
434
- jsonobj = self.toJsonObj(Actions.Create)
435
- jsondata = json.dumps(jsonobj, cls=SetEncoder)
436
- if self._parent is not None:
437
- result = self._con.post('/admin/lists/' + quote_plus(self._parent), jsondata)
438
- return ListNode.fromJsonObj(self._con, result['nodeinfo'])
439
- else:
440
- result = self._con.post('/admin/lists', jsondata)
441
- return ListNode.fromJsonObj(self._con, result['list']['listinfo'])
442
-
443
- def read(self) -> Any:
444
- """
445
- Read a project from Knora
446
-
447
- :return: JSON-object from Knora
448
- """
449
-
450
- result = self._con.get('/admin/lists/nodes/' + quote_plus(self._id))
451
- return self.fromJsonObj(self._con, result['nodeinfo'])
452
-
453
- def update(self) -> Union[Any, None]:
454
- """
455
- Udate the ListNode info in Knora with the modified data in this ListNode instance
456
-
457
- :return: JSON-object from Knora refecting the update
458
- """
459
-
460
- jsonobj = self.toJsonObj(Actions.Update, self.id)
461
- if jsonobj:
462
- jsondata = json.dumps(jsonobj, cls=SetEncoder)
463
- result = self._con.put('/admin/lists/' + quote_plus(self.id), jsondata)
464
- pprint(result)
465
- return ListNode.fromJsonObj(self._con, result['listinfo'])
466
- else:
467
- return None
468
-
469
- def delete(self) -> None:
470
- """
471
- Delete the given ListNode
472
-
473
- :return: Knora response
474
- """
475
- raise BaseError("NOT YET IMPLEMENTED BY KNORA BACKEND!")
476
- result = self._con.delete('/admin/lists/' + quote_plus(self._id))
477
- return result
478
- #return Project.fromJsonObj(self.con, result['project'])
479
-
480
- def getAllNodes(self) -> 'ListNode':
481
- """
482
- Get all nodes of the list. Must be called from a ListNode instance that has at least set the
483
- list iri!
484
-
485
- :return: Root node of list with recursive ListNodes ("children"-attributes)
486
- """
487
-
488
- result = self._con.get('/admin/lists/' + quote_plus(self._id))
489
- if 'list' not in result:
490
- raise BaseError("Request got no list!")
491
- if 'listinfo' not in result['list']:
492
- raise BaseError("Request got no proper list information!")
493
- root = ListNode.fromJsonObj(self._con, result['list']['listinfo'])
494
- if 'children' in result['list']:
495
- root._children = ListNode.__getChildren(con=self._con,
496
- parent_iri=root.id,
497
- project_iri=root.project,
498
- children=result['list']['children'])
499
- return root
500
-
501
- @staticmethod
502
- def getAllLists(con: Connection, project_iri: Optional[str] = None) -> List['ListNode']:
503
- """
504
- Get all lists. If a project IRI is given, it returns the lists of the specified project
505
-
506
- :param con: Connection instance
507
- :param project_iri: Iri/id of project
508
- :return: list of ListNodes
509
- """
510
- if project_iri is None:
511
- result = con.get('/admin/lists')
512
- else:
513
- result = con.get('/admin/lists?projectIri=' + quote_plus(project_iri))
514
- if 'lists' not in result:
515
- raise BaseError("Request got no lists!")
516
- return list(map(lambda a: ListNode.fromJsonObj(con, a), result['lists']))
517
-
518
- def _createDefinitionFileObj(self, children: List["ListNode"]):
519
- """
520
- Create an object that corresponds to the syntax of the input to "create_onto".
521
- Node: This method must be used only internally (for recursion)!!
522
-
523
- :param children: List of children nodes
524
- :return: A python object that can be jsonfied to correspond to the syntax of the input to "create_onto".
525
- """
526
- listnodeobjs = []
527
- for listnode in children:
528
- listnodeobj = {
529
- "name": listnode.name,
530
- "labels": listnode.label.createDefinitionFileObj(),
531
- }
532
- if not listnode.comment.isEmpty():
533
- listnodeobj["comment"] = listnode.comment.createDefinitionFileObj()
534
- if listnode.children:
535
- listnodeobj["nodes"] = self._createDefinitionFileObj(listnode.children)
536
- listnodeobjs.append(listnodeobj)
537
- return listnodeobjs
538
-
539
- def createDefinitionFileObj(self):
540
- """
541
- Create an object that corresponds to the syntax of the input to "create_onto".
542
- :return: A python object that can be jsonfied to correspond to the syntax of the input to "create_onto".
543
- """
544
- listnode = {
545
- "name": self._name,
546
- "labels": self._label.createDefinitionFileObj(),
547
- }
548
- if not self._comment.isEmpty():
549
- listnode["comment"] = self._comment.createDefinitionFileObj()
550
- if self._children:
551
- listnode["nodes"] = self._createDefinitionFileObj(self._children)
552
- return listnode
553
-
554
- def print(self):
555
- """
556
- print info to stdout
557
-
558
- :return: None
559
- """
560
-
561
- print('Node Info:')
562
- print(' Id: {}'.format(self._id))
563
- print(' Project: {}'.format(self._project))
564
- print(' Name: {}'.format(self._name))
565
- print(' Label: ')
566
- if self._label:
567
- for lbl in self._label.items():
568
- print(' {}: {}'.format(lbl[0], lbl[1]))
569
- else:
570
- print(' None')
571
- print(' Comment: ')
572
- if self._comment.isEmpty():
573
- for lbl in self._comment.items():
574
- print(' {}: {}'.format(lbl[0], lbl[1]))
575
- else:
576
- print(' None')
577
- print(' Parent', self._parent)
578
- print(' IsRootNode: {}'.format(self._isRootNode))
@@ -1,20 +0,0 @@
1
- from typing import List, Set, Dict, Tuple, Optional, Any, Union
2
-
3
- from .helpers import Actions, BaseError
4
- from .connection import Connection
5
-
6
- class Model:
7
- _con: Connection
8
- _changed: Set[str]
9
-
10
- def __init__(self, con: Connection):
11
- if not isinstance(con, Connection):
12
- raise BaseError('"con"-parameter must be an instance of Connection')
13
- self._con = con
14
- self._changed = set()
15
-
16
- def has_changed(self) -> bool:
17
- if self._changed:
18
- return True
19
- else:
20
- return False