invenio-app-rdm 13.0.0b4.dev1__py2.py3-none-any.whl → 14.0.0b1.dev8__py2.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 (247) hide show
  1. invenio_app_rdm/__init__.py +1 -1
  2. invenio_app_rdm/administration/moderation/__init__.py +11 -0
  3. invenio_app_rdm/administration/moderation/requests.py +175 -0
  4. invenio_app_rdm/administration/records/records.py +9 -7
  5. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests.html +14 -0
  6. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests_details.html +91 -0
  7. invenio_app_rdm/administration/user_moderation/user_moderation.py +4 -4
  8. invenio_app_rdm/administration/users/users.py +0 -5
  9. invenio_app_rdm/communities_ui/views/communities.py +9 -5
  10. invenio_app_rdm/config.py +73 -4
  11. invenio_app_rdm/ext.py +2 -2
  12. invenio_app_rdm/fixtures/pages.py +5 -2
  13. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html +11 -0
  14. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/detail.html +2 -5
  15. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/citation.html +2 -2
  16. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/details.html +2 -2
  17. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/communities.html +8 -7
  18. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/external_resources.html +5 -6
  19. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/licenses.html +9 -13
  20. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/manage_menu.html +8 -5
  21. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/stats.html +2 -4
  22. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/detail.html +1 -1
  23. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/doi.html +7 -5
  24. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/files.html +21 -4
  25. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/tombstone.html +6 -1
  26. invenio_app_rdm/records_ui/utils.py +93 -1
  27. invenio_app_rdm/records_ui/views/decorators.py +24 -14
  28. invenio_app_rdm/records_ui/views/deposits.py +100 -27
  29. invenio_app_rdm/records_ui/views/filters.py +11 -4
  30. invenio_app_rdm/records_ui/views/records.py +23 -13
  31. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/file-modification/index.html +88 -0
  32. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/guest-access-request/index.html +5 -5
  33. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/record-deletion/index.html +95 -0
  34. invenio_app_rdm/requests_ui/views/requests.py +54 -87
  35. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewRecentChanges.js +8 -8
  36. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUserForm.js +12 -17
  37. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js +14 -16
  38. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaAction.js +1 -1
  39. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js +1 -2
  40. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchResultItem.js +81 -0
  41. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchbarLayout.js +48 -0
  42. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/index.js +22 -0
  43. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/CommunityRecordsSearchAppLayout.js +3 -4
  44. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CopyButton.js +38 -19
  45. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/FileModificationUntil.js +45 -0
  46. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionModal.js +354 -0
  47. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionRadioGroup.js +44 -0
  48. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion.js +81 -0
  49. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +55 -5
  50. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js +4 -1
  51. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/CommunitiesManagement.js +2 -2
  52. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ExportDropdown.js +7 -2
  53. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ManageButton.js +52 -19
  54. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCitationField.js +15 -14
  55. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesListModal/RecordCommunitiesListModal.js +4 -4
  56. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitySubmission/RecordCommunitySubmissionModal.js +1 -1
  57. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js +17 -3
  58. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordVersionsList.js +16 -17
  59. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RemoveFromCommunity/RemoveFromCommunityAction.js +5 -5
  60. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js +42 -40
  61. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js +9 -5
  62. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/AccessRequestTimelineEdit.js +5 -5
  63. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/AccessRequestTimelineRead.js +2 -2
  64. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/search/components.js +14 -19
  65. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/theme.js +9 -0
  66. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/file_uploader/uppy.less +37 -0
  67. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page/licenses.less +5 -3
  68. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides +6 -1
  69. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.overrides +10 -1
  70. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/search.overrides +7 -0
  71. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/search.variables +0 -0
  72. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next.js +1 -1
  73. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/_generatedTranslations.js +66 -0
  74. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ar/messages.po +804 -137
  75. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ar/translations.json +277 -249
  76. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/bg/messages.po +689 -70
  77. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/bg/translations.json +102 -82
  78. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ca/messages.po +699 -80
  79. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ca/translations.json +112 -92
  80. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/cs/messages.po +821 -138
  81. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/cs/translations.json +290 -262
  82. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/da/messages.po +691 -66
  83. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/da/translations.json +91 -71
  84. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/de/messages.po +818 -138
  85. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/de/translations.json +260 -240
  86. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/el/messages.po +698 -78
  87. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/el/translations.json +108 -88
  88. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/en/messages.po +1000 -5
  89. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/en/translations.json +81 -28
  90. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/es/messages.po +810 -137
  91. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/es/translations.json +253 -233
  92. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/et/messages.po +746 -133
  93. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/et/translations.json +130 -110
  94. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fa/messages.po +688 -69
  95. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fa/translations.json +103 -79
  96. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fr/messages.po +809 -126
  97. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fr/translations.json +277 -257
  98. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hr/messages.po +695 -70
  99. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hr/translations.json +101 -79
  100. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hu/messages.po +801 -135
  101. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hu/translations.json +254 -234
  102. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/index.js +16 -65
  103. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/it/messages.po +712 -86
  104. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/it/translations.json +116 -96
  105. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ja/messages.po +683 -70
  106. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ja/translations.json +96 -78
  107. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ka/messages.po +689 -70
  108. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ka/translations.json +109 -85
  109. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ko/messages.po +889 -0
  110. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ko/translations.json +277 -0
  111. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/lt/messages.po +702 -71
  112. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/lt/translations.json +113 -85
  113. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/no/messages.po +689 -70
  114. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/no/translations.json +102 -82
  115. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pl/messages.po +704 -70
  116. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pl/translations.json +119 -91
  117. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pt/messages.po +694 -69
  118. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pt/translations.json +93 -73
  119. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ro/messages.po +717 -85
  120. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ro/translations.json +155 -133
  121. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ru/messages.po +806 -124
  122. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ru/translations.json +288 -260
  123. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sk/messages.po +713 -82
  124. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sk/translations.json +119 -91
  125. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sv/messages.po +807 -141
  126. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sv/translations.json +260 -240
  127. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/tr/messages.po +799 -128
  128. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/tr/translations.json +259 -239
  129. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/uk/messages.po +756 -131
  130. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/uk/translations.json +124 -96
  131. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_CN/messages.po +736 -123
  132. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_CN/translations.json +130 -108
  133. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_TW/messages.po +683 -70
  134. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_TW/translations.json +100 -78
  135. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package.json +3 -37
  136. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/translations.pot +243 -94
  137. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.de.html +2 -2
  138. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.en.html +4 -4
  139. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.sv.html +4 -4
  140. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/intro_section.html +7 -6
  141. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/macros/records_list.html +2 -1
  142. invenio_app_rdm/theme/templates/semantic-ui/invenio_communities/default_static_page.html +26 -0
  143. invenio_app_rdm/theme/webpack.py +3 -2
  144. invenio_app_rdm/translations/ar/LC_MESSAGES/messages.mo +0 -0
  145. invenio_app_rdm/translations/ar/LC_MESSAGES/messages.po +972 -376
  146. invenio_app_rdm/translations/bg/LC_MESSAGES/messages.mo +0 -0
  147. invenio_app_rdm/translations/bg/LC_MESSAGES/messages.po +907 -278
  148. invenio_app_rdm/translations/ca/LC_MESSAGES/messages.mo +0 -0
  149. invenio_app_rdm/translations/ca/LC_MESSAGES/messages.po +912 -283
  150. invenio_app_rdm/translations/cs/LC_MESSAGES/messages.mo +0 -0
  151. invenio_app_rdm/translations/cs/LC_MESSAGES/messages.po +1069 -405
  152. invenio_app_rdm/translations/da/LC_MESSAGES/messages.mo +0 -0
  153. invenio_app_rdm/translations/da/LC_MESSAGES/messages.po +908 -273
  154. invenio_app_rdm/translations/de/LC_MESSAGES/messages.mo +0 -0
  155. invenio_app_rdm/translations/de/LC_MESSAGES/messages.po +1017 -406
  156. invenio_app_rdm/translations/el/LC_MESSAGES/messages.mo +0 -0
  157. invenio_app_rdm/translations/el/LC_MESSAGES/messages.po +915 -286
  158. invenio_app_rdm/translations/es/LC_MESSAGES/messages.mo +0 -0
  159. invenio_app_rdm/translations/es/LC_MESSAGES/messages.po +963 -371
  160. invenio_app_rdm/translations/et/LC_MESSAGES/messages.mo +0 -0
  161. invenio_app_rdm/translations/et/LC_MESSAGES/messages.po +938 -362
  162. invenio_app_rdm/translations/fa/LC_MESSAGES/messages.mo +0 -0
  163. invenio_app_rdm/translations/fa/LC_MESSAGES/messages.po +906 -277
  164. invenio_app_rdm/translations/fr/LC_MESSAGES/messages.mo +0 -0
  165. invenio_app_rdm/translations/fr/LC_MESSAGES/messages.po +1032 -375
  166. invenio_app_rdm/translations/hr/LC_MESSAGES/messages.mo +0 -0
  167. invenio_app_rdm/translations/hr/LC_MESSAGES/messages.po +907 -278
  168. invenio_app_rdm/translations/hu/LC_MESSAGES/messages.mo +0 -0
  169. invenio_app_rdm/translations/hu/LC_MESSAGES/messages.po +985 -369
  170. invenio_app_rdm/translations/it/LC_MESSAGES/messages.mo +0 -0
  171. invenio_app_rdm/translations/it/LC_MESSAGES/messages.po +928 -298
  172. invenio_app_rdm/translations/ja/LC_MESSAGES/messages.mo +0 -0
  173. invenio_app_rdm/translations/ja/LC_MESSAGES/messages.po +907 -278
  174. invenio_app_rdm/translations/ka/LC_MESSAGES/messages.mo +0 -0
  175. invenio_app_rdm/translations/ka/LC_MESSAGES/messages.po +909 -280
  176. invenio_app_rdm/translations/ko/LC_MESSAGES/messages.mo +0 -0
  177. invenio_app_rdm/translations/ko/LC_MESSAGES/messages.po +1361 -0
  178. invenio_app_rdm/translations/lt/LC_MESSAGES/messages.mo +0 -0
  179. invenio_app_rdm/translations/lt/LC_MESSAGES/messages.po +910 -281
  180. invenio_app_rdm/translations/messages.pot +486 -303
  181. invenio_app_rdm/translations/no/LC_MESSAGES/messages.mo +0 -0
  182. invenio_app_rdm/translations/no/LC_MESSAGES/messages.po +907 -278
  183. invenio_app_rdm/translations/pl/LC_MESSAGES/messages.mo +0 -0
  184. invenio_app_rdm/translations/pl/LC_MESSAGES/messages.po +907 -278
  185. invenio_app_rdm/translations/pt/LC_MESSAGES/messages.mo +0 -0
  186. invenio_app_rdm/translations/pt/LC_MESSAGES/messages.po +906 -277
  187. invenio_app_rdm/translations/ro/LC_MESSAGES/messages.mo +0 -0
  188. invenio_app_rdm/translations/ro/LC_MESSAGES/messages.po +1042 -384
  189. invenio_app_rdm/translations/ru/LC_MESSAGES/messages.mo +0 -0
  190. invenio_app_rdm/translations/ru/LC_MESSAGES/messages.po +1022 -370
  191. invenio_app_rdm/translations/sk/LC_MESSAGES/messages.mo +0 -0
  192. invenio_app_rdm/translations/sk/LC_MESSAGES/messages.po +916 -287
  193. invenio_app_rdm/translations/sv/LC_MESSAGES/messages.mo +0 -0
  194. invenio_app_rdm/translations/sv/LC_MESSAGES/messages.po +989 -380
  195. invenio_app_rdm/translations/tr/LC_MESSAGES/messages.mo +0 -0
  196. invenio_app_rdm/translations/tr/LC_MESSAGES/messages.po +992 -341
  197. invenio_app_rdm/translations/uk/LC_MESSAGES/messages.mo +0 -0
  198. invenio_app_rdm/translations/uk/LC_MESSAGES/messages.po +935 -356
  199. invenio_app_rdm/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  200. invenio_app_rdm/translations/zh_CN/LC_MESSAGES/messages.po +939 -347
  201. invenio_app_rdm/translations/zh_TW/LC_MESSAGES/messages.mo +0 -0
  202. invenio_app_rdm/translations/zh_TW/LC_MESSAGES/messages.po +907 -278
  203. invenio_app_rdm/upgrade_scripts/migrate_12_0_to_13_0.py +190 -62
  204. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/METADATA +118 -7
  205. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/RECORD +209 -225
  206. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/entry_points.txt +2 -0
  207. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/top_level.txt +0 -1
  208. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next-scanner.config.js +0 -64
  209. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package-lock.json +0 -1512
  210. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/compileCatalog.js +0 -40
  211. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/initCatalog.js +0 -20
  212. tests/__init__.py +0 -8
  213. tests/api/__init__.py +0 -8
  214. tests/api/conftest.py +0 -24
  215. tests/api/test_protect_files_rest.py +0 -73
  216. tests/api/test_record_api.py +0 -175
  217. tests/api/test_stats_api.py +0 -26
  218. tests/conftest.py +0 -390
  219. tests/fixtures/__init__.py +0 -8
  220. tests/fixtures/app_data/oai_sets.yaml +0 -3
  221. tests/fixtures/app_data/pages/about.html +0 -1
  222. tests/fixtures/app_data/pages.yaml +0 -4
  223. tests/fixtures/conftest.py +0 -27
  224. tests/fixtures/test_cli.py +0 -25
  225. tests/fixtures/test_fixtures.py +0 -46
  226. tests/mock_module/__init__.py +0 -7
  227. tests/mock_module/templates/mock_mail.html +0 -27
  228. tests/mock_module/views.py +0 -32
  229. tests/redirector/__init__.py +0 -8
  230. tests/redirector/conftest.py +0 -54
  231. tests/redirector/test_redirector.py +0 -28
  232. tests/test_tasks.py +0 -209
  233. tests/test_utils.py +0 -67
  234. tests/test_version.py +0 -16
  235. tests/test_views.py +0 -43
  236. tests/ui/__init__.py +0 -8
  237. tests/ui/conftest.py +0 -115
  238. tests/ui/test_deposits.py +0 -115
  239. tests/ui/test_export_formats.py +0 -37
  240. tests/ui/test_file_download.py +0 -73
  241. tests/ui/test_filters.py +0 -10
  242. tests/ui/test_robotstxt.py +0 -35
  243. tests/ui/test_signposting_ui.py +0 -95
  244. tests/ui/test_sitemaps.py +0 -85
  245. tests/ui/test_stats_ui.py +0 -92
  246. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/WHEEL +0 -0
  247. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/licenses/LICENSE +0 -0
