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,583 +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 .langstring import Languages, LangStringParam, LangString
8
- from .connection import Connection
9
- from .model import Model
10
-
11
- from pprint import pprint
12
-
13
- class SetEncoder(json.JSONEncoder):
14
- def default(self, obj):
15
- if isinstance(obj, set):
16
- return list(obj)
17
- return json.JSONEncoder.default(self, obj)
18
-
19
- """
20
- This module implements the handling (CRUD) of Knora projects.
21
-
22
- CREATE:
23
- * Instantiate a new object of the class Project with all required parameters
24
- * Call the ``create``-method on the instance
25
-
26
- READ:
27
- * Instantiate a new object with ``id``(IRI of project) given
28
- * Call the ``read``-method on the instance
29
- * Access the information that has been provided to the instance
30
-
31
- UPDATE:
32
- * You need an instance of an existing Project by reading an instance
33
- * Change the attributes by assigning the new values
34
- * Call the ``update```method on the instance
35
-
36
- DELETE
37
- * Instantiate a new objects with ``id``(IRI of project) given, or use any instance that has the id set
38
- * Call the ``delete``-method on the instance
39
-
40
- In addition there is a static methods ``getAllProjects`` which returns a list of all projects
41
- """
42
-
43
- @strict
44
- class Project(Model):
45
- """
46
- This class represents a project in Knora.
47
-
48
- Attributes
49
- ----------
50
-
51
- con : Connection
52
- A Connection instance to a Knora server
53
-
54
- id : str
55
- IRI of the project [readonly, cannot be modified after creation of instance]
56
-
57
- shortcode : str
58
- Knora project shortcode [readonly, cannot be modified after creation of instance]
59
-
60
- shortname : str
61
- Knora project shortname [read/write]
62
-
63
- longname : str
64
- Knora project longname [read/write]
65
-
66
- description : LangString
67
- Knora project description in a given language (Languages.EN, Languages.DE, Languages.FR, Languages.IT).
68
- A desciption can be add/replaced or removed with the methods ``addDescription``and ``rmDescription``.
69
-
70
- keywords : Set[str]
71
- Set of keywords describing the project. Keywords can be added/removed by the methods ``addKeyword``
72
- and ``rmKeyword``
73
-
74
- ontologies : Set[str]
75
- Set if IRI's of the ontologies attached to the project [readonly]
76
-
77
- selfjoin : bool
78
- Boolean if the project allows selfjoin
79
-
80
-
81
- Methods
82
- -------
83
-
84
- create : Knora project information object
85
- Creates a new project and returns the information from the project as it is in Knora
86
-
87
- read : Knora project information object
88
- Read project data from an existing project
89
-
90
- update : Knora project information object
91
- Updates the changed attributes and returns the updated information from the project as it is in Knora
92
-
93
- delete : Knora result code
94
- Deletes a project and returns the result code
95
-
96
- getAllprojects [static]: List of all projects
97
- Returns a list of all projects available
98
-
99
- print : None
100
- Prints the project information to stdout
101
-
102
- """
103
- _id: str
104
- _shortcode: str
105
- _shortname: str
106
- _longname: str
107
- _description: LangString
108
- _keywords: Set[str]
109
- _ontologies: Set[str]
110
- _selfjoin: bool
111
- _status: bool
112
- _logo: Optional[str]
113
-
114
- SYSTEM_PROJECT: str = "http://www.knora.org/ontology/knora-admin#SystemProject"
115
-
116
- def __init__(self,
117
- con: Connection,
118
- id: Optional[str] = None,
119
- shortcode: Optional[str] = None,
120
- shortname: Optional[str] = None,
121
- longname: Optional[str] = None,
122
- description: LangStringParam = None,
123
- keywords: Optional[Set[str]] = None,
124
- ontologies: Optional[Set[str]] = None,
125
- selfjoin: Optional[bool] = None,
126
- status: Optional[bool] = None,
127
- logo: Optional[str] = None):
128
- """
129
- Constructor for Project
130
-
131
- :param con: Connection instance
132
- :param id: IRI of the project [required for CREATE, READ]
133
- :param shortcode: Shortcode of the project. String inf the form 'XXXX' where each X is a hexadezimal sign 0-1,A,B,C,D,E,F. [required for CREATE]
134
- :param shortname: Shortname of the project [required for CREATE]
135
- :param longname: Longname of the project [required for CREATE]
136
- :param description: LangString instance containing the description [required for CREATE]
137
- :param keywords: Set of keywords [required for CREATE]
138
- :param ontologies: Set of ontologies that belong to this project [optional]
139
- :param selfjoin: Allow selfjoin [required for CREATE]
140
- :param status: Status of project (active if True) [required for CREATE]
141
- :param logo: Path to logo image file [optional] NOT YET USED
142
- """
143
- super().__init__(con)
144
- self._id = id
145
- self._shortcode = shortcode
146
- self._shortname = shortname
147
- self._longname = longname
148
- self._description = LangString(description)
149
- self._keywords = keywords
150
- if not isinstance(ontologies, set) and ontologies is not None:
151
- raise BaseError('Ontologies must be a set of strings or None!')
152
- self._ontologies = ontologies
153
- self._selfjoin = selfjoin
154
- self._status = status
155
- self._logo = logo
156
-
157
- def __str__(self):
158
- tmpstr = self._id + "\n " + self._shortcode + "\n " + self._shortname
159
- return tmpstr
160
-
161
- #
162
- # Here follows a list of getters/setters
163
- #
164
- @property
165
- def id(self) -> Optional[str]:
166
- return self._id
167
-
168
- @id.setter
169
- def id(self, value: str) -> None:
170
- raise BaseError('Project id cannot be modified!')
171
-
172
- @property
173
- def shortcode(self) -> Optional[str]:
174
- return self._shortcode
175
-
176
- @shortcode.setter
177
- def shortcode(self, value: str) -> None:
178
- raise BaseError('Shortcode id cannot be modified!')
179
-
180
- @property
181
- def shortname(self) -> Optional[str]:
182
- return self._shortname
183
-
184
- @shortname.setter
185
- def shortname(self, value: str) -> None:
186
- if self._shortname != str(value):
187
- self._shortname = str(value)
188
- self._changed.add('shortname')
189
-
190
- @property
191
- def longname(self) -> Optional[str]:
192
- return self._longname
193
-
194
- @longname.setter
195
- def longname(self, value: str) -> None:
196
- if self._longname != str(value):
197
- self._longname = str(value)
198
- self._changed.add('longname')
199
-
200
- @property
201
- def description(self) -> Optional[LangString]:
202
- return self._description
203
-
204
- @description.setter
205
- def description(self, value: Optional[LangString]) -> None:
206
- self._description = LangString(value)
207
- self._changed.add('description')
208
-
209
- def addDescription(self, lang: Union[Languages, str], value: str) -> None:
210
- """
211
- Add/replace a project description with the given language (executed at next update)
212
-
213
- :param lang: The language the description is in, either a string "EN", "DE", "FR", "IT" or a Language instance
214
- :param value: The text of the description
215
- :return: None
216
- """
217
-
218
- self._description[lang] = value
219
- self._changed.add('description')
220
-
221
- def rmDescription(self, lang: Union[Languages, str]) -> None:
222
- """
223
- Remove a description from a project (executed at next update)
224
-
225
- :param lang: The language the description to be removed is in, either a string "EN", "DE", "FR", "IT" or a Language instance
226
- :return: None
227
- """
228
-
229
- del self._description[lang]
230
- self._changed.add('description')
231
-
232
- @property
233
- def keywords(self) -> Set[str]:
234
- return self._keywords
235
-
236
- @keywords.setter
237
- def keywords(self, value: Union[List[str], Set[str]]):
238
- if isinstance(value, set):
239
- self._keywords = value
240
- self._changed.add('keywords')
241
- elif isinstance(value, list):
242
- self._keywords = set(value)
243
- self._changed.add('keywords')
244
- else:
245
- raise BaseError('Must be a set of strings!')
246
-
247
- def addKeyword(self, value: str):
248
- """
249
- Add a new keyword to the set of keywords. (executed at next update)
250
- May raise a BaseError
251
-
252
- :param value: keyword
253
- :return: None
254
- """
255
-
256
- self._keywords.add(value)
257
- self._changed.add('keywords')
258
-
259
- def rmKeyword(self, value: str):
260
- """
261
- Remove a keyword from the list of keywords (executed at next update)
262
- May raise a BaseError
263
-
264
- :param value: keyword
265
- :return: None
266
- """
267
- try:
268
- self._keywords.remove(value)
269
- except KeyError as ke:
270
- raise BaseError('Keyword "' + value + '" is not in keyword set')
271
- self._changed.add('keywords')
272
-
273
- @property
274
- def ontologies(self) -> Set[str]:
275
- return self._ontologies
276
-
277
- @ontologies.setter
278
- def ontologies(self, value: Set[str]) -> None:
279
- raise BaseError('Cannot add a ontology!')
280
-
281
- @property
282
- def selfjoin(self) -> Optional[bool]:
283
- return self._selfjoin
284
-
285
- @selfjoin.setter
286
- def selfjoin(self, value: bool) -> None:
287
- if self._selfjoin != value:
288
- self._changed.add('selfjoin')
289
- self._selfjoin = value
290
-
291
- @property
292
- def status(self) -> bool:
293
- return self._status
294
-
295
- @status.setter
296
- def status(self, value: bool) -> None:
297
- if self._status != value:
298
- self._status = value
299
- self._changed.add('status')
300
-
301
- @property
302
- def logo(self) -> str:
303
- return self._logo
304
-
305
- @logo.setter
306
- def logo(self, value: str) -> None:
307
- if self._logo != value:
308
- self._logo = value
309
- self._changed.add('logo')
310
-
311
- @classmethod
312
- def fromJsonObj(cls, con: Connection, json_obj: Any) -> Any:
313
- """
314
- Internal method! Should not be used directly!
315
-
316
- This method is used to create a Project instance from the JSON data returned by Knora
317
-
318
- :param con: Connection instance
319
- :param json_obj: JSON data returned by Knora as python3 object
320
- :return: Project instance
321
- """
322
- id = json_obj.get('id')
323
- if id is None:
324
- raise BaseError('Project id is missing')
325
- shortcode = json_obj.get('shortcode')
326
- if shortcode is None:
327
- raise BaseError("Shortcode is missing")
328
- shortname = json_obj.get('shortname')
329
- if shortname is None:
330
- raise BaseError("Shortname is missing")
331
- longname = json_obj.get('longname')
332
- if longname is None:
333
- raise BaseError("Longname is missing")
334
- description = LangString.fromJsonObj(json_obj.get('description'))
335
- keywords = set(json_obj.get('keywords'))
336
- if keywords is None:
337
- raise BaseError("Keywords are missing")
338
- ontologies = set(json_obj.get('ontologies'))
339
- if ontologies is None:
340
- raise BaseError("ontologies are missing")
341
- selfjoin = json_obj.get('selfjoin')
342
- if selfjoin is None:
343
- raise BaseError("Selfjoin is missing")
344
- status = json_obj.get('status')
345
- if status is None:
346
- raise BaseError("Status is missing")
347
- logo = json_obj.get('logo')
348
- return cls(con=con,
349
- id=id,
350
- shortcode=shortcode,
351
- shortname=shortname,
352
- longname=longname,
353
- description=description,
354
- keywords=keywords,
355
- ontologies=ontologies,
356
- selfjoin=selfjoin,
357
- status=status,
358
- logo=logo)
359
-
360
- def toJsonObj(self, action: Actions) -> Any:
361
- """
362
- Internal method! Should not be used directly!
363
-
364
- Creates a JSON-object from the Project instance that can be used to call Knora
365
-
366
- :param action: Action the object is used for (Action.CREATE or Action.UPDATE)
367
- :return: JSON-object
368
- """
369
-
370
- tmp = {}
371
- if action == Actions.Create:
372
- if self._shortcode is None:
373
- raise BaseError("There must be a valid project shortcode!")
374
- tmp['shortcode'] = self._shortcode
375
- if self._shortname is None:
376
- raise BaseError("There must be a valid project shortname!")
377
- tmp['shortname'] = self._shortname
378
- if self._longname is None:
379
- raise BaseError("There must be a valid project longname!")
380
- tmp['longname'] = self._longname
381
- if self._description.isEmpty():
382
- raise BaseError("There must be a valid project description!")
383
- tmp['description'] = self._description.toJsonObj()
384
- if self._keywords is not None and len(self._keywords) > 0:
385
- tmp['keywords'] = self._keywords
386
- if self._selfjoin is None:
387
- raise BaseError("selfjoin must be defined (True or False!")
388
- tmp['selfjoin'] = self._selfjoin
389
- if self._status is None:
390
- raise BaseError("status must be defined (True or False!")
391
- tmp['status'] = self._status
392
- elif action == Actions.Update:
393
- if self._shortcode is not None and 'shortcode' in self._changed:
394
- tmp['shortcode'] = self._shortcode
395
- if self._shortname is not None and 'shortname' in self._changed:
396
- tmp['shortname'] = self._shortname
397
- if self._longname is not None and 'longname' in self._changed:
398
- tmp['longname'] = self._longname
399
- if not self._description.isEmpty() and 'description' in self._changed:
400
- tmp['description'] = self._description.toJsonObj()
401
- if len(self._keywords) > 0 and 'keywords' in self._changed:
402
- tmp['keywords'] = self._keywords
403
- if self._selfjoin is not None and 'selfjoin' in self._changed:
404
- tmp['selfjoin'] = self._selfjoin
405
- if self._status is not None and 'status' in self._changed:
406
- tmp['status'] = self._status
407
- return tmp
408
-
409
- def createDefinitionFileObj(self):
410
- return {
411
- "shortcode": self._shortcode,
412
- "shortname": self._shortname,
413
- "longname": self._longname,
414
- "descriptions": self._description.createDefinitionFileObj(),
415
- "keywords": [kw for kw in self._keywords]
416
- }
417
-
418
- def create(self) -> 'Project':
419
- """
420
- Create a new project in Knora
421
-
422
- :return: JSON-object from Knora
423
- """
424
-
425
- jsonobj = self.toJsonObj(Actions.Create)
426
- jsondata = json.dumps(jsonobj, cls=SetEncoder)
427
- result = self._con.post('/admin/projects', jsondata)
428
- return Project.fromJsonObj(self._con, result['project'])
429
-
430
- def read(self) -> 'Project':
431
- """
432
- Read a project from Knora
433
-
434
- :return: JSON-object from Knora
435
- """
436
- result = None
437
- if self._id is not None:
438
- result = self._con.get('/admin/projects/iri/' + quote_plus(self._id))
439
- elif self._shortcode is not None:
440
- result = self._con.get('/admin/projects/shortcode/' + quote_plus(self._shortcode))
441
- elif self._shortname is not None:
442
- result = self._con.get('/admin/projects/shortname/' + quote_plus(self._shortname))
443
- if result is not None:
444
- return Project.fromJsonObj(self._con, result['project'])
445
- else:
446
- return None # Todo: throw exception
447
-
448
- def update(self) -> Union['Project', None]:
449
- """
450
- Udate the project info in Knora with the modified data in this project instance
451
-
452
- :return: JSON-object from Knora refecting the update
453
- """
454
-
455
- jsonobj = self.toJsonObj(Actions.Update)
456
- if jsonobj:
457
- jsondata = json.dumps(jsonobj, cls=SetEncoder)
458
- result = self._con.put('/admin/projects/iri/' + quote_plus(self.id), jsondata)
459
- return Project.fromJsonObj(self._con, result['project'])
460
- else:
461
- return None
462
-
463
- def delete(self) -> 'Project':
464
- """
465
- Delete the given Knora project
466
-
467
- :return: Knora response
468
- """
469
-
470
- result = self._con.delete('/admin/projects/iri/' + quote_plus(self._id))
471
- return Project.fromJsonObj(self._con, result['project'])
472
-
473
- def set_default_permissions(self, group_id: str) -> None:
474
- permobj = {
475
- "forGroup": "http://www.knora.org/ontology/knora-admin#ProjectMember",
476
- "forProject": self._id,
477
- "hasPermissions": [
478
- {
479
- "additionalInformation": None,
480
- "name": "ProjectResourceCreateAllPermission",
481
- "permissionCode": None
482
- }
483
- ]
484
- }
485
- jsondata = json.dumps(permobj, indent=4)
486
- print(jsondata)
487
- result = self._con.post("/admin/permissions/ap", jsondata)
488
- pprint(result)
489
-
490
- return
491
- permobj = {
492
- "forGroup": group_id,
493
- "forProject": self._id,
494
- "forProperty": None,
495
- "forResourceClass": None,
496
- "hasPermissions": [
497
- {
498
- "additionalInformation": "http://www.knora.org/ontology/knora-admin#ProjectMember",
499
- "name": "D",
500
- "permissionCode": 7
501
- }
502
- ]
503
- }
504
- jsondata = json.dumps(permobj)
505
- result = self._con.post("/admin/permissions/ap", jsondata)
506
- pprint(result)
507
-
508
- @staticmethod
509
- def getAllProjects(con: Connection) -> List['Project']:
510
- """
511
- Get all existing projects in Knora
512
-
513
- :param con: Connection instance
514
- :return:
515
- """
516
- result = con.get('/admin/projects')
517
- if 'projects' not in result:
518
- raise BaseError("Request got no projects!")
519
- return list(map(lambda a: Project.fromJsonObj(con, a), result['projects']))
520
-
521
- def print(self):
522
- """
523
- print info to stdout
524
-
525
- :return: None
526
- """
527
-
528
- print('Project Info:')
529
- print(' Id: {}'.format(self._id))
530
- print(' Shortcode: {}'.format(self._shortcode))
531
- print(' Shortname: {}'.format(self._shortname))
532
- print(' Longname: {}'.format(self._longname))
533
- if self._description is not None:
534
- print(' Description:')
535
- for descr in self._description.items():
536
- print(' {}: {}'.format(descr[0], descr[1]))
537
- else:
538
- print(' Description: None')
539
- if self._keywords is not None:
540
- print(' Keywords: {}'.format(' '.join(self._keywords)))
541
- else:
542
- print(' Keywords: None')
543
- if self._ontologies is not None:
544
- print(' Ontologies: {}'.format(' '.join(self._ontologies)))
545
- else:
546
- print(' Ontologies: None')
547
- print(' Selfjoin: {}'.format(self._selfjoin))
548
- print(' Status: {}'.format(self._status))
549
-
550
- if __name__ == '__main__':
551
- con = Connection('http://0.0.0.0:3333')
552
- con.login('root@example.com', 'test')
553
-
554
- projects = Project.getAllProjects(con)
555
-
556
- for project in projects:
557
- project.print()
558
-
559
- new_project = Project(con=con,
560
- shortcode='F11F',
561
- shortname='mytest3',
562
- longname='A Test beloning to me',
563
- description=LangString({Languages.EN: 'My Tests description'}),
564
- keywords={'AAA', 'BBB'},
565
- selfjoin=False,
566
- status=True).create()
567
-
568
- new_project.print()
569
-
570
- new_project.longname = 'A long name fore a short project'
571
- new_project.status = False
572
- new_project.description = LangString({Languages.DE: 'Beschreibung meines Tests'})
573
- new_project.add_keyword('CCC')
574
- new_project = new_project.update()
575
- new_project.print()
576
-
577
- new_project = new_project.delete()
578
-
579
- print('**************************************************************')
580
- projects = Project.getAllProjects(con)
581
-
582
- for project in projects:
583
- project.print()