views.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. # coding=utf-8
  2. import json
  3. from django.db import transaction
  4. from django.db.models import F
  5. from django.conf import settings
  6. from django.utils import timezone
  7. from rest_framework import generics, mixins
  8. from rest_framework.viewsets import GenericViewSet
  9. from rest_framework.views import APIView
  10. from rest_framework.decorators import action
  11. from rest_framework.exceptions import NotFound
  12. from utils import response_ok
  13. from utils.permission import IsCustomer
  14. from utils.exceptions import CustomError
  15. from apps.commodity.models import Commodity
  16. from apps.commodity.filters import CommodityFilter
  17. from apps.log.models import BizLog
  18. from apps.customer.models import Customer
  19. from apps.collection.models import Collection
  20. from apps.option.filters import OptionFilter
  21. from apps.option.models import Option
  22. from .serializers import CommodityCategorySerializer, CommoditySerializer, CommodityDetailSerializer, HomeOptionSerializer
  23. class CollectionViewSet(GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixin):
  24. permission_classes = [IsCustomer, ]
  25. queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
  26. serializer_class = CommoditySerializer
  27. @action(methods=['get'], detail=True)
  28. def collection(self, request, pk):
  29. instance = self.get_object()
  30. if instance.delete:
  31. raise CustomError(u'该商品已被删除!')
  32. if instance.status != settings.ONLINE:
  33. raise CustomError(u'该商品已下架!')
  34. customer = request.customer
  35. if Collection.is_collection(customer, instance):
  36. raise CustomError(u'该商品已收藏!')
  37. with transaction.atomic():
  38. Collection.addnew(customer, instance)
  39. return response_ok()
  40. @action(methods=['post'], detail=False)
  41. def batch_collection(self, request):
  42. ids = json.loads(request.data.get('ids'))
  43. commoditys = self.queryset.filter(id__in=ids)
  44. with transaction.atomic():
  45. for item in commoditys:
  46. ct = Collection.objects.filter(customer=request.customer, commodity=item).first()
  47. if not ct:
  48. Collection.objects.create(customer=request.customer, commodity=item, create_time=timezone.now())
  49. if ct and ct.delete:
  50. ct.delete = False
  51. ct.create_time = timezone.now()
  52. ct.save()
  53. return response_ok()
  54. @action(methods=['get'], detail=True)
  55. def uncollection(self, request, pk):
  56. instance = self.get_object()
  57. customer = request.customer
  58. collection = Collection.objects.filter(customer=customer, commodity=instance).first()
  59. if not collection or collection.delete:
  60. raise CustomError(u'该商品尚未收藏!')
  61. with transaction.atomic():
  62. Collection.objects.filter(customer=customer, commodity=instance).update(delete=True)
  63. return response_ok()
  64. class CommodityCategoryListView(generics.ListAPIView):
  65. queryset = Option.objects.filter(enable=True, delete=False, type=Option.COMMODITY_CATEGORY).order_by('sort')
  66. serializer_class = CommodityCategorySerializer
  67. def filter_queryset(self, queryset):
  68. queryset = queryset.filter()
  69. f = OptionFilter(self.request.GET, queryset=queryset)
  70. return f.qs
  71. def list(self, request, *args, **kwargs):
  72. try:
  73. data = super(CommodityCategoryListView, self).list(request)
  74. except NotFound:
  75. return response_ok([])
  76. return data
  77. class CommodityListView(generics.ListAPIView):
  78. queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
  79. serializer_class = CommoditySerializer
  80. def filter_queryset(self, queryset):
  81. queryset = queryset.filter().order_by('type', 'sort', '-id')
  82. f = CommodityFilter(self.request.GET, queryset=queryset)
  83. return f.qs
  84. def list(self, request, *args, **kwargs):
  85. try:
  86. data = super(CommodityListView, self).list(request)
  87. except NotFound:
  88. return response_ok([])
  89. return data
  90. class CommodityDetailView(generics.RetrieveAPIView):
  91. queryset = Commodity.objects.filter(status=settings.ONLINE, delete=False)
  92. serializer_class = CommodityDetailSerializer
  93. def retrieve(self, request, *args, **kwargs):
  94. instance = self.get_object()
  95. if not instance:
  96. raise CustomError(u'未找到相应的商品!')
  97. serializer = self.get_serializer(instance)
  98. return response_ok(serializer.data)
  99. class HomeCommodityListView(generics.ListAPIView):
  100. queryset = Option.objects.filter(type=Option.COMMODITY_CATEGORY, delete=False, enable=True)
  101. serializer_class = HomeOptionSerializer
  102. def filter_queryset(self, queryset):
  103. queryset = queryset.filter()
  104. f = OptionFilter(self.request.GET, queryset=queryset)
  105. return f.qs
  106. def list(self, request, *args, **kwargs):
  107. '''
  108. 首页商品列表 不分页 每类商品加载6条商品
  109. :param request:
  110. :param args:
  111. :param kwargs:
  112. :return:
  113. '''
  114. queryset = self.filter_queryset(self.get_queryset())
  115. serializer = self.get_serializer(queryset, many=True)
  116. return response_ok(serializer.data)