views.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # coding=utf-8
  2. from django.db import transaction
  3. from django.db.models import F
  4. from django.conf import settings
  5. from django.utils import timezone
  6. from rest_framework import generics, mixins
  7. from rest_framework.viewsets import GenericViewSet
  8. from rest_framework.views import APIView
  9. from rest_framework.decorators import action
  10. from rest_framework.exceptions import NotFound
  11. from utils import response_ok
  12. from utils.permission import IsCustomer
  13. from utils.exceptions import CustomError
  14. from apps.commodity.models import Commodity
  15. from apps.commodity.filters import CommodityFilter
  16. from apps.log.models import BizLog
  17. from apps.customer.models import Customer
  18. from apps.collection.models import Collection
  19. from apps.option.filters import OptionFilter
  20. from apps.option.models import Option
  21. from .serializers import CommodityCategorySerializer, CommoditySerializer, CommodityDetailSerializer
  22. class CollectionViewSet(GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixin):
  23. permission_classes = [IsCustomer, ]
  24. queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
  25. serializer_class = CommoditySerializer
  26. @action(methods=['get'], detail=True)
  27. def collection(self, request, pk):
  28. instance = self.get_object()
  29. if instance.delete:
  30. raise CustomError(u'该商品已被删除!')
  31. if instance.status != settings.ONLINE:
  32. raise CustomError(u'该商品已下架!')
  33. customer = request.customer
  34. if Collection.is_collection(customer, instance):
  35. raise CustomError(u'该商品已收藏!')
  36. with transaction.atomic():
  37. Collection.addnew(customer, instance)
  38. return response_ok()
  39. @action(methods=['get'], detail=True)
  40. def uncollection(self, request, pk):
  41. instance = self.get_object()
  42. customer = request.customer
  43. collection = Collection.objects.filter(customer=customer, commodity=instance).first()
  44. if not collection or collection.delete:
  45. raise CustomError(u'该商品尚未收藏!')
  46. with transaction.atomic():
  47. Collection.objects.filter(customer=customer, commodity=instance).update(delete=True)
  48. return response_ok()
  49. class CommodityCategoryListView(generics.ListAPIView):
  50. queryset = Option.objects.filter(enable=True, delete=False, type=Option.COMMODITY_CATEGORY).order_by('sort')
  51. serializer_class = CommodityCategorySerializer
  52. def filter_queryset(self, queryset):
  53. queryset = queryset.filter()
  54. f = OptionFilter(self.request.GET, queryset=queryset)
  55. return f.qs
  56. def list(self, request, *args, **kwargs):
  57. try:
  58. data = super(CommodityCategoryListView, self).list(request)
  59. except NotFound:
  60. return response_ok([])
  61. return data
  62. class CommodityListView(generics.ListAPIView):
  63. queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
  64. serializer_class = CommoditySerializer
  65. def filter_queryset(self, queryset):
  66. queryset = queryset.filter().order_by('type', 'sort', '-id')
  67. f = CommodityFilter(self.request.GET, queryset=queryset)
  68. return f.qs
  69. def list(self, request, *args, **kwargs):
  70. try:
  71. data = super(CommodityListView, self).list(request)
  72. except NotFound:
  73. return response_ok([])
  74. return data
  75. class CommodityDetailView(generics.RetrieveAPIView):
  76. queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
  77. serializer_class = CommodityDetailSerializer
  78. def retrieve(self, request, *args, **kwargs):
  79. instance = self.get_object()
  80. if not instance:
  81. raise CustomError(u'未找到相应的商品!')
  82. serializer = self.get_serializer(instance)
  83. return response_ok(serializer.data)