invenio-app-rdm 8.0.0.dev9__py2.py3-none-any.whl → 14.0.0b4.dev4__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 (515) hide show
  1. invenio_app_rdm/__init__.py +13 -4
  2. invenio_app_rdm/administration/__init__.py +8 -0
  3. invenio_app_rdm/administration/audit_logs/__init__.py +12 -0
  4. invenio_app_rdm/administration/audit_logs/audit_logs.py +81 -0
  5. invenio_app_rdm/administration/domains/__init__.py +22 -0
  6. invenio_app_rdm/administration/domains/domains.py +159 -0
  7. invenio_app_rdm/administration/moderation/__init__.py +11 -0
  8. invenio_app_rdm/administration/moderation/requests.py +175 -0
  9. invenio_app_rdm/administration/records/__init__.py +15 -0
  10. invenio_app_rdm/administration/records/records.py +163 -0
  11. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/audit_logs.html +14 -0
  12. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/domains_search.html +13 -0
  13. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/records/drafts.html +14 -0
  14. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/records/records.html +14 -0
  15. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests.html +14 -0
  16. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests_details.html +93 -0
  17. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/user_moderation.html +14 -0
  18. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/user_moderation_details.html +14 -0
  19. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/users_search.html +14 -0
  20. invenio_app_rdm/administration/user_moderation/__init__.py +11 -0
  21. invenio_app_rdm/administration/user_moderation/user_moderation.py +175 -0
  22. invenio_app_rdm/administration/users/__init__.py +12 -0
  23. invenio_app_rdm/administration/users/users.py +130 -0
  24. invenio_app_rdm/administration/views/__init__.py +11 -0
  25. invenio_app_rdm/administration/views/ui.py +21 -0
  26. invenio_app_rdm/cli.py +95 -0
  27. invenio_app_rdm/communities_ui/__init__.py +9 -0
  28. invenio_app_rdm/communities_ui/searchapp.py +27 -0
  29. invenio_app_rdm/communities_ui/sitemap.py +63 -0
  30. invenio_app_rdm/communities_ui/templates/semantic-ui/invenio_communities/collections/collection.html +60 -0
  31. invenio_app_rdm/communities_ui/templates/semantic-ui/invenio_communities/collections/macros.html +43 -0
  32. invenio_app_rdm/communities_ui/templates/semantic-ui/invenio_communities/details/browse/index.html +59 -0
  33. invenio_app_rdm/communities_ui/templates/semantic-ui/invenio_communities/records/index.html +24 -0
  34. invenio_app_rdm/communities_ui/views/__init__.py +13 -0
  35. invenio_app_rdm/communities_ui/views/communities.py +206 -0
  36. invenio_app_rdm/communities_ui/views/ui.py +93 -0
  37. invenio_app_rdm/config.py +1072 -182
  38. invenio_app_rdm/ext.py +157 -0
  39. invenio_app_rdm/fixtures/__init__.py +56 -0
  40. invenio_app_rdm/fixtures/data/oai_sets.yaml +6 -0
  41. invenio_app_rdm/fixtures/oai_sets.py +20 -0
  42. invenio_app_rdm/fixtures/pages/.gitkeep +1 -0
  43. invenio_app_rdm/fixtures/pages.py +76 -0
  44. invenio_app_rdm/records_ui/previewer/__init__.py +9 -0
  45. invenio_app_rdm/records_ui/previewer/iiif_simple.py +51 -0
  46. invenio_app_rdm/records_ui/searchapp.py +46 -232
  47. invenio_app_rdm/records_ui/sitemap.py +44 -0
  48. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html +63 -18
  49. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/detail.html +316 -169
  50. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/access-form.html +64 -0
  51. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/citation.html +4 -3
  52. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/contact.html +2 -1
  53. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/creatibutors.html +22 -20
  54. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/description.html +7 -5
  55. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/details.html +299 -167
  56. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/doi.html +3 -24
  57. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/meta.html +36 -0
  58. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/citations.html +6 -0
  59. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/communities.html +34 -0
  60. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/details.html +20 -15
  61. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/export.html +18 -41
  62. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/external_resources.html +55 -0
  63. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/keywords_subjects.html +9 -5
  64. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/licenses.html +62 -49
  65. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/locations.html +23 -0
  66. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/manage_menu.html +33 -6
  67. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/metrics.html +5 -9
  68. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/technical_metadata.html +21 -0
  69. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/versions.html +15 -5
  70. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/stats.html +112 -90
  71. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/subjects.html +21 -19
  72. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/draft_not_found.html +17 -0
  73. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/export.html +3 -2
  74. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/iiif_preview.html +3 -7
  75. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/creatibutors.html +69 -48
  76. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/detail.html +234 -49
  77. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/doi.html +36 -0
  78. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/files.html +170 -71
  79. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/locations.html +62 -0
  80. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/stats_popup.html +21 -0
  81. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/version.html +3 -2
  82. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/restricted_with_doi_tombstone.html +33 -0
  83. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/search.html +3 -1
  84. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/tombstone.html +55 -12
  85. invenio_app_rdm/records_ui/utils.py +127 -2
  86. invenio_app_rdm/records_ui/views/__init__.py +114 -38
  87. invenio_app_rdm/records_ui/views/decorators.py +395 -117
  88. invenio_app_rdm/records_ui/views/deposits.py +414 -104
  89. invenio_app_rdm/records_ui/views/filters.py +118 -11
  90. invenio_app_rdm/records_ui/views/records.py +395 -66
  91. invenio_app_rdm/redirector/__init__.py +8 -0
  92. invenio_app_rdm/redirector/resource.py +106 -0
  93. invenio_app_rdm/redirector/views.py +18 -0
  94. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/community-inclusion/index.html +14 -0
  95. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/community-invitation/community_dashboard.html +38 -0
  96. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/community-invitation/user_dashboard.html +26 -0
  97. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/community-submission/index.html +129 -0
  98. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/file-modification/index.html +88 -0
  99. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/guest-access-request/index.html +66 -0
  100. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/macros/request_header.html +78 -0
  101. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/record-deletion/index.html +95 -0
  102. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/subcommunity/index.html +49 -0
  103. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/subcommunity-invitation/index.html +49 -0
  104. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/user-access-request/index.html +59 -0
  105. invenio_app_rdm/requests_ui/views/__init__.py +1 -3
  106. invenio_app_rdm/requests_ui/views/requests.py +345 -53
  107. invenio_app_rdm/requests_ui/views/ui.py +38 -9
  108. invenio_app_rdm/tasks.py +45 -0
  109. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/AuditLogActions.js +136 -0
  110. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewJson.js +35 -0
  111. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewRecentChanges.js +119 -0
  112. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/index.js +31 -0
  113. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/search/SearchResultItemLayout.js +87 -0
  114. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/search/index.js +9 -0
  115. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/CompareRevisionsDropdown.js +89 -0
  116. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUser.js +92 -0
  117. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUserForm.js +199 -0
  118. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js +80 -0
  119. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaAction.js +109 -0
  120. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaForm.js +196 -0
  121. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/index.js +9 -0
  122. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domains/index.js +27 -0
  123. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domains/search/SearchResultItemLayout.js +185 -0
  124. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domains/search/index.js +9 -0
  125. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/drafts/index.js +32 -0
  126. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/CompareRevisions.js +129 -0
  127. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RecordActions.js +75 -0
  128. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RecordResourceActions.js +185 -0
  129. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RemovalReasonsSelect.js +85 -0
  130. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RestoreConfirmation.js +108 -0
  131. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/TombstoneForm.js +212 -0
  132. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/api.js +38 -0
  133. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/index.js +9 -0
  134. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js +30 -0
  135. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/index.js +40 -0
  136. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/AdministrationSearchLayout.js +56 -0
  137. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/RecordSearchLayout.js +84 -0
  138. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/SearchResultItemLayout.js +171 -0
  139. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/filters/DeletionStatusFilter.js +121 -0
  140. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/filters/index.js +9 -0
  141. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/index.js +10 -0
  142. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchResultItem.js +79 -0
  143. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchbarLayout.js +48 -0
  144. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/index.js +22 -0
  145. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/userModeration/ModerationActions.js +103 -0
  146. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/userModeration/index.js +29 -0
  147. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/userModeration/search/SearchResultItemLayout.js +151 -0
  148. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/userModeration/search/UserModerationBulkActions.js +0 -0
  149. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/userModeration/search/UserModerationSearchLayout.js +56 -0
  150. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/userModeration/search/index.js +10 -0
  151. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/UserActions.js +263 -0
  152. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/api/api.js +42 -0
  153. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/api/index.js +8 -0
  154. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/api/routes.js +38 -0
  155. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/index.js +30 -0
  156. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/search/SearchResultItemLayout.js +202 -0
  157. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/search/UserSearchLayout.js +81 -0
  158. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/search/filters/UserStatusFilterComponent.js +114 -0
  159. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/search/filters/index.js +1 -0
  160. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/users/search/index.js +10 -0
  161. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/collectionRecordsSearch/index.js +61 -0
  162. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/CommunityRecordsSearchAppLayout.js +84 -0
  163. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/CommunityRecordsSearchBarElement.js +44 -0
  164. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/CommunityRecordsSingleSearchBarElement.js +46 -0
  165. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/components.js +3 -0
  166. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/index.js +66 -0
  167. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CompactStats.js +52 -0
  168. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CopyButton.js +61 -39
  169. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/DisplayPartOfCommunities.js +78 -0
  170. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/DisplayVerifiedCommunity.js +54 -0
  171. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/FileModificationUntil.js +45 -0
  172. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionModal.js +354 -0
  173. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionRadioGroup.js +44 -0
  174. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion.js +81 -0
  175. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordsResultsListItem.js +189 -0
  176. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +788 -307
  177. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/ShareDraftButton.js +65 -0
  178. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/config.js +48 -0
  179. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js +27 -13
  180. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/frontpage/RecordsList.js +165 -0
  181. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/frontpage/index.js +23 -0
  182. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/AccessRequestForm.js +254 -0
  183. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/CommunitiesManagement.js +179 -0
  184. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/CommunitiesManagementDropdown.js +186 -0
  185. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/EditButton.js +30 -16
  186. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ExportDropdown.js +68 -0
  187. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ManageButton.js +140 -0
  188. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ManageDefaultBrandingAction/ManageDefaultBrandingAction.js +129 -0
  189. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/PendingCommunitiesModal/PendingCommunitiesModal.js +63 -0
  190. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/PendingCommunitiesModal/PendingCommunitiesSearch.js +89 -0
  191. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/PendingCommunitiesModal/PendingCommunityRequestItem.js +33 -0
  192. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCitationField.js +68 -73
  193. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesList.js +150 -0
  194. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesListModal/RecordCommunitiesListModal.js +90 -0
  195. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesListModal/RecordCommunitiesSearch.js +109 -0
  196. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesListModal/RecordCommunitiesSearchItem.js +58 -0
  197. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesListModal/index.js +3 -0
  198. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitySubmission/RecordCommunitySubmissionModal.js +171 -0
  199. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js +123 -43
  200. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordVersionsList.js +143 -79
  201. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RemoveFromCommunity/RemoveFromCommunityAction.js +188 -0
  202. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/AccessDropdown.js +93 -0
  203. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/CreateAccessLink.js +111 -0
  204. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/LinksSearchItem.js +170 -0
  205. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/LinksSearchResultContainer.js +236 -0
  206. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/LinksTab.js +106 -0
  207. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessRequests/AccessRequestsTab.js +239 -0
  208. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/AccessUsersGroups.js +178 -0
  209. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/AddUserGroupAccessModal.js +172 -0
  210. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/GroupsTab.js +88 -0
  211. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/PeopleTab.js +88 -0
  212. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/UserGroupAccessSearchResultItem.js +158 -0
  213. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/{ShareButton.js → ShareOptions/ShareButton.js} +23 -6
  214. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/ShareModal.js +252 -0
  215. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/api/api.js +39 -0
  216. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/access.js +24 -0
  217. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js +92 -124
  218. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js +131 -0
  219. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/overridableRegistry/index.js +13 -0
  220. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/overridableRegistry/mapping.js +12 -0
  221. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/AccessRequestExpiration.js +61 -0
  222. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/index.js +1 -0
  223. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/AccessRequestTimelineEdit.js +177 -0
  224. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/AccessRequestTimelineRead.js +50 -0
  225. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/overrides/TimelineFeedHeader.js +34 -0
  226. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/search/components.js +165 -299
  227. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/search/index.js +48 -20
  228. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/subcommunity/browse.js +28 -0
  229. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/theme.js +164 -0
  230. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/base.js +210 -0
  231. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/communities.js +56 -0
  232. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/requests.js +78 -0
  233. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/uploads.js +210 -0
  234. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/uploads_items/ComputerTabletUploadsItem.js +155 -0
  235. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/uploads_items/MobileUploadsItem.js +154 -0
  236. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/utils.js +85 -74
  237. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/file_uploader/uppy.less +37 -0
  238. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page/creatibutors.less +26 -70
  239. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page/licenses.less +5 -5
  240. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/previewer/iiif_simple.less +16 -0
  241. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/form.overrides +170 -4
  242. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/form.variables +3 -5
  243. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/grid.overrides +110 -17
  244. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/grid.variables +3 -5
  245. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/menu.overrides +395 -4
  246. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/menu.variables +3 -5
  247. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/message.overrides +34 -8
  248. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/message.variables +6 -9
  249. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/table.overrides +185 -0
  250. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/collections/table.variables +1 -0
  251. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/button.overrides +103 -15
  252. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/button.variables +5 -4
  253. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/container.overrides +121 -13
  254. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/container.variables +6 -4
  255. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/header.overrides +61 -4
  256. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/header.variables +3 -5
  257. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/icon.overrides +29 -4
  258. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/icon.variables +3 -5
  259. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/image.overrides +115 -0
  260. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/image.variables +4 -0
  261. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/input.overrides +50 -4
  262. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/input.variables +5 -4
  263. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/label.overrides +116 -0
  264. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/label.variables +0 -0
  265. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/list.overrides +68 -37
  266. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/list.variables +3 -5
  267. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/segment.overrides +80 -7
  268. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/segment.variables +3 -5
  269. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/reset.overrides +3 -5
  270. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/reset.variables +3 -5
  271. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides +557 -5
  272. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.variables +142 -4
  273. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.overrides +161 -0
  274. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.variables +9 -0
  275. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/checkbox.overrides +3 -5
  276. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/checkbox.variables +3 -5
  277. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/dropdown.overrides +116 -12
  278. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/dropdown.variables +4 -5
  279. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/modal.overrides +151 -0
  280. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/modal.variables +5 -0
  281. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/search.overrides +7 -0
  282. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/search.variables +0 -0
  283. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/tab.overrides +3 -23
  284. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/tab.variables +3 -5
  285. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/transition.overrides +67 -0
  286. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/transition.variables +3 -0
  287. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/theme.less +71 -0
  288. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/views/card.overrides +168 -0
  289. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/views/card.variables +2 -0
  290. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/views/feed.overrides +463 -0
  291. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/views/feed.variables +1 -0
  292. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/views/item.overrides +164 -10
  293. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/views/item.variables +0 -0
  294. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next.js +1 -1
  295. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/_generatedTranslations.js +66 -0
  296. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ar/messages.po +951 -0
  297. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ar/translations.json +307 -0
  298. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/bg/messages.po +895 -0
  299. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/bg/translations.json +283 -0
  300. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ca/messages.po +896 -0
  301. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ca/translations.json +283 -0
  302. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/cs/messages.po +961 -0
  303. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/cs/translations.json +295 -0
  304. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/da/messages.po +897 -0
  305. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/da/translations.json +283 -0
  306. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/de/messages.po +830 -160
  307. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/de/translations.json +282 -88
  308. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/el/messages.po +883 -4
  309. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/el/translations.json +259 -65
  310. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/en/messages.po +1000 -5
  311. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/en/translations.json +290 -63
  312. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/es/messages.po +960 -0
  313. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/es/translations.json +283 -0
  314. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/et/messages.po +896 -0
  315. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/et/translations.json +283 -0
  316. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fa/messages.po +895 -0
  317. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fa/translations.json +283 -0
  318. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fr/messages.po +960 -0
  319. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fr/translations.json +283 -0
  320. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hr/messages.po +901 -0
  321. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hr/translations.json +289 -0
  322. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hu/messages.po +952 -0
  323. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hu/translations.json +283 -0
  324. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/index.js +17 -6
  325. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/it/messages.po +905 -0
  326. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/it/translations.json +283 -0
  327. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ja/messages.po +889 -0
  328. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ja/translations.json +277 -0
  329. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ka/messages.po +895 -0
  330. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ka/translations.json +283 -0
  331. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ko/messages.po +889 -0
  332. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ko/translations.json +277 -0
  333. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/lt/messages.po +907 -0
  334. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/lt/translations.json +295 -0
  335. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/no/messages.po +895 -0
  336. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/no/translations.json +283 -0
  337. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pl/messages.po +910 -0
  338. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pl/translations.json +295 -0
  339. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pt/messages.po +901 -0
  340. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pt/translations.json +283 -0
  341. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ro/messages.po +908 -0
  342. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ro/translations.json +289 -0
  343. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ru/messages.po +958 -0
  344. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ru/translations.json +295 -0
  345. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sk/messages.po +908 -0
  346. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sk/translations.json +295 -0
  347. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sv/messages.po +951 -0
  348. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sv/translations.json +283 -0
  349. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/tr/messages.po +952 -0
  350. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/tr/translations.json +283 -0
  351. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/uk/messages.po +910 -0
  352. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/uk/translations.json +295 -0
  353. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_CN/messages.po +891 -0
  354. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_CN/translations.json +277 -0
  355. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_TW/messages.po +889 -0
  356. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_TW/translations.json +277 -0
  357. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package.json +5 -8
  358. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/translations.pot +872 -142
  359. invenio_app_rdm/theme/static/images/gnd-icon.svg +27 -0
  360. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/administration_page.html +19 -0
  361. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/default_static_page.html +33 -0
  362. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/files_integrity_report/email/files_integrity_report.html +31 -0
  363. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/footer.html +32 -79
  364. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/frontpage.html +40 -57
  365. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/header.html +114 -76
  366. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/header_frontpage.html +16 -13
  367. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/header_login.html +151 -61
  368. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.de.html +3 -3
  369. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.en.html +12 -7
  370. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.sv.html +254 -0
  371. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/statistics.en.html +197 -0
  372. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/statistics.sv.html +196 -0
  373. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/versioning.en.html +149 -0
  374. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/versioning.sv.html +143 -0
  375. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/intro_section.html +98 -0
  376. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/javascript.html +12 -0
  377. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/macros/records_list.html +50 -0
  378. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/page.html +36 -0
  379. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/page_cover.html +13 -0
  380. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/robots.txt +15 -0
  381. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/searchbar.html +63 -0
  382. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/settings/notifications.html +17 -0
  383. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/site_footer.html +29 -0
  384. invenio_app_rdm/theme/templates/semantic-ui/invenio_communities/default_static_page.html +26 -0
  385. invenio_app_rdm/theme/templates/semantic-ui/invenio_previewer/latest_record.html +18 -0
  386. invenio_app_rdm/theme/templates/semantic-ui/invenio_previewer/rdm_abstract_previewer.html +30 -0
  387. invenio_app_rdm/theme/templates/themes/default/invenio_app_rdm/header.html +147 -0
  388. invenio_app_rdm/theme/templates/themes/default/invenio_app_rdm/site_footer.html +42 -0
  389. invenio_app_rdm/theme/views.py +106 -37
  390. invenio_app_rdm/theme/webpack.py +72 -36
  391. invenio_app_rdm/translations/ar/LC_MESSAGES/messages.mo +0 -0
  392. invenio_app_rdm/translations/ar/LC_MESSAGES/messages.po +1389 -0
  393. invenio_app_rdm/translations/bg/LC_MESSAGES/messages.mo +0 -0
  394. invenio_app_rdm/translations/bg/LC_MESSAGES/messages.po +1361 -0
  395. invenio_app_rdm/translations/ca/LC_MESSAGES/messages.mo +0 -0
  396. invenio_app_rdm/translations/ca/LC_MESSAGES/messages.po +1362 -0
  397. invenio_app_rdm/translations/cs/LC_MESSAGES/messages.mo +0 -0
  398. invenio_app_rdm/translations/cs/LC_MESSAGES/messages.po +1398 -0
  399. invenio_app_rdm/translations/da/LC_MESSAGES/messages.mo +0 -0
  400. invenio_app_rdm/translations/da/LC_MESSAGES/messages.po +1363 -0
  401. invenio_app_rdm/translations/de/LC_MESSAGES/messages.mo +0 -0
  402. invenio_app_rdm/translations/de/LC_MESSAGES/messages.po +1085 -372
  403. invenio_app_rdm/translations/el/LC_MESSAGES/messages.mo +0 -0
  404. invenio_app_rdm/translations/el/LC_MESSAGES/messages.po +987 -367
  405. invenio_app_rdm/translations/es/LC_MESSAGES/messages.mo +0 -0
  406. invenio_app_rdm/translations/es/LC_MESSAGES/messages.po +1389 -0
  407. invenio_app_rdm/translations/et/LC_MESSAGES/messages.mo +0 -0
  408. invenio_app_rdm/translations/et/LC_MESSAGES/messages.po +1364 -0
  409. invenio_app_rdm/translations/fa/LC_MESSAGES/messages.mo +0 -0
  410. invenio_app_rdm/translations/fa/LC_MESSAGES/messages.po +1361 -0
  411. invenio_app_rdm/translations/fr/LC_MESSAGES/messages.mo +0 -0
  412. invenio_app_rdm/translations/fr/LC_MESSAGES/messages.po +1390 -0
  413. invenio_app_rdm/translations/hr/LC_MESSAGES/messages.mo +0 -0
  414. invenio_app_rdm/translations/hr/LC_MESSAGES/messages.po +1361 -0
  415. invenio_app_rdm/translations/hu/LC_MESSAGES/messages.mo +0 -0
  416. invenio_app_rdm/translations/hu/LC_MESSAGES/messages.po +1402 -0
  417. invenio_app_rdm/translations/it/LC_MESSAGES/messages.mo +0 -0
  418. invenio_app_rdm/translations/it/LC_MESSAGES/messages.po +1366 -0
  419. invenio_app_rdm/translations/ja/LC_MESSAGES/messages.mo +0 -0
  420. invenio_app_rdm/translations/ja/LC_MESSAGES/messages.po +1361 -0
  421. invenio_app_rdm/translations/ka/LC_MESSAGES/messages.mo +0 -0
  422. invenio_app_rdm/translations/ka/LC_MESSAGES/messages.po +1361 -0
  423. invenio_app_rdm/translations/ko/LC_MESSAGES/messages.mo +0 -0
  424. invenio_app_rdm/translations/ko/LC_MESSAGES/messages.po +1361 -0
  425. invenio_app_rdm/translations/lt/LC_MESSAGES/messages.mo +0 -0
  426. invenio_app_rdm/translations/lt/LC_MESSAGES/messages.po +1361 -0
  427. invenio_app_rdm/translations/messages.pot +1046 -271
  428. invenio_app_rdm/translations/no/LC_MESSAGES/messages.mo +0 -0
  429. invenio_app_rdm/translations/no/LC_MESSAGES/messages.po +1361 -0
  430. invenio_app_rdm/translations/pl/LC_MESSAGES/messages.mo +0 -0
  431. invenio_app_rdm/translations/pl/LC_MESSAGES/messages.po +1361 -0
  432. invenio_app_rdm/translations/pt/LC_MESSAGES/messages.mo +0 -0
  433. invenio_app_rdm/translations/pt/LC_MESSAGES/messages.po +1361 -0
  434. invenio_app_rdm/translations/ro/LC_MESSAGES/messages.mo +0 -0
  435. invenio_app_rdm/translations/ro/LC_MESSAGES/messages.po +1391 -0
  436. invenio_app_rdm/translations/ru/LC_MESSAGES/messages.mo +0 -0
  437. invenio_app_rdm/translations/ru/LC_MESSAGES/messages.po +1384 -0
  438. invenio_app_rdm/translations/sk/LC_MESSAGES/messages.mo +0 -0
  439. invenio_app_rdm/translations/sk/LC_MESSAGES/messages.po +1362 -0
  440. invenio_app_rdm/translations/sv/LC_MESSAGES/messages.mo +0 -0
  441. invenio_app_rdm/translations/sv/LC_MESSAGES/messages.po +1400 -0
  442. invenio_app_rdm/translations/tr/LC_MESSAGES/messages.mo +0 -0
  443. invenio_app_rdm/translations/tr/LC_MESSAGES/messages.po +1340 -63
  444. invenio_app_rdm/translations/uk/LC_MESSAGES/messages.mo +0 -0
  445. invenio_app_rdm/translations/uk/LC_MESSAGES/messages.po +1363 -0
  446. invenio_app_rdm/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  447. invenio_app_rdm/translations/zh_CN/LC_MESSAGES/messages.po +1363 -0
  448. invenio_app_rdm/translations/zh_TW/LC_MESSAGES/messages.mo +0 -0
  449. invenio_app_rdm/translations/zh_TW/LC_MESSAGES/messages.po +1361 -0
  450. invenio_app_rdm/upgrade_scripts/fix_migrated_records_from_1_0_to_2_0.py +1 -0
  451. invenio_app_rdm/upgrade_scripts/fix_migrated_records_from_8_0_to_9_0.py +90 -0
  452. invenio_app_rdm/upgrade_scripts/migrate_10_0_to_11_0.py +47 -0
  453. invenio_app_rdm/upgrade_scripts/migrate_11_0_to_12_0.py +205 -0
  454. invenio_app_rdm/upgrade_scripts/migrate_12_0_to_13_0.py +235 -0
  455. invenio_app_rdm/upgrade_scripts/migrate_13_0_to_14_0.py +268 -0
  456. invenio_app_rdm/upgrade_scripts/migrate_2_0_to_3_0.py +7 -3
  457. invenio_app_rdm/upgrade_scripts/migrate_3_0_to_4_0.py +4 -6
  458. invenio_app_rdm/upgrade_scripts/migrate_4_0_to_6_0.py +30 -43
  459. invenio_app_rdm/upgrade_scripts/migrate_6_0_to_7_0.py +1 -5
  460. invenio_app_rdm/upgrade_scripts/migrate_7_0_to_8_0.py +7 -11
  461. invenio_app_rdm/upgrade_scripts/migrate_8_0_to_9_0.py +98 -0
  462. invenio_app_rdm/upgrade_scripts/migrate_9_0_to_10_0.py +43 -0
  463. invenio_app_rdm/users/schemas.py +27 -0
  464. invenio_app_rdm/users_ui/__init__.py +9 -0
  465. invenio_app_rdm/users_ui/searchapp.py +53 -0
  466. invenio_app_rdm/users_ui/templates/semantic-ui/invenio_app_rdm/users/base.html +21 -0
  467. invenio_app_rdm/users_ui/templates/semantic-ui/invenio_app_rdm/users/communities.html +25 -0
  468. invenio_app_rdm/users_ui/templates/semantic-ui/invenio_app_rdm/users/header.html +46 -0
  469. invenio_app_rdm/users_ui/templates/semantic-ui/invenio_app_rdm/users/requests.html +24 -0
  470. invenio_app_rdm/users_ui/templates/semantic-ui/invenio_app_rdm/users/uploads.html +25 -0
  471. invenio_app_rdm/users_ui/views/__init__.py +14 -0
  472. invenio_app_rdm/users_ui/views/dashboard.py +59 -0
  473. invenio_app_rdm/users_ui/views/ui.py +68 -0
  474. invenio_app_rdm/utils/files.py +120 -0
  475. invenio_app_rdm/views.py +21 -0
  476. invenio_app_rdm-14.0.0b4.dev4.dist-info/METADATA +627 -0
  477. invenio_app_rdm-14.0.0b4.dev4.dist-info/RECORD +508 -0
  478. {invenio_app_rdm-8.0.0.dev9.dist-info → invenio_app_rdm-14.0.0b4.dev4.dist-info}/WHEEL +1 -1
  479. invenio_app_rdm-14.0.0b4.dev4.dist-info/entry_points.txt +44 -0
  480. invenio_app_rdm/admin.py +0 -36
  481. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/dashboard.html +0 -47
  482. invenio_app_rdm/records_ui/views/utils.py +0 -27
  483. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/Image.js +0 -36
  484. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareModal.js +0 -257
  485. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/components/base.js +0 -140
  486. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/components/communities.js +0 -200
  487. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/components/requests.js +0 -394
  488. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/components/uploads.js +0 -287
  489. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/user_dashboard/index.js +0 -155
  490. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm_requests/menuTabInit.js +0 -24
  491. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/deposit.less +0 -158
  492. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/export_page.less +0 -20
  493. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/footer.less +0 -88
  494. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/frontpage.less +0 -97
  495. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page/details.less +0 -53
  496. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page/sidebar.less +0 -47
  497. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page.less +0 -423
  498. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/navbar.less +0 -305
  499. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/search.less +0 -52
  500. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme.less +0 -492
  501. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/variables.less +0 -60
  502. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm_requests/theme.less +0 -22
  503. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next-scanner.config.js +0 -63
  504. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package-lock.json +0 -1512
  505. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/compileCatalog.js +0 -39
  506. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/initCatalog.js +0 -20
  507. invenio_app_rdm/theme/templates/semantic-ui/invenio_requests/community-submission/index.html +0 -67
  508. invenio_app_rdm/version.py +0 -23
  509. invenio_app_rdm-8.0.0.dev9.dist-info/AUTHORS.rst +0 -11
  510. invenio_app_rdm-8.0.0.dev9.dist-info/METADATA +0 -74
  511. invenio_app_rdm-8.0.0.dev9.dist-info/RECORD +0 -179
  512. invenio_app_rdm-8.0.0.dev9.dist-info/entry_points.txt +0 -14
  513. /invenio_app_rdm/{translations/.gitkeep → fixtures/data/pages.yaml} +0 -0
  514. {invenio_app_rdm-8.0.0.dev9.dist-info → invenio_app_rdm-14.0.0b4.dev4.dist-info/licenses}/LICENSE +0 -0
  515. {invenio_app_rdm-8.0.0.dev9.dist-info → invenio_app_rdm-14.0.0b4.dev4.dist-info}/top_level.txt +0 -0
@@ -1,40 +1,61 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2019-2021 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-2025 KTH Royal Institute of Technology
7
+ # Copyright (C) 2023-2024 Graz University of Technology.
6
8
  #
7
9
  # Invenio App RDM is free software; you can redistribute it and/or modify it
8
10
  # under the terms of the MIT License; see LICENSE file for more details.
9
11
 
10
12
  """Routes for record-related pages provided by Invenio-App-RDM."""
11
13
 
12
- from elasticsearch_dsl import Q
13
- from flask import current_app, g, render_template
14
- from flask_babelex import lazy_gettext as _
14
+ from copy import deepcopy
15
+
16
+ from flask import current_app, g, redirect
15
17
  from flask_login import login_required
16
- from invenio_access.permissions import system_identity
18
+ from invenio_communities.communities.resources.serializer import (
19
+ UICommunityJSONSerializer,
20
+ )
21
+ from invenio_communities.errors import CommunityDeletedError
22
+ from invenio_communities.proxies import current_communities
23
+ from invenio_communities.views.communities import render_community_theme_template
24
+ from invenio_i18n import lazy_gettext as _
17
25
  from invenio_i18n.ext import current_i18n
18
26
  from invenio_rdm_records.proxies import current_rdm_records
27
+ from invenio_rdm_records.records.api import get_files_quota
19
28
  from invenio_rdm_records.resources.serializers import UIJSONSerializer
20
29
  from invenio_rdm_records.services.schemas import RDMRecordSchema
21
30
  from invenio_rdm_records.services.schemas.utils import dump_empty
22
- from invenio_userprofiles import current_userprofile
31
+ from invenio_rdm_records.views import file_transfer_type
32
+ from invenio_records_resources.proxies import current_transfer_registry
33
+ from invenio_records_resources.services.errors import PermissionDeniedError
34
+ from invenio_search.engine import dsl
23
35
  from invenio_vocabularies.proxies import current_service as vocabulary_service
24
36
  from invenio_vocabularies.records.models import VocabularyScheme
25
37
  from marshmallow_utils.fields.babel import gettext_from_dict
26
38
  from sqlalchemy.orm import load_only
27
39
 
28
- from ..utils import set_default_value
29
- from .decorators import pass_draft, pass_draft_community, pass_draft_files
40
+ from ..utils import (
41
+ evaluate_file_modification,
42
+ evaluate_record_deletion,
43
+ set_default_value,
44
+ )
45
+ from .decorators import (
46
+ no_cache_response,
47
+ pass_draft,
48
+ pass_draft_community,
49
+ pass_draft_files,
50
+ secret_link_or_login_required,
51
+ )
30
52
  from .filters import get_scheme_label
31
- from .utils import get_community_uuid
32
53
 
33
54
 
34
55
  #
35
56
  # Helpers
36
57
  #
37
- def get_form_pids_config():
58
+ def get_form_pids_config(record=None):
38
59
  """Prepare configuration for the pids field.
39
60
 
40
61
  Currently supporting only doi.
@@ -44,37 +65,89 @@ def get_form_pids_config():
44
65
  # FIXME: User provider.is_managed() requires tiny fix in config
45
66
  can_be_managed = True
46
67
  can_be_unmanaged = True
68
+ # We initialize the optional doi to empty to indicate that there is no restriction on the transitions
69
+ # This is valid for new uploads and when the DOI is required in an instance
70
+ optional_doi_transitions = []
47
71
  for scheme in service.config.pids_providers.keys():
48
72
  if not scheme == "doi":
49
73
  continue
74
+
50
75
  record_pid_config = current_app.config["RDM_PERSISTENT_IDENTIFIERS"]
51
76
  scheme_label = record_pid_config.get(scheme, {}).get("label", scheme)
77
+ is_doi_required = record_pid_config.get(scheme, {}).get("required")
78
+ default_selected = (
79
+ record_pid_config.get(scheme, {}).get("ui", {}).get("default_selected")
80
+ )
81
+ if record is not None and not is_doi_required:
82
+ sitename = current_app.config.get("THEME_SITENAME", "this repository")
83
+ previous_published_record = (
84
+ service.record_cls.get_latest_published_by_parent(record.parent)
85
+ )
86
+ validate_optional_doi = current_app.config["RDM_OPTIONAL_DOI_VALIDATOR"]
87
+ optional_doi_transitions = validate_optional_doi(
88
+ record, previous_published_record, errors=[]
89
+ )
90
+ if optional_doi_transitions:
91
+ optional_doi_transitions["message"] = optional_doi_transitions.get(
92
+ "message"
93
+ ).format(sitename=sitename)
94
+ if (
95
+ "external" not in optional_doi_transitions["allowed_providers"]
96
+ and "not_needed"
97
+ not in optional_doi_transitions["allowed_providers"]
98
+ ):
99
+ # In case we have locally managed provider(s) as allowed ones, we need to
100
+ # select it by default. That is relevant for the case when the
101
+ # user creates a new version of the record and the previous version
102
+ # had a datacite DOI.
103
+ default_selected = "no"
104
+
105
+ # if the DOI is required but the default selected is not_needed then we set it to yes
106
+ # to force the user to mint a DOI
107
+ if is_doi_required and default_selected == "not_needed":
108
+ default_selected = "yes"
109
+
52
110
  pids_provider = {
53
111
  "scheme": scheme,
54
- "field_label": "Digital Object Identifier",
55
- "pid_label": "DOI",
56
- "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..."),
57
115
  "can_be_managed": can_be_managed,
58
116
  "can_be_unmanaged": can_be_unmanaged,
59
- "btn_label_discard_pid": _("Discard the reserved {scheme_label}")
60
- .format(scheme_label=scheme_label),
61
- "btn_label_get_pid": _("Get a {scheme_label} now!")
62
- .format(scheme_label=scheme_label),
117
+ "btn_label_discard_pid": _(
118
+ "Discard the reserved %(scheme_label)s.", scheme_label=scheme_label
119
+ ),
120
+ "btn_label_get_pid": _(
121
+ "Get a %(scheme_label)s now!", scheme_label=scheme_label
122
+ ),
63
123
  "managed_help_text": _(
64
- "Reserve a {scheme_label} by pressing the button (e.g to "
65
- "include it in publications). The {scheme_label} is registered"
66
- " when your upload is published."
67
- ).format(scheme_label=scheme_label),
124
+ "Reserve a %(scheme_label)s by pressing the button "
125
+ "(so it can be included in files prior to upload). "
126
+ "The %(scheme_label)s is registered when your upload is published.",
127
+ scheme_label=scheme_label,
128
+ ),
68
129
  "unmanaged_help_text": _(
69
- "A {scheme_label} allows your upload to be easily and "
70
- "unambiguously cited. Example: 10.1234/foo.bar"
71
- ).format(scheme_label=scheme_label),
130
+ "A %(scheme_label)s allows your upload to be easily and "
131
+ "unambiguously cited. Example: 10.1234/foo.bar",
132
+ scheme_label=scheme_label,
133
+ ),
134
+ "default_selected": default_selected,
135
+ "optional_doi_transitions": optional_doi_transitions,
72
136
  }
73
137
  pids_providers.append(pids_provider)
74
138
 
75
139
  return pids_providers
76
140
 
77
141
 
142
+ def get_record_permissions(actions, record=None):
143
+ """Helper for generating (default) record action permissions."""
144
+ service = current_rdm_records.records_service
145
+ return {
146
+ f"can_{action}": service.check_permission(g.identity, action, record=record)
147
+ for action in actions
148
+ }
149
+
150
+
78
151
  class VocabulariesOptions:
79
152
  """Holds React form vocabularies options."""
80
153
 
@@ -88,7 +161,7 @@ class VocabulariesOptions:
88
161
  return gettext_from_dict(
89
162
  hit["title"],
90
163
  current_i18n.locale,
91
- current_app.config.get('BABEL_DEFAULT_LOCALE', 'en')
164
+ current_app.config.get("BABEL_DEFAULT_LOCALE", "en"),
92
165
  )
93
166
 
94
167
  def _get_type_subtype_label(self, hit, type_labels):
@@ -107,64 +180,69 @@ class VocabulariesOptions:
107
180
 
108
181
  def _resource_types(self, extra_filter):
109
182
  """Dump resource type vocabulary."""
110
- type_ = 'resourcetypes'
183
+ type_ = "resourcetypes"
111
184
  all_resource_types = vocabulary_service.read_all(
112
- system_identity,
185
+ g.identity,
113
186
  fields=["id", "props", "title", "icon"],
114
187
  type=type_,
115
188
  # Sorry, we have over 100+ resource types entry at NU actually
116
- max_records=150
189
+ max_records=150,
117
190
  )
118
191
  type_labels = {
119
192
  hit["id"]: self._get_label(hit)
120
193
  for hit in all_resource_types.to_dict()["hits"]["hits"]
121
194
  }
122
195
  subset_resource_types = vocabulary_service.read_all(
123
- system_identity,
196
+ g.identity,
124
197
  fields=["id", "props", "title", "icon"],
125
198
  type=type_,
126
199
  extra_filter=extra_filter,
127
200
  # Sorry, we have over 100+ resource types entry at NU actually
128
- max_records=150
201
+ max_records=150,
129
202
  )
130
203
 
131
204
  return [
132
205
  {
133
206
  "icon": hit.get("icon", ""),
134
207
  "id": hit["id"],
135
- "subtype_name": self._get_type_subtype_label(hit, type_labels)[1], # noqa
208
+ "subtype_name": self._get_type_subtype_label(hit, type_labels)[1],
136
209
  "type_name": self._get_type_subtype_label(hit, type_labels)[0],
137
- } for hit in subset_resource_types.to_dict()["hits"]["hits"]
210
+ }
211
+ for hit in subset_resource_types.to_dict()["hits"]["hits"]
138
212
  ]
139
213
 
140
- def _dump_vocabulary_w_basic_fields(self, vocabulary_type):
214
+ def _dump_vocabulary_w_basic_fields(self, vocabulary_type, extra_filter=None):
141
215
  """Dump vocabulary with id and title field."""
142
216
  results = vocabulary_service.read_all(
143
- system_identity, fields=["id", "title"], type=vocabulary_type)
217
+ g.identity,
218
+ fields=["id", "title"],
219
+ type=vocabulary_type,
220
+ extra_filter=extra_filter,
221
+ )
144
222
  return [
145
223
  {
146
224
  "text": self._get_label(hit),
147
225
  "value": hit["id"],
148
- } for hit in results.to_dict()["hits"]["hits"]
226
+ }
227
+ for hit in results.to_dict()["hits"]["hits"]
149
228
  ]
150
229
 
151
230
  # Vocabularies
152
231
  def depositable_resource_types(self):
153
232
  """Return depositable resource type options (value, label) pairs."""
154
- self._vocabularies["resource_type"] = (
155
- self._resource_types(Q('term', tags="depositable"))
233
+ self._vocabularies["resource_type"] = self._resource_types(
234
+ dsl.Q("term", tags="depositable")
156
235
  )
157
236
  return self._vocabularies["resource_type"]
158
237
 
159
238
  def subjects(self):
160
239
  """Dump subjects vocabulary (limitTo really)."""
161
240
  subjects = (
162
- VocabularyScheme.query
163
- .filter_by(parent_id="subjects")
164
- .options(load_only("id"))
241
+ VocabularyScheme.query.filter_by(parent_id="subjects")
242
+ .options(load_only(VocabularyScheme.id))
165
243
  .all()
166
244
  )
167
- limit_to = [{"text": "All", "value": "all"}]
245
+ limit_to = [{"text": _("All"), "value": "all"}]
168
246
  # id is human readable and shorter, so we use it
169
247
  limit_to += [{"text": s.id, "value": s.id} for s in subjects]
170
248
 
@@ -174,67 +252,80 @@ class VocabulariesOptions:
174
252
  def title_types(self):
175
253
  """Dump title type vocabulary."""
176
254
  self._vocabularies["titles"] = dict(
177
- type=self._dump_vocabulary_w_basic_fields('titletypes')
255
+ type=self._dump_vocabulary_w_basic_fields("titletypes")
178
256
  )
179
257
  return self._vocabularies["titles"]
180
258
 
181
259
  def creator_roles(self):
182
260
  """Dump creators role vocabulary."""
183
261
  self._vocabularies["creators"] = dict(
184
- role=self._dump_vocabulary_w_basic_fields('creatorsroles')
262
+ role=self._dump_vocabulary_w_basic_fields("creatorsroles")
185
263
  )
186
264
  return self._vocabularies["creators"]
187
265
 
188
266
  def contributor_roles(self):
189
267
  """Dump contributors role vocabulary."""
190
268
  self._vocabularies["contributors"] = dict(
191
- role=self._dump_vocabulary_w_basic_fields('contributorsroles')
269
+ role=self._dump_vocabulary_w_basic_fields("contributorsroles")
192
270
  )
193
271
  return self._vocabularies["contributors"]
194
272
 
195
273
  def description_types(self):
196
274
  """Dump description type vocabulary."""
197
275
  self._vocabularies["descriptions"] = dict(
198
- type=self._dump_vocabulary_w_basic_fields('descriptiontypes')
276
+ type=self._dump_vocabulary_w_basic_fields("descriptiontypes")
199
277
  )
200
278
  return self._vocabularies["descriptions"]
201
279
 
202
280
  def date_types(self):
203
281
  """Dump date type vocabulary."""
204
282
  self._vocabularies["dates"] = dict(
205
- type=self._dump_vocabulary_w_basic_fields('datetypes')
283
+ type=self._dump_vocabulary_w_basic_fields("datetypes")
206
284
  )
207
285
  return self._vocabularies["dates"]
208
286
 
209
287
  def relation_types(self):
210
288
  """Dump relation type vocabulary."""
211
- return self._dump_vocabulary_w_basic_fields('relationtypes')
289
+ return self._dump_vocabulary_w_basic_fields("relationtypes")
212
290
 
213
291
  def linkable_resource_types(self):
214
292
  """Dump linkable resource type vocabulary."""
215
- return self._resource_types(Q('term', tags="linkable"))
293
+ return self._resource_types(dsl.Q("term", tags="linkable"))
216
294
 
217
- def identifier_schemes(self):
218
- """Dump identifiers scheme (fake) vocabulary.
219
-
220
- "Fake" because identifiers scheme is not a vocabulary.
221
- """
295
+ def _dump_identifier_schemes(self, config_key):
296
+ """Dump identifier schemes from a given config key."""
222
297
  return [
223
- {
224
- "text": get_scheme_label(scheme),
225
- "value": scheme
226
- } for scheme in current_app.config.get(
227
- "RDM_RECORDS_IDENTIFIERS_SCHEMES", {})
298
+ {"text": get_scheme_label(scheme), "value": scheme}
299
+ for scheme in current_app.config.get(config_key, {})
228
300
  ]
229
301
 
230
- def identifiers(self):
231
- """Dump related identifiers vocabulary."""
232
- 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] = {
233
305
  "relations": self.relation_types(),
234
306
  "resource_type": self.linkable_resource_types(),
235
- "scheme": self.identifier_schemes()
307
+ "scheme": self._dump_identifier_schemes(config_key),
236
308
  }
237
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
+
238
329
  def dump(self):
239
330
  """Dump into dict."""
240
331
  # TODO: Nest vocabularies inside "metadata" key so that frontend dumber
@@ -246,24 +337,109 @@ class VocabulariesOptions:
246
337
  self.contributor_roles()
247
338
  self.subjects()
248
339
  self.identifiers()
340
+ self.related_identifiers()
341
+ self.deletion_request_removal_reasons()
249
342
  # We removed
250
343
  # vocabularies["relation_type"] = _dump_relation_types_vocabulary()
251
344
  return self._vocabularies
252
345
 
253
346
 
347
+ def load_custom_fields():
348
+ """Load custom fields configuration."""
349
+ conf = current_app.config
350
+ conf_ui = conf.get("RDM_CUSTOM_FIELDS_UI", [])
351
+ conf_backend = {cf.name: cf for cf in conf.get("RDM_CUSTOM_FIELDS", [])}
352
+ _vocabulary_fields = []
353
+ error_labels = {}
354
+
355
+ for section_cfg in conf_ui:
356
+ fields = section_cfg["fields"]
357
+ for field in fields:
358
+ field_instance = conf_backend.get(field["field"])
359
+ # Compute the dictionary to map field path to error labels
360
+ # for each custom field. This is the label shown at the top of the upload
361
+ # form
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"]
365
+ if field_error_label:
366
+ error_labels[f"custom_fields.{field['field']}"] = field_error_label
367
+ if getattr(field_instance, "relation_cls", None):
368
+ sort_by = field.get("props", {}).get("sort_by")
369
+ if sort_by:
370
+ field_instance.sort_by = sort_by
371
+ # add vocabulary options to field's properties
372
+ field["props"]["options"] = field_instance.options(g.identity)
373
+ # mark field as vocabulary
374
+ field["is_vocabulary"] = True
375
+ _vocabulary_fields.append(field["field"])
376
+ return {
377
+ "ui": conf_ui,
378
+ "vocabularies": _vocabulary_fields,
379
+ "error_labels": error_labels,
380
+ }
381
+
382
+
383
+ def get_user_communities_memberships():
384
+ """Return current identity communities memberships."""
385
+ memberships = current_communities.service.members.read_memberships(g.identity)
386
+ return {id: role for (id, role) in memberships["memberships"]}
387
+
388
+
254
389
  def get_form_config(**kwargs):
255
390
  """Get the react form configuration."""
391
+ conf = current_app.config
392
+ custom_fields = load_custom_fields()
393
+ # keep only upload form configurable custom fields
394
+ custom_fields["ui"] = [
395
+ cf for cf in custom_fields["ui"] if not cf.get("hide_from_upload_form", False)
396
+ ]
397
+ quota = deepcopy(conf.get("APP_RDM_DEPOSIT_FORM_QUOTA", {}))
398
+ max_file_size = conf.get("RDM_FILES_DEFAULT_MAX_FILE_SIZE", None)
399
+ record_quota = kwargs.pop("quota", None)
400
+ if record_quota:
401
+ quota["maxStorage"] = record_quota["quota_size"]
402
+
403
+ record = kwargs.pop("record", None)
404
+
256
405
  return dict(
257
406
  vocabularies=VocabulariesOptions().dump(),
258
- autocomplete_names=current_app.config.get(
259
- 'APP_RDM_DEPOSIT_FORM_AUTOCOMPLETE_NAMES', 'search'),
407
+ autocomplete_names=conf.get(
408
+ "APP_RDM_DEPOSIT_FORM_AUTOCOMPLETE_NAMES", "search"
409
+ ),
260
410
  current_locale=str(current_i18n.locale),
261
- default_locale=current_app.config.get('BABEL_DEFAULT_LOCALE', 'en'),
262
- pids=get_form_pids_config(),
263
- **kwargs
411
+ default_locale=conf.get("BABEL_DEFAULT_LOCALE", "en"),
412
+ pids=get_form_pids_config(record=record),
413
+ quota=dict(**quota, maxFileSize=max_file_size),
414
+ decimal_size_display=conf.get("APP_RDM_DISPLAY_DECIMAL_FILE_SIZES", True),
415
+ links=dict(
416
+ user_dashboard_request=conf["RDM_REQUESTS_ROUTES"][
417
+ "user-dashboard-request-details"
418
+ ]
419
+ ),
420
+ user_communities_memberships=get_user_communities_memberships(),
421
+ custom_fields=custom_fields,
422
+ publish_modal_extra=current_app.config.get(
423
+ "APP_RDM_DEPOSIT_FORM_PUBLISH_MODAL_EXTRA"
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"],
428
+ **kwargs,
264
429
  )
265
430
 
266
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
+
267
443
  def get_search_url():
268
444
  """Get the search URL."""
269
445
  # TODO: this should not be used
@@ -273,11 +449,21 @@ def get_search_url():
273
449
  def new_record():
274
450
  """Create an empty record with default values."""
275
451
  record = dump_empty(RDMRecordSchema)
276
- record["files"] = {"enabled": True}
452
+ record["files"] = {"enabled": current_app.config.get("RDM_DEFAULT_FILES_ENABLED")}
277
453
  if "doi" in current_rdm_records.records_service.config.pids_providers:
278
- record["pids"] = {"doi": {"provider": "external", "identifier": ""}}
454
+ if (
455
+ current_app.config["RDM_PERSISTENT_IDENTIFIERS"]
456
+ .get("doi", {})
457
+ .get("ui", {})
458
+ .get("default_selected")
459
+ == "yes" # yes, no or not_needed
460
+ ):
461
+ record["pids"] = {"doi": {"provider": "external", "identifier": ""}}
462
+ else:
463
+ record["pids"] = {}
279
464
  else:
280
465
  record["pids"] = {}
466
+ record["status"] = "draft"
281
467
  defaults = current_app.config.get("APP_RDM_DEPOSIT_FORM_DEFAULTS") or {}
282
468
  for key, value in defaults.items():
283
469
  set_default_value(record, value, key)
@@ -288,52 +474,176 @@ def new_record():
288
474
  # Views
289
475
  #
290
476
  @login_required
291
- def dashboard(dashboard_name=None):
292
- """Display user dashboard page."""
293
- if not current_app.config["COMMUNITIES_ENABLED"] or not dashboard_name:
294
- dashboard_name = current_app.config["_DASHBOARD_ROUTES"][0]
295
- return render_template(
296
- "invenio_app_rdm/records/dashboard.html",
297
- dashboard_name=dashboard_name,
298
- searchbar_config=dict(searchUrl=get_search_url()),
299
- communities_enabled=current_app.config["COMMUNITIES_ENABLED"],
300
- username=current_userprofile.full_name
301
- )
302
-
303
-
304
- @login_required
477
+ @no_cache_response
305
478
  @pass_draft_community
306
- def deposit_create(community=None):
479
+ def deposit_create(community=None, community_ui=None):
307
480
  """Create a new deposit."""
308
- return render_template(
309
- "invenio_app_rdm/records/deposit.html",
310
- forms_config=get_form_config(createUrl=("/api/records")),
481
+ can_create = current_rdm_records.records_service.check_permission(
482
+ g.identity, "create"
483
+ )
484
+ if not can_create:
485
+ raise PermissionDeniedError()
486
+
487
+ community_theme = None
488
+ if community is not None:
489
+ community_theme = community_ui.get("theme", {})
490
+
491
+ community_use_jinja_header = bool(community_theme)
492
+ dashboard_routes = current_app.config["APP_RDM_USER_DASHBOARD_ROUTES"]
493
+ is_doi_required = (
494
+ current_app.config.get("RDM_PERSISTENT_IDENTIFIERS", {})
495
+ .get("doi", {})
496
+ .get("required")
497
+ )
498
+
499
+ return render_community_theme_template(
500
+ current_app.config["APP_RDM_DEPOSIT_FORM_TEMPLATE"],
501
+ theme=community_theme,
502
+ forms_config=get_form_config(
503
+ dashboard_routes=dashboard_routes,
504
+ createUrl="/api/records",
505
+ quota=get_actual_files_quota(None),
506
+ hide_community_selection=community_use_jinja_header,
507
+ is_doi_required=is_doi_required,
508
+ ),
311
509
  searchbar_config=dict(searchUrl=get_search_url()),
312
510
  record=new_record(),
313
- files=dict(
314
- default_preview=None, entries=[], links={}
511
+ community=community,
512
+ community_ui=community_ui,
513
+ community_use_jinja_header=community_use_jinja_header,
514
+ files=dict(default_preview=None, entries=[], links={}),
515
+ preselectedCommunity=community_ui,
516
+ files_locked=False,
517
+ permissions=get_record_permissions(
518
+ [
519
+ "manage",
520
+ "manage_files",
521
+ "delete_draft",
522
+ "manage_record_access",
523
+ ]
315
524
  ),
316
- communities_enabled=current_app.config["COMMUNITIES_ENABLED"],
317
- community=community
318
525
  )
319
526
 
320
527
 
321
- @login_required
322
- @pass_draft
528
+ @secret_link_or_login_required()
529
+ @pass_draft(expand=True)
323
530
  @pass_draft_files
324
- def deposit_edit(draft=None, draft_files=None, pid_value=None):
531
+ @no_cache_response
532
+ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
325
533
  """Edit an existing deposit."""
326
- serializer = UIJSONSerializer()
327
- record = serializer.serialize_object_to_dict(draft.to_dict())
534
+ # don't show draft's deposit form if the user can't edit it
535
+ service = current_rdm_records.records_service
536
+ can_edit_draft = service.check_permission(
537
+ g.identity, "update_draft", record=draft._record
538
+ )
539
+ can_preview_draft = service.check_permission(
540
+ g.identity, "preview", record=draft._record
541
+ )
542
+ if not can_edit_draft:
543
+ if can_preview_draft:
544
+ return redirect(draft["links"]["preview_html"])
545
+ raise PermissionDeniedError()
546
+
547
+ files_dict = None if draft_files is None else draft_files.to_dict()
548
+ ui_serializer = UIJSONSerializer()
549
+ record = ui_serializer.dump_obj(draft.to_dict())
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
569
+ community_theme = None
570
+ community = record.get("expanded", {}).get("parent", {}).get("review", {}).get(
571
+ "receiver"
572
+ ) or record.get("expanded", {}).get("parent", {}).get("communities", {}).get(
573
+ "default"
574
+ )
575
+
576
+ if community:
577
+ # TODO: handle deleted community
578
+ try:
579
+ community = current_communities.service.read(
580
+ id_=community["id"], identity=g.identity
581
+ )
582
+ community_theme = community.to_dict().get("theme", {})
583
+ community_ui = UICommunityJSONSerializer().dump_obj(community.to_dict())
584
+ except CommunityDeletedError:
585
+ pass
586
+
587
+ # show the community branded header when there is a theme and record is published
588
+ # for unpublished records we fallback to the react component so users can change
589
+ # communities
590
+ community_use_jinja_header = bool(community_theme)
591
+ dashboard_routes = current_app.config["APP_RDM_USER_DASHBOARD_ROUTES"]
592
+ is_doi_required = (
593
+ current_app.config.get("RDM_PERSISTENT_IDENTIFIERS", {})
594
+ .get("doi", {})
595
+ .get("required")
596
+ )
597
+ form_config = get_form_config(
598
+ apiUrl=f"/api/records/{pid_value}/draft",
599
+ dashboard_routes=dashboard_routes,
600
+ # maybe quota should be serialized into the record e.g for admins
601
+ quota=get_actual_files_quota(draft._record),
602
+ # hide react community component
603
+ hide_community_selection=community_use_jinja_header,
604
+ is_doi_required=is_doi_required,
605
+ record=draft._record,
606
+ published_record=published_record,
607
+ )
328
608
 
329
- community_uuid = get_community_uuid(record)
330
- return render_template(
331
- "invenio_app_rdm/records/deposit.html",
332
- forms_config=get_form_config(apiUrl=f"/api/records/{pid_value}/draft"),
609
+ if is_doi_required and not record.get("pids", {}).get("doi"):
610
+ # if the DOI is required but there is no value, we set the default selected pid
611
+ # to no i.e. system should automatically mint a local DOI
612
+ if record["status"] == "new_version_draft":
613
+ doi_provider_config = [
614
+ pid_config
615
+ for pid_config in form_config["pids"]
616
+ if pid_config.get("scheme") == "doi"
617
+ ]
618
+ if doi_provider_config:
619
+ doi_provider_config[0]["default_selected"] = "no"
620
+
621
+ return render_community_theme_template(
622
+ current_app.config["APP_RDM_DEPOSIT_FORM_TEMPLATE"],
623
+ theme=community_theme,
624
+ forms_config=form_config,
333
625
  record=record,
334
- community=community_uuid,
335
- communities_enabled=current_app.config["COMMUNITIES_ENABLED"],
336
- files=draft_files.to_dict(),
626
+ community=community,
627
+ community_ui=community_ui,
628
+ community_use_jinja_header=community_use_jinja_header,
629
+ files=files_dict,
337
630
  searchbar_config=dict(searchUrl=get_search_url()),
338
- permissions=draft.has_permissions_to(['new_version'])
631
+ files_locked=files_locked,
632
+ permissions=draft.has_permissions_to(
633
+ [
634
+ "manage",
635
+ "new_version",
636
+ "delete_draft",
637
+ "manage_files",
638
+ "manage_record_access",
639
+ ]
640
+ ),
641
+ record_deletion=record_deletion,
642
+ file_modification=file_modification,
339
643
  )
644
+
645
+
646
+ def community_upload(pid_value):
647
+ """Redirection for upload to community."""
648
+ routes = current_app.config.get("APP_RDM_ROUTES")
649
+ return redirect(f"{routes['deposit_create']}?community={pid_value}")