@@ -1,9 +1,9 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2019-2024 CERN.
3
+ # Copyright (C) 2019-2025 CERN.
4
4
  # Copyright (C) 2019-2021 Northwestern University.
5
5
  # Copyright (C) 2021 TU Wien.
6
- # Copyright (C) 2022-2024 KTH Royal Institute of Technology
6
+ # Copyright (C) 2022-2025 KTH Royal Institute of Technology
7
7
  # Copyright (C) 2023-2024 Graz University of Technology.
8
8
  #
9
9
  # Invenio App RDM is free software; you can redistribute it and/or modify it
@@ -15,6 +15,9 @@ from copy import deepcopy
15
15
 
16
16
  from flask import current_app, g, redirect
17
17
  from flask_login import login_required
18
+ from invenio_communities.communities.resources.serializer import (
19
+ UICommunityJSONSerializer,
20
+ )
18
21
  from invenio_communities.errors import CommunityDeletedError
19
22
  from invenio_communities.proxies import current_communities
20
23
  from invenio_communities.views.communities import render_community_theme_template
@@ -25,6 +28,8 @@ from invenio_rdm_records.records.api import get_files_quota
25
28
  from invenio_rdm_records.resources.serializers import UIJSONSerializer
26
29
  from invenio_rdm_records.services.schemas import RDMRecordSchema
