# coding=utf-8 from django.db import transaction from rest_framework.decorators import action from rest_framework.views import APIView from utils import response_ok from utils.permission import IsEmployee from utils.exceptions import CustomError from utils.custom_modelviewset import CustomModelViewSet from apps.log.models import BizLog from apps.images.models import Images from apps.commodity.models import Commodity, CommodityImage from apps.commodity.filters import CommodityFilter, CommodityImageFilter from .serializers import CommoditySerializer, CommodityImageSerializer from apps.option.models import Option from apps.base import Formater class CommodityDict(APIView): permission_classes = [IsEmployee, ] def get(self, request): rows = Option.objects.filter(type=Option.COMMODITY_CATEGORY, enable=True, delete=False).order_by('sort').values('id', 'name') data = [{'value': row['id'], 'name': row['name']} for row in rows] ret = { 'category': data } return response_ok(ret) class CommodityViewSet(CustomModelViewSet): permission_classes = [IsEmployee, ] queryset = Commodity.objects.filter(delete=False) serializer_class = CommoditySerializer def filter_queryset(self, queryset): queryset = queryset.filter() f = CommodityFilter(self.request.GET, queryset=queryset) return f.qs def perform_create(self, serializer): super(CommodityViewSet, self).perform_create(serializer) instance = serializer.instance validated_data = serializer.validated_data BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'添加商品[%s],id=%d' % (instance.name, instance.id), validated_data) def perform_update(self, serializer): super(CommodityViewSet, self).perform_update(serializer) instance = serializer.instance validated_data = serializer.validated_data BizLog.objects.addnew(self.request.user, BizLog.UPDATE, u'修改商品[%s], id=%d' % (instance.name, instance.id), validated_data) def destroy(self, request, *args, **kwargs): with transaction.atomic(): instance = self.get_object() instance.delete = True instance.save() BizLog.objects.addnew(self.request.user, BizLog.DELETE, u'删除商品[%s],id=%d' % (instance.name, instance.id)) return response_ok() @action(methods=['post'], detail=True) def update_image(self, request, pk): file = request.FILES.get('image', None) user = request.user instance = self.get_object() if instance.delete: raise CustomError(u'该商品已删除,禁止操作!') with transaction.atomic(): serializer = self.get_serializer(instance, data=request.data) serializer.is_valid(raise_exception=True) self.perform_update(serializer) # tenant_log(user.employee, BizLog.UPDATE, u'修改商品[%s],id=%d' % (instance.name, instance.id), request.data) if file: old_thumbnail = instance.thumbnail thumbnail = Images.objects.employee_addnew(user.employee, Images.PACKAGE_THUMBNAIL_FILE, file) instance.thumbnail = thumbnail instance.save() if old_thumbnail: old_thumbnail.del_images() return response_ok() # # @action(methods=['post'], detail=True) # def upload_playbill(self, request, pk): # if not self.request.user.has_perm('package.edit_package'): # raise CustomError(u"您没有[商品管理-修改]权限,无法执行该操作,请联系管理员分配权限!") # file = request.FILES.get('image', None) # user = request.user # instance = self.get_object() # if instance.delete: # raise CustomError(u'该商品已删除,禁止操作!') # if instance.tenant != user.employee.tenant: # raise CustomError(u'禁止跨租户操作!') # if not file: # raise CustomError(u'未发现上传文件!') # # with transaction.atomic(): # # tenant_log(user.employee, BizLog.UPDATE, u'商品[%s]上传海报,id=%d' % (instance.name, instance.id)) # old_playbill = instance.playbill # playbill = Images.objects.employee_addnew(user.employee, Images.PACKAGE_PLAYBILL_FILE, file) # instance.playbill = playbill # instance.save() # if old_playbill: # old_playbill.del_images() # # return response_ok() # # @action(methods=['post'], detail=True) # def upload_images(self, request, pk): # if not self.request.user.has_perm('package.edit_package'): # raise CustomError(u"您没有[商品管理-修改]权限,无法执行该操作,请联系管理员分配权限!") # instance = self.get_object() # images = request.FILES.get('images', None) # user = request.user # # if instance.delete: # raise CustomError(u'该商品已删除,禁止操作!') # if instance.tenant != user.employee.tenant: # raise CustomError(u'禁止跨租户操作!') # if not images: # raise CustomError(u'未找到上传文件!') # # with transaction.atomic(): # image = Images.objects.employee_addnew(user.employee, Images.PACKAGE_FILE, images) # CommodityImage.objects.create(main=instance, img=image) # # # tenant_log(user.employee, BizLog.INSERT, u'商品[%s]上传图片儿,id=%d' % (instance.name, instance.id)) # # return response_ok() class CommodityImageViewSet(CustomModelViewSet): permission_classes = [IsEmployee, ] queryset = CommodityImage.objects.filter() serializer_class = CommodityImageSerializer def filter_queryset(self, queryset): f = CommodityImageFilter(self.request.GET, queryset=queryset) return f.qs def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) serializer = self.get_serializer(queryset, many=True) return response_ok(serializer.data) def destroy(self, request, *args, **kwargs): with transaction.atomic(): instance = self.get_object() if instance.main.tenant != request.user.employee.tenant: raise CustomError(u'禁止跨租户操作!') # tenant_log(self.request.user.employee, BizLog.DELETE, u'删除商品[%s]图片,id=%d' % (instance.main.name, instance.main.id)) img = instance.img instance.delete() img.del_images() return response_ok() # class PackageSearch(APIView): # permission_classes = [IsEmployee, ] # # def get(self, request): # keyword = request.GET.get('keyword') # tenant = request.user.employee.tenant # rows = Package.objects.filter(delete=False, enabled=True, tenant=tenant) # if keyword: # rows = rows.filter(name__icontains=keyword) # serializer = PackageSerializer(rows, many=True) # return response_ok(serializer.data)