dsp-tools 0.9.13__py3-none-any.whl → 18.3.0.post13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. dsp_tools/__init__.py +5 -0
  2. dsp_tools/cli/args.py +47 -0
  3. dsp_tools/cli/call_action.py +85 -0
  4. dsp_tools/cli/call_action_files_only.py +101 -0
  5. dsp_tools/cli/call_action_with_network.py +207 -0
  6. dsp_tools/cli/create_parsers.py +479 -0
  7. dsp_tools/cli/entry_point.py +322 -0
  8. dsp_tools/cli/utils.py +87 -0
  9. dsp_tools/clients/CLAUDE.md +420 -0
  10. dsp_tools/clients/authentication_client.py +14 -0
  11. dsp_tools/clients/authentication_client_live.py +66 -0
  12. dsp_tools/clients/connection.py +35 -0
  13. dsp_tools/clients/connection_live.py +233 -0
  14. dsp_tools/clients/fuseki_metrics.py +60 -0
  15. dsp_tools/clients/group_user_clients.py +35 -0
  16. dsp_tools/clients/group_user_clients_live.py +181 -0
  17. dsp_tools/clients/legal_info_client.py +23 -0
  18. dsp_tools/clients/legal_info_client_live.py +132 -0
  19. dsp_tools/clients/list_client.py +49 -0
  20. dsp_tools/clients/list_client_live.py +166 -0
  21. dsp_tools/clients/metadata_client.py +24 -0
  22. dsp_tools/clients/metadata_client_live.py +47 -0
  23. dsp_tools/clients/ontology_clients.py +49 -0
  24. dsp_tools/clients/ontology_create_client_live.py +166 -0
  25. dsp_tools/clients/ontology_get_client_live.py +80 -0
  26. dsp_tools/clients/permissions_client.py +68 -0
  27. dsp_tools/clients/project_client.py +16 -0
  28. dsp_tools/clients/project_client_live.py +66 -0
  29. dsp_tools/commands/create/communicate_problems.py +24 -0
  30. dsp_tools/commands/create/create.py +134 -0
  31. dsp_tools/commands/create/create_on_server/cardinalities.py +111 -0
  32. dsp_tools/commands/create/create_on_server/classes.py +99 -0
  33. dsp_tools/commands/create/create_on_server/complete_ontologies.py +116 -0
  34. dsp_tools/commands/create/create_on_server/default_permissions.py +134 -0
  35. dsp_tools/commands/create/create_on_server/group_users.py +165 -0
  36. dsp_tools/commands/create/create_on_server/lists.py +163 -0
  37. dsp_tools/commands/create/create_on_server/mappers.py +12 -0
  38. dsp_tools/commands/create/create_on_server/onto_utils.py +74 -0
  39. dsp_tools/commands/create/create_on_server/ontology.py +52 -0
  40. dsp_tools/commands/create/create_on_server/project.py +68 -0
  41. dsp_tools/commands/create/create_on_server/properties.py +119 -0
  42. dsp_tools/commands/create/exceptions.py +29 -0
  43. dsp_tools/commands/create/lists_only.py +66 -0
  44. dsp_tools/commands/create/models/create_problems.py +87 -0
  45. dsp_tools/commands/create/models/parsed_ontology.py +88 -0
  46. dsp_tools/commands/create/models/parsed_project.py +81 -0
  47. dsp_tools/commands/create/models/rdf_ontology.py +12 -0
  48. dsp_tools/commands/create/models/server_project_info.py +100 -0
  49. dsp_tools/commands/create/parsing/parse_lists.py +45 -0
  50. dsp_tools/commands/create/parsing/parse_ontology.py +243 -0
  51. dsp_tools/commands/create/parsing/parse_project.py +149 -0
  52. dsp_tools/commands/create/parsing/parsing_utils.py +40 -0
  53. dsp_tools/commands/create/project_validate.py +595 -0
  54. dsp_tools/commands/create/serialisation/ontology.py +119 -0
  55. dsp_tools/commands/create/serialisation/project.py +44 -0
  56. dsp_tools/commands/excel2json/CLAUDE.md +101 -0
  57. dsp_tools/commands/excel2json/json_header.py +321 -0
  58. dsp_tools/commands/excel2json/lists/__init__.py +0 -0
  59. dsp_tools/commands/excel2json/lists/compliance_checks.py +292 -0
  60. dsp_tools/commands/excel2json/lists/make_lists.py +247 -0
  61. dsp_tools/commands/excel2json/lists/models/__init__.py +0 -0
  62. dsp_tools/commands/excel2json/lists/models/deserialise.py +30 -0
  63. dsp_tools/commands/excel2json/lists/models/input_error.py +216 -0
  64. dsp_tools/commands/excel2json/lists/models/serialise.py +57 -0
  65. dsp_tools/commands/excel2json/lists/utils.py +81 -0
  66. dsp_tools/commands/excel2json/models/__init__.py +0 -0
  67. dsp_tools/commands/excel2json/models/input_error.py +416 -0
  68. dsp_tools/commands/excel2json/models/json_header.py +175 -0
  69. dsp_tools/commands/excel2json/models/list_node_name.py +16 -0
  70. dsp_tools/commands/excel2json/models/ontology.py +76 -0
  71. dsp_tools/commands/excel2json/old_lists.py +328 -0
  72. dsp_tools/commands/excel2json/project.py +280 -0
  73. dsp_tools/commands/excel2json/properties.py +370 -0
  74. dsp_tools/commands/excel2json/resources.py +336 -0
  75. dsp_tools/commands/excel2json/utils.py +352 -0
  76. dsp_tools/commands/excel2xml/__init__.py +7 -0
  77. dsp_tools/commands/excel2xml/excel2xml_cli.py +523 -0
  78. dsp_tools/commands/excel2xml/excel2xml_lib.py +1953 -0
  79. dsp_tools/commands/excel2xml/propertyelement.py +47 -0
  80. dsp_tools/commands/get/__init__.py +0 -0
  81. dsp_tools/commands/get/get.py +166 -0
  82. dsp_tools/commands/get/get_permissions.py +257 -0
  83. dsp_tools/commands/get/get_permissions_legacy.py +89 -0
  84. dsp_tools/commands/get/legacy_models/__init__.py +0 -0
  85. dsp_tools/commands/get/legacy_models/context.py +318 -0
  86. dsp_tools/commands/get/legacy_models/group.py +241 -0
  87. dsp_tools/commands/get/legacy_models/helpers.py +47 -0
  88. dsp_tools/commands/get/legacy_models/listnode.py +390 -0
  89. dsp_tools/commands/get/legacy_models/model.py +12 -0
  90. dsp_tools/commands/get/legacy_models/ontology.py +324 -0
  91. dsp_tools/commands/get/legacy_models/project.py +366 -0
  92. dsp_tools/commands/get/legacy_models/propertyclass.py +417 -0
  93. dsp_tools/commands/get/legacy_models/resourceclass.py +676 -0
  94. dsp_tools/commands/get/legacy_models/user.py +438 -0
  95. dsp_tools/commands/get/models/__init__.py +0 -0
  96. dsp_tools/commands/get/models/permissions_models.py +10 -0
  97. dsp_tools/commands/id2iri.py +258 -0
  98. dsp_tools/commands/ingest_xmlupload/__init__.py +0 -0
  99. dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +178 -0
  100. dsp_tools/commands/ingest_xmlupload/create_resources/__init__.py +0 -0
  101. dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +69 -0
  102. dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +166 -0
  103. dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +121 -0
  104. dsp_tools/commands/ingest_xmlupload/ingest_files/__init__.py +0 -0
  105. dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +64 -0
  106. dsp_tools/commands/ingest_xmlupload/upload_files/__init__.py +0 -0
  107. dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +20 -0
  108. dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +57 -0
  109. dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +66 -0
  110. dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +67 -0
  111. dsp_tools/commands/resume_xmlupload/__init__.py +0 -0
  112. dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +96 -0
  113. dsp_tools/commands/start_stack.py +428 -0
  114. dsp_tools/commands/update_legal/CLAUDE.md +344 -0
  115. dsp_tools/commands/update_legal/__init__.py +0 -0
  116. dsp_tools/commands/update_legal/core.py +182 -0
  117. dsp_tools/commands/update_legal/csv_operations.py +135 -0
  118. dsp_tools/commands/update_legal/models.py +87 -0
  119. dsp_tools/commands/update_legal/xml_operations.py +247 -0
  120. dsp_tools/commands/validate_data/CLAUDE.md +159 -0
  121. dsp_tools/commands/validate_data/__init__.py +0 -0
  122. dsp_tools/commands/validate_data/constants.py +59 -0
  123. dsp_tools/commands/validate_data/mappers.py +143 -0
  124. dsp_tools/commands/validate_data/models/__init__.py +0 -0
  125. dsp_tools/commands/validate_data/models/api_responses.py +45 -0
  126. dsp_tools/commands/validate_data/models/input_problems.py +119 -0
  127. dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
  128. dsp_tools/commands/validate_data/models/validation.py +106 -0
  129. dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
  130. dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
  131. dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
  132. dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
  133. dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
  134. dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
  135. dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
  136. dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
  137. dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
  138. dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
  139. dsp_tools/commands/validate_data/sparql/cardinality_shacl.py +209 -0
  140. dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
  141. dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
  142. dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
  143. dsp_tools/commands/validate_data/utils.py +59 -0
  144. dsp_tools/commands/validate_data/validate_data.py +283 -0
  145. dsp_tools/commands/validate_data/validation/__init__.py +0 -0
  146. dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
  147. dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
  148. dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
  149. dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
  150. dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
  151. dsp_tools/commands/xmlupload/__init__.py +0 -0
  152. dsp_tools/commands/xmlupload/iri_resolver.py +21 -0
  153. dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
  154. dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
  155. dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
  156. dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
  157. dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
  158. dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
  159. dsp_tools/commands/xmlupload/models/__init__.py +0 -0
  160. dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
  161. dsp_tools/commands/xmlupload/models/formatted_text_value.py +10 -0
  162. dsp_tools/commands/xmlupload/models/ingest.py +143 -0
  163. dsp_tools/commands/xmlupload/models/input_problems.py +58 -0
  164. dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
  165. dsp_tools/commands/xmlupload/models/permission.py +45 -0
  166. dsp_tools/commands/xmlupload/models/permissions_parsed.py +93 -0
  167. dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
  168. dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
  169. dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
  170. dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
  171. dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
  172. dsp_tools/commands/xmlupload/models/upload_clients.py +14 -0
  173. dsp_tools/commands/xmlupload/models/upload_state.py +20 -0
  174. dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
  175. dsp_tools/commands/xmlupload/prepare_xml_input/ark2iri.py +55 -0
  176. dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
  177. dsp_tools/commands/xmlupload/prepare_xml_input/iiif_uri_validator.py +50 -0
  178. dsp_tools/commands/xmlupload/prepare_xml_input/list_client.py +120 -0
  179. dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
  180. dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
  181. dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
  182. dsp_tools/commands/xmlupload/resource_create_client.py +25 -0
  183. dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
  184. dsp_tools/commands/xmlupload/stash/__init__.py +0 -0
  185. dsp_tools/commands/xmlupload/stash/analyse_circular_reference_graph.py +236 -0
  186. dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
  187. dsp_tools/commands/xmlupload/stash/graph_models.py +87 -0
  188. dsp_tools/commands/xmlupload/stash/stash_circular_references.py +68 -0
  189. dsp_tools/commands/xmlupload/stash/stash_models.py +109 -0
  190. dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +106 -0
  191. dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +196 -0
  192. dsp_tools/commands/xmlupload/upload_config.py +76 -0
  193. dsp_tools/commands/xmlupload/write_diagnostic_info.py +27 -0
  194. dsp_tools/commands/xmlupload/xmlupload.py +516 -0
  195. dsp_tools/config/__init__.py +0 -0
  196. dsp_tools/config/logger_config.py +69 -0
  197. dsp_tools/config/warnings_config.py +32 -0
  198. dsp_tools/error/__init__.py +0 -0
  199. dsp_tools/error/custom_warnings.py +39 -0
  200. dsp_tools/error/exceptions.py +204 -0
  201. dsp_tools/error/problems.py +10 -0
  202. dsp_tools/error/xmllib_errors.py +20 -0
  203. dsp_tools/error/xmllib_warnings.py +54 -0
  204. dsp_tools/error/xmllib_warnings_util.py +159 -0
  205. dsp_tools/error/xsd_validation_error_msg.py +19 -0
  206. dsp_tools/legacy_models/__init__.py +0 -0
  207. dsp_tools/legacy_models/datetimestamp.py +81 -0
  208. dsp_tools/legacy_models/langstring.py +253 -0
  209. dsp_tools/legacy_models/projectContext.py +49 -0
  210. dsp_tools/py.typed +0 -0
  211. dsp_tools/resources/schema/data.xsd +648 -0
  212. dsp_tools/resources/schema/lists-only.json +72 -0
  213. dsp_tools/resources/schema/project.json +1258 -0
  214. dsp_tools/resources/schema/properties-only.json +874 -0
  215. dsp_tools/resources/schema/resources-only.json +140 -0
  216. dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
  217. dsp_tools/resources/start-stack/docker-compose.override.yml +11 -0
  218. dsp_tools/resources/start-stack/docker-compose.yml +88 -0
  219. dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
  220. dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
  221. dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
  222. dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
  223. dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
  224. dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
  225. dsp_tools/utils/__init__.py +0 -0
  226. dsp_tools/utils/ansi_colors.py +32 -0
  227. dsp_tools/utils/data_formats/__init__.py +0 -0
  228. dsp_tools/utils/data_formats/date_util.py +166 -0
  229. dsp_tools/utils/data_formats/iri_util.py +30 -0
  230. dsp_tools/utils/data_formats/shared.py +81 -0
  231. dsp_tools/utils/data_formats/uri_util.py +76 -0
  232. dsp_tools/utils/fuseki_bloating.py +63 -0
  233. dsp_tools/utils/json_parsing.py +22 -0
  234. dsp_tools/utils/rdf_constants.py +42 -0
  235. dsp_tools/utils/rdflib_utils.py +10 -0
  236. dsp_tools/utils/replace_id_with_iri.py +66 -0
  237. dsp_tools/utils/request_utils.py +238 -0
  238. dsp_tools/utils/xml_parsing/__init__.py +0 -0
  239. dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
  240. dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
  241. dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
  242. dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
  243. dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
  244. dsp_tools/xmllib/CLAUDE.md +302 -0
  245. dsp_tools/xmllib/__init__.py +49 -0
  246. dsp_tools/xmllib/general_functions.py +877 -0
  247. dsp_tools/xmllib/internal/__init__.py +0 -0
  248. dsp_tools/xmllib/internal/checkers.py +162 -0
  249. dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
  250. dsp_tools/xmllib/internal/constants.py +46 -0
  251. dsp_tools/xmllib/internal/input_converters.py +155 -0
  252. dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
  253. dsp_tools/xmllib/internal/serialise_resource.py +177 -0
  254. dsp_tools/xmllib/internal/serialise_values.py +152 -0
  255. dsp_tools/xmllib/internal/type_aliases.py +11 -0
  256. dsp_tools/xmllib/models/__init__.py +0 -0
  257. dsp_tools/xmllib/models/config_options.py +28 -0
  258. dsp_tools/xmllib/models/date_formats.py +48 -0
  259. dsp_tools/xmllib/models/dsp_base_resources.py +1542 -0
  260. dsp_tools/xmllib/models/internal/__init__.py +0 -0
  261. dsp_tools/xmllib/models/internal/file_values.py +172 -0
  262. dsp_tools/xmllib/models/internal/geometry.py +162 -0
  263. dsp_tools/xmllib/models/internal/migration_metadata.py +55 -0
  264. dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
  265. dsp_tools/xmllib/models/internal/values.py +342 -0
  266. dsp_tools/xmllib/models/licenses/__init__.py +0 -0
  267. dsp_tools/xmllib/models/licenses/other.py +59 -0
  268. dsp_tools/xmllib/models/licenses/recommended.py +107 -0
  269. dsp_tools/xmllib/models/permissions.py +41 -0
  270. dsp_tools/xmllib/models/res.py +1782 -0
  271. dsp_tools/xmllib/models/root.py +348 -0
  272. dsp_tools/xmllib/value_checkers.py +434 -0
  273. dsp_tools/xmllib/value_converters.py +777 -0
  274. dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
  275. dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
  276. dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
  277. dsp_tools-18.3.0.post13.dist-info/entry_points.txt +3 -0
  278. dsp_tools-0.9.13.dist-info/LICENSE +0 -674
  279. dsp_tools-0.9.13.dist-info/METADATA +0 -144
  280. dsp_tools-0.9.13.dist-info/RECORD +0 -71
  281. dsp_tools-0.9.13.dist-info/WHEEL +0 -5
  282. dsp_tools-0.9.13.dist-info/entry_points.txt +0 -3
  283. dsp_tools-0.9.13.dist-info/top_level.txt +0 -1
  284. dsplib/models/connection.py +0 -272
  285. dsplib/models/group.py +0 -296
  286. dsplib/models/helpers.py +0 -505
  287. dsplib/models/langstring.py +0 -277
  288. dsplib/models/listnode.py +0 -578
  289. dsplib/models/model.py +0 -20
  290. dsplib/models/ontology.py +0 -448
  291. dsplib/models/permission.py +0 -112
  292. dsplib/models/project.py +0 -547
  293. dsplib/models/propertyclass.py +0 -505
  294. dsplib/models/resource.py +0 -366
  295. dsplib/models/resourceclass.py +0 -810
  296. dsplib/models/sipi.py +0 -30
  297. dsplib/models/user.py +0 -731
  298. dsplib/models/value.py +0 -1000
  299. dsplib/utils/knora-data-schema.xsd +0 -454
  300. dsplib/utils/knora-schema-lists.json +0 -83
  301. dsplib/utils/knora-schema.json +0 -434
  302. dsplib/utils/onto_commons.py +0 -24
  303. dsplib/utils/onto_create_lists.py +0 -73
  304. dsplib/utils/onto_create_ontology.py +0 -442
  305. dsplib/utils/onto_get.py +0 -58
  306. dsplib/utils/onto_validate.py +0 -33
  307. dsplib/utils/xml_upload.py +0 -539
  308. dsplib/widgets/doublepassword.py +0 -80
  309. knora/MLS-import-libraries.py +0 -84
  310. knora/dsp_tools.py +0 -96
  311. knora/dsplib/models/connection.py +0 -272
  312. knora/dsplib/models/group.py +0 -296
  313. knora/dsplib/models/helpers.py +0 -506
  314. knora/dsplib/models/langstring.py +0 -277
  315. knora/dsplib/models/listnode.py +0 -578
  316. knora/dsplib/models/model.py +0 -20
  317. knora/dsplib/models/ontology.py +0 -448
  318. knora/dsplib/models/permission.py +0 -112
  319. knora/dsplib/models/project.py +0 -583
  320. knora/dsplib/models/propertyclass.py +0 -505
  321. knora/dsplib/models/resource.py +0 -416
  322. knora/dsplib/models/resourceclass.py +0 -811
  323. knora/dsplib/models/sipi.py +0 -35
  324. knora/dsplib/models/user.py +0 -731
  325. knora/dsplib/models/value.py +0 -1000
  326. knora/dsplib/utils/knora-data-schema.xsd +0 -464
  327. knora/dsplib/utils/knora-schema-lists.json +0 -83
  328. knora/dsplib/utils/knora-schema.json +0 -444
  329. knora/dsplib/utils/onto_commons.py +0 -24
  330. knora/dsplib/utils/onto_create_lists.py +0 -73
  331. knora/dsplib/utils/onto_create_ontology.py +0 -451
  332. knora/dsplib/utils/onto_get.py +0 -58
  333. knora/dsplib/utils/onto_validate.py +0 -33
  334. knora/dsplib/utils/xml_upload.py +0 -540
  335. knora/dsplib/widgets/doublepassword.py +0 -80
  336. knora/knora.py +0 -2108
  337. knora/test.py +0 -99
  338. knora/testit.py +0 -76
  339. knora/xml2knora.py +0 -633
  340. {dsplib → dsp_tools/cli}/__init__.py +0 -0
  341. {dsplib/models → dsp_tools/clients}/__init__.py +0 -0
  342. {dsplib/utils → dsp_tools/commands}/__init__.py +0 -0
  343. {dsplib/widgets → dsp_tools/commands/create}/__init__.py +0 -0
  344. {knora → dsp_tools/commands/create/create_on_server}/__init__.py +0 -0
  345. {knora/dsplib → dsp_tools/commands/create/models}/__init__.py +0 -0
  346. {knora/dsplib/models → dsp_tools/commands/create/parsing}/__init__.py +0 -0
  347. {knora/dsplib/utils → dsp_tools/commands/create/serialisation}/__init__.py +0 -0
  348. {knora/dsplib/widgets → dsp_tools/commands/excel2json}/__init__.py +0 -0
