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,416 +0,0 @@
1
- import json
2
- import re
3
- from dataclasses import dataclass
4
- from enum import Enum, unique
5
- from urllib.parse import quote_plus
6
-
7
- from pystrict import strict
8
- from rfc3987 import parse
9
- from typing import List, Set, Dict, Tuple, Optional, Any, Union, Type
10
- from copy import deepcopy
11
-
12
- from .group import Group
13
- from .langstring import LangString
14
- from .helpers import OntoInfo, Actions, BaseError, Cardinality, Context
15
- from .connection import Connection
16
- from .model import Model
17
- from .project import Project
18
- from .listnode import ListNode
19
- from .ontology import Ontology
20
- from .propertyclass import PropertyClass
21
- from .resourceclass import ResourceClass, HasProperty
22
- from .permission import PermissionValue, PermissionsIterator, Permissions
23
- from .value import KnoraStandoffXml, Value, TextValue, ColorValue, DateValue, DecimalValue, GeomValue, GeonameValue, \
24
- IntValue, BooleanValue, UriValue, TimeValue, IntervalValue, ListValue, LinkValue, fromJsonLdObj
25
-
26
-
27
- from pprint import pprint
28
-
29
-
30
- class KnoraStandoffXmlEncoder(json.JSONEncoder):
31
- """Classes used as wrapper for knora standoff-XML"""
32
- def default(self, obj) -> str:
33
- if isinstance(obj, KnoraStandoffXml):
34
- return '<?xml version="1.0" encoding="UTF-8"?>\n<text>' + obj.getXml() + '</text>'
35
- elif isinstance(obj, OntoInfo):
36
- return obj.iri + "#" if obj.hashtag else ""
37
- return json.JSONEncoder.default(self, obj)
38
-
39
- @dataclass
40
- class Propinfo:
41
- valtype: Type
42
- cardinality: Cardinality
43
- gui_order: int
44
- attributes: Optional[str] = None
45
-
46
-
47
- @strict
48
- class ResourceInstance(Model):
49
- baseclasses_with_bitstream: Set[str] = {
50
- 'StillImageRepresentation',
51
- 'AudioRepresentation',
52
- 'DocumentRepresentation',
53
- 'MovingImageRepresentation',
54
- 'DDDRepresentation',
55
- 'TextRepresentation'}
56
- knora_properties: Set[str] = {
57
- "knora-api:isPartOf",
58
- "knora-api:seqnum",
59
- }
60
- _iri: Union[str, None]
61
- _ark: Union[str, None]
62
- _vark: Union[str, None]
63
- _label: Union[str, None]
64
- _permissions: Union[Permissions, None]
65
- _upermission: Union[PermissionValue, None]
66
- _bitstream: Union[str, None]
67
- _values: Union[Dict[Value, List[Value]], None]
68
-
69
- def __init__(self,
70
- con: Connection,
71
- iri: Optional[str] = None,
72
- ark: Optional[str] = None,
73
- vark: Optional[str] = None,
74
- label: Optional[str] = None,
75
- permissions: Optional[Permissions] = None,
76
- upermission: Optional[PermissionValue] = None,
77
- bitstream: Optional[str] = None,
78
- values: Optional[Dict[str, Union[str, List[str], Dict[str, str], List[Dict[str,str]], Value, List[Value]]]] = None):
79
- super().__init__(con)
80
- self._iri = iri
81
- self._label = label
82
- self._ark = ark
83
- self._vark = vark
84
- self._permissions = permissions
85
- self._upermission = upermission
86
-
87
- if self.baseclass in self.baseclasses_with_bitstream and bitstream is None:
88
- raise BaseError("The baseclass \"{}\" requires a bitstream value!".format(self.baseclass))
89
- if self.baseclass not in self.baseclasses_with_bitstream and bitstream is not None:
90
- raise BaseError("The baseclass \"{}\" does not allow a bitstream value!".format(self.baseclass))
91
- if self.baseclass in self.baseclasses_with_bitstream and bitstream is not None:
92
- self._bitstream = bitstream
93
- else:
94
- self._bitstream = None
95
-
96
- self._values = {}
97
- if values:
98
- self._values = {}
99
- for propname, propinfo in self.properties.items():
100
- # if propinfo.valtype is LinkValue:
101
- vals = values.get(propname)
102
- if vals is not None:
103
- valcnt: int = 0
104
- if type(vals) is list: # we do have several values for this properties
105
- self._values[propname] = []
106
- for val in vals:
107
- if valcnt > 0 and (propinfo.cardinality == Cardinality.C_0_1 or propinfo.cardinality == Cardinality.C_1):
108
- raise BaseError(f'Cardinality does not allow multiple values for "{propname}"!')
109
- if type(val) is Value:
110
- self._values[propname].append(val)
111
- elif type(val) is dict:
112
- if propinfo.valtype is ListValue:
113
- val['lists'] = self.lists
114
- self._values[propname].append(propinfo.valtype(**val))
115
- else:
116
- if propinfo.valtype is ListValue:
117
- val = {'value': val, 'lists': self.list}
118
- self._values[propname].append(propinfo.valtype(val))
119
- valcnt = valcnt + 1
120
- else: # we do have only one value for this property
121
- if type(vals) is Value:
122
- self._values[propname] = vals
123
- elif type(vals) is dict:
124
- if propinfo.valtype is ListValue:
125
- vals['lists'] = self.lists
126
- self._values[propname] = propinfo.valtype(**vals)
127
- else:
128
- if propinfo.valtype is ListValue:
129
- vals = {'value': val, 'lists': self.list}
130
- self._values[propname] = propinfo.valtype(vals)
131
- else:
132
- if propinfo.cardinality == Cardinality.C_1 or propinfo.cardinality == Cardinality.C_1_n:
133
- raise BaseError("Cardinality does require at least one value for \"{}\"!".format(propname))
134
- for propname in values:
135
- if propname not in self.knora_properties and self.properties.get(propname) is None:
136
- raise BaseError(f'Property "{propname}" is not part of data model!')
137
-
138
- @property
139
- def iri(self) -> str:
140
- return self._iri
141
-
142
- @property
143
- def ark(self) -> str:
144
- return self._ark
145
-
146
- @property
147
- def vark(self) -> str:
148
- return self._vark
149
-
150
- def clone(self) -> 'ResourceInstance':
151
- return deepcopy(self)
152
-
153
- def fromJsonLdObj(self, con: Connection, jsonld_obj: Any) -> 'ResourceInstance':
154
- newinstance = self.clone()
155
- newinstance._iri = jsonld_obj.get('@id')
156
- resclass = jsonld_obj.get('@type')
157
- context = Context(jsonld_obj.get('@context'))
158
- newinstance._label = jsonld_obj.get("rdfs:label")
159
- newinstance._ark = Value.get_typed_value("knora-api:arkUrl", jsonld_obj)
160
- newinstance._vark = Value.get_typed_value("knora-api:versionArkUrl", jsonld_obj)
161
- newinstance._permissions = Permissions.fromString(jsonld_obj.get("knora-api:hasPermissions"))
162
- newinstance._upermission = PermissionValue[jsonld_obj.get("knora-api:userHasPermission", jsonld_obj)]
163
- creation_date = Value.get_typed_value("knora-api:creationDate", jsonld_obj)
164
- user = Value.get_typed_value("knora-api:attachedToUser", jsonld_obj)
165
- project = Value.get_typed_value("knora-api:attachedToProject", jsonld_obj)
166
- to_be_ignored = [
167
- '@id', '@type', '@context', "rdfs:label", "knora-api:arkUrl", "knora-api:versionArkUrl",
168
- "knora-api:creationDate", "knora-api:attachedToUser", "knora-api:attachedToProject",
169
- "knora-api:hasPermissions", "knora-api:userHasPermission"
170
- ]
171
- if id is None:
172
- raise BaseError('Resource "id" is missing in JSON-LD from DSP-API')
173
- type = jsonld_obj.get('@type')
174
- newinstance._values: Dict[str, Union[Value, List[Value]]] = {}
175
- for key, obj in jsonld_obj.items():
176
- if key in to_be_ignored:
177
- continue
178
- try:
179
- if isinstance(obj, list):
180
- newinstance._values[key] = []
181
- for o in obj:
182
- newinstance._values[key].append(fromJsonLdObj(o))
183
- else:
184
- newinstance._values[key] = fromJsonLdObj(obj)
185
- except KeyError as kerr:
186
- raise BaseError("Invalid data in JSON-LD: \"{}\" has value class \"{}\"!".format(key, obj.get("@type")))
187
- return newinstance
188
-
189
- def toJsonLdObj(self, action: Actions) -> Any:
190
- tmp = {}
191
- if action == Actions.Create:
192
- tmp['@type'] = self.classname
193
- tmp["knora-api:attachedToProject"] = {
194
- "@id": self.project
195
- }
196
- tmp['rdfs:label'] = self._label
197
- if self._permissions:
198
- tmp["knora-api:hasPermissions"] = self._permissions.toJsonLdObj()
199
- if self._bitstream:
200
- if self.baseclass == 'StillImageRepresentation':
201
- tmp["knora-api:hasStillImageFileValue"] = {
202
- "@type": "knora-api:StillImageFileValue",
203
- "knora-api:fileValueHasFilename": self._bitstream
204
- }
205
- elif self.baseclass == 'DocumentRepresentation':
206
- tmp["knora-api:hasDocumentFileValue"] = {
207
- "@type": "knora-api:DocumentFileValue",
208
- "knora-api:fileValueHasFilename": self._bitstream
209
- }
210
- elif self.baseclass == 'TextRepresentation':
211
- tmp["knora-api:hasTextFileValue"] = {
212
- "@type": "knora-api:TextFileValue",
213
- "knora-api:fileValueHasFilename": self._bitstream
214
- }
215
- elif self.baseclass == 'AudioRepresentation':
216
- tmp["knora-api:hasAudioFileValue"] = {
217
- "@type": "knora-api:AudioFileValue",
218
- "knora-api:fileValueHasFilename": self._bitstream
219
- }
220
- else:
221
- raise BaseError(f'Baseclass "{self.baseclass}" not yet supported!')
222
- for propname, valtype in self._values.items():
223
- if type(valtype) is list:
224
- if type(valtype[0]) is LinkValue:
225
- propname += 'Value'
226
- tmp[propname] = []
227
- for vt in valtype:
228
- tmp[propname].append(vt.toJsonLdObj(action))
229
- pass
230
- else:
231
- if type(valtype) is LinkValue:
232
- propname += 'Value'
233
- tmp[propname] = valtype.toJsonLdObj(action)
234
- tmp['@context'] = self.context
235
- else:
236
- pass
237
- return tmp
238
-
239
- def create(self):
240
- jsonobj = self.toJsonLdObj(Actions.Create)
241
- jsondata = json.dumps(jsonobj, indent=4, separators=(',', ': '), cls=KnoraStandoffXmlEncoder)
242
- #print(jsondata)
243
- result = self._con.post('/v2/resources', jsondata)
244
- newinstance = self.clone()
245
- newinstance._iri = result['@id']
246
- newinstance._ark = result['knora-api:arkUrl']['@value']
247
- newinstance._vark = result['knora-api:versionArkUrl']['@value']
248
- return newinstance
249
-
250
- def read(self) -> 'ResourceInstance':
251
- result = self._con.get('/v2/resources/' + quote_plus(self._iri))
252
- return self.fromJsonLdObj(con=self._con, jsonld_obj=result)
253
-
254
-
255
- def update(self):
256
- pass
257
-
258
- def delete(self):
259
- pass
260
-
261
- def print(self):
262
- print('Iri:', self._iri)
263
- print('Ark:', self._ark)
264
- print('Vark:', self._vark)
265
- print('Label:', self._label)
266
- print('Permissions:', str(self._permissions))
267
- print('Userpermission:', str(self._upermission))
268
- for name, val in self._values.items():
269
- if isinstance(val, list):
270
- tmp = [str(x) for x in val]
271
- print(name, ':', " | ".join(tmp))
272
- pass
273
- else:
274
- print(name, ':', str(val))
275
-
276
-
277
- # ToDo: special resourceclasses and properties of knora-api
278
- #
279
- # - knora-api:isPartOf -> Object: knora-api:Resource
280
- # - knora-api:author -> Object: knora-api:User
281
- # - knora-api:seqnum -> Object: knora-api:IntValue
282
- # - knora-api:hasComment -> Object: knora-api:TextValue
283
- #
284
- # knora-api:Region: IS a resource
285
- # - knora-api:hasGeometry
286
- # - knora-api:isRegionOf
287
- # - knora-api:hasColor
288
- # - knora-api:hasComment
289
-
290
- @strict
291
- class ResourceInstanceFactory:
292
- _con: Connection
293
- _project: Project
294
- _lists = List[ListNode]
295
- _ontologies = Dict[str, Ontology]
296
- _ontoname2iri = Dict[str, str]
297
- _context: Context
298
-
299
- def __init__(self,
300
- con: Connection,
301
- projident: str):
302
- self._con = con
303
- if re.match("^[0-9aAbBcCdDeEfF]{4}$", projident):
304
- project = Project(con=self._con, shortcode=projident)
305
- elif re.match("^[\\w-]+$", projident):
306
- project = Project(con=self._con, shortname=projident)
307
- elif re.match("^(http)s?://([\\w\\.\\-~]+:?\\d{,4})(/[\\w\\-~]+)+$", projident):
308
- project = Project(con=self._con, shortname=projident)
309
- else:
310
- raise BaseError("Invalid project identification!")
311
- self._project = project.read()
312
-
313
- tmp = ListNode.getAllLists(con=self._con, project_iri=self._project.id)
314
- self._lists = []
315
- for rnode in tmp:
316
- self._lists.append(rnode.getAllNodes())
317
-
318
- tmp_ontologies = Ontology.getProjectOntologies(con, self._project.id)
319
- shared_project = Project(con=self._con, shortcode="0000").read()
320
- shared_ontologies = Ontology.getProjectOntologies(con, shared_project.id)
321
- tmp_ontologies.extend(shared_ontologies)
322
- self._ontoname2iri = {x.name: x.id for x in tmp_ontologies}
323
-
324
- ontology_ids = [x.id for x in tmp_ontologies]
325
- self._ontologies = {}
326
- self._properties = {}
327
- self._context = {}
328
- for onto in ontology_ids:
329
- oparts = onto.split("/")
330
- name = oparts[len(oparts) - 2]
331
- shortcode = oparts[len(oparts) - 3]
332
- self._ontologies[name] = Ontology.getOntologyFromServer(con=con, shortcode=shortcode, name=name)
333
- self._properties.update({name + ':' + x.name: x for x in self._ontologies[name].property_classes})
334
- self._context.update(self._ontologies[name].context)
335
-
336
- @property
337
- def lists(self) -> List[ListNode]:
338
- return self._lists
339
-
340
- def get_resclass_names(self) -> List[str]:
341
- resclass_names: List[str] = []
342
- for name, onto in self._ontologies.items():
343
- for resclass in onto.resource_classes:
344
- resclass_names.append(onto.context.get_prefixed_iri(resclass.id))
345
- return resclass_names
346
-
347
- def _get_baseclass(self, superclasses: List[str]) -> Union[str, None]:
348
- for sc in superclasses:
349
- ontoname, classname = sc.split(':')
350
- if ontoname == 'knora-api':
351
- return classname
352
- o = self._ontologies.get(ontoname)
353
- if o is None:
354
- continue
355
- gaga = [x for x in o.resource_classes if x.name == classname][0]
356
- return self._get_baseclass(gaga.superclasses)
357
- return None
358
-
359
- def get_resclass(self, prefixedresclass: str) -> Type:
360
- prefix, resclass_name = prefixedresclass.split(':')
361
- resclass = [x for x in self._ontologies[prefix].resource_classes if x.name == resclass_name][0]
362
- baseclass = self._get_baseclass(resclass.superclasses)
363
- props: Dict[str, Propinfo] = {}
364
- switcher = {
365
- 'knora-api:TextValue': TextValue,
366
- 'knora-api:ColorValue': ColorValue,
367
- 'knora-api:DateValue': DateValue,
368
- 'knora-api:DecimalValue': DecimalValue,
369
- 'knora-api:GeomValue': GeomValue,
370
- 'knora-api:GeonameValue': GeonameValue,
371
- 'knora-api:IntValue': IntValue,
372
- 'knora-api:BooleanValue': BooleanValue,
373
- 'knora-api:UriValue': UriValue,
374
- 'knora-api:TimeValue': TimeValue,
375
- 'knora-api:IntervalValue': IntervalValue,
376
- 'knora-api:ListValue': ListValue,
377
- 'knora-api:LinkValue': LinkValue,
378
- }
379
- for propname, has_property in resclass.has_properties.items():
380
- if propname == "knora-api:isPartOf":
381
- valtype = LinkValue
382
- props[propname] = Propinfo(valtype=valtype,
383
- cardinality=has_property.cardinality,
384
- gui_order=has_property.gui_order)
385
- elif propname == "knora-api:seqnum":
386
- valtype = IntValue
387
- props[propname] = Propinfo(valtype=valtype,
388
- cardinality=has_property.cardinality,
389
- gui_order=has_property.gui_order)
390
- elif propname == "knora-api:hasComment":
391
- valtype = TextValue
392
- props[propname] = Propinfo(valtype=valtype,
393
- cardinality=has_property.cardinality,
394
- gui_order=has_property.gui_order)
395
- elif has_property.ptype == HasProperty.Ptype.other:
396
- valtype = switcher.get(self._properties[propname].object)
397
- if valtype == LinkValue:
398
- continue # we have the Link to the LinkValue which we do not use
399
- if valtype is None:
400
- valtype = LinkValue
401
- props[propname] = Propinfo(valtype=valtype,
402
- cardinality=has_property.cardinality,
403
- gui_order=has_property.gui_order,
404
- attributes=self._properties[propname].object)
405
- else:
406
- props[propname] = Propinfo(valtype=valtype,
407
- cardinality=has_property.cardinality,
408
- gui_order=has_property.gui_order)
409
- return type(resclass_name, (ResourceInstance,), {'project': self._project.id,
410
- 'classname': prefixedresclass,
411
- 'baseclass': baseclass,
412
- 'context': self._context,
413
- 'properties': props,
414
- 'lists': self._lists})
415
-
416
-