skillbox/server/portfolio/mutations.py

41 lines
1.4 KiB
Python

import graphene
from graphene import relay
from api.utils import get_object
from portfolio.inputs import AddProjectArgument, UpdateProjectArgument
from portfolio.models import Project
from portfolio.schema import ProjectNode
from portfolio.serializers import ProjectSerializer
class MutateProject(relay.ClientIDMutation):
errors = graphene.List(graphene.String)
project = graphene.Field(ProjectNode)
@classmethod
def mutate_and_get_payload(cls, *args, **kwargs):
project_data = kwargs.get('project')
if project_data.get('id') is not None:
project = get_object(Project, project_data['id'])
serializer = ProjectSerializer(project, data=project_data)
else:
serializer = ProjectSerializer(data=project_data)
if serializer.is_valid():
serializer.save()
return cls(project=serializer.instance, errors=None)
return cls(project=None, errors=['{}: {}'.format(key, value) for key, value in serializer.errors.items()])
class AddProject(MutateProject):
class Input:
project = graphene.Argument(AddProjectArgument) # NB: can't be named AddProjectInput, otherwise graphene complains
class UpdateProject(MutateProject):
class Input:
project = graphene.Argument(UpdateProjectArgument)
class PortfolioMutations:
add_project = AddProject.Field()
update_project = UpdateProject.Field()