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
@@ -19,10 +19,10 @@ from typing import Optional
19
19
  from typing import Union
20
20
  from urllib.parse import quote_plus
21
21
 
22
- from dsp_tools.commands.project.models.model import Model
23
- from dsp_tools.models.exceptions import BaseError
24
- from dsp_tools.models.langstring import LangString
25
- from dsp_tools.utils.connection import Connection
22
+ from dsp_tools.clients.connection import Connection
23
+ from dsp_tools.commands.get.legacy_models.model import Model
24
+ from dsp_tools.error.exceptions import BaseError
25
+ from dsp_tools.legacy_models.langstring import LangString
26
26
 
27
27
 
28
28
  class Project(Model):
@@ -87,12 +87,11 @@ class Project(Model):
87
87
  _description: LangString
88
88
  _keywords: set[str]
89
89
  _ontologies: set[str]
90
+ _enabled_licenses: set[str]
90
91
  _selfjoin: bool
91
92
  _status: bool
92
93
  _logo: Optional[str]
93
94
 
94
- SYSTEM_PROJECT: str = "http://www.knora.org/ontology/knora-admin#SystemProject"
95
-
96
95
  def __init__(
97
96
  self,
98
97
  con: Connection,
@@ -103,6 +102,7 @@ class Project(Model):
103
102
  description: LangString = None,
104
103
  keywords: Optional[set[str]] = None,
105
104
  ontologies: Optional[set[str]] = None,
105
+ enabled_licenses: Optional[set[str]] = None,
106
106
  selfjoin: Optional[bool] = None,
107
107
  status: Optional[bool] = None,
108
108
  logo: Optional[str] = None,
@@ -118,6 +118,7 @@ class Project(Model):
118
118
  :param description: LangString instance containing the description [required for CREATE]
119
119
  :param keywords: Set of keywords [required for CREATE]
120
120
  :param ontologies: Set of ontologies that belong to this project [optional]
121
+ :param enabled_licenses: Set of enabled licenses [optional]
121
122
  :param selfjoin: Allow selfjoin [required for CREATE]
122
123
  :param status: Status of project (active if True) [required for CREATE]
123
124
  :param logo: Path to logo image file [optional] NOT YET USED
@@ -132,6 +133,7 @@ class Project(Model):
132
133
  if not isinstance(ontologies, set) and ontologies is not None:
133
134
  raise BaseError("Ontologies must be a set of strings or None!")
134
135
  self._ontologies = ontologies
136
+ self._enabled_licenses = enabled_licenses or set()
135
137
  self._selfjoin = selfjoin
136
138
  self._status = status
137
139
  self._logo = logo
@@ -259,6 +261,7 @@ class Project(Model):
259
261
  ontologies = set(json_obj.get("ontologies"))
260
262
  if ontologies is None:
261
263
  raise BaseError("ontologies are missing")
264
+ enabled_licenses = json_obj.get("enabledLicenses", set())
262
265
  selfjoin = json_obj.get("selfjoin")
263
266
  if selfjoin is None:
264
267
  raise BaseError("Selfjoin is missing")
@@ -275,6 +278,7 @@ class Project(Model):
275
278
  description=description,
276
279
  keywords=keywords,
277
280
  ontologies=ontologies,
281
+ enabled_licenses=enabled_licenses,
278
282
  selfjoin=selfjoin,
279
283
  status=status,
280
284
  logo=logo,
@@ -287,6 +291,7 @@ class Project(Model):
287
291
  "longname": self._longname,
288
292
  "descriptions": self._description.createDefinitionFileObj(),
289
293
  "keywords": list(self._keywords),
294
+ "enabled_licenses": list(self._enabled_licenses),
290
295
  }
291
296
 
292
297
  def create(self) -> Project:
@@ -315,6 +320,8 @@ class Project(Model):
315
320
  tmp["description"] = self._description.toJsonObj()
