123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # coding=utf-8
- from django.db import transaction
- from django.db.models import F
- from django.conf import settings
- from django.utils import timezone
- from rest_framework import generics, mixins
- from rest_framework.viewsets import GenericViewSet
- from rest_framework.views import APIView
- from rest_framework.decorators import action
- from rest_framework.exceptions import NotFound
- from utils import response_ok
- from utils.permission import IsCustomer
- from utils.exceptions import CustomError
- from apps.commodity.models import Commodity
- from apps.commodity.filters import CommodityFilter
- from apps.log.models import BizLog
- from apps.customer.models import Customer
- from apps.collection.models import Collection
- from apps.option.filters import OptionFilter
- from apps.option.models import Option
- from .serializers import CommodityCategorySerializer, CommoditySerializer, CommodityDetailSerializer
- class CollectionViewSet(GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixin):
- permission_classes = [IsCustomer, ]
- queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
- serializer_class = CommoditySerializer
- @action(methods=['get'], detail=True)
- def collection(self, request, pk):
- instance = self.get_object()
- if instance.delete:
- raise CustomError(u'该商品已被删除!')
- if instance.status != settings.ONLINE:
- raise CustomError(u'该商品已下架!')
- customer = request.customer
- if Collection.is_collection(customer, instance):
- raise CustomError(u'该商品已收藏!')
- with transaction.atomic():
- Collection.addnew(customer, instance)
- return response_ok()
- @action(methods=['get'], detail=True)
- def uncollection(self, request, pk):
- instance = self.get_object()
- customer = request.customer
- collection = Collection.objects.filter(customer=customer, commodity=instance).first()
- if not collection or collection.delete:
- raise CustomError(u'该商品尚未收藏!')
- with transaction.atomic():
- Collection.objects.filter(customer=customer, commodity=instance).update(delete=True)
- return response_ok()
- class CommodityCategoryListView(generics.ListAPIView):
- queryset = Option.objects.filter(enable=True, delete=False, type=Option.COMMODITY_CATEGORY).order_by('sort')
- serializer_class = CommodityCategorySerializer
- def filter_queryset(self, queryset):
- queryset = queryset.filter()
- f = OptionFilter(self.request.GET, queryset=queryset)
- return f.qs
- def list(self, request, *args, **kwargs):
- try:
- data = super(CommodityCategoryListView, self).list(request)
- except NotFound:
- return response_ok([])
- return data
- class CommodityListView(generics.ListAPIView):
- queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
- serializer_class = CommoditySerializer
- def filter_queryset(self, queryset):
- queryset = queryset.filter().order_by('type', 'sort', '-id')
- f = CommodityFilter(self.request.GET, queryset=queryset)
- return f.qs
- def list(self, request, *args, **kwargs):
- try:
- data = super(CommodityListView, self).list(request)
- except NotFound:
- return response_ok([])
- return data
- class CommodityDetailView(generics.RetrieveAPIView):
- queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
- serializer_class = CommodityDetailSerializer
- def retrieve(self, request, *args, **kwargs):
- instance = self.get_object()
- if not instance:
- raise CustomError(u'未找到相应的商品!')
- serializer = self.get_serializer(instance)
- return response_ok(serializer.data)
|