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,417 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Sequence
4
+ from typing import Any
5
+ from typing import Optional
6
+ from typing import Union
7
+
8
+ import regex
9
+
10
+ from dsp_tools.clients.connection import Connection
11
+ from dsp_tools.commands.get.legacy_models.context import Context
12
+ from dsp_tools.commands.get.legacy_models.helpers import WithId
13
+ from dsp_tools.commands.get.legacy_models.listnode import ListNode
14
+ from dsp_tools.commands.get.legacy_models.model import Model
15
+ from dsp_tools.error.exceptions import BaseError
16
+ from dsp_tools.legacy_models.datetimestamp import DateTimeStamp
17
+ from dsp_tools.legacy_models.langstring import LangString
18
+
19
+
20
+ class PropertyClass(Model):
21
+ ROUTE: str = "/v2/ontologies/properties"
22
+
23
+ _context: Context
24
+ _iri: str
25
+ _name: str
26
+ _ontology_id: str
27
+ _superproperties: list[str]
28
+ _rdf_object: str
29
+ _rdf_subject: str
30
+ _gui_element: str
31
+ _gui_attributes: dict[str, str]
32
+ _label: LangString
33
+ _comment: LangString
34
+ _editable: bool
35
+ _linkvalue: bool
36
+
37
+ def __init__(
38
+ self,
39
+ con: Connection,
40
+ context: Context,
41
+ iri: Optional[str] = None,
42
+ name: Optional[str] = None,
43
+ ontology_id: Optional[str] = None,
44
+ superproperties: Optional[Sequence[Union[PropertyClass, str]]] = None,
45
+ rdf_object: Optional[str] = None,
46
+ rdf_subject: Optional[str] = None,
47
+ gui_element: Optional[str] = None,
48
+ gui_attributes: Optional[dict[str, str]] = None,
49
+ label: Optional[Union[LangString, str]] = None,
50
+ comment: Optional[Union[LangString, str]] = None,
51
+ editable: Optional[bool] = None,
52
+ linkvalue: Optional[bool] = None,
53
+ ):
54
+ super().__init__(con)
55
+ if not isinstance(context, Context):
56
+ raise BaseError('"context"-parameter must be an instance of Context')
57
+ self._context = context
58
+ self._iri = iri
59
+ self._name = name
60
+ self._ontology_id = ontology_id
61
+ if isinstance(superproperties, PropertyClass):
62
+ self._superproperties = list(map(lambda a: a.iri, superproperties))
63
+ else:
64
+ self._superproperties = superproperties
65
+ self._rdf_object = rdf_object
66
+ self._rdf_subject = rdf_subject
67
+ self._gui_element = gui_element
68
+ self._gui_attributes = gui_attributes
69
+
70
+ self._label = PropertyClass._init_process_language_value(label, "label")
71
+ self._comment = PropertyClass._init_process_language_value(comment, "comment")
72
+
73
+ self._editable = editable
74
+ self._linkvalue = linkvalue
75
+
76
+ @staticmethod
77
+ def _init_process_language_value(prop_val: None | str | LangString, property: str) -> LangString:
78
+ if prop_val is not None:
79
+ if isinstance(prop_val, str):
80
+ return LangString(prop_val)
81
+ elif isinstance(prop_val, LangString):
82
+ return prop_val
83
+ else:
84
+ raise BaseError(f"Invalid LangString for {property}!")
85
+ else:
86
+ return LangString({})
87
+
88
+ #
89
+ # Here follows a list of getters/setters
90
+ #
91
+ @property
92
+ def name(self) -> Optional[str]:
93
+ return self._name
94
+
95
+ @property
96
+ def iri(self) -> Optional[str]:
97
+ return self._iri
98
+
99
+ @property
100
+ def ontology_id(self) -> Optional[str]:
101
+ return self._ontology_id
102
+
103
+ @property
104
+ def superproperties(self) -> Optional[list[str]]:
105
+ return self._superproperties
106
+
107
+ @property
108
+ def rdf_object(self) -> Optional[str]:
109
+ return self._rdf_object
110
+
111
+ @property
112
+ def rdf_subject(self) -> Optional[str]:
113
+ return self._rdf_subject
114
+
115
+ @property
116
+ def gui_element(self) -> Optional[str]:
117
+ return self._gui_element
118
+
119
+ @property
120
+ def gui_attributes(self) -> Optional[dict[str, str]]:
121
+ return self._gui_attributes
122
+
123
+ @property
124
+ def label(self) -> LangString:
125
+ return self._label
126
+
127
+ @label.setter
128
+ def label(self, value: Optional[Union[LangString, str]]) -> None:
129
+ if value is None:
130
+ self._label.empty() # clear all labels
131
+ elif isinstance(value, LangString):
132
+ self._label = value
133
+ elif isinstance(value, str):
134
+ self._label = LangString(value)
135
+ else:
136
+ raise BaseError("Not a valid LangString")
137
+ self._changed.add("label")
138
+
139
+ @property
140
+ def comment(self) -> LangString:
141
+ return self._comment
142
+
143
+ @comment.setter
144
+ def comment(self, value: Optional[LangString]) -> None:
145
+ if value is None:
146
+ self._comment.empty() # clear all comments!
147
+ elif isinstance(value, LangString):
148
+ self._comment = value
149
+ elif isinstance(value, str):
150
+ self._comment = LangString(value)
151
+ else:
152
+ raise BaseError("Not a valid LangString")
153
+ self._changed.add("comment")
154
+
155
+ @property
156
+ def editable(self) -> bool:
157
+ return self._editable
158
+
159
+ @property
160
+ def linkvalue(self) -> bool:
161
+ return self._linkvalue
162
+
163
+ @linkvalue.setter
164
+ def linkvalue(self) -> None:
165
+ raise BaseError('"linkvalue" cannot be modified!')
166
+
167
+ @classmethod
168
+ def fromJsonObj(cls, con: Connection, context: Context, json_obj: Any) -> PropertyClass:
169
+ if isinstance(json_obj, list):
170
+ json_obj = json_obj[0]
171
+ rdfs_iri = context.prefix_from_iri("http://www.w3.org/2000/01/rdf-schema#")
172
+ knora_api_iri = context.prefix_from_iri("http://api.knora.org/ontology/knora-api/v2#")
173
+ salsah_gui_iri = context.prefix_from_iri("http://api.knora.org/ontology/salsah-gui/v2#")
174
+
175
+ if not json_obj.get(knora_api_iri + ":isResourceProperty"):
176
+ raise BaseError("This is not a property!")
177
+ if json_obj.get("@id") is None:
178
+ raise BaseError('Property class has no "@id"!')
179
+
180
+ tmp_id = json_obj.get("@id").split(":")
181
+ iri = context.iri_from_prefix(tmp_id[0]) + "#" + tmp_id[1]
182
+ ontology_id = tmp_id[0]
183
+ name = tmp_id[1]
184
+
185
+ rdf_object = WithId(json_obj.get(knora_api_iri + ":objectType")).to_string()
186
+ rdf_subject = WithId(json_obj.get(knora_api_iri + ":subjectType")).to_string()
187
+ label = LangString.fromJsonLdObj(json_obj.get(rdfs_iri + ":label"))
188
+ comment = LangString.fromJsonLdObj(json_obj.get(rdfs_iri + ":comment"))
189
+ editable = json_obj.get(knora_api_iri + ":isEditable")
190
+ linkvalue = json_obj.get(knora_api_iri + ":isLinkProperty")
191
+
192
+ gui_attributes, gui_element = cls._fromJsonObj_get_gui_info(json_obj, salsah_gui_iri)
193
+ superproperties = cls._fromJson_get_superproperties(json_obj, rdfs_iri)
194
+
195
+ return cls(
196
+ con=con,
197
+ context=context,
198
+ iri=iri,
199
+ name=name,
200
+ ontology_id=ontology_id,
201
+ superproperties=superproperties,
202
+ rdf_object=rdf_object,
203
+ rdf_subject=rdf_subject,
204
+ gui_element=gui_element,
205
+ gui_attributes=gui_attributes,
206
+ label=label,
207
+ comment=comment,
208
+ editable=editable,
209
+ linkvalue=linkvalue,
210
+ )
211
+
212
+ @classmethod
213
+ def _fromJson_get_superproperties(cls, json_obj: dict[str, Any], rdfs: str) -> list[str] | None:
214
+ superproperties_obj = json_obj.get(rdfs + ":subPropertyOf")
215
+ if not isinstance(superproperties_obj, list):
216
+ superproperties_obj = [superproperties_obj] # make a list out of it
217
+ if superproperties_obj:
218
+ return [x["@id"] for x in superproperties_obj if x and x.get("@id")]
219
+ else:
220
+ return None
221
+
222
+ @classmethod
223
+ def _fromJsonObj_get_gui_info(cls, json_obj: dict[str, Any], salsah_gui: str) -> tuple[dict[str, str], str]:
224
+ gui_element = None
225
+ if json_obj.get(salsah_gui + ":guiElement") is not None:
226
+ gui_element = WithId(json_obj.get(salsah_gui + ":guiElement")).to_string()
227
+ gui_element = gui_element.replace("Pulldown", "List")
228
+ gui_element = gui_element.replace("Radio", "List")
229
+ gui_attributes_list = json_obj.get(salsah_gui + ":guiAttribute")
230
+ gui_attributes: Union[None, dict[str, str]] = None
231
+ if gui_attributes_list is not None:
232
+ gui_attributes = {}
233
+ if not isinstance(gui_attributes_list, list):
234
+ gui_attributes_list = [gui_attributes_list]
235
+ for ga in gui_attributes_list:
236
+ tmp = ga.split("=")
237
+ if len(tmp) == 1:
238
+ gui_attributes[tmp[0]] = ""
239
+ else:
240
+ gui_attributes[tmp[0]] = tmp[1]
241
+ return gui_attributes, gui_element
242
+
243
+ def _make_full_onto_iri(self) -> tuple[str, str]:
244
+ exp = regex.compile("^http.*") # It is already a full IRI
245
+ if exp.match(self._ontology_id):
246
+ propid = self._context.prefix_from_iri(self._ontology_id) + ":" + self._name
247
+ ontid = self._ontology_id
248
+ else:
249
+ propid = self._ontology_id + ":" + self._name
250
+ ontid = self._context.iri_from_prefix(self._ontology_id)
251
+ return ontid, propid
252
+
253
+ def _resolve_propref(self, resref: str) -> dict[str, str]:
254
+ tmp = resref.split(":")
255
+ if len(tmp) > 1:
256
+ if tmp[0]:
257
+ # return {"@id": resref} # fully qualified name in the form "prefix:name"
258
+ return {
259
+ "@id": self._context.get_qualified_iri(resref)
260
+ } # fully qualified name in the form "prefix:name"
261
+ else:
262
+ return {
263
+ "@id": self._context.prefix_from_iri(self._ontology_id) + ":" + tmp[1]
264
+ } # ":name" in current ontology
265
+ else:
266
+ return {"@id": "knora-api:" + resref} # no ":", must be from knora-api!
267
+
268
+ def create(self, last_modification_date: DateTimeStamp) -> tuple[DateTimeStamp, PropertyClass]:
269
+ jsonobj = self._toJsonObj_create(last_modification_date)
270
+ result = self._con.post(PropertyClass.ROUTE, jsonobj)
271
+ last_modification_date = DateTimeStamp(result["knora-api:lastModificationDate"])
272
+ return last_modification_date, PropertyClass.fromJsonObj(self._con, self._context, result["@graph"])
273
+
274
+ def _toJsonObj_create(self, lastModificationDate: DateTimeStamp) -> dict[str, Any]:
275
+ ontid, propid = self._make_full_onto_iri()
276
+ if self._name is None:
277
+ raise BaseError("There must be a valid property class name!")
278
+ if self._ontology_id is None:
279
+ raise BaseError("There must be a valid ontology_id given!")
280
+ if self._superproperties is None:
281
+ superproperties = [{"@id": "knora-api:hasValue"}]
282
+ else:
283
+ superproperties = list(map(self._resolve_propref, self._superproperties))
284
+ tmp = {
285
+ "@id": ontid, # self._ontology_id,
286
+ "@type": "owl:Ontology",
287
+ "knora-api:lastModificationDate": lastModificationDate.toJsonObj(),
288
+ "@graph": [
289
+ {
290
+ "@id": propid,
291
+ "@type": "owl:ObjectProperty",
292
+ "rdfs:label": self._label.toJsonLdObj(),
293
+ "rdfs:subPropertyOf": superproperties,
294
+ }
295
+ ],
296
+ "@context": self._context.toJsonObj(),
297
+ }
298
+ if self._comment:
299
+ tmp["@graph"][0]["rdfs:comment"] = self._comment.toJsonLdObj()
300
+ if self._rdf_subject:
301
+ tmp["@graph"][0]["knora-api:subjectType"] = self._resolve_propref(self._rdf_subject)
302
+ if self._rdf_object:
303
+ tmp["@graph"][0]["knora-api:objectType"] = self._resolve_propref(self._rdf_object)
304
+ if self._gui_element:
305
+ tmp["@graph"][0]["salsah-gui:guiElement"] = {"@id": self._gui_element}
306
+ if self._gui_attributes:
307
+ ga = list(map(lambda x: x[0] + "=" + str(x[1]), self._gui_attributes.items()))
308
+ tmp["@graph"][0]["salsah-gui:guiAttribute"] = ga
309
+ return tmp
310
+
311
+ def update(self, last_modification_date: DateTimeStamp) -> tuple[DateTimeStamp, PropertyClass]:
312
+ #
313
+ # Note: DSP is able to change only one thing per call, either label or comment!
314
+ #
315
+ result = None
316
+ something_changed = False
317
+ if "label" in self._changed:
318
+ jsonobj = self._toJsonObj_update(last_modification_date, "label")
319
+ result = self._con.put(PropertyClass.ROUTE, jsonobj)
320
+ last_modification_date = DateTimeStamp(result["knora-api:lastModificationDate"])
321
+ something_changed = True
322
+ if "comment" in self._changed:
323
+ jsonobj = self._toJsonObj_update(last_modification_date, "comment")
324
+ result = self._con.put(PropertyClass.ROUTE, jsonobj)
325
+ last_modification_date = DateTimeStamp(result["knora-api:lastModificationDate"])
326
+ something_changed = True
327
+ if something_changed:
328
+ return last_modification_date, PropertyClass.fromJsonObj(self._con, self._context, result["@graph"])
329
+ else:
330
+ return last_modification_date, self
331
+
332
+ def _toJsonObj_update(self, lastModificationDate: DateTimeStamp, what_changed: str) -> dict[str, Any]:
333
+ ontid, propid = self._make_full_onto_iri()
334
+ tmp = {
335
+ "@id": ontid, # self._ontology_id,
336
+ "@type": "owl:Ontology",
337
+ "knora-api:lastModificationDate": lastModificationDate.toJsonObj(),
338
+ "@graph": [
339
+ {
340
+ "@id": propid,
341
+ "@type": "owl:ObjectProperty",
342
+ }
343
+ ],
344
+ "@context": self._context.toJsonObj(),
345
+ }
346
+ if what_changed == "label":
347
+ if not self._label.isEmpty() and "label" in self._changed:
348
+ tmp["@graph"][0]["rdfs:label"] = self._label.toJsonLdObj()
349
+ if what_changed == "comment":
350
+ if not self._comment.isEmpty() and "comment" in self._changed:
351
+ tmp["@graph"][0]["rdfs:comment"] = self._comment.toJsonLdObj()
352
+ return tmp
353
+
354
+ def createDefinitionFileObj(self, context: Context, shortname: str) -> dict[str, Any]:
355
+ """
356
+ Create an object that can be used as input for `create_onto()` to create an ontology on a DSP server
357
+
358
+ :param context: Context of the ontology
359
+ :param shortname: Shortname of the ontology
360
+ :return: Python object to be jsonfied
361
+ """
362
+ def_file_obj = {"name": self.name}
363
+ if self.rdf_object:
364
+ def_file_obj["name"] = self.name
365
+ if self.superproperties:
366
+ superprops = []
367
+ for sc in self.superproperties:
368
+ superprops.append(context.reduce_iri(sc, shortname))
369
+ def_file_obj["super"] = superprops
370
+ if self.rdf_subject:
371
+ def_file_obj["subject"] = context.reduce_iri(self.rdf_subject, shortname)
372
+ if self.rdf_object:
373
+ def_file_obj["object"] = context.reduce_iri(self.rdf_object, shortname)
374
+ if not self.label.isEmpty():
375
+ def_file_obj["labels"] = self.label.createDefinitionFileObj()
376
+ if not self.comment.isEmpty():
377
+ def_file_obj["comments"] = self.comment.createDefinitionFileObj()
378
+ if self.gui_element:
379
+ def_file_obj["gui_element"] = context.reduce_iri(self.gui_element, shortname)
380
+ if self.gui_attributes:
381
+ gui_elements = self._createDefinitionFileObj_gui_attributes()
382
+ def_file_obj["gui_attributes"] = gui_elements
383
+ return def_file_obj
384
+
385
+ def _createDefinitionFileObj_gui_attributes(self) -> dict[str, Any]: # noqa: PLR0912 (too many branches)
386
+ gui_elements = {}
387
+ for attname, attvalue in self.gui_attributes.items():
388
+ match attname:
389
+ case "size":
390
+ gui_elements[attname] = int(attvalue)
391
+ case "maxlength":
392
+ gui_elements[attname] = int(attvalue)
393
+ case "maxsize":
394
+ gui_elements[attname] = int(attvalue)
395
+ case "hlist":
396
+ iri = attvalue[1:-1]
397
+ rootnode = ListNode(con=self._con, iri=iri).read()
398
+ gui_elements[attname] = rootnode.name
399
+ case "numprops":
400
+ gui_elements[attname] = int(attvalue)
401
+ case "ncolors":
402
+ gui_elements[attname] = int(attvalue)
403
+ case "cols":
404
+ gui_elements[attname] = int(attvalue)
405
+ case "rows":
406
+ gui_elements[attname] = int(attvalue)
407
+ case "width":
408
+ gui_elements[attname] = str(attvalue)
409
+ case "wrap":
410
+ gui_elements[attname] = str(attvalue)
411
+ case "max":
412
+ gui_elements[attname] = float(attvalue)
413
+ case "min":
414
+ gui_elements[attname] = float(attvalue)
415
+ case _:
416
+ gui_elements[attname] = str(attvalue)
417
+ return gui_elements