schema.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import graphene
  2. from graphene_django.types import DjangoObjectType
  3. from .models import Category
  4. import json
  5. from functools import reduce
  6. from .serializers import CategorySerializer
  7. import operator
  8. from django.db.models import Q
  9. import goods.schema as good_schema
  10. from django.forms.models import model_to_dict
  11. class CategoryType(graphene.ObjectType):
  12. _id = graphene.String(name='_id')
  13. name = graphene.String()
  14. parent = graphene.Field(lambda: CategoryType)
  15. goods = graphene.List(good_schema.GoodType)
  16. subcategories = graphene.List(lambda: CategoryType)
  17. def resolve__id(self,info):
  18. if isinstance(self, Category):
  19. return self._id
  20. else:
  21. return self
  22. def resolve_goods(self,info):
  23. try:
  24. iter(self.goods)
  25. return self.goods
  26. except:
  27. return self.goods.all()
  28. def resolve_parent(self,info):
  29. return self.parent
  30. def resolve_subcategories(self,info):
  31. query_set = []
  32. query_set = Category.objects.filter(parent = self._id)
  33. return query_set
  34. class CategoryInput(graphene.InputObjectType):
  35. _id = graphene.String(name='_id')
  36. name = graphene.String()
  37. parent = graphene.Field(lambda:CategoryInput)
  38. goods = graphene.List(good_schema.GoodInput)
  39. subcategories = graphene.List(lambda:CategoryInput)
  40. class Query(graphene.ObjectType):
  41. CategoryFind = graphene.List(CategoryType,query = graphene.String())
  42. CategoryFindOne = graphene.Field(CategoryType,query = graphene.String())
  43. def resolve_CategoryFind(self,info,query = "[{}]"):
  44. additional_params = {}
  45. query_list = json.loads(query)
  46. filter_params = query_list[0]
  47. if len(query_list) > 1:
  48. additional_params = query_list[1]
  49. skip = additional_params.get("skip",0)
  50. limit = additional_params.get("limit",20)
  51. order_by = additional_params.get("orderBy","_id")
  52. query_set = Category.objects.all()
  53. if len(filter_params):
  54. query_set = query_set.filter(reduce(operator.or_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  55. query_set = query_set.order_by(order_by)[skip:skip+limit]
  56. return query_set
  57. def resolve_CategoryFindOne(self,info,query = "[{}]"):
  58. additional_params = {}
  59. query_list = json.loads(query)
  60. filter_params = query_list[0]
  61. if len(query_list) > 1:
  62. additional_params = query_list[1]
  63. skip = additional_params.get("skip",0)
  64. limit = additional_params.get("limit",20)
  65. order_by = additional_params.get("orderBy","_id")
  66. query_set = Category.objects.all()
  67. if len(filter_params):
  68. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  69. return query_set.first()
  70. class CategoryUpsert(graphene.Mutation):
  71. class Arguments:
  72. category = CategoryInput(required=True)
  73. Output =CategoryType
  74. @staticmethod
  75. def mutate(root,info,category ={}):
  76. new_category=None
  77. good_list = []
  78. subcategories_list = []
  79. _id = category.get("_id",None)
  80. user = info.context.user
  81. if not user.is_superuser:
  82. raise Exception("Authentication credentials were not provided")
  83. if "goods" in category:
  84. good_list = [f['_id'] for f in category["goods"]]
  85. category.pop("goods",None)
  86. if "subcategories" in category:
  87. subcategories_list = [Category.objects.get(_id = f["_id"]) for f in category["subcategories"]]
  88. category.pop("subcategories",None)
  89. try:
  90. if _id:
  91. new_category = Category.objects.get(_id = _id)
  92. else:
  93. new_category = Category()
  94. except:
  95. raise Exception("Невірні дані")
  96. if "parent" in category:
  97. try:
  98. if not category.get("parent"):
  99. new_category.parent = None
  100. else:
  101. new_category.parent = Category.objects.get(_id=category.get("parent")["_id"])
  102. except Exception as e:
  103. raise Exception("Невірні дані (parent)")
  104. category.pop("parent",None)
  105. try:
  106. new_category.__dict__.update(**category)
  107. except Exception as e:
  108. raise Exception("Невірні дані")
  109. new_category.save()
  110. if len(good_list):
  111. new_category.goods.set(good_list)
  112. if len(subcategories_list):
  113. new_category.subcategories.set(subcategories_list)
  114. new_category.save()
  115. category_data = model_to_dict(new_category)
  116. category_data["_id"] = new_category._id
  117. return CategoryType(**category_data)
  118. class CategoryDelete(graphene.Mutation):
  119. class Arguments:
  120. category = CategoryInput(required=True)
  121. Output =CategoryType
  122. @staticmethod
  123. def mutate(root,info,category):
  124. user = info.context.user
  125. if not user.is_superuser:
  126. raise Exception("Authentication credentials were not provided")
  127. try:
  128. _id = category._id
  129. category_to_delete = Category.objects.get(_id=_id)
  130. category_data = model_to_dict(category_to_delete)
  131. category_data["_id"] = category_to_delete._id
  132. category_to_delete.delete()
  133. except:
  134. raise Exception("Не вірні дані")
  135. return CategoryType(**category_data)
  136. class Mutations(graphene.ObjectType):
  137. CategoryUpsert = CategoryUpsert.Field()
  138. CategoryDelete = CategoryDelete.Field()