Skip to content

Commit fbba67f

Browse files
versions: calculate record's active versions
* closes https://github.com/zenodo/rdm-project/issues/515
1 parent de8ccd8 commit fbba67f

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

invenio_drafts_resources/records/api.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
from invenio_db import db
2828
from invenio_pidstore.models import PIDStatus
2929
from invenio_pidstore.providers.recordid_v2 import RecordIdProviderV2
30+
from invenio_rdm_records.records.systemfields.deletion_status import (
31+
RecordDeletionStatusEnum,
32+
)
3033
from invenio_records.systemfields import ModelField
3134
from invenio_records_resources.records import Record as RecordBase
3235
from invenio_records_resources.records.systemfields import PIDField, PIDStatusCheckField
@@ -90,6 +93,14 @@ class Record(RecordBase):
9093
#: Version relationship
9194
versions = VersionsField(create=True, set_latest=True)
9295

96+
@property
97+
def versions_count(self):
98+
"""Get number of record's active versions"""
99+
records = list(
100+
self.get_record_versions(parent_id=self.parent.id, include_deleted=False)
101+
)
102+
return len(records)
103+
93104
@classmethod
94105
def get_records_by_parent(cls, parent, with_deleted=True, ids_only=False):
95106
"""Get all sibling records for the specified parent record."""
@@ -106,6 +117,20 @@ def get_records_by_parent(cls, parent, with_deleted=True, ids_only=False):
106117
for rec_model in rec_models
107118
)
108119

120+
@classmethod
121+
def get_record_versions(cls, parent_id, include_deleted=True):
122+
"""Get record's versions."""
123+
from invenio_rdm_records.records.models import RDMRecordMetadata
124+
125+
with db.session.no_autoflush:
126+
rec_models = cls.model_cls.query.filter_by(parent_id=parent_id)
127+
if not include_deleted and cls.model_cls is RDMRecordMetadata:
128+
rec_models = rec_models.filter_by(
129+
deletion_status=RecordDeletionStatusEnum.PUBLISHED.value
130+
)
131+
132+
return (rec_model.id for rec_model in rec_models)
133+
109134
@classmethod
110135
def get_latest_by_parent(cls, parent, id_only=False):
111136
"""Get the latest record for the specified parent record.

invenio_drafts_resources/records/systemfields/versions.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __init__(self, record, dump=None):
2929
"""Initialize the versions manager."""
3030
self._record = record
3131
self._state = None
32+
self.versions_count = None
3233
if dump is not None:
3334
self.load(dump)
3435

@@ -88,6 +89,18 @@ def is_latest(self):
8889
"""Check if the record/draft id is the latest published record id."""
8990
return self.latest_id == self._record.id
9091

92+
@property
93+
def versions_count(self):
94+
"""Get number of record's active versions."""
95+
if self._versions_count is None:
96+
self._versions_count = self._record.versions_count
97+
return self._versions_count
98+
99+
@versions_count.setter
100+
def versions_count(self, value):
101+
"""Set number of record's active versions."""
102+
self._versions_count = value
103+
91104
@property
92105
def is_latest_draft(self):
93106
"""Check if the record/draft id is the latest draft id."""
@@ -153,6 +166,7 @@ def dump(self):
153166
next_draft_id=self.next_draft_id,
154167
is_latest=self.is_latest,
155168
is_latest_draft=self.is_latest_draft,
169+
versions_count=self.versions_count,
156170
index=self.index,
157171
)
158172

@@ -166,14 +180,16 @@ def load(self, dump):
166180
)
167181
if self.index != dump["index"]:
168182
self._record.model.index = dump["index"]
183+
self.versions_count = dump.get("versions_count", None) or dump["index"]
169184

170185
def __repr__(self):
171186
"""Return repr(self)."""
172187
return (
173188
f"<{type(self).__name__} (parent_id: {self.parent_id}, "
174189
f"index: {self.index}, latest_id: {self.latest_id}, "
175190
f"latest_index: {self.latest_index}, "
176-
f"next_draft_id: {self.next_draft_id})>"
191+
f"next_draft_id: {self.next_draft_id}, "
192+
f"versions_count: {self.versions_count})>"
177193
)
178194

179195

invenio_drafts_resources/services/records/schema.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class VersionsSchema(Schema):
1919
is_latest = fields.Boolean()
2020
is_latest_draft = fields.Boolean()
2121
index = fields.Integer()
22+
versions_count = fields.Integer()
2223

2324

2425
class ParentSchema(Schema):

0 commit comments

Comments
 (0)