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,505 +0,0 @@
1
- import json
2
- import re
3
-
4
- from pystrict import strict
5
- from typing import List, Set, Dict, Tuple, Optional, Any, Union
6
- from urllib.parse import quote_plus
7
-
8
- from .helpers import Actions, BaseError, Context, Cardinality, LastModificationDate, WithId
9
- from .connection import Connection
10
- from .model import Model
11
- from .langstring import Languages, LangStringParam, LangString
12
- from .listnode import ListNode
13
-
14
- class SetEncoder(json.JSONEncoder):
15
- def default(self, obj):
16
- if isinstance(obj, set):
17
- return list(obj)
18
- return json.JSONEncoder.default(self, obj)
19
-
20
-
21
- @strict
22
- class PropertyClass(Model):
23
- _context: Context
24
- _id: str
25
- _name: str
26
- _ontology_id: str
27
- _superproperties: List[str]
28
- _object: str
29
- _subject: str
30
- _gui_element: str
31
- _gui_attributes: Dict[str, str]
32
- _label: LangString
33
- _comment: LangString
34
- _editable: bool
35
- _linkvalue: bool
36
-
37
- def __init__(self,
38
- con: Connection,
39
- context: Context,
40
- id: Optional[str] = None,
41
- name: Optional[str] = None,
42
- ontology_id: Optional[str] = None,
43
- superproperties: Optional[List[Union['PropertyClass', str]]] = None,
44
- object: Optional[str] = None,
45
- subject: Optional[str] = None,
46
- gui_element: Optional[str] = None,
47
- gui_attributes: Optional[Dict[str, str]] = None,
48
- label: Optional[Union[LangString, str]] = None,
49
- comment: Optional[Union[LangString, str]] = None,
50
- editable: Optional[bool] = None,
51
- linkvalue: Optional[bool] = None):
52
- super().__init__(con)
53
- if not isinstance(context, Context):
54
- raise BaseError('"context"-parameter must be an instance of Context')
55
- self._context = context
56
- self._id = id
57
- self._name = name
58
- self._ontology_id = ontology_id
59
- if isinstance(superproperties, PropertyClass):
60
- self._superproperties = list(map(lambda a: a.id, superproperties))
61
- else:
62
- self._superproperties = superproperties
63
- self._object = object
64
- self._subject = subject
65
- self._gui_element = gui_element
66
- self._gui_attributes = gui_attributes
67
- #
68
- # process label
69
- #
70
- if label is not None:
71
- if isinstance(label, str):
72
- self._label = LangString(label)
73
- elif isinstance(label, LangString):
74
- self._label = label
75
- else:
76
- raise BaseError('Invalid LangString for label!')
77
- else:
78
- self._label = None
79
- #
80
- # process comment
81
- #
82
- if comment is not None:
83
- if isinstance(comment, str):
84
- self._comment = LangString(comment)
85
- elif isinstance(comment, LangString):
86
- self._comment = comment
87
- else:
88
- raise BaseError('Invalid LangString for comment!')
89
- else:
90
- self._comment = None
91
-
92
- self._editable = editable
93
- self._linkvalue = linkvalue
94
-
95
- #
96
- # Here follows a list of getters/setters
97
- #
98
- @property
99
- def name(self) -> Optional[str]:
100
- return self._name
101
-
102
- @name.setter
103
- def name(self, value: str) -> None:
104
- raise BaseError('"name" cannot be modified!')
105
-
106
- @property
107
- def id(self) -> Optional[str]:
108
- return self._id
109
-
110
- @id.setter
111
- def id(self, value: str) -> None:
112
- raise BaseError('"id" cannot be modified!')
113
-
114
- @property
115
- def ontology_id(self) -> Optional[str]:
116
- return self._ontology_id
117
-
118
- @ontology_id.setter
119
- def ontology_id(self, value: str) -> None:
120
- raise BaseError('"ontology_id" cannot be modified!')
121
-
122
- @property
123
- def superproperties(self) -> Optional[List[str]]:
124
- return self._superproperties
125
-
126
- @superproperties.setter
127
- def superproperties(self, value: str) -> None:
128
- raise BaseError('"superproperties" cannot be modified!')
129
-
130
- @property
131
- def object(self) -> Optional[str]:
132
- return self._object
133
-
134
- @object.setter
135
- def object(self, value: Any):
136
- raise BaseError('"object" cannot be modified!')
137
-
138
- @property
139
- def subject(self) -> Optional[str]:
140
- return self._subject
141
-
142
- @subject.setter
143
- def subject(self, value: Any):
144
- raise BaseError('"subject" cannot be modified!')
145
-
146
- @property
147
- def gui_element(self) -> Optional[str]:
148
- return self._gui_element
149
-
150
- @gui_element.setter
151
- def gui_element(self, value: str) -> None:
152
- self._gui_element = value
153
- self._changed.append('gui_element')
154
-
155
- @property
156
- def gui_attributes(self) -> Optional[Dict[str, str]]:
157
- return self._gui_attributes
158
-
159
- @gui_attributes.setter
160
- def gui_attributes(self, value: List[Dict[str, str]]) -> None:
161
- self._gui_attributes = value
162
- self._changed.append('gui_attributes')
163
-
164
- def addGuiAttribute(self, key: str, value: str) -> None:
165
- self._gui_attributes[key] = value
166
- self._changed.append('gui_attributes')
167
-
168
- def rmGuiAttribute(self, key: str) -> None:
169
- if self._gui_attributes.get(key) is not None:
170
- del self._gui_attributes[key]
171
- self._changed.append('gui_attributes')
172
-
173
- @property
174
- def label(self) -> Optional[LangString]:
175
- return self._label
176
-
177
- @label.setter
178
- def label(self, value: Optional[Union[LangString, str]]) -> None:
179
- if value is None:
180
- self._label.empty() # clear all labels
181
- else:
182
- if isinstance(value, LangString):
183
- self._label = value
184
- elif isinstance(value, str):
185
- self._label = LangString(value)
186
- else:
187
- raise BaseError('Not a valid LangString')
188
- self._changed.add('label')
189
-
190
- def addLabel(self, lang: Union[Languages, str], value: str) -> None:
191
- self._label[lang] = value
192
- self._changed.add('label')
193
-
194
- def rmLabel(self, lang: Union[Languages, str]) -> None:
195
- del self._label[lang]
196
- self._changed.add('label')
197
-
198
- @property
199
- def comment(self) -> Optional[LangString]:
200
- return self._comment
201
-
202
- @comment.setter
203
- def comment(self, value: Optional[LangString]) -> None:
204
- if value is None:
205
- self._comment.empty() # clear all comments!
206
- else:
207
- if isinstance(value, LangString):
208
- self._comment = value
209
- elif isinstance(value, str):
210
- self._comment = LangString(value)
211
- else:
212
- raise BaseError('Not a valid LangString')
213
- self._changed.add('comment')
214
-
215
- def addComment(self, lang: Union[Languages, str], value: str) -> None:
216
- self._comment[lang] = value
217
- self._changed.add('comment')
218
-
219
- def rmComment(self, lang: Union[Languages, str]) -> None:
220
- del self._comment[lang]
221
- self._changed.add('comment')
222
-
223
- @property
224
- def editable(self) -> bool:
225
- return self._editable
226
-
227
- @editable.setter
228
- def editable(self, value: bool) -> None:
229
- raise BaseError('"editable" cannot be modified!')
230
-
231
- @property
232
- def linkvalue(self) -> bool:
233
- return self._linkvalue
234
-
235
- @linkvalue.setter
236
- def linkvalue(self) -> None:
237
- raise BaseError('"linkvalue" cannot be modified!')
238
-
239
- @classmethod
240
- def fromJsonObj(cls, con: Connection, context: Context, json_obj: Any) -> Any:
241
- if isinstance(json_obj, list):
242
- json_obj = json_obj[0] # TODO: Is it possible to have more than one element in the list??
243
- if not isinstance(con, Connection):
244
- raise BaseError('"con"-parameter must be an instance of Connection')
245
- if not isinstance(context, Context):
246
- raise BaseError('"context"-parameter must be an instance of Context')
247
- rdf = context.prefix_from_iri("http://www.w3.org/1999/02/22-rdf-syntax-ns#")
248
- rdfs = context.prefix_from_iri("http://www.w3.org/2000/01/rdf-schema#")
249
- owl = context.prefix_from_iri("http://www.w3.org/2002/07/owl#")
250
- xsd = context.prefix_from_iri("http://www.w3.org/2001/XMLSchema#")
251
- knora_api = context.prefix_from_iri("http://api.knora.org/ontology/knora-api/v2#")
252
- salsah_gui = context.prefix_from_iri("http://api.knora.org/ontology/salsah-gui/v2#")
253
-
254
- if not (json_obj.get(knora_api + ':isResourceProperty')):
255
- raise BaseError("This is not a property!")
256
- if json_obj.get('@id') is None:
257
- raise BaseError('Property class has no "@id"!')
258
- tmp_id = json_obj.get('@id').split(':')
259
- id = context.iri_from_prefix(tmp_id[0]) + '#' + tmp_id[1]
260
- ontology_id = tmp_id[0]
261
- name = tmp_id[1]
262
- superproperties_obj = json_obj.get(rdfs + ':subPropertyOf')
263
- superproperties: List[Union[None, str]]
264
- if not isinstance(superproperties_obj, list):
265
- superproperties_obj = [superproperties_obj] # make a list out of it
266
- if superproperties_obj is not None:
267
- superprops: List[Any] = list(filter(lambda a: a.get('@id') is not None, superproperties_obj))
268
- superproperties = list(map(lambda a: a['@id'], superprops))
269
- else:
270
- superproperties = None
271
- object = WithId(json_obj.get(knora_api + ':objectType')).str()
272
- subject = WithId(json_obj.get(knora_api + ':subjectType')).str()
273
- label = LangString.fromJsonLdObj(json_obj.get(rdfs + ':label'))
274
- comment = LangString.fromJsonLdObj(json_obj.get(rdfs + ':comment'))
275
- gui_element = None
276
- if json_obj.get(salsah_gui + ':guiElement') is not None:
277
- gui_element = WithId(json_obj.get(salsah_gui + ':guiElement')).str()
278
- gui_attributes_list = json_obj.get(salsah_gui + ':guiAttribute')
279
- gui_attributes: Union[None, Dict[str, str]] = None
280
- if gui_attributes_list is not None:
281
- gui_attributes = {}
282
- if not isinstance(gui_attributes_list, list):
283
- gui_attributes_list = [gui_attributes_list]
284
- for ga in gui_attributes_list:
285
- tmp = ga.split('=')
286
- if len(tmp) == 1:
287
- gui_attributes[tmp[0]] = ''
288
- else:
289
- gui_attributes[tmp[0]] = tmp[1]
290
-
291
- editable = json_obj.get(knora_api + ':isEditable')
292
- linkvalue = json_obj.get(knora_api + ':isLinkProperty')
293
- return cls(con=con,
294
- context=context,
295
- id=id,
296
- name=name,
297
- ontology_id=ontology_id,
298
- superproperties=superproperties,
299
- object=object,
300
- subject=subject,
301
- gui_element=gui_element,
302
- gui_attributes=gui_attributes,
303
- label=label,
304
- comment=comment,
305
- editable=editable,
306
- linkvalue=linkvalue)
307
-
308
- def toJsonObj(self, lastModificationDate: LastModificationDate, action: Actions, what: Optional[str] = None) -> Any:
309
-
310
- def resolve_propref(resref: str):
311
- tmp = resref.split(':')
312
- if len(tmp) > 1:
313
- if tmp[0]:
314
- return {"@id": resref} # fully qualified name in the form "prefix:name"
315
- else:
316
- return {"@id": self._context.prefix_from_iri(self._ontology_id) + ':' + tmp[1]} # ":name" in current ontology
317
- else:
318
- return {"@id": "knora-api:" + resref} # no ":", must be from knora-api!
319
-
320
- tmp = {}
321
- exp = re.compile('^http.*') # It is already a fully IRI
322
- if exp.match(self._ontology_id):
323
- propid = self._context.prefix_from_iri(self._ontology_id) + ":" + self._name
324
- ontid = self._ontology_id
325
- else:
326
- propid = self._ontology_id + ":" + self._name
327
- ontid = self._context.iri_from_prefix(self._ontology_id)
328
- if action == Actions.Create:
329
- if self._name is None:
330
- raise BaseError("There must be a valid property class name!")
331
- if self._ontology_id is None:
332
- raise BaseError("There must be a valid ontology_id given!")
333
- if self._superproperties is None:
334
- superproperties = [{"@id": "knora-api:hasValue"}]
335
- else:
336
- superproperties = list(map(resolve_propref, self._superproperties))
337
-
338
- tmp = {
339
- "@id": ontid, # self._ontology_id,
340
- "@type": "owl:Ontology",
341
- "knora-api:lastModificationDate": lastModificationDate.toJsonObj(),
342
- "@graph": [{
343
- "@id": propid,
344
- "@type": "owl:ObjectProperty",
345
- "rdfs:label": self._label.toJsonLdObj(),
346
- "rdfs:subPropertyOf": superproperties
347
- }],
348
- "@context": self._context.toJsonObj()
349
- }
350
- if self._comment is not None:
351
- if not self._comment.isEmpty():
352
- tmp['@graph'][0]["rdfs:comment"] = self._comment.toJsonLdObj()
353
- if self._subject is not None:
354
- tmp['@graph'][0]["knora-api:subjectType"] = resolve_propref(self._subject)
355
- if self._object is not None:
356
- tmp['@graph'][0]["knora-api:objectType"] = resolve_propref(self._object)
357
- if self._gui_element is not None:
358
- tmp['@graph'][0]["salsah-gui:guiElement"] = {
359
- "@id": self._gui_element
360
- }
361
- if self._gui_attributes:
362
- ga = list(map(lambda x: x[0] + '=' + str(x[1]), self._gui_attributes.items()))
363
- tmp['@graph'][0]["salsah-gui:guiAttribute"] = ga
364
- elif action == Actions.Update:
365
- tmp = {
366
- "@id": ontid, # self._ontology_id,
367
- "@type": "owl:Ontology",
368
- "knora-api:lastModificationDate": lastModificationDate.toJsonObj(),
369
- "@graph": [{
370
- "@id": propid,
371
- "@type": "owl:ObjectProperty",
372
- }],
373
- "@context": self._context.toJsonObj(),
374
- }
375
- if what == 'label':
376
- if not self._label.isEmpty() and 'label' in self._changed:
377
- tmp['@graph'][0]['rdfs:label'] = self._label.toJsonLdObj()
378
- if what == 'comment':
379
- if not self._comment.isEmpty() and 'comment' in self._changed:
380
- tmp['@graph'][0]['rdfs:comment'] = self._comment.toJsonLdObj()
381
-
382
- return tmp
383
-
384
- def create(self, last_modification_date: LastModificationDate) -> Tuple[LastModificationDate, 'PropertyClass']:
385
- jsonobj = self.toJsonObj(last_modification_date, Actions.Create)
386
- jsondata = json.dumps(jsonobj, cls=SetEncoder, indent=2)
387
- result = self._con.post('/v2/ontologies/properties', jsondata)
388
- last_modification_date = LastModificationDate(result['knora-api:lastModificationDate'])
389
- return last_modification_date, PropertyClass.fromJsonObj(self._con, self._context, result['@graph'])
390
-
391
- def update(self, last_modification_date: LastModificationDate) -> Tuple[LastModificationDate, 'ResourceClass']:
392
- #
393
- # Note: Knora is able to change only one thing per call, either label or comment!
394
- #
395
- result = None
396
- something_changed = False
397
- if 'label' in self._changed:
398
- jsonobj = self.toJsonObj(last_modification_date, Actions.Update, 'label')
399
- jsondata = json.dumps(jsonobj, cls=SetEncoder, indent=4)
400
- result = self._con.put('/v2/ontologies/properties', jsondata)
401
- last_modification_date = LastModificationDate(result['knora-api:lastModificationDate'])
402
- something_changed = True
403
- if 'comment' in self._changed:
404
- jsonobj = self.toJsonObj(last_modification_date, Actions.Update, 'comment')
405
- jsondata = json.dumps(jsonobj, cls=SetEncoder, indent=4)
406
- result = self._con.put('/v2/ontologies/properties', jsondata)
407
- last_modification_date = LastModificationDate(result['knora-api:lastModificationDate'])
408
- something_changed = True
409
- if something_changed:
410
- return last_modification_date, PropertyClass.fromJsonObj(self._con, self._context, result['@graph'])
411
- else:
412
- return last_modification_date, self
413
-
414
- def delete(self, last_modification_date: LastModificationDate) -> LastModificationDate:
415
- result = self._con.delete('/v2/ontologies/properties/' + quote_plus(self._id) + '?lastModificationDate=' + str(last_modification_date))
416
- return LastModificationDate(result['knora-api:lastModificationDate'])
417
-
418
- def createDefinitionFileObj(self, context: Context, shortname: str):
419
- """
420
- Create an object that jsonfied can be used as input to "create_onto"
421
-
422
- :param context: Context of the ontology
423
- :param shortname: Shortname of the ontology
424
- :return: Python object to be jsonfied
425
- """
426
- property = {
427
- "name": self._name
428
- }
429
- if self._object is not None:
430
- property["name"] = self._name
431
- if self._superproperties is not None:
432
- superprops = []
433
- for sc in self._superproperties:
434
- superprops.append(context.reduce_iri(sc, shortname))
435
- property["super"] = superprops
436
- if self._object is not None:
437
- property["object"] = context.reduce_iri(self._object, shortname)
438
- if self._label is not None:
439
- property["labels"] = self._label.createDefinitionFileObj()
440
- if self._gui_element is not None:
441
- property["gui_element"] = context.reduce_iri(self._gui_element, shortname)
442
- if self._gui_attributes:
443
- gui_elements = {}
444
- for (attname, attvalue) in self._gui_attributes.items():
445
- if attname == "size":
446
- gui_elements[attname] = int(attvalue)
447
- elif attname == "maxsize":
448
- gui_elements[attname] = int(attvalue)
449
- elif attname == "hlist":
450
- iri = attvalue[1:-1]
451
- rootnode = ListNode(con=self._con, id=iri).read()
452
- gui_elements[attname] = rootnode.name
453
- elif attname == "numprops":
454
- gui_elements[attname] = int(attvalue)
455
- elif attname == "ncolors":
456
- gui_elements[attname] = int(attvalue)
457
- elif attname == "cols":
458
- gui_elements[attname] = int(attvalue)
459
- elif attname == "rows":
460
- gui_elements[attname] = int(attvalue)
461
- elif attname == "width":
462
- gui_elements[attname] = str(attvalue)
463
- elif attname == "wrap":
464
- gui_elements[attname] = str(attvalue)
465
- elif attname == "max":
466
- gui_elements[attname] = float(attvalue)
467
- elif attname == "min":
468
- gui_elements[attname] = float(attvalue)
469
- else:
470
- gui_elements[attname] = str(attvalue)
471
- property["gui_attributes"] = gui_elements
472
- return property
473
-
474
- def print(self, offset: int = 0):
475
- blank = ' '
476
- print(f'{blank:>{offset}}Property Class Info')
477
- print(f'{blank:>{offset+2}}Name: {self._name}')
478
- print(f'{blank:>{offset+2}}Ontology prefix: {self._ontology_id}')
479
- print(f'{blank:>{offset+2}}Superproperties:')
480
- if self._superproperties is not None:
481
- for sc in self._superproperties:
482
- print(f'{blank:>{offset + 4}}{sc}')
483
- if self._label is not None:
484
- print(f'{blank:>{offset + 2}}Labels:')
485
- self._label.print(offset + 4)
486
- if self._subject is not None:
487
- print(f'{blank:>{offset + 4}}Subject: {self._subject}')
488
- if self._object is not None:
489
- print(f'{blank:>{offset + 4}}Object: {self._object}')
490
- if self._gui_element is not None:
491
- print(f'{blank:>{offset + 4}}Guielement: {self._gui_element}')
492
- if self._gui_attributes is not None:
493
- print(f'{blank:>{offset + 4}}Gui Attributes:')
494
- if self._gui_attributes is not None:
495
- for (attname, attvalue) in self._gui_attributes.items():
496
- print(f'{blank:>{offset + 6}}Attribute: {attname} Value: {attvalue}')
497
- if self._comment is not None:
498
- print(f'{blank:>{offset + 2}}Comments:')
499
- self._comment.print(offset + 4)
500
- if self._editable is not None:
501
- print(f'{blank:>{offset + 4}}Editable: {self._editable}')
502
- if self._linkvalue is not None:
503
- print(f'{blank:>{offset + 4}}Editable: {self._linkvalue}')
504
-
505
-