views.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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 perform_destroy(self, instance):
  45. instance.delete = True
  46. instance.save()
  47. BizLog.objects.addnew(self.request.user, BizLog.DELETE, u'删除商品[%s],id=%d' % (instance.name, instance.id))
  48. @action(methods=['post'], detail=True)
  49. def upload_show_image(self, request, pk):
  50. file = request.FILES.get('banner_img', None)
  51. user = request.user
  52. instance = self.get_object()
  53. if instance.delete:
  54. raise CustomError(u'该商品已删除,禁止操作!')
  55. if not file:
  56. raise CustomError(u'未发现上传文件!')
  57. with transaction.atomic():
  58. image = Images.objects._addnew(user, Images.COMMODITY_SHOW_IMAGE, file)
  59. old_image = instance.show_image
  60. instance.show_image = image
  61. instance.save()
  62. if old_image:
  63. old_image.del_images()
  64. return response_ok()
  65. @action(methods=['post'], detail=True)
  66. def upload_images(self, request, pk):
  67. type = request.POST.get('type')
  68. instance = self.get_object()
  69. with transaction.atomic():
  70. for i in range(10):
  71. file = request.data.get('file{}'.format(i))
  72. if not file:
  73. continue
  74. if type == 'upload_carousel':
  75. image = Images.objects._addnew(request.user, Images.COMMODITY_CAROUSEL_IMAGE, file)
  76. CommodityImage.objects.create(commodity=instance, type=CommodityImage.CAROUSEL, image=image)
  77. elif type == 'upload_detail':
  78. image = Images.objects._addnew(request.user, Images.COMMODITY_DETAILS_IMAGE, file)
  79. CommodityImage.objects.create(commodity=instance, type=CommodityImage.DETAILS, image=image)
  80. return response_ok()
  81. @action(methods=['post'], detail=True)
  82. def query_images(self, request, pk):
  83. type = request.POST.get('type')
  84. instance = self.get_object()
  85. data = []
  86. rows = CommodityImage.objects.filter(commodity_id=instance.id)
  87. if type == 'upload_carousel':
  88. rows = rows.filter(type=CommodityImage.CAROUSEL)
  89. elif type == 'upload_detail':
  90. rows = rows.filter(type=CommodityImage.DETAILS)
  91. for row in rows:
  92. image_path = row.image.get_path()
  93. item = {
  94. 'id': row.id,
  95. 'src': image_path,
  96. }
  97. data.append(item)
  98. return response_ok(data)
  99. class DeleteCommodityImageView(generics.DestroyAPIView):
  100. permission_classes = [IsEmployee, ]
  101. def destroy(self, request, *args, **kwargs):
  102. with transaction.atomic():
  103. instance = CommodityImage.getById(kwargs['pk'])
  104. image = instance.image
  105. instance.delete()
  106. image.del_images()
  107. return response_ok()