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,451 +0,0 @@
1
- import os
2
- from typing import List, Set, Dict, Tuple, Optional
3
- import json
4
- from jsonschema import validate
5
-
6
- from ..models.helpers import Actions, BaseError, Context, Cardinality
7
- from ..models.langstring import Languages, LangStringParam, LangString
8
- from ..models.connection import Connection
9
- from ..models.project import Project
10
- from ..models.listnode import ListNode
11
- from ..models.group import Group
12
- from ..models.user import User
13
- from ..models.ontology import Ontology
14
- from ..models.propertyclass import PropertyClass
15
- from ..models.resourceclass import ResourceClass
16
-
17
- from .onto_commons import list_creator
18
-
19
-
20
- def create_ontology(input_file: str,
21
- lists_file: str,
22
- server: str,
23
- user: str,
24
- password: str,
25
- verbose: bool,
26
- dump: bool) -> bool:
27
- current_dir = os.path.dirname(os.path.realpath(__file__))
28
-
29
- # let's read the schema for the data model definition
30
- with open(os.path.join(current_dir, 'knora-schema.json')) as s:
31
- schema = json.load(s)
32
-
33
- # read the data model definition
34
- with open(input_file) as f:
35
- datamodel = json.load(f)
36
-
37
- # validate the data model definition in order to be sure that it is correct
38
- validate(datamodel, schema)
39
- if verbose:
40
- print("Data model is syntactically correct and passed validation!")
41
-
42
- #
43
- # Connect to the DaSCH Service Platform API
44
- #
45
- con = Connection(server)
46
- con.login(user, password)
47
- if dump:
48
- con.start_logging()
49
-
50
- # --------------------------------------------------------------------------
51
- # let's read the prefixes of external ontologies that may be used
52
- #
53
- context = Context(datamodel["prefixes"])
54
-
55
-
56
- # --------------------------------------------------------------------------
57
- # Let's create the project...
58
- #
59
- project = None
60
- try:
61
- # we try to read the project to see if it's existing....
62
- project = Project(
63
- con=con,
64
- shortcode=datamodel["project"]["shortcode"],
65
- ).read()
66
- #
67
- # we got it, update the project data if necessary...
68
- #
69
- if project.shortname != datamodel["project"]["shortname"]:
70
- project.shortname = datamodel["project"]["shortname"]
71
- if project.longname != datamodel["project"]["longname"]:
72
- project.longname == datamodel["project"]["longname"]
73
- project.description = datamodel["project"].get("descriptions")
74
- project.keywords = set(datamodel["project"].get("keywords"))
75
- nproject = project.update()
76
- if nproject is not None:
77
- project = nproject
78
- if verbose:
79
- print("Modified project:")
80
- project.print()
81
- except:
82
- #
83
- # The project doesn't exist yet – let's create it
84
- #
85
- try:
86
- project = Project(
87
- con=con,
88
- shortcode=datamodel["project"]["shortcode"],
89
- shortname=datamodel["project"]["shortname"],
90
- longname=datamodel["project"]["longname"],
91
- description=LangString(datamodel["project"].get("descriptions")),
92
- keywords=set(datamodel["project"].get("keywords")),
93
- selfjoin=False,
94
- status=True
95
- ).create()
96
- except BaseError as err:
97
- print("Creating project failed: " + err.message)
98
- return False
99
- if verbose:
100
- print("Created project:")
101
- project.print()
102
- assert project is not None
103
-
104
- # --------------------------------------------------------------------------
105
- # now let's create the lists
106
- #
107
- if verbose:
108
- print("Creating lists...")
109
- lists = datamodel["project"].get('lists')
110
- listrootnodes = {}
111
- if lists is not None:
112
- for rootnode in lists:
113
- if verbose is not None:
114
- print(" Creating list:" + rootnode['name'])
115
- root_list_node = ListNode(
116
- con=con,
117
- project=project,
118
- label=rootnode['labels'],
119
- comment=rootnode.get('comments'),
120
- name=rootnode['name']
121
- ).create()
122
- listnodes = list_creator(con, project, root_list_node, rootnode['nodes'])
123
- listrootnodes[rootnode['name']] = {
124
- "id": root_list_node.id,
125
- "nodes": listnodes
126
- }
127
-
128
- with open('lists.json', 'w', encoding="utf-8") as fp:
129
- json.dump(listrootnodes, fp, indent=3, sort_keys=True)
130
- print("The definitions of the node-id's can be found in \"{}\"!".format('lists.json'))
131
-
132
- # --------------------------------------------------------------------------
133
- # now let's add the groups (if there are groups defined...)
134
- #
135
- if verbose:
136
- print("Adding groups...")
137
-
138
- new_groups = {}
139
- groups = datamodel["project"].get('groups')
140
- if groups is not None:
141
- for group in groups:
142
- try:
143
- new_group = Group(con=con,
144
- name=group["name"],
145
- description=group["description"],
146
- project=project,
147
- status=group["status"] if group.get("status") is not None else True,
148
- selfjoin=group["selfjoin"] if group.get("selfjoin") is not None else False).create()
149
- except BaseError as err:
150
- print("Creating group failed: " + err.message)
151
- return False
152
- new_groups[new_group.name] = new_group
153
- if verbose:
154
- print("Groups:")
155
- new_group.print()
156
- #project.set_default_permissions(new_group.id)
157
- # --------------------------------------------------------------------------
158
- # now let's add the users (if there are users defined...)
159
- #
160
- if verbose:
161
- print("Adding users...")
162
- all_groups: List[Group] = []
163
- all_projects: List[Project] = []
164
- users = datamodel["project"].get('users')
165
- if users is not None:
166
- for user in users:
167
- sysadmin = False
168
- group_ids: Set[str] = set()
169
- for groupname in user["groups"]:
170
- #
171
- # First we determine the groups the user is in because we can do this in one call
172
- # groupname has the form [proj_shortname]:groupname|"SystemAdmin"
173
- # (projectname omitted = current project)
174
- #
175
- tmp = groupname.split(':')
176
- if len(tmp) > 1:
177
- group = None
178
- if tmp[0] and tmp[0] != '':
179
- # we have 'proj_shortname:groupname
180
- if not all_groups:
181
- all_groups = Group.getAllGroups(con)
182
- tmp_group = list(filter(lambda g: g.project.shortname == tmp[0] and g.name == tmp[1], all_groups))
183
- assert len(tmp_group) == 1
184
- group = tmp_group[0]
185
- else:
186
- # we have ':groupname' and add to current project
187
- group = new_groups.get(tmp[1])
188
- assert group is not None
189
- group_ids.add(group.id)
190
- else:
191
- if tmp[0] == "SystemAdmin":
192
- sysadmin = True
193
-
194
- project_infos: Dict[str, bool] = {}
195
- for projectname in user["projects"]:
196
- #
197
- # now we determine the project memberships of the user
198
- # projectname has the form [projectname]:"member"|"admin" (projectname omitted = current project)
199
- #
200
- tmp = projectname.split(':')
201
- assert len(tmp) == 2
202
- if tmp[0]:
203
- # we have 'proj_shortname:"member"|"admin"'
204
- if not all_projects:
205
- all_projects = project.getAllProjects(con)
206
- tmp_project = list(filter(lambda g: g.shortname == tmp[0], all_projects))
207
- assert len(tmp_project) == 1
208
- in_project = tmp_project[0]
209
- else:
210
- # we have ':"member"|"admin"'
211
- in_project = project
212
- if tmp[1] == "admin":
213
- project_infos[in_project.id] = True
214
- else:
215
- project_infos[in_project.id] = False
216
- user_existing = False;
217
- tmp_user = None
218
- try:
219
- tmp_user = User(con, username=user["username"]).read()
220
- except BaseError as err:
221
- pass
222
- if tmp_user is None:
223
- try:
224
- tmp_user = User(con, email=user["email"]).read()
225
- except BaseError as err:
226
- pass
227
- if tmp_user:
228
- #
229
- # The user is already in the database – let's update its settings
230
- #
231
- if tmp_user.username != user["username"]:
232
- tmp_user.username = user["username"]
233
- if tmp_user.email != user["email"]:
234
- tmp_user.email = user["email"]
235
- if tmp_user.givenName != user["givenName"]:
236
- tmp_user.givenName = user["givenName"]
237
- if tmp_user.familyName != user["familyName"]:
238
- tmp_user.familyName = user["familyName"]
239
- if tmp_user.password != user["password"]:
240
- tmp_user.password = user["password"]
241
- if user.get("status") and tmp_user.status != user["status"]:
242
- tmp_user.status = user["status"]
243
- if user.get("lang") and tmp_user.lang != user["lang"]:
244
- tmp_user.lang = user["lang"]
245
- if tmp_user.sysadmin != sysadmin:
246
- tmp_user.sysadmin = sysadmin
247
- try:
248
- tmp_user.update()
249
- except BaseError as err:
250
- tmp_user.print()
251
- print("Updating user failed: " + err.message)
252
- return False
253
- #
254
- # now we update group and project membership
255
- # Note: we do NOT remove any mambership here, we just add!
256
- #
257
- tmp_in_groups = tmp_user.in_groups
258
- add_groups = group_ids - tmp_in_groups
259
- for g in add_groups:
260
- User.addToGroup(g)
261
- rm_groups = tmp_in_groups - group_ids
262
- # we do no remove a user from a group here!
263
- tmp_in_projects = tmp_user.in_projects
264
- for p in project_infos.items():
265
- if tmp_in_projects.get(p[0]) and tmp_in_projects[p[0]] == p[1]:
266
- continue
267
- User.addToProject(p[0], p[1])
268
- else:
269
- #
270
- # The user does not exist yet, let's create a new one
271
- #
272
- try:
273
- new_user = User(
274
- con=con,
275
- username=user["username"],
276
- email=user["email"],
277
- givenName=user["givenName"],
278
- familyName=user["familyName"],
279
- password=user["password"],
280
- status=user["status"] if user.get("status") is not None else True,
281
- lang=user["lang"] if user.get("lang") is not None else "en",
282
- sysadmin=sysadmin,
283
- in_projects=project_infos,
284
- in_groups=group_ids
285
- ).create()
286
- except BaseError as err:
287
- print("Creating user failed: " + err.message)
288
- return False
289
- if verbose:
290
- print("New user:")
291
- new_user.print()
292
-
293
- # --------------------------------------------------------------------------
294
- # now let's create the ontologies
295
- #
296
- ontologies = datamodel["project"]["ontologies"]
297
- for ontology in ontologies:
298
- newontology = Ontology(
299
- con=con,
300
- project=project,
301
- label=ontology["label"],
302
- name=ontology["name"]
303
- ).create()
304
- last_modification_date = newontology.lastModificationDate
305
- if verbose:
306
- print("Created empty ontology:")
307
- newontology.print()
308
-
309
- #
310
- # add prefixes defined in json file...
311
- #
312
- for prefix, iri in context:
313
- if not prefix in newontology.context:
314
- s = iri.iri + ("#" if iri.hashtag else "")
315
- newontology.context.add_context(prefix, s)
316
-
317
- #
318
- # First we create the empty resource classes
319
- #
320
- resclasses = ontology["resources"]
321
- newresclasses: Dict[str, ResourceClass] = {}
322
- for resclass in resclasses:
323
- resname = resclass.get("name")
324
- super_classes = resclass.get("super")
325
- if isinstance(super_classes, str):
326
- super_classes = [super_classes]
327
- reslabel = LangString(resclass.get("labels"))
328
- rescomment = resclass.get("comment")
329
- if rescomment is not None:
330
- rescomment = LangString(rescomment)
331
- try:
332
- last_modification_date, newresclass = ResourceClass(
333
- con=con,
334
- context=newontology.context,
335
- ontology_id=newontology.id,
336
- name=resname,
337
- superclasses=super_classes,
338
- label=reslabel,
339
- comment=rescomment
340
- ).create(last_modification_date)
341
- newontology.lastModificationDate = last_modification_date
342
- except BaseError as err:
343
- print("Creating resource class failed: " + err.message)
344
- exit(105)
345
- newresclasses[newresclass.id] = newresclass
346
- if verbose is not None:
347
- print("New resource class:")
348
- newresclass.print()
349
-
350
- #
351
- # Then we create the property classes
352
- #
353
- propclasses = ontology["properties"]
354
- newpropclasses: Dict[str, ResourceClass] = {}
355
- for propclass in propclasses:
356
- propname = propclass.get("name")
357
- proplabel = LangString(propclass.get("labels"))
358
- #
359
- # get the super-property/ies if defined. Valid forms are:
360
- # - "prefix:superproperty" : fully qualified name of property in another ontology. The prefix has to
361
- # be defined in the prefixes part.
362
- # - "superproperty" : Use of super-property defined in the knora-api ontology
363
- # if omitted, automatically "knora-api:hasValue" is assumed
364
- #
365
- if propclass.get("super") is not None:
366
- super_props = list(map(lambda a: a if ':' in a else "knora-api:" + a, propclass["super"]))
367
- else:
368
- super_props = ["knora-api:hasValue"]
369
- #
370
- # now we get the "object" if defined. Valid forms are:
371
- # - "prefix:object_name" : fully qualified object. The prefix has to be defined in the prefixes part.
372
- # - ":object_name" : The object is defined in the current ontology.
373
- # - "object_name" : The object is defined in "knora-api"
374
- #
375
- if propclass.get("object") is not None:
376
- tmp = propclass["object"].split(':')
377
- if len(tmp) > 1:
378
- if tmp[0]:
379
- object = propclass["object"] # fully qualified name
380
- else:
381
- newontology.print()
382
- object = newontology.name + ':' + tmp[1]
383
- else:
384
- object = "knora-api:" + propclass["object"]
385
- else:
386
- object = None
387
-
388
- if propclass.get("subject") is not None:
389
- subject = propclass["subject"]
390
- else:
391
- subject = None
392
- gui_element = propclass.get("gui_element")
393
- gui_attributes = propclass.get("gui_attributes")
394
- if gui_attributes is not None and gui_attributes.get("hlist") is not None:
395
- gui_attributes['hlist'] = "<" + listrootnodes[gui_attributes['hlist']]["id"] + ">"
396
- propcomment = propclass.get("comment")
397
- if propcomment is not None:
398
- propcomment = LangString(propcomment)
399
- else:
400
- propcomment = "no comment given"
401
- try:
402
- last_modification_date, newpropclass = PropertyClass(
403
- con=con,
404
- context=newontology.context,
405
- label=proplabel,
406
- name=propname,
407
- ontology_id=newontology.id,
408
- superproperties=super_props,
409
- object=object,
410
- subject=subject,
411
- gui_element="salsah-gui:" + gui_element,
412
- gui_attributes=gui_attributes,
413
- comment=propcomment
414
- ).create(last_modification_date)
415
- newontology.lastModificationDate = last_modification_date
416
- except BaseError as err:
417
- print("Creating property class failed: " + err.message)
418
- return False
419
- newpropclasses[newpropclass.id] = newpropclass
420
- if verbose:
421
- print("New property class:")
422
- newpropclass.print()
423
-
424
- #
425
- # Add cardinalities
426
- #
427
- switcher = {
428
- "1": Cardinality.C_1,
429
- "0-1": Cardinality.C_0_1,
430
- "0-n": Cardinality.C_0_n,
431
- "1-n": Cardinality.C_1_n
432
- }
433
- for resclass in resclasses:
434
- for cardinfo in resclass["cardinalities"]:
435
- rc = newresclasses.get(newontology.id + '#' + resclass["name"])
436
- cardinality = switcher[cardinfo["cardinality"]]
437
- tmp = cardinfo["propname"].split(':')
438
- if len(tmp) > 1:
439
- if tmp[0]:
440
- propid = cardinfo["propname"] # fully qualified name
441
- else:
442
- propid = newontology.name + ':' + tmp[1]
443
- else:
444
- propid = "knora-api:" + cardinfo["propname"]
445
- gui_order = cardinfo.get('gui_order')
446
- last_modification_date = rc.addProperty(property_id=propid,
447
- cardinality=cardinality,
448
- gui_order=gui_order,
449
- last_modification_date=last_modification_date)
450
- newontology.lastModificationDate = last_modification_date
451
- return True
@@ -1,58 +0,0 @@
1
- from typing import List, Set, Dict, Tuple, Optional, Any, Union
2
-
3
- import json
4
- import re
5
-
6
- from ..models.connection import Connection
7
- from ..models.project import Project
8
- from ..models.listnode import ListNode
9
- from ..models.ontology import Ontology
10
-
11
-
12
- def get_ontology(projident: str, outfile: str, server: str, user: str, password: str, verbose: bool) -> bool:
13
- con = Connection(server)
14
- # con.login(user, password)
15
- if re.match("^[0-9aAbBcCdDeEfF]{4}$", projident):
16
- project = Project(con=con, shortcode=projident)
17
- elif re.match("^[\\w-]+$", projident):
18
- project = Project(con=con, shortname=projident)
19
- elif re.match("^(http)s?://([\\w\\.\\-~]+:?\\d{,4})(/[\\w\\-~]+)+$", projident):
20
- project = Project(con=con, shortname=projident)
21
- else:
22
- print("Invalid project identification!")
23
- return False
24
-
25
- project = project.read()
26
-
27
- projectobj = project.createDefinitionFileObj()
28
-
29
- #
30
- # now collect the lists
31
- #
32
- listroots = ListNode.getAllLists(con=con, project_iri=project.id)
33
- listobj = []
34
- for listroot in listroots:
35
- complete_list = listroot.getAllNodes()
36
- listobj.append(complete_list.createDefinitionFileObj())
37
- projectobj["lists"] = listobj
38
-
39
- projectobj["ontologies"] = []
40
- prefixes: Dict[str, str] = {}
41
- ontologies = Ontology.getProjectOntologies(con, project.id)
42
- ontology_ids = [x.id for x in ontologies]
43
- for ontology in ontology_ids:
44
- oparts = ontology.split("/")
45
- name = oparts[len(oparts) - 2]
46
- shortcode = oparts[len(oparts) - 3]
47
- ontology = Ontology.getOntologyFromServer(con=con, shortcode=shortcode, name=name)
48
- projectobj["ontologies"].append(ontology.createDefinitionFileObj())
49
- prefixes.update(ontology.context.get_externals_used())
50
-
51
- umbrella = {
52
- "prefixes": prefixes,
53
- "project": projectobj
54
- }
55
-
56
- with open(outfile, 'w', encoding='utf8') as outfile:
57
- json.dump(umbrella, outfile, indent=3, ensure_ascii=False)
58
-
@@ -1,33 +0,0 @@
1
- import os
2
- import json
3
- from jsonschema import validate
4
-
5
-
6
- def validate_list(input_file: str) -> None:
7
- current_dir = os.path.dirname(os.path.realpath(__file__))
8
-
9
- # let's read the schema for the data model definition
10
- with open(os.path.join(current_dir, 'knora-schema-lists.json')) as s:
11
- schema = json.load(s)
12
- # read the data model definition
13
- with open(input_file) as f:
14
- datamodel = json.load(f)
15
-
16
- # validate the data model definition in order to be sure that it is correct
17
- validate(datamodel, schema)
18
- print("Data model is syntactically correct and passed validation!")
19
-
20
-
21
- def validate_ontology(input_file: str) -> None:
22
- current_dir = os.path.dirname(os.path.realpath(__file__))
23
-
24
- with open(os.path.join(current_dir, 'knora-schema.json')) as s:
25
- schema = json.load(s)
26
- # read the data model definition
27
- with open(input_file) as f:
28
- datamodel = json.load(f)
29
-
30
- # validate the data model definition in order to be sure that it is correct
31
- validate(datamodel, schema)
32
- print("Data model is syntactically correct and passed validation!")
33
-