Skip to content

Commit 1b21417

Browse files
committed
chore: extract evaluate_record_deletion into utils
1 parent 702f8d6 commit 1b21417

File tree

3 files changed

+49
-78
lines changed

3 files changed

+49
-78
lines changed

invenio_app_rdm/records_ui/utils.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111

1212
from itertools import chain
1313

14-
from flask import current_app
14+
from flask import current_app, g
1515
from invenio_access.permissions import system_identity
1616
from invenio_rdm_records.requests.record_deletion import RecordDeletion
17+
from invenio_rdm_records.services.config import RDMRecordDeletionPolicy
18+
from invenio_rdm_records.records.api import RDMRecord
1719
from invenio_records.dictutils import dict_set
1820
from invenio_records.errors import MissingModelError
1921
from invenio_records_files.api import FileObject
@@ -109,3 +111,45 @@ def get_existing_deletion_request(record_id):
109111
)
110112
if existing_requests.total > 0:
111113
return list(existing_requests)[0]
114+
115+
116+
def evaluate_record_deletion(record: RDMRecord):
117+
"""Evaluate whether a given record can be deleted by an identity."""
118+
rec_del = RDMRecordDeletionPolicy().evaluate(g.identity, record._record)
119+
120+
immediate, request = rec_del["immediate_deletion"], rec_del["request_deletion"]
121+
rd_enabled = immediate.enabled or request.enabled
122+
rd_valid_user = (
123+
rec_del["immediate_deletion"].valid_user
124+
or rec_del["request_deletion"].valid_user
125+
)
126+
rd_allowed = immediate.allowed or request.allowed
127+
existing_request = get_existing_deletion_request(record.id)
128+
129+
if rd_allowed:
130+
record_deletion = {
131+
"enabled": rd_enabled,
132+
"valid_user": rd_valid_user,
133+
"allowed": rd_allowed,
134+
"recordDeletion": rec_del,
135+
"checklist": (
136+
current_app.config["RDM_IMMEDIATE_RECORD_DELETION_CHECKLIST"]
137+
if immediate.allowed
138+
else current_app.config["RDM_REQUEST_RECORD_DELETION_CHECKLIST"]
139+
),
140+
"context": {
141+
"files": record.files.count,
142+
"internalDoi": record.pids["doi"]["provider"] != "external",
143+
},
144+
}
145+
else:
146+
record_deletion = {
147+
"enabled": rd_enabled,
148+
"valid_user": rd_valid_user,
149+
"allowed": rd_allowed,
150+
}
151+
record_deletion["existing_request"] = (
152+
existing_request["links"]["self_html"] if existing_request else None
153+
)
154+
155+
return record_deletion

invenio_app_rdm/records_ui/views/deposits.py

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
from invenio_rdm_records.proxies import current_rdm_records
2727
from invenio_rdm_records.records.api import get_files_quota
2828
from invenio_rdm_records.resources.serializers import UIJSONSerializer
29-
from invenio_rdm_records.services.config import RDMRecordDeletionPolicy
3029
from invenio_rdm_records.services.schemas import RDMRecordSchema
3130
from invenio_rdm_records.services.schemas.utils import dump_empty
3231
from invenio_rdm_records.views import file_transfer_type
@@ -38,7 +37,7 @@
3837
from marshmallow_utils.fields.babel import gettext_from_dict
3938
from sqlalchemy.orm import load_only
4039

41-
from ..utils import get_existing_deletion_request, set_default_value
40+
from ..utils import evaluate_record_deletion, set_default_value
4241
from .decorators import (
4342
no_cache_response,
4443
pass_draft,
@@ -542,43 +541,7 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True):
542541
)
543542
published_record = ui_serializer.dump_obj(published_record_result.to_dict())
544543

