schema.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. or_filter_params = filter_params.pop("or",{})
  55. and_filter_params= filter_params.pop("and",{})
  56. and_filter_params |= filter_params
  57. if len(or_filter_params):
  58. query_set = query_set.filter(reduce(operator.or_,(Q(**d) for d in [dict([i]) for i in or_filter_params.items()])))
  59. if len(and_filter_params):
  60. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in and_filter_params.items()])))
  61. query_set = query_set.order_by(order_by)[skip:skip+limit]
  62. return query_set
  63. def resolve_CategoryFindOne(self,info,query = "[{}]"):
  64. additional_params = {}
  65. query_list = json.loads(query)
  66. filter_params = query_list[0]
  67. if len(query_list) > 1:
  68. additional_params = query_list[1]
  69. skip = additional_params.get("skip",0)
  70. limit = additional_params.get("limit",20)
  71. order_by = additional_params.get("orderBy","_id")
  72. query_set = Category.objects.all()
  73. if len(filter_params):
  74. or_filter_params = filter_params.pop("or",{})
  75. and_filter_params= filter_params.pop("and",{})
  76. and_filter_params |= filter_params
  77. if len(or_filter_params):
  78. query_set = query_set.filter(reduce(operator.or_,(Q(**d) for d in [dict([i]) for i in or_filter_params.items()])))
  79. if len(and_filter_params):
  80. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in and_filter_params.items()])))
  81. return query_set.first()
  82. class CategoryUpsert(graphene.Mutation):
  83. class Arguments:
  84. category = CategoryInput(required=True)
  85. Output =CategoryType
  86. @staticmethod
  87. def mutate(root,info,category ={}):
  88. new_category=None
  89. good_list = []
  90. subcategories_list = []
  91. _id = category.get("_id",None)
  92. user = info.context.user
  93. if not user.is_superuser:
  94. raise Exception("Authentication credentials were not provided")
  95. if "goods" in category:
  96. good_list = [f['_id'] for f in category["goods"]]
  97. category.pop("goods",None)
  98. if "subcategories" in category:
  99. subcategories_list = [Category.objects.get(_id = f["_id"]) for f in category["subcategories"]]
  100. category.pop("subcategories",None)
  101. try:
  102. if _id:
  103. new_category = Category.objects.get(_id = _id)
  104. else:
  105. new_category = Category()
  106. except:
  107. raise Exception("Невірні дані")
  108. if "parent" in category:
  109. try:
  110. if not category.get("parent"):
  111. new_category.parent = None
  112. else:
  113. new_category.parent = Category.objects.get(_id=category.get("parent")["_id"])
  114. except Exception as e:
  115. raise Exception("Невірні дані (parent)")
  116. category.pop("parent",None)
  117. try:
  118. new_category.__dict__.update(**category)
  119. except Exception as e:
  120. raise Exception("Невірні дані")
  121. new_category.save()
  122. if len(good_list):
  123. new_category.goods.set(good_list)
  124. if len(subcategories_list):
  125. new_category.subcategories.set(subcategories_list)
  126. new_category.save()
  127. category_data = model_to_dict(new_category)
  128. category_data["_id"] = new_category._id
  129. return CategoryType(**category_data)
  130. class CategoryDelete(graphene.Mutation):
  131. class Arguments:
  132. category = CategoryInput(required=True)
  133. Output =CategoryType
  134. @staticmethod
  135. def mutate(root,info,category):
  136. user = info.context.user
  137. if not user.is_superuser:
  138. raise Exception("Authentication credentials were not provided")
  139. try:
  140. _id = category._id
  141. category_to_delete = Category.objects.get(_id=_id)
  142. category_data = model_to_dict(category_to_delete)
  143. category_data["_id"] = category_to_delete._id
  144. category_to_delete.delete()
  145. except:
  146. raise Exception("Не вірні дані")
  147. return CategoryType(**category_data)
  148. class Mutations(graphene.ObjectType):
  149. CategoryUpsert = CategoryUpsert.Field()
  150. CategoryDelete = CategoryDelete.Field()