316
321
  if self._keywords is not None and len(self._keywords) > 0:
317
322
  tmp["keywords"] = self._keywords
323
+ if self._enabled_licenses:
324
+ tmp["enabledLicenses"] = list(self._enabled_licenses)
318
325
  if self._selfjoin is None:
319
326
  raise BaseError("selfjoin must be defined (True or False!")
320
327
  tmp["selfjoin"] = self._selfjoin
@@ -1,21 +1,20 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections.abc import Sequence
3
4
  from typing import Any
4
5
  from typing import Optional
5
- from typing import Sequence
6
6
  from typing import Union
7
- from urllib.parse import quote_plus
8
7
 
9
8
  import regex
10
9
 
11
- from dsp_tools.commands.project.models.context import Context
12
- from dsp_tools.commands.project.models.helpers import WithId
13
- from dsp_tools.commands.project.models.listnode import ListNode
14
- from dsp_tools.commands.project.models.model import Model
15
- from dsp_tools.models.datetimestamp import DateTimeStamp
16
- from dsp_tools.models.exceptions import BaseError
17
- from dsp_tools.models.langstring import LangString
18
- from dsp_tools.utils.connection import Connection
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
19
18
 
20
19
 
21
20
  class PropertyClass(Model):
@@ -352,12 +351,6 @@ class PropertyClass(Model):
352
351
  tmp["@graph"][0]["rdfs:comment"] = self._comment.toJsonLdObj()
353
352
  return tmp
354
353
 
355
- def delete(self, last_modification_date: DateTimeStamp) -> DateTimeStamp:
356
- result = self._con.delete(
357
- PropertyClass.ROUTE + "/" + quote_plus(self._iri) + "?lastModificationDate=" + str(last_modification_date)
358
- )
359
- return DateTimeStamp(result["knora-api:lastModificationDate"])
360
-
361
354
  def createDefinitionFileObj(self, context: Context, shortname: str) -> dict[str, Any]:
