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
@@ -0,0 +1,342 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any
5
+ from typing import Protocol
6
+
7
+ from dsp_tools.error.xmllib_errors import XmllibInputError
8
+ from dsp_tools.error.xmllib_warnings import MessageInfo
9
+ from dsp_tools.error.xmllib_warnings_util import emit_xmllib_input_type_mismatch_warning
10
+ from dsp_tools.error.xmllib_warnings_util import raise_xmllib_input_error
11
+ from dsp_tools.utils.data_formats.uri_util import is_uri
12
+ from dsp_tools.xmllib.internal.checkers import check_and_inform_about_angular_brackets
13
+ from dsp_tools.xmllib.internal.circumvent_circular_imports import parse_richtext_as_xml
14
+ from dsp_tools.xmllib.internal.input_converters import check_and_fix_is_non_empty_string
15
+ from dsp_tools.xmllib.internal.input_converters import check_and_get_corrected_comment
16
+ from dsp_tools.xmllib.models.config_options import NewlineReplacement
17
+ from dsp_tools.xmllib.models.permissions import Permissions
18
+ from dsp_tools.xmllib.value_checkers import is_color
19
+ from dsp_tools.xmllib.value_checkers import is_date
20
+ from dsp_tools.xmllib.value_checkers import is_decimal
21
+ from dsp_tools.xmllib.value_checkers import is_geoname
22
+ from dsp_tools.xmllib.value_checkers import is_integer
23
+ from dsp_tools.xmllib.value_checkers import is_link_value
24
+ from dsp_tools.xmllib.value_checkers import is_nonempty_value
25
+ from dsp_tools.xmllib.value_checkers import is_timestamp
26
+ from dsp_tools.xmllib.value_converters import convert_to_bool_string
27
+ from dsp_tools.xmllib.value_converters import replace_newlines_with_tags
28
+
29
+
30
+ class Value(Protocol):
31
+ value: str
32
+ prop_name: str
33
+ permissions: Permissions
34
+ comment: str | None
35
+
36
+
37
+ @dataclass
38
+ class BooleanValue(Value):
39
+ value: str
40
+ prop_name: str
41
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
42
+ comment: str | None = None
43
+
44
+ @classmethod
45
+ def new(
46
+ cls,
47
+ value: Any,
48
+ prop_name: str,
49
+ permissions: Permissions,
50
+ comment: str | None,
51
+ resource_id: str | None,
52
+ ) -> BooleanValue:
53
+ try:
54
+ val = str(convert_to_bool_string(value)).lower()
55
+ except XmllibInputError:
56
+ emit_xmllib_input_type_mismatch_warning(
57
+ expected_type="bool", value=value, res_id=resource_id, prop_name=prop_name
58
+ )
59
+ val = str(value)
60
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
61
+ return cls(value=val, prop_name=prop_name, permissions=permissions, comment=fixed_comment)
62
+
63
+
64
+ @dataclass
65
+ class ColorValue(Value):
66
+ value: str
67
+ prop_name: str
68
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
69
+ comment: str | None = None
70
+
71
+ @classmethod
72
+ def new(
73
+ cls,
74
+ value: Any,
75
+ prop_name: str,
76
+ permissions: Permissions,
77
+ comment: str | None,
78
+ resource_id: str | None,
79
+ ) -> ColorValue:
80
+ if not is_color(value):
81
+ emit_xmllib_input_type_mismatch_warning(
82
+ expected_type="color", value=value, res_id=resource_id, prop_name=prop_name
83
+ )
84
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
85
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
86
+
87
+
88
+ @dataclass
89
+ class DateValue(Value):
90
+ value: str
91
+ prop_name: str
92
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
93
+ comment: str | None = None
94
+
95
+ @classmethod
96
+ def new(
97
+ cls,
98
+ value: Any,
99
+ prop_name: str,
100
+ permissions: Permissions,
101
+ comment: str | None,
102
+ resource_id: str | None,
103
+ ) -> DateValue:
104
+ if not is_date(value):
105
+ emit_xmllib_input_type_mismatch_warning(
106
+ expected_type="date", value=value, res_id=resource_id, prop_name=prop_name
107
+ )
108
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
109
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
110
+
111
+
112
+ @dataclass
113
+ class DecimalValue(Value):
114
+ value: str
115
+ prop_name: str
116
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
117
+ comment: str | None = None
118
+
119
+ @classmethod
120
+ def new(
121
+ cls,
122
+ value: Any,
123
+ prop_name: str,
124
+ permissions: Permissions,
125
+ comment: str | None,
126
+ resource_id: str | None,
127
+ ) -> DecimalValue:
128
+ if not is_decimal(value):
129
+ emit_xmllib_input_type_mismatch_warning(
130
+ expected_type="decimal", value=value, res_id=resource_id, prop_name=prop_name
131
+ )
132
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
133
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
134
+
135
+
136
+ @dataclass
137
+ class GeonameValue(Value):
138
+ value: str
139
+ prop_name: str
140
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
141
+ comment: str | None = None
142
+
143
+ @classmethod
144
+ def new(
145
+ cls,
146
+ value: Any,
147
+ prop_name: str,
148
+ permissions: Permissions,
149
+ comment: str | None,
150
+ resource_id: str | None,
151
+ ) -> GeonameValue:
152
+ if not is_geoname(value):
153
+ emit_xmllib_input_type_mismatch_warning(
154
+ expected_type="geoname", value=value, res_id=resource_id, prop_name=prop_name
155
+ )
156
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
157
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
158
+
159
+
160
+ @dataclass
161
+ class IntValue(Value):
162
+ value: str
163
+ prop_name: str
164
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
165
+ comment: str | None = None
166
+
167
+ @classmethod
168
+ def new(
169
+ cls,
170
+ value: Any,
171
+ prop_name: str,
172
+ permissions: Permissions,
173
+ comment: str | None,
174
+ resource_id: str | None,
175
+ ) -> IntValue:
176
+ if not is_integer(value):
177
+ emit_xmllib_input_type_mismatch_warning(
178
+ expected_type="integer", value=value, res_id=resource_id, prop_name=prop_name
179
+ )
180
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
181
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
182
+
183
+
184
+ @dataclass
185
+ class LinkValue(Value):
186
+ value: str
187
+ prop_name: str
188
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
189
+ comment: str | None = None
190
+
191
+ @classmethod
192
+ def new(
193
+ cls,
194
+ value: Any,
195
+ prop_name: str,
196
+ permissions: Permissions,
197
+ comment: str | None,
198
+ resource_id: str | None,
199
+ ) -> LinkValue:
200
+ if not is_link_value(value):
201
+ emit_xmllib_input_type_mismatch_warning(
202
+ expected_type="xsd:ID or DSP resource IRI", value=value, res_id=resource_id, prop_name=prop_name
203
+ )
204
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
205
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
206
+
207
+
208
+ @dataclass
209
+ class ListValue(Value):
210
+ value: str
211
+ list_name: str
212
+ prop_name: str
213
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
214
+ comment: str | None = None
215
+
216
+ @classmethod
217
+ def new(
218
+ cls,
219
+ value: Any,
220
+ list_name: Any,
221
+ prop_name: str,
222
+ permissions: Permissions,
223
+ comment: str | None,
224
+ resource_id: str | None,
225
+ ) -> ListValue:
226
+ if str(value).startswith("http://rdfh.ch/lists/"):
227
+ list_str = ""
228
+ else:
229
+ list_str = str(list_name)
230
+ if not is_nonempty_value(list_name):
231
+ emit_xmllib_input_type_mismatch_warning(
232
+ expected_type="list name", value=list_name, res_id=resource_id, prop_name=prop_name
233
+ )
234
+ if not is_nonempty_value(value):
235
+ emit_xmllib_input_type_mismatch_warning(
236
+ expected_type="list node", value=value, res_id=resource_id, prop_name=prop_name
237
+ )
238
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
239
+ return cls(
240
+ value=str(value),
241
+ list_name=str(list_str),
242
+ prop_name=prop_name,
243
+ permissions=permissions,
244
+ comment=fixed_comment,
245
+ )
246
+
247
+
248
+ @dataclass
249
+ class SimpleText(Value):
250
+ value: str
251
+ prop_name: str
252
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
253
+ comment: str | None = None
254
+
255
+ @classmethod
256
+ def new(
257
+ cls,
258
+ value: Any,
259
+ prop_name: str,
260
+ permissions: Permissions,
261
+ comment: str | None,
262
+ resource_id: str | None,
263
+ ) -> SimpleText:
264
+ converted_val = check_and_fix_is_non_empty_string(value=value, res_id=resource_id, prop_name=prop_name)
265
+ check_and_inform_about_angular_brackets(value=value, res_id=resource_id, prop_name=prop_name)
266
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
267
+ return cls(value=converted_val, prop_name=prop_name, permissions=permissions, comment=fixed_comment)
268
+
269
+
270
+ @dataclass
271
+ class Richtext(Value):
272
+ value: str
273
+ prop_name: str
274
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
275
+ comment: str | None = None
276
+
277
+ @classmethod
278
+ def new(
279
+ cls,
280
+ value: Any,
281
+ prop_name: str,
282
+ permissions: Permissions,
283
+ comment: str | None,
284
+ resource_id: str | None,
285
+ newline_replacement: NewlineReplacement = NewlineReplacement.NONE,
286
+ ) -> Richtext:
287
+ converted_val = check_and_fix_is_non_empty_string(value=value, res_id=resource_id, prop_name=prop_name)
288
+ converted_val = replace_newlines_with_tags(converted_val, newline_replacement)
289
+ result = parse_richtext_as_xml(converted_val)
290
+ if isinstance(result, MessageInfo):
291
+ raise_xmllib_input_error(result)
292
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
293
+ return cls(value=converted_val, prop_name=prop_name, permissions=permissions, comment=fixed_comment)
294
+
295
+
296
+ @dataclass
297
+ class TimeValue(Value):
298
+ value: str
299
+ prop_name: str
300
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
301
+ comment: str | None = None
302
+
303
+ @classmethod
304
+ def new(
305
+ cls,
306
+ value: Any,
307
+ prop_name: str,
308
+ permissions: Permissions,
309
+ comment: str | None,
310
+ resource_id: str | None,
311
+ ) -> TimeValue:
312
+ if not is_timestamp(value):
313
+ emit_xmllib_input_type_mismatch_warning(
314
+ expected_type="timestamp", value=value, res_id=resource_id, prop_name=prop_name
315
+ )
316
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
317
+ return cls(value=str(value), prop_name=prop_name, permissions=permissions, comment=fixed_comment)
318
+
319
+
320
+ @dataclass
321
+ class UriValue(Value):
322
+ value: str
323
+ prop_name: str
324
+ permissions: Permissions = Permissions.PROJECT_SPECIFIC_PERMISSIONS
325
+ comment: str | None = None
326
+
327
+ @classmethod
328
+ def new(
329
+ cls,
330
+ value: Any,
331
+ prop_name: str,
332
+ permissions: Permissions,
333
+ comment: str | None,
334
+ resource_id: str | None,
335
+ ) -> UriValue:
336
+ v = str(value)
337
+ if not is_uri(v):
338
+ emit_xmllib_input_type_mismatch_warning(
339
+ expected_type="uri", value=value, res_id=resource_id, prop_name=prop_name
340
+ )
341
+ fixed_comment = check_and_get_corrected_comment(comment, resource_id, prop_name)
342
+ return cls(value=v, prop_name=prop_name, permissions=permissions, comment=fixed_comment)
File without changes
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+
3
+ from dsp_tools.xmllib.models.licenses.recommended import License
4
+
5
+
6
+ class LicenseOther:
7
+ """
8
+ Pre-defined licenses that are available in DSP.
9
+ If the user is free to choose a license, we recommend to choose from our [recommended licenses](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/recommended/).
10
+
11
+ - `Public`: [See `Public` for details](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/other/#xmllib.models.licenses.other.Public).
12
+ - `Various`: [See `Various` for details](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/other/#xmllib.models.licenses.other.Various).
13
+
14
+ Examples:
15
+ ```python
16
+ # adding a BORIS Standard License to a file
17
+ resource = resource.add_file(
18
+ filename="images/cat.jpg",
19
+ license=xmllib.LicenseOther.Various.BORIS_STANDARD,
20
+ copyright_holder="Meow University",
21
+ authorship=["Kitty Meow"],
22
+ )
23
+ ```
24
+ """
25
+
26
+ Public: type[Public]
27
+ Various: type[Various]
28
+
29
+
30
+ class Public(License):
31
+ """
32
+ Pre-defined public domain licenses.
33
+ [See the API documentation for details about the licenses.](https://docs.dasch.swiss/latest/DSP-API/01-introduction/legal-info/#license)
34
+
35
+ - `CC_0_1_0`: CC0 1.0 Universal
36
+ - `CC_PDM_1_0`: Public Domain Mark 1.0 Universal
37
+ """
38
+
39
+ CC_0_1_0 = "http://rdfh.ch/licenses/cc-0-1.0"
40
+ CC_PDM_1_0 = "http://rdfh.ch/licenses/cc-pdm-1.0"
41
+
42
+
43
+ class Various(License):
44
+ """
45
+ A collection of various, pre-defined licenses.
46
+ [See the API documentation for details about the licenses.](https://docs.dasch.swiss/latest/DSP-API/01-introduction/legal-info/#license)
47
+
48
+ - `BORIS_STANDARD`: BORIS Standard License
49
+ - `FRANCE_OUVERTE`: LICENCE OUVERTE 2.0
50
+ - `RIGHTSSTATEMENTS_NOC_NC`: Rightsstatements: No Copyright - Non-Commercial Use Only
51
+ """
52
+
53
+ BORIS_STANDARD = "http://rdfh.ch/licenses/boris"
54
+ FRANCE_OUVERTE = "http://rdfh.ch/licenses/open-licence-2.0"
55
+ RIGHTSSTATEMENTS_NOC_NC = "http://rdfh.ch/licenses/noc-nc-1.0"
56
+
57
+
58
+ LicenseOther.Public = Public
59
+ LicenseOther.Various = Various
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import StrEnum
4
+
5
+
6
+ class License(StrEnum): ...
7
+
8
+
9
+ class LicenseRecommended:
10
+ """
11
+ Recommended licenses:
12
+
13
+ - `DSP`: Licenses created and curated by DaSCH, [see `DSP` for details.](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/recommended/#xmllib.models.licenses.recommended.DSP)
14
+ - `CC`: Creative Commons licenses, [see `CC` for details.](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/licenses/recommended/#xmllib.models.licenses.recommended.CC)
15
+
16
+ Tip:
17
+ Use the helper function [`find_license_in_string()`](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/general-functions/#xmllib.general_functions.find_license_in_string)
18
+ to parse a license from a string.
19
+
20
+ Examples:
21
+ ```python
22
+ # adding a Creative Commons license to a file
23
+ resource = resource.add_file(
24
+ filename="images/cat.jpg",
25
+ license=xmllib.LicenseRecommended.CC.BY,
26
+ copyright_holder="Meow University",
27
+ authorship=["Kitty Meow"],
28
+ )
29
+ ```
30
+
31
+ ```python
32
+ # adding a DSP license to a file
33
+ resource = resource.add_file(
34
+ filename="images/dog.jpg",
35
+ license=xmllib.LicenseRecommended.DSP.PUBLIC_DOMAIN,
36
+ copyright_holder="Bark University",
37
+ authorship=["Bark McDog"],
38
+ )
39
+ ```
40
+ """
41
+
42
+ CC: type[CC]
43
+ DSP: type[DSP]
44
+
45
+
46
+ class CC(License):
47
+ """
48
+ Pre-defined and recommended [Creative Commons licenses:](https://creativecommons.org/share-your-work/)
49
+
50
+ - `BY`: [Attribution 4.0](https://creativecommons.org/licenses/by/4.0/)
51
+ - `BY_SA`: [Attribution-ShareAlike 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
52
+ - `BY_NC`: [Attribution-NonCommercial 4.0](https://creativecommons.org/licenses/by-nc/4.0/)
53
+ - `BY_NC_SA`: [Attribution-NonCommercial-ShareAlike 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)
54
+ - `BY_ND`: [Attribution-NoDerivatives 4.0](https://creativecommons.org/licenses/by-nd/4.0/)
55
+ - `BY_NC_ND`: [Attribution-NonCommercial-NoDerivatives 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/)
56
+
57
+ Tip:
58
+ Use the helper function [find_license_in_string()](https://docs.dasch.swiss/latest/DSP-TOOLS/xmllib-docs/general-functions/#xmllib.general_functions.find_license_in_string)
59
+ to parse a license from a string.
60
+
61
+ Examples:
62
+ ```python
63
+ # adding a Creative Commons license to a file
64
+ resource = resource.add_file(
65
+ filename="images/dog.jpg",
66
+ license=xmllib.LicenseRecommended.CC.BY_NC_ND,
67
+ copyright_holder="Bark University",
68
+ authorship=["Bark McDog"],
69
+ )
70
+ ```
71
+ """
72
+
73
+ BY = "http://rdfh.ch/licenses/cc-by-4.0"
74
+ BY_SA = "http://rdfh.ch/licenses/cc-by-sa-4.0"
75
+ BY_NC = "http://rdfh.ch/licenses/cc-by-nc-4.0"
76
+ BY_NC_SA = "http://rdfh.ch/licenses/cc-by-nc-sa-4.0"
77
+ BY_ND = "http://rdfh.ch/licenses/cc-by-nd-4.0"
78
+ BY_NC_ND = "http://rdfh.ch/licenses/cc-by-nc-nd-4.0"
79
+
80
+
81
+ class DSP(License):
82
+ """
83
+ Pre-defined and recommended licenses created and curated by DaSCH:
84
+
85
+ - `AI_GENERATED`: AI-Generated Content - Not Protected by Copyright
86
+ - `UNKNOWN`: Unknown License - Ask Copyright Holder for Permission
87
+ - `PUBLIC_DOMAIN`: Public Domain - Not Protected by Copyright
88
+
89
+ Examples:
90
+ ```python
91
+ # adding a DSP license to a file
92
+ resource = resource.add_file(
93
+ filename="images/cat.jpg",
94
+ license=xmllib.LicenseRecommended.DSP.PUBLIC_DOMAIN,
95
+ copyright_holder="Meow University",
96
+ authorship=["Kitty Meow"],
97
+ )
98
+ ```
99
+ """
100
+
101
+ AI_GENERATED = "http://rdfh.ch/licenses/ai-generated"
102
+ UNKNOWN = "http://rdfh.ch/licenses/unknown"
103
+ PUBLIC_DOMAIN = "http://rdfh.ch/licenses/public-domain"
104
+
105
+
106
+ LicenseRecommended.CC = CC
107
+ LicenseRecommended.DSP = DSP
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class Permissions(Enum):
7
+ """
8
+ Options of permissions for resources and values:
9
+
10
+ - `PROJECT_SPECIFIC_PERMISSIONS`: the permissions defined on project level will be applied
11
+ - `PUBLIC`: the resource/value is visible for everyone
12
+ - `PRIVATE`: the resource/value is only visible for project members
13
+ - `LIMITED_VIEW`: the resource/value is visible for everyone,
14
+ but images are blurred/watermarked for non-project members
15
+
16
+ Deprecated terms:
17
+
18
+ - `OPEN`: use `PUBLIC` instead
19
+ - `RESTRICTED`: use `PRIVATE` instead
20
+ - `RESTRICTED_VIEW`: use `LIMITED_VIEW` instead
21
+
22
+ Examples:
23
+ ```python
24
+ resource = xmllib.Resource.create_new(
25
+ res_id="ID",
26
+ restype=":ResourceType",
27
+ label="label",
28
+ permissions=xmllib.Permissions.PRIVATE,
29
+ )
30
+ ```
31
+ """
32
+
33
+ PROJECT_SPECIFIC_PERMISSIONS = ""
34
+ PUBLIC = "public"
35
+ PRIVATE = "private"
36
+ LIMITED_VIEW = "limited_view"
37
+
38
+ # Deprecated terminology
39
+ OPEN = "open"
40
+ RESTRICTED = "restricted"
41
+ RESTRICTED_VIEW = "restricted-view"