Skip to content
Snippets Groups Projects
Commit c89f2221 authored by Andreas Hubel's avatar Andreas Hubel
Browse files

first draft for read-only graphql api

parent 8edb2eae
Branches graphql
No related tags found
No related merge requests found
import graphene
import core.schema
class Query(core.schema.Query, graphene.ObjectType):
# This class will inherit from multiple Queries
# as we begin to add more apps to our project
pass
schema = graphene.Schema(query=Query)
from django.urls import include, path
from rest_framework.urlpatterns import format_suffix_patterns
from graphene_django.views import GraphQLView
from . import views
......@@ -10,6 +11,8 @@ urlpatterns = [
path('stickers', views.stickers, name='stickers'),
path('friends', views.friends, name='friends'),
path('conferences', views.ConferenceList.as_view(), name='conference-list'),
path('graphql', GraphQLView.as_view(graphiql=True)),
path('<slug:conference>', views.ConferenceDetail.as_view(), name='conference-detail'),
path('<slug:conference>/tracks', views.ConferenceTrackList.as_view(), name='conferencetrack-list'),
path('<slug:conference>/track/<slug:track>', views.ConferenceTrackDetail.as_view(), name='conferencetrack-detail'),
......
from graphene import relay, ObjectType, List, Field, String
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from core.models import Conference, ConferenceTrack, Venue, Event, Room, RoomLink, Sticker, UserProfile
from api import views
# pylint: disable=no-self-argument, no-member
class ConferenceTrackType(DjangoObjectType):
class Meta:
model = ConferenceTrack
filter_fields = ['slug', 'name']
interfaces = (relay.Node, )
class RoomType(DjangoObjectType):
class Meta:
model = Room
filter_fields = ['id', 'name', 'room_type']
interfaces = (relay.Node, )
class VenueType(DjangoObjectType):
class Meta:
model = Venue
filter_fields = ['id', 'name']
interfaces = (relay.Node, )
#path('<slug:conference>/venue/<slug:venue>/rooms', views.ConferenceVenueRoomList.as_view(), name='venue-rooms'),
rooms = List(RoomType)
def resolve_rooms(venue, info):
return Room.objects.filter(conference__slug=venue.conference.slug, venue__slug=venue.slug).order_by('name')
class LinkType(DjangoObjectType):
class Meta:
model = RoomLink
filter_fields = ['name', 'link_type']
interfaces = (relay.Node, )
class ConferenceType(DjangoObjectType):
class Meta:
model = Conference
filter_fields = ['id', 'slug', 'name']
interfaces = (relay.Node, )
tracks = List(ConferenceTrackType)
def resolve_tracks(conference, info):
#return views.ConferenceTrackList.get_queryset(conference=parent.slug)
return ConferenceTrack.objects.filter(conference__slug=conference.slug).order_by('name')
track = Field(ConferenceTrackType, slug=String(required=True))
def resolve_track(conference, info, slug):
#return views.ConferenceTrackList.get_queryset(conference=parent.slug)
return ConferenceTrack.objects.get(conference__slug=conference.slug, slug=slug)
# path('<slug:conference>/venues', views.ConferenceVenueList.as_view(), name='venue-list'),
venues = List(VenueType)
def resolve_venues(conference, info):
return Venue.objects.filter(conference__slug=conference.slug).order_by('name')
# path('<slug:conference>/venue/<slug:venue>', views.ConferenceVenueDetail.as_view(), name='venue-detail'),
venue = Field(VenueType, slug=String(required=True))
def resolve_venue(conference, info, slug):
# views.ConferenceVenueDetail.get_object(conference=conference.slug, venue=slug)
return Venue.objects.get(conference__slug=conference.slug, slug=slug)
# path('<slug:conference>/rooms', views.ConferenceRoomList.as_view(), name='room-list'),
rooms = List(RoomType)
def resolve_rooms(conference, info):
return Room.objects.filter(conference__slug=conference.slug).order_by('name')
# path('<slug:conference>/room/<uuid:pk>', views.ConferenceRoomDetail.as_view(), name='room-detail'),
room = Field(RoomType, uuid=String(required=True))
def resolve_room(conference, info, uuid):
return Room.objects.get(conference__slug=conference.slug, pk=uuid)
class StickerType(DjangoObjectType):
class Meta:
model = Sticker
filter_fields = ['name']
interfaces = (relay.Node, )
class Query(ObjectType):
node = relay.Node.Field()
#sticker = relay.Node.Field(StickerType)
sticker = Field(StickerType, name=String(required=True))
stickers = List(StickerType)
stickersRelay = DjangoFilterConnectionField(StickerType)
#conference = relay.Node.Field(ConferenceType)
conference = Field(ConferenceType, slug=String(required=True))
conferences = List(ConferenceType)
conferencesRelay = DjangoFilterConnectionField(StickerType)
def resolve_me(root, info):
pass
def resolve_conference(root, info, slug):
try:
return Conference.objects.get(slug=slug)
except Conference.DoesNotExist:
return None
def resolve_conferences(root, info):
return Conference.objects.all()
def resolve_sticker(root, info, name):
try:
return Conference.objects.get(name=name)
except Conference.DoesNotExist:
return None
def resolve_stickers(root, info):
return Sticker.objects.all()
# pylint: enable=no-self-argument, no-member
......@@ -50,6 +50,7 @@ INSTALLED_APPS = [
# 3rd party extensions
'rest_framework',
'graphene_django',
# our apps
'core',
......@@ -141,3 +142,8 @@ STATIC_ROOT = BASE_DIR.parent / 'static.dist'
# STATICFILES_DIRS = [
# BASE_DIR / "static",
# ]
GRAPHENE = {
"SCHEMA": "api.schema.schema"
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment