dsp-tools 0.9.13__py3-none-any.whl → 18.3.0.post13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. dsp_tools/__init__.py +5 -0
  2. dsp_tools/cli/args.py +47 -0
  3. dsp_tools/cli/call_action.py +85 -0
  4. dsp_tools/cli/call_action_files_only.py +101 -0
  5. dsp_tools/cli/call_action_with_network.py +207 -0
  6. dsp_tools/cli/create_parsers.py +479 -0
  7. dsp_tools/cli/entry_point.py +322 -0
  8. dsp_tools/cli/utils.py +87 -0
  9. dsp_tools/clients/CLAUDE.md +420 -0
  10. dsp_tools/clients/authentication_client.py +14 -0
  11. dsp_tools/clients/authentication_client_live.py +66 -0
  12. dsp_tools/clients/connection.py +35 -0
  13. dsp_tools/clients/connection_live.py +233 -0
  14. dsp_tools/clients/fuseki_metrics.py +60 -0
  15. dsp_tools/clients/group_user_clients.py +35 -0
  16. dsp_tools/clients/group_user_clients_live.py +181 -0
  17. dsp_tools/clients/legal_info_client.py +23 -0
  18. dsp_tools/clients/legal_info_client_live.py +132 -0
  19. dsp_tools/clients/list_client.py +49 -0
  20. dsp_tools/clients/list_client_live.py +166 -0
  21. dsp_tools/clients/metadata_client.py +24 -0
  22. dsp_tools/clients/metadata_client_live.py +47 -0
  23. dsp_tools/clients/ontology_clients.py +49 -0
  24. dsp_tools/clients/ontology_create_client_live.py +166 -0
  25. dsp_tools/clients/ontology_get_client_live.py +80 -0
  26. dsp_tools/clients/permissions_client.py +68 -0
  27. dsp_tools/clients/project_client.py +16 -0
  28. dsp_tools/clients/project_client_live.py +66 -0
  29. dsp_tools/commands/create/communicate_problems.py +24 -0
  30. dsp_tools/commands/create/create.py +134 -0
  31. dsp_tools/commands/create/create_on_server/cardinalities.py +111 -0
  32. dsp_tools/commands/create/create_on_server/classes.py +99 -0
  33. dsp_tools/commands/create/create_on_server/complete_ontologies.py +116 -0
  34. dsp_tools/commands/create/create_on_server/default_permissions.py +134 -0
  35. dsp_tools/commands/create/create_on_server/group_users.py +165 -0
  36. dsp_tools/commands/create/create_on_server/lists.py +163 -0
  37. dsp_tools/commands/create/create_on_server/mappers.py +12 -0
  38. dsp_tools/commands/create/create_on_server/onto_utils.py +74 -0
  39. dsp_tools/commands/create/create_on_server/ontology.py +52 -0
  40. dsp_tools/commands/create/create_on_server/project.py +68 -0
  41. dsp_tools/commands/create/create_on_server/properties.py +119 -0
  42. dsp_tools/commands/create/exceptions.py +29 -0
  43. dsp_tools/commands/create/lists_only.py +66 -0
  44. dsp_tools/commands/create/models/create_problems.py +87 -0
  45. dsp_tools/commands/create/models/parsed_ontology.py +88 -0
  46. dsp_tools/commands/create/models/parsed_project.py +81 -0
  47. dsp_tools/commands/create/models/rdf_ontology.py +12 -0
  48. dsp_tools/commands/create/models/server_project_info.py +100 -0
  49. dsp_tools/commands/create/parsing/parse_lists.py +45 -0
  50. dsp_tools/commands/create/parsing/parse_ontology.py +243 -0
  51. dsp_tools/commands/create/parsing/parse_project.py +149 -0
  52. dsp_tools/commands/create/parsing/parsing_utils.py +40 -0
  53. dsp_tools/commands/create/project_validate.py +595 -0
  54. dsp_tools/commands/create/serialisation/ontology.py +119 -0
  55. dsp_tools/commands/create/serialisation/project.py +44 -0
  56. dsp_tools/commands/excel2json/CLAUDE.md +101 -0
  57. dsp_tools/commands/excel2json/json_header.py +321 -0
  58. dsp_tools/commands/excel2json/lists/__init__.py +0 -0
  59. dsp_tools/commands/excel2json/lists/compliance_checks.py +292 -0
  60. dsp_tools/commands/excel2json/lists/make_lists.py +247 -0
  61. dsp_tools/commands/excel2json/lists/models/__init__.py +0 -0
  62. dsp_tools/commands/excel2json/lists/models/deserialise.py +30 -0
  63. dsp_tools/commands/excel2json/lists/models/input_error.py +216 -0
  64. dsp_tools/commands/excel2json/lists/models/serialise.py +57 -0
  65. dsp_tools/commands/excel2json/lists/utils.py +81 -0
  66. dsp_tools/commands/excel2json/models/__init__.py +0 -0
  67. dsp_tools/commands/excel2json/models/input_error.py +416 -0
  68. dsp_tools/commands/excel2json/models/json_header.py +175 -0
  69. dsp_tools/commands/excel2json/models/list_node_name.py +16 -0
  70. dsp_tools/commands/excel2json/models/ontology.py +76 -0
  71. dsp_tools/commands/excel2json/old_lists.py +328 -0
  72. dsp_tools/commands/excel2json/project.py +280 -0
  73. dsp_tools/commands/excel2json/properties.py +370 -0
  74. dsp_tools/commands/excel2json/resources.py +336 -0
  75. dsp_tools/commands/excel2json/utils.py +352 -0
  76. dsp_tools/commands/excel2xml/__init__.py +7 -0
  77. dsp_tools/commands/excel2xml/excel2xml_cli.py +523 -0
  78. dsp_tools/commands/excel2xml/excel2xml_lib.py +1953 -0
  79. dsp_tools/commands/excel2xml/propertyelement.py +47 -0
  80. dsp_tools/commands/get/__init__.py +0 -0
  81. dsp_tools/commands/get/get.py +166 -0
  82. dsp_tools/commands/get/get_permissions.py +257 -0
  83. dsp_tools/commands/get/get_permissions_legacy.py +89 -0
  84. dsp_tools/commands/get/legacy_models/__init__.py +0 -0
  85. dsp_tools/commands/get/legacy_models/context.py +318 -0
  86. dsp_tools/commands/get/legacy_models/group.py +241 -0
  87. dsp_tools/commands/get/legacy_models/helpers.py +47 -0
  88. dsp_tools/commands/get/legacy_models/listnode.py +390 -0
  89. dsp_tools/commands/get/legacy_models/model.py +12 -0
  90. dsp_tools/commands/get/legacy_models/ontology.py +324 -0
  91. dsp_tools/commands/get/legacy_models/project.py +366 -0
  92. dsp_tools/commands/get/legacy_models/propertyclass.py +417 -0
  93. dsp_tools/commands/get/legacy_models/resourceclass.py +676 -0
  94. dsp_tools/commands/get/legacy_models/user.py +438 -0
  95. dsp_tools/commands/get/models/__init__.py +0 -0
  96. dsp_tools/commands/get/models/permissions_models.py +10 -0
  97. dsp_tools/commands/id2iri.py +258 -0
  98. dsp_tools/commands/ingest_xmlupload/__init__.py +0 -0
  99. dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +178 -0
  100. dsp_tools/commands/ingest_xmlupload/create_resources/__init__.py +0 -0
  101. dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +69 -0
  102. dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +166 -0
  103. dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +121 -0
  104. dsp_tools/commands/ingest_xmlupload/ingest_files/__init__.py +0 -0
  105. dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +64 -0
  106. dsp_tools/commands/ingest_xmlupload/upload_files/__init__.py +0 -0
  107. dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +20 -0
  108. dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +57 -0
  109. dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +66 -0
  110. dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +67 -0
  111. dsp_tools/commands/resume_xmlupload/__init__.py +0 -0
  112. dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +96 -0
  113. dsp_tools/commands/start_stack.py +428 -0
  114. dsp_tools/commands/update_legal/CLAUDE.md +344 -0
  115. dsp_tools/commands/update_legal/__init__.py +0 -0
  116. dsp_tools/commands/update_legal/core.py +182 -0
  117. dsp_tools/commands/update_legal/csv_operations.py +135 -0
  118. dsp_tools/commands/update_legal/models.py +87 -0
  119. dsp_tools/commands/update_legal/xml_operations.py +247 -0
  120. dsp_tools/commands/validate_data/CLAUDE.md +159 -0
  121. dsp_tools/commands/validate_data/__init__.py +0 -0
  122. dsp_tools/commands/validate_data/constants.py +59 -0
  123. dsp_tools/commands/validate_data/mappers.py +143 -0
  124. dsp_tools/commands/validate_data/models/__init__.py +0 -0
  125. dsp_tools/commands/validate_data/models/api_responses.py +45 -0
  126. dsp_tools/commands/validate_data/models/input_problems.py +119 -0
  127. dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
  128. dsp_tools/commands/validate_data/models/validation.py +106 -0
  129. dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
  130. dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
  131. dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
  132. dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
  133. dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
  134. dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
  135. dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
  136. dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
  137. dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
  138. dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
  139. dsp_tools/commands/validate_data/sparql/cardinality_shacl.py +209 -0
  140. dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
  141. dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
  142. dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
  143. dsp_tools/commands/validate_data/utils.py +59 -0
  144. dsp_tools/commands/validate_data/validate_data.py +283 -0
  145. dsp_tools/commands/validate_data/validation/__init__.py +0 -0
  146. dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
  147. dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
  148. dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
  149. dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
  150. dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
  151. dsp_tools/commands/xmlupload/__init__.py +0 -0
  152. dsp_tools/commands/xmlupload/iri_resolver.py +21 -0
  153. dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
  154. dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
  155. dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
  156. dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
  157. dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
  158. dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
  159. dsp_tools/commands/xmlupload/models/__init__.py +0 -0
  160. dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
  161. dsp_tools/commands/xmlupload/models/formatted_text_value.py +10 -0
  162. dsp_tools/commands/xmlupload/models/ingest.py +143 -0
  163. dsp_tools/commands/xmlupload/models/input_problems.py +58 -0
  164. dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
  165. dsp_tools/commands/xmlupload/models/permission.py +45 -0
  166. dsp_tools/commands/xmlupload/models/permissions_parsed.py +93 -0
  167. dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
  168. dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
  169. dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
  170. dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
  171. dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
  172. dsp_tools/commands/xmlupload/models/upload_clients.py +14 -0
  173. dsp_tools/commands/xmlupload/models/upload_state.py +20 -0
  174. dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
  175. dsp_tools/commands/xmlupload/prepare_xml_input/ark2iri.py +55 -0
  176. dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
  177. dsp_tools/commands/xmlupload/prepare_xml_input/iiif_uri_validator.py +50 -0
  178. dsp_tools/commands/xmlupload/prepare_xml_input/list_client.py +120 -0
  179. dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
  180. dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
  181. dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
  182. dsp_tools/commands/xmlupload/resource_create_client.py +25 -0
  183. dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
  184. dsp_tools/commands/xmlupload/stash/__init__.py +0 -0
  185. dsp_tools/commands/xmlupload/stash/analyse_circular_reference_graph.py +236 -0
  186. dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
  187. dsp_tools/commands/xmlupload/stash/graph_models.py +87 -0
  188. dsp_tools/commands/xmlupload/stash/stash_circular_references.py +68 -0
  189. dsp_tools/commands/xmlupload/stash/stash_models.py +109 -0
  190. dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +106 -0
  191. dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +196 -0
  192. dsp_tools/commands/xmlupload/upload_config.py +76 -0
  193. dsp_tools/commands/xmlupload/write_diagnostic_info.py +27 -0
  194. dsp_tools/commands/xmlupload/xmlupload.py +516 -0
  195. dsp_tools/config/__init__.py +0 -0
  196. dsp_tools/config/logger_config.py +69 -0
  197. dsp_tools/config/warnings_config.py +32 -0
  198. dsp_tools/error/__init__.py +0 -0
  199. dsp_tools/error/custom_warnings.py +39 -0
  200. dsp_tools/error/exceptions.py +204 -0
  201. dsp_tools/error/problems.py +10 -0
  202. dsp_tools/error/xmllib_errors.py +20 -0
  203. dsp_tools/error/xmllib_warnings.py +54 -0
  204. dsp_tools/error/xmllib_warnings_util.py +159 -0
  205. dsp_tools/error/xsd_validation_error_msg.py +19 -0
  206. dsp_tools/legacy_models/__init__.py +0 -0
  207. dsp_tools/legacy_models/datetimestamp.py +81 -0
  208. dsp_tools/legacy_models/langstring.py +253 -0
  209. dsp_tools/legacy_models/projectContext.py +49 -0
  210. dsp_tools/py.typed +0 -0
  211. dsp_tools/resources/schema/data.xsd +648 -0
  212. dsp_tools/resources/schema/lists-only.json +72 -0
  213. dsp_tools/resources/schema/project.json +1258 -0
  214. dsp_tools/resources/schema/properties-only.json +874 -0
  215. dsp_tools/resources/schema/resources-only.json +140 -0
  216. dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
  217. dsp_tools/resources/start-stack/docker-compose.override.yml +11 -0
  218. dsp_tools/resources/start-stack/docker-compose.yml +88 -0
  219. dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
  220. dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
  221. dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
  222. dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
  223. dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
  224. dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
  225. dsp_tools/utils/__init__.py +0 -0
  226. dsp_tools/utils/ansi_colors.py +32 -0
  227. dsp_tools/utils/data_formats/__init__.py +0 -0
  228. dsp_tools/utils/data_formats/date_util.py +166 -0
  229. dsp_tools/utils/data_formats/iri_util.py +30 -0
  230. dsp_tools/utils/data_formats/shared.py +81 -0
  231. dsp_tools/utils/data_formats/uri_util.py +76 -0
  232. dsp_tools/utils/fuseki_bloating.py +63 -0
  233. dsp_tools/utils/json_parsing.py +22 -0
  234. dsp_tools/utils/rdf_constants.py +42 -0
  235. dsp_tools/utils/rdflib_utils.py +10 -0
  236. dsp_tools/utils/replace_id_with_iri.py +66 -0
  237. dsp_tools/utils/request_utils.py +238 -0
  238. dsp_tools/utils/xml_parsing/__init__.py +0 -0
  239. dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
  240. dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
  241. dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
  242. dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
  243. dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
  244. dsp_tools/xmllib/CLAUDE.md +302 -0
  245. dsp_tools/xmllib/__init__.py +49 -0
  246. dsp_tools/xmllib/general_functions.py +877 -0
  247. dsp_tools/xmllib/internal/__init__.py +0 -0
  248. dsp_tools/xmllib/internal/checkers.py +162 -0
  249. dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
  250. dsp_tools/xmllib/internal/constants.py +46 -0
  251. dsp_tools/xmllib/internal/input_converters.py +155 -0
  252. dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
  253. dsp_tools/xmllib/internal/serialise_resource.py +177 -0
  254. dsp_tools/xmllib/internal/serialise_values.py +152 -0
  255. dsp_tools/xmllib/internal/type_aliases.py +11 -0
  256. dsp_tools/xmllib/models/__init__.py +0 -0
  257. dsp_tools/xmllib/models/config_options.py +28 -0
  258. dsp_tools/xmllib/models/date_formats.py +48 -0
  259. dsp_tools/xmllib/models/dsp_base_resources.py +1542 -0
  260. dsp_tools/xmllib/models/internal/__init__.py +0 -0
  261. dsp_tools/xmllib/models/internal/file_values.py +172 -0
  262. dsp_tools/xmllib/models/internal/geometry.py +162 -0
  263. dsp_tools/xmllib/models/internal/migration_metadata.py +55 -0
  264. dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
  265. dsp_tools/xmllib/models/internal/values.py +342 -0
  266. dsp_tools/xmllib/models/licenses/__init__.py +0 -0
  267. dsp_tools/xmllib/models/licenses/other.py +59 -0
  268. dsp_tools/xmllib/models/licenses/recommended.py +107 -0
  269. dsp_tools/xmllib/models/permissions.py +41 -0
  270. dsp_tools/xmllib/models/res.py +1782 -0
  271. dsp_tools/xmllib/models/root.py +348 -0
  272. dsp_tools/xmllib/value_checkers.py +434 -0
  273. dsp_tools/xmllib/value_converters.py +777 -0
  274. dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
  275. dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
  276. dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
  277. dsp_tools-18.3.0.post13.dist-info/entry_points.txt +3 -0
  278. dsp_tools-0.9.13.dist-info/LICENSE +0 -674
  279. dsp_tools-0.9.13.dist-info/METADATA +0 -144
  280. dsp_tools-0.9.13.dist-info/RECORD +0 -71
  281. dsp_tools-0.9.13.dist-info/WHEEL +0 -5
  282. dsp_tools-0.9.13.dist-info/entry_points.txt +0 -3
  283. dsp_tools-0.9.13.dist-info/top_level.txt +0 -1
  284. dsplib/models/connection.py +0 -272
  285. dsplib/models/group.py +0 -296
  286. dsplib/models/helpers.py +0 -505
  287. dsplib/models/langstring.py +0 -277
  288. dsplib/models/listnode.py +0 -578
  289. dsplib/models/model.py +0 -20
  290. dsplib/models/ontology.py +0 -448
  291. dsplib/models/permission.py +0 -112
  292. dsplib/models/project.py +0 -547
  293. dsplib/models/propertyclass.py +0 -505
  294. dsplib/models/resource.py +0 -366
  295. dsplib/models/resourceclass.py +0 -810
  296. dsplib/models/sipi.py +0 -30
  297. dsplib/models/user.py +0 -731
  298. dsplib/models/value.py +0 -1000
  299. dsplib/utils/knora-data-schema.xsd +0 -454
  300. dsplib/utils/knora-schema-lists.json +0 -83
  301. dsplib/utils/knora-schema.json +0 -434
  302. dsplib/utils/onto_commons.py +0 -24
  303. dsplib/utils/onto_create_lists.py +0 -73
  304. dsplib/utils/onto_create_ontology.py +0 -442
  305. dsplib/utils/onto_get.py +0 -58
  306. dsplib/utils/onto_validate.py +0 -33
  307. dsplib/utils/xml_upload.py +0 -539
  308. dsplib/widgets/doublepassword.py +0 -80
  309. knora/MLS-import-libraries.py +0 -84
  310. knora/dsp_tools.py +0 -96
  311. knora/dsplib/models/connection.py +0 -272
  312. knora/dsplib/models/group.py +0 -296
  313. knora/dsplib/models/helpers.py +0 -506
  314. knora/dsplib/models/langstring.py +0 -277
  315. knora/dsplib/models/listnode.py +0 -578
  316. knora/dsplib/models/model.py +0 -20
  317. knora/dsplib/models/ontology.py +0 -448
  318. knora/dsplib/models/permission.py +0 -112
  319. knora/dsplib/models/project.py +0 -583
  320. knora/dsplib/models/propertyclass.py +0 -505
  321. knora/dsplib/models/resource.py +0 -416
  322. knora/dsplib/models/resourceclass.py +0 -811
  323. knora/dsplib/models/sipi.py +0 -35
  324. knora/dsplib/models/user.py +0 -731
  325. knora/dsplib/models/value.py +0 -1000
  326. knora/dsplib/utils/knora-data-schema.xsd +0 -464
  327. knora/dsplib/utils/knora-schema-lists.json +0 -83
  328. knora/dsplib/utils/knora-schema.json +0 -444
  329. knora/dsplib/utils/onto_commons.py +0 -24
  330. knora/dsplib/utils/onto_create_lists.py +0 -73
  331. knora/dsplib/utils/onto_create_ontology.py +0 -451
  332. knora/dsplib/utils/onto_get.py +0 -58
  333. knora/dsplib/utils/onto_validate.py +0 -33
  334. knora/dsplib/utils/xml_upload.py +0 -540
  335. knora/dsplib/widgets/doublepassword.py +0 -80
  336. knora/knora.py +0 -2108
  337. knora/test.py +0 -99
  338. knora/testit.py +0 -76
  339. knora/xml2knora.py +0 -633
  340. {dsplib → dsp_tools/cli}/__init__.py +0 -0
  341. {dsplib/models → dsp_tools/clients}/__init__.py +0 -0
  342. {dsplib/utils → dsp_tools/commands}/__init__.py +0 -0
  343. {dsplib/widgets → dsp_tools/commands/create}/__init__.py +0 -0
  344. {knora → dsp_tools/commands/create/create_on_server}/__init__.py +0 -0
  345. {knora/dsplib → dsp_tools/commands/create/models}/__init__.py +0 -0
  346. {knora/dsplib/models → dsp_tools/commands/create/parsing}/__init__.py +0 -0
  347. {knora/dsplib/utils → dsp_tools/commands/create/serialisation}/__init__.py +0 -0
  348. {knora/dsplib/widgets → dsp_tools/commands/excel2json}/__init__.py +0 -0
@@ -1,442 +0,0 @@
1
- import os
2
- from typing import List, Set, Dict, Tuple, Optional
3
- import json
4
- from jsonschema import validate
5
-
6
- from ..models.helpers import Actions, BaseError, Context, Cardinality
7
- from ..models.langstring import Languages, LangStringParam, LangString
8
- from ..models.connection import Connection
9
- from ..models.project import Project
10
- from ..models.listnode import ListNode
11
- from ..models.group import Group
12
- from ..models.user import User
13
- from ..models.ontology import Ontology
14
- from ..models.propertyclass import PropertyClass
15
- from ..models.resourceclass import ResourceClass
16
-
17
- from .onto_commons import list_creator
18
-
19
-
20
- def create_ontology(input_file: str,
21
- lists_file: str,
22
- server: str,
23
- user: str,
24
- password: str,
25
- verbose: bool,
26
- dump: bool) -> bool:
27
- current_dir = os.path.dirname(os.path.realpath(__file__))
28
-
29
- # let's read the schema for the data model definition
30
- with open(os.path.join(current_dir, 'knora-schema.json')) as s:
31
- schema = json.load(s)
32
-
33
- # read the data model definition
34
- with open(input_file) as f:
35
- datamodel = json.load(f)
36
-
37
- # validate the data model definition in order to be sure that it is correct
38
- validate(datamodel, schema)
39
- if verbose:
40
- print("Data model is syntactically correct and passed validation!")
41
-
42
- #
43
- # Connect to the DaSCH Service Platform API
44
- #
45
- con = Connection(server)
46
- con.login(user, password)
47
- if dump:
48
- con.start_logging()
49
-
50
- # --------------------------------------------------------------------------
51
- # let's read the prefixes of external ontologies that may be used
52
- #
53
- context = Context(datamodel["prefixes"])
54
-
55
- # --------------------------------------------------------------------------
56
- # Let's create the project...
57
- #
58
- project = None
59
- try:
60
- # we try to read the project to see if it's existing....
61
- project = Project(
62
- con=con,
63
- shortcode=datamodel["project"]["shortcode"],
64
- ).read()
65
- #
66
- # we got it, update the project data if necessary...
67
- #
68
- if project.shortname != datamodel["project"]["shortname"]:
69
- project.shortname = datamodel["project"]["shortname"]
70
- if project.longname != datamodel["project"]["longname"]:
71
- project.longname == datamodel["project"]["longname"]
72
- project.description = datamodel["project"].get("descriptions")
73
- project.keywords = set(datamodel["project"].get("keywords"))
74
- nproject = project.update()
75
- if nproject is not None:
76
- project = nproject
77
- if verbose:
78
- print("Modified project:")
79
- project.print()
80
- except:
81
- #
82
- # The project doesn't exist yet – let's create it
83
- #
84
- try:
85
- project = Project(
86
- con=con,
87
- shortcode=datamodel["project"]["shortcode"],
88
- shortname=datamodel["project"]["shortname"],
89
- longname=datamodel["project"]["longname"],
90
- description=LangString(datamodel["project"].get("descriptions")),
91
- keywords=set(datamodel["project"].get("keywords")),
92
- selfjoin=False,
93
- status=True
94
- ).create()
95
- except BaseError as err:
96
- print("Creating project failed: " + err.message)
97
- return False
98
- if verbose:
99
- print("Created project:")
100
- project.print()
101
- assert project is not None
102
-
103
- # --------------------------------------------------------------------------
104
- # now let's create the lists
105
- #
106
- if verbose:
107
- print("Creating lists...")
108
- lists = datamodel["project"].get('lists')
109
- listrootnodes = {}
110
- if lists is not None:
111
- for rootnode in lists:
112
- if verbose is not None:
113
- print(" Creating list:" + rootnode['name'])
114
- root_list_node = ListNode(
115
- con=con,
116
- project=project,
117
- label=rootnode['labels'],
118
- comment=rootnode.get('comments'),
119
- name=rootnode['name']
120
- ).create()
121
- listnodes = list_creator(con, project, root_list_node, rootnode['nodes'])
122
- listrootnodes[rootnode['name']] = {
123
- "id": root_list_node.id,
124
- "nodes": listnodes
125
- }
126
-
127
- with open('lists.json', 'w', encoding="utf-8") as fp:
128
- json.dump(listrootnodes, fp, indent=3, sort_keys=True)
129
- print("The definitions of the node-id's can be found in \"{}\"!".format('lists.json'))
130
-
131
- # --------------------------------------------------------------------------
132
- # now let's add the groups (if there are groups defined...)
133
- #
134
- if verbose:
135
- print("Adding groups...")
136
-
137
- new_groups = {}
138
- groups = datamodel["project"].get('groups')
139
- if groups is not None:
140
- for group in groups:
141
- try:
142
- new_group = Group(con=con,
143
- name=group["name"],
144
- description=group["description"],
145
- project=project,
146
- status=group["status"] if group.get("status") is not None else True,
147
- selfjoin=group["selfjoin"] if group.get("selfjoin") is not None else False).create()
148
- except BaseError as err:
149
- print("Creating group failed: " + err.message)
150
- return False
151
- new_groups[new_group.name] = new_group
152
- if verbose:
153
- print("Groups:")
154
- new_group.print()
155
-
156
- # --------------------------------------------------------------------------
157
- # now let's add the users (if there are users defined...)
158
- #
159
- if verbose:
160
- print("Adding users...")
161
- all_groups: List[Group] = []
162
- all_projects: List[Project] = []
163
- users = datamodel["project"].get('users')
164
- if users is not None:
165
- for user in users:
166
- sysadmin = False
167
- group_ids: Set[str] = set()
168
- for groupname in user["groups"]:
169
- #
170
- # First we determine the groups the user is in because we can do this in one call
171
- # groupname has the form [proj_shortname]:groupname|"SystemAdmin"
172
- # (projectname omitted = current project)
173
- #
174
- tmp = groupname.split(':')
175
- if len(tmp) > 1:
176
- group = None
177
- if tmp[0] and tmp[0] != '':
178
- # we have 'proj_shortname:groupname
179
- if not all_groups:
180
- all_groups = Group.getAllGroups(con)
181
- tmp_group = list(filter(lambda g: g.project.shortname == tmp[0] and g.name == tmp[1], all_groups))
182
- assert len(tmp_group) == 1
183
- group = tmp_group[0]
184
- else:
185
- # we have ':groupname' and add to current project
186
- group = new_groups.get(tmp[1])
187
- assert group is not None
188
- group_ids.add(group.id)
189
- else:
190
- if tmp[0] == "SystemAdmin":
191
- sysadmin = True
192
-
193
- project_infos: Dict[str, bool] = {}
194
- for projectname in user["projects"]:
195
- #
196
- # now we determine the project memberships of the user
197
- # projectname has the form [projectname]:"member"|"admin" (projectname omitted = current project)
198
- #
199
- tmp = projectname.split(':')
200
- assert len(tmp) == 2
201
- if tmp[0]:
202
- # we have 'proj_shortname:"member"|"admin"'
203
- if not all_projects:
204
- all_projects = project.getAllProjects(con)
205
- tmp_project = list(filter(lambda g: g.shortname == tmp[0], all_projects))
206
- assert len(tmp_project) == 1
207
- in_project = tmp_project[0]
208
- else:
209
- # we have ':"member"|"admin"'
210
- in_project = project
211
- if tmp[1] == "admin":
212
- project_infos[in_project.id] = True
213
- else:
214
- project_infos[in_project.id] = False
215
- user_existing = False;
216
- tmp_user = None
217
- try:
218
- tmp_user = User(con, username=user["username"]).read()
219
- except BaseError as err:
220
- pass
221
- if tmp_user is None:
222
- try:
223
- tmp_user = User(con, email=user["email"]).read()
224
- except BaseError as err:
225
- pass
226
- if tmp_user:
227
- #
228
- # The user is already in the database – let's update its settings
229
- #
230
- if tmp_user.username != user["username"]:
231
- tmp_user.username = user["username"]
232
- if tmp_user.email != user["email"]:
233
- tmp_user.email = user["email"]
234
- if tmp_user.givenName != user["givenName"]:
235
- tmp_user.givenName = user["givenName"]
236
- if tmp_user.familyName != user["familyName"]:
237
- tmp_user.familyName = user["familyName"]
238
- if tmp_user.password != user["password"]:
239
- tmp_user.password = user["password"]
240
- if user.get("status") and tmp_user.status != user["status"]:
241
- tmp_user.status = user["status"]
242
- if user.get("lang") and tmp_user.lang != user["lang"]:
243
- tmp_user.lang = user["lang"]
244
- if tmp_user.sysadmin != sysadmin:
245
- tmp_user.sysadmin = sysadmin
246
- try:
247
- tmp_user.update()
248
- except BaseError as err:
249
- tmp_user.print()
250
- print("Updating user failed: " + err.message)
251
- return False
252
- #
253
- # now we update group and project membership
254
- # Note: we do NOT remove any mambership here, we just add!
255
- #
256
- tmp_in_groups = tmp_user.in_groups
257
- add_groups = group_ids - tmp_in_groups
258
- for g in add_groups:
259
- User.addToGroup(g)
260
- rm_groups = tmp_in_groups - group_ids
261
- # we do no remove a user from a group here!
262
- tmp_in_projects = tmp_user.in_projects
263
- for p in project_infos.items():
264
- if tmp_in_projects.get(p[0]) and tmp_in_projects[p[0]] == p[1]:
265
- continue
266
- User.addToProject(p[0], p[1])
267
- else:
268
- #
269
- # The user does not exist yet, let's create a new one
270
- #
271
- try:
272
- new_user = User(
273
- con=con,
274
- username=user["username"],
275
- email=user["email"],
276
- givenName=user["givenName"],
277
- familyName=user["familyName"],
278
- password=user["password"],
279
- status=user["status"] if user.get("status") is not None else True,
280
- lang=user["lang"] if user.get("lang") is not None else "en",
281
- sysadmin=sysadmin,
282
- in_projects=project_infos,
283
- in_groups=group_ids
284
- ).create()
285
- except BaseError as err:
286
- print("Creating user failed: " + err.message)
287
- return False
288
- if verbose:
289
- print("New user:")
290
- new_user.print()
291
-
292
- # --------------------------------------------------------------------------
293
- # now let's create the ontologies
294
- #
295
- ontologies = datamodel["project"]["ontologies"]
296
- for ontology in ontologies:
297
- newontology = Ontology(
298
- con=con,
299
- project=project,
300
- label=ontology["label"],
301
- name=ontology["name"]
302
- ).create()
303
- last_modification_date = newontology.lastModificationDate
304
- if verbose:
305
- print("Created empty ontology:")
306
- newontology.print()
307
-
308
- #
309
- # First we create the empty resource classes
310
- #
311
- resclasses = ontology["resources"]
312
- newresclasses: Dict[str, ResourceClass] = {}
313
- for resclass in resclasses:
314
- resname = resclass.get("name")
315
- super_classes = resclass.get("super")
316
- if isinstance(super_classes, str):
317
- super_classes = [super_classes]
318
- reslabel = LangString(resclass.get("labels"))
319
- rescomment = resclass.get("comment")
320
- if rescomment is not None:
321
- rescomment = LangString(rescomment)
322
- try:
323
- last_modification_date, newresclass = ResourceClass(
324
- con=con,
325
- context=newontology.context,
326
- ontology_id=newontology.id,
327
- name=resname,
328
- superclasses=super_classes,
329
- label=reslabel,
330
- comment=rescomment
331
- ).create(last_modification_date)
332
- newontology.lastModificationDate = last_modification_date
333
- except BaseError as err:
334
- print("Creating resource class failed: " + err.message)
335
- exit(105)
336
- newresclasses[newresclass.id] = newresclass
337
- if verbose is not None:
338
- print("New resource class:")
339
- newresclass.print()
340
-
341
- #
342
- # Then we create the property classes
343
- #
344
- propclasses = ontology["properties"]
345
- newpropclasses: Dict[str, ResourceClass] = {}
346
- for propclass in propclasses:
347
- propname = propclass.get("name")
348
- proplabel = LangString(propclass.get("labels"))
349
- #
350
- # get the super-property/ies if defined. Valid forms are:
351
- # - "prefix:superproperty" : fully qualified name of property in another ontology. The prefix has to
352
- # be defined in the prefixes part.
353
- # - "superproperty" : Use of super-property defined in the knora-api ontology
354
- # if omitted, automatically "knora-api:hasValue" is assumed
355
- #
356
- if propclass.get("super") is not None:
357
- super_props = list(map(lambda a: a if ':' in a else "knora-api:" + a, propclass["super"]))
358
- else:
359
- super_props = ["knora-api:hasValue"]
360
- #
361
- # now we get the "object" if defined. Valid forms are:
362
- # - "prefix:object_name" : fully qualified object. The prefix has to be defined in the prefixes part.
363
- # - ":object_name" : The object is defined in the current ontology.
364
- # - "object_name" : The object is defined in "knora-api"
365
- #
366
- if propclass.get("object") is not None:
367
- tmp = propclass["object"].split(':')
368
- if len(tmp) > 1:
369
- if tmp[0]:
370
- object = propclass["object"] # fully qualified name
371
- else:
372
- newontology.print()
373
- object = newontology.name + ':' + tmp[1]
374
- else:
375
- object = "knora-api:" + propclass["object"]
376
- else:
377
- object = None
378
-
379
- if propclass.get("subject") is not None:
380
- subject = propclass["subject"]
381
- else:
382
- subject = None
383
- gui_element = propclass.get("gui_element")
384
- gui_attributes = propclass.get("gui_attributes")
385
- if gui_attributes is not None and gui_attributes.get("hlist") is not None:
386
- gui_attributes['hlist'] = "<" + listrootnodes[gui_attributes['hlist']]["id"] + ">"
387
- propcomment = propclass.get("comment")
388
- if propcomment is not None:
389
- propcomment = LangString(propcomment)
390
- else:
391
- propcomment = "no comment given"
392
- try:
393
- last_modification_date, newpropclass = PropertyClass(
394
- con=con,
395
- context=newontology.context,
396
- label=proplabel,
397
- name=propname,
398
- ontology_id=newontology.id,
399
- superproperties=super_props,
400
- object=object,
401
- subject=subject,
402
- gui_element="salsah-gui:" + gui_element,
403
- gui_attributes=gui_attributes,
404
- comment=propcomment
405
- ).create(last_modification_date)
406
- newontology.lastModificationDate = last_modification_date
407
- except BaseError as err:
408
- print("Creating property class failed: " + err.message)
409
- return False
410
- newpropclasses[newpropclass.id] = newpropclass
411
- if verbose:
412
- print("New property class:")
413
- newpropclass.print()
414
-
415
- #
416
- # Add cardinalities
417
- #
418
- switcher = {
419
- "1": Cardinality.C_1,
420
- "0-1": Cardinality.C_0_1,
421
- "0-n": Cardinality.C_0_n,
422
- "1-n": Cardinality.C_1_n
423
- }
424
- for resclass in resclasses:
425
- for cardinfo in resclass["cardinalities"]:
426
- rc = newresclasses.get(newontology.id + '#' + resclass["name"])
427
- cardinality = switcher[cardinfo["cardinality"]]
428
- tmp = cardinfo["propname"].split(':')
429
- if len(tmp) > 1:
430
- if tmp[0]:
431
- propid = cardinfo["propname"] # fully qualified name
432
- else:
433
- propid = newontology.name + ':' + tmp[1]
434
- else:
435
- propid = "knora-api:" + cardinfo["propname"]
436
- gui_order = cardinfo.get('gui_order')
437
- last_modification_date = rc.addProperty(property_id=propid,
438
- cardinality=cardinality,
439
- gui_order=gui_order,
440
- last_modification_date=last_modification_date)
441
- newontology.lastModificationDate = last_modification_date
442
- return True
dsplib/utils/onto_get.py DELETED
@@ -1,58 +0,0 @@
1
- from typing import List, Set, Dict, Tuple, Optional, Any, Union
2
-
3
- import json
4
- import re
5
-
6
- from ..models.connection import Connection
7
- from ..models.project import Project
8
- from ..models.listnode import ListNode
9
- from ..models.ontology import Ontology
10
-
11
-
12
- def get_ontology(projident: str, outfile: str, server: str, user: str, password: str, verbose: bool) -> bool:
13
- con = Connection(server)
14
- # con.login(user, password)
15
- if re.match("^[0-9aAbBcCdDeEfF]{4}$", projident):
16
- project = Project(con=con, shortcode=projident)
17
- elif re.match("^[\\w-]+$", projident):
18
- project = Project(con=con, shortname=projident)
19
- elif re.match("^(http)s?://([\\w\\.\\-~]+:?\\d{,4})(/[\\w\\-~]+)+$", projident):
20
- project = Project(con=con, shortname=projident)
21
- else:
22
- print("Invalid project identification!")
23
- return False
24
-
25
- project = project.read()
26
-
27
- projectobj = project.createDefinitionFileObj()
28
-
29
- #
30
- # now collect the lists
31
- #
32
- listroots = ListNode.getAllLists(con=con, project_iri=project.id)
33
- listobj = []
34
- for listroot in listroots:
35
- complete_list = listroot.getAllNodes()
36
- listobj.append(complete_list.createDefinitionFileObj())
37
- projectobj["lists"] = listobj
38
-
39
- projectobj["ontologies"] = []
40
- prefixes: Dict[str, str] = {}
41
- ontologies = Ontology.getProjectOntologies(con, project.id)
42
- ontology_ids = [x.id for x in ontologies]
43
- for ontology in ontology_ids:
44
- oparts = ontology.split("/")
45
- name = oparts[len(oparts) - 2]
46
- shortcode = oparts[len(oparts) - 3]
47
- ontology = Ontology.getOntologyFromServer(con=con, shortcode=shortcode, name=name)
48
- projectobj["ontologies"].append(ontology.createDefinitionFileObj())
49
- prefixes.update(ontology.context.get_externals_used())
50
-
51
- umbrella = {
52
- "prefixes": prefixes,
53
- "project": projectobj
54
- }
55
-
56
- with open(outfile, 'w', encoding='utf8') as outfile:
57
- json.dump(umbrella, outfile, indent=3, ensure_ascii=False)
58
-
@@ -1,33 +0,0 @@
1
- import os
2
- import json
3
- from jsonschema import validate
4
-
5
-
6
- def validate_list(input_file: str) -> None:
7
- current_dir = os.path.dirname(os.path.realpath(__file__))
8
-
9
- # let's read the schema for the data model definition
10
- with open(os.path.join(current_dir, 'knora-schema-lists.json')) as s:
11
- schema = json.load(s)
12
- # read the data model definition
13
- with open(input_file) as f:
14
- datamodel = json.load(f)
15
-
16
- # validate the data model definition in order to be sure that it is correct
17
- validate(datamodel, schema)
18
- print("Data model is syntactically correct and passed validation!")
19
-
20
-
21
- def validate_ontology(input_file: str) -> None:
22
- current_dir = os.path.dirname(os.path.realpath(__file__))
23
-
24
- with open(os.path.join(current_dir, 'knora-schema.json')) as s:
25
- schema = json.load(s)
26
- # read the data model definition
27
- with open(input_file) as f:
28
- datamodel = json.load(f)
29
-
30
- # validate the data model definition in order to be sure that it is correct
31
- validate(datamodel, schema)
32
- print("Data model is syntactically correct and passed validation!")
33
-