schema.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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={}
  77. good_list = []
  78. subcategories_list = []
  79. user = info.context.user
  80. if not user.is_superuser:
  81. raise Exception("Authentication credentials were not provided")
  82. if "goods" in category:
  83. good_list = [f['_id'] for f in category["goods"]]
  84. category.pop("goods",None)
  85. if "subcategories" in category:
  86. subcategories_list = [Category.objects.get(_id = f["_id"]) for f in category["subcategories"]]
  87. category.pop("subcategories",None)
  88. try:
  89. _id = category._id
  90. new_category = Category.objects.get(_id = _id)
  91. new_category.__dict__.update(**category)
  92. except Exception as e:
  93. new_category = Category(**category)
  94. if "parent" in category:
  95. try:
  96. print(category)
  97. print(category.get("parent",None) == "null")
  98. print(category.get("parent",None))
  99. if category.get("parent",None) == "null":
  100. new_category.parent = None
  101. new_category.parent = Category.objects.get(_id=category.get("parent",None)["_id"])
  102. except:
  103. raise Exception("Невірні дані (parent)")
  104. new_category.save()
  105. if len(good_list):
  106. new_category.goods.set(good_list)
  107. if len(subcategories_list):
  108. new_category.subcategories.set(subcategories_list)
  109. category_data = model_to_dict(new_category)
  110. category_data["_id"] = new_category._id
  111. return CategoryType(**category_data)
  112. class CategoryDelete(graphene.Mutation):
  113. class Arguments:
  114. category = CategoryInput(required=True)
  115. Output =CategoryType
  116. @staticmethod
  117. def mutate(root,info,category):
  118. user = info.context.user
  119. if not user.is_superuser:
  120. raise Exception("Authentication credentials were not provided")
  121. try:
  122. _id = category._id
  123. category_to_delete = Category.objects.get(_id=_id)
  124. category_data = model_to_dict(category_to_delete)
  125. category_data["_id"] = category_to_delete._id
  126. category_to_delete.delete()
  127. except:
  128. raise Exception("Не вірні дані")
  129. return CategoryType(**category_data)
  130. class Mutations(graphene.ObjectType):
  131. CategoryUpsert = CategoryUpsert.Field()
  132. CategoryDelete = CategoryDelete.Field()