skillbox/server/portfolio/mutations.py

110 lines
3.7 KiB
Python

import graphene
from graphene import relay
from api.utils import get_object
from portfolio.inputs import AddProjectArgument, UpdateProjectArgument, AddProjectEntryArgument, \
UpdateProjectEntryArgument
from portfolio.models import Project, ProjectEntry
from portfolio.schema import ProjectNode, ProjectEntryNode
from portfolio.serializers import ProjectSerializer, ProjectEntrySerializer
# class Mutation(relay.ClientIDMutation):
# class Meta:
# pass
#
# @classmethod
# def mutate_and_get_payload(cls, *args, **kwargs):
# data = kwargs.get(cls.meta.property)
# if data.get('id') is not None:
# project = get_object(cls.meta.serializer_class.model, data['id'])
# serializer = cls.meta.serializer_class(project, data=data)
# else:
# serializer = cls.meta.serializer_class(data=data)
# if serializer.is_valid():
# serializer.save()
# props = {
# cls.meta.property: serializer.instance,
# 'errors': None
# }
# return cls(**props)
#
# return cls(errors=['{}: {}'.format(key, value) for key, value in serializer.errors.items()])
class MutateProject(relay.ClientIDMutation):
errors = graphene.List(graphene.String)
project = graphene.Field(ProjectNode)
# class Meta:
# property = 'project'
# serializer_class = ProjectSerializer
@classmethod
def mutate_and_get_payload(cls, *args, **kwargs):
data = kwargs.get('project')
if data.get('id') is not None:
entity = get_object(Project, data['id'])
serializer = ProjectSerializer(entity, data=data)
else:
serializer = ProjectSerializer(data=data)
if serializer.is_valid():
serializer.save()
props = {
'project': serializer.instance,
'errors': None
}
return cls(**props)
return cls(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 MutateProjectEntry(relay.ClientIDMutation):
errors = graphene.List(graphene.String)
project_entry = graphene.Field(ProjectEntryNode)
@classmethod
def mutate_and_get_payload(cls, *args, **kwargs):
data = kwargs.get('project_entry')
if data.get('project') is not None:
data['project'] = get_object(Project, data.get('project')).id
if data.get('id') is not None:
entity = get_object(ProjectEntry, data['id'])
serializer = ProjectEntrySerializer(entity, data=data, partial=True)
else:
serializer = ProjectEntrySerializer(data=data)
if serializer.is_valid():
serializer.save()
return cls(project_entry=serializer.instance, errors=None)
return cls(project_entry=None, errors=['{}: {}'.format(key, value) for key, value in serializer.errors.items()])
class AddProjectEntry(MutateProjectEntry):
class Input:
project_entry = graphene.Argument(AddProjectEntryArgument)
class UpdateProjectEntry(MutateProjectEntry):
class Input:
project_entry = graphene.Argument(UpdateProjectEntryArgument)
class PortfolioMutations:
add_project = AddProject.Field()
update_project = UpdateProject.Field()
add_project_entry = AddProjectEntry.Field()
update_project_entry = UpdateProjectEntry.Field()