Skip to content

Commit 4b17a72

Browse files
committed
search_param: refactor SharedOrMyDraftsParam
1 parent 309a928 commit 4b17a72

File tree

4 files changed

+21
-35
lines changed

4 files changed

+21
-35
lines changed

invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/components/CommunityHeader/CommunityHeader.js

+2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ class CommunityHeaderComponent extends Component {
3737
} = this.props;
3838
const { modalOpen } = this.state;
3939

40+
// record is coming from the Jinja template and it is refreshed on page reload
4041
const isNewUpload = !record.id;
42+
// Check if the user can manage the record only if it is not a new upload
4143
const isCommunitySelectionDisabled =
4244
(!isNewUpload && !userCanManageRecord) || disableCommunitySelectionButton;
4345

invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/controls/PublishButton/SubmitReviewButton.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,17 @@ class SubmitReviewButtonComponent extends Component {
4242
};
4343

4444
isDisabled = (disableSubmitForReviewButton, filesState) => {
45-
const { formik, userCanManageRecord } = this.props;
45+
const { formik, userCanManageRecord, record } = this.props;
4646
const { values, isSubmitting } = formik;
4747

48-
if (!userCanManageRecord || disableSubmitForReviewButton || isSubmitting) {
48+
// record is coming from the Jinja template and it is refreshed on page reload
49+
const isNewUpload = !record.id;
50+
// Check if the user can manage the record only if it is not a new upload
51+
if (
52+
(!isNewUpload && !userCanManageRecord) ||
53+
disableSubmitForReviewButton ||
54+
isSubmitting
55+
) {
4956
return true;
5057
}
5158

@@ -132,6 +139,7 @@ SubmitReviewButtonComponent.propTypes = {
132139
publishModalExtraContent: PropTypes.string,
133140
filesState: PropTypes.object,
134141
userCanManageRecord: PropTypes.bool.isRequired,
142+
record: PropTypes.object.isRequired,
135143
};
136144

137145
SubmitReviewButtonComponent.defaultProps = {

invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/controls/PublishButton/SubmitReviewOrPublishButton.js

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class SubmitReviewOrPublishComponent extends Component {
4141
{...ui}
4242
fluid
4343
className="mb-10"
44+
record={record}
4445
/>
4546
);
4647
} else if (showChangeCommunityButton) {

invenio_rdm_records/services/search_params.py

+8-33
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from invenio_access.permissions import authenticated_user
1414
from invenio_records_resources.services.records.params.base import ParamInterpreter
1515

16-
from invenio_rdm_records.records.systemfields.access.grants import Grant
16+
from invenio_rdm_records.services.generators import AccessGrant
1717
from invenio_rdm_records.records.systemfields.deletion_status import (
1818
RecordDeletionStatusEnum,
1919
)
@@ -51,32 +51,12 @@ class SharedOrMyDraftsParam(ParamInterpreter):
5151
Returns only drafts owned by the user or shared with the user via grant subject user or role.
5252
"""
5353

54-
def _make_grant_token(self, subj_type, subj_id, permission):
55-
"""Create a grant token from the specified parts."""
56-
# NOTE: `Grant.to_token()` doesn't need the actual subject to be set
57-
return Grant(
58-
subject=None,
59-
origin=None,
60-
permission=permission,
61-
subject_type=subj_type,
62-
subject_id=subj_id,
63-
).to_token()
64-
65-
def _grant_tokens(self, identity, permissions):
66-
"""Parse a list of grant tokens provided by the given identity."""
54+
def _generate_shared_with_me_query(self, identity):
55+
"""Generate the shared_with_me query."""
6756
tokens = []
68-
for _permission in permissions:
69-
for need in identity.provides:
70-
token = None
71-
if need.method == "id":
72-
token = self._make_grant_token("user", need.value, _permission)
73-
elif need.method == "role":
74-
token = self._make_grant_token("role", need.value, _permission)
75-
76-
if token is not None:
77-
tokens.append(token)
78-
79-
return tokens
57+
for _permission in ["preview", "edit", "manage"]:
58+
tokens.extend(AccessGrant(_permission)._grant_tokens(identity))
59+
return dsl.Q("terms", **{"parent.access.grant_tokens": tokens})
8060

8161
def apply(self, identity, search, params):
8262
"""Evaluate the include_deleted parameter on the search."""
@@ -90,13 +70,8 @@ def is_user_authenticated():
9070
if value is None and is_user_authenticated():
9171
if params.get("shared_with_me") is True:
9272
# Shared with me
93-
tokens = self._grant_tokens(
94-
identity, permissions=["preview", "edit", "manage"]
95-
)
96-
shared_with_me = dsl.Q(
97-
"terms", **{"parent.access.grant_tokens": tokens}
98-
)
99-
return search.filter(shared_with_me)
73+
shared_with_me = self._generate_shared_with_me_query(identity)
74+
search = search.filter(shared_with_me)
10075
elif params.get("shared_with_me") is False:
10176
# My uploads
10277
my_uploads = dsl.Q(

0 commit comments

Comments
 (0)