diff --git a/src/api/schema.py b/src/api/schema.py new file mode 100644 index 0000000000000000000000000000000000000000..e79e221f1c2268753bdb5134e02497135f561b72 --- /dev/null +++ b/src/api/schema.py @@ -0,0 +1,11 @@ +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) diff --git a/src/api/urls.py b/src/api/urls.py index ca9d98c75aacba9d163949e436d44eafabb1ed64..9d34a6342dd00bd3c3e9be48858ab184b4335fb7 100644 --- a/src/api/urls.py +++ b/src/api/urls.py @@ -1,5 +1,6 @@ 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'), diff --git a/src/core/schema.py b/src/core/schema.py new file mode 100644 index 0000000000000000000000000000000000000000..bc20b9088a53eda5a33755c8a35f3ef248be2495 --- /dev/null +++ b/src/core/schema.py @@ -0,0 +1,120 @@ +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 diff --git a/src/rc3platform/settings/base.py b/src/rc3platform/settings/base.py index f54019c83238fff8797995a7b9a5aaac935e5948..e41adb1c084126814e1bb38e8c4af117f7d913eb 100644 --- a/src/rc3platform/settings/base.py +++ b/src/rc3platform/settings/base.py @@ -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