def create(self, validated_data): node = Node.load(validated_data.pop('node', None)) if not node: raise exceptions.NotFound('Unable to find Node with specified id.') elif node.is_deleted: raise exceptions.ValidationError( 'Cannot create a preprint from a deleted node.') auth = get_user_auth(self.context['request']) if not node.has_permission(auth.user, permissions.ADMIN): raise exceptions.PermissionDenied primary_file = validated_data.pop('primary_file', None) if not primary_file: raise exceptions.ValidationError( detail= 'You must specify a valid primary_file to create a preprint.') provider = validated_data.pop('provider', None) if not provider: raise exceptions.ValidationError( detail='You must specify a valid provider to create a preprint.' ) if PreprintService.find( Q('node', 'eq', node) & Q('provider', 'eq', provider)).count(): conflict = PreprintService.find_one( Q('node', 'eq', node) & Q('provider', 'eq', provider)) raise Conflict( 'Only one preprint per provider can be submitted for a node. Check `meta[existing_resource_id]`.', meta={'existing_resource_id': conflict._id}) preprint = PreprintService(node=node, provider=provider) self.set_field(preprint.set_primary_file, primary_file, auth, save=True) preprint.node._has_abandoned_preprint = True preprint.node.save() return self.update(preprint, validated_data)