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()