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
knora/dsp_tools.py DELETED
@@ -1,96 +0,0 @@
1
- import argparse
2
- import sys
3
- import os
4
-
5
- sys.path.append(os.path.dirname(os.path.realpath(__file__)))
6
-
7
- from dsplib.utils.onto_validate import validate_list, validate_ontology
8
- from dsplib.utils.onto_create_lists import create_lists
9
- from dsplib.utils.onto_create_ontology import create_ontology
10
- from dsplib.utils.onto_get import get_ontology
11
- from dsplib.utils.xml_upload import xml_upload
12
-
13
-
14
- def program(args):
15
- #
16
- # parse the arguments of the command line
17
- #
18
- parser = argparse.ArgumentParser(
19
- description="A program to create and manipulate ontologies based on the DaSCH Service Platform"
20
- )
21
-
22
- subparsers = parser.add_subparsers(title="Subcommands",
23
- description='Valid subcommands are',
24
- help='sub-command help')
25
-
26
- parser_create = subparsers.add_parser('create', help='Create ontologies, lists etc.')
27
- parser_create.set_defaults(action="create")
28
- parser_create.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the DSP server")
29
- parser_create.add_argument("-u", "--user", default="root@example.com", help="Username for DSP server")
30
- parser_create.add_argument("-p", "--password", default="test", help="The password for login")
31
- parser_create.add_argument("-V", "--validate", action='store_true', help="Do only validation of JSON, no upload of the ontology")
32
- parser_create.add_argument("datamodelfile", help="path to data model file")
33
- parser_create.add_argument("-L", "--listfile", type=str, default="lists.json", help="Name of list node informationfile")
34
- parser_create.add_argument("-l", "--lists", action='store_true', help="Only create the lists")
35
- parser_create.add_argument("-v", "--verbose", action="store_true", help="Verbose feedback")
36
- parser_create.add_argument("-d", "--dump", action="store_true", help="dump test files for DSP-API requests")
37
-
38
- parser_get = subparsers.add_parser('get', help='Get project/ontology information from server')
39
- parser_get.set_defaults(action="get")
40
- parser_get.add_argument("-u", "--user", default="root@example.com", help="Username for DSP server")
41
- parser_get.add_argument("-p", "--password", default="test", help="The password for login")
42
- parser_get.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the DSP server")
43
- parser_get.add_argument("-P", "--project", type=str, help="Shortcode, shortname or iri of project", required=True)
44
- parser_get.add_argument("outfile", help="path to data model file", default="onto.json")
45
- parser_get.add_argument("-v", "--verbose", action="store_true", help="Verbose feedback")
46
-
47
- parser_upload = subparsers.add_parser('xmlupload', help='Upload data from XML file to server')
48
- parser_upload.set_defaults(action="xmlupload")
49
- parser_upload.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the DSP server")
50
- parser_upload.add_argument("-u", "--user", type=str, default="root@example.com", help="Username for DSP server")
51
- parser_upload.add_argument("-p", "--password", type=str, default="test", help="The password for login")
52
- parser_upload.add_argument("-V", "--validate", action='store_true', help="Do only validation of JSON, no upload of the ontology")
53
- parser_upload.add_argument("-i", "--imgdir", type=str, default=".", help="Path to folder containing the images")
54
- parser_upload.add_argument("-S", "--sipi", type=str, default="http://0.0.0.0:1024", help="URL of SIPI server")
55
- parser_upload.add_argument("xmlfile", help="path to xml file containing the data", default="data.xml")
56
- parser_upload.add_argument("-v", "--verbose", action="store_true", help="Verbose feedback")
57
-
58
- args = parser.parse_args(args)
59
-
60
- if not hasattr(args, 'action'):
61
- parser.print_help(sys.stderr)
62
- exit(0)
63
-
64
- if args.action == "create":
65
- if args.lists:
66
- if args.validate:
67
- validate_list(args.datamodelfile)
68
- else:
69
- create_lists(args.datamodelfile, args.dump)
70
- else:
71
- if args.validate:
72
- validate_ontology(args.datamodelfile)
73
- else:
74
- create_ontology(args.datamodelfile, args.listfile, args.server, args.user, args.password, args.verbose,
75
- args.dump if args.dump else False)
76
- elif args.action == "get":
77
- get_ontology(args.project, args.outfile, args.server, args.user, args.password, args.verbose)
78
- elif args.action == "xmlupload":
79
- xml_upload(input_file=args.xmlfile,
80
- server=args.server,
81
- user=args.user,
82
- password=args.password,
83
- imgdir=args.imgdir,
84
- sipi=args.sipi,
85
- verbose=args.verbose,
86
- validate=args.validate)
87
-
88
-
89
-
90
- def main():
91
- program(sys.argv[1:])
92
-
93
-
94
- if __name__ == '__main__':
95
- program(sys.argv[1:])
96
-
@@ -1,272 +0,0 @@
1
- import requests
2
- import json
3
- from pystrict import strict
4
- from typing import List, Set, Dict, Tuple, Optional, Any, Union
5
-
6
- from .helpers import Actions, BaseError
7
-
8
- @strict
9
- class Connection:
10
- """
11
- An Connection instance represents a connection to a Knora server.
12
-
13
- Attributes
14
- ----------
15
-
16
- none (internal use attributes should not be modified/set directly)
17
- """
18
-
19
- _server: str
20
- _prefixes: Union[Dict[str, str], None]
21
- _token: Union[str, None]
22
- _log: bool
23
-
24
- def __init__(self, server: str, prefixes: Dict[str, str] = None):
25
- """
26
- Constructor requiring the server address, the user and password of KNORA
27
- :param server: Address of the server, e.g https://api.dasch.swiss
28
- :param prefixes: Ontology prefixes used
29
- """
30
-
31
- self._server = server
32
- self._prefixes = prefixes
33
- self._token = None
34
- self._log = False
35
-
36
- def login(self, email: str, password: str) -> None:
37
- """
38
- Method to login into KNORA which creates a session token.
39
- :param email: Email of user, e.g., root@example.com
40
- :param password: Password of the user, e.g. test
41
- """
42
-
43
- credentials = {
44
- "email": email,
45
- "password": password
46
- }
47
- jsondata = json.dumps(credentials)
48
-
49
- req = requests.post(
50
- self._server + '/v2/authentication',
51
- headers={'Content-Type': 'application/json; charset=UTF-8'},
52
- data=jsondata
53
- )
54
- self.on_api_error(req)
55
- result = req.json()
56
- self._token = result["token"]
57
-
58
- def get_token(self) -> str:
59
- """
60
- Returns the token
61
- :return: token string
62
- """
63
-
64
- return self._token
65
-
66
- def start_logging(self):
67
- self._log = True
68
-
69
- def stop_logging(self):
70
- self._log = False
71
-
72
- def logout(self) -> None:
73
- """
74
- Performs a logout
75
- :return: None
76
- """
77
-
78
- if self._token is not None:
79
- req = requests.delete(
80
- self._server + '/v2/authentication',
81
- headers={'Authorization': 'Bearer ' + self._token}
82
- )
83
- self.on_api_error(req)
84
- self._token = None
85
-
86
- def __del__(self):
87
- pass
88
- #self.logout()
89
-
90
- def on_api_error(self, res) -> None:
91
- """
92
- Method to check for any API errors
93
- :param res: The input to check, usually JSON format
94
- :return: Possible Error that is being raised
95
- """
96
-
97
- if res.status_code != 200:
98
- raise BaseError("KNORA-ERROR: status code=" + str(res.status_code) + "\nMessage:" + res.text)
99
-
100
- if 'error' in res:
101
- raise BaseError("KNORA-ERROR: API error: " + res.error)
102
-
103
- def post(self, path: str, jsondata: Optional[str] = None):
104
- """
105
- Post Json data to a given server using a HTTP POST request
106
- :param path: Path of RESTful route
107
- :param jsondata: Valid JSON as string
108
- :return: Response from server
109
- """
110
-
111
- if path[0] != '/':
112
- path = '/' + path
113
- headers = None
114
- if jsondata is None:
115
- if self._token is not None:
116
- headers = {'Authorization': 'Bearer ' + self._token}
117
- req = requests.post(self._server + path,
118
- headers=headers)
119
- else:
120
- req = requests.post(self._server + path)
121
- else:
122
- if self._token is not None:
123
- headers = {'Content-Type': 'application/json; charset=UTF-8',
124
- 'Authorization': 'Bearer ' + self._token}
125
- req = requests.post(self._server + path,
126
- headers=headers,
127
- data=jsondata)
128
- else:
129
- headers = {'Content-Type': 'application/json; charset=UTF-8'}
130
- req = requests.post(self._server + path,
131
- headers=headers,
132
- data=jsondata)
133
- if self._log:
134
- if jsondata:
135
- jsonobj = json.loads(jsondata)
136
- else:
137
- jsonobj = None
138
- logobj = {
139
- "method": "POST",
140
- "headers": headers,
141
- "route": path,
142
- "body": jsonobj,
143
- "return-headers": dict(req.headers),
144
- "return": req.json() if req.status_code == 200 else {"status": str(req.status_code),
145
- "message": req.text}
146
- }
147
- tmp = path.split('/')
148
- filename = "POST" + "_".join(tmp) + ".json"
149
- with open(filename, 'w') as f:
150
- json.dump(logobj, f, indent=3)
151
- self.on_api_error(req)
152
- result = req.json()
153
- return result
154
-
155
- def get(self, path: str, headers: Optional[Dict[str, str]] = None):
156
- """
157
- Get data from a server using a HTTP GET request
158
- :param path: Path of RESTful route
159
- :param headers: ...
160
- :return: Response from server
161
- """
162
-
163
- if path[0] != '/':
164
- path = '/' + path
165
- if self._token is None:
166
- if headers is None:
167
- req = requests.get(self._server + path)
168
- else:
169
- req = requests.get(self._server + path, headers)
170
- else:
171
- if headers is None:
172
- req = requests.get(self._server + path,
173
- headers={'Authorization': 'Bearer ' + self._token})
174
- else:
175
- headers['Authorization'] = 'Bearer ' + self._token
176
- req = requests.get(self._server + path, headers)
177
-
178
- self.on_api_error(req)
179
- result = req.json()
180
- return result
181
-
182
- def put(self, path: str, jsondata: Optional[str] = None, content_type: str = 'application/json'):
183
- """
184
- Send data to a RESTful server using a HTTP PUT request
185
- :param path: Path of RESTful route
186
- :param jsondata: Valid JSON as string
187
- :param content_type: HTTP Content-Type [default: 'application/json']
188
- :return:
189
- """
190
-
191
- if path[0] != '/':
192
- path = '/' + path
193
- if jsondata is None:
194
- req = requests.put(self._server + path,
195
- headers={'Authorization': 'Bearer ' + self._token})
196
- else:
197
- req = requests.put(self._server + path,
198
- headers={'Content-Type': content_type + '; charset=UTF-8',
199
- 'Authorization': 'Bearer ' + self._token},
200
- data=jsondata)
201
- self.on_api_error(req)
202
- result = req.json()
203
- return result
204
-
205
- def delete(self, path: str, params: Optional[any] = None):
206
- """
207
- Send a delete request using the HTTP DELETE request
208
- :param path: Path of RESTful route
209
- :return: Response from server
210
- """
211
-
212
- if path[0] != '/':
213
- path = '/' + path
214
- if params is not None:
215
- req = requests.delete(self._server + path,
216
- headers={'Authorization': 'Bearer ' + self._token},
217
- params=params)
218
-
219
- else:
220
- req = requests.delete(self._server + path,
221
- headers={'Authorization': 'Bearer ' + self._token})
222
- self.on_api_error(req)
223
- result = req.json()
224
- return result
225
-
226
- def reset_triplestore_content(self):
227
- rdfdata = [
228
- {
229
- "path": "./knora-ontologies/knora-admin.ttl",
230
- "name": "http://www.knora.org/ontology/knora-admin"
231
- },
232
- {
233
- "path": "./knora-ontologies/knora-base.ttl",
234
- "name": "http://www.knora.org/ontology/knora-base"
235
- },
236
- {
237
- "path": "./knora-ontologies/standoff-onto.ttl",
238
- "name": "http://www.knora.org/ontology/standoff"
239
- },
240
- {
241
- "path": "./knora-ontologies/standoff-data.ttl",
242
- "name": "http://www.knora.org/data/standoff"
243
- },
244
- {
245
- "path": "./knora-ontologies/salsah-gui.ttl",
246
- "name": "http://www.knora.org/ontology/salsah-gui"
247
- },
248
- {
249
- "path": "./_test_data/all_data/admin-data.ttl",
250
- "name": "http://www.knora.org/data/admin"
251
- },
252
- {
253
- "path": "./_test_data/all_data/permissions-data.ttl",
254
- "name": "http://www.knora.org/data/permissions"
255
- },
256
- {
257
- "path": "./_test_data/all_data/system-data.ttl",
258
- "name": "http://www.knora.org/data/0000/SystemProject"
259
- }
260
- ]
261
- jsondata = json.dumps(rdfdata)
262
- url = self._server + '/admin/store/ResetTriplestoreContent?prependdefaults=false'
263
-
264
- req = requests.post(url,
265
- headers={'Content-Type': 'application/json; charset=UTF-8'},
266
- data=jsondata)
267
- self.on_api_error(req)
268
- res = req.json()
269
- # pprint(res)
270
- return res
271
-
272
-
@@ -1,296 +0,0 @@
1
- import json
2
- from pystrict import strict
3
- from typing import List, Set, Dict, Tuple, Optional, Any, Union
4
- from urllib.parse import quote_plus
5
-
6
- from .helpers import Actions, BaseError
7
- from .connection import Connection
8
- from .model import Model
9
- from .project import Project
10
-
11
- """
12
- This module implements the handling (CRUD) of Knora groups.
13
-
14
- CREATE:
15
- * Instantiate a new object of the class Group with all required parameters
16
- * Call the ``create``-method on the instance
17
-
18
- READ:
19
- * Instantiate a new object with ``id``(IRI of group) given
20
- * Call the ``read``-method on the instance
21
- * Access the information that has been provided to the instance
22
-
23
- UPDATE:
24
- * You need an instance of an existing Project by reading an instance
25
- * Change the attributes by assigning the new values
26
- * Call the ``update```method on the instance
27
-
28
- DELETE
29
- * Instantiate a new objects with ``id``(IRI of group) given, or use any instance that has the id set
30
- * Call the ``delete``-method on the instance
31
-
32
- """
33
- @strict
34
- class Group(Model):
35
- """
36
- This class represents a Knora group
37
-
38
- Attributes
39
- ----------
40
-
41
- con : Connection
42
- A connection instance to a Knora server
43
-
44
- id : str
45
- IRI of the group [get only, cannot be modified after creation of instance]
46
-
47
- name : str
48
- Name of the group
49
-
50
- description : str
51
- A description of the group
52
-
53
- project : str | project
54
- either the IRI of a project [get only, cannot be modified after creation of instance]
55
- or an valid Project instance
56
-
57
- selfjoin : boolean
58
- A flag indicating if selfjoin is allowed in this group
59
-
60
- status : boolean
61
- A flag indicating if the group is active (True) or inactive/makred deleted (False)
62
-
63
- """
64
-
65
- PROJECT_MEMBER_GROUP: str = "http://www.knora.org/ontology/knora-admin#ProjectMember"
66
- PROJECT_ADMIN_GROUP: str = "http://www.knora.org/ontology/knora-admin#ProjectAdmin"
67
- PROJECT_SYSTEMADMIN_GROUP: str = "http://www.knora.org/ontology/knora-admin#SystemAdmin"
68
-
69
- _id: str
70
- _name: str
71
- _description: str
72
- _project: str
73
- _selfjoin: bool
74
- _status: bool
75
-
76
- def __init__(self,
77
- con: Connection,
78
- id: Optional[str] = None,
79
- name: Optional[str] = None,
80
- description: Optional[str] = None,
81
- project: Optional[Union[str, Project]] = None,
82
- selfjoin: Optional[bool] = None,
83
- status: Optional[bool] = None):
84
- super().__init__(con)
85
- self._id = str(id) if id is not None else None
86
- self._name = str(name) if name is not None else None
87
- self._description = description
88
- if project is not None and isinstance(project, Project):
89
- self._project = project.id
90
- else:
91
- self._project = str(project) if project is not None else None
92
- self._selfjoin = bool(selfjoin) if selfjoin is not None else None
93
- self._status = bool(status) if status is not None else None
94
-
95
- @property
96
- def id(self) -> Optional[str]:
97
- return self._id
98
-
99
- @id.setter
100
- def id(self, value: str) -> None:
101
- raise BaseError('Group id cannot be modified!')
102
-
103
- @property
104
- def name(self) -> Optional[str]:
105
- return self._name
106
-
107
- @name.setter
108
- def name(self, value: str):
109
- self._name = value
110
- self._changed.add('name')
111
-
112
- @property
113
- def description(self):
114
- return self._description
115
-
116
- @description.setter
117
- def description(self, value: Optional[str]):
118
- self._description = value
119
- self._changed.add('description')
120
-
121
- @property
122
- def project(self):
123
- return self._project
124
-
125
- @project.setter
126
- def project(self, value: str):
127
- raise BaseError('project id cannot be modified!')
128
-
129
- @property
130
- def selfjoin(self) -> bool:
131
- return self._selfjoin
132
-
133
- @selfjoin.setter
134
- def selfjoin(self, value: bool) -> None:
135
- self._selfjoin = value
136
- self._changed.add('selfjoin')
137
-
138
- @property
139
- def status(self) -> bool:
140
- return self._status
141
-
142
- @status.setter
143
- def status(self, value: bool) -> None:
144
- self._status = value
145
- self._changed.add('status')
146
-
147
- def has_changed(self) -> bool:
148
- if self._changed:
149
- return True
150
- else:
151
- return False
152
-
153
- @classmethod
154
- def fromJsonObj(cls, con: Connection, json_obj: Any):
155
- id = json_obj.get('id')
156
- if id is None:
157
- raise BaseError('Group "id" is missing in JSON from knora')
158
- name = json_obj.get('name')
159
- if name is None:
160
- raise BaseError('Group "name" is missing in JSON from knora')
161
- description = json_obj.get('description')
162
- tmp = json_obj.get('project')
163
- if tmp is None:
164
- raise BaseError('Group "project" is missing in JSON from knora')
165
- project = tmp.get('id')
166
- if project is None:
167
- raise BaseError('Group "project" has no "id" in JSON from knora')
168
- selfjoin = json_obj.get('selfjoin')
169
- if selfjoin is None:
170
- raise BaseError("selfjoin is missing in JSON from knora")
171
- status = json_obj.get('status')
172
- if status is None:
173
- raise BaseError("Status is missing in JSON from knora")
174
- return cls(con=con,
175
- name=name,
176
- id=id,
177
- description=description,
178
- project=project,
179
- selfjoin=selfjoin,
180
- status=status)
181
-
182
- def toJsonObj(self, action: Actions):
183
- tmp = {}
184
- if action == Actions.Create:
185
- if self._name is None:
186
- raise BaseError("There must be a valid name!")
187
- tmp['name'] = self._name
188
- if self._description is not None:
189
- tmp['description'] = self._description
190
- if self._project is None:
191
- raise BaseError("There must be a valid project!")
192
- tmp['project'] = self._project
193
- if self._selfjoin is None:
194
- raise BaseError("There must be a valid value for selfjoin!")
195
- tmp['selfjoin'] = self._selfjoin
196
- if self._status is None:
197
- raise BaseError("There must be a valid value for status!")
198
- tmp['status'] = self._status
199
- else:
200
- if self._name is not None and 'name' in self._changed:
201
- tmp['name'] = self._name
202
- if self._description is not None and 'description' in self._changed:
203
- tmp['description'] = self._description
204
- if self._selfjoin is not None and 'selfjoin' in self._changed:
205
- tmp['selfjoin'] = self._selfjoin
206
- return tmp
207
-
208
- def create(self):
209
- jsonobj = self.toJsonObj(Actions.Create)
210
- jsondata = json.dumps(jsonobj)
211
- result = self._con.post('/admin/groups', jsondata)
212
- return Group.fromJsonObj(self._con, result['group'])
213
-
214
- def read(self):
215
- result = self._con.get('/admin/groups/' + quote_plus(self._id))
216
- return Group.fromJsonObj(self._con, result['group'])
217
-
218
- def update(self):
219
- jsonobj = self.toJsonObj(Actions.Update)
220
- if jsonobj:
221
- jsondata = json.dumps(jsonobj)
222
- result = self._con.put('/admin/groups/' + quote_plus(self._id), jsondata)
223
- updated_group = Group.fromJsonObj(self._con, result['group'])
224
- if self._status is not None and 'status' in self._changed:
225
- jsondata = json.dumps({'status': self._status})
226
- result = self._con.put('/admin/groups/' + quote_plus(self._id) + '/status', jsondata)
227
- updated_group = Group.fromJsonObj(self._con, result['group'])
228
- return updated_group
229
-
230
- def delete(self):
231
- result = self._con.delete('/admin/groups/' + quote_plus(self._id))
232
- return Group.fromJsonObj(self._con, result['group'])
233
-
234
- @staticmethod
235
- def getAllGroups(con: Connection) -> List['Group']:
236
- result = con.get('/admin/groups')
237
- if 'groups' not in result:
238
- raise BaseError("Request got no groups!")
239
- return list(map(lambda a: Group.fromJsonObj(con, a), result['groups']))
240
-
241
-
242
- def print(self):
243
- print('Group Info:')
244
- print(' Id: {}'.format(self._id))
245
- print(' Name: {}'.format(self._name))
246
- print(' Description: {}'.format(self._description))
247
- print(' Project: {}'.format(self._project))
248
- print(' Selfjoin: {}'.format(self._selfjoin))
249
- print(' Status: {}'.format(self._status))
250
-
251
-
252
-
253
- if __name__ == '__main__':
254
- con = Connection('http://0.0.0.0:3333')
255
- con.login('root@example.com', 'test')
256
-
257
- groups = Group.getAllGroups(con)
258
- for group in groups:
259
- group.print()
260
-
261
- new_group = Group(con=con,
262
- name="KNORA-PY TEST",
263
- description="Test project for knora-py",
264
- project="http://rdfh.ch/projects/00FF",
265
- status=True,
266
- selfjoin=False).create()
267
- new_group.print()
268
-
269
- new_group.name="KNORA-PY TEST - modified"
270
- new_group = new_group.update();
271
- new_group.print()
272
-
273
- new_group.description="gaga gaga gaga gaga gaga gaga gaga"
274
- new_group = new_group.update();
275
- new_group.print()
276
-
277
- new_group.selfjoin = True
278
- new_group = new_group.update();
279
- new_group.print()
280
-
281
- new_group.status = False
282
- new_group = new_group.update();
283
- new_group.print()
284
-
285
- new_group.name = '-- KNORA-PY TEST --'
286
- new_group.description = 'Final Test'
287
- new_group.status = True
288
- new_group = new_group.update()
289
- new_group.print()
290
-
291
- new_group.delete()
292
-
293
- print('=========================')
294
- groups = Group.getAllGroups(con)
295
- for group in groups:
296
- group.print()