dsplib/models/user.py DELETED
@@ -1,731 +0,0 @@
1
- import os
2
- import sys
3
- import json
4
- from pystrict import strict
5
- from typing import List, Set, Dict, Tuple, Optional, Any, Union, NewType
6
- from urllib.parse import quote_plus
7
-
8
- path = os.path.abspath(os.path.dirname(__file__))
9
- (head, tail) = os.path.split(path)
10
- if not head in sys.path:
11
- sys.path.insert(0, head)
12
- if not path in sys.path:
13
- sys.path.insert(0, path)
14
-
15
- from .helpers import Actions, BaseError
16
- from .langstring import Languages
17
- from .connection import Connection
18
- from .model import Model
19
- from .group import Group
20
- from .project import Project
21
-
22
- """
23
- This module implements the handling (CRUD) of Knora users.
24
-
25
- CREATE:
26
- * Instantiate a new object of the class User with all required parameters
27
- * Call the ``create``-method on the instance to create the new user
28
-
29
- READ:
30
- * Instantiate a new objects with ``id``(IRI of user) given
31
- * Call the ``read``-method on the instance
32
- * Access the information that has been ptovided to the instance
33
-
34
- UPDATE:
35
- * You need an instance of an existing User by reading an instance
36
- * Change the attributes by assigning the new values
37
- * Call the ``update```method on the instance
38
-
39
- DELETE
40
- * Instantiate a new objects with ``id``(IRI of user) given, or use any instance that has the id set
41
- * Call the ``delete``-method on the instance
42
-
43
- In addition there is a static methods ``getAllProjects`` which returns a list of all projects
44
- """
45
-
46
- @strict
47
- class User(Model):
48
- """
49
- This class represents a user in Knora.
50
-
51
- Attributes
52
- ----------
53
-
54
- id : str
55
- IRI of the user [readonly, cannot be modified after creation of instance]
56
-
57
- username : str
58
- Unique identifier (not an IRI) of the user [read/write]
59
-
60
- email : str
61
- Email of the user [read/write]
62
-
63
- givenName : str
64
- Given name (firstname) of the user [read/write]
65
-
66
- familyName : str
67
- Family name of user (lastname) [read/write]
68
-
69
- password : str
70
- Password of user [write only]
71
-
72
- lang : Language
73
- Preferred language of the user. For setting can be Language instance or string "EN", "DE", "FR", "IT"
74
-
75
- status : bool
76
- Status of the user, If active, is set to True, otherwise false [read/write]
77
-
78
- sysadmin : bool
79
- True, if user is system administrator [read/write]
80
-
81
- in_groups : Set[str]
82
- Set of group IRI's the user is member of [readonly].
83
- Use ``addToGroup``and ``rmFromGroup`` to modify group membership
84
-
85
- in_projects : Set[str]
86
- Set of project IRI's the user belongs to
87
- Use ``addToproject``and ``rmFromproject`` to modify project membership
88
-
89
-
90
- Methods
91
- -------
92
-
93
- create : Knora user information object
94
- Creates a new user and returns the information about this user as it is in Knora
95
-
96
- read : Knora user information object
97
- Read user data
98
-
99
- update : Knora user information object
100
- Updates the changed attributes of a user and returns the updated information as it is in Knora
101
-
102
- delete : Knora result code
103
- Deletes a user and returns the result code
104
-
105
- addToGroup : None
106
- Add the user to the given group (will be executed when calling ``update``)
107
-
108
- rmFromGroup : None
109
- Remove a user from a group (will be executed when calling ``update``)
110
-
111
- addToProject : None
112
- adds a user to a project, optional as project administrator (will be executed when calling ``update``)
113
-
114
- rmFromProject : None
115
- removes a user from a project (will be executed when calling ``update``)
116
-
117
- makeProjectAdmin : None
118
- Promote user to project admin of given project
119
-
120
- unmakeProjectAdmin : None
121
- Revoke project admin flog for user for given project
122
-
123
- getAllUsers : list of user
124
- Get a list of all users
125
-
126
- print : None
127
- Prints the user information to stdout
128
-
129
-
130
- """
131
-
132
- _id: str
133
- _username: str
134
- _email: str
135
- _givenName: str
136
- _familyName: str
137
- _password: str
138
- _lang: Languages
139
- _status: bool
140
- _sysadmin: bool
141
- _in_groups: Set[str]
142
- _in_projects: Dict[str, bool]
143
- _add_to_project: Dict[str, bool]
144
- _rm_from_project: Dict[str, bool]
145
- _add_to_group: Set[str]
146
- _rm_from_group: Set[str]
147
- _change_admin: Set[str]
148
-
149
- def __init__(self,
150
- con: Connection,
151
- id: Optional[str] = None,
152
- username: Optional[str] = None,
153
- email: Optional[str] = None,
154
- givenName: Optional[str] = None,
155
- familyName: Optional[str] = None,
156
- password: Optional[str] = None,
157
- lang: Optional[Union[str,Languages]] = None,
158
- status: Optional[bool] = None,
159
- sysadmin: Optional[bool] = None,
160
- in_projects: Optional[Dict[str, bool]] = None,
161
- in_groups: Optional[Set[str]] = None):
162
- """
163
- Constructor for User
164
-
165
- The constructor is user internally or externally, when a new user should be created in Knora.
166
-
167
- :param con: Connection instance [required]
168
- :param id: IRI of the user [required for CREATE, READ]
169
- :param username: Username [required for CREATE]
170
- :param email: Email address [required for CREATE]
171
- :param givenName: Given name (firstname) of user [required for CREATE]
172
- :param familyName: Family name (lastname) of user [required for CREATE]
173
- :param password: Password [required for CREATE]
174
- :param lang: Preferred language of the user [optional]
175
- :param status: Status (active = True, inactive/deleted = False) [optional]
176
- :param sysadmin: User has system administration privileges [optional]
177
- :param in_projects: Dict with project-IRI as key, boolean(True=project admin) as value [optional]
178
- :param in_groups: Set with group-IRI's the user should belong to [optional]
179
- """
180
- super().__init__(con)
181
- self._id = str(id) if id is not None else None
182
- self._username = str(username) if username is not None else None
183
- self._email = str(email) if email is not None else None
184
- self._givenName = str(givenName) if givenName is not None else None
185
- self._familyName = str(familyName) if familyName is not None else None
186
- self._password = str(password) if password is not None else None
187
- if lang is not None:
188
- if isinstance(lang, Languages):
189
- self._lang = lang
190
- else:
191
- lmap = dict(map(lambda a: (a.value, a), Languages))
192
- if lmap.get(lang) is None:
193
- raise BaseError('Invalid language string "' + lang + '"!')
194
- self._lang = lmap[lang]
195
- else:
196
- self._lang = None
197
- self._status = None if status is None else bool(status)
198
-
199
- if in_projects is None or isinstance(in_projects, dict):
200
- self._in_projects = in_projects if in_projects is not None else {}
201
- else:
202
- raise BaseError("In_project must be tuple (project-iri: str, is-admin: bool)!")
203
-
204
- if in_groups is None or isinstance(in_groups, set):
205
- self._in_groups = in_groups if in_groups is not None else set()
206
- else:
207
- raise BaseError('In_groups must be a set of strings or None!')
208
-
209
- self._sysadmin = None if sysadmin is None else bool(sysadmin)
210
- self._add_to_project = {}
211
- self._rm_from_project = {}
212
- self._change_admin = {}
213
- self._add_to_group = set()
214
- self._rm_from_group = set()
215
-
216
- @property
217
- def id(self) -> Optional[str]:
218
- return self._id
219
-
220
- @id.setter
221
- def id(self, value: str) -> None:
222
- raise BaseError('User id cannot be modified!')
223
-
224
- @property
225
- def username(self) -> Optional[str]:
226
- return self._username
227
-
228
- @username.setter
229
- def username(self, value: Optional[str]):
230
- if value is None:
231
- return
232
- self._username = str(value)
233
- self._changed.add('username')
234
-
235
- @property
236
- def email(self) -> Optional[str]:
237
- return self._email
238
-
239
- @email.setter
240
- def email(self, value: Optional[str]):
241
- if value is None:
242
- return
243
- self._email = str(value)
244
- self._changed.add('email')
245
-
246
- @property
247
- def givenName(self) -> Optional[str]:
248
- return self._givenName
249
-
250
- @givenName.setter
251
- def givenName(self, value: Optional[str]):
252
- if value is None:
253
- return
254
- self._givenName = str(value)
255
- self._changed.add('givenName')
256
-
257
- @property
258
- def familyName(self) -> Optional[str]:
259
- return self._familyName
260
-
261
- @familyName.setter
262
- def familyName(self, value: Optional[str]):
263
- if value is None:
264
- return
265
- self._familyName = str(value)
266
- self._changed.add('familyName')
267
-
268
- @property
269
- def password(self) -> Optional[str]:
270
- return None
271
-
272
- @password.setter
273
- def password(self, value: Optional[str]):
274
- if value is None:
275
- return
276
- self._password = str(value)
277
- self._changed.add('password')
278
-
279
- @property
280
- def lang(self) -> Optional[Languages]:
281
- return self._lang
282
-
283
- @lang.setter
284
- def lang(self, value: Optional[Union[str, Languages]]):
285
- if value is None:
286
- return
287
- if isinstance(value, Languages):
288
- self._lang = value
289
- self._changed.add('lang')
290
- else:
291
- lmap = dict(map(lambda a: (a.value, a), Languages))
292
- if lmap.get(value) is None:
293
- raise BaseError('Invalid language string "' + value + '"!')
294
- self._lang = lmap[value]
295
- self._changed.add('lang')
296
-
297
- @property
298
- def status(self) -> bool:
299
- return self._status
300
-
301
- @status.setter
302
- def status(self, value: Optional[bool]) -> None:
303
- self._status = None if value is None else bool(value)
304
- if value is not None:
305
- self._changed.add('status')
306
-
307
- @property
308
- def sysadmin(self) -> bool:
309
- return self._sysadmin
310
-
311
- @sysadmin.setter
312
- def sysadmin(self, value: bool):
313
- self._sysadmin = None if value is None else bool(value)
314
- if value is not None:
315
- self._changed.add('sysadmin')
316
-
317
- @property
318
- def in_groups(self) -> Set[str]:
319
- return self._in_groups
320
-
321
- @in_groups.setter
322
- def in_groups(self, value: Any):
323
- raise BaseError('Group membership cannot be modified directly! Use methods "addToGroup" and "rmFromGroup"')
324
-
325
- def addToGroup(self, value: str):
326
- """
327
- Add the user to the given group (executed at next update)
328
-
329
- :param value: IRI of the group
330
- :return: None
331
- """
332
-
333
- if value in self._rm_from_group:
334
- self._rm_from_group.pop(value)
335
- elif value not in self._in_groups:
336
- self._add_to_group.add(value)
337
- self._changed.add('in_groups')
338
- else:
339
- raise BaseError("Already member of this group!")
340
-
341
- def rmFromGroup(self, value: str):
342
- """
343
- Remove the user from the given group (executed at next update)
344
-
345
- :param value: Group IRI
346
- :return: None
347
- """
348
-
349
- if value in self._add_to_group:
350
- self._add_to_group.discard(value)
351
- elif value in self._in_groups:
352
- self._rm_from_group.add(value)
353
- self._changed.add('in_groups')
354
- else:
355
- raise BaseError("User is not in groups!")
356
-
357
- @property
358
- def in_projects(self) -> Dict[str, bool]:
359
- return self._in_projects
360
-
361
- @in_projects.setter
362
- def in_project(self, value: Any):
363
- raise BaseError('Project membership cannot be modified directly! Use methods "addToProject" and "rmFromProject"')
364
-
365
- def addToProject(self, value: str, padmin: bool = False):
366
- """
367
- Add the user to the given project (executed at next update)
368
-
369
- :param value: project IRI
370
- :param padmin: True, if user should be project admin, False otherwise
371
- :return: None
372
- """
373
-
374
- if value in self._rm_from_project:
375
- self._rm_from_project.pop(value)
376
- elif value not in self._in_projects:
377
- self._add_to_project[value] = padmin
378
- self._changed.add('in_projects')
379
- else:
380
- raise BaseError("Already member of this project!")
381
-
382
- def rmFromProject(self, value: str):
383
- """
384
- Remove the user from the given project (executed at next update)
385
-
386
- :param value: Project IRI
387
- :return: None
388
- """
389
-
390
- if value in self._add_to_project:
391
- self._add_to_project.pop(value)
392
- elif value in self._in_projects:
393
- self._rm_from_project[value] = self._in_projects[value]
394
- self._changed.add('in_projects')
395
- else:
396
- raise BaseError("Project is not in list of member projects!")
397
-
398
- def makeProjectAdmin(self, value: str):
399
- """
400
- Make the user project administrator in the given project (executed at next update)
401
-
402
- :param value: Project IRI
403
- :return: None
404
- """
405
-
406
- if value in self._in_projects:
407
- self._change_admin[value] = True
408
- self._changed.add('in_projects')
409
- elif value in self._add_to_project:
410
- self._add_to_project[value] = True
411
- else:
412
- raise BaseError("User is not member of project!")
413
-
414
- def unmakeProjectAdmin(self, value: str):
415
- """
416
- Revoke project administrator right for the user from the given project (executed at next update)
417
-
418
- :param value: Project IRI
419
- :return: None
420
- """
421
- if value in self._in_projects:
422
- self._change_admin[value] = False
423
- self._changed.add('in_projects')
424
- elif value in self._add_to_project:
425
- self._add_to_project[value] = False
426
- else:
427
- raise BaseError("User is not member of project!")
428
-
429
- @property
430
- def changed(self) -> Set[str]:
431
- return self._changed
432
-
433
- def has_changed(self, name: str):
434
- return name in self._changed
435
-
436
- @classmethod
437
- def fromJsonObj(cls, con: Connection, json_obj: Any):
438
- """
439
- Internal method! Should not be used directly!
440
-
441
- This method is used to create a User instance from the JSON data returned by Knora
442
-
443
- :param con: Connection instance
444
- :param json_obj: JSON data returned by Knora as python3 object
445
- :return: User instance
446
- """
447
-
448
- id = json_obj.get('id')
449
- if id is None:
450
- raise BaseError('User "id" is missing in JSON from knora')
451
- email = json_obj.get('email')
452
- if email is None:
453
- raise BaseError('User "email" is missing in JSON from knora')
454
- username = json_obj.get('username')
455
- if username is None:
456
- raise BaseError('User "username" is missing in JSON from knora')
457
- familyName = json_obj.get('familyName')
458
- givenName = json_obj.get('givenName')
459
- lang = json_obj.get('lang')
460
- status = json_obj.get('status')
461
- if status is None:
462
- raise BaseError("Status is missing in JSON from knora")
463
-
464
- in_projects: Dict[str, bool] = {}
465
- in_groups: Set[str] = set()
466
- if json_obj.get('permissions') is not None and json_obj['permissions'].get('groupsPerProject') is not None:
467
- sysadmin = False
468
- project_groups = json_obj['permissions']['groupsPerProject']
469
- for project in project_groups:
470
- if project == Project.SYSTEM_PROJECT:
471
- if Group.PROJECT_SYSTEMADMIN_GROUP in project_groups[project]:
472
- sysadmin = True
473
- else:
474
- for group in project_groups[project]:
475
- if group == Group.PROJECT_MEMBER_GROUP:
476
- if in_projects.get(project) is None:
477
- in_projects[project] = False
478
- elif group == Group.PROJECT_ADMIN_GROUP:
479
- in_projects[project] = True
480
- else:
481
- in_groups.add(group)
482
- return cls(con=con,
483
- id=id,
484
- username=username,
485
- email=email,
486
- givenName=givenName,
487
- familyName=familyName,
488
- lang=lang,
489
- status=status,
490
- sysadmin=sysadmin,
491
- in_projects=in_projects,
492
- in_groups=in_groups)
493
-
494
- def toJsonObj(self, action: Actions):
495
- """
496
- Internal method! Should not be used directly!
497
-
498
- Creates a JSON-object from the Project instance that can be used to call Knora
499
-
500
- :param action: Action the object is used for (Action.CREATE or Action.UPDATE)
501
- :return: JSON-object
502
- """
503
-
504
- tmp = {}
505
- if action == Actions.Create:
506
- if self._username is None:
507
- raise BaseError("There must be a valid username!")
508
- tmp['username'] = self._username
509
- if self._email is None:
510
- raise BaseError("'email' is mandatory!")
511
- tmp['email'] = self._email
512
- if self._givenName is None:
513
- raise BaseError("'givenName is mandatory!")
514
- tmp['givenName'] = self._givenName
515
- if self._familyName is None:
516
- raise BaseError("'familyName' is mandatory!")
517
- tmp['familyName'] = self._familyName
518
- if self._password is None:
519
- raise BaseError("'password' is mandatory!")
520
- tmp['password'] = self._password
521
- if self._lang is None:
522
- raise BaseError("'language' is mandatory!")
523
- tmp['lang'] = self._lang.value
524
- tmp['status'] = True if self._status is None else self._status
525
- tmp['systemAdmin'] = False if self._sysadmin is None else self._sysadmin
526
- elif action == Actions.Update:
527
- tmp_changed = False
528
- if self._username is not None and 'username' in self._changed:
529
- tmp['username'] = self._username
530
- tmp_changed = self._username
531
- if self._email is not None and 'email' in self._changed:
532
- tmp['email'] = self._email
533
- tmp_changed = True
534
- if self._givenName is not None and 'givenName' in self._changed:
535
- tmp['givenName'] = self._givenName
536
- tmp_changed = True
537
- if self._familyName is not None and 'familyName' in self._changed:
538
- tmp['familyName'] = self._familyName
539
- tmp_changed = True
540
- if self._lang is not None and 'lang' in self._changed:
541
- tmp['lang'] = self._lang.value
542
- tmp_changed = True
543
- if not tmp_changed:
544
- tmp = {}
545
- return tmp
546
-
547
- def create(self) -> Any:
548
- """
549
- Create new user in Knora
550
-
551
- :return: JSON-object from Knora
552
- """
553
-
554
- jsonobj = self.toJsonObj(Actions.Create)
555
- jsondata = json.dumps(jsonobj)
556
- result = self._con.post('/admin/users', jsondata)
557
- id = result['user']['id']
558
- if self._in_projects is not None:
559
- for project in self._in_projects:
560
- result = self._con.post('/admin/users/iri/' + quote_plus(id) + '/project-memberships/' + quote_plus(project))
561
- if self._in_projects[project]:
562
- result = self._con.post('/admin/users/iri/' + quote_plus(id) + '/project-admin-memberships/' + quote_plus(project))
563
- if self._in_groups is not None:
564
- for group in self._in_groups:
565
- result = self._con.post('/admin/users/iri/' + quote_plus(id) + '/group-memberships/' + quote_plus(group))
566
- return User.fromJsonObj(self._con, result['user'])
567
-
568
- def read(self) -> Any:
569
- """
570
- Read the user information from Knora. The User object must have a valid id or email!
571
-
572
- :return: JSON-object from Knora
573
- """
574
- if self._id is not None:
575
- result = self._con.get('/admin/users/iri/' + quote_plus(self._id))
576
- elif self._email is not None:
577
- result = self._con.get('/admin/users/email/' + quote_plus(self._email))
578
- elif self._username is not None:
579
- result = self._con.get('/admin/users/username/' + quote_plus(self._username))
580
- else:
581
- raise BaseError('Either user-id or email is required!')
582
- return User.fromJsonObj(self._con, result['user'])
583
-
584
- def update(self, requesterPassword: Optional[str] = None) -> Any:
585
- """
586
- Udate the user info in Knora with the modified data in this user instance
587
-
588
- :param requesterPassword: Old password if a user wants to change it's own password
589
- :return: JSON-object from Knora
590
- """
591
-
592
- jsonobj = self.toJsonObj(Actions.Update)
593
- if jsonobj:
594
- jsondata = json.dumps(jsonobj)
595
- result = self._con.put('/admin/users/iri/' + quote_plus(self.id) + '/BasicUserInformation', jsondata)
596
- if 'status' in self._changed:
597
- jsonobj = {'status': self._status}
598
- jsondata = json.dumps(jsonobj)
599
- result = self._con.put('/admin/users/iri/' + quote_plus(self.id) + '/Status', jsondata)
600
- if 'password' in self._changed:
601
- if requesterPassword is None:
602
- raise BaseError("Requester's password is missing!")
603
- jsonobj = {
604
- "requesterPassword": requesterPassword,
605
- "newPassword": self._password
606
- }
607
- jsondata = json.dumps(jsonobj)
608
- result = self._con.put('/admin/users/iri/' + quote_plus(self.id) + '/Password', jsondata)
609
- if 'sysadmin' in self._changed:
610
- jsonobj = {'systemAdmin': self._sysadmin}
611
- jsondata = json.dumps(jsonobj)
612
- result = self._con.put('/admin/users/iri/' + quote_plus(self.id) + '/SystemAdmin', jsondata)
613
- for p in self._add_to_project.items():
614
- result = self._con.post('/admin/users/iri/' + quote_plus(self._id) + '/project-memberships/' + quote_plus(p[0]))
615
- if p[1]:
616
- result = self._con.post('/admin/users/iri/' + quote_plus(self._id) + '/project-admin-memberships/' + quote_plus(p[0]))
617
-
618
- for p in self._rm_from_project:
619
- if self._in_projects.get(p) is not None and self._in_projects[p]:
620
- result = self._con.delete('/admin/users/iri/' + quote_plus(self._id) + '/project-admin-memberships/' + quote_plus(p))
621
- result = self._con.delete('/admin/users/iri/' + quote_plus(self._id) + '/project-memberships/' + quote_plus(p))
622
-
623
- for p in self._change_admin.items():
624
- if not p[0] in self._in_projects:
625
- raise BaseError('user must be member of project!')
626
- if p[1]:
627
- result = self._con.post('/admin/users/iri/' + quote_plus(self._id) + '/project-admin-memberships/' + quote_plus(p[0]))
628
- else:
629
- result = self._con.delete('/admin/users/iri/' + quote_plus(self._id) + '/project-admin-memberships/' + quote_plus(p[0]))
630
-
631
- for p in self._add_to_group:
632
- print('/admin/users/iri/' + quote_plus(self._id) + '/group-memberships/' + quote_plus(p))
633
- result = self._con.post('/admin/users/iri/' + quote_plus(self._id) + '/group-memberships/' + quote_plus(p))
634
- for p in self._rm_from_group:
635
- result = self._con.delete('/admin/users/iri/' + quote_plus(self._id) + '/group-memberships/' + quote_plus(p))
636
- user = User(con=self._con, id=self._id).read()
637
- return user
638
-
639
- def delete(self):
640
- """
641
- Delete the user in nore (NOT YET IMPLEMENTED)
642
- :return: None
643
- """
644
- result = self._con.delete('/admin/users/iri/' + quote_plus(self._id))
645
- return User.fromJsonObj(self._con, result['user'])
646
-
647
- @staticmethod
648
- def getAllUsers(con: Connection) -> List[Any]:
649
- """
650
- Get a list of all users (static method)
651
-
652
- :param con: Connection instance
653
- :return: List of users
654
- """
655
-
656
- result = con.get('/admin/users')
657
- if 'users' not in result:
658
- raise BaseError("Request got no users!")
659
- return list(map(lambda a: User.fromJsonObj(con, a), result['users']))
660
-
661
- def print(self) -> None:
662
- """
663
- Prin user info to stdout
664
-
665
- :return: None
666
- """
667
-
668
- print('User info:')
669
- print(' Id: {}'.format(self._id))
670
- print(' Username: {}'.format(self._username))
671
- print(' Family name: {}'.format(self._familyName))
672
- print(' Given name: {}'.format(self._givenName))
673
- print(' Language: {}'.format(self._lang.value))
674
- print(' Status: {}'.format(self._status))
675
- print(' Sysadmin: {}'.format(self._sysadmin))
676
- print(' In projects:')
677
- if self._in_projects is not None:
678
- for p in self._in_projects:
679
- print(' {} : project admin: {}'.format(p, self._in_projects[p]))
680
- print(' In groups:')
681
- if self._in_groups is not None:
682
- for g in self._in_groups:
683
- print(' {}'.format(g))
684
-
685
-
686
-
687
- if __name__ == '__main__':
688
- con = Connection('http://0.0.0.0:3333')
689
- con.login('root@example.com', 'test')
690
-
691
- users = User.getAllUsers(con)
692
- for u in users:
693
- uu = u.read()
694
- uu.print()
695
-
696
- print('======================================')
697
-
698
- new_user = User(
699
- con=con,
700
- username="lrosenth",
701
- email="lukas.rosenthaler@gmail.com",
702
- givenName="Lukas",
703
- familyName="Rosenthaler",
704
- password="test",
705
- status=True,
706
- lang=Languages.DE,
707
- sysadmin=True,
708
- in_projects= {
709
- "http://rdfh.ch/projects/0001": True,
710
- "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF": False
711
- },
712
- in_groups={"http://rdfh.ch/groups/00FF/images-reviewer"}
713
- ).create()
714
- new_user.print()
715
-
716
- new_user.status = False
717
- new_user = new_user.update()
718
- new_user.print()
719
-
720
- new_user.status = True
721
- #new_user.givenName = '--Lukas--'
722
- new_user.familyName = '--Rosenthaler--'
723
- new_user.password = 'gaga'
724
- new_user = new_user.update("test")
725
- new_user.print()
726
-
727
- new_user.addToProject("http://rdfh.ch/projects/0803", True)
728
- new_user.rmFromProject('http://rdfh.ch/projects/0001')
729
- new_user.makeProjectAdmin('http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF')
730
- new_user = new_user.update()
731
- new_user.print()