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
File without changes
@@ -0,0 +1,172 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Collection
4
+ from dataclasses import dataclass
5
+ from pathlib import Path
6
+ from typing import Protocol
7
+
8
+ from dsp_tools.error.xmllib_warnings import MessageInfo
9
+ from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_type_mismatch_warning
10
+ from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_warning
11
+ from dsp_tools.utils.data_formats.uri_util import is_iiif_uri
12
+ from dsp_tools.xmllib.internal.checkers import check_and_warn_if_a_string_contains_a_potentially_empty_value
13
+ from dsp_tools.xmllib.internal.checkers import check_and_warn_potentially_empty_string
14
+ from dsp_tools.xmllib.internal.checkers import is_nonempty_value_internal
15
+ from dsp_tools.xmllib.internal.input_converters import check_and_fix_collection_input
16
+ from dsp_tools.xmllib.internal.input_converters import check_and_fix_is_non_empty_string
17
+ from dsp_tools.xmllib.models.licenses.recommended import License
18
+ from dsp_tools.xmllib.models.permissions import Permissions
19
+
20
+
21
+ @dataclass
22
+ class AuthorshipLookup:
23
+ lookup: dict[tuple[str, ...], str]
24
+
25
+ def get_id(self, authors: tuple[str, ...] | None) -> str | None:
26
+ if authors is None:
27
+ return None
28
+ if not (found := self.lookup.get(authors)):
29
+ emit_xmllib_input_warning(MessageInfo(f"The input authors {authors} are not defined in the look-up."))
30
+ return " / ".join([str(x) for x in authors])
31
+ return found
32
+
33
+
34
+ @dataclass
35
+ class Metadata:
36
+ license: License | None
37
+ copyright_holder: str | None
38
+ authorship: tuple[str, ...] | None
39
+ permissions: Permissions
40
+
41
+ @classmethod
42
+ def new(
43
+ cls,
44
+ license: License | None,
45
+ copyright_holder: str | None,
46
+ authorship: Collection[str] | None,
47
+ permissions: Permissions | str,
48
+ resource_id: str,
49
+ ) -> Metadata:
50
+ lic_ = license
51
+ if license is not None and not isinstance(license, License):
52
+ emit_xmllib_input_type_mismatch_warning(
53
+ expected_type="xmllib.License",
54
+ value=license,
55
+ res_id=resource_id,
56
+ value_field="license (bistream/iiif-uri)",
57
+ )
58
+ lic_ = None
59
+ if isinstance(permissions, Permissions):
60
+ pass
61
+ elif is_nonempty_value_internal(permissions):
62
+ permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
63
+ else:
64
+ emit_xmllib_input_type_mismatch_warning(
65
+ expected_type="xmllib.Permissions",
66
+ value=permissions,
67
+ res_id=resource_id,
68
+ value_field="permissions (bistream/iiif-uri)",
69
+ )
70
+ permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
71
+ if copyright_holder is not None:
72
+ copyright_holder = check_and_fix_is_non_empty_string(
73
+ value=copyright_holder,
74
+ res_id=resource_id,
75
+ value_field="copyright_holder (bistream/iiif-uri)",
76
+ )
77
+ if authorship is not None:
78
+ if not is_nonempty_value_internal(authorship):
79
+ emit_xmllib_input_type_mismatch_warning(
80
+ expected_type="list of authorship strings",
81
+ value=authorship,
82
+ res_id=resource_id,
83
+ value_field="authorship (bistream/iiif-uri)",
84
+ )
85
+ authors = None
86
+ else:
87
+ fixed_authors = set(
88
+ check_and_fix_collection_input(authorship, "authorship (bistream/iiif-uri)", resource_id)
89
+ )
90
+ fixed_authors_list = [
91
+ check_and_fix_is_non_empty_string(
92
+ value=x,
93
+ res_id=resource_id,
94
+ value_field="authorship (bistream/iiif-uri)",
95
+ )
96
+ for x in fixed_authors
97
+ ]
98
+ authors = tuple(sorted(fixed_authors_list))
99
+ if len(authors) == 0:
100
+ authors = None
101
+ else:
102
+ authors = None
103
+ return cls(
104
+ license=lic_,
105
+ copyright_holder=copyright_holder,
106
+ authorship=authors,
107
+ permissions=permissions,
108
+ )
109
+
110
+
111
+ class AbstractFileValue(Protocol):
112
+ value: str
113
+ metadata: Metadata
114
+ comment: str | None
115
+
116
+
117
+ @dataclass
118
+ class FileValue(AbstractFileValue):
119
+ value: str
120
+ metadata: Metadata
121
+ comment: str | None
122
+
123
+ @classmethod
124
+ def new(cls, value: str | Path, metadata: Metadata, comment: str | None, resource_id: str) -> FileValue:
125
+ if isinstance(value, Path):
126
+ if str(value) == ".":
127
+ value = ""
128
+ else:
129
+ value = str(value)
130
+ check_and_warn_potentially_empty_string(
131
+ value=value,
132
+ res_id=resource_id,
133
+ expected="file name",
134
+ field="bitstream",
135
+ )
136
+ if is_nonempty_value_internal(comment):
137
+ fixed_comment = str(comment)
138
+ check_and_warn_if_a_string_contains_a_potentially_empty_value(
139
+ value=comment,
140
+ res_id=resource_id,
141
+ field="comment on bitstream",
142
+ )
143
+ else:
144
+ fixed_comment = None
145
+ return cls(value=str(value), metadata=metadata, comment=fixed_comment)
146
+
147
+
148
+ @dataclass
149
+ class IIIFUri(AbstractFileValue):
150
+ value: str
151
+ metadata: Metadata
152
+ comment: str | None
153
+
154
+ @classmethod
155
+ def new(cls, value: str, metadata: Metadata, comment: str | None, resource_id: str) -> IIIFUri:
156
+ v = str(value)
157
+ if not is_iiif_uri(v):
158
+ emit_xmllib_input_type_mismatch_warning(
159
+ expected_type="IIIF uri",
160
+ value=value,
161
+ res_id=resource_id,
162
+ )
163
+ if is_nonempty_value_internal(comment):
164
+ fixed_comment = str(comment)
165
+ check_and_warn_if_a_string_contains_a_potentially_empty_value(
166
+ value=comment,
167
+ res_id=resource_id,
168
+ field="comment on iiif-uri",
169
+ )
170
+ else:
171
+ fixed_comment = None
172
+ return cls(value=v, metadata=metadata, comment=fixed_comment)
@@ -0,0 +1,162 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from dataclasses import dataclass
5
+ from typing import Protocol
6
+
7
+ from dsp_tools.error.xmllib_warnings import MessageInfo
8
+ from dsp_tools.error.xmllib_warnings_util import raise_xmllib_input_error
9
+ from dsp_tools.xmllib.value_checkers import is_color
10
+ from dsp_tools.xmllib.value_checkers import is_decimal
11
+
12
+
13
+ @dataclass
14
+ class GeometryShape(Protocol):
15
+ color: str
16
+
17
+ def to_json_string(self) -> str: ...
18
+
19
+
20
+ @dataclass
21
+ class Rectangle(GeometryShape):
22
+ point1: GeometryPoint
23
+ point2: GeometryPoint
24
+ line_width: float
25
+ color: str
26
+ active: bool
27
+ resource_id: str
28
+
29
+ def __post_init__(self) -> None:
30
+ _check_warn_shape_info(self.color, self.line_width, self.resource_id)
31
+
32
+ def to_json_string(self) -> str:
33
+ json_dict = {
34
+ "status": "active" if self.active else "deleted",
35
+ "type": "rectangle",
36
+ "lineWidth": self.line_width,
37
+ "points": [self.point1.to_dict(), self.point2.to_dict()],
38
+ }
39
+ return json.dumps(json_dict)
40
+
41
+
42
+ @dataclass
43
+ class Polygon(GeometryShape):
44
+ points: list[GeometryPoint]
45
+ line_width: float
46
+ color: str
47
+ active: bool
48
+ resource_id: str
49
+
50
+ def __post_init__(self) -> None:
51
+ _check_warn_shape_info(self.color, self.line_width, self.resource_id)
52
+ if len(self.points) < 3:
53
+ msg = (
54
+ "The region shape is a polygon. Polygons should have at least 3 points. "
55
+ "If you would like to display a rectangle we recommend to use the designated rectangle shape."
56
+ )
57
+ raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
58
+
59
+ def to_json_string(self) -> str:
60
+ json_dict = {
61
+ "status": "active" if self.active else "deleted",
62
+ "type": "polygon",
63
+ "lineWidth": self.line_width,
64
+ "points": [x.to_dict() for x in self.points],
65
+ }
66
+ return json.dumps(json_dict)
67
+
68
+
69
+ @dataclass
70
+ class Circle(GeometryShape):
71
+ center: GeometryPoint
72
+ radius: Vector
73
+ line_width: float
74
+ color: str
75
+ active: bool
76
+ resource_id: str
77
+
78
+ def __post_init__(self) -> None:
79
+ _check_warn_shape_info(self.color, self.line_width, self.resource_id)
80
+
81
+ def to_json_string(self) -> str:
82
+ json_dict = {
83
+ "status": "active" if self.active else "deleted",
84
+ "type": "circle",
85
+ "lineWidth": self.line_width,
86
+ "points": [self.center.to_dict()],
87
+ "radius": self.radius.to_dict(),
88
+ }
89
+ return json.dumps(json_dict)
90
+
91
+
92
+ @dataclass
93
+ class GeometryPoint:
94
+ x: float
95
+ y: float
96
+ resource_id: str
97
+
98
+ def __post_init__(self) -> None:
99
+ if not all([is_decimal(self.x), is_decimal(self.y)]):
100
+ msg = f"The entered geometry points are not floats. x: '{self.x}', y: '{self.y}'"
101
+ raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
102
+
103
+ else:
104
+ info = []
105
+ if not 0 <= float(self.x) <= 1:
106
+ info.append(f"x: '{self.x}'")
107
+ if not 0 <= float(self.y) <= 1:
108
+ info.append(f"y: '{self.y}'")
109
+ if info:
110
+ msg = (
111
+ f"The geometry points must be larger/equal 0 and smaller/equal 1. "
112
+ f"The following points are not valid: {', '.join(info)}"
113
+ )
114
+ raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
115
+ self.x = float(self.x)
116
+ self.y = float(self.y)
117
+
118
+ def to_dict(self) -> dict[str, float]:
119
+ return {"x": self.x, "y": self.y}
120
+
121
+
122
+ @dataclass
123
+ class Vector:
124
+ x: float
125
+ y: float
126
+ resource_id: str
127
+
128
+ def __post_init__(self) -> None:
129
+ if not all([is_decimal(self.x), is_decimal(self.y)]):
130
+ msg = f"The radius vector are not floats. x: '{self.x}', y: '{self.y}'"
131
+ raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
132
+ else:
133
+ info = []
134
+ if not 0 <= float(self.x) <= 1:
135
+ info.append(f"x: '{self.x}'")
136
+ if not 0 <= float(self.y) <= 1:
137
+ info.append(f"y: '{self.y}'")
138
+ if info:
139
+ msg = (
140
+ f"The radius vector must be larger/equal 0 and smaller/equal 1. "
141
+ f"The following values are not valid: {', '.join(info)}"
142
+ )
143
+ raise_xmllib_input_error(MessageInfo(msg, self.resource_id))
144
+ self.x = float(self.x)
145
+ self.y = float(self.y)
146
+
147
+ def to_dict(self) -> dict[str, float]:
148
+ return {"x": self.x, "y": self.y}
149
+
150
+
151
+ def _check_warn_shape_info(color: str, line_width: float, res_id: str) -> None:
152
+ problems = []
153
+ line_msg = f"The line width must be a number between 1-5. The provided value is not valid: {line_width}"
154
+ if not is_decimal(line_width):
155
+ problems.append(line_msg)
156
+ elif not 0 < int(line_width) <= 5:
157
+ problems.append(line_msg)
158
+ if not is_color(color):
159
+ problems.append(f"The color must be a valid hexadecimal color. The provided value is not valid: {color}")
160
+ if problems:
161
+ msg = f"Some of the shape values are not valid: \n- {'\n- '.join(problems)}"
162
+ raise_xmllib_input_error(MessageInfo(msg, res_id))
@@ -0,0 +1,55 @@
1
+ from dataclasses import dataclass
2
+
3
+ from typing_extensions import deprecated
4
+
5
+ from dsp_tools.error.xmllib_warnings import MessageInfo
6
+ from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_warning
7
+ from dsp_tools.xmllib.value_checkers import is_dsp_ark
8
+ from dsp_tools.xmllib.value_checkers import is_dsp_iri
9
+ from dsp_tools.xmllib.value_checkers import is_timestamp
10
+
11
+ LIST_SEPARATOR = "\n - "
12
+
13
+
14
+ @dataclass
15
+ class MigrationMetadata:
16
+ """
17
+ Metadata originating from a SALSAH migration.
18
+ This will be deprecated in the future when all projects are migrated.
19
+ """
20
+
21
+ creation_date: str | None
22
+ iri: str | None
23
+ ark: str | None
24
+ res_id: str
25
+
26
+ @deprecated("This is for salsah migration only and will be deleted in future releases.")
27
+ def __post_init__(self) -> None:
28
+ msg_list = []
29
+ if self.creation_date and not is_timestamp(self.creation_date):
30
+ msg_list.append(f"The value for creation date is not a valid timestamp: {self.creation_date}")
31
+ self.creation_date = str(self.creation_date)
32
+ if self.iri and not is_dsp_iri(self.iri):
33
+ msg_list.append(f"The provided IRI is not valid: {self.iri}")
34
+ self.creation_date = str(self.creation_date)
35
+ if self.ark and not is_dsp_ark(self.ark):
36
+ msg_list.append(f"The provided ARK is not valid: {self.ark}")
37
+ self.ark = str(self.ark)
38
+ if msg_list:
39
+ msg = f"The migration metadata has the following problem(s):{LIST_SEPARATOR}{LIST_SEPARATOR.join(msg_list)}"
40
+ emit_xmllib_input_warning(MessageInfo(msg, self.res_id))
41
+
42
+ def as_attrib(self) -> dict[str, str]:
43
+ attrib_dict = {}
44
+ if self.creation_date:
45
+ attrib_dict["creation_date"] = self.creation_date
46
+ if self.iri:
47
+ attrib_dict["iri"] = self.iri
48
+ if self.ark:
49
+ attrib_dict["ark"] = self.ark
50
+ if not attrib_dict:
51
+ msg = (
52
+ "The migration metadata of the resource does not contain any values. Please check if an error occurred."
53
+ )
54
+ emit_xmllib_input_warning(MessageInfo(msg, self.res_id))
55
+ return attrib_dict
@@ -0,0 +1,66 @@
1
+ from enum import Enum
2
+
3
+ from lxml import etree
4
+
5
+ from dsp_tools.xmllib.internal.constants import DASCH_SCHEMA
6
+ from dsp_tools.xmllib.internal.constants import XML_NAMESPACE_MAP
7
+
8
+
9
+ class PermissionTypes(Enum):
10
+ RV = "RV"
11
+ V = "V"
12
+ D = "D"
13
+ CR = "CR"
14
+
15
+
16
+ PUBLIC = {
17
+ "UnknownUser": PermissionTypes.V,
18
+ "KnownUser": PermissionTypes.V,
19
+ "ProjectMember": PermissionTypes.D,
20
+ "ProjectAdmin": PermissionTypes.CR,
21
+ }
22
+
23
+ PRIVATE = {
24
+ "ProjectMember": PermissionTypes.D,
25
+ "ProjectAdmin": PermissionTypes.CR,
26
+ }
27
+
28
+ LIMITED_VIEW = {
29
+ "UnknownUser": PermissionTypes.RV,
30
+ "KnownUser": PermissionTypes.RV,
31
+ "ProjectMember": PermissionTypes.D,
32
+ "ProjectAdmin": PermissionTypes.CR,
33
+ }
34
+
35
+
36
+ class XMLPermissions:
37
+ def serialise(self, contains_old_permissions: bool, contains_new_permissions: bool = True) -> list[etree._Element]:
38
+ new_perms = [
39
+ self._serialise_one_permission_element("public", PUBLIC),
40
+ self._serialise_one_permission_element("private", PRIVATE),
41
+ self._serialise_one_permission_element("limited_view", LIMITED_VIEW),
42
+ ]
43
+ old_perms = [
44
+ self._serialise_one_permission_element("open", PUBLIC),
45
+ self._serialise_one_permission_element("restricted", PRIVATE),
46
+ self._serialise_one_permission_element("restricted-view", LIMITED_VIEW),
47
+ ]
48
+ res = []
49
+ if contains_new_permissions:
50
+ res.extend(new_perms)
51
+ if contains_old_permissions:
52
+ res.extend(old_perms)
53
+ return res
54
+
55
+ def _serialise_one_permission_element(
56
+ self, permission_name: str, groups: dict[str, PermissionTypes]
57
+ ) -> etree._Element:
58
+ ele = etree.Element(f"{DASCH_SCHEMA}permissions", attrib={"id": permission_name}, nsmap=XML_NAMESPACE_MAP)
59
+ allows = [self._serialise_one_allow(g, name) for g, name in groups.items()]
60
+ ele.extend(allows)
61
+ return ele
62
+
63
+ def _serialise_one_allow(self, group: str, tag_text: PermissionTypes) -> etree._Element:
64
+ ele = etree.Element(f"{DASCH_SCHEMA}allow", attrib={"group": group}, nsmap=XML_NAMESPACE_MAP)
65
+ ele.text = tag_text.value
66
+ return ele