views.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # coding=utf-8
  2. from django.db import transaction
  3. from rest_framework.decorators import action
  4. from rest_framework.views import APIView
  5. from rest_framework import generics
  6. from utils import response_ok
  7. from utils.permission import IsEmployee
  8. from utils.exceptions import CustomError
  9. from utils.custom_modelviewset import CustomModelViewSet
  10. from apps.log.models import BizLog
  11. from apps.images.models import Images
  12. from apps.commodity.models import Commodity, CommodityImage
  13. from apps.commodity.filters import CommodityFilter, CommodityImageFilter
  14. from apps.commodity.serializers import CommoditySerializer
  15. from apps.option.models import Option
  16. from apps.base import Formater
  17. class CommodityDict(APIView):
  18. permission_classes = [IsEmployee, ]
  19. def get(self, request):
  20. rows = Option.objects.filter(type=Option.COMMODITY_CATEGORY, enable=True, delete=False).order_by('sort').values('id', 'name')
  21. data = [{'value': row['id'], 'name': row['name']} for row in rows]
  22. ret = {
  23. 'category': data
  24. }
  25. return response_ok(ret)
  26. class CommodityViewSet(CustomModelViewSet):
  27. permission_classes = [IsEmployee, ]
  28. queryset = Commodity.objects.filter(delete=False)
  29. serializer_class = CommoditySerializer
  30. def filter_queryset(self, queryset):
  31. queryset = queryset.filter()
  32. f = CommodityFilter(self.request.GET, queryset=queryset)
  33. return f.qs
  34. def perform_create(self, serializer):
  35. super(CommodityViewSet, self).perform_create(serializer)
  36. instance = serializer.instance
  37. validated_data = serializer.validated_data
  38. BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'添加商品[%s],id=%d' % (instance.name, instance.id), validated_data)
  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, u'修改商品[%s], id=%d' % (instance.name, instance.id), validated_data)
  44. def destroy(self, request, *args, **kwargs):
  45. with transaction.atomic():
  46. instance = self.get_object()
  47. instance.delete = True
  48. instance.save()
  49. BizLog.objects.addnew(self.request.user, BizLog.DELETE, u'删除商品[%s],id=%d' % (instance.name, instance.id))
  50. return response_ok()
  51. @action(methods=['post'], detail=True)
  52. def upload_show_image(self, request, pk):
  53. file = request.FILES.get('banner_img', None)
  54. user = request.user
  55. instance = self.get_object()
  56. if instance.delete:
  57. raise CustomError(u'该商品已删除,禁止操作!')
  58. if not file:
  59. raise CustomError(u'未发现上传文件!')
  60. with transaction.atomic():
  61. image = Images.objects._addnew(user, Images.COMMODITY_SHOW_IMAGE, file)
  62. old_image = instance.show_image
  63. instance.show_image = image
  64. instance.save()
  65. if old_image:
  66. old_image.del_images()
  67. return response_ok()
  68. @action(methods=['post'], detail=True)
  69. def upload_images(self, request, pk):
  70. type = request.POST.get('type')
  71. instance = self.get_object()
  72. with transaction.atomic():
  73. for i in range(10):
  74. file = request.data.get('file{}'.format(i))
  75. if not file:
  76. continue
  77. if type == 'upload_carousel':
  78. image = Images.objects._addnew(request.user, Images.COMMODITY_CAROUSEL_IMAGE, file)
  79. CommodityImage.objects.create(commodity=instance, type=CommodityImage.CAROUSEL, image=image)
  80. elif type == 'upload_detail':
  81. image = Images.objects._addnew(request.user, Images.COMMODITY_DETAILS_IMAGE, file)
  82. CommodityImage.objects.create(commodity=instance, type=CommodityImage.DETAILS, image=image)
  83. return response_ok()
  84. @action(methods=['post'], detail=True)
  85. def query_images(self, request, pk):
  86. type = request.POST.get('type')
  87. instance = self.get_object()
  88. data = []
  89. rows = CommodityImage.objects.filter(commodity_id=instance.id)
  90. if type == 'upload_carousel':
  91. rows = rows.filter(type=CommodityImage.CAROUSEL)
  92. elif type == 'upload_detail':
  93. rows = rows.filter(type=CommodityImage.DETAILS)
  94. for row in rows:
  95. image_path = row.image.get_path()
  96. item = {
  97. 'id': row.id,
  98. 'src': image_path,
  99. }
  100. data.append(item)
  101. return response_ok(data)
  102. class DeleteCommodityImageView(generics.DestroyAPIView):
  103. permission_classes = [IsEmployee, ]
  104. def destroy(self, request, *args, **kwargs):
  105. with transaction.atomic():
  106. instance = CommodityImage.getById(kwargs['pk'])
  107. image = instance.image
  108. instance.delete()
  109. image.del_images()
  110. return response_ok()