views.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. from rest_framework import viewsets
  2. from .models import ListModel
  3. from . import serializers
  4. from .page import MyPageNumberPagination
  5. from rest_framework.filters import OrderingFilter
  6. from django_filters.rest_framework import DjangoFilterBackend
  7. from rest_framework.response import Response
  8. from .filter import Filter
  9. from rest_framework.exceptions import APIException
  10. from goodsunit.models import ListModel as goods_unit
  11. from goodsclass.models import ListModel as goods_class
  12. from goodsbrand.models import ListModel as goods_brand
  13. from goodscolor.models import ListModel as goods_color
  14. from goodsshape.models import ListModel as goods_shape
  15. from goodsspecs.models import ListModel as goods_specs
  16. from goodsorigin.models import ListModel as goods_origin
  17. from supplier.models import ListModel as supplier
  18. from scanner.models import ListModel as scanner
  19. from utils.md5 import Md5
  20. from .serializers import FileRenderSerializer
  21. from django.http import StreamingHttpResponse
  22. from .files import FileRenderCN, FileRenderEN
  23. from rest_framework.settings import api_settings
  24. from asn.models import AsnDetailModel
  25. from django.db.models import Q
  26. class SannerGoodsTagView(viewsets.ModelViewSet):
  27. """
  28. retrieve:
  29. Response a data retrieve(get)
  30. """
  31. pagination_class = MyPageNumberPagination
  32. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  33. ordering_fields = ['id', "create_time", "update_time", ]
  34. filter_class = Filter
  35. lookup_field = 'bar_code'
  36. def get_project(self):
  37. try:
  38. bar_code = self.kwargs['bar_code']
  39. return bar_code
  40. except:
  41. return None
  42. def get_queryset(self):
  43. bar_code = self.get_project()
  44. if self.request.user:
  45. if bar_code is None:
  46. return ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  47. else:
  48. return ListModel.objects.filter(openid=self.request.auth.openid, bar_code=bar_code, is_delete=False)
  49. else:
  50. return ListModel.objects.filter().none()
  51. def get_serializer_class(self):
  52. if self.action in ['list', 'retrieve', 'destroy']:
  53. return serializers.GoodsGetSerializer
  54. elif self.action in ['create']:
  55. return serializers.GoodsPostSerializer
  56. elif self.action in ['update']:
  57. return serializers.GoodsUpdateSerializer
  58. elif self.action in ['partial_update']:
  59. return serializers.GoodsPartialUpdateSerializer
  60. else:
  61. return self.http_method_not_allowed(request=self.request)
  62. def retrieve(self, request, *args, **kwargs):
  63. data=self.request.GET.get('asn_code')
  64. instance = self.get_object()
  65. serializer = self.get_serializer(instance)
  66. good_detail=AsnDetailModel.objects.filter(asn_code=data,goods_code=serializer.data['goods_code']).first()
  67. if good_detail is None:
  68. raise APIException({"detail":"The product label does not exist"})
  69. else:
  70. context = {}
  71. context['goods_code'] = good_detail.goods_code
  72. context['goods_actual_qty'] = good_detail.goods_actual_qty
  73. return Response(context, status=200)
  74. class APIViewSet(viewsets.ModelViewSet):
  75. """
  76. retrieve:
  77. Response a data list(get)
  78. list:
  79. Response a data list(all)
  80. create:
  81. Create a data line(post)
  82. delete:
  83. Delete a data line(delete)
  84. partial_update:
  85. Partial_update a data(patch:partial_update)
  86. update:
  87. Update a data(put:update)
  88. """
  89. pagination_class = MyPageNumberPagination
  90. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  91. ordering_fields = ['id', "create_time", "update_time", ]
  92. filter_class = Filter
  93. def get_project(self):
  94. try:
  95. id = self.kwargs.get('pk')
  96. return id
  97. except:
  98. return None
  99. def get_queryset(self):
  100. id = self.get_project()
  101. if self.request.user:
  102. search_word = self.request.GET.get('search', '')
  103. if search_word:
  104. if id is None:
  105. data_list = ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  106. search_list = data_list.filter(Q(goods_shape=search_word) | Q(goods_specs=search_word))
  107. return search_list
  108. else:
  109. data_list = ListModel.objects.filter(openid=self.request.auth.openid, id=id, is_delete=False)
  110. search_list = data_list.filter(Q(goods_shape=search_word) | Q(goods_specs=search_word))
  111. return search_list
  112. else:
  113. if id is None:
  114. return ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  115. else:
  116. return ListModel.objects.filter(openid=self.request.auth.openid, id=id, is_delete=False)
  117. else:
  118. return ListModel.objects.filter().none()
  119. def get_serializer_class(self):
  120. if self.action in ['list', 'retrieve', 'destroy']:
  121. return serializers.GoodsGetSerializer
  122. elif self.action in ['create']:
  123. return serializers.GoodsPostSerializer
  124. elif self.action in ['update']:
  125. return serializers.GoodsUpdateSerializer
  126. elif self.action in ['partial_update']:
  127. return serializers.GoodsPartialUpdateSerializer
  128. else:
  129. return self.http_method_not_allowed(request=self.request)
  130. def create(self, request, *args, **kwargs):
  131. data = self.request.data
  132. data['openid'] = self.request.auth.openid
  133. data['unit_volume'] = round(
  134. (float(data['goods_w']) * float(data['goods_d']) * float(data['goods_h'])) / 1000000000, 4)
  135. if ListModel.objects.filter(openid=data['openid'], goods_code=data['goods_code'], is_delete=False).exists():
  136. raise APIException({"detail": "Data Exists"})
  137. else:
  138. if supplier.objects.filter(openid=data['openid'], supplier_name=data['goods_supplier'],
  139. is_delete=False).exists():
  140. if goods_unit.objects.filter(openid=data['openid'], goods_unit=data['goods_unit'],
  141. is_delete=False).exists():
  142. if goods_class.objects.filter(openid=data['openid'], goods_class=data['goods_class'],
  143. is_delete=False).exists():
  144. if goods_brand.objects.filter(openid=data['openid'], goods_brand=data['goods_brand'],
  145. is_delete=False).exists():
  146. if goods_color.objects.filter(openid=data['openid'], goods_color=data['goods_color'],
  147. is_delete=False).exists():
  148. if goods_shape.objects.filter(openid=data['openid'], goods_shape=data['goods_shape'],
  149. is_delete=False).exists():
  150. if goods_specs.objects.filter(openid=data['openid'],
  151. goods_specs=data['goods_specs'],
  152. is_delete=False).exists():
  153. if goods_origin.objects.filter(openid=data['openid'],
  154. goods_origin=data['goods_origin'],
  155. is_delete=False).exists():
  156. data['bar_code'] = Md5.md5(data['goods_code'])
  157. serializer = self.get_serializer(data=data)
  158. serializer.is_valid(raise_exception=True)
  159. serializer.save()
  160. scanner.objects.create(openid=self.request.auth.openid, mode="GOODS",
  161. code=data['goods_code'],
  162. bar_code=data['bar_code'])
  163. headers = self.get_success_headers(serializer.data)
  164. return Response(serializer.data, status=200, headers=headers)
  165. else:
  166. raise APIException(
  167. {"detail": "Goods Origin does not exists or it has been changed"})
  168. else:
  169. raise APIException(
  170. {"detail": "Goods Specs does not exists or it has been changed"})
  171. else:
  172. raise APIException({"detail": "Goods Shape does not exists or it has been changed"})
  173. else:
  174. raise APIException({"detail": "Goods Color does not exists or it has been changed"})
  175. else:
  176. raise APIException({"detail": "Goods Brand does not exists or it has been changed"})
  177. else:
  178. raise APIException({"detail": "Goods Class does not exists or it has been changed"})
  179. else:
  180. raise APIException({"detail": "Goods Unit does not exists or it has been changed"})
  181. else:
  182. raise APIException({"detail": "Supplier does not exists or it has been changed"})
  183. def update(self, request, pk):
  184. qs = self.get_object()
  185. if qs.openid != self.request.auth.openid:
  186. raise APIException({"detail": "Cannot update data which not yours"})
  187. else:
  188. data = self.request.data
  189. data['unit_volume'] = round(
  190. (float(data['goods_w']) * float(data['goods_d']) * float(data['goods_h'])) / 1000000000, 4)
  191. if supplier.objects.filter(openid=self.request.auth.openid, supplier_name=data['goods_supplier'],
  192. is_delete=False).exists():
  193. if goods_unit.objects.filter(openid=self.request.auth.openid, goods_unit=data['goods_unit'],
  194. is_delete=False).exists():
  195. if goods_class.objects.filter(openid=self.request.auth.openid, goods_class=data['goods_class'],
  196. is_delete=False).exists():
  197. if goods_brand.objects.filter(openid=self.request.auth.openid, goods_brand=data['goods_brand'],
  198. is_delete=False).exists():
  199. if goods_color.objects.filter(openid=self.request.auth.openid, goods_color=data['goods_color'],
  200. is_delete=False).exists():
  201. if goods_shape.objects.filter(openid=self.request.auth.openid, goods_shape=data['goods_shape'],
  202. is_delete=False).exists():
  203. if goods_specs.objects.filter(openid=self.request.auth.openid,
  204. goods_specs=data['goods_specs'],
  205. is_delete=False).exists():
  206. if goods_origin.objects.filter(openid=self.request.auth.openid,
  207. goods_origin=data['goods_origin'],
  208. is_delete=False).exists():
  209. scanner.objects.filter(openid=self.request.auth.openid,
  210. mode='GOODS',
  211. code=qs.goods_code).update(code=str(data['goods_code']))
  212. serializer = self.get_serializer(qs, data=data)
  213. serializer.is_valid(raise_exception=True)
  214. serializer.save()
  215. headers = self.get_success_headers(serializer.data)
  216. return Response(serializer.data, status=200, headers=headers)
  217. else:
  218. raise APIException(
  219. {"detail": "Goods Origin does not exists or it has been changed"})
  220. else:
  221. raise APIException(
  222. {"detail": "Goods Specs does not exists or it has been changed"})
  223. else:
  224. raise APIException({"detail": "Goods Shape does not exists or it has been changed"})
  225. else:
  226. raise APIException({"detail": "Goods Color does not exists or it has been changed"})
  227. else:
  228. raise APIException({"detail": "Goods Brand does not exists or it has been changed"})
  229. else:
  230. raise APIException({"detail": "Goods Class does not exists or it has been changed"})
  231. else:
  232. raise APIException({"detail": "Goods Unit does not exists or it has been changed"})
  233. else:
  234. raise APIException({"detail": "Supplier does not exists or it has been changed"})
  235. def partial_update(self, request, pk):
  236. qs = self.get_object()
  237. if qs.openid != self.request.auth.openid:
  238. raise APIException({"detail": "Cannot partial_update data which not yours"})
  239. else:
  240. data = self.request.data
  241. if supplier.objects.filter(openid=self.request.auth.openid, supplier_name=data['goods_supplier'],
  242. is_delete=False).exists():
  243. if goods_unit.objects.filter(openid=self.request.auth.openid, goods_unit=data['goods_unit'],
  244. is_delete=False).exists():
  245. if goods_class.objects.filter(openid=self.request.auth.openid, goods_class=data['goods_class'],
  246. is_delete=False).exists():
  247. if goods_brand.objects.filter(openid=self.request.auth.openid, goods_brand=data['goods_brand'],
  248. is_delete=False).exists():
  249. if goods_color.objects.filter(openid=self.request.auth.openid, goods_color=data['goods_color'],
  250. is_delete=False).exists():
  251. if goods_shape.objects.filter(openid=self.request.auth.openid, goods_shape=data['goods_shape'],
  252. is_delete=False).exists():
  253. if goods_specs.objects.filter(openid=self.request.auth.openid,
  254. goods_specs=data['goods_specs'],
  255. is_delete=False).exists():
  256. if goods_origin.objects.filter(openid=self.request.auth.openid,
  257. goods_origin=data['goods_origin'],
  258. is_delete=False).exists():
  259. scanner.objects.filter(openid=self.request.auth.openid,
  260. mode='GOODS',
  261. code=qs.goods_code).update(
  262. code=str(data['goods_code']))
  263. serializer = self.get_serializer(qs, data=data, partial=True)
  264. serializer.is_valid(raise_exception=True)
  265. serializer.save()
  266. headers = self.get_success_headers(serializer.data)
  267. return Response(serializer.data, status=200, headers=headers)
  268. else:
  269. raise APIException(
  270. {"detail": "Goods Origin does not exists or it has been changed"})
  271. else:
  272. raise APIException(
  273. {"detail": "Goods Specs does not exists or it has been changed"})
  274. else:
  275. raise APIException({"detail": "Goods Shape does not exists or it has been changed"})
  276. else:
  277. raise APIException({"detail": "Goods Color does not exists or it has been changed"})
  278. else:
  279. raise APIException({"detail": "Goods Brand does not exists or it has been changed"})
  280. else:
  281. raise APIException({"detail": "Goods Class does not exists or it has been changed"})
  282. else:
  283. raise APIException({"detail": "Goods Unit does not exists or it has been changed"})
  284. else:
  285. raise APIException({"detail": "Supplier does not exists or it has been changed"})
  286. def destroy(self, request, pk):
  287. qs = self.get_object()
  288. if qs.openid != self.request.auth.openid:
  289. raise APIException({"detail": "Cannot delete data which not yours"})
  290. else:
  291. qs.is_delete = True
  292. qs.save()
  293. serializer = self.get_serializer(qs, many=False)
  294. headers = self.get_success_headers(serializer.data)
  295. return Response(serializer.data, status=200, headers=headers)
  296. class FileDownloadView(viewsets.ModelViewSet):
  297. renderer_classes = (FileRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
  298. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  299. ordering_fields = ['id', "create_time", "update_time", ]
  300. filter_class = Filter
  301. def get_project(self):
  302. try:
  303. id = self.kwargs.get('pk')
  304. return id
  305. except:
  306. return None
  307. def get_queryset(self):
  308. id = self.get_project()
  309. if self.request.user:
  310. if id is None:
  311. return ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  312. else:
  313. return ListModel.objects.filter(openid=self.request.auth.openid, id=id, is_delete=False)
  314. else:
  315. return ListModel.objects.none()
  316. def get_serializer_class(self):
  317. if self.action in ['list']:
  318. return serializers.FileRenderSerializer
  319. else:
  320. return self.http_method_not_allowed(request=self.request)
  321. def get_lang(self, data):
  322. lang = self.request.META.get('HTTP_LANGUAGE')
  323. if lang:
  324. if lang == 'zh-hans':
  325. return FileRenderCN().render(data)
  326. else:
  327. return FileRenderEN().render(data)
  328. else:
  329. return FileRenderEN().render(data)
  330. def list(self, request, *args, **kwargs):
  331. from datetime import datetime
  332. dt = datetime.now()
  333. data = (
  334. FileRenderSerializer(instance).data
  335. for instance in self.filter_queryset(self.get_queryset())
  336. )
  337. renderer = self.get_lang(data)
  338. response = StreamingHttpResponse(
  339. renderer,
  340. content_type="text/csv"
  341. )
  342. response['Content-Disposition'] = "attachment; filename='goodslist_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
  343. return response