views.py 7.8 KB

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