schema.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. import graphene
  2. from graphene_django.types import DjangoObjectType
  3. from graphql_jwt.decorators import login_required
  4. from .models import Good,Image
  5. import json
  6. from functools import reduce
  7. from .serializers import GoodSerializer
  8. from django.forms.models import model_to_dict
  9. from django.db.models import Count
  10. from django.conf import settings
  11. import operator
  12. from django.db.models import Q
  13. class ImageType(graphene.ObjectType):
  14. _id = graphene.String(name='_id')
  15. url = graphene.String()
  16. def resolve__id(self,info):
  17. return self._id
  18. def resolve_url(self,info):
  19. print(settings.MEDIA_URL + self.url)
  20. return settings.MEDIA_URL + self.url
  21. class ImageInput(graphene.InputObjectType):
  22. _id = graphene.String(name='_id')
  23. url = graphene.String(name='url')
  24. class GoodType(graphene.ObjectType):
  25. _id = graphene.String(name='_id')
  26. images = graphene.List(ImageType)
  27. name = graphene.String()
  28. description = graphene.String()
  29. price = graphene.Int()
  30. amount = graphene.Int()
  31. categories = graphene.List('categories.schema.CategoryType')
  32. createdAt = graphene.String()
  33. def resolve__id(self,info):
  34. return self._id
  35. def resolve_images(self,info):
  36. return self.images.all().order_by("goodimage__order")
  37. def resolve_categories(self,info):
  38. return self.categories.all()
  39. def resolve_name(self,info):
  40. return self.name
  41. def resolve_description(self,info):
  42. return self.description
  43. def resolve_price(self,info):
  44. return self.price
  45. def resolve_amount(self,info):
  46. return self.amount
  47. def resolve_createdAt(self,info):
  48. return self.createdAt.strftime('%s')
  49. class GoodInput(graphene.InputObjectType):
  50. _id = graphene.String(name='_id')
  51. images = graphene.List(ImageInput)
  52. name = graphene.String()
  53. description = graphene.String()
  54. price = graphene.Int()
  55. amount = graphene.Int()
  56. categories = graphene.List('categories.schema.CategoryInput')
  57. class Query(graphene.ObjectType):
  58. GoodFind = graphene.List(GoodType,query = graphene.String())
  59. GoodFindOne = graphene.Field(GoodType,query = graphene.String())
  60. ImageFind = graphene.List(ImageType,query = graphene.String())
  61. ImageFindOne = graphene.Field(ImageType,query = graphene.String())
  62. def resolve_GoodFind(self,info,query = "[{}]"):
  63. additional_params = {}
  64. query_list = json.loads(query)
  65. filter_params = query_list[0]
  66. if len(query_list) > 1:
  67. additional_params = query_list[1]
  68. skip = int(additional_params.get("skip",0))
  69. limit = int(additional_params.get("limit",20))
  70. order_by = additional_params.get("orderBy","_id")
  71. query_set = Good.objects.all()
  72. if len(filter_params):
  73. query_set = query_set.filter(reduce(operator.or_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  74. if order_by == 'popular':
  75. query_set = query_set.annotate(order_count=Count('orderGoods')).order_by("order_count")[skip:skip+limit]
  76. else:
  77. query_set = query_set.order_by(order_by)[skip:skip+limit]
  78. return query_set
  79. def resolve_GoodFindOne(self,info,query = "[{}]"):
  80. additional_params = {}
  81. query_list = json.loads(query)
  82. filter_params = query_list[0]
  83. if len(query_list) > 1:
  84. additional_params = query_list[1]
  85. skip = additional_params.get("skip",0)
  86. limit = additional_params.get("limit",20)
  87. order_by = additional_params.get("orderBy","_id")
  88. query_set = Good.objects.all()
  89. if len(filter_params):
  90. query_set = query_set.filter(reduce(operator.or_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  91. return query_set.first()
  92. def resolve_ImageFind(self,info,query = "[{}]"):
  93. additional_params = {}
  94. query_list = json.loads(query)
  95. filter_params = query_list[0]
  96. if len(query_list) > 1:
  97. additional_params = query_list[1]
  98. skip = additional_params.get("skip",0)
  99. limit = additional_params.get("limit",20)
  100. order_by = additional_params.get("orderBy","_id")
  101. query_set = Image.objects.all()
  102. if len(filter_params):
  103. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  104. return query_set
  105. def resolve_ImageFindOne(self,info,query = "[{}]"):
  106. additional_params = {}
  107. query_list = json.loads(query)
  108. filter_params = query_list[0]
  109. if len(query_list) > 1:
  110. additional_params = query_list[1]
  111. skip = additional_params.get("skip",0)
  112. limit = additional_params.get("limit",20)
  113. order_by = additional_params.get("orderBy","_id")
  114. query_set = Image.objects.all()
  115. if len(filter_params):
  116. try:
  117. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  118. except:
  119. raise Exception("Не вірні дані")
  120. return query_set.first()
  121. class GoodUpsert(graphene.Mutation):
  122. class Arguments:
  123. good = GoodInput(required=True)
  124. Output =GoodType
  125. @staticmethod
  126. def mutate(root,info,good):
  127. new_good={}
  128. image_list = None
  129. category_list = None
  130. user = info.context.user
  131. if not user.is_superuser:
  132. raise Exception("Authentication credentials were not provided")
  133. if "images" in good:
  134. image_list = [f["_id"] for f in good["images"]]
  135. # image_list = []
  136. # for idx, image in enumerate(good["images"]):
  137. # image["order"] = idx+1
  138. # image_list.append(image)
  139. good.pop("images",None)
  140. if "categories" in good:
  141. category_list = [f['_id'] for f in good["categories"]]
  142. good.pop("categories",None)
  143. try:
  144. _id = good._id
  145. new_good = Good.objects.get(_id = _id)
  146. good.pop("_id",None)
  147. new_good.__dict__.update(**good)
  148. except Exception as e:
  149. new_good = Good(**good)
  150. new_good.save()
  151. if image_list != None:
  152. new_good.images.set(image_list)
  153. for idx,image in enumerate(image_list):
  154. instance = new_good.GoodImages.get(image = image)
  155. instance.order = idx+1
  156. instance.save()
  157. if category_list != None:
  158. new_good.categories.set(category_list)
  159. new_good.save()
  160. good_data = model_to_dict(new_good)
  161. good_data["_id"] = new_good._id
  162. return GoodType(**good_data)
  163. class GoodDelete(graphene.Mutation):
  164. class Arguments:
  165. good = GoodInput(required=True)
  166. Output =GoodType
  167. @staticmethod
  168. def mutate(root,info,good):
  169. user = info.context.user
  170. if not user.is_superuser:
  171. raise Exception("Authentication credentials were not provided")
  172. try:
  173. _id = good._id
  174. good_to_delete = Good.objects.get(_id=_id)
  175. good_data = model_to_dict(good_to_delete)
  176. good_data["_id"] = good_to_delete ._id
  177. good_to_delete.delete()
  178. except:
  179. raise Exception("Не вірні дані")
  180. return GoodType(**good_data)
  181. class Mutations(graphene.ObjectType):
  182. GoodUpsert = GoodUpsert.Field()
  183. GoodDelete = GoodDelete.Field()