545-
rec_del = RDMRecordDeletionPolicy().evaluate(
546-
g.identity, published_record_result._record
547-
)
548-
immediate, request = rec_del["immediate_deletion"], rec_del["request_deletion"]
549-
rd_enabled = immediate.enabled or request.enabled
550-
rd_valid_user = (
551-
rec_del["immediate_deletion"].valid_user
552-
or rec_del["request_deletion"].valid_user
553-
)
554-
rd_allowed = immediate.allowed or request.allowed
555-
existing_request = get_existing_deletion_request(record.get("id"))
556-
557-
if rd_allowed:
558-
record_deletion = {
559-
"enabled": rd_enabled,
560-
"valid_user": rd_valid_user,
561-
"allowed": rd_allowed,
562-
"recordDeletion": rec_del,
563-
"checklist": (
564-
current_app.config["RDM_IMMEDIATE_RECORD_DELETION_CHECKLIST"]
565-
if immediate.allowed
566-
else current_app.config["RDM_REQUEST_RECORD_DELETION_CHECKLIST"]
567-
),
568-
"context": {
569-
"files": draft._record.files.count,
570-
"internalDoi": draft._record.pids["doi"]["provider"] != "external",
571-
},
572-
}
573-
else:
574-
record_deletion = {
575-
"enabled": rd_enabled,
576-
"valid_user": rd_valid_user,
577-
"allowed": rd_allowed,
578-
}
579-
record_deletion["existing_request"] = (
580-
existing_request["links"]["self_html"] if existing_request else None
581-
)
544+
record_deletion = evaluate_record_deletion(published_record_result, draft)
582545
else:
583546
record_deletion = {}
584547

invenio_app_rdm/records_ui/views/records.py

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
AccessSettings,
3030
)
3131
from invenio_rdm_records.resources.serializers import UIJSONSerializer
32-
from invenio_rdm_records.services.config import RDMRecordDeletionPolicy
3332
from invenio_stats.proxies import current_stats
3433
from invenio_users_resources.proxies import current_user_resources
3534
from marshmallow import ValidationError
@@ -38,7 +37,7 @@
3837
previewable_extensions as image_extensions,
3938
)
4039

41-
from ..utils import get_existing_deletion_request, get_external_resources
40+
from ..utils import evaluate_record_deletion, get_external_resources
4241
from .decorators import (
4342
add_signposting_content_resources,
4443
add_signposting_landing_page,
@@ -158,42 +157,7 @@ def record_detail(
158157

159158
record_ui = UIJSONSerializer().dump_obj(record.to_dict())
160159

161-
rec_del = RDMRecordDeletionPolicy().evaluate(g.identity, record._record)
162-
163-
immediate, request = rec_del["immediate_deletion"], rec_del["request_deletion"]
164-
rd_enabled = immediate.enabled or request.enabled
165-
rd_valid_user = (
166-
rec_del["immediate_deletion"].valid_user
167-
or rec_del["request_deletion"].valid_user
168-
)
169-
rd_allowed = immediate.allowed or request.allowed
170-
existing_request = get_existing_deletion_request(record.id)
171-
172-
if rd_allowed:
173-
record_deletion = {
174-
"enabled": rd_enabled,
175-
"valid_user": rd_valid_user,
176-
"allowed": rd_allowed,
177-
"recordDeletion": rec_del,
178-
"checklist": (
179-
current_app.config["RDM_IMMEDIATE_RECORD_DELETION_CHECKLIST"]
180-
if immediate.allowed
181-
else current_app.config["RDM_REQUEST_RECORD_DELETION_CHECKLIST"]
182-
),
183-
"context": {
184-
"files": record._record.files.count,
185-
"internalDoi": record._record.pids["doi"]["provider"] != "external",
186-
},
187-
}
188-
else:
189-
record_deletion = {
190-
"enabled": rd_enabled,
191-
"valid_user": rd_valid_user,
192-
"allowed": rd_allowed,
193-
}
194-
record_deletion["existing_request"] = (
195-
existing_request["links"]["self_html"] if existing_request else None
196-
)
160+
record_deletion = evaluate_record_deletion(record)
197161

198162
is_draft = record_ui["is_draft"]
199163
custom_fields = load_custom_fields()

0 commit comments

Comments
 (0)