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
@@ -0,0 +1,66 @@
1
+ from dataclasses import dataclass
2
+ from http import HTTPStatus
3
+ from typing import Any
4
+ from typing import cast
5
+
6
+ import requests
7
+ from requests import RequestException
8
+
9
+ from dsp_tools.clients.authentication_client import AuthenticationClient
10
+ from dsp_tools.clients.project_client import ProjectClient
11
+ from dsp_tools.error.exceptions import BadCredentialsError
12
+ from dsp_tools.error.exceptions import FatalNonOkApiResponseCode
13
+ from dsp_tools.error.exceptions import ProjectNotFoundError
14
+ from dsp_tools.utils.request_utils import RequestParameters
15
+ from dsp_tools.utils.request_utils import ResponseCodeAndText
16
+ from dsp_tools.utils.request_utils import log_and_raise_request_exception
17
+ from dsp_tools.utils.request_utils import log_request
18
+ from dsp_tools.utils.request_utils import log_response
19
+
20
+
21
+ @dataclass
22
+ class ProjectClientLive(ProjectClient):
23
+ server: str
24
+ auth: AuthenticationClient
25
+
26
+ def get_project_iri(self, shortcode: str) -> str:
27
+ url = f"{self.server}/admin/projects/shortcode/{shortcode}"
28
+ timeout = 30
29
+ params = RequestParameters("GET", url, timeout)
30
+ log_request(params)
31
+ try:
32
+ response = requests.get(url, timeout=timeout)
33
+ except RequestException as err:
34
+ log_and_raise_request_exception(err)
35
+
36
+ log_response(response)
37
+ if response.ok:
38
+ result = response.json()
39
+ return cast(str, result["project"]["id"])
40
+ if response.status_code == HTTPStatus.NOT_FOUND:
41
+ raise ProjectNotFoundError(f"The project with the shortcode {shortcode} does not exist on this server. ")
42
+ raise FatalNonOkApiResponseCode(url, response.status_code, response.text)
43
+
44
+ def post_new_project(self, project_info: dict[str, Any]) -> str | ResponseCodeAndText:
45
+ url = f"{self.server}/admin/projects"
46
+ timeout = 10
47
+ headers = {"Authorization": f"Bearer {self.auth.get_token()}"}
48
+ params = RequestParameters("POST", url, timeout, headers=headers, data=project_info)
49
+ log_request(params)
50
+ try:
51
+ response = requests.post(
52
+ params.url, timeout=params.timeout, headers=params.headers, data=params.data_serialized
53
+ )
54
+ except RequestException as err:
55
+ log_and_raise_request_exception(err)
56
+
57
+ log_response(response)
58
+ if response.ok:
59
+ result = response.json()
60
+ return cast(str, result["project"]["id"])
61
+ if response.status_code == HTTPStatus.FORBIDDEN:
62
+ raise BadCredentialsError(
63
+ "Only a SystemAdmin can create a project, your permissions are insufficient for this action. "
64
+ "Please contact support@dasch.swiss if you require a new project."
65
+ )
66
+ return ResponseCodeAndText(response.status_code, response.text)
@@ -0,0 +1,24 @@
1
+ from loguru import logger
2
+
3
+ from dsp_tools.commands.create.models.create_problems import CollectedProblems
4
+ from dsp_tools.commands.create.models.create_problems import CreateProblem
5
+ from dsp_tools.utils.ansi_colors import BOLD_RED
6
+ from dsp_tools.utils.ansi_colors import RED
7
+ from dsp_tools.utils.ansi_colors import RESET_TO_DEFAULT
8
+
9
+
10
+ def print_all_problem_collections(problems: list[CollectedProblems]) -> None:
11
+ for prob in problems:
12
+ print_problem_collection(prob)
13
+
14
+
15
+ def print_problem_collection(problem_collection: CollectedProblems) -> None:
16
+ individual_problems = _create_individual_problem_strings(problem_collection.problems)
17
+ logger.error(problem_collection.header + individual_problems)
18
+ print(BOLD_RED, problem_collection.header, RESET_TO_DEFAULT)
19
+ print(RED, individual_problems, RESET_TO_DEFAULT)
20
+
21
+
22
+ def _create_individual_problem_strings(problems: list[CreateProblem]) -> str:
23
+ str_list = [f"{p.problematic_object}: {p.problem!s}" for p in problems]
24
+ return " - " + "\n - ".join(str_list)
@@ -0,0 +1,134 @@
1
+ from pathlib import Path
2
+
3
+ from dotenv import find_dotenv
4
+ from dotenv import load_dotenv
5
+ from loguru import logger
6
+
7
+ from dsp_tools.cli.args import ServerCredentials
8
+ from dsp_tools.clients.authentication_client_live import AuthenticationClientLive
9
+ from dsp_tools.clients.group_user_clients_live import GroupClientLive
10
+ from dsp_tools.clients.permissions_client import PermissionsClient
11
+ from dsp_tools.commands.create.communicate_problems import print_all_problem_collections
12
+ from dsp_tools.commands.create.communicate_problems import print_problem_collection
13
+ from dsp_tools.commands.create.create_on_server.complete_ontologies import create_ontologies
14
+ from dsp_tools.commands.create.create_on_server.default_permissions import create_default_permissions
15
+ from dsp_tools.commands.create.create_on_server.group_users import create_groups
16
+ from dsp_tools.commands.create.create_on_server.group_users import create_users
17
+ from dsp_tools.commands.create.create_on_server.group_users import get_existing_group_to_iri_lookup
18
+ from dsp_tools.commands.create.create_on_server.lists import create_lists
19
+ from dsp_tools.commands.create.create_on_server.lists import get_existing_lists_on_server
20
+ from dsp_tools.commands.create.create_on_server.project import create_project
21
+ from dsp_tools.commands.create.models.parsed_project import ParsedProject
22
+ from dsp_tools.commands.create.project_validate import parse_and_validate_project
23
+ from dsp_tools.error.exceptions import InternalError
24
+ from dsp_tools.utils.ansi_colors import BOLD_GREEN
25
+ from dsp_tools.utils.ansi_colors import RESET_TO_DEFAULT
26
+
27
+ load_dotenv(dotenv_path=find_dotenv(usecwd=True))
28
+
29
+
30
+ def create(project_file: Path, creds: ServerCredentials, exit_if_exists: bool) -> bool:
31
+ parsing_result = parse_and_validate_project(project_file, creds.server)
32
+ match parsing_result:
33
+ case ParsedProject():
34
+ return _execute_create(parsing_result, creds, exit_if_exists)
35
+ case list():
36
+ print_all_problem_collections(parsing_result)
37
+ return False
38
+ case _:
39
+ raise InternalError("Unreachable result of project parsing.")
40
+
41
+
42
+ def _execute_create(parsed_project: ParsedProject, creds: ServerCredentials, exit_if_exists: bool) -> bool:
43
+ msg = "JSON project file is syntactically correct and passed validation."
44
+ print(BOLD_GREEN + " JSON project file is syntactically correct and passed validation." + RESET_TO_DEFAULT)
45
+ logger.info(msg)
46
+ overall_success = True
47
+ auth = AuthenticationClientLive(creds.server, creds.user, creds.password)
48
+
49
+ # create project
50
+ project_iri = create_project(parsed_project.project_metadata, auth, exit_if_exists)
51
+
52
+ # create the lists
53
+ if parsed_project.lists:
54
+ list_name_2_iri, list_problems = create_lists(
55
+ parsed_lists=parsed_project.lists,
56
+ shortcode=parsed_project.project_metadata.shortcode,
57
+ auth=auth,
58
+ project_iri=project_iri,
59
+ )
60
+ if list_problems:
61
+ overall_success = False
62
+ print_problem_collection(list_problems)
63
+ else:
64
+ list_name_2_iri = get_existing_lists_on_server(parsed_project.project_metadata.shortcode, auth)
65
+
66
+ # create the groups
67
+ group_client = GroupClientLive(creds.server, auth)
68
+ group_lookup = get_existing_group_to_iri_lookup(
69
+ group_client, project_iri, parsed_project.project_metadata.shortname
70
+ )
71
+ if parsed_project.groups:
72
+ group_lookup, group_problems = create_groups(
73
+ groups=parsed_project.groups,
74
+ group_client=group_client,
75
+ project_iri=project_iri,
76
+ group_lookup=group_lookup,
77
+ )
78
+ if group_problems:
79
+ print_problem_collection(group_problems)
80
+ overall_success = False
81
+
82
+ if parsed_project.users:
83
+ user_problems = create_users(
84
+ users=parsed_project.users,
85
+ user_memberships=parsed_project.user_memberships,
86
+ group_lookup=group_lookup,
87
+ auth=auth,
88
+ project_iri=project_iri,
89
+ )
90
+ if user_problems:
91
+ print_problem_collection(user_problems)
92
+ overall_success = False
93
+
94
+ # create the ontologies
95
+ success = create_ontologies(
96
+ parsed_ontologies=parsed_project.ontologies,
97
+ list_name_2_iri=list_name_2_iri,
98
+ project_iri=project_iri,
99
+ shortcode=parsed_project.project_metadata.shortcode,
100
+ auth=auth,
101
+ )
102
+ if not success:
103
+ overall_success = False
104
+
105
+ # create the default permissions (DOAPs)
106
+ perm_client = PermissionsClient(auth, project_iri)
107
+ success = create_default_permissions(
108
+ perm_client=perm_client,
109
+ default_permissions=parsed_project.permissions.default_permissions,
110
+ default_permissions_overrule=parsed_project.permissions.default_permissions_overrule,
111
+ shortcode=parsed_project.project_metadata.shortcode,
112
+ )
113
+ if not success:
114
+ overall_success = False
115
+
116
+ # final steps
117
+ if overall_success:
118
+ msg = (
119
+ f"Successfully created project '{parsed_project.project_metadata.shortname}' "
120
+ f"({parsed_project.project_metadata.shortcode}) with all its ontologies. "
121
+ f"There were no problems during the creation process."
122
+ )
123
+ print(f"========================================================\n{msg}")
124
+ logger.info(msg)
125
+ else:
126
+ msg = (
127
+ f"The project '{parsed_project.project_metadata.shortname}' ({parsed_project.project_metadata.shortcode}) "
128
+ f"with its ontologies could be created, "
129
+ f"but during the creation process, some problems occurred. Please carefully check the console output."
130
+ )
131
+ print(f"========================================================\nWARNING: {msg}")
132
+ logger.warning(msg)
133
+
134
+ return overall_success
@@ -0,0 +1,111 @@
1
+ from loguru import logger
2
+ from rdflib import Literal
3
+ from rdflib import URIRef
4
+ from tqdm import tqdm
5
+
6
+ from dsp_tools.clients.ontology_clients import OntologyCreateClient
7
+ from dsp_tools.commands.create.models.create_problems import CollectedProblems
8
+ from dsp_tools.commands.create.models.create_problems import CreateProblem
9
+ from dsp_tools.commands.create.models.create_problems import UploadProblem
10
+ from dsp_tools.commands.create.models.create_problems import UploadProblemType
11
+ from dsp_tools.commands.create.models.parsed_ontology import ParsedClassCardinalities
12
+ from dsp_tools.commands.create.models.parsed_ontology import ParsedOntology
13
+ from dsp_tools.commands.create.models.parsed_ontology import ParsedPropertyCardinality
14
+ from dsp_tools.commands.create.models.server_project_info import CreatedIriCollection
15
+ from dsp_tools.commands.create.models.server_project_info import ProjectIriLookup
16
+ from dsp_tools.commands.create.serialisation.ontology import serialise_cardinality_graph_for_request
17
+ from dsp_tools.utils.data_formats.iri_util import from_dsp_iri_to_prefixed_iri
18
+
19
+
20
+ def add_all_cardinalities(
21
+ ontologies: list[ParsedOntology],
22
+ project_iri_lookup: ProjectIriLookup,
23
+ created_iris: CreatedIriCollection,
24
+ onto_client: OntologyCreateClient,
25
+ ) -> CollectedProblems | None:
26
+ all_problems = []
27
+ for onto in ontologies:
28
+ onto_iri = project_iri_lookup.onto_iris.get(onto.name)
29
+ # we do not inform about onto failures here, as it will have been done upstream
30
+ if onto_iri:
31
+ last_mod_date = onto_client.get_last_modification_date(project_iri_lookup.project_iri, onto_iri)
32
+ problems = _add_all_cardinalities_for_one_onto(
33
+ cardinalities=onto.cardinalities,
34
+ onto_iri=URIRef(onto_iri),
35
+ onto_name=onto.name,
36
+ last_modification_date=last_mod_date,
37
+ onto_client=onto_client,
38
+ created_iris=created_iris,
39
+ )
40
+ all_problems.extend(problems)
41
+ if all_problems:
42
+ return CollectedProblems(" While adding cardinalities the following problems occurred:", all_problems)
43
+ return None
44
+
45
+
46
+ def _add_all_cardinalities_for_one_onto(
47
+ cardinalities: list[ParsedClassCardinalities],
48
+ onto_iri: URIRef,
49
+ onto_name: str,
50
+ last_modification_date: Literal,
51
+ onto_client: OntologyCreateClient,
52
+ created_iris: CreatedIriCollection,
53
+ ) -> list[CreateProblem]:
54
+ problems: list[CreateProblem] = []
55
+ progress_bar = tqdm(
56
+ cardinalities, desc=f" Adding cardinalities to the ontology '{onto_name}'", dynamic_ncols=True
57
+ )
58
+ for c in progress_bar:
59
+ # we do not inform about classes failures here, as it will have been done upstream
60
+ if c.class_iri not in created_iris.created_classes:
61
+ logger.warning(f"CARDINALITY: Class '{c.class_iri}' not in successes, no cardinalities added.")
62
+ continue
63
+ last_modification_date, creation_problems = _add_cardinalities_for_one_class(
64
+ resource_card=c,
65
+ onto_iri=onto_iri,
66
+ last_modification_date=last_modification_date,
67
+ onto_client=onto_client,
68
+ successful_props=created_iris.created_properties,
69
+ )
70
+ problems.extend(creation_problems)
71
+ return problems
72
+
73
+
74
+ def _add_cardinalities_for_one_class(
75
+ resource_card: ParsedClassCardinalities,
76
+ onto_iri: URIRef,
77
+ last_modification_date: Literal,
78
+ onto_client: OntologyCreateClient,
79
+ successful_props: set[str],
80
+ ) -> tuple[Literal, list[UploadProblem]]:
81
+ res_iri = URIRef(resource_card.class_iri)
82
+ problems = []
83
+ for one_card in resource_card.cards:
84
+ if one_card.propname not in successful_props:
85
+ problems.append(UploadProblem(one_card.propname, UploadProblemType.CARDINALITY_PROPERTY_NOT_FOUND))
86
+ continue
87
+ last_modification_date, problem = _add_one_cardinality(
88
+ one_card, res_iri, onto_iri, last_modification_date, onto_client
89
+ )
90
+ if problem:
91
+ problems.append(problem)
92
+ return last_modification_date, problems
93
+
94
+
95
+ def _add_one_cardinality(
96
+ card: ParsedPropertyCardinality,
97
+ res_iri: URIRef,
98
+ onto_iri: URIRef,
99
+ last_modification_date: Literal,
100
+ onto_client: OntologyCreateClient,
101
+ ) -> tuple[Literal, UploadProblem | None]:
102
+ card_serialised = serialise_cardinality_graph_for_request(card, res_iri, onto_iri, last_modification_date)
103
+ new_mod_date = onto_client.post_resource_cardinalities(card_serialised)
104
+ if not new_mod_date:
105
+ prefixed_cls = from_dsp_iri_to_prefixed_iri(str(res_iri))
106
+ prefixed_prop = from_dsp_iri_to_prefixed_iri(card.propname)
107
+ return last_modification_date, UploadProblem(
108
+ f"{prefixed_cls} / {prefixed_prop}",
109
+ UploadProblemType.CARDINALITY_COULD_NOT_BE_ADDED,
110
+ )
111
+ return new_mod_date, None
@@ -0,0 +1,99 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+
4
+ import rustworkx as rx
5
+ from loguru import logger
6
+ from rdflib import Literal
7
+ from rdflib import URIRef
8
+ from tqdm import tqdm
9
+
10
+ from dsp_tools.clients.ontology_clients import OntologyCreateClient
11
+ from dsp_tools.commands.create.create_on_server.onto_utils import get_modification_date_onto_lookup
12
+ from dsp_tools.commands.create.create_on_server.onto_utils import should_retry_request
13
+ from dsp_tools.commands.create.create_on_server.onto_utils import sort_for_upload
14
+ from dsp_tools.commands.create.models.create_problems import CollectedProblems
15
+ from dsp_tools.commands.create.models.create_problems import CreateProblem
16
+ from dsp_tools.commands.create.models.create_problems import UploadProblem
17
+ from dsp_tools.commands.create.models.create_problems import UploadProblemType
18
+ from dsp_tools.commands.create.models.parsed_ontology import ParsedClass
19
+ from dsp_tools.commands.create.models.server_project_info import CreatedIriCollection
20
+ from dsp_tools.commands.create.models.server_project_info import OntoLastModDateLookup
21
+ from dsp_tools.commands.create.models.server_project_info import ProjectIriLookup
22
+ from dsp_tools.commands.create.serialisation.ontology import serialise_class_graph_for_request
23
+
24
+
25
+ def create_all_classes(
26
+ classes: list[ParsedClass],
27
+ project_iri_lookup: ProjectIriLookup,
28
+ created_iris: CreatedIriCollection,
29
+ client: OntologyCreateClient,
30
+ ) -> tuple[CreatedIriCollection, CollectedProblems | None]:
31
+ upload_order = _get_class_create_order(classes)
32
+ logger.debug(f"Class creation order: {upload_order}")
33
+ cls_lookup = {c.name: c for c in classes}
34
+ all_problems: list[CreateProblem] = []
35
+ onto_lookup = get_modification_date_onto_lookup(project_iri_lookup, client)
36
+ progress_bar = tqdm(upload_order, desc=" Creating classes", dynamic_ncols=True)
37
+ logger.debug("Starting class creation")
38
+ for c in progress_bar:
39
+ cls = cls_lookup[c]
40
+ if previous_blocker := _is_class_blocked(cls.name, set(cls.supers), created_iris):
41
+ all_problems.append(previous_blocker)
42
+ created_iris.failed_classes.add(cls.name)
43
+ else:
44
+ create_result = _create_one_class(cls, onto_lookup, client)
45
+ if isinstance(create_result, Literal):
46
+ onto_lookup.update_last_mod_date(cls.onto_iri, create_result)
47
+ created_iris.created_classes.add(cls.name)
48
+ else:
49
+ all_problems.append(create_result)
50
+ created_iris.failed_classes.add(cls.name)
51
+ upload_problems = None
52
+ if all_problems:
53
+ upload_problems = CollectedProblems(" While creating classes the following problems occurred:", all_problems)
54
+ return created_iris, upload_problems
55
+
56
+
57
+ def _get_class_create_order(classes: list[ParsedClass]) -> list[str]:
58
+ logger.debug("Creating class upload order.")
59
+ graph, node_to_iri = _make_graph_to_sort(classes)
60
+ return sort_for_upload(graph, node_to_iri)
61
+
62
+
63
+ def _make_graph_to_sort(classes: list[ParsedClass]) -> tuple[rx.PyDiGraph, dict[int, str]]:
64
+ graph: rx.PyDiGraph[Any, Any] = rx.PyDiGraph()
65
+ cls_iris = [x.name for x in classes]
66
+ node_indices = list(graph.add_nodes_from(cls_iris))
67
+ iri_to_node = dict(zip(cls_iris, node_indices))
68
+ node_to_iri = dict(zip(node_indices, cls_iris))
69
+ for i, p in enumerate(classes):
70
+ for super_cls in p.supers:
71
+ if super_cls in cls_iris:
72
+ graph.add_edge(iri_to_node[p.name], iri_to_node[super_cls], i)
73
+ return graph, node_to_iri
74
+
75
+
76
+ def _is_class_blocked(cls_name: str, supers: set[str], created_iris: CreatedIriCollection) -> CreateProblem | None:
77
+ if created_iris.any_classes_failed(supers):
78
+ return UploadProblem(cls_name, UploadProblemType.CLASS_SUPER_FAILED)
79
+ return None
80
+
81
+
82
+ def _create_one_class(
83
+ cls: ParsedClass, onto_lookup: OntoLastModDateLookup, client: OntologyCreateClient
84
+ ) -> Literal | CreateProblem:
85
+ cls_serialised = serialise_class_graph_for_request(
86
+ cls, URIRef(cls.onto_iri), onto_lookup.get_last_mod_date(cls.onto_iri)
87
+ )
88
+ request_result = client.post_new_class(cls_serialised)
89
+ if isinstance(request_result, Literal):
90
+ return request_result
91
+ if should_retry_request(request_result):
92
+ new_mod_date = client.get_last_modification_date(onto_lookup.project_iri, cls.onto_iri)
93
+ cls_serialised = serialise_class_graph_for_request(cls, URIRef(cls.onto_iri), new_mod_date)
94
+ request_result = client.post_new_class(cls_serialised)
95
+ if isinstance(request_result, Literal):
96
+ return request_result
97
+ if request_result.status_code == HTTPStatus.BAD_REQUEST:
98
+ return UploadProblem(cls.name, request_result.text)
99
+ return UploadProblem(cls.name, UploadProblemType.CLASS_COULD_NOT_BE_CREATED)
@@ -0,0 +1,116 @@
1
+ from loguru import logger
2
+
3
+ from dsp_tools.clients.authentication_client import AuthenticationClient
4
+ from dsp_tools.clients.ontology_clients import OntologyCreateClient
5
+ from dsp_tools.clients.ontology_create_client_live import OntologyCreateClientLive
6
+ from dsp_tools.commands.create.communicate_problems import print_problem_collection
7
+ from dsp_tools.commands.create.create_on_server.cardinalities import add_all_cardinalities
8
+ from dsp_tools.commands.create.create_on_server.classes import create_all_classes
9
+ from dsp_tools.commands.create.create_on_server.onto_utils import get_project_iri_lookup
10
+ from dsp_tools.commands.create.create_on_server.ontology import create_all_ontologies
11
+ from dsp_tools.commands.create.create_on_server.properties import create_all_properties
12
+ from dsp_tools.commands.create.models.create_problems import CollectedProblems
13
+ from dsp_tools.commands.create.models.parsed_ontology import ParsedOntology
14
+ from dsp_tools.commands.create.models.server_project_info import CreatedIriCollection
15
+ from dsp_tools.commands.create.models.server_project_info import ListNameToIriLookup
16
+ from dsp_tools.commands.create.models.server_project_info import ProjectIriLookup
17
+ from dsp_tools.utils.ansi_colors import BOLD
18
+ from dsp_tools.utils.ansi_colors import BOLD_RED
19
+ from dsp_tools.utils.ansi_colors import RESET_TO_DEFAULT
20
+
21
+
22
+ def create_ontologies(
23
+ parsed_ontologies: list[ParsedOntology],
24
+ list_name_2_iri: ListNameToIriLookup,
25
+ project_iri: str,
26
+ shortcode: str,
27
+ auth: AuthenticationClient,
28
+ ) -> bool:
29
+ success_collection = CreatedIriCollection()
30
+ onto_client = OntologyCreateClientLive(auth.server, auth)
31
+ overall_success = True
32
+
33
+ logger.info("Processing Ontology Section")
34
+ print(BOLD + "Processing Ontology Section:" + RESET_TO_DEFAULT)
35
+ project_iri_lookup, ontology_problems = _create_ontologies_on_server(
36
+ ontologies=parsed_ontologies,
37
+ project_iri=project_iri,
38
+ shortcode=shortcode,
39
+ client=onto_client,
40
+ )
41
+ if ontology_problems:
42
+ overall_success = False
43
+ print_problem_collection(ontology_problems)
44
+ if not project_iri_lookup.onto_iris:
45
+ msg = "No ontologies could be created on the server."
46
+ logger.error(msg)
47
+ print(BOLD_RED + " " + msg + RESET_TO_DEFAULT)
48
+ return False
49
+
50
+ all_classes = []
51
+ for onto in parsed_ontologies:
52
+ all_classes.extend(onto.classes)
53
+ if all_classes:
54
+ print(BOLD + "Processing Classes:" + RESET_TO_DEFAULT)
55
+ success_collection, cls_problems = create_all_classes(
56
+ classes=all_classes,
57
+ project_iri_lookup=project_iri_lookup,
58
+ created_iris=success_collection,
59
+ client=onto_client,
60
+ )
61
+ if cls_problems:
62
+ overall_success = False
63
+ print_problem_collection(cls_problems)
64
+ else:
65
+ logger.info("No classes found in the ontology.")
66
+
67
+ all_props = []
68
+ for onto in parsed_ontologies:
69
+ all_props.extend(onto.properties)
70
+ if all_props:
71
+ print(BOLD + "Processing Properties:" + RESET_TO_DEFAULT)
72
+ success_collection, property_problems = create_all_properties(
73
+ properties=all_props,
74
+ project_iri_lookup=project_iri_lookup,
75
+ created_iris=success_collection,
76
+ list_lookup=list_name_2_iri,
77
+ client=onto_client,
78
+ )
79
+ if property_problems:
80
+ overall_success = False
81
+ print_problem_collection(property_problems)
82
+ else:
83
+ logger.info("No properties found in the ontology.")
84
+
85
+ print(BOLD + "Processing Cardinalities:" + RESET_TO_DEFAULT)
86
+ problems = add_all_cardinalities(
87
+ ontologies=parsed_ontologies,
88
+ project_iri_lookup=project_iri_lookup,
89
+ created_iris=success_collection,
90
+ onto_client=onto_client,
91
+ )
92
+ if problems:
93
+ overall_success = False
94
+ print_problem_collection(problems)
95
+
96
+ return overall_success
97
+
98
+
99
+ def _create_ontologies_on_server(
100
+ ontologies: list[ParsedOntology], project_iri: str, shortcode: str, client: OntologyCreateClient
101
+ ) -> tuple[ProjectIriLookup, CollectedProblems | None]:
102
+ project_iri_lookup = get_project_iri_lookup(client.server, shortcode, project_iri)
103
+ new_ontologies = []
104
+ for parsed_onto in ontologies:
105
+ if not project_iri_lookup.does_onto_exist(parsed_onto.name):
106
+ new_ontologies.append(parsed_onto)
107
+ if not new_ontologies:
108
+ if len(ontologies) > 0:
109
+ msg = (
110
+ "No new ontologies were found in the project. "
111
+ "All ontologies already exist on the server. Continuing adding information to the ontologies."
112
+ )
113
+ logger.info(msg)
114
+ print(BOLD + " " + msg + RESET_TO_DEFAULT)
115
+ return project_iri_lookup, None
116
+ return create_all_ontologies(new_ontologies, project_iri_lookup, client)