From 5ad909b482ce71dcf0be49346a8a45e871110494 Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Mon, 15 Jun 2026 10:04:31 -0400 Subject: [PATCH 1/3] allow upserting cedart records for collection templates --- api/cedar_metadata_records/serializers.py | 39 ++++++++++++++++++----- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/api/cedar_metadata_records/serializers.py b/api/cedar_metadata_records/serializers.py index 420684564b1..8e01f6be06f 100644 --- a/api/cedar_metadata_records/serializers.py +++ b/api/cedar_metadata_records/serializers.py @@ -11,7 +11,8 @@ from api.cedar_metadata_records.utils import can_create_record from osf.exceptions import ValidationError -from osf.models import CedarMetadataRecord, CedarMetadataTemplate, Guid +from osf.models import CedarMetadataRecord, CedarMetadataTemplate, CollectionSubmission, Guid +from osf.utils.workflows import CollectionSubmissionStates logger = logging.getLogger(__name__) @@ -115,13 +116,35 @@ def create(self, validated_data): raise PermissionDenied if not template.is_active(): raise NotFound - record = CedarMetadataRecord(guid=guid, template=template, metadata=metadata, is_published=is_published) - try: - record.save() - except ValidationError as e: - raise InvalidModelValueError(detail=e.messages[0]) - except IntegrityError: - raise JSONAPIException(detail=f'Cedar metadata record already exists: guid=[{guid._id}], template=[{template._id}]') + already_submitted = ( + template.is_for_collections + and CollectionSubmission.objects.filter( + guid=guid, + collection__provider__required_metadata_template=template, + state__in=[CollectionSubmissionStates.PENDING, CollectionSubmissionStates.ACCEPTED], + ).exists() + ) + if template.is_for_collections and not already_submitted: + record, _ = CedarMetadataRecord.objects.get_or_create( + guid=guid, + template=template, + defaults={'metadata': metadata, 'is_published': is_published}, + ) + if record.metadata != metadata or record.is_published != is_published: + record.metadata = metadata + record.is_published = is_published + try: + record.save() + except ValidationError as e: + raise InvalidModelValueError(detail=e.messages[0]) + else: + record = CedarMetadataRecord(guid=guid, template=template, metadata=metadata, is_published=is_published) + try: + record.save() + except ValidationError as e: + raise InvalidModelValueError(detail=e.messages[0]) + except IntegrityError: + raise JSONAPIException(detail=f'Cedar metadata record already exists: guid=[{guid._id}], template=[{template._id}]') return record def update(self, instance, validated_data): From 26455b5e9a7b87909901bc256c363ad5c637c0fe Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Mon, 15 Jun 2026 10:19:17 -0400 Subject: [PATCH 2/3] refining logic --- api/cedar_metadata_records/serializers.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/api/cedar_metadata_records/serializers.py b/api/cedar_metadata_records/serializers.py index 8e01f6be06f..400e49aecc8 100644 --- a/api/cedar_metadata_records/serializers.py +++ b/api/cedar_metadata_records/serializers.py @@ -116,15 +116,12 @@ def create(self, validated_data): raise PermissionDenied if not template.is_active(): raise NotFound - already_submitted = ( - template.is_for_collections - and CollectionSubmission.objects.filter( - guid=guid, - collection__provider__required_metadata_template=template, - state__in=[CollectionSubmissionStates.PENDING, CollectionSubmissionStates.ACCEPTED], - ).exists() - ) - if template.is_for_collections and not already_submitted: + has_active_collection_submission = CollectionSubmission.objects.filter( + guid=guid, + collection__provider__required_metadata_template=template, + state__in=[CollectionSubmissionStates.PENDING, CollectionSubmissionStates.ACCEPTED], + ).exists() + if template.is_for_collections and not has_active_collection_submission: record, _ = CedarMetadataRecord.objects.get_or_create( guid=guid, template=template, From 0ad72e54462c091e54952ab5ee7c39eb644188e5 Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Mon, 15 Jun 2026 11:10:44 -0400 Subject: [PATCH 3/3] update filter field name --- api/cedar_metadata_records/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/cedar_metadata_records/serializers.py b/api/cedar_metadata_records/serializers.py index 400e49aecc8..4426679c18b 100644 --- a/api/cedar_metadata_records/serializers.py +++ b/api/cedar_metadata_records/serializers.py @@ -119,7 +119,7 @@ def create(self, validated_data): has_active_collection_submission = CollectionSubmission.objects.filter( guid=guid, collection__provider__required_metadata_template=template, - state__in=[CollectionSubmissionStates.PENDING, CollectionSubmissionStates.ACCEPTED], + machine_state__in=[CollectionSubmissionStates.PENDING.value, CollectionSubmissionStates.ACCEPTED.value], ).exists() if template.is_for_collections and not has_active_collection_submission: record, _ = CedarMetadataRecord.objects.get_or_create(