362
355
  """
363
356
  Create an object that can be used as input for `create_onto()` to create an ontology on a DSP server
@@ -7,22 +7,21 @@ This model implements the handling of resource classes. It contains two classes
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ from collections.abc import Sequence
10
11
  from enum import Enum
11
12
  from typing import Any
12
13
  from typing import Optional
13
- from typing import Sequence
14
14
  from typing import Union
15
- from urllib.parse import quote_plus
16
15
 
17
16
  import regex
18
17
 
19
- from dsp_tools.commands.project.models.context import Context
20
- from dsp_tools.commands.project.models.helpers import Cardinality
21
- from dsp_tools.commands.project.models.model import Model
22
- from dsp_tools.models.datetimestamp import DateTimeStamp
23
- from dsp_tools.models.exceptions import BaseError
24
- from dsp_tools.models.langstring import LangString
25
- from dsp_tools.utils.connection import Connection
18
+ from dsp_tools.clients.connection import Connection
19
+ from dsp_tools.commands.get.legacy_models.context import Context
20
+ from dsp_tools.commands.get.legacy_models.helpers import Cardinality
21
+ from dsp_tools.commands.get.legacy_models.model import Model
22
+ from dsp_tools.error.exceptions import BaseError
23
+ from dsp_tools.legacy_models.datetimestamp import DateTimeStamp
24
+ from dsp_tools.legacy_models.langstring import LangString
26
25
 
27
26
 
28
27
  class HasProperty(Model):
@@ -478,37 +477,6 @@ class ResourceClass(Model):
478
477
  def has_properties(self) -> dict[str, HasProperty]:
479
478
  return self._has_properties
480
479
 
481
- def getProperty(self, property_id: str) -> Optional[HasProperty]:
482
- if self._has_properties is None:
483
- return None
484
- else:
485
- return self._has_properties.get(self._context.get_prefixed_iri(property_id))
486
-
487
- def addProperty(
488
- self,
489
- last_modification_date: DateTimeStamp,
490
- property_id: str,
491
- cardinality: Cardinality,
492
- gui_order: Optional[int] = None,
493
- ) -> DateTimeStamp:
494
- if self._has_properties.get(property_id) is None:
495
- latest_modification_date, resclass = HasProperty(
496
- con=self._con,
497
- context=self._context,
498
- ontology_id=self._ontology_id,
499
- property_id=property_id,
500
- resclass_id=self.iri,
501
- cardinality=cardinality,
502
- gui_order=gui_order,
503
- ).create(last_modification_date)
504
- hp = resclass.getProperty(property_id)
505
- hp.ontology_id = self._context.iri_from_prefix(self._ontology_id)
506
- hp.resclass_id = self._iri
507
- self._has_properties[hp.property_id] = hp
508
- return latest_modification_date
509
- else:
510
- raise BaseError("Property already has cardinality in this class! " + property_id)
511
-
512
480
  @classmethod
513
481
  def fromJsonObj(cls, con: Connection, context: Context, json_obj: Any) -> ResourceClass:
514
482
  if isinstance(json_obj, list):
@@ -671,12 +639,6 @@ class ResourceClass(Model):
671
639
  else:
672
640
  return {"@id": "knora-api:" + resref} # no ":", must be from knora-api!
673
641
 
674
- def delete(self, last_modification_date: DateTimeStamp) -> DateTimeStamp:
675
- result = self._con.delete(
676
- ResourceClass.ROUTE + "/" + quote_plus(self._iri) + "?lastModificationDate=" + str(last_modification_date)
677
- )
678
- return DateTimeStamp(result["knora-api:lastModificationDate"])
679
-
680
642
  def createDefinitionFileObj(self, context: Context, shortname: str, skiplist: list[str]) -> dict[str, Any]:
681
643
  resource = {"name": self._name}
682
644
  if self._superclasses:
@@ -21,12 +21,11 @@ from typing import Optional
21
21
  from typing import Union
22
22
  from urllib.parse import quote_plus
23
23
 
24
- from dsp_tools.commands.project.models.group import Group
25
- from dsp_tools.commands.project.models.model import Model
26
- from dsp_tools.commands.project.models.project import Project
27
- from dsp_tools.models.exceptions import BaseError
28
- from dsp_tools.models.langstring import Languages
29
- from dsp_tools.utils.connection import Connection
24
+ from dsp_tools.clients.connection import Connection
25
+ from dsp_tools.commands.get.legacy_models.group import Group
26
+ from dsp_tools.commands.get.legacy_models.model import Model
27
+ from dsp_tools.error.exceptions import BaseError
28
+ from dsp_tools.legacy_models.langstring import Languages
30
29
 
31
30
 
32
31
  class User(Model):
@@ -60,9 +59,6 @@ class User(Model):
60
59
  status : bool
61
60
  Status of the user, If active, is set to True, otherwise false [read/write]
62
61
 
63
- sysadmin : bool
64
- True, if user is system administrator [read/write]
65
-
66
62
  in_groups : set[str]
67
63
  Set of group IRI's the user is member of [readonly].
68
64
 
@@ -103,7 +99,6 @@ class User(Model):
103
99
  _password: str
104
100
  _lang: Languages
105
101
  _status: bool
106
- _sysadmin: bool
107
102
  _in_groups: set[str]
108
103
  _in_projects: dict[str, bool]
109
104
  _add_to_project: dict[str, bool]
@@ -123,7 +118,6 @@ class User(Model):
123
118
  password: Optional[str] = None,
124
119
  lang: Optional[Union[str, Languages]] = None,
125
120
  status: Optional[bool] = None,
126
- sysadmin: Optional[bool] = None,
127
121
  in_projects: Optional[dict[str, bool]] = None,
128
122
  in_groups: Optional[set[str]] = None,
129
123
  ):
@@ -141,7 +135,6 @@ class User(Model):
141
135
  :param password: Password [required for CREATE]
142
136
  :param lang: Preferred language of the user [optional]
143
137
  :param status: Status (active = True, inactive/deleted = False) [optional]
144
- :param sysadmin: User has system administration privileges [optional]
145
138
  :param in_projects: Dict with project-IRI as key, boolean(True=project admin) as value [optional]
146
139
  :param in_groups: Set with group-IRI's the user should belong to [optional]
147
140
  """
