skillbox/server/rooms/mutations.py

47 lines
1.5 KiB
Python

import graphene
from graphene import relay
from graphql_relay import from_global_id
from api.utils import get_object
from rooms.inputs import UpdateRoomArgument, AddRoomArgument
from rooms.models import Room
from rooms.schema import RoomNode
from rooms.serializers import RoomSerializer
from user.models import UserGroup
class MutateRoom(relay.ClientIDMutation):
errors = graphene.List(graphene.String)
room = graphene.Field(RoomNode)
@classmethod
def mutate_and_get_payload(cls, *args, **kwargs):
room_data = kwargs.get('room')
user_group = get_object(UserGroup, room_data.get('user_group'))
room_data['user_group'] = user_group.id
if room_data.get('id') is not None:
room = get_object(Room, room_data['id'])
serializer = RoomSerializer(room, data=room_data)
else:
serializer = RoomSerializer(data=room_data)
if serializer.is_valid():
serializer.save()
return cls(room=serializer.instance, errors=None)
return cls(room=None, errors=['{}: {}'.format(key, value) for key, value in serializer.errors.items()])
class AddRoom(MutateRoom):
class Input:
room = graphene.Argument(AddRoomArgument) # NB: can't be named AddRoomInput, otherwise graphene complains
class UpdateRoom(MutateRoom):
class Input:
room = graphene.Argument(UpdateRoomArgument) # NB: can't be named ChangeRoomInput, otherwise graphene complains
class RoomMutations:
update_room = UpdateRoom.Field()
add_room = AddRoom.Field()