mirror of
https://github.com/graphql-python/graphene.git
synced 2024-12-02 14:33:58 +03:00
149 lines
3.3 KiB
Python
149 lines
3.3 KiB
Python
import graphene
|
|
from graphene import relay, resolve_only_args
|
|
|
|
class Ship(relay.Node):
|
|
'''A ship in the Star Wars saga'''
|
|
name = graphene.String(description='The name of the ship.')
|
|
|
|
@classmethod
|
|
def get_node(cls, id, info):
|
|
return get_ship(id)
|
|
|
|
class Faction(relay.Node):
|
|
'''A faction in the Star Wars saga'''
|
|
name = graphene.String(description='The name of the faction.')
|
|
ships = relay.ConnectionField(
|
|
Ship, description='The ships used by the faction.')
|
|
|
|
@resolve_only_args
|
|
def resolve_ships(self, **args):
|
|
# Transform the instance ship_ids into real instances
|
|
return [get_ship(ship_id) for ship_id in self.ships]
|
|
|
|
@classmethod
|
|
def get_node(cls, id, info):
|
|
return get_faction(id)
|
|
|
|
class IntroduceShip(relay.ClientIDMutation):
|
|
class Input:
|
|
ship_name = graphene.String(required=True)
|
|
faction_id = graphene.String(required=True)
|
|
|
|
ship = graphene.Field(Ship)
|
|
faction = graphene.Field(Faction)
|
|
|
|
@classmethod
|
|
def mutate_and_get_payload(cls, input, info):
|
|
ship_name = input.get('ship_name')
|
|
faction_id = input.get('faction_id')
|
|
ship = create_ship(ship_name, faction_id)
|
|
faction = get_faction(faction_id)
|
|
return IntroduceShip(ship=ship, faction=faction)
|
|
|
|
|
|
class Query(graphene.ObjectType):
|
|
rebels = graphene.Field(Faction)
|
|
empire = graphene.Field(Faction)
|
|
node = relay.NodeField()
|
|
|
|
@resolve_only_args
|
|
def resolve_rebels(self):
|
|
return get_rebels()
|
|
|
|
@resolve_only_args
|
|
def resolve_empire(self):
|
|
return get_empire()
|
|
|
|
|
|
class Mutation(graphene.ObjectType):
|
|
introduce_ship = graphene.Field(IntroduceShip)
|
|
|
|
schema = graphene.Schema(name='Starwars Relay Schema')
|
|
schema.query = Query
|
|
schema.mutation = Mutation
|
|
|
|
xwing = Ship(
|
|
id='1',
|
|
name='X-Wing',
|
|
)
|
|
ywing = Ship(
|
|
id='2',
|
|
name='Y-Wing',
|
|
)
|
|
awing = Ship(
|
|
id='3',
|
|
name='A-Wing',
|
|
)
|
|
|
|
# Yeah, technically it's Corellian. But it flew in the service of the rebels,
|
|
# so for the purposes of this demo it's a rebel ship.
|
|
falcon = Ship(
|
|
id='4',
|
|
name='Millenium Falcon',
|
|
)
|
|
homeOne = Ship(
|
|
id='5',
|
|
name='Home One',
|
|
)
|
|
tieFighter = Ship(
|
|
id='6',
|
|
name='TIE Fighter',
|
|
)
|
|
tieInterceptor = Ship(
|
|
id='7',
|
|
name='TIE Interceptor',
|
|
)
|
|
executor = Ship(
|
|
id='8',
|
|
name='Executor',
|
|
)
|
|
rebels = Faction(
|
|
id='1',
|
|
name='Alliance to Restore the Republic',
|
|
ships=['1', '2', '3', '4', '5']
|
|
)
|
|
empire = Faction(
|
|
id='2',
|
|
name='Galactic Empire',
|
|
ships=['6', '7', '8']
|
|
)
|
|
data = {
|
|
'Faction': {
|
|
'1': rebels,
|
|
'2': empire
|
|
},
|
|
'Ship': {
|
|
'1': xwing,
|
|
'2': ywing,
|
|
'3': awing,
|
|
'4': falcon,
|
|
'5': homeOne,
|
|
'6': tieFighter,
|
|
'7': tieInterceptor,
|
|
'8': executor
|
|
}
|
|
}
|
|
|
|
def create_ship(ship_name, faction_id):
|
|
from .schema import Ship
|
|
next_ship = len(data['Ship'].keys()) + 1
|
|
new_ship = Ship(
|
|
id=str(next_ship),
|
|
name=ship_name
|
|
)
|
|
data['Ship'][new_ship.id] = new_ship
|
|
data['Faction'][faction_id].ships.append(new_ship.id)
|
|
return new_ship
|
|
|
|
def get_ship(_id):
|
|
return data['Ship'][_id]
|
|
|
|
def get_faction(_id):
|
|
return data['Faction'][_id]
|
|
|
|
def get_rebels():
|
|
return get_faction('1')
|
|
|
|
def get_empire():
|
|
return get_faction('2')
|