Skip to content

Commit b30e3e3

Browse files
committed
fix metadata validation
1 parent 5fbd517 commit b30e3e3

2 files changed

Lines changed: 20 additions & 4 deletions

File tree

osf/models/cedar_metadata.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@
55
from osf.models.base import BaseModel, ObjectIDMixin
66
from osf.utils.datetime_aware_jsonfield import DateTimeAwareJSONField
77

8+
# Fields generated by the CEDAR server on instance creation — frontend never sends them
9+
CEDAR_SERVER_GENERATED_FIELDS = frozenset({
10+
'@id',
11+
'pav:createdOn',
12+
'pav:createdBy',
13+
'pav:lastUpdatedOn',
14+
'oslc:modifiedBy',
15+
})
16+
817

918
class CedarMetadataTemplate(ObjectIDMixin, BaseModel):
1019
schema_name = models.CharField(max_length=255, default=None)
@@ -51,14 +60,20 @@ def get_template_version(self):
5160

5261
def clean(self):
5362
if self.is_published:
63+
schema = dict(self.template.template)
64+
if 'required' in schema:
65+
schema['required'] = [
66+
f for f in schema['required']
67+
if f not in CEDAR_SERVER_GENERATED_FIELDS
68+
]
69+
metadata = {k: v for k, v in self.metadata.items() if v != {}}
5470
try:
55-
jsonschema_validate(self.metadata, self.template.template)
71+
jsonschema_validate(metadata, schema)
5672
except JsonSchemaValidationError as e:
5773
raise ValidationError(
5874
f'CEDAR metadata does not validate against template "{self.template.schema_name}": {e.message}'
5975
)
6076

6177
def save(self, *args, **kwargs):
62-
self.clean()
78+
super().save(*args, **kwargs)
6379
self.guid.referent.update_search()
64-
return super().save(*args, **kwargs)

osf_tests/test_collection_submission.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,8 @@ def test_share_update_cedar_metadata_record(self, unmoderated_collection_submiss
833833
},
834834
'identifier': {}
835835
}
836-
with mock.patch('api.share.utils.pls_send_trove_record'):
836+
with mock.patch('api.share.utils.pls_send_trove_record'), \
837+
mock.patch('api.share.utils.share_update_cedar_metadata_record'):
837838
record = CedarMetadataRecord.objects.create(
838839
guid=unmoderated_collection_submission_public.guid,
839840
template=cedar_template,

0 commit comments

Comments
 (0)