87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
import graphene
|
|
from graphene import relay
|
|
|
|
from api.utils import get_object
|
|
from rooms.inputs import UpdateRoomArgument, AddRoomArgument, AddRoomEntryArgument
|
|
from rooms.models import Room
|
|
from rooms.schema import RoomNode, RoomEntryNode
|
|
from rooms.serializers import RoomSerializer, RoomEntrySerializer
|
|
from user.models import SchoolClass
|
|
|
|
|
|
class MutateRoom(relay.ClientIDMutation):
|
|
errors = graphene.List(graphene.String)
|
|
room = graphene.Field(RoomNode)
|
|
|
|
@classmethod
|
|
def mutate_and_get_payload(cls, *args, **kwargs):
|
|
# FIXME
|
|
room_data = kwargs.get('room')
|
|
user_group = get_object(SchoolClass, room_data.get('user_group').get('id'))
|
|
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 DeleteRoom(relay.ClientIDMutation):
|
|
class Input:
|
|
id = graphene.ID(required=True)
|
|
|
|
success = graphene.Boolean()
|
|
errors = graphene.List(graphene.String)
|
|
|
|
@classmethod
|
|
def mutate_and_get_payload(cls, *args, **kwargs):
|
|
id = kwargs.get('id')
|
|
room = get_object(Room, id)
|
|
room.delete()
|
|
return cls(success=True)
|
|
|
|
|
|
class AddRoomEntry(relay.ClientIDMutation):
|
|
class Input:
|
|
room_entry = graphene.Argument(AddRoomEntryArgument)
|
|
|
|
room_entry = graphene.Field(RoomEntryNode)
|
|
errors = graphene.List(graphene.String)
|
|
|
|
@classmethod
|
|
def mutate_and_get_payload(cls, *args, **kwargs):
|
|
room_entry_data = kwargs.get('room_entry')
|
|
|
|
room_entry_data['room'] = get_object(Room, room_entry_data.get('room')).id
|
|
|
|
serializer = RoomEntrySerializer(data=room_entry_data)
|
|
|
|
if serializer.is_valid():
|
|
serializer.save()
|
|
|
|
return cls(room_entry=serializer.instance)
|
|
|
|
return cls(room_entry=None, errors=['{}: {}'.format(key, value) for key, value in serializer.errors.items()])
|
|
|
|
|
|
class RoomMutations:
|
|
update_room = UpdateRoom.Field()
|
|
add_room = AddRoom.Field()
|
|
delete_room = DeleteRoom.Field()
|
|
add_room_entry = AddRoomEntry.Field()
|