@@ -174,8 +167,6 @@ class User(Model):
174
167
  else:
175
168
  raise BaseError("In_groups must be a set of strings or None!")
176
169
 
177
- self._sysadmin = None if sysadmin is None else bool(sysadmin)
178
-
179
170
  @property
180
171
  def iri(self) -> Optional[str]:
181
172
  """IRI of this user"""
@@ -271,17 +262,6 @@ class User(Model):
271
262
  if value is not None:
272
263
  self._changed.add("status")
273
264
 
274
- @property
275
- def sysadmin(self) -> bool:
276
- """True if the user is sysadmin"""
277
- return self._sysadmin
278
-
279
- @sysadmin.setter
280
- def sysadmin(self, value: bool) -> None:
281
- self._sysadmin = None if value is None else bool(value)
282
- if value is not None:
283
- self._changed.add("sysadmin")
284
-
285
265
  @property
286
266
  def in_groups(self) -> set[str]:
287
267
  """Set of group IRI's the user is member of"""
@@ -296,7 +276,7 @@ class User(Model):
296
276
  def _make_fromJsonObj(cls, con: Connection, json_obj: dict[str, Any]) -> User:
297
277
  User._check_if_jsonObj_has_required_info(json_obj)
298
278
 
299
- sysadmin, in_groups, in_projects = cls._update_permissions_and_groups(json_obj)
279
+ in_groups, in_projects = cls._update_permissions_and_groups(json_obj)
300
280
 
301
281
  return cls(
302
282
  con=con,
@@ -307,7 +287,6 @@ class User(Model):
307
287
  familyName=json_obj.get("familyName"),
308
288
  lang=json_obj.get("lang"),
309
289
  status=json_obj["status"],
310
- sysadmin=sysadmin,
311
290
  in_projects=in_projects,
312
291
  in_groups=in_groups,
313
292
  )
@@ -331,26 +310,21 @@ class User(Model):
331
310
  raise BaseError("\n".join(problems))
332
311
 
333
312
  @classmethod
334
- def _update_permissions_and_groups(cls, json_obj: dict[str, Any]) -> tuple[bool | None, set[str], dict[str, bool]]:
313
+ def _update_permissions_and_groups(cls, json_obj: dict[str, Any]) -> tuple[set[str], dict[str, bool]]:
335
314
  in_projects: dict[str, bool] = {}
336
315
  in_groups: set[str] = set()
337
316
  if json_obj.get("permissions") is not None and json_obj["permissions"].get("groupsPerProject") is not None:
338
- sysadmin = False
339
317
  for project_iri, group_memberships in json_obj["permissions"]["groupsPerProject"].items():
340
- if project_iri == Project.SYSTEM_PROJECT:
341
- if Group.PROJECT_SYSTEMADMIN_GROUP in group_memberships:
342
- sysadmin = True
343
- else:
344
- for group in group_memberships:
345
- if group == Group.PROJECT_MEMBER_GROUP:
346
- if in_projects.get(project_iri) is None:
347
- in_projects[project_iri] = False
348
- elif group == Group.PROJECT_ADMIN_GROUP:
349
- in_projects[project_iri] = True
350
- else:
351
- in_groups.add(group)
352
- return sysadmin, in_groups, in_projects
353
- return None, in_groups, in_projects
318
+ for group in group_memberships:
319
+ if group == Group.PROJECT_MEMBER_GROUP:
320
+ if in_projects.get(project_iri) is None:
321
+ in_projects[project_iri] = False
322
+ elif group == Group.PROJECT_ADMIN_GROUP:
323
+ in_projects[project_iri] = True
324
+ else:
325
+ in_groups.add(group)
326
+ return in_groups, in_projects
327
+ return in_groups, in_projects
354
328
 