27
30
  from invenio_rdm_records.services.schemas.utils import dump_empty
31
+ from invenio_rdm_records.views import file_transfer_type
32
+ from invenio_records_resources.proxies import current_transfer_registry
28
33
  from invenio_records_resources.services.errors import PermissionDeniedError
29
34
  from invenio_search.engine import dsl
30
35
  from invenio_vocabularies.proxies import current_service as vocabulary_service
@@ -32,7 +37,11 @@ from invenio_vocabularies.records.models import VocabularyScheme
32
37
  from marshmallow_utils.fields.babel import gettext_from_dict
33
38
  from sqlalchemy.orm import load_only
34
39
 
35
- from ..utils import set_default_value
40
+ from ..utils import (
41
+ evaluate_file_modification,
42
+ evaluate_record_deletion,
43
+ set_default_value,
44
+ )
36
45
  from .decorators import (
37
46
  no_cache_response,
38
47
  pass_draft,
@@ -82,10 +91,12 @@ def get_form_pids_config(record=None):
82
91
  optional_doi_transitions["message"] = optional_doi_transitions.get(
83
92
  "message"
84
93
  ).format(sitename=sitename)
85
- if set(optional_doi_transitions["allowed_providers"]) - set(
86
- ["external", "not_needed"]
94
+ if (
95
+ "external" not in optional_doi_transitions["allowed_providers"]
96
+ and "not_needed"
97
+ not in optional_doi_transitions["allowed_providers"]
87
98
  ):
88
- # In case we have locally managed provider as an allowed one, we need to
99
+ # In case we have locally managed provider(s) as allowed ones, we need to
89
100
  # select it by default. That is relevant for the case when the
90
101
  # user creates a new version of the record and the previous version
91
102
  # had a datacite DOI.
@@ -98,9 +109,9 @@ def get_form_pids_config(record=None):
98
109
 
99
110
  pids_provider = {
100
111
  "scheme": scheme,
101
- "field_label": "Digital Object Identifier",
102
- "pid_label": "DOI",
103
- "pid_placeholder": "Copy/paste your existing DOI here...",
112
+ "field_label": _("Digital Object Identifier"),
113
+ "pid_label": _("DOI"),
114
+ "pid_placeholder": _("Copy/paste your existing DOI here..."),
104
115
  "can_be_managed": can_be_managed,
105
116
  "can_be_unmanaged": can_be_unmanaged,
106
117
  "btn_label_discard_pid": _(
@@ -200,10 +211,13 @@ class VocabulariesOptions:
200
211
  for hit in subset_resource_types.to_dict()["hits"]["hits"]
201
212
  ]
202
213
 
203
- def _dump_vocabulary_w_basic_fields(self, vocabulary_type):
214
+ def _dump_vocabulary_w_basic_fields(self, vocabulary_type, extra_filter=None):
204
215
  """Dump vocabulary with id and title field."""
205
216
  results = vocabulary_service.read_all(
206
- g.identity, fields=["id", "title"], type=vocabulary_type
217
+ g.identity,
218
+ fields=["id", "title"],
219
+ type=vocabulary_type,
220
+ extra_filter=extra_filter,
207
221
  )
208
222
  return [
209
223
  {
@@ -278,24 +292,40 @@ class VocabulariesOptions:
278
292
  """Dump linkable resource type vocabulary."""
279
293
  return self._resource_types(dsl.Q("term", tags="linkable"))
280
294
 
281
- def identifier_schemes(self):
282
- """Dump identifiers scheme (fake) vocabulary.
283
-
284
- "Fake" because identifiers scheme is not a vocabulary.
285
- """
295
+ def _dump_identifier_schemes(self, config_key):
296
+ """Dump identifier schemes from a given config key."""
286
297
  return [
287
298
  {"text": get_scheme_label(scheme), "value": scheme}
288
- for scheme in current_app.config.get("RDM_RECORDS_IDENTIFIERS_SCHEMES", {})
299
+ for scheme in current_app.config.get(config_key, {})
289
300
  ]
290
301
 
291
- def identifiers(self):
292
- """Dump related identifiers vocabulary."""
293
- self._vocabularies["identifiers"] = {
302
+ def _dump_identifiers(self, vocab_key, config_key):
303
+ """Dump identifiers vocabulary for a given vocab/config key pair."""
304
+ self._vocabularies[vocab_key] = {
294
305
  "relations": self.relation_types(),
295
306
  "resource_type": self.linkable_resource_types(),
296
- "scheme": self.identifier_schemes(),
307
+ "scheme": self._dump_identifier_schemes(config_key),
297
308
  }
298
309
 
310
+ def identifiers(self):
311
+ """Dump identifiers vocabulary."""
312
+ self._dump_identifiers("identifiers", "RDM_RECORDS_IDENTIFIERS_SCHEMES")
313
+
314
+ def related_identifiers(self):
315
+ """Dump related identifiers vocabulary."""
316
+ self._dump_identifiers(
317
+ "related_identifiers", "RDM_RECORDS_RELATED_IDENTIFIERS_SCHEMES"
318
+ )
319
+
320
+ def deletion_request_removal_reasons(self):
321
+ """Dump deletion request removal reasons vocabulary."""
322
+ self._vocabularies["deletion_request_removal_reasons"] = (
323
+ self._dump_vocabulary_w_basic_fields(
324
+ "removalreasons", extra_filter=dsl.Q("term", tags="deletion-request")
325
+ )
326
+ )
327
+ return self._vocabularies["deletion_request_removal_reasons"]
328
+
299
329
  def dump(self):
300
330
  """Dump into dict."""
301
331
  # TODO: Nest vocabularies inside "metadata" key so that frontend dumber
@@ -307,6 +337,8 @@ class VocabulariesOptions:
307
337
  self.contributor_roles()
308
338
  self.subjects()
309
339
  self.identifiers()
340
+ self.related_identifiers()
341
+ self.deletion_request_removal_reasons()
310
342
  # We removed
311
343
  # vocabularies["relation_type"] = _dump_relation_types_vocabulary()
312
344
  return self._vocabularies
@@ -328,6 +360,8 @@ def load_custom_fields():
328
360
  # for each custom field. This is the label shown at the top of the upload
329
361
  # form
330
362
  field_error_label = field.get("props", {}).get("label")
363
+ # Add the field ID to the props to allow overriding the React widgets of custom fields
364
+ field["props"]["id"] = field["field"]
331
365
  if field_error_label:
332
366
  error_labels[f"custom_fields.{field['field']}"] = field_error_label
333
367
  if getattr(field_instance, "relation_cls", None):
@@ -361,6 +395,7 @@ def get_form_config(**kwargs):
361
395
  cf for cf in custom_fields["ui"] if not cf.get("hide_from_upload_form", False)
362
396
  ]
363
397
  quota = deepcopy(conf.get("APP_RDM_DEPOSIT_FORM_QUOTA", {}))
398
+ max_file_size = conf.get("RDM_FILES_DEFAULT_MAX_FILE_SIZE", None)
364
399
  record_quota = kwargs.pop("quota", None)
365
400
  if record_quota:
366
401
  quota["maxStorage"] = record_quota["quota_size"]
@@ -375,7 +410,7 @@ def get_form_config(**kwargs):
375
410
  current_locale=str(current_i18n.locale),
376
411
  default_locale=conf.get("BABEL_DEFAULT_LOCALE", "en"),
377
412
  pids=get_form_pids_config(record=record),
378
- quota=quota,
413
+ quota=dict(**quota, maxFileSize=max_file_size),
379
414
  decimal_size_display=conf.get("APP_RDM_DISPLAY_DECIMAL_FILE_SIZES", True),
380
415
  links=dict(
381
416
  user_dashboard_request=conf["RDM_REQUESTS_ROUTES"][
@@ -387,10 +422,24 @@ def get_form_config(**kwargs):
387
422
  publish_modal_extra=current_app.config.get(
388
423
  "APP_RDM_DEPOSIT_FORM_PUBLISH_MODAL_EXTRA"
389
424
  ),
425
+ default_transfer_type=current_transfer_registry.default_transfer_type,
426
+ enabled_transfer_types=list(current_transfer_registry.get_transfer_types()),
427
+ transfer_types=file_transfer_type()["transfer_types"],
390
428
  **kwargs,
391
429
  )
392
430
 
393
431
 
432
+ def get_actual_files_quota(draft):
433
+ """Report the actual effective quota from the draft's bucket, if available."""
434
+ if draft is not None and draft.bucket is not None:
435
+ return {
436
+ "quota_size": draft.bucket.quota_size,
437
+ "max_file_size": draft.bucket.max_file_size,
438
+ }
439
+
440
+ return get_files_quota(draft)
441
+
442
+
394
443
  def get_search_url():
395
444
  """Get the search URL."""
396
445
  # TODO: this should not be used
@@ -427,7 +476,7 @@ def new_record():
427
476
  @login_required
428
477
  @no_cache_response
429
478
  @pass_draft_community
430
- def deposit_create(community=None):
479
+ def deposit_create(community=None, community_ui=None):
431
480
  """Create a new deposit."""
432
481
  can_create = current_rdm_records.records_service.check_permission(
433
482
  g.identity, "create"
@@ -437,7 +486,7 @@ def deposit_create(community=None):
437
486
 
438
487
  community_theme = None
439
488
  if community is not None:
440
- community_theme = community.get("theme", {})
489
+ community_theme = community_ui.get("theme", {})
441
490
 
442
491
  community_use_jinja_header = bool(community_theme)
443
492
  dashboard_routes = current_app.config["APP_RDM_USER_DASHBOARD_ROUTES"]
@@ -453,16 +502,17 @@ def deposit_create(community=None):
453
502
  forms_config=get_form_config(
454
503
  dashboard_routes=dashboard_routes,
455
504
  createUrl="/api/records",
456
- quota=get_files_quota(),
505
+ quota=get_actual_files_quota(None),
457
506
  hide_community_selection=community_use_jinja_header,
458
507
  is_doi_required=is_doi_required,
459
508
  ),
460
509
  searchbar_config=dict(searchUrl=get_search_url()),
461
510
  record=new_record(),
462
511
  community=community,
512
+ community_ui=community_ui,
463
513
  community_use_jinja_header=community_use_jinja_header,
464
514
  files=dict(default_preview=None, entries=[], links={}),
465
- preselectedCommunity=community,
515
+ preselectedCommunity=community_ui,
466
516
  files_locked=False,
467
517
  permissions=get_record_permissions(
468
518
  [
@@ -498,6 +548,24 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
498
548
  ui_serializer = UIJSONSerializer()
499
549
  record = ui_serializer.dump_obj(draft.to_dict())
500
550
 
551
+ published_record = None
552
+ if record["is_published"]:
553
+ published_record_result = service.read(
554
+ g.identity, id_=record["id"], expand=True
555
+ )
556
+ published_record = ui_serializer.dump_obj(published_record_result.to_dict())
557
+
558
+ record_deletion = evaluate_record_deletion(
559
+ published_record_result._record, g.identity
560
+ )
561
+ file_modification = evaluate_file_modification(
562
+ published_record_result._record, g.identity
563
+ )
564
+ else:
565
+ record_deletion = {}
566
+ file_modification = {}
567
+
568
+ community_ui = None
501
569
  community_theme = None
502
570
  community = record.get("expanded", {}).get("parent", {}).get("review", {}).get(
503
571
  "receiver"
@@ -512,6 +580,7 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
512
580
  id_=community["id"], identity=g.identity
513
581
  )
514
582
  community_theme = community.to_dict().get("theme", {})
583
+ community_ui = UICommunityJSONSerializer().dump_obj(community.to_dict())
515
584
  except CommunityDeletedError:
516
585
  pass
517
586
 
@@ -529,11 +598,12 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
529
598
  apiUrl=f"/api/records/{pid_value}/draft",
530
599
  dashboard_routes=dashboard_routes,
531
600
  # maybe quota should be serialized into the record e.g for admins
532
- quota=get_files_quota(draft._record),
601
+ quota=get_actual_files_quota(draft._record),
533
602
  # hide react community component
534
603
  hide_community_selection=community_use_jinja_header,
535
604
  is_doi_required=is_doi_required,
536
605
  record=draft._record,
606
+ published_record=published_record,
537
607
  )
538
608
 
539
609
  if is_doi_required and not record.get("pids", {}).get("doi"):
@@ -554,6 +624,7 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
554
624
  forms_config=form_config,
555
625
  record=record,
556
626
  community=community,
627
+ community_ui=community_ui,
557
628
  community_use_jinja_header=community_use_jinja_header,
558
629
  files=files_dict,
559
630
  searchbar_config=dict(searchUrl=get_search_url()),
@@ -567,6 +638,8 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
567
638
  "manage_record_access",
568
639
  ]
569
640
  ),
641
+ record_deletion=record_deletion,
642
+ file_modification=file_modification,
570
643
  )
571
644
 
572
645
 
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2019-2024 CERN.
3
+ # Copyright (C) 2019-2025 CERN.
4
4
  # Copyright (C) 2019-2020 Northwestern University.
5
5
  # Copyright (C) 2021 TU Wien.
6
6
  # Copyright (C) 2024 Graz University of Technology.
@@ -123,9 +123,16 @@ def order_entries(files):
123
123
 
124
124
  def get_scheme_label(scheme):
125
125
  """Convert backend scheme to frontend label."""
126
- scheme_to_label = current_app.config.get("RDM_RECORDS_IDENTIFIERS_SCHEMES", {})
126
+ configs = [
127
+ current_app.config.get("RDM_RECORDS_IDENTIFIERS_SCHEMES", {}),
128
+ current_app.config.get("RDM_RECORDS_RELATED_IDENTIFIERS_SCHEMES", {}),
129
+ ]
130
+
131
+ for cfg in configs:
132
+ if scheme in cfg:
133
+ return cfg[scheme].get("label", scheme)
127
134
 
128
- return scheme_to_label.get(scheme, {}).get("label", scheme)
135
+ return scheme
129
136
 
130
137
 
131
138
  def localize_number(value):
@@ -207,6 +214,6 @@ def transform_record(record, serializer, module=None, throws=True, **kwargs):
207
214
  if throws:
208
215
  raise Exception("No serializer found.")
209
216
  except Exception:
210
- current_app.logger.error("Record transformation failed.")
217
+ current_app.logger.exception("Record transformation failed.")
211
218
  if throws:
212
219
  raise
@@ -37,7 +37,7 @@ from invenio_app_rdm.records_ui.previewer.iiif_simple import (
37
37
  previewable_extensions as image_extensions,
38
38
  )
39
39
 
40
- from ..utils import get_external_resources
40
+ from ..utils import evaluate_record_deletion, get_external_resources
41
41
  from .decorators import (
42
42
  add_signposting_content_resources,
43
43
  add_signposting_landing_page,
@@ -52,7 +52,11 @@ from .decorators import (
52
52
  pass_record_media_files,
53
53
  pass_record_or_draft,
54
54
  )
55
- from .deposits import get_user_communities_memberships, load_custom_fields
55
+ from .deposits import (
56
+ VocabulariesOptions,
57
+ get_user_communities_memberships,
58
+ load_custom_fields,
59
+ )
56
60
 
57
61
 
58
62
  def get_record_community(record):
@@ -156,6 +160,16 @@ def record_detail(
156
160
  record._record.parent["access"]["settings"] = AccessSettings({}).dump()
157
161
 
158
162
  record_ui = UIJSONSerializer().dump_obj(record.to_dict())
163
+
164
+ record_deletion = evaluate_record_deletion(record._record, g.identity)
165
+
166
+ # The deletion options are only needed if the user is allowed to delete the given record.
167
+ record_deletion_options = (
168
+ VocabulariesOptions().deletion_request_removal_reasons()
169
+ if record_deletion["allowed"]
170
+ else []
171
+ )
172
+
159
173
  is_draft = record_ui["is_draft"]
160
174
  custom_fields = load_custom_fields()
161
175
  # keep only landing page configurable custom fields
@@ -216,19 +230,13 @@ def record_detail(
216
230
  if record is not None and emitter is not None:
217
231
  emitter(current_app, record=record._record, via_api=False)
218
232
 
219
- record_owner = (
220
- record_ui.get("expanded", {})
221
- .get("parent", {})
222
- .get("access", {})
223
- .get("owned_by", {})
224
- )
225
233
  resolved_community, _ = get_record_community(record_ui)
226
- resolved_community = (
234
+ resolved_community_ui = (
227
235
  UICommunityJSONSerializer().dump_obj(resolved_community.to_dict())
228
236
  if resolved_community
229
237
  else None
230
238
  )
231
- theme = resolved_community.get("theme", {}) if resolved_community else None
239
+ theme = resolved_community_ui.get("theme", {}) if resolved_community else None
232
240
 
233
241
  return render_community_theme_template(
234
242
  current_app.config.get("APP_RDM_RECORD_LANDING_PAGE_TEMPLATE"),
@@ -249,6 +257,8 @@ def record_detail(
249
257
  "view",
250
258
  "media_read_files",
251
259
  "moderate",
260
+ "request_deletion",
261
+ "immediately_delete",
252
262
  ]
253
263
  ),
254
264
  custom_fields_ui=custom_fields["ui"],
@@ -256,11 +266,11 @@ def record_detail(
256
266
  include_deleted=include_deleted,
257
267
  is_draft=is_draft,
258
268
  community=resolved_community,
269
+ community_ui=resolved_community_ui,
259
270
  external_resources=get_external_resources(record),
260
271
  user_avatar=avatar,
261
- record_owner_id=(
262
- record_owner.get("id")
263
- ), # record created with system_identity have not owners e.g demo
272
+ record_deletion=record_deletion,
273
+ record_deletion_options=record_deletion_options,
264
274
  )
265
275
 
266
276
 
@@ -0,0 +1,88 @@
1
+ {# -*- coding: utf-8 -*-
2
+
3
+ This file is part of Invenio.
4
+ Copyright (C) 2016-2025 CERN.
5
+
6
+ Invenio is free software; you can redistribute it and/or modify it
7
+ under the terms of the MIT License; see LICENSE file for more details.
8
+ #}
9
+
10
+ {% extends "invenio_requests/details/index.html" %}
11
+
12
+ {% set active_dashboard_menu_item = 'requests' %}
13
+ {% set active_community_header_menu_item = 'requests' %}
14
+
15
+ {%- block request_header %}
16
+ {% set back_button_url = url_for("invenio_app_rdm_users.requests") %}
17
+ {% from "invenio_requests/macros/request_header.html" import inclusion_request_header %}
18
+ {{ inclusion_request_header(
19
+ request=invenio_request,
20
+ record=record,
21
+ accepted=request_is_accepted,
22
+ back_button_url=back_button_url,
23
+ back_button_text=_("Back to requests")
24
+ ) }}
25
+ {%- endblock request_header %}
26
+
27
+ {% block request_timeline %}
28
+ <div
29
+ class="ui container rdm-tab-container fluid rel-pt-2 ml-0-mobile mr-0-mobile"
30
+ id="request-request-deletion-tab-container"
31
+ >
32
+ <div
33
+ class="ui secondary pointing menu rdm-tab-menu"
34
+ id="request-deletion-request-tab"
35
+ >
36
+ <a
37
+ class="active item"
38
+ data-tab="conversation"
39
+ role="tab"
40
+ aria-selected="true"
41
+ aria-controls="conversation-tab-panel"
42
+ id="conversation-tab"
43
+ >
44
+ {{ _("Conversation") }}
45
+ </a>
46
+
47
+ {% if record_ui %}
48
+ <a
49
+ role="tab"
50
+ class="item"
51
+ data-tab="record"
52
+ aria-selected="false"
53
+ aria-controls="record-tab-panel"
54
+ id="record-tab"
55
+ >
56
+ {{ _("Record") }}
57
+ </a>
58
+ {% endif %}
59
+ </div>
60
+
61
+ <div
62
+ class="ui bottom attached tab segment active borderless p-0"
63
+ data-tab="conversation"
64
+ role="tabpanel"
65
+ aria-labelledby="conversation-tab"
66
+ id="conversation-tab-panel"
67
+ >
68
+ {{ super() }}
69
+ </div>
70
+
71
+ {# The record tab content needs to be last since the HTML structure is complex and breaks following tab contents #}
72
+ {% if record_ui %}
73
+ <div
74
+ class="ui bottom attached tab segment borderless"
75
+ data-tab="record"
76
+ role="tabpanel"
77
+ aria-labelledby="record-tab"
78
+ id="record-tab-panel"
79
+ hidden="hidden"
80
+ >
81
+ {% set use_theme_basic_template = false %}
82
+ {% set preview_submission_request = true %}
83
+ {% include config.APP_RDM_RECORD_LANDING_PAGE_TEMPLATE %}
84
+ </div>
85
+ {% endif %}
86
+
87
+ </div>
88
+ {% endblock request_timeline %}
@@ -30,11 +30,11 @@
30
30
  {# only display the header for the receiver #}
31
31
  {%- set back_button_url = url_for("invenio_app_rdm_users.requests") %}
32
32
  {{ inclusion_request_header(
33
- back_button_url=back_button_url,
34
- back_button_text=_("Back to requests"),
35
- request=invenio_request,
36
- accepted=request_is_accepted
37
- ) }}
33
+ back_button_url=back_button_url,
34
+ back_button_text=_("Back to requests"),
35
+ request=invenio_request,
36
+ accepted=request_is_accepted
37
+ ) }}
38
38
 
39
39
  {%- else %}
40
40
  <div class="ui grid rel-mt-2">
@@ -0,0 +1,95 @@
1
+ {# -*- coding: utf-8 -*-
2
+
3
+ This file is part of Invenio.
4
+ Copyright (C) 2016-2025 CERN.
5
+
6
+ Invenio is free software; you can redistribute it and/or modify it
7
+ under the terms of the MIT License; see LICENSE file for more details.
8
+ #}
9
+
10
+ {% extends "invenio_requests/details/index.html" %}
11
+
12
+ {% set active_dashboard_menu_item = 'requests' %}
13
+ {% set active_community_header_menu_item = 'requests' %}
14
+
15
+ {%- block request_header %}
16
+ {% set back_button_url = url_for("invenio_app_rdm_users.requests") %}
17
+ {% from "invenio_requests/macros/request_header.html" import inclusion_request_header %}
18
+ {{ inclusion_request_header(
19
+ request=invenio_request,
20
+ record=record,
21
+ accepted=request_is_accepted,
22
+ back_button_url=back_button_url,
23
+ back_button_text=_("Back to requests")
24
+ ) }}
25
+
26
+ <div class="twelve wide column mt-10">
27
+ <p><strong>{{ _("Reason:") }}</strong> {{ invenio_request["payload"]["reason_label"] }}</p>
28
+ {%- if invenio_request["payload"]["comment"] %}
29
+ <p><strong>{{ _("Justification:") }}</strong> {{ invenio_request["payload"]["comment"] }}</p>
30
+ {%- endif %}
31
+ </div>
32
+ {%- endblock request_header %}
33
+
34
+ {% block request_timeline %}
35
+ <div
36
+ class="ui container rdm-tab-container fluid rel-pt-2 ml-0-mobile mr-0-mobile"
37
+ id="request-request-deletion-tab-container"
38
+ >
39
+ <div
40
+ class="ui secondary pointing menu rdm-tab-menu"
41
+ id="request-deletion-request-tab"
42
+ >
43
+ <a
44
+ class="active item"
45
+ data-tab="conversation"
46
+ role="tab"
47
+ aria-selected="true"
48
+ aria-controls="conversation-tab-panel"
49
+ id="conversation-tab"
50
+ >
51
+ {{ _("Conversation") }}
52
+ </a>
53
+
54
+ {% if record_ui %}
55
+ <a
56
+ role="tab"
57
+ class="item"
58
+ data-tab="record"
59
+ aria-selected="false"
60
+ aria-controls="record-tab-panel"
61
+ id="record-tab"
62
+ >
63
+ {{ _("Record") }}
64
+ </a>
65
+ {% endif %}
66
+ </div>
67
+
68
+ <div
69
+ class="ui bottom attached tab segment active borderless p-0"
70
+ data-tab="conversation"
71
+ role="tabpanel"
72
+ aria-labelledby="conversation-tab"
73
+ id="conversation-tab-panel"
74
+ >
75
+ {{ super() }}
76
+ </div>
77
+
78
+ {# The record tab content needs to be last since the HTML structure is complex and breaks following tab contents #}
79
+ {% if record_ui %}
80
+ <div
81
+ class="ui bottom attached tab segment borderless"
82
+ data-tab="record"
83
+ role="tabpanel"
84
+ aria-labelledby="record-tab"
85
+ id="record-tab-panel"
86
+ hidden="hidden"
87
+ >
88
+ {% set use_theme_basic_template = false %}
89
+ {% set preview_submission_request = true %}
90
+ {% include config.APP_RDM_RECORD_LANDING_PAGE_TEMPLATE %}
91
+ </div>
92
+ {% endif %}
93
+
94
+ </div>
95
+ {% endblock request_timeline %}