views.py 7.9 KB

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