import graphene from graphene import relay from graphene_django import DjangoObjectType from graphene_django.filter import DjangoFilterConnectionField from graphene_django.rest_framework.mutation import SerializerMutation from api.utils import get_object from rooms.models import Room, RoomEntry from rooms.serializers import RoomSerializer from users.schema import UserNode class RoomEntryNode(DjangoObjectType): pk = graphene.Int() author = UserNode() class Meta: model = RoomEntry filter_fields = ['slug'] interfaces = (relay.Node,) def resolve_pk(self, *args, **kwargs): return self.id class RoomNode(DjangoObjectType): pk = graphene.Int() entry_count = graphene.Int() class Meta: model = Room filter_fields = ['slug', 'appearance'] interfaces = (relay.Node,) def resolve_pk(self, *args, **kwargs): return self.id def resolve_entry_count(self, *args, **kwargs): return self.room_entries.count() class RoomsQuery(object): # room = relay.Node.Field(RoomNode) room_entry = graphene.Field(RoomEntryNode, id=graphene.ID(), slug=graphene.String()) room = graphene.Field(RoomNode, slug=graphene.String(), id=graphene.ID(), appearance=graphene.String()) rooms = DjangoFilterConnectionField(RoomNode) all_room_entries = DjangoFilterConnectionField(RoomEntryNode) def resolve_rooms(self, info, **kwargs): user = info.context.user if user.is_superuser: return Room.objects.all() return Room.objects.filter(school_class__in=user.school_classes.all()) def resolve_room(self, info, **kwargs): slug = kwargs.get('slug') room_id = kwargs.get('id') if room_id is not None: return get_object(Room, room_id) if slug is not None: return Room.objects.get(slug=slug) return None def resolve_room_entry(self, info, **kwargs): slug = kwargs.get('slug') id = kwargs.get('id') if id is not None: return get_object(RoomEntry, id) if slug is not None: return RoomEntry.objects.get(slug=slug) return None