schema.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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 not category.get("parent")["_id"] == "null":
  100. new_category.parent = None
  101. else:
  102. new_category.parent = Category.objects.get(_id=category.get("parent")["_id"])
  103. except:
  104. raise Exception("Невірні дані (parent)")
  105. new_category.save()
  106. if len(good_list):
  107. new_category.goods.set(good_list)
  108. if len(subcategories_list):
  109. new_category.subcategories.set(subcategories_list)
  110. new_category.save()
  111. category_data = model_to_dict(new_category)
  112. category_data["_id"] = new_category._id
  113. return CategoryType(**category_data)
  114. class CategoryDelete(graphene.Mutation):
  115. class Arguments:
  116. category = CategoryInput(required=True)
  117. Output =CategoryType
  118. @staticmethod
  119. def mutate(root,info,category):
  120. user = info.context.user
  121. if not user.is_superuser:
  122. raise Exception("Authentication credentials were not provided")
  123. try:
  124. _id = category._id
  125. category_to_delete = Category.objects.get(_id=_id)
  126. category_data = model_to_dict(category_to_delete)
  127. category_data["_id"] = category_to_delete._id
  128. category_to_delete.delete()
  129. except:
  130. raise Exception("Не вірні дані")
  131. return CategoryType(**category_data)
  132. class Mutations(graphene.ObjectType):
  133. CategoryUpsert = CategoryUpsert.Field()
  134. CategoryDelete = CategoryDelete.Field()