views.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. # coding=utf-8
  2. from rest_framework.views import APIView
  3. from rest_framework.decorators import action
  4. import traceback
  5. from django.db import transaction
  6. from rest_framework.serializers import ValidationError
  7. from rest_framework import generics
  8. from rest_framework_extensions.cache.decorators import cache_response
  9. from utils.default_key_constructor import UpdatedAtKeyBit
  10. from rest_framework_extensions.key_constructor.bits import PaginationKeyBit, RetrieveSqlQueryKeyBit, ListSqlQueryKeyBit, QueryParamsKeyBit
  11. from rest_framework_extensions.key_constructor.constructors import DefaultKeyConstructor
  12. from utils.permission import isLogin, permission_required, check_permission
  13. from utils.custom_modelviewset import CustomModelViewSet
  14. from utils import response_ok, response_error
  15. from apps.log.models import BizLog
  16. from .serializers import *
  17. from .filters import CommodityFilter
  18. from django.contrib.auth import get_user_model
  19. User = get_user_model()
  20. from apps.base import Formater
  21. from utils.exceptions import CustomError
  22. class CommodityViewSet(CustomModelViewSet):
  23. permission_classes = [isLogin, ]
  24. queryset = Commodity.objects.filter()
  25. serializer_class = CommoditySerializer
  26. @permission_required('commodity.view_commodity')
  27. def filter_queryset(self, queryset):
  28. queryset = queryset.filter(create_user=self.request.user)
  29. f = CommodityFilter(self.request.GET, queryset=queryset)
  30. return f.qs
  31. @permission_required('commodity.add_commodity')
  32. def perform_create(self, serializer):
  33. super(CommodityViewSet, self).perform_create(serializer)
  34. instance = serializer.instance
  35. validated_data = serializer.validated_data
  36. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  37. u'添加商品[%s],id=%d' % (instance.name, instance.id), validated_data)
  38. @permission_required('commodity.add_commodity')
  39. def perform_update(self, serializer):
  40. super(CommodityViewSet, self).perform_update(serializer)
  41. instance = serializer.instance
  42. validated_data = serializer.validated_data
  43. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  44. u'修改商品[%s],id=%d' % (instance.name, instance.id), validated_data)
  45. @permission_required('commodity.add_commodity')
  46. @action(methods=['post'], detail=True)
  47. def upload_image(self, request, pk):
  48. type = request.POST.get('type')
  49. banner_img = request.FILES.get('banner_img')
  50. # type=main,上传主图。type=list,上传列表图
  51. try:
  52. with transaction.atomic():
  53. instance = self.get_object()
  54. upload = Upload.objects._addnew(banner_img)
  55. if upload:
  56. if type == 'upload_main':
  57. if instance.main_image_id:
  58. img = Upload.objects.filter(id=instance.main_image_id).first()
  59. img.del_images()
  60. instance.main_image_id = upload.id
  61. elif type == 'upload_list':
  62. if instance.list_image_id:
  63. img = Upload.objects.filter(id=instance.list_image_id).first()
  64. img.del_images()
  65. instance.list_image_id = upload.id
  66. instance.save()
  67. return response_ok(upload.id)
  68. return response_error('上传失败,请重新上传!')
  69. except CustomError as e:
  70. return response_error(e.get_error_msg())
  71. except Exception as e:
  72. return response_error(str(e))
  73. @permission_required('commodity.add_commodity')
  74. @action(methods=['post'], detail=True)
  75. def upload_detail_img(self, request, pk):
  76. # 上传详情、参数图片
  77. type = request.POST.get('type')
  78. try:
  79. with transaction.atomic():
  80. instance = self.get_object()
  81. for i in range(10):
  82. file = request.data.get('file{}'.format(i))
  83. if file:
  84. upload = Upload.objects._addnew(file)
  85. if type == 'upload_detail':
  86. CommodityImages.objects.create(product_id=instance.id,
  87. type=CommodityImages.DETAILS,
  88. image_id=upload.id)
  89. elif type == 'upload_param':
  90. CommodityImages.objects.create(product_id=instance.id,
  91. type=CommodityImages.PARAMETER,
  92. image_id=upload.id)
  93. if not upload:
  94. return response_error('上传失败,请重新上传!')
  95. except CustomError as e:
  96. return response_error(e.get_error_msg())
  97. except Exception as e:
  98. return response_error(str(e))
  99. return response_ok()
  100. @permission_required('commodity.add_commodity')
  101. @action(methods=['post'], detail=True)
  102. def query_detail_img(self, request, pk):
  103. #查看 详情、参数图片
  104. type = request.POST.get('type')
  105. instance = self.get_object()
  106. data = []
  107. commodity_images = CommodityImages.objects.filter(product_id=instance.id)
  108. if type == 'upload_detail':
  109. commodity_images = commodity_images.filter(type=CommodityImages.DETAILS)
  110. for commodity_image in commodity_images:
  111. image = Upload.objects.filter(id=commodity_image.image_id).first()
  112. image_path = image.get_path()
  113. commodity_image_item = {
  114. 'id': commodity_image.id,
  115. 'name': commodity_image.name,
  116. 'src': image_path,
  117. }
  118. data.append(commodity_image_item)
  119. return response_ok(data)
  120. class DeleteCommodityImageView(APIView):
  121. permission_classes = [isLogin,]
  122. def post(self, request, *args, **kwargs):
  123. #商品图片 删除
  124. id = request.GET.get('id')
  125. try:
  126. instance = CommodityImages.getById(id)
  127. image = Upload.objects.filter(id=instance.image_id).first()
  128. with transaction.atomic():
  129. instance.delete()
  130. image.del_images()
  131. except CustomError as e:
  132. return response_error(e.get_error_msg())
  133. except Exception as e:
  134. return response_error(str(e))
  135. return response_ok()
  136. class WxCommodityUpdatedAtKeyBit(UpdatedAtKeyBit):
  137. key = "wx_commodity_updated_at"
  138. class WxCommodityKeyConstructor(DefaultKeyConstructor):
  139. # 列表缓存key生成器
  140. list_sql = ListSqlQueryKeyBit()
  141. pagination = PaginationKeyBit()
  142. updated_at = WxCommodityUpdatedAtKeyBit()
  143. class WxCommodityView(generics.ListAPIView):
  144. permission_classes = [ ]
  145. queryset = Commodity.objects.filter(status=settings.ONLINE)
  146. serializer_class = WxCommoditySerizlizer
  147. # @cache_response(key_func=WxCommodityKeyConstructor())
  148. def list(self, request, *args, **kwargs):
  149. return super(WxCommodityView, self).list(request, *args, **kwargs)
  150. def filter_queryset(self, queryset):
  151. queryset = queryset.filter()
  152. f = CommodityFilter(self.request.GET, queryset=queryset)
  153. return f.qs
  154. class WxCommodityDetailUpdatedAtKeyBit(UpdatedAtKeyBit):
  155. key = "wx_commodity_detail_updated_at"
  156. class WxCommodityDetailKeyConstructor(DefaultKeyConstructor):
  157. # 明细缓存key生成器
  158. retrieve_sql = RetrieveSqlQueryKeyBit()
  159. # pagination = PaginationKeyBit()
  160. updated_at = WxCommodityDetailUpdatedAtKeyBit()
  161. class WxCommodityDetailView(generics.RetrieveAPIView):
  162. permission_classes = [ ]
  163. queryset = Commodity.objects.filter(status=settings.ONLINE)
  164. serializer_class = WxCommodityDetailsSerializer
  165. # @cache_response(key_func=WxCommodityDetailKeyConstructor())
  166. def retrieve(self, request, *args, **kwargs):
  167. # 商品详情
  168. instance = self.get_object()
  169. serializer = WxCommodityDetailsSerializer(instance, context={'request': request})
  170. return response_ok(serializer.data)