diff --git a/invenio_utilities_tuw/cli/drafts.py b/invenio_utilities_tuw/cli/drafts.py index fabf8b639c6727469a9f6efdc3bf6e075506c1de..f43661b3a7a42a42812b129e17bf08dbab93bc6d 100644 --- a/invenio_utilities_tuw/cli/drafts.py +++ b/invenio_utilities_tuw/cli/drafts.py @@ -25,7 +25,7 @@ from invenio_records_resources.services.errors import PermissionDeniedError from ..utils import get_identity_for_user, get_user_by_identifier from .options import ( option_as_user, - option_owners, + option_owner, option_pid_type, option_pid_value, option_pretty_print, @@ -37,7 +37,7 @@ from .utils import ( create_record_from_metadata, patch_metadata, read_metadata, - set_record_owners, + set_record_owner, ) @@ -119,10 +119,10 @@ def list_drafts(user): default=False, help="publish the draft after creation (default: false)", ) -@option_owners +@option_owner @option_vanity_pid @with_appcontext -def create_draft(metadata_path, publish, user, owners, vanity_pid): +def create_draft(metadata_path, publish, user, owner, vanity_pid): """Create a new record draft with the specified metadata. The specified metadata path can either point to a JSON file containing the metadata, @@ -194,9 +194,9 @@ def create_draft(metadata_path, publish, user, owners, vanity_pid): else: raise TypeError(f"neither a file nor a directory: {metadata_path}") - if owners: - owners = [get_user_by_identifier(owner) for owner in owners] - set_record_owners(draft, owners) + if owner: + owner = get_user_by_identifier(owner) + set_record_owner(draft, owner) if service.indexer: service.indexer.index(draft) @@ -242,9 +242,9 @@ def show_draft(pid, pid_type, user, pretty_print, raw): "(default: replace)" ), ) -@option_owners +@option_owner @with_appcontext -def update_draft(metadata_file, pid, pid_type, user, patch, owners): +def update_draft(metadata_file, pid, pid_type, user, patch, owner): """Update the specified draft's metadata.""" pid = convert_to_recid(pid, pid_type) identity = get_identity_for_user(user) @@ -254,10 +254,10 @@ def update_draft(metadata_file, pid, pid_type, user, patch, owners): draft_data = service.read_draft(id_=pid, identity=identity).data.copy() metadata = patch_metadata(draft_data, metadata) - if owners: + if owner: draft = service.read_draft(id_=pid, identity=identity)._record - owners = [get_user_by_identifier(owner) for owner in owners] - set_record_owners(draft, owners) + owner = get_user_by_identifier(owner) + set_record_owner(draft, owner) service.update_draft(id_=pid, identity=identity, data=metadata) click.secho(pid, fg="green") @@ -480,15 +480,7 @@ def list_stale_drafts(num_days): for draft in stale_drafts: recid = draft.pid.pid_value title = draft.metadata.get("title", "[UNNAMED]") - - # InvenioRDM v11 still supports several record owners uploader = draft.parent.access.owned_by - if isinstance(uploader, list): - if uploader: - uploader = uploader[0] - else: - uploader = None - uploader_email = uploader.resolve().email if uploader else "[N/A]" updated = draft.updated.date() if draft.updated else "[N/A]" stale_draft_infos.append(draft_info(recid, title, uploader_email, updated)) diff --git a/invenio_utilities_tuw/cli/options.py b/invenio_utilities_tuw/cli/options.py index 8f8f5707b42f1c2cd8b9bfa0d3565c24c9df8418..1eec88903e7be79ae3038259dc8c5c8f5ed292c0 100644 --- a/invenio_utilities_tuw/cli/options.py +++ b/invenio_utilities_tuw/cli/options.py @@ -65,14 +65,14 @@ option_pid_values = click.option( ), ) -option_owners = click.option( +option_owner = click.option( "--owner", "-o", - "owners", + "owner", metavar="OWNER", required=False, - multiple=True, - help="email address of the record owner to set (can be specified multiple times)", + multiple=False, + help="email address of the record owner to set", ) option_vanity_pid = click.option( diff --git a/invenio_utilities_tuw/cli/records.py b/invenio_utilities_tuw/cli/records.py index f13a8a23feb935a882dec8ed49bfad42815c149d..69978b3a30722331a3f5ffbb8f89e16063be55db 100644 --- a/invenio_utilities_tuw/cli/records.py +++ b/invenio_utilities_tuw/cli/records.py @@ -20,14 +20,14 @@ from invenio_records_resources.services.errors import PermissionDeniedError from ..utils import get_identity_for_user, get_user_by_identifier from .options import ( option_as_user, - option_owners, + option_owner, option_pid_type, option_pid_value, option_pid_values, option_pretty_print, option_raw, ) -from .utils import convert_to_recid, get_object_uuid, patch_metadata, set_record_owners +from .utils import convert_to_recid, get_object_uuid, patch_metadata, set_record_owner @click.group() @@ -109,9 +109,9 @@ def show_record(pid, pid_type, user, pretty_print, raw): "and update the record directly (not recommended)" ), ) -@option_owners +@option_owner @with_appcontext -def update_record(metadata_file, pid, pid_type, user, patch, owners, direct): +def update_record(metadata_file, pid, pid_type, user, patch, owner, direct): """Update the specified draft's metadata.""" pid = convert_to_recid(pid, pid_type) identity = get_identity_for_user(user) @@ -145,10 +145,10 @@ def update_record(metadata_file, pid, pid_type, user, patch, owners, direct): click.secho("trying with service.update()...", fg="yellow", err=True) service.update(id_=pid, identity=identity, data=metadata) - if owners: + if owner: record = service.read(id_=pid, identity=identity)._record - owners = [get_user_by_identifier(owner) for owner in owners] - set_record_owners(record, owners) + owner = get_user_by_identifier(owner) + set_record_owner(record, owner) if service.indexer: service.indexer.index(record) diff --git a/invenio_utilities_tuw/cli/utils.py b/invenio_utilities_tuw/cli/utils.py index 59c4fb04e1d6fe6b9a7d4da9cd86be80fe052b08..9ef6dd272ab819df6a27e1f8a9de3594a3001067 100644 --- a/invenio_utilities_tuw/cli/utils.py +++ b/invenio_utilities_tuw/cli/utils.py @@ -9,7 +9,6 @@ """Utilities for the CLI commands.""" import json -from collections.abc import Iterable from invenio_db import db from invenio_pidstore.errors import PIDAlreadyExists @@ -99,14 +98,11 @@ def convert_to_recid(pid_value, pid_type): return pid_value -def set_record_owners(record, owners, commit=True): - """Set the record's owners, assuming an RDMRecord-like record object.""" +def set_record_owner(record, owner, commit=True): + """Set the record's owner, assuming an RDMRecord-like record object.""" parent = record.parent - parent.access.owners.clear() - for owner in owners: - parent.access.owners.add(owner) - + parent.access.owned_by = owner if commit: parent.commit() db.session.commit() @@ -128,12 +124,5 @@ def bytes_to_human(size): def is_owned_by(user, record): """Check if the record is owned by the given user.""" - owners = record.parent.access.owned_by - - # note: InvenioRDM v12 changed record ownership to a single entity rather - # than a list of entities, but we're still on v11 so we make it - # compatible with both variants - if not isinstance(owners, Iterable): - owners = [owners] - - return any([o and o.owner_id == user.id for o in owners]) + owner = record.parent.access.owned_by + return owner and owner.owner_id == user.id