dsp-tools 9.1.0.post11__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 (316) hide show
  1. dsp_tools/__init__.py +4 -0
  2. dsp_tools/cli/args.py +36 -0
  3. dsp_tools/cli/call_action.py +51 -231
  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 +156 -58
  7. dsp_tools/cli/entry_point.py +56 -26
  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/{utils → clients}/connection.py +2 -18
  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 +57 -23
  58. dsp_tools/commands/excel2json/{new_lists → lists}/compliance_checks.py +26 -26
  59. dsp_tools/commands/excel2json/{new_lists/make_new_lists.py → lists/make_lists.py} +19 -18
  60. dsp_tools/commands/excel2json/{new_lists → lists}/models/input_error.py +1 -12
  61. dsp_tools/commands/excel2json/{new_lists → lists}/models/serialise.py +9 -5
  62. dsp_tools/commands/excel2json/{new_lists → lists}/utils.py +4 -4
  63. dsp_tools/commands/excel2json/models/input_error.py +31 -11
  64. dsp_tools/commands/excel2json/models/json_header.py +53 -15
  65. dsp_tools/commands/excel2json/models/ontology.py +4 -3
  66. dsp_tools/commands/excel2json/{lists.py → old_lists.py} +26 -112
  67. dsp_tools/commands/excel2json/project.py +78 -34
  68. dsp_tools/commands/excel2json/properties.py +57 -36
  69. dsp_tools/commands/excel2json/resources.py +32 -12
  70. dsp_tools/commands/excel2json/utils.py +20 -1
  71. dsp_tools/commands/excel2xml/__init__.py +2 -2
  72. dsp_tools/commands/excel2xml/excel2xml_cli.py +7 -15
  73. dsp_tools/commands/excel2xml/excel2xml_lib.py +138 -493
  74. dsp_tools/commands/excel2xml/propertyelement.py +5 -5
  75. dsp_tools/commands/{project → get}/get.py +29 -13
  76. dsp_tools/commands/get/get_permissions.py +257 -0
  77. dsp_tools/commands/get/get_permissions_legacy.py +89 -0
  78. dsp_tools/commands/{project/models → get/legacy_models}/context.py +6 -6
  79. dsp_tools/commands/{project/models → get/legacy_models}/group.py +5 -10
  80. dsp_tools/commands/{project/models → get/legacy_models}/listnode.py +5 -35
  81. dsp_tools/commands/{project/models → get/legacy_models}/model.py +1 -1
  82. dsp_tools/commands/{project/models → get/legacy_models}/ontology.py +9 -14
  83. dsp_tools/commands/{project/models → get/legacy_models}/project.py +13 -6
  84. dsp_tools/commands/{project/models → get/legacy_models}/propertyclass.py +9 -16
  85. dsp_tools/commands/{project/models → get/legacy_models}/resourceclass.py +8 -46
  86. dsp_tools/commands/{project/models → get/legacy_models}/user.py +19 -60
  87. dsp_tools/commands/get/models/permissions_models.py +10 -0
  88. dsp_tools/commands/id2iri.py +20 -10
  89. dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +81 -56
  90. dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +4 -10
  91. dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +97 -37
  92. dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +2 -2
  93. dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +9 -10
  94. dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +3 -3
  95. dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +2 -10
  96. dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +12 -2
  97. dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +8 -9
  98. dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +18 -18
  99. dsp_tools/commands/start_stack.py +126 -77
  100. dsp_tools/commands/update_legal/CLAUDE.md +344 -0
  101. dsp_tools/commands/update_legal/__init__.py +0 -0
  102. dsp_tools/commands/update_legal/core.py +182 -0
  103. dsp_tools/commands/update_legal/csv_operations.py +135 -0
  104. dsp_tools/commands/update_legal/models.py +87 -0
  105. dsp_tools/commands/update_legal/xml_operations.py +247 -0
  106. dsp_tools/commands/validate_data/CLAUDE.md +159 -0
  107. dsp_tools/commands/validate_data/__init__.py +0 -0
  108. dsp_tools/commands/validate_data/constants.py +59 -0
  109. dsp_tools/commands/validate_data/mappers.py +143 -0
  110. dsp_tools/commands/validate_data/models/__init__.py +0 -0
  111. dsp_tools/commands/validate_data/models/api_responses.py +45 -0
  112. dsp_tools/commands/validate_data/models/input_problems.py +119 -0
  113. dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
  114. dsp_tools/commands/validate_data/models/validation.py +106 -0
  115. dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
  116. dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
  117. dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
  118. dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
  119. dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
  120. dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
  121. dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
  122. dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
  123. dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
  124. dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
  125. dsp_tools/commands/{xml_validate/sparql/resource_shacl.py → validate_data/sparql/cardinality_shacl.py} +45 -47
  126. dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
  127. dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
  128. dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
  129. dsp_tools/commands/validate_data/utils.py +59 -0
  130. dsp_tools/commands/validate_data/validate_data.py +283 -0
  131. dsp_tools/commands/validate_data/validation/__init__.py +0 -0
  132. dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
  133. dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
  134. dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
  135. dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
  136. dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
  137. dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
  138. dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
  139. dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
  140. dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
  141. dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
  142. dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
  143. dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
  144. dsp_tools/commands/xmlupload/models/formatted_text_value.py +0 -25
  145. dsp_tools/commands/xmlupload/models/ingest.py +56 -70
  146. dsp_tools/commands/xmlupload/models/input_problems.py +6 -14
  147. dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
  148. dsp_tools/commands/xmlupload/models/permission.py +0 -39
  149. dsp_tools/commands/xmlupload/models/{deserialise/xmlpermission.py → permissions_parsed.py} +2 -2
  150. dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
  151. dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
  152. dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
  153. dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
  154. dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
  155. dsp_tools/commands/xmlupload/models/upload_clients.py +3 -3
  156. dsp_tools/commands/xmlupload/models/upload_state.py +2 -4
  157. dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
  158. dsp_tools/commands/xmlupload/{ark2iri.py → prepare_xml_input/ark2iri.py} +1 -1
  159. dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
  160. dsp_tools/commands/xmlupload/{iiif_uri_validator.py → prepare_xml_input/iiif_uri_validator.py} +2 -14
  161. dsp_tools/commands/xmlupload/{list_client.py → prepare_xml_input/list_client.py} +15 -10
  162. dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
  163. dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
  164. dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
  165. dsp_tools/commands/xmlupload/resource_create_client.py +7 -468
  166. dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
  167. dsp_tools/commands/xmlupload/stash/{construct_and_analyze_graph.py → analyse_circular_reference_graph.py} +64 -157
  168. dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
  169. dsp_tools/commands/xmlupload/stash/graph_models.py +13 -8
  170. dsp_tools/commands/xmlupload/stash/stash_circular_references.py +48 -115
  171. dsp_tools/commands/xmlupload/stash/stash_models.py +4 -9
  172. dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +34 -40
  173. dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +98 -108
  174. dsp_tools/commands/xmlupload/upload_config.py +8 -0
  175. dsp_tools/commands/xmlupload/write_diagnostic_info.py +14 -9
  176. dsp_tools/commands/xmlupload/xmlupload.py +214 -192
  177. dsp_tools/config/__init__.py +0 -0
  178. dsp_tools/config/logger_config.py +69 -0
  179. dsp_tools/{utils → config}/warnings_config.py +4 -1
  180. dsp_tools/error/__init__.py +0 -0
  181. dsp_tools/error/custom_warnings.py +39 -0
  182. dsp_tools/error/exceptions.py +204 -0
  183. dsp_tools/error/problems.py +10 -0
  184. dsp_tools/error/xmllib_errors.py +20 -0
  185. dsp_tools/error/xmllib_warnings.py +54 -0
  186. dsp_tools/error/xmllib_warnings_util.py +159 -0
  187. dsp_tools/error/xsd_validation_error_msg.py +19 -0
  188. dsp_tools/legacy_models/__init__.py +0 -0
  189. dsp_tools/{models → legacy_models}/datetimestamp.py +7 -7
  190. dsp_tools/{models → legacy_models}/langstring.py +1 -1
  191. dsp_tools/{models → legacy_models}/projectContext.py +4 -4
  192. dsp_tools/resources/schema/data.xsd +108 -83
  193. dsp_tools/resources/schema/lists-only.json +4 -23
  194. dsp_tools/resources/schema/project.json +80 -35
  195. dsp_tools/resources/schema/properties-only.json +1 -4
  196. dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
  197. dsp_tools/resources/start-stack/docker-compose.yml +34 -30
  198. dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
  199. dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
  200. dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
  201. dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
  202. dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
  203. dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
  204. dsp_tools/utils/ansi_colors.py +32 -0
  205. dsp_tools/utils/data_formats/__init__.py +0 -0
  206. dsp_tools/utils/{date_util.py → data_formats/date_util.py} +13 -1
  207. dsp_tools/utils/data_formats/iri_util.py +30 -0
  208. dsp_tools/utils/{shared.py → data_formats/shared.py} +1 -35
  209. dsp_tools/utils/{uri_util.py → data_formats/uri_util.py} +12 -2
  210. dsp_tools/utils/fuseki_bloating.py +63 -0
  211. dsp_tools/utils/json_parsing.py +22 -0
  212. dsp_tools/utils/rdf_constants.py +42 -0
  213. dsp_tools/utils/rdflib_utils.py +10 -0
  214. dsp_tools/utils/replace_id_with_iri.py +66 -0
  215. dsp_tools/utils/request_utils.py +238 -0
  216. dsp_tools/utils/xml_parsing/__init__.py +0 -0
  217. dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
  218. dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
  219. dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
  220. dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
  221. dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
  222. dsp_tools/xmllib/CLAUDE.md +302 -0
  223. dsp_tools/xmllib/__init__.py +49 -0
  224. dsp_tools/xmllib/general_functions.py +877 -0
  225. dsp_tools/xmllib/internal/__init__.py +0 -0
  226. dsp_tools/xmllib/internal/checkers.py +162 -0
  227. dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
  228. dsp_tools/xmllib/internal/constants.py +46 -0
  229. dsp_tools/xmllib/internal/input_converters.py +155 -0
  230. dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
  231. dsp_tools/xmllib/internal/serialise_resource.py +177 -0
  232. dsp_tools/xmllib/internal/serialise_values.py +152 -0
  233. dsp_tools/xmllib/internal/type_aliases.py +11 -0
  234. dsp_tools/xmllib/models/config_options.py +28 -0
  235. dsp_tools/xmllib/models/date_formats.py +48 -0
  236. dsp_tools/xmllib/models/dsp_base_resources.py +1380 -400
  237. dsp_tools/xmllib/models/internal/__init__.py +0 -0
  238. dsp_tools/xmllib/models/internal/file_values.py +172 -0
  239. dsp_tools/xmllib/models/internal/geometry.py +162 -0
  240. dsp_tools/xmllib/models/{migration_metadata.py → internal/migration_metadata.py} +14 -10
  241. dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
  242. dsp_tools/xmllib/models/internal/values.py +342 -0
  243. dsp_tools/xmllib/models/licenses/__init__.py +0 -0
  244. dsp_tools/xmllib/models/licenses/other.py +59 -0
  245. dsp_tools/xmllib/models/licenses/recommended.py +107 -0
  246. dsp_tools/xmllib/models/permissions.py +41 -0
  247. dsp_tools/xmllib/models/res.py +1782 -0
  248. dsp_tools/xmllib/models/root.py +313 -26
  249. dsp_tools/xmllib/value_checkers.py +310 -47
  250. dsp_tools/xmllib/value_converters.py +765 -8
  251. dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
  252. dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
  253. dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
  254. {dsp_tools-9.1.0.post11.dist-info → dsp_tools-18.3.0.post13.dist-info}/entry_points.txt +1 -0
  255. dsp_tools/commands/project/create/project_create.py +0 -1107
  256. dsp_tools/commands/project/create/project_create_lists.py +0 -204
  257. dsp_tools/commands/project/create/project_validate.py +0 -453
  258. dsp_tools/commands/project/models/project_definition.py +0 -12
  259. dsp_tools/commands/rosetta.py +0 -124
  260. dsp_tools/commands/template.py +0 -30
  261. dsp_tools/commands/xml_validate/api_connection.py +0 -122
  262. dsp_tools/commands/xml_validate/deserialise_input.py +0 -135
  263. dsp_tools/commands/xml_validate/make_data_rdf.py +0 -193
  264. dsp_tools/commands/xml_validate/models/data_deserialised.py +0 -108
  265. dsp_tools/commands/xml_validate/models/data_rdf.py +0 -214
  266. dsp_tools/commands/xml_validate/models/input_problems.py +0 -191
  267. dsp_tools/commands/xml_validate/models/validation.py +0 -29
  268. dsp_tools/commands/xml_validate/reformat_validaton_result.py +0 -89
  269. dsp_tools/commands/xml_validate/sparql/construct_shapes.py +0 -16
  270. dsp_tools/commands/xml_validate/xml_validate.py +0 -151
  271. dsp_tools/commands/xmlupload/check_consistency_with_ontology.py +0 -253
  272. dsp_tools/commands/xmlupload/models/deserialise/deserialise_value.py +0 -236
  273. dsp_tools/commands/xmlupload/models/deserialise/xmlresource.py +0 -171
  274. dsp_tools/commands/xmlupload/models/namespace_context.py +0 -39
  275. dsp_tools/commands/xmlupload/models/ontology_lookup_models.py +0 -161
  276. dsp_tools/commands/xmlupload/models/ontology_problem_models.py +0 -178
  277. dsp_tools/commands/xmlupload/models/serialise/jsonld_serialiser.py +0 -40
  278. dsp_tools/commands/xmlupload/models/serialise/serialise_value.py +0 -51
  279. dsp_tools/commands/xmlupload/ontology_client.py +0 -92
  280. dsp_tools/commands/xmlupload/project_client.py +0 -91
  281. dsp_tools/commands/xmlupload/read_validate_xml_file.py +0 -99
  282. dsp_tools/models/custom_warnings.py +0 -31
  283. dsp_tools/models/exceptions.py +0 -90
  284. dsp_tools/resources/0100-template-repo/template.json +0 -45
  285. dsp_tools/resources/0100-template-repo/template.xml +0 -27
  286. dsp_tools/resources/start-stack/docker-compose-validation.yml +0 -5
  287. dsp_tools/resources/start-stack/start-stack-config.yml +0 -4
  288. dsp_tools/resources/xml_validate/api-shapes.ttl +0 -411
  289. dsp_tools/resources/xml_validate/replace_namespace.xslt +0 -61
  290. dsp_tools/utils/connection_live.py +0 -383
  291. dsp_tools/utils/iri_util.py +0 -14
  292. dsp_tools/utils/logger_config.py +0 -41
  293. dsp_tools/utils/set_encoder.py +0 -20
  294. dsp_tools/utils/xml_utils.py +0 -145
  295. dsp_tools/utils/xml_validation.py +0 -197
  296. dsp_tools/utils/xml_validation_models.py +0 -68
  297. dsp_tools/xmllib/models/file_values.py +0 -78
  298. dsp_tools/xmllib/models/resource.py +0 -415
  299. dsp_tools/xmllib/models/values.py +0 -428
  300. dsp_tools-9.1.0.post11.dist-info/METADATA +0 -130
  301. dsp_tools-9.1.0.post11.dist-info/RECORD +0 -167
  302. dsp_tools-9.1.0.post11.dist-info/WHEEL +0 -4
  303. dsp_tools-9.1.0.post11.dist-info/licenses/LICENSE +0 -674
  304. /dsp_tools/{commands/excel2json/new_lists → clients}/__init__.py +0 -0
  305. /dsp_tools/commands/{excel2json/new_lists/models → create}/__init__.py +0 -0
  306. /dsp_tools/commands/{project → create/create_on_server}/__init__.py +0 -0
  307. /dsp_tools/commands/{project/create → create/models}/__init__.py +0 -0
  308. /dsp_tools/commands/{project/models → create/parsing}/__init__.py +0 -0
  309. /dsp_tools/commands/{xml_validate → create/serialisation}/__init__.py +0 -0
  310. /dsp_tools/commands/{xml_validate/models → excel2json/lists}/__init__.py +0 -0
  311. /dsp_tools/commands/{xml_validate/sparql → excel2json/lists/models}/__init__.py +0 -0
  312. /dsp_tools/commands/excel2json/{new_lists → lists}/models/deserialise.py +0 -0
  313. /dsp_tools/commands/{xmlupload/models/deserialise → get}/__init__.py +0 -0
  314. /dsp_tools/commands/{xmlupload/models/serialise → get/legacy_models}/__init__.py +0 -0
  315. /dsp_tools/commands/{project/models → get/legacy_models}/helpers.py +0 -0
  316. /dsp_tools/{models → commands/get/models}/__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))
@@ -1,9 +1,9 @@
1
- import warnings
2
1
  from dataclasses import dataclass
3
2
 
4
3
  from typing_extensions import deprecated
5
4
 
6
- from dsp_tools.models.custom_warnings import DspToolsUserWarning
5
+ from dsp_tools.error.xmllib_warnings import MessageInfo
6
+ from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_warning
7
7
  from dsp_tools.xmllib.value_checkers import is_dsp_ark
8
8
  from dsp_tools.xmllib.value_checkers import is_dsp_iri
9
9
  from dsp_tools.xmllib.value_checkers import is_timestamp
@@ -13,6 +13,11 @@ LIST_SEPARATOR = "\n - "
13
13
 
14
14
  @dataclass
15
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
+
16
21
  creation_date: str | None
17
22
  iri: str | None
18
23
  ark: str | None
@@ -23,16 +28,16 @@ class MigrationMetadata:
23
28
  msg_list = []
24
29
  if self.creation_date and not is_timestamp(self.creation_date):
25
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)
26
32
  if self.iri and not is_dsp_iri(self.iri):
27
33
  msg_list.append(f"The provided IRI is not valid: {self.iri}")
34
+ self.creation_date = str(self.creation_date)
28
35
  if self.ark and not is_dsp_ark(self.ark):
29
36
  msg_list.append(f"The provided ARK is not valid: {self.ark}")
37
+ self.ark = str(self.ark)
30
38
  if msg_list:
31
- msg = (
32
- f"The migration metadata of the resource with the ID '{self.res_id}' has the following problem(s):"
33
- f"{LIST_SEPARATOR}{LIST_SEPARATOR.join(msg_list)}"
34
- )
35
- warnings.warn(DspToolsUserWarning(msg))
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))
36
41
 
37
42
  def as_attrib(self) -> dict[str, str]:
38
43
  attrib_dict = {}
@@ -44,8 +49,7 @@ class MigrationMetadata:
44
49
  attrib_dict["ark"] = self.ark
45
50
  if not attrib_dict:
46
51
  msg = (
47
- f"The metadata of the resource with the ID '{self.res_id}' does not contain any values. "
48
- f"Please check if an error occurred."
52
+ "The migration metadata of the resource does not contain any values. Please check if an error occurred."
49
53
  )
50
- warnings.warn(DspToolsUserWarning(msg))
54
+ emit_xmllib_input_warning(MessageInfo(msg, self.res_id))
51
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