InvenioRDM - Bump schema of old records
The snippet can be accessed without any authentication.
Authored by
Tsepelakis, Sotirios
Sometimes drafts and/or records may be marked with old schema versions (field $schema). In this case, after upgrading to a new InvenioRDM version, errors can be encountered due to new fields being introduced in newer schemas. This code addresses this problem by bumping the old $schema
field into the newest one.
from invenio_rdm_records.records.api import RDMRecord, RDMDraft
from invenio_rdm_records.proxies import current_rdm_records as crr
from invenio_access.permissions import system_identity
from invenio_db import db
# NOTE: specify the latest version number in the "vX" string
drafts = [RDMDraft(rm.data, model=rm) for rm in RDMDraft.model_cls.query.all()]
old_drafts = [d for d in drafts if d and "vX" not in d.get("$schema")]
new_drafts = [d for d in drafts if d and "vX" in d.get("$schema")]
records = [RDMRecord(rm.data, model=rm) for rm in RDMRecord.model_cls.query.all()]
old_records = [r for r in records if "vX" not in r.get("$schema")]
new_records = [r for r in records if "vX" in r.get("$schema")]
# check how many old & new drafts/records there are
print(len(old_drafts))
print(len(new_drafts))
print(len(old_records))
print(len(new_records))
# check which old schemas there are... should only be v4
print({d.get("$schema") for d in old_drafts})
# pop the '$schema' (will be bumped automatically)
# do the same for old_records if there are any (we didn't have any)
for d in old_drafts:
d.pop("$schema")
d.commit()
d.parent.commit()
crr.records_service.indexer.index(d)
db.session.commit()
Please register or sign in to comment