aboutsummaryrefslogtreecommitdiff
path: root/saleor/graphql
diff options
context:
space:
mode:
authorMarcin Gębala <maarcin.gebala@gmail.com>2016-12-01 11:25:14 +0100
committerMarcin Gębala <maarcin.gebala@gmail.com>2017-01-04 11:19:50 +0100
commit45849c499964f53c522fe2c6d8a60a2ba16c6479 (patch)
tree8184610c8b1237978cdf5714029bab2ee02d01c8 /saleor/graphql
parent3d3500d35559bc07a071b9520f844a36cd251e16 (diff)
downloadsaleor-frontend-45849c499964f53c522fe2c6d8a60a2ba16c6479.tar.gz
saleor-frontend-45849c499964f53c522fe2c6d8a60a2ba16c6479.tar.bz2
saleor-frontend-45849c499964f53c522fe2c6d8a60a2ba16c6479.zip
Refactor GraphQL API; move schema to single file
Diffstat (limited to 'saleor/graphql')
-rw-r--r--saleor/graphql/api.py (renamed from saleor/graphql/product_schema.py)125
-rw-r--r--saleor/graphql/query.py58
2 files changed, 90 insertions, 93 deletions
diff --git a/saleor/graphql/product_schema.py b/saleor/graphql/api.py
index 1d8cf615..5db61436 100644
--- a/saleor/graphql/product_schema.py
+++ b/saleor/graphql/api.py
@@ -3,52 +3,30 @@ import graphene
from graphene import relay
from graphene_django import DjangoObjectType
+from graphene_django.debug import DjangoDebug
from ..product.models import (AttributeChoiceValue, Category, Product,
- ProductAttribute, ProductImage, ProductVariant)
-from .utils import DjangoPkInterface
+ ProductAttribute, ProductImage, ProductVariant)
+from .utils import DjangoPkInterface, get_object_or_none
-class PriceType(graphene.ObjectType):
- gross = graphene.Float()
- net = graphene.Float()
- currency = graphene.String()
-
-
-class ProductImageType(DjangoObjectType):
- url = graphene.String(size=graphene.String())
-
- class Meta:
- model = ProductImage
- interfaces = (relay.Node, DjangoPkInterface)
-
- def resolve_url(self, args, context, info):
- size = args.get('size')
- if size:
- return self.image.crop[size].url
- return self.image.url
+def resolve_products(root, args, context, info):
+ pass
-class ProductVariantType(DjangoObjectType):
- price_override = graphene.Field(PriceType)
- stock_quantity = graphene.Int()
-
+class CategoryType(DjangoObjectType):
class Meta:
- model = ProductVariant
+ model = Category
interfaces = (relay.Node, DjangoPkInterface)
- @graphene.resolve_only_args
- def resolve_stock_quantity(self):
- return self.get_stock_quantity()
-
class ProductType(DjangoObjectType):
url = graphene.String()
- price = graphene.Field(PriceType)
image_url = graphene.String()
- images = graphene.List(ProductImageType)
is_available = graphene.Boolean()
- variants = graphene.List(ProductVariantType)
+ price = graphene.Field(lambda: PriceType)
+ images = graphene.List(lambda: ProductImageType)
+ variants = graphene.List(lambda: ProductVariantType)
class Meta:
model = Product
@@ -76,11 +54,32 @@ class ProductType(DjangoObjectType):
return self.get_absolute_url()
-class CategoryType(DjangoObjectType):
+class ProductVariantType(DjangoObjectType):
+ stock_quantity = graphene.Int()
+ price_override = graphene.Field(lambda: PriceType)
+
class Meta:
- model = Category
+ model = ProductVariant
+ interfaces = (relay.Node, DjangoPkInterface)
+
+ @graphene.resolve_only_args
+ def resolve_stock_quantity(self):
+ return self.get_stock_quantity()
+
+
+class ProductImageType(DjangoObjectType):
+ url = graphene.String(size=graphene.String())
+
+ class Meta:
+ model = ProductImage
interfaces = (relay.Node, DjangoPkInterface)
+ def resolve_url(self, args, context, info):
+ size = args.get('size')
+ if size:
+ return self.image.crop[size].url
+ return self.image.url
+
class ProductAttributeValue(DjangoObjectType):
class Meta:
@@ -89,7 +88,7 @@ class ProductAttributeValue(DjangoObjectType):
class ProductAttributeType(DjangoObjectType):
- values = graphene.List(ProductAttributeValue)
+ values = graphene.List(lambda: ProductAttributeValue)
class Meta:
model = ProductAttribute
@@ -98,3 +97,59 @@ class ProductAttributeType(DjangoObjectType):
@graphene.resolve_only_args
def resolve_values(self):
return self.values.all()
+
+
+class PriceType(graphene.ObjectType):
+ gross = graphene.Float()
+ net = graphene.Float()
+ currency = graphene.String()
+
+
+class Viewer(graphene.ObjectType):
+ category = graphene.Field(
+ CategoryType, pk=graphene.Argument(graphene.Int, required=True))
+ product = graphene.Field(
+ ProductType, pk=graphene.Argument(graphene.Int, required=True))
+ attributes = graphene.List(ProductAttributeType)
+ categories = relay.ConnectionField(CategoryType)
+ products = relay.ConnectionField(ProductType)
+
+ def categories_queryset(self):
+ return Category.objects.prefetch_related(
+ 'products__images', 'products__variants',
+ 'products__variants__stock')
+
+ def products_queryset(self):
+ return Product.objects.prefetch_related(
+ 'images', 'categories', 'variants', 'variants__stock')
+
+ def resolve_category(self, args, context, info):
+ qs = self.categories_queryset()
+ return get_object_or_none(qs, pk=args.get('pk'))
+
+ def resolve_product(self, args, context, info):
+ qs = self.products_queryset()
+ return get_object_or_none(qs, pk=args.get('pk'))
+
+ def resolve_attributes(self, args, context, info):
+ return ProductAttribute.objects.prefetch_related('values').all()
+
+ def resolve_categories(self, args, context, info):
+ qs = self.categories_queryset()
+ return qs.all()
+
+ def resolve_products(self, args, context, info):
+ qs = self.products_queryset()
+ return qs.all()
+
+
+class Query(graphene.ObjectType):
+ viewer = graphene.Field(Viewer)
+ node = relay.Node.Field()
+ debug = graphene.Field(DjangoDebug, name='__debug')
+
+ def resolve_viewer(self, args, context, info):
+ return Viewer()
+
+
+schema = graphene.Schema(Query)
diff --git a/saleor/graphql/query.py b/saleor/graphql/query.py
deleted file mode 100644
index 1ed21975..00000000
--- a/saleor/graphql/query.py
+++ /dev/null
@@ -1,58 +0,0 @@
-import graphene
-
-from graphene import relay
-from graphene_django.debug import DjangoDebug
-
-from ..product.models import Category, Product, ProductAttribute
-from .product_schema import CategoryType, ProductAttributeType, ProductType
-from .utils import get_object_or_none
-
-
-class Viewer(graphene.ObjectType):
- category = graphene.Field(
- CategoryType, pk=graphene.Argument(graphene.Int, required=True))
- product = graphene.Field(
- ProductType, pk=graphene.Argument(graphene.Int, required=True))
- attributes = graphene.List(ProductAttributeType)
- categories = relay.ConnectionField(CategoryType)
- products = relay.ConnectionField(ProductType)
-
- def categories_queryset(self):
- return Category.objects.prefetch_related(
- 'products__images', 'products__variants',
- 'products__variants__stock')
-
- def products_queryset(self):
- return Product.objects.prefetch_related(
- 'images', 'categories', 'variants', 'variants__stock')
-
- def resolve_category(self, args, context, info):
- qs = self.categories_queryset()
- return get_object_or_none(qs, pk=args.get('pk'))
-
- def resolve_product(self, args, context, info):
- qs = self.products_queryset()
- return get_object_or_none(qs, pk=args.get('pk'))
-
- def resolve_attributes(self, args, context, info):
- return ProductAttribute.objects.prefetch_related('values').all()
-
- def resolve_categories(self, args, context, info):
- qs = self.categories_queryset()
- return qs.all()
-
- def resolve_products(self, args, context, info):
- qs = self.products_queryset()
- return qs.all()
-
-
-class Query(graphene.ObjectType):
- viewer = graphene.Field(Viewer)
- node = relay.Node.Field()
- debug = graphene.Field(DjangoDebug, name='__debug')
-
- def resolve_viewer(self, args, context, info):
- return Viewer()
-
-
-schema = graphene.Schema(Query)