wushaodong 3 år sedan
förälder
incheckning
07671cc93c
6 ändrade filer med 90 tillägg och 3 borttagningar
  1. 0 1
      apps/commodity/models.py
  2. 14 0
      apps/order/models.py
  3. 34 0
      apps/order/serializers.py
  4. 1 0
      apps/order/urls.py
  5. 40 1
      apps/order/views.py
  6. 1 1
      uis/views/order/index.html

+ 0 - 1
apps/commodity/models.py

@@ -40,7 +40,6 @@ class Commodity(models.Model):
         permissions = [
         ]
 
-
 class CommodityImages(models.Model):
     DETAILS = 1
     PARAMETER = 2

+ 14 - 0
apps/order/models.py

@@ -174,3 +174,17 @@ class Order(models.Model):
         if not instance:
             raise CustomError('未找到对应的订单')
         return instance
+
+class ShoppingCart(models.Model):
+    commodity = models.ForeignKey(Commodity, verbose_name='产品', on_delete=models.PROTECT)
+    quantity = models.PositiveIntegerField(verbose_name="数量", default=1)
+    create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='shopping_cart_create_user',
+                                    verbose_name=u"下单人",
+                                    on_delete=models.PROTECT, editable=False)
+
+    class Meta:
+        db_table = "shopping_cart"
+        verbose_name = "购物车"
+        ordering = ['-id', ]
+        default_permissions = ()

+ 34 - 0
apps/order/serializers.py

@@ -36,3 +36,37 @@ class CouponSerializer(serializers.ModelSerializer):
         instance = super(CouponSerializer, self).create(validated_data)
         instance.save()
         return instance
+
+class ShoppingCartSerializer(serializers.ModelSerializer):
+    name = serializers.CharField(source='commodity.name', read_only=True)
+    stock = serializers.CharField(source='commodity.stock', read_only=True)
+    price = serializers.SerializerMethodField()
+    images = serializers.SerializerMethodField()
+
+    def get_price(self, obj):
+        return Formater.formatAmountShow(obj.commodity.price * obj.commodity.discount)
+
+    def get_images(self, obj):
+        if obj.commodity.main_image:
+            img = Upload.objects.filter(id=obj.commodity.main_image.id).first()
+            if img:
+                return img.get_path()
+        return ''
+
+    class Meta:
+        model = ShoppingCart
+        fields = (
+            'id', 'name', 'price', 'stock',  'images', 'quantity', 'commodity'
+        )
+
+    def create(self, validated_data):
+        validated_data['create_user'] = self.context['request'].user
+        validated_data['quantity'] = validated_data.get('quantity')
+        instance = ShoppingCart.objects.filter(commodity=self.initial_data['commodity'],
+                                               create_user=validated_data['create_user']).first()
+        if instance:
+            instance.quantity += validated_data['quantity']
+            instance.save()
+        else:
+            instance = super(ShoppingCartSerializer, self).create(validated_data)
+        return instance

+ 1 - 0
apps/order/urls.py

@@ -9,5 +9,6 @@ urlpatterns = [
 ]
 
 router = SimpleRouter()
+router.register(r'shopping_cart', ShoppingCartViewSet)
 router.register(r'', OrderViewSet)
 urlpatterns += router.urls

+ 40 - 1
apps/order/views.py

@@ -1,5 +1,5 @@
 # coding=utf-8
-import json
+import traceback
 from django.db.models import Sum, F
 from rest_framework.decorators import action
 from rest_framework.views import APIView
@@ -150,3 +150,42 @@ class ExportOrderDictView(APIView):
         filename = attachment_save(export_data,'用户订单{}'.format(timezone.now().date()))
 
         return response_ok({'filename': filename})
+
+class ShoppingCartViewSet(CustomModelViewSet):
+    permission_classes = [isLogin]
+    queryset = ShoppingCart.objects.filter()
+    serializer_class = ShoppingCartSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(create_user=self.request.user)
+        return queryset
+
+    @action(methods=['post'], detail=True)
+    def modify_quantity(self, request, pk):
+        quantity = self.request.POST.get('quantity')
+
+        try:
+            with transaction.atomic():
+                instance = ShoppingCart.objects.filter(id=pk, create_user=self.request.user).first()
+                if instance:
+                    instance.quantity = quantity
+                    instance.save()
+            return response_ok()
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            traceback.print_exc()
+            return response_error(str(e))
+
+    @action(methods=['post'], detail=False)
+    def del_shopping_carts(self, request):
+        item = request.POST.get('ids').split(',')
+        try:
+            with transaction.atomic():
+                ShoppingCart.objects.filter(id__in=item, create_user=self.request.user).delete()
+            return response_ok()
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            traceback.print_exc()
+            return response_error(str(e))

+ 1 - 1
uis/views/order/index.html

@@ -128,7 +128,7 @@
                 {field: 'no', title: '订单号', width: 215}
                 , {field: 'commodity_text', title: '商品', width: 150}
                 , {field: 'total_amount', title: '总金额',totalRow:true, width: 100}
-                , {field: 'balance_deduction', title: '余额抵扣',totalRow:true, width: 100}
+                , {field: 'coupon_deduction', title: '优惠券抵扣',totalRow:true, width: 100}
                 , {field: 'actual_amount', title: '实付金额',totalRow:true, width: 100}
                 , {field: 'status_text', title: '订单状态', width: 100}
                 , {field: 'notes', title: '备注', width: 150,}