schema.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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. import operator
  10. from django.db.models import Q
  11. class ImageType(DjangoObjectType):
  12. _id = graphene.String(name='_id')
  13. class Meta:
  14. model = Image
  15. exclude_fields = ('_id',)
  16. def resolve__id(self,info):
  17. return self._id
  18. class ImageInput(graphene.InputObjectType):
  19. _id = graphene.String(name='_id')
  20. url = graphene.String(name='url',required=True)
  21. class GoodType(DjangoObjectType):
  22. _id = graphene.String(name='_id')
  23. images = graphene.List(ImageType)
  24. name = graphene.String()
  25. description = graphene.String()
  26. price = graphene.Int()
  27. amount = graphene.Int()
  28. categories = graphene.List('categories.schema.CategoryType')
  29. class Meta:
  30. model = Good
  31. exclude_fields = ('_id',"name","description","price","amount",)
  32. def resolve__id(self,info):
  33. return self._id
  34. def resolve_images(self,info):
  35. return self.images.all()
  36. def resolve_categories(self,info):
  37. return self.categories.all()
  38. def resolve_name(self,info):
  39. return self.name
  40. def resolve_description(self,info):
  41. return self.description
  42. def resolve_price(self,info):
  43. return self.price
  44. def resolve_amount(self,info):
  45. return self.amount
  46. class GoodInput(graphene.InputObjectType):
  47. _id = graphene.String(name='_id')
  48. images = graphene.List(ImageInput)
  49. name = graphene.String()
  50. description = graphene.String()
  51. price = graphene.Int()
  52. amount = graphene.Int()
  53. categories = graphene.List('categories.schema.CategoryInput')
  54. class Query(graphene.ObjectType):
  55. GoodFind = graphene.List(GoodType,query = graphene.String())
  56. GoodFindOne = graphene.Field(GoodType,query = graphene.String())
  57. ImageFind = graphene.List(ImageType,query = graphene.String())
  58. ImageFindOne = graphene.Field(ImageType,query = graphene.String())
  59. def resolve_GoodFind(self,info,query = "[{}]"):
  60. additional_params = {}
  61. query_list = json.loads(query)
  62. filter_params = query_list[0]
  63. if len(query_list) > 1:
  64. additional_params = query_list[1]
  65. skip = int(additional_params.get("skip",0))
  66. limit = int(additional_params.get("limit",20))
  67. order_by = additional_params.get("orderBy","_id")
  68. query_set = Good.objects.all()
  69. if len(filter_params):
  70. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  71. query_set = query_set.order_by(order_by)[skip:skip+limit]
  72. return query_set
  73. def resolve_GoodFindOne(self,info,query = "[{}]"):
  74. additional_params = {}
  75. query_list = json.loads(query)
  76. filter_params = query_list[0]
  77. if len(query_list) > 1:
  78. additional_params = query_list[1]
  79. skip = additional_params.get("skip",0)
  80. limit = additional_params.get("limit",20)
  81. order_by = additional_params.get("orderBy","_id")
  82. query_set = Good.objects.all()
  83. if len(filter_params):
  84. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  85. return query_set.first()
  86. def resolve_ImageFind(self,info,query = "[{}]"):
  87. additional_params = {}
  88. query_list = json.loads(query)
  89. filter_params = query_list[0]
  90. if len(query_list) > 1:
  91. additional_params = query_list[1]
  92. skip = additional_params.get("skip",0)
  93. limit = additional_params.get("limit",20)
  94. order_by = additional_params.get("orderBy","_id")
  95. query_set = Image.objects.all()
  96. if len(filter_params):
  97. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  98. return query_set
  99. def resolve_ImageFindOne(self,info,query = "[{}]"):
  100. additional_params = {}
  101. query_list = json.loads(query)
  102. filter_params = query_list[0]
  103. if len(query_list) > 1:
  104. additional_params = query_list[1]
  105. skip = additional_params.get("skip",0)
  106. limit = additional_params.get("limit",20)
  107. order_by = additional_params.get("orderBy","_id")
  108. query_set = Image.objects.all()
  109. if len(filter_params):
  110. query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
  111. return query_set.first()
  112. class GoodUpsert(graphene.Mutation):
  113. class Arguments:
  114. good = GoodInput(required=True)
  115. Output =GoodType
  116. @staticmethod
  117. def mutate(root,info,good):
  118. new_good={}
  119. image_list = []
  120. # user = info.context.user
  121. # if not user.is_superuser:
  122. # raise Exception("Authentication credentials were not provided")
  123. if "images" in good:
  124. image_list = [f['_id'] for f in good["images"]]
  125. good.pop("images",None)
  126. try:
  127. _id = good._id
  128. new_good = Good.objects.get(_id = _id)
  129. good.pop("_id",None)
  130. new_good.__dict__.update(**good)
  131. except Exception as e:
  132. new_good = Good(**good)
  133. new_good.save()
  134. if len(image_list):
  135. new_good.images.set(image_list)
  136. good_data = model_to_dict(new_good)
  137. good_data["_id"] = new_good._id
  138. return GoodType(**good_data)
  139. class GoodDelete(graphene.Mutation):
  140. class Arguments:
  141. good = GoodInput(required=True)
  142. Output =GoodType
  143. @staticmethod
  144. def mutate(root,info,good):
  145. # user = info.context.user
  146. # if not user.is_superuser:
  147. # raise Exception("Authentication credentials were not provided")
  148. try:
  149. _id = good._id
  150. good_to_delete = Good.objects.get(_id=_id)
  151. good_data = GoodSerializer(good_to_delete).data
  152. good_to_delete.delete()
  153. except:
  154. raise Exception("Не вірні дані")
  155. return GoodType(**good_data)
  156. class Mutations(graphene.ObjectType):
  157. GoodUpsert = GoodUpsert.Field()
  158. GoodDelete = GoodDelete.Field()