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)