41 lines
1.4 KiB
Python
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()
|