Skip to content

Commit fb33031

Browse files
committed
resources: expose record revisions
1 parent 182d5ae commit fb33031

File tree

6 files changed

+62
-1
lines changed

6 files changed

+62
-1
lines changed

invenio_rdm_records/resources/config.py

+1
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ class RDMRecordResourceConfig(RecordResourceConfig, ConfiguratorMixin):
237237
routes["restore-record"] = "/<pid_value>/restore"
238238
routes["set-record-quota"] = "/<pid_value>/quota"
239239
routes["set-user-quota"] = "/users/<pid_value>/quota"
240+
routes["item-revision-list"] = "/<pid_value>/revisions"
240241

241242
request_view_args = {
242243
"pid_value": ma.fields.Str(),

invenio_rdm_records/resources/resources.py

+12
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,22 @@ def p(route):
9494
route("POST", p(routes["set-record-quota"]), self.set_record_quota),
9595
# TODO: move to users?
9696
route("POST", routes["set-user-quota"], self.set_user_quota),
97+
route("GET", p(routes["item-revision-list"]), self.search_revisions),
9798
]
9899

99100
return url_rules
100101

102+
@request_headers
103+
@request_extra_args
104+
@request_view_args
105+
def search_revisions(self):
106+
"""Discard a previously reserved PID."""
107+
item = self.service.search_revisions(
108+
identity=g.identity, id_=resource_requestctx.view_args["pid_value"]
109+
)
110+
111+
return item.to_dict(), 200
112+
101113
@request_extra_args
102114
@request_read_args
103115
@request_view_args

invenio_rdm_records/services/config.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
)
8484
from .permissions import RDMRecordPermissionPolicy
8585
from .result_items import GrantItem, GrantList, SecretLinkItem, SecretLinkList
86-
from .results import RDMRecordList
86+
from .results import RDMRecordList, RDMRecordRevisionsList
8787
from .schemas import RDMParentSchema, RDMRecordSchema
8888
from .schemas.community_records import CommunityRecordsSchema
8989
from .schemas.parent.access import AccessSettingsSchema
@@ -422,6 +422,7 @@ class RDMRecordServiceConfig(RecordServiceConfig, ConfiguratorMixin):
422422
grant_result_item_cls = GrantItem
423423
grant_result_list_cls = GrantList
424424
result_list_cls = RDMRecordList
425+
revision_result_list_cls = RDMRecordRevisionsList
425426

426427
default_files_enabled = FromConfig("RDM_DEFAULT_FILES_ENABLED", default=True)
427428

invenio_rdm_records/services/permissions.py

+2
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ class RDMRecordPermissionPolicy(RecordPermissionPolicy):
136136
# Allow submitting new record
137137
can_create = can_authenticated
138138

139+
can_search_revisions = [Administration()]
140+
139141
#
140142
# Drafts
141143
#

invenio_rdm_records/services/results.py

+33
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
from invenio_communities.communities.entity_resolvers import pick_fields
1313
from invenio_communities.communities.schema import CommunityGhostSchema
1414
from invenio_communities.proxies import current_communities
15+
from invenio_records_resources.services.base.results import (
16+
ServiceItemResult,
17+
ServiceListResult,
18+
)
1519
from invenio_records_resources.services.records.results import (
1620
ExpandableField,
1721
RecordList,
@@ -105,3 +109,32 @@ def hits(self):
105109
)
106110

107111
yield projection
112+
113+
114+
class RDMRecordRevisionsList(ServiceListResult):
115+
"""Record revisions list.
116+
117+
We need a custom result class to handle the record revisions list as they are stored only in DB.
118+
"""
119+
120+
def __init__(self, identity, revisions):
121+
"""Instantiate a Collection tree list item."""
122+
self._identity = identity
123+
self._revisions = revisions
124+
125+
def to_dict(self):
126+
"""Serialize the collection tree list to a dictionary."""
127+
res = map(
128+
lambda revision: {
129+
"updated": revision.updated,
130+
"created": revision.created,
131+
"revision_id": revision.transaction_id,
132+
"json": revision.json,
133+
},
134+
self._revisions,
135+
)
136+
return list(res)
137+
138+
def __iter__(self):
139+
"""Iterate over the collection revisions."""
140+
return iter(self._revisions)

invenio_rdm_records/services/services.py

+12
Original file line numberDiff line numberDiff line change
@@ -731,3 +731,15 @@ def set_user_quota(
731731
db.session.add(user_quota)
732732

733733
return True
734+
735+
def search_revisions(self, identity, id_):
736+
"""Return a list of record revisions."""
737+
record = self.record_cls.pid.resolve(id_)
738+
# Check permissions
739+
self.require_permission(identity, "search_revisions", record=record)
740+
revisions = list(reversed(record.model.versions.all()))
741+
742+
return self.config.revision_result_list_cls(
743+
identity,
744+
revisions,
745+
)

0 commit comments

Comments
 (0)