def create(self, validated_data): request = self.context['request'] course_id = validated_data['course_id'] title = validated_data['title'] description = validated_data.get('description', '') metadata = validated_data.get('metadata', None) upload_result = self.handle_file_upload() if 'upload_file_name' in upload_result: title = upload_result['upload_file_name'] resource_attrs = { "course": course_id, "title": title, "description": description, "owner": request.user.profile, "media_store": upload_result['media_store'], "upload_file_name": upload_result['upload_file_name'], "is_upload": upload_result['is_upload'], } # Metadata cannot be null, so only include if it's non-null if metadata is not None: resource_attrs['metadata'] = json.dumps(metadata) resource = Resource(**resource_attrs) resource.save() return resource
def test_save_with_metadata(self): title = "Test Resource" course = TestResource.test_course default_metadata = Resource.metadata_default() missing_metadata = ("", None) invalid_metadata = (None, True, False, 123, {}) valid_metadata = ([], [{"label":"X", "value": "Y"}]) # check that missing or invalid metadata values are saved using the default value # for example the string "null" is not a valid value, so it should be overwritten with "[]" for metadata in missing_metadata + invalid_metadata: instance = Resource(course=course, title=title, metadata=metadata) instance.save() self.assertNotEqual(metadata, instance.metadata) self.assertEqual(default_metadata, instance.metadata) # check that valid metadata is saved unchanged for metadata in valid_metadata: instance = Resource(course=course, title=title, metadata=json.dumps(metadata)) instance.save() self.assertEqual(json.dumps(metadata), instance.metadata)