355
329
  def create(self) -> User:
356
330
  """
@@ -394,7 +368,8 @@ class User(Model):
394
368
  raise BaseError("'language' is mandatory!")
395
369
  tmp["lang"] = self._lang.value
396
370
  tmp["status"] = True if self._status is None else self._status
397
- tmp["systemAdmin"] = False if self._sysadmin is None else self._sysadmin
371
+ # the API expects the key "systemAdmin" to be present. DSP-TOOLS doesn't support creating SystemAdmins any more.
372
+ tmp["systemAdmin"] = False
398
373
  return tmp
399
374
 
400
375
  def read(self) -> User:
@@ -413,20 +388,6 @@ class User(Model):
413
388
  raise BaseError("Either user-iri or email is required!")
414
389
  return User._make_fromJsonObj(self._con, result["user"])
415
390
 
416
- @staticmethod
417
- def getAllUsers(con: Connection) -> list[Any]:
418
- """
419
- Get a list of all users (static method)
420
-
421
- :param con: Connection instance
422
- :return: List of users
423
- """
424
-
425
- result = con.get(User.ROUTE)
426
- if "users" not in result:
427
- raise BaseError("Request got no users!")
428
- return [User._make_fromJsonObj(con, a) for a in result["users"]]
429
-
430
391
  @staticmethod
431
392
  def getAllUsersForProject(con: Connection, proj_shortcode: str) -> Optional[list[User]]:
432
393
  """
@@ -465,8 +426,6 @@ class User(Model):
465
426
  if "group" in group_info and "name" in group_info["group"]:
466
427
  groupname = group_info["group"]["name"]
467
428
  groups.append(f"{proj_shortname}:{groupname}")
468
- if self._sysadmin:
469
- groups.append("SystemAdmin")
470
429
  user["groups"] = groups
471
430
  user["projects"] = list()
472
431
  for proj, is_admin in self._in_projects.items():
@@ -0,0 +1,10 @@
1
+ from dataclasses import dataclass
2
+ from typing import Any
3
+
4
+
5
+ @dataclass
6
+ class DoapCategories:
7
+ class_doaps: list[dict[str, Any]]
8
+ prop_doaps: list[dict[str, Any]]
9
+ has_img_all_classes_doaps: list[dict[str, Any]]
10
+ has_img_specific_class_doaps: list[dict[str, Any]]
@@ -1,5 +1,6 @@
1
1
  import copy
2
2
  import json
3
+ import warnings
3
4
  from collections.abc import Mapping
4
5
  from datetime import datetime
5
6
  from pathlib import Path
@@ -8,8 +9,9 @@ import regex
8
9
  from loguru import logger
9
10
  from lxml import etree
10
11
 
11
- from dsp_tools.models.exceptions import UserError
12
- from dsp_tools.utils.xml_utils import parse_and_clean_xml_file
12
+ from dsp_tools.error.custom_warnings import DspToolsUserWarning
13
+ from dsp_tools.error.exceptions import InputError
14
+ from dsp_tools.utils.xml_parsing.parse_clean_validate_xml import parse_and_clean_xml_file
13
15
 
14
16
 
