11import graphene
22from django .apps import apps
3+ from django .db import transaction
34from graphene import relay
45from graphene_django import DjangoConnectionField , DjangoObjectType
5- from graphql_jwt .decorators import login_required
6+ from graphql_jwt .decorators import login_required , staff_member_required
7+ from graphql_relay import from_global_id
68
79from events .models import Event , Occurrence
8- from venues .schema import VenueNode
10+ from kukkuu .exceptions import KukkuuGraphQLError
11+ from venues .models import Venue
912
1013EventTranslation = apps .get_model ("events" , "EventTranslation" )
1114
@@ -34,8 +37,9 @@ def get_node(cls, info, id):
3437
3538
3639class OccurrenceNode (DjangoObjectType ):
37- venue = graphene .Field (VenueNode )
38- event = graphene .Field (EventNode )
40+ venue_id = graphene .GlobalID ()
41+ event_id = graphene .GlobalID ()
42+ time = graphene .DateTime ()
3943
4044 @classmethod
4145 @login_required
@@ -53,9 +57,72 @@ class Meta:
5357 interfaces = (relay .Node ,)
5458
5559
60+ class EventTranslationsInput (graphene .InputObjectType ):
61+ name = graphene .String (required = True )
62+ short_description = graphene .String ()
63+ description = graphene .String ()
64+ language_code = graphene .String (required = True )
65+
66+
67+ class AddEventMutation (graphene .relay .ClientIDMutation ):
68+ class Input :
69+ translations = graphene .List (EventTranslationsInput )
70+ duration = graphene .Int ()
71+ participants_per_invite = graphene .String (required = True )
72+ capacity_per_occurrence = graphene .Int (required = True )
73+ published_at = graphene .DateTime ()
74+
75+ event = graphene .Field (EventNode )
76+
77+ @classmethod
78+ @staff_member_required
79+ @transaction .atomic
80+ def mutate_and_get_payload (cls , root , info , ** kwargs ):
81+ # TODO: Add validation
82+ event = Event .objects .create_translatable_object (** kwargs )
83+ # TODO: Add support for image upload
84+ return AddEventMutation (event = event )
85+
86+
87+ class AddOccurrenceMutation (graphene .relay .ClientIDMutation ):
88+ class Input :
89+ time = graphene .DateTime (required = True )
90+ event_id = graphene .GlobalID (required = True )
91+ venue_id = graphene .GlobalID (required = True )
92+
93+ occurrence = graphene .Field (OccurrenceNode )
94+
95+ @classmethod
96+ @staff_member_required
97+ @transaction .atomic
98+ def mutate_and_get_payload (cls , root , info , ** kwargs ):
99+ # TODO: Validate data
100+ event_id = from_global_id (kwargs ["event_id" ])[1 ]
101+ try :
102+ event = Event .objects .get (pk = event_id )
103+ kwargs ["event_id" ] = event_id
104+ except Event .DoesNotExist as e :
105+ raise KukkuuGraphQLError (e )
106+
107+ venue_id = from_global_id (kwargs ["venue_id" ])[1 ]
108+ try :
109+ venue = Venue .objects .get (pk = venue_id )
110+ kwargs ["venue_id" ] = venue_id
111+ except Venue .DoesNotExist as e :
112+ raise KukkuuGraphQLError (e )
113+
114+ occurrence = Occurrence .objects .create (** kwargs , event = event , venue = venue )
115+ return AddOccurrenceMutation (occurrence = occurrence )
116+
117+
56118class Query :
57119 events = DjangoConnectionField (EventNode )
58120 occurrences = DjangoConnectionField (OccurrenceNode )
59121
60122 event = relay .Node .Field (EventNode )
61123 occurrence = relay .Node .Field (OccurrenceNode )
124+
125+
126+ class Mutation :
127+ add_event = AddEventMutation .Field ()
128+ add_occurrence = AddOccurrenceMutation .Field ()
0 commit comments