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
dsplib/models/resource.py DELETED
@@ -1,366 +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
- _iri: Union[str, None]
57
- _ark: Union[str, None]
58
- _vark: Union[str, None]
59
- _label: Union[str, None]
60
- _permissions: Union[Permissions, None]
61
- _upermission: Union[PermissionValue, None]
62
- _bitstream: Union[str, None]
63
- _values: Union[Dict[Value, List[Value]], None]
64
-
65
- def __init__(self,
66
- con: Connection,
67
- iri: Optional[str] = None,
68
- ark: Optional[str] = None,
69
- vark: Optional[str] = None,
70
- label: Optional[str] = None,
71
- permissions: Optional[Permissions] = None,
72
- upermission: Optional[PermissionValue] = None,
73
- bitstream: Optional[str] = None,
74
- values: Optional[Dict[str, Union[str, List[str], Dict[str, str], List[Dict[str,str]], Value, List[Value]]]] = None):
75
- super().__init__(con)
76
- self._iri = iri
77
- self._label = label
78
- self._ark = ark
79
- self._vark = vark
80
- self._permissions = permissions
81
- self._upermission = upermission
82
-
83
- if self.baseclass in self.baseclasses_with_bitstream and bitstream is None:
84
- raise BaseError("The baseclass \"{}\" requires a bitstream value!".format(self.baseclass))
85
- if self.baseclass not in self.baseclasses_with_bitstream and bitstream is not None:
86
- raise BaseError("The baseclass \"{}\" does not allow a bitstream value!".format(self.baseclass))
87
- if self.baseclass in self.baseclasses_with_bitstream and bitstream is not None:
88
- self._bitstream = bitstream
89
- else:
90
- self._bitstream = None
91
-
92
- self._values = {}
93
- if values:
94
- self._values = {}
95
- for propname, propinfo in self.properties.items():
96
- # if propinfo.valtype is LinkValue:
97
- vals = values.get(propname)
98
- if vals is not None:
99
- valcnt: int = 0
100
- if type(vals) is list: # we do have several values for this properties
101
- self._values[propname] = []
102
- for val in vals:
103
- if valcnt > 0 and (propinfo.cardinality == Cardinality.C_0_1 or propinfo.cardinality == Cardinality.C_1):
104
- raise BaseError("Cardinality does not allow multiple values for \"{}\"!".format(propname))
105
- if type(val) is Value:
106
- self._values[propname].append(val)
107
- elif type(val) is dict:
108
- if propinfo.valtype is ListValue:
109
- val['lists'] = self.lists
110
- self._values[propname].append(propinfo.valtype(**val))
111
- else:
112
- if propinfo.valtype is ListValue:
113
- val = {'value': val, 'lists': self.list}
114
- self._values[propname].append(propinfo.valtype(val))
115
- valcnt = valcnt + 1
116
- else: # we do have only one value for this property
117
- if type(vals) is Value:
118
- self._values[propname] = vals
119
- elif type(vals) is dict:
120
- if propinfo.valtype is ListValue:
121
- vals['lists'] = self.lists
122
- self._values[propname] = propinfo.valtype(**vals)
123
- else:
124
- if propinfo.valtype is ListValue:
125
- vals = {'value': val, 'lists': self.list}
126
- self._values[propname] = propinfo.valtype(vals)
127
- else:
128
- if propinfo.cardinality == Cardinality.C_1 or propinfo.cardinality == Cardinality.C_1_n:
129
- raise BaseError("Cardinality does require at least one value for \"{}\"!".format(propname))
130
- for propname in values:
131
- if self.properties.get(propname) is None:
132
- raise BaseError("Property \"{}\" is not part of data model!".format(propname))
133
-
134
- @property
135
- def iri(self) -> str:
136
- return self._iri
137
-
138
- @property
139
- def ark(self) -> str:
140
- return self._ark
141
-
142
- @property
143
- def vark(self) -> str:
144
- return self._vark
145
-
146
- def clone(self) -> 'ResourceInstance':
147
- return deepcopy(self)
148
-
149
- def fromJsonLdObj(self, con: Connection, jsonld_obj: Any) -> 'ResourceInstance':
150
- newinstance = self.clone()
151
- newinstance._iri = jsonld_obj.get('@id')
152
- resclass = jsonld_obj.get('@type')
153
- context = Context(jsonld_obj.get('@context'))
154
- newinstance._label = jsonld_obj.get("rdfs:label")
155
- newinstance._ark = Value.get_typed_value("knora-api:arkUrl", jsonld_obj)
156
- newinstance._vark = Value.get_typed_value("knora-api:versionArkUrl", jsonld_obj)
157
- newinstance._permissions = Permissions.fromString(jsonld_obj.get("knora-api:hasPermissions"))
158
- newinstance._upermission = PermissionValue[jsonld_obj.get("knora-api:userHasPermission", jsonld_obj)]
159
- creation_date = Value.get_typed_value("knora-api:creationDate", jsonld_obj)
160
- user = Value.get_typed_value("knora-api:attachedToUser", jsonld_obj)
161
- project = Value.get_typed_value("knora-api:attachedToProject", jsonld_obj)
162
- to_be_ignored = [
163
- '@id', '@type', '@context', "rdfs:label", "knora-api:arkUrl", "knora-api:versionArkUrl",
164
- "knora-api:creationDate", "knora-api:attachedToUser", "knora-api:attachedToProject",
165
- "knora-api:hasPermissions", "knora-api:userHasPermission"
166
- ]
167
- if id is None:
168
- raise BaseError('Resource "id" is missing in JSON-LD from DSP-API')
169
- type = jsonld_obj.get('@type')
170
- newinstance._values: Dict[str, Union[Value, List[Value]]] = {}
171
- for key, obj in jsonld_obj.items():
172
- if key in to_be_ignored:
173
- continue
174
- try:
175
- if isinstance(obj, list):
176
- newinstance._values[key] = []
177
- for o in obj:
178
- newinstance._values[key].append(fromJsonLdObj(o))
179
- else:
180
- newinstance._values[key] = fromJsonLdObj(obj)
181
- except KeyError as kerr:
182
- raise BaseError("Invalid data in JSON-LD: \"{}\" has value class \"{}\"!".format(key, obj.get("@type")))
183
- return newinstance
184
-
185
- def toJsonLdObj(self, action: Actions) -> Any:
186
- tmp = {}
187
- if action == Actions.Create:
188
- tmp['@type'] = self.classname
189
- tmp["knora-api:attachedToProject"] = {
190
- "@id": self.project
191
- }
192
- tmp['rdfs:label'] = self._label
193
- if self._permissions:
194
- tmp["knora-api:hasPermissions"] = self._permissions.toJsonLdObj()
195
- if self._bitstream:
196
- tmp["knora-api:hasStillImageFileValue"] = {
197
- "@type": "knora-api:StillImageFileValue",
198
- "knora-api:fileValueHasFilename": self._bitstream
199
- }
200
- for propname, valtype in self._values.items():
201
- if type(valtype) is list:
202
- if type(valtype[0]) is LinkValue:
203
- propname += 'Value'
204
- tmp[propname] = []
205
- for vt in valtype:
206
- tmp[propname].append(vt.toJsonLdObj(action))
207
- pass
208
- else:
209
- if type(valtype) is LinkValue:
210
- propname += 'Value'
211
- tmp[propname] = valtype.toJsonLdObj(action)
212
- tmp['@context'] = self.context
213
- else:
214
- pass
215
- return tmp
216
-
217
- def create(self):
218
- jsonobj = self.toJsonLdObj(Actions.Create)
219
- jsondata = json.dumps(jsonobj, indent=4, separators=(',', ': '), cls=KnoraStandoffXmlEncoder)
220
- # print(jsondata)
221
- result = self._con.post('/v2/resources', jsondata)
222
- newinstance = self.clone()
223
- newinstance._iri = result['@id']
224
- newinstance._ark = result['knora-api:arkUrl']['@value']
225
- newinstance._vark = result['knora-api:versionArkUrl']['@value']
226
- return newinstance
227
-
228
- def read(self) -> 'ResourceInstance':
229
- result = self._con.get('/v2/resources/' + quote_plus(self._iri))
230
- return self.fromJsonLdObj(con=self._con, jsonld_obj=result)
231
-
232
-
233
- def update(self):
234
- pass
235
-
236
- def delete(self):
237
- pass
238
-
239
- def print(self):
240
- print('Iri:', self._iri)
241
- print('Ark:', self._ark)
242
- print('Vark:', self._vark)
243
- print('Label:', self._label)
244
- print('Permissions:', str(self._permissions))
245
- print('Userpermission:', str(self._upermission))
246
- for name, val in self._values.items():
247
- if isinstance(val, list):
248
- tmp = [str(x) for x in val]
249
- print(name, ':', " | ".join(tmp))
250
- pass
251
- else:
252
- print(name, ':', str(val))
253
-
254
-
255
- @strict
256
- class ResourceInstanceFactory:
257
- _con: Connection
258
- _project: Project
259
- _lists = List[ListNode]
260
- _ontologies = Dict[str, Ontology]
261
- _ontoname2iri = Dict[str, str]
262
- _context: Context
263
-
264
- def __init__(self,
265
- con: Connection,
266
- projident: str):
267
- self._con = con
268
- if re.match("^[0-9aAbBcCdDeEfF]{4}$", projident):
269
- project = Project(con=self._con, shortcode=projident)
270
- elif re.match("^[\\w-]+$", projident):
271
- project = Project(con=self._con, shortname=projident)
272
- elif re.match("^(http)s?://([\\w\\.\\-~]+:?\\d{,4})(/[\\w\\-~]+)+$", projident):
273
- project = Project(con=self._con, shortname=projident)
274
- else:
275
- raise BaseError("Invalid project identification!")
276
- self._project = project.read()
277
-
278
- tmp = ListNode.getAllLists(con=self._con, project_iri=self._project.id)
279
- self._lists = []
280
- for rnode in tmp:
281
- self._lists.append(rnode.getAllNodes())
282
-
283
- tmp_ontologies = Ontology.getProjectOntologies(con, self._project.id)
284
- shared_project = Project(con=self._con, shortcode="0000").read()
285
- shared_ontologies = Ontology.getProjectOntologies(con, shared_project.id)
286
- tmp_ontologies.extend(shared_ontologies)
287
- self._ontoname2iri = {x.name: x.id for x in tmp_ontologies}
288
-
289
- ontology_ids = [x.id for x in tmp_ontologies]
290
- self._ontologies = {}
291
- self._properties = {}
292
- self._context = {}
293
- for onto in ontology_ids:
294
- oparts = onto.split("/")
295
- name = oparts[len(oparts) - 2]
296
- shortcode = oparts[len(oparts) - 3]
297
- self._ontologies[name] = Ontology.getOntologyFromServer(con=con, shortcode=shortcode, name=name)
298
- self._properties.update({name + ':' + x.name: x for x in self._ontologies[name].property_classes})
299
- self._context.update(self._ontologies[name].context)
300
-
301
- @property
302
- def lists(self) -> List[ListNode]:
303
- return self._lists
304
-
305
- def get_resclass_names(self) -> List[str]:
306
- resclass_names: List[str] = []
307
- for name, onto in self._ontologies.items():
308
- for resclass in onto.resource_classes:
309
- resclass_names.append(onto.context.get_prefixed_iri(resclass.id))
310
- return resclass_names
311
-
312
- def _get_baseclass(self, superclasses: List[str]) -> Union[str, None]:
313
- for sc in superclasses:
314
- ontoname, classname = sc.split(':')
315
- if ontoname == 'knora-api':
316
- return classname
317
- o = self._ontologies.get(ontoname)
318
- if o is None:
319
- continue
320
- gaga = [x for x in o.resource_classes if x.name == classname][0]
321
- return self._get_baseclass(gaga.superclasses)
322
- return None
323
-
324
- def get_resclass(self, prefixedresclass: str) -> Type:
325
- prefix, resclass_name = prefixedresclass.split(':')
326
- resclass = [x for x in self._ontologies[prefix].resource_classes if x.name == resclass_name][0]
327
- baseclass = self._get_baseclass(resclass.superclasses)
328
- props: Dict[str, Propinfo] = {}
329
- switcher = {
330
- 'knora-api:TextValue': TextValue,
331
- 'knora-api:ColorValue': ColorValue,
332
- 'knora-api:DateValue': DateValue,
333
- 'knora-api:DecimalValue': DecimalValue,
334
- 'knora-api:GeomValue': GeomValue,
335
- 'knora-api:GeonameValue': GeonameValue,
336
- 'knora-api:IntValue': IntValue,
337
- 'knora-api:BooleanValue': BooleanValue,
338
- 'knora-api:UriValue': UriValue,
339
- 'knora-api:TimeValue': TimeValue,
340
- 'knora-api:IntervalValue': IntervalValue,
341
- 'knora-api:ListValue': ListValue,
342
- 'knora-api:LinkValue': LinkValue,
343
- }
344
- for propname, has_property in resclass.has_properties.items():
345
- if has_property.ptype == HasProperty.Ptype.other:
346
- valtype = switcher.get(self._properties[propname].object)
347
- if valtype == LinkValue:
348
- continue # we have the Link to the LinkValue which we do not use
349
- if valtype is None:
350
- valtype = LinkValue
351
- props[propname] = Propinfo(valtype=valtype,
352
- cardinality=has_property.cardinality,
353
- gui_order=has_property.gui_order,
354
- attributes=self._properties[propname].object)
355
- else:
356
- props[propname] = Propinfo(valtype=valtype,
357
- cardinality=has_property.cardinality,
358
- gui_order=has_property.gui_order)
359
- return type(resclass_name, (ResourceInstance,), {'project': self._project.id,
360
- 'classname': prefixedresclass,
361
- 'baseclass': baseclass,
362
- 'context': self._context,
363
- 'properties': props,
364
- 'lists': self._lists})
365
-
366
-