15
17
  def _check_input_parameters(
@@ -25,7 +27,7 @@ def _check_input_parameters(
25
27
  json_file: the JSON file with the mapping (dict) of internal IDs to IRIs
26
28
 
27
29
  Raises:
28
- UserError: if one of the files could not be found
30
+ InputError: if one of the files could not be found
29
31
 
30
32
  Returns:
31
33
  path objects of the input parameters
@@ -33,12 +35,12 @@ def _check_input_parameters(
33
35
  xml_file_as_path = Path(xml_file)
34
36
  if not xml_file_as_path.is_file():
35
37
  logger.error(f"File {xml_file} could not be found.")
36
- raise UserError(f"File {xml_file} could not be found.")
38
+ raise InputError(f"File {xml_file} could not be found.")
37
39
 
38
40
  json_file_as_path = Path(json_file)
39
41
  if not json_file_as_path.is_file():
40
42
  logger.error(f"File {json_file} could not be found.")
41
- raise UserError(f"File {json_file} could not be found.")
43
+ raise InputError(f"File {json_file} could not be found.")
42
44
 
43
45
  return xml_file_as_path, json_file_as_path
44
46
 
@@ -75,7 +77,10 @@ def _replace_resptrs(
75
77
  a tuple of the modified copy of the XML tree, and the set of the IDs that have been replaced
76
78
  """
77
79
  modified_tree = copy.deepcopy(tree)
78
- resptr_xpath = "|".join([f"/knora/{x}/resptr-prop/resptr" for x in ["resource", "annotation", "link", "region"]])
80
+ xpaths = [f"/knora/{x}/resptr-prop/resptr" for x in ["resource", "link", "region"]]
81
+ xpaths.extend([f"/knora/{x}-segment/isSegmentOf" for x in ["video", "audio"]])
82
+ xpaths.extend([f"/knora/{x}-segment/relatesTo" for x in ["video", "audio"]])
83
+ resptr_xpath = "|".join(xpaths)
79
84
  resptr_elems = modified_tree.xpath(resptr_xpath)
80
85
  resptr_elems_replaced = 0
81
86
  for resptr_elem in resptr_elems:
@@ -108,7 +113,10 @@ def _replace_salsah_links(
108
113
  a tuple of the modified copy of the XML tree, and the set of the IDs that have been replaced
109
114
  """
110
115
  modified_tree = copy.deepcopy(tree)
111
- salsah_xpath = "|".join([f"/knora/{x}/text-prop/text//a" for x in ["resource", "annotation", "link", "region"]])
116
+ xpaths = [f"/knora/{x}/text-prop/text//a" for x in ["resource", "link", "region"]]
117
+ xpaths.extend([f"/knora/{x}-segment/hasComment//a" for x in ["video", "audio"]])
118
+ xpaths.extend([f"/knora/{x}-segment/hasDescription//a" for x in ["video", "audio"]])
119
+ salsah_xpath = "|".join(xpaths)
112
120
  salsah_links = [x for x in modified_tree.xpath(salsah_xpath) if x.attrib.get("class") == "salsah-link"]
113
121
  salsah_links_replaced = 0
114
122
  for salsah_link in salsah_links:
@@ -175,7 +183,9 @@ def _remove_resources_if_id_in_mapping(
175
183
  a modified copy of the XML tree
176
184
  """
177
185
  modified_tree = copy.deepcopy(tree)
178
- resources = modified_tree.xpath("|".join([f"/knora/{x}" for x in ["resource", "annotation", "link", "region"]]))
186
+ resources = modified_tree.xpath(
187
+ "|".join([f"/knora/{x}" for x in ["resource", "link", "region", "video-segment", "audio-segment"]])
188
+ )
179
189
  resources_to_remove = [x for x in resources if x.attrib.get("id") in mapping]
180
190
  for resource in resources_to_remove:
181
191
  resource.getparent().remove(resource)
@@ -184,8 +194,8 @@ def _remove_resources_if_id_in_mapping(
184
194
  f"Removed {len(resources_to_remove)}/{len(resources)} resources from the XML file, "
185
195
  "because their ID was in the mapping"
186
196
  )
187
- logger.info(msg)
188
- print(msg)
197
+ logger.warning(msg)
198
+ warnings.warn(DspToolsUserWarning(msg))
189
199
 
190
200
  return modified_tree
191
201