diff options
author | Marcin Gębala <maarcin.gebala@gmail.com> | 2016-12-01 11:25:14 +0100 |
---|---|---|
committer | Marcin Gębala <maarcin.gebala@gmail.com> | 2017-01-04 11:19:50 +0100 |
commit | 45849c499964f53c522fe2c6d8a60a2ba16c6479 (patch) | |
tree | 8184610c8b1237978cdf5714029bab2ee02d01c8 /saleor/graphql | |
parent | 3d3500d35559bc07a071b9520f844a36cd251e16 (diff) | |
download | saleor-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.py | 58 |
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) |