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,540 +0,0 @@
1
- import os
2
- import re
3
-
4
- from typing import List, Set, Dict, Tuple, Optional, Union
5
- from lxml import etree
6
- from pprint import pprint
7
-
8
- from dsplib.models.connection import Connection
9
- from dsplib.models.group import Group
10
- from dsplib.models.helpers import IriTest
11
- from dsplib.models.project import Project
12
- from dsplib.models.resource import ResourceInstanceFactory
13
- from dsplib.models.value import BooleanValue, ColorValue, DateValue, DecimalValue, IntValue, IntervalValue, TextValue, \
14
- UriValue, KnoraStandoffXml, make_value
15
- from dsplib.models.permission import PermissionValue, Permissions
16
- from dsplib.models.sipi import Sipi
17
-
18
- StrDict = Dict[str, str]
19
-
20
- StrObj = Union[str, StrDict]
21
-
22
- VarStrObj = Union[StrObj, List[StrObj]]
23
-
24
- richtext_tags = [
25
- 'p', 'em', 'strong', 'u', 'sub', 'strike', 'a', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'ul', 'li', 'tbody',
26
- 'table', 'tr', 'td', 'br', 'hr', 'pre', 'cite', 'blockquote', 'code'
27
- ]
28
-
29
- class XmlError(BaseException):
30
-
31
- def __init__(self, msg: str):
32
- self._message = msg
33
-
34
- def __str__(self):
35
- return 'XML-ERROR: ' + self._message
36
-
37
-
38
- class ProjectContext:
39
- _projects: Project
40
- _groups: Group
41
- _projectmap: Dict[str, str]
42
- _invprojectmap: Dict[str, str]
43
- _groupmap: Dict[str, str]
44
- _shortcode: Union[str, None]
45
- _project_name: Union[str, None]
46
-
47
- def __init__(self, con: Connection, shortcode: Optional[str] = None):
48
- self._shortcode = shortcode
49
- self._projects = Project.getAllProjects(con=con)
50
- self._projectmap: Dict[str, str] = {x.shortname: x.id for x in self._projects}
51
- invprojectmap: Dict[str, str] = {x.id: x.shortname for x in self._projects}
52
- self._groups = Group.getAllGroups(con=con)
53
- self._groupmap: Dict[str, str] = {invprojectmap[x.project] + ':' + x.name: x.id for x in self._groups}
54
- self._project_name = None
55
- if self._shortcode:
56
- for p in self._projects:
57
- if p.shortcode == self._shortcode:
58
- self._project_name = p.shortname
59
- break
60
-
61
- @property
62
- def groupmap(self):
63
- return self._groupmap
64
-
65
- @property
66
- def shortcode(self) -> Union[str, None]:
67
- return self._shortcode
68
-
69
- @shortcode.setter
70
- def shortcode(self, val: str) -> None:
71
- for p in self._projects:
72
- if p.shortcode == self._shortcode:
73
- self._project_name = p.shortname
74
- break
75
-
76
- @property
77
- def project_name(self) -> Union[str, None]:
78
- return self._project_name
79
-
80
-
81
- class KnoraValue:
82
- _value: Union[str, KnoraStandoffXml]
83
- _resrefs: List[str]
84
- _comment: str
85
- _permissions: str
86
- is_richtext: bool
87
-
88
- def __init__(self,
89
- node: etree.Element,
90
- valtype: str,
91
- listname: Optional[str] = None) -> None:
92
-
93
- self._resrefs = None
94
- self._comment = node.get('comment')
95
- self._permissions = node.get('permissions')
96
- if node.get('encoding') == 'xml':
97
- node.attrib.clear()
98
- xmlstr = etree.tostring(node, encoding="unicode", method="xml")
99
- xmlstr = xmlstr.replace('<text xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">', '')
100
- xmlstr = xmlstr.replace('</text>', '')
101
- self._value = KnoraStandoffXml(xmlstr)
102
- tmpidlist = self._value.findall()
103
- if tmpidlist:
104
- refs = set()
105
- for tmpid in tmpidlist:
106
- refs.add(tmpid.split(':')[1])
107
- self._resrefs = list(refs)
108
- else:
109
- if valtype == 'list':
110
- self._value = listname + ':' + "".join(node.itertext())
111
- else:
112
- self._value = "".join(node.itertext())
113
-
114
- @property
115
- def value(self):
116
- return self._value
117
-
118
- @property
119
- def resrefs(self):
120
- return self._resrefs
121
-
122
- @property
123
- def comment(self):
124
- return self._comment
125
-
126
- @property
127
- def permissions(self):
128
- return self._permissions
129
-
130
- def print(self) -> None:
131
- """
132
- Print value to stdout for debugging...
133
-
134
- :return: None
135
- """
136
- print(' Value: ' + str(self._value))
137
- if self._comment:
138
- print(' Comment:' + self._comment)
139
- if self._resrefs is not None:
140
- for i in self._resrefs:
141
- print(' resref: ' + i)
142
-
143
-
144
- class KnoraProperty:
145
- _name: str
146
- _valtype: str
147
- _values: List[KnoraValue]
148
-
149
- def __init__(self, node: etree.Element, valtype: str, default_ontology: Optional[str] = None):
150
- tmp = node.attrib['name'].split(':')
151
- if len(tmp) > 1:
152
- if tmp[0]:
153
- self._name = node.attrib['name']
154
- else:
155
- self._name = default_ontology + ':' + tmp[1]
156
- else:
157
- self._name = 'knora-admin:' + tmp[0]
158
- listname = node.attrib.get('list') # safe the list name if given (only for lists)
159
- self._valtype = valtype
160
- self._values = []
161
-
162
- for subnode in node:
163
- if subnode.tag == valtype: # the subnode must correspond to the expected value type
164
- self._values.append(KnoraValue(subnode, valtype, listname))
165
- else:
166
- raise XmlError('Unexpected tag: "{}" <property> may contain only <value> tags!'.format(subnode.tag))
167
-
168
- @property
169
- def name(self):
170
- return self._name
171
-
172
- @property
173
- def valtype(self):
174
- return self._valtype
175
-
176
- @property
177
- def values(self):
178
- return self._values
179
-
180
- def print(self) -> None:
181
- print(' Property: {} Type: {}'.format(self._name, self._valtype))
182
- for value in self._values:
183
- value.print()
184
-
185
-
186
- class KnoraResource:
187
- _id: str
188
- _label: str
189
- _restype: str
190
- _permissions: str
191
- _bitstream: str
192
- _properties: List[KnoraProperty]
193
-
194
- def __init__(self, node: etree.Element, default_ontology: Optional[str] = None) -> None:
195
- """
196
- Constructor that parses a resource node from the XML DOM
197
-
198
- :param context: Context for DOM node traversal
199
- :param node: The DOM node to be processed (representing a resource)
200
- """
201
- self._id = node.attrib['id'] # safe the unique id
202
- self._label = node.attrib['label']
203
- tmp = node.attrib['restype'].split(':')
204
- if len(tmp) > 1:
205
- if tmp[0]:
206
- self._restype = node.attrib['restype']
207
- else:
208
- self._restype = default_ontology + ':' + tmp[1]
209
- else:
210
- self._restype = 'knora-admin:' + tmp[0]
211
- self._permissions = node.attrib['permissions']
212
- self._bitstream = None
213
- self._properties = []
214
- for subnode in node:
215
- if subnode.tag == 'bitstream':
216
- self._bitstream = subnode.text
217
- elif subnode.tag is etree.Comment:
218
- continue
219
- else:
220
- ptype, dummy = subnode.tag.split('-')
221
- self._properties.append(KnoraProperty(subnode, ptype, default_ontology))
222
-
223
- @property
224
- def id(self) -> str:
225
- return self._id
226
-
227
- @property
228
- def label(self) -> str:
229
- return self._label
230
-
231
- @property
232
- def restype(self) -> str:
233
- return self._restype
234
-
235
- @property
236
- def bitstream(self) -> str:
237
- return self._bitstream
238
-
239
- @property
240
- def permissions(self):
241
- return self._permissions
242
-
243
- def print(self):
244
- print(f'Resource: id={self._id} restype: {self._restype} label: {self._label}')
245
- if self._bitstream is not None:
246
- print(' Bitstream: ' + self._bitstream)
247
- for property in self._properties:
248
- property.print()
249
-
250
- def get_resptrs(self) -> List[str]:
251
- """
252
- Return a list of all reesource id's that a referenced by this resource
253
- :return: List of resources identified by their unique id's
254
- """
255
- resptrs: List[str] = []
256
- for property in self._properties:
257
- if property.valtype == 'resptr':
258
- for value in property.values:
259
- resptrs.append(value.value)
260
- elif property.valtype == 'text':
261
- for value in property.values:
262
- if value.resrefs is not None:
263
- resptrs.extend(value.resrefs)
264
- return resptrs
265
-
266
- def get_propvals(self,
267
- resiri_lookup: StrDict,
268
- permissions_lookup: StrDict) -> Dict[str, VarStrObj]:
269
- """
270
- A function which retrieves...
271
-
272
- :param resiri_lookup: Is used to solve internal unique_id's of resourcs to real IRI's
273
- :param permissions_lookup: Is usd to resolve thee permission ID's to permission sets
274
- :return: A dict of values with the property name as key and a single value. This dict represents
275
- the JSON structure that Knora.create_resource() expects.
276
- """
277
- propdata = {}
278
- for property in self._properties:
279
- vals: List[StrObj] = [] # == List[Union[str,StrDict]
280
- for value in property.values:
281
- v: str
282
- if property.valtype == 'resptr': # we have a resptr, therefore simple lookup or IRI
283
- iri = resiri_lookup.get(value.value)
284
- if iri is not None:
285
- v = iri
286
- else:
287
- v = value.value # if we do not find the unique_id, we assume it's a valid knora IRI
288
- elif property.valtype == 'text':
289
- if isinstance(value.value, KnoraStandoffXml):
290
- irirefs = value.value.findall() # The IRI's must be embedded as "...IRI:unique_id:IRI..."
291
- for iriref in irirefs:
292
- resid = iriref.split(':')[1]
293
- iri = resiri_lookup.get(resid)
294
- value.value.replace(iriref, iri)
295
- v = value.value
296
- else:
297
- v = value.value
298
-
299
- if value.comment is None and value.permissions is None:
300
- # no comment or permissions
301
- vals.append(v)
302
- else:
303
- # we have comment or permissions
304
- tmp = {'value': v}
305
- if value.comment is not None:
306
- tmp['comment'] = value.comment
307
- if value.permissions is not None:
308
- tmp['permissions'] = permissions_lookup.get(value.permissions)
309
- vals.append(tmp)
310
- propdata[property.name] = vals if len(vals) > 1 else vals[0] # append a Union[StrObj,List[StrObj]]
311
- return propdata
312
-
313
-
314
- class XmlAllow:
315
- _group: str
316
- _permission: str
317
-
318
- def __init__(self, node: etree.Element, project_context: ProjectContext) -> None:
319
- """
320
- Constructor which parses the XML DOM allow element
321
-
322
- :param context: Context for DOM node traversal
323
- :param node: The DOM node to be processed (representing an single right in a permission set)
324
- """
325
- tmp = node.attrib['group'].split(':')
326
- sysgroups = ['UnknownUser', 'KnownUser', 'ProjectMember', 'Creator', 'ProjectAdmin', 'SystemAdmin']
327
- if len(tmp) > 1:
328
- if tmp[0]:
329
- if tmp[0] == 'knora-admin' and tmp[1] in sysgroups:
330
- self._group = node.attrib['group']
331
- else:
332
- self._group = project_context.groupmap.get(node.attrib['group'])
333
- if self._group is None:
334
- raise XmlError("Group \"{}\" is not known: Cannot find project!".format(node.attrib['group']))
335
- else:
336
- if project_context.project_name is None:
337
- raise XmlError("Project shortcode has not been set in ProjectContext")
338
- self._group = project_context.project_name + ':' + tmp[1]
339
- else:
340
- if tmp[0] in sysgroups:
341
- self._group = 'knora-admin:' + node.attrib['group']
342
- else:
343
- raise XmlError("Group \"{}\" is not known: ".format(node.attrib['group']))
344
- self._permission = node.text
345
-
346
- @property
347
- def group(self):
348
- return self._group
349
-
350
- @property
351
- def permission(self):
352
- return self._permission
353
-
354
- def print(self):
355
- print(" group=", self._group, " permission=", self._permission)
356
-
357
-
358
- class XmlPermission:
359
- """
360
- A class representing a permission set
361
- """
362
- _id: str
363
- _allows: List[XmlAllow]
364
-
365
- def __init__(self, node: etree.Element, project_context: ProjectContext) -> None:
366
- """
367
- Constructor which parses a XML DOM permissions element representing an named permission set
368
-
369
- :param context: Context for DOM node traversal
370
- :param node: The DOM node to be processed (representing an a permission set)
371
- """
372
- self._allows = []
373
- self._id = node.attrib['id']
374
- for allow_node in node:
375
- self._allows.append(XmlAllow(allow_node, project_context))
376
-
377
- @property
378
- def id(self) -> str:
379
- return self._id
380
-
381
- @property
382
- def allows(self) -> List[XmlAllow]:
383
- return self._allows
384
-
385
- def get_permission_instance(self) -> Permissions:
386
- permissions = Permissions()
387
- for allow in self._allows:
388
- permissions.add(allow.permission, allow.group)
389
- return permissions
390
-
391
- def __str__(self):
392
- allowstrs: List[str] = []
393
- for allow in self._allows:
394
- allowstrs.append("{} {}".format(allow.permission, allow.group))
395
- return '|'.join(allowstrs)
396
-
397
- def print(self):
398
- print('Permission: ', self._id)
399
- for a in self._allows:
400
- a.print()
401
-
402
-
403
- def do_sortorder(resources: List[KnoraResource]) -> List[KnoraResource]:
404
- """
405
- Sort the list of resources such that resources that reference other resources are
406
- added after the referenced resources. It will fail with an error if there are circular
407
- references.
408
-
409
- :param resources: List of resources before sorting
410
- :return: Sorted list of resources
411
- """
412
- #
413
- # here we sort the resources according to outgoing resptrs
414
- #
415
- ok_resources: [KnoraResource] = []
416
- notok_resources: [KnoraResource] = []
417
- ok_resids : [str] = []
418
- cnt = 0
419
- notok_len = 9999999
420
- while len(resources) > 0 and cnt < 10000:
421
- for resource in resources:
422
- resptrs = resource.get_resptrs()
423
- if len(resptrs) == 0:
424
- ok_resources.append(resource)
425
- ok_resids.append(resource.id)
426
- else:
427
- ok = True
428
- for resptr in resptrs:
429
- if resptr in ok_resids:
430
- pass
431
- else:
432
- ok = False;
433
- if ok:
434
- ok_resources.append(resource)
435
- ok_resids.append(resource.id)
436
- else:
437
- notok_resources.append(resource)
438
- resources = notok_resources
439
- if not len(notok_resources) < notok_len:
440
- print('Cannot resolve resptr dependencies. Giving up....')
441
- print(len(notok_resources))
442
- for r in notok_resources:
443
- print('Resource {} has unresolvable resptrs to: '.format(r.id), end=' ')
444
- for x in r.get_resptrs():
445
- print(x, end=' ')
446
- print('')
447
- print('=============')
448
- exit(5)
449
- notok_len = len(notok_resources)
450
- notok_resources = []
451
- cnt += 1
452
- print('{}. Ordering pass Finished!'.format(cnt))
453
- print('Remaining: {}'.format(len(resources)))
454
- return ok_resources
455
-
456
-
457
- def xml_upload(input_file: str,
458
- server: str,
459
- user: str,
460
- password: str,
461
- imgdir: str,
462
- sipi: str,
463
- verbose: bool,
464
- validate: bool) -> bool:
465
- current_dir = os.path.dirname(os.path.realpath(__file__))
466
-
467
- xmlschema_doc = etree.parse(os.path.join(current_dir, 'knora-data-schema.xsd'))
468
- xmlschema = etree.XMLSchema(xmlschema_doc)
469
- doc = etree.parse(input_file)
470
- xmlschema.assertValid(doc)
471
-
472
- del xmlschema
473
- del doc
474
- del xmlschema_doc
475
-
476
- if validate:
477
- return
478
-
479
- print("The input data file is syntactically correct and passed validation!")
480
-
481
- #
482
- # Connect to the DaSCH Service Platform API
483
- #
484
- con = Connection(server)
485
- con.login(user, password)
486
-
487
- proj_context = ProjectContext(con=con)
488
-
489
- resources: List[KnoraResource] = []
490
- permissions: Dict[str, XmlPermission] = {}
491
- shortcode: Union[str, None] = None
492
- default_ontology = None
493
-
494
- #
495
- # read the XML file containing the data, including project shortcode
496
- #
497
- tree = etree.parse(input_file)
498
- knora = tree.getroot()
499
- default_ontology = knora.attrib['default-ontology']
500
- shortcode = knora.attrib['shortcode']
501
- for child in knora:
502
- if child.tag == "permissions":
503
- permission = XmlPermission(child, proj_context)
504
- permissions[permission.id] = permission
505
- elif child.tag == "resource":
506
- resources.append(KnoraResource(child, default_ontology))
507
-
508
- #
509
- # sort the resources so that resources which do not link to others come first
510
- #
511
- resources = do_sortorder(resources)
512
-
513
- sipi = Sipi(sipi, con.get_token())
514
-
515
- factory = ResourceInstanceFactory(con, shortcode)
516
-
517
- permissions_lookup: Dict[str, Permissions] = {}
518
- for key, perm in permissions.items():
519
- permissions_lookup[key] = perm.get_permission_instance()
520
-
521
- resclassnames = factory.get_resclass_names()
522
- resclasses: Dict[str, type] = {}
523
- for resclassname in resclassnames:
524
- resclasses[resclassname] = factory.get_resclass(resclassname)
525
- resiri_lookup: StrDict = {}
526
-
527
- for resource in resources:
528
- #resource.print()
529
- if resource.bitstream:
530
- img = sipi.upload_bitstream(os.path.join(imgdir, resource.bitstream))
531
- bitstream = img['uploadedFiles'][0]['internalFilename']
532
- else:
533
- bitstream = None
534
- instance = resclasses[resource.restype](con=con,
535
- label=resource.label,
536
- permissions=permissions_lookup.get(resource.permissions),
537
- bitstream=bitstream,
538
- values=resource.get_propvals(resiri_lookup, permissions_lookup)).create()
539
- resiri_lookup[resource.id] = instance.iri
540
- print("Created:", instance.iri)
@@ -1,80 +0,0 @@
1
- from typing import Any, Union, List, Set, Dict, Tuple, Optional, Callable, TypedDict
2
-
3
- import wx
4
-
5
- class DoublePasswordCtrl(wx.Control):
6
-
7
- def __init__(self,
8
- parent: wx.Window,
9
- id: int = wx.ID_ANY,
10
- pos: wx.Point = wx.DefaultPosition,
11
- size: wx.Size = wx.DefaultSize,
12
- style: int = wx.NO_BORDER,
13
- validator: wx.Validator = wx.DefaultValidator,
14
- name: str = "DoublePassword",
15
- value: str = ""):
16
- super().__init__(parent=parent,
17
- id=id,
18
- pos=pos,
19
- size=size,
20
- style=style,
21
- validator=validator,
22
- name=name)
23
-
24
- sizer = wx.BoxSizer(wx.VERTICAL)
25
- halfheight = size.GetHeight()
26
- if halfheight > 0:
27
- halfheight = halfheight / 2
28
- self.password1 = wx.TextCtrl(parent=self,
29
- name=name + '1',
30
- value=value if value is not None else "",
31
- size=wx.Size(size.GetWidth(), halfheight),
32
- style=style | wx.TE_PASSWORD)
33
- self.password1.Bind(wx.EVT_TEXT, self.text1_changed)
34
- sizer.Add(self.password1)
35
-
36
- self.password2 = wx.TextCtrl(parent=self,
37
- name=name + '2',
38
- value=value if value is not None else "",
39
- size=wx.Size(size.GetWidth(), halfheight),
40
- style=style | wx.TE_PASSWORD)
41
- self.password2.Bind(wx.EVT_TEXT, self.text2_changed)
42
- sizer.Add(self.password2)
43
- self.SetSizerAndFit(sizer)
44
-
45
- def text1_changed(self, event: wx.CommandEvent) -> None:
46
- self.text_changed()
47
- event.Skip()
48
-
49
- def text2_changed(self, event: wx.CommandEvent) -> None:
50
- self.text_changed()
51
- event.Skip()
52
-
53
- def text_changed(self) -> None:
54
- event = wx.PyCommandEvent(wx.EVT_TEXT.typeId, self.GetId())
55
- self.GetEventHandler().ProcessEvent(event)
56
-
57
- def GetValue(self) -> Union[str, None]:
58
- if self.password1.GetValue() == self.password2.GetValue():
59
- return self.password1.GetValue()
60
- else:
61
- return None
62
-
63
- def SetValue(self, value: str) -> None:
64
- self.password1.SetValue(value)
65
- self.password2.SetValue(value)
66
-
67
- def SetBackgroundColour(self, color):
68
- self.password1.SetBackgroundColour(color)
69
- self.password2.SetBackgroundColour(color)
70
-
71
- def SetFocus(self):
72
- self.password1.SetFocus()
73
-
74
- def Refresh(self):
75
- self.password1.Refresh()
76
- self.password2.Refresh()
77
-
78
- def SetValidator(self, validator: wx.Validator = wx.DefaultValidator):
79
- self.password1.SetValidator(validator)
80
- self.password2.SetValidator(validator)