# coding=utf-8 import json from django.db.models import Sum, F from django.db import transaction from django.db.models import Q from rest_framework.views import APIView from rest_framework.generics import ListAPIView from utils.custom_modelviewset import CustomModelViewSet from .serializers import * from .filters import * from apps.log.models import BizLog from utils import response_ok, response_error from utils.permission import isLogin from apps.order.models import Order from rest_framework.decorators import action from django.contrib.auth import get_user_model User = get_user_model() class ProductView(APIView): def get(self, request): data = [] queryset = Product.objects.filter(enable=True) for row in queryset: item = { 'id':row.id, 'name':row.name, 'month':row.month, } data.append(item) return response_ok(data) class DeleteProductImageView(APIView): permission_classes = [isLogin, ] def post(self, request, *args, **kwargs): # 商品图片 删除 id = request.GET.get('id') try: instance = ProductImages.getById(id) image = Upload.objects.filter(id=instance.image_id).first() with transaction.atomic(): instance.delete() image.del_images() except CustomError as e: return response_error(e.get_error_msg()) except Exception as e: return response_error(str(e)) return response_ok() class ProductViewSet(CustomModelViewSet): permission_classes = [isLogin, ] queryset = Product.objects.filter() serializer_class = ProductSerializer def filter_queryset(self, queryset): f = ProductFilter(self.request.GET, queryset=queryset) return f.qs @action(methods=['post'], detail=True) def upload_image(self, request, pk): banner_img = request.FILES.get('banner_img') try: with transaction.atomic(): instance = self.get_object() upload = Upload.objects._addnew(banner_img, 'commodity_image') if upload: if instance.main_image_id: img = Upload.objects.filter(id=instance.main_image_id).first() img.del_images() instance.main_image_id = upload.id instance.save() return response_ok(upload.id) return response_error('上传失败,请重新上传!') except CustomError as e: return response_error(e.get_error_msg()) except Exception as e: return response_error(str(e)) @action(methods=['post'], detail=True) def upload_detail_img(self, request, pk): # 上传详情、参数图片 try: with transaction.atomic(): instance = self.get_object() for i in range(10): file = request.data.get('file{}'.format(i)) if file: upload = Upload.objects._addnew(file, 'commodity_image') ProductImages.objects.create(product_id=instance.id, image_id=upload.id) if not upload: return response_error('上传失败,请重新上传!') except CustomError as e: return response_error(e.get_error_msg()) except Exception as e: return response_error(str(e)) return response_ok() @action(methods=['post'], detail=True) def query_detail_img(self, request, pk): # 查看 详情图片 instance = self.get_object() data = [] commodity_images = ProductImages.objects.filter(product_id=instance.id) for commodity_image in commodity_images: image = Upload.objects.filter(id=commodity_image.image_id).first() image_path = image.get_path() commodity_image_item = { 'id': commodity_image.id, 'name': commodity_image.name, 'src': image_path, } data.append(commodity_image_item) return response_ok(data) class ProductListViewSet(ListAPIView): queryset = Product.objects.filter() serializer_class = ProductListSerializer def filter_queryset(self, queryset,): f = ProductFilter(self.request.GET, queryset=queryset) return f.qs class OrderListViewSet(ListAPIView): permission_classes = [isLogin, ] queryset = Order.objects.filter() serializer_class = OrderListSerializer def filter_queryset(self, queryset,): queryset = queryset.filter(Q(create_user=self.request.user) | Q(seller=self.request.user)) f = OrderFilter(self.request.GET, queryset=queryset) return f.qs class OrderViewSet(CustomModelViewSet): permission_classes = [isLogin, ] queryset = Order.objects.filter() serializer_class = OrderSerializer def filter_queryset(self, queryset): queryset = queryset.filter(Q(create_user=self.request.user) | Q(seller=self.request.user)) f = OrderFilter(self.request.GET, queryset=queryset) return f.qs def create(self, request, *args, **kwargs): try: with transaction.atomic(): serializer = self.get_serializer(data=request.data) if serializer.is_valid(raise_exception=True): instance = serializer.save() BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'添加订单[%s],id=%d' % (instance.name, instance.id), request.data) return response_ok() except CustomError as e: return response_error(e.get_error_msg()) except Exception as e: return response_error(str(e)) def update(self, request, *args, **kwargs): data = request.POST try: instance = self.get_object() with transaction.atomic(): serializer = self.get_serializer(instance,data=request.data) if serializer.is_valid(raise_exception=True): instance = serializer.save() for key in data: edit, create = OrderDetailEdit.objects.get_or_create(type=OrderDetailEdit.ZERO, order=instance, value=key) if not create: edit.edit_time = datetime.datetime.now() edit.save() BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'修改订单[%s],id=%d' % (instance.name, instance.id), request.data) return response_ok() except CustomError as e: return response_error(e.get_error_msg()) except Exception as e: return response_error(str(e)) @action(methods=['post'], detail=False) def upload_image(self, request): file = self.request.FILES.get('file') type = self.request.FILES.get('type') order_id = self.request.FILES.get('order_id') upload = Upload.objects._addnew(file) if upload: OrderImages.objects.create(order_id=order_id, type=type, image=upload) return response_ok(upload.id) return response_error('上传失败,请重新上传!') @action(methods=['post'], detail=True) def update_image(self, request): file = self.request.FILES.get('file') upload_id = self.request.FILES.get('upload_id') upload = Upload.objects.filter(id=upload_id).first() if upload: upload.del_images() Upload.objects._update(file, 'user_image', upload) return response_ok(upload.id) return response_error('更新失败,请重新上传!') def destroy(self, request, *args, **kwargs): try: instance = self.get_object() if instance.category == order.ONE: raise CustomError('已上报信息,禁止删除!') with transaction.atomic(): OrderDetailEdit.objects.filter(order=instance).delete() images = OrderImages.objects.filter(order=instance) for image in images: upload = Upload.objects.filter(id=image.image.id) upload.del_images() images.delete() super(OrderViewSet, self).destroy(request, *args, **kwargs) except CustomError as e: return response_error(e.get_error_msg()) except Exception as e: return response_error(str(e)) return response_ok()