import graphene from graphene import relay from api.utils import get_object from rooms.inputs import ChangeRoomArgument, AddRoomArgumen 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 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(AddRoomArgumen) # NB: can't be named AddRoomInput, otherwise graphene complains class ChangeRoom(MutateRoom): class Input: room = graphene.Argument(ChangeRoomArgument) # NB: can't be named ChangeRoomInput, otherwise graphene complains class RoomMutations: change_room = ChangeRoom.Field() add_room = AddRoom.Field()