invenio-app-rdm 14.0.0b0.dev3__py2.py3-none-any.whl → 14.0.0b1.dev1__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 (37) 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/templates/semantic-ui/invenio_app_rdm/administration/requests.html +14 -0
  5. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests_details.html +89 -0
  6. invenio_app_rdm/administration/user_moderation/user_moderation.py +4 -4
  7. invenio_app_rdm/config.py +47 -0
  8. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html +3 -0
  9. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/manage_menu.html +3 -3
  10. invenio_app_rdm/records_ui/utils.py +22 -1
  11. invenio_app_rdm/records_ui/views/deposits.py +62 -3
  12. invenio_app_rdm/records_ui/views/records.py +43 -1
  13. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/guest-access-request/index.html +5 -5
  14. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/record-deletion/index.html +93 -0
  15. invenio_app_rdm/requests_ui/views/requests.py +17 -2
  16. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchResultItem.js +81 -0
  17. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchbarLayout.js +48 -0
  18. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/index.js +22 -0
  19. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionModal.js +356 -0
  20. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionRadioGroup.js +44 -0
  21. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion.js +81 -0
  22. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +22 -2
  23. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js +2 -1
  24. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ManageButton.js +72 -20
  25. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitySubmission/RecordCommunitySubmissionModal.js +1 -1
  26. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js +10 -3
  27. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js +1 -0
  28. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.de.html +2 -2
  29. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.en.html +4 -4
  30. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.sv.html +4 -4
  31. invenio_app_rdm/theme/webpack.py +2 -1
  32. {invenio_app_rdm-14.0.0b0.dev3.dist-info → invenio_app_rdm-14.0.0b1.dev1.dist-info}/METADATA +23 -5
  33. {invenio_app_rdm-14.0.0b0.dev3.dist-info → invenio_app_rdm-14.0.0b1.dev1.dist-info}/RECORD +37 -26
  34. {invenio_app_rdm-14.0.0b0.dev3.dist-info → invenio_app_rdm-14.0.0b1.dev1.dist-info}/entry_points.txt +2 -0
  35. {invenio_app_rdm-14.0.0b0.dev3.dist-info → invenio_app_rdm-14.0.0b1.dev1.dist-info}/WHEEL +0 -0
  36. {invenio_app_rdm-14.0.0b0.dev3.dist-info → invenio_app_rdm-14.0.0b1.dev1.dist-info}/licenses/LICENSE +0 -0
  37. {invenio_app_rdm-14.0.0b0.dev3.dist-info → invenio_app_rdm-14.0.0b1.dev1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,44 @@
1
+ // This file is part of InvenioRDM
2
+ // Copyright (C) 2025 CERN
3
+ //
4
+ // Invenio-app-rdm is free software; you can redistribute it and/or modify it
5
+ // under the terms of the MIT License; see LICENSE file for more details.
6
+
7
+ import React from "react";
8
+ import PropTypes from "prop-types";
9
+ import { Radio, FormField, TableRow, TableCell } from "semantic-ui-react";
10
+
11
+ const DeletionRadioGroup = ({ index, row, state, onStateChange }) => {
12
+ return (
13
+ <TableRow key={row.name}>
14
+ <TableCell>{row.label}</TableCell>
15
+ <TableCell>
16
+ <FormField>
17
+ <Radio
18
+ value="Yes"
19
+ checked={state[index] === true}
20
+ onChange={() => onStateChange(index, true)}
21
+ />
22
+ </FormField>
23
+ </TableCell>
24
+ <TableCell>
25
+ <FormField>
26
+ <Radio
27
+ value="No"
28
+ checked={state[index] === false}
29
+ onChange={() => onStateChange(index, false)}
30
+ />
31
+ </FormField>
32
+ </TableCell>
33
+ </TableRow>
34
+ );
35
+ };
36
+
37
+ DeletionRadioGroup.propTypes = {
38
+ index: PropTypes.number.isRequired,
39
+ row: PropTypes.object.isRequired,
40
+ state: PropTypes.array.isRequired,
41
+ onStateChange: PropTypes.func.isRequired,
42
+ };
43
+
44
+ export default DeletionRadioGroup;
@@ -0,0 +1,81 @@
1
+ // This file is part of InvenioRDM
2
+ // Copyright (C) 2025.
3
+ //
4
+ // Invenio RDM Records is free software; you can redistribute it and/or modify it
5
+ // under the terms of the MIT License; see LICENSE file for more details.
6
+
7
+ import React, { useState } from "react";
8
+ import { Button, Popup } from "semantic-ui-react";
9
+ import { i18next } from "@translations/invenio_app_rdm/i18next";
10
+ import PropTypes from "prop-types";
11
+ import { DeletionModal } from "./RecordDeletion/DeletionModal";
12
+
13
+ export const RecordDeletion = ({
14
+ disabled,
15
+ record,
16
+ permissions,
17
+ recordDeletion,
18
+ options,
19
+ }) => {
20
+ const [modalOpen, setModalOpen] = useState(false);
21
+ const handleOpen = () => setModalOpen(true);
22
+ const handleClose = () => setModalOpen(false);
23
+
24
+ return (
25
+ <>
26
+ <Popup
27
+ content={i18next.t("It is not possible to delete this record.")}
28
+ disabled={!disabled}
29
+ trigger={
30
+ <span>
31
+ {recordDeletion.existing_request ? (
32
+ <Button
33
+ fluid
34
+ as="a"
35
+ href={recordDeletion.existing_request}
36
+ disabled={disabled}
37
+ className="basic"
38
+ color="red"
39
+ aria-haspopup="dialog"
40
+ icon="external alternate"
41
+ labelPosition="left"
42
+ content={i18next.t("View deletion request")}
43
+ />
44
+ ) : (
45
+ <Button
46
+ fluid
47
+ onClick={handleOpen}
48
+ disabled={disabled}
49
+ className="negative"
50
+ aria-haspopup="dialog"
51
+ icon="trash outline alternate"
52
+ labelPosition="left"
53
+ content={i18next.t("Delete record")}
54
+ />
55
+ )}
56
+ </span>
57
+ }
58
+ />
59
+ <DeletionModal
60
+ record={record}
61
+ open={modalOpen}
62
+ handleClose={handleClose}
63
+ permissions={permissions}
64
+ recordDeletion={recordDeletion}
65
+ options={options}
66
+ />
67
+ </>
68
+ );
69
+ };
70
+
71
+ RecordDeletion.propTypes = {
72
+ disabled: PropTypes.bool,
73
+ record: PropTypes.object.isRequired,
74
+ permissions: PropTypes.object.isRequired,
75
+ recordDeletion: PropTypes.object.isRequired,
76
+ options: PropTypes.array.isRequired,
77
+ };
78
+
79
+ RecordDeletion.defaultProps = {
80
+ disabled: false,
81
+ };
@@ -47,6 +47,7 @@ import Overridable from "react-overridable";
47
47
  import { CopyrightsField } from "@js/invenio_rdm_records/src/deposit/fields/CopyrightsField/CopyrightsField";
48
48
  import { ShareDraftButton } from "./ShareDraftButton";
49
49
  import { depositFormSectionsConfig, severityChecksConfig } from "./config";
50
+ import { RecordDeletion } from "../components/RecordDeletion";
50
51
 
51
52
  export class RDMDepositForm extends Component {
52
53
  constructor(props) {
@@ -112,6 +113,7 @@ export class RDMDepositForm extends Component {
112
113
  filesLocked,
113
114
  recordRestrictionGracePeriod,
114
115
  allowRecordRestriction,
116
+ recordDeletion,
115
117
  groupsEnabled,
116
118
  allowEmptyFiles,
117
119
  useUppy,
@@ -135,6 +137,7 @@ export class RDMDepositForm extends Component {
135
137
  filesLocked={filesLocked}
136
138
  recordRestrictionGracePeriod={recordRestrictionGracePeriod}
137
139
  allowRecordRestriction={allowRecordRestriction}
140
+ recordDeletion={recordDeletion}
138
141
  groupsEnabled={groupsEnabled}
139
142
  allowEmptyFiles={allowEmptyFiles}
140
143
  customFieldsUI={customFieldsUI}
@@ -760,7 +763,23 @@ export class RDMDepositForm extends Component {
760
763
  >
761
764
  <Card>
762
765
  <Card.Content>
763
- <DeleteButton fluid />
766
+ <Grid relaxed>
767
+ <Grid.Column width={16}>
768
+ <DeleteButton fluid />
769
+ </Grid.Column>
770
+
771
+ {record.is_published && recordDeletion["enabled"] && (
772
+ <Grid.Column width={16} className="pt-0">
773
+ <RecordDeletion
774
+ record={record}
775
+ permissions={permissions}
776
+ recordDeletion={recordDeletion}
777
+ options={this.vocabularies.metadata.removal_reasons}
778
+ disabled={!recordDeletion["allowed"]}
779
+ />
780
+ </Grid.Column>
781
+ )}
782
+ </Grid>
764
783
  </Card.Content>
765
784
  </Card>
766
785
  </Overridable>
@@ -781,6 +800,7 @@ RDMDepositForm.propTypes = {
781
800
  config: PropTypes.object.isRequired,
782
801
  recordRestrictionGracePeriod: PropTypes.number.isRequired,
783
802
  allowRecordRestriction: PropTypes.bool.isRequired,
803
+ recordDeletion: PropTypes.object.isRequired,
784
804
  record: PropTypes.object.isRequired,
785
805
  preselectedCommunity: PropTypes.object,
786
806
  files: PropTypes.object,
@@ -792,8 +812,8 @@ RDMDepositForm.propTypes = {
792
812
 
793
813
  RDMDepositForm.defaultProps = {
794
814
  preselectedCommunity: undefined,
795
- permissions: null,
796
815
  files: null,
816
+ permissions: null,
797
817
  filesLocked: false,
798
818
  allowEmptyFiles: true,
799
819
  useUppy: false,
@@ -1,5 +1,5 @@
1
1
  // This file is part of InvenioRDM
2
- // Copyright (C) 2020-2024 CERN.
2
+ // Copyright (C) 2020-2025 CERN.
3
3
  // Copyright (C) 2020-2022 Northwestern University.
4
4
  // Copyright (C) 2022-2024 KTH Royal Institute of Technology.
5
5
  //
@@ -28,6 +28,7 @@ ReactDOM.render(
28
28
  "deposits-record-restriction-grace-period"
29
29
  )}
30
30
  allowRecordRestriction={getInputFromDOM("deposits-allow-record-restriction")}
31
+ recordDeletion={getInputFromDOM("deposits-record-deletion")}
31
32
  groupsEnabled={getInputFromDOM("config-groups-enabled")}
32
33
  allowEmptyFiles={getInputFromDOM("records-resources-allow-empty-files")}
33
34
  isDoiRequired={getInputFromDOM("deposits-is-doi-required")}
@@ -1,17 +1,48 @@
1
1
  // This file is part of InvenioRDM
2
- // Copyright (C) 2023-2024 CERN.
2
+ // Copyright (C) 2023-2025 CERN.
3
3
  //
4
4
  // Invenio RDM Records is free software; you can redistribute it and/or modify it
5
5
  // under the terms of the MIT License; see LICENSE file for more details.
6
6
 
7
- import React from "react";
7
+ import React, { useEffect, useState } from "react";
8
8
  import { Dropdown, Modal, Button, Message } from "semantic-ui-react";
9
9
  import { i18next } from "@translations/invenio_app_rdm/i18next";
10
10
  import PropTypes from "prop-types";
11
11
  import { http } from "react-invenio-forms";
12
12
  import { APIRoutes } from "../administration/users/api/routes";
13
+ import { RecordDeletion } from "../components/RecordDeletion";
14
+
15
+ const fetchOptions = async () => {
16
+ const url = "/api/vocabularies/removalreasons?q=tags:deletion-request";
17
+ const req = http.get(url);
18
+ try {
19
+ const response = await req;
20
+ const data = response.data.hits.hits;
21
+
22
+ const options = data.map((x) => {
23
+ return {
24
+ text: x["title_l10n"],
25
+ value: x["id"],
26
+ };
27
+ });
28
+ return options;
29
+ } catch (e) {
30
+ console.error(e);
31
+ }
32
+ };
33
+
34
+ export const ManageButton = ({
35
+ record,
36
+ recordOwnerID,
37
+ permissions,
38
+ recordDeletion,
39
+ }) => {
40
+ const [options, setOptions] = useState([]);
41
+
42
+ useEffect(() => {
43
+ fetchOptions().then(setOptions);
44
+ }, []);
13
45
 
14
- export const ManageButton = ({ recid, recordOwnerID }) => {
15
46
  return (
16
47
  <Dropdown
17
48
  fluid
@@ -23,30 +54,51 @@ export const ManageButton = ({ recid, recordOwnerID }) => {
23
54
  className="icon text-align-center"
24
55
  >
25
56
  <Dropdown.Menu>
26
- <Dropdown.Item
27
- as="a"
28
- href={`/administration/records?q=id:${recid}`}
29
- target="_blank"
30
- key="manage_record"
31
- text={i18next.t("Manage record")}
32
- />
33
- <Dropdown.Item
34
- as="a"
35
- href={`/administration/users?q=id:${recordOwnerID}`}
36
- target="_blank"
37
- key="manage_user"
38
- text={i18next.t("Manage user")}
39
- />
40
- <Dropdown.Divider />
41
- {recordOwnerID && <BlockUserItem recordOwnerID={recordOwnerID} />}
57
+ {recordDeletion["valid_user"] && (
58
+ <>
59
+ <Dropdown.Item>
60
+ <RecordDeletion
61
+ record={record}
62
+ permissions={permissions}
63
+ recordDeletion={recordDeletion}
64
+ options={options}
65
+ disabled={!recordDeletion["allowed"]}
66
+ />
67
+ </Dropdown.Item>
68
+
69
+ {permissions.can_moderate && <Dropdown.Divider />}
70
+ </>
71
+ )}
72
+ {permissions.can_moderate && (
73
+ <>
74
+ <Dropdown.Item
75
+ as="a"
76
+ href={`/administration/records?q=id:${record["id"]}`}
77
+ target="_blank"
78
+ key="manage_record"
79
+ text={i18next.t("Manage record")}
80
+ />
81
+ <Dropdown.Item
82
+ as="a"
83
+ href={`/administration/users?q=id:${recordOwnerID}`}
84
+ target="_blank"
85
+ key="manage_user"
86
+ text={i18next.t("Manage user")}
87
+ />
88
+ <Dropdown.Divider />
89
+ {recordOwnerID && <BlockUserItem recordOwnerID={recordOwnerID} />}
90
+ </>
91
+ )}
42
92
  </Dropdown.Menu>
43
93
  </Dropdown>
44
94
  );
45
95
  };
46
96
 
47
97
  ManageButton.propTypes = {
48
- recid: PropTypes.string.isRequired,
98
+ record: PropTypes.object.isRequired,
49
99
  recordOwnerID: PropTypes.string.isRequired,
100
+ permissions: PropTypes.object.isRequired,
101
+ recordDeletion: PropTypes.object.isRequired,
50
102
  };
51
103
 
52
104
  const BlockUserItem = ({ recordOwnerID }) => {
@@ -91,7 +91,7 @@ export class RecordCommunitySubmissionModal extends Component {
91
91
  } catch (error) {
92
92
  console.error(error);
93
93
  this.setState({
94
- error: error.response.data.errors[0].message,
94
+ error: error["message"],
95
95
  });
96
96
  } finally {
97
97
  this.setState({ loading: false });
@@ -1,5 +1,5 @@
1
1
  // This file is part of InvenioRDM
2
- // Copyright (C) 2020-2024 CERN.
2
+ // Copyright (C) 2020-2025 CERN.
3
3
  // Copyright (C) 2020-2021 Northwestern University.
4
4
  // Copyright (C) 2021 Graz University of Technology.
5
5
  //
@@ -34,6 +34,7 @@ export class RecordManagement extends Component {
34
34
  currentUserId,
35
35
  recordOwnerID,
36
36
  groupsEnabled,
37
+ recordDeletion,
37
38
  } = this.props;
38
39
  const { error } = this.state;
39
40
  const { id: recid } = record;
@@ -44,9 +45,14 @@ export class RecordManagement extends Component {
44
45
 
45
46
  return (
46
47
  <Grid columns={1} className="record-management">
47
- {permissions.can_moderate && (
48
+ {(recordDeletion["valid_user"] || permissions.can_moderate) && (
48
49
  <Grid.Column className="pb-5">
49
- <ManageButton recid={recid} recordOwnerID={recordOwnerID} />
50
+ <ManageButton
51
+ record={record}
52
+ recordOwnerID={recordOwnerID}
53
+ permissions={permissions}
54
+ recordDeletion={recordDeletion}
55
+ />
50
56
  </Grid.Column>
51
57
  )}
52
58
  {permissions.can_edit && !isDraft && (
@@ -120,4 +126,5 @@ RecordManagement.propTypes = {
120
126
  isPreviewSubmissionRequest: PropTypes.bool.isRequired,
121
127
  currentUserId: PropTypes.string.isRequired,
122
128
  recordOwnerID: PropTypes.string.isRequired,
129
+ recordDeletion: PropTypes.object.isRequired,
123
130
  };
@@ -39,6 +39,7 @@ function renderRecordManagement(element) {
39
39
  currentUserId={recordManagementAppDiv.dataset.currentUserId}
40
40
  recordOwnerID={record.parent.access.owned_by.user}
41
41
  groupsEnabled={JSON.parse(recordManagementAppDiv.dataset.groupsEnabled)}
42
+ recordDeletion={JSON.parse(recordManagementAppDiv.dataset.recordDeletion)}
42
43
  />
43
44
  </OverridableContext.Provider>,
44
45
  element
@@ -156,13 +156,13 @@
156
156
  <h3>Fehlende Werte</h3>
157
157
  <p>
158
158
  Es ist möglich, mit den Feldnamen <code>_exists_</code> und
159
- <code>_missing_</code> nach Datensätzen zu suchen,
159
+ <code>NOT _exists_</code> nach Datensätzen zu suchen,
160
160
  in denen entweder ein Wert fehlt oder die einen Wert in einem bestimmten Feld haben.
161
161
  </p>
162
162
  <p>
163
163
  <strong>Beispiel:</strong>
164
164
  <a
165
- href="/search?page=1&amp;size=20&amp;q=_missing_:metadata.additional_titles"><code>_missing_:metadata.additional_titles</code></a>
165
+ href="/search?page=1&amp;size=20&amp;q=NOT%20_exists_:metadata.additional_titles"><code>NOT _exists_:metadata.additional_titles</code></a>
166
166
  (alle Datensätze ohne metadata.additional_titles)
167
167
  </p>
168
168
  <p>
@@ -184,13 +184,13 @@
184
184
  <p>
185
185
  It is possible to search for records that either are missing a value or have
186
186
  a value in a specific field using the <code>_exists_</code> and
187
- <code> not _exists_</code> field names.
187
+ <code>NOT _exists_</code> field names.
188
188
  </p>
189
189
  <p>
190
190
  <strong>Example:</strong>
191
- <a href="/search?page=1&amp;size=20&amp;q=_missing_:metadata.additional_titles"
192
- ><code>not _exists_:metadata.additional_titles</code></a
193
- >
191
+ <a href="/search?page=1&amp;size=20&amp;q=NOT%20_exists_:metadata.additional_titles">
192
+ <code>NOT _exists_:metadata.additional_titles</code>
193
+ </a>
194
194
  (all records without metadata.additional_titles)
195
195
  </p>
196
196
  <p>
@@ -176,13 +176,13 @@
176
176
  <p>
177
177
  Det är möjligt att söka efter poster som antingen saknar ett värde eller har
178
178
  ett värde i ett specifikt fält med hjälp av <code>_exists_</code> och
179
- <code>not _exists_</code> i kombination med fältnamn.
179
+ <code>NOT _exists_</code> i kombination med fältnamn.
180
180
  </p>
181
181
  <p>
182
182
  <strong>Exempel:</strong>
183
- <a href="/search?page=1&amp;size=20&amp;q=_missing_:metadata.additional_titles"
184
- ><code>not _exists_:metadata.additional_titles</code></a
185
- >
183
+ <a href="/search?page=1&amp;size=20&amp;q=NOT%20_exists_:metadata.additional_titles">
184
+ <code>NOT _exists_:metadata.additional_titles</code>
185
+ </a>
186
186
  (alla poster utan metadata.additional_titles)
187
187
  </p>
188
188
  <p>
@@ -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-2022 Northwestern University.
5
5
  # Copyright (C) 2022 TU Wien.
6
6
  # Copyright (C) 2022 Graz University of Technology.
@@ -34,6 +34,7 @@ theme = WebpackThemeBundle(
34
34
  "invenio-app-rdm-frontpage": "./js/invenio_app_rdm/frontpage/index.js",
35
35
  "overridable-registry": "./js/invenio_app_rdm/overridableRegistry/index.js",
36
36
  "invenio-users-moderation-administration": "./js/invenio_app_rdm/administration/userModeration/index.js",
37
+ "invenio-requests-administration": "./js/invenio_app_rdm/administration/requests/index.js",
37
38
  "invenio-users-administration": "./js/invenio_app_rdm/administration/users/index.js",
38
39
  "invenio-records-administration": "./js/invenio_app_rdm/administration/records/index.js",
39
40
  "invenio-drafts-administration": "./js/invenio_app_rdm/administration/drafts/index.js",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: invenio-app-rdm
3
- Version: 14.0.0b0.dev3
3
+ Version: 14.0.0b1.dev1
4
4
  Summary: Invenio Research Data Management.
5
5
  Home-page: https://github.com/inveniosoftware/invenio-app-rdm
6
6
  Author: CERN
@@ -40,9 +40,9 @@ Requires-Dist: invenio-search-ui<5.0.0,>=4.0.0
40
40
  Requires-Dist: invenio-files-rest<4.0.0,>=3.0.0
41
41
  Requires-Dist: invenio-previewer<4.0.0,>=3.0.0
42
42
  Requires-Dist: invenio-records-files<2.0.0,>=1.2.1
43
- Requires-Dist: invenio-collections<2.0.0,>=1.0.0
44
- Requires-Dist: invenio-communities<21.0.0,>=20.0.0
45
- Requires-Dist: invenio-rdm-records<21.0.0,>=20.0.0
43
+ Requires-Dist: invenio-collections<3.0.0,>=2.0.0
44
+ Requires-Dist: invenio-communities<22.0.0,>=21.0.0
45
+ Requires-Dist: invenio-rdm-records<22.0.0,>=21.0.0
46
46
  Requires-Dist: CairoSVG<3.0.0,>=2.5.2
47
47
  Requires-Dist: invenio-banners<6.0.0,>=5.0.0
48
48
  Requires-Dist: invenio-pages<8.0.0,>=7.0.0
@@ -90,7 +90,7 @@ https://inveniordm.docs.cern.ch
90
90
 
91
91
 
92
92
  ..
93
- Copyright (C) 2019-2024 CERN.
93
+ Copyright (C) 2019-2025 CERN.
94
94
  Copyright (C) 2019-2024 Northwestern University.
95
95
  Copyright (C) 2021-2024 TU Wien.
96
96
  Copyright (C) 2021-2025 Graz University of Technology.
@@ -101,6 +101,24 @@ https://inveniordm.docs.cern.ch
101
101
  Changes
102
102
  =======
103
103
 
104
+ Version v14.0.0b1.dev1 (released 2025-09-24)
105
+
106
+ - Fixed CHANGES.rst formatting
107
+
108
+ Version v14.0.0b1.dev0 (released 2025-09-24)
109
+
110
+ - feat(administration): add Requests view
111
+ - feat: add record deletion requests
112
+ * Allows to configure record deletion policies for immediate deletion
113
+ or going through a request flow on the record landing page.
114
+
115
+ Version v14.0.0b0.dev4 (released 2025-09-01)
116
+
117
+ - views(deposit): pass to the form config the published record if we edit one
118
+ * The published record is used to compare published DOI but it can be
119
+ used also to compare with the published state of an editing draft.
120
+ - help: correct search instructions for missing fields
121
+
104
122
  Version v14.0.0b0.dev3 (released 2025-08-26)
105
123
 
106
124
  - fix(community-requests): request permissions were missing from UI