views.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # coding=utf-8
  2. from django.db import transaction
  3. from django.utils import timezone
  4. from rest_framework.decorators import action
  5. from rest_framework.views import APIView
  6. from rest_framework import generics
  7. from utils import response_ok
  8. from utils.permission import IsEmployee
  9. from utils.exceptions import CustomError
  10. from utils.custom_modelviewset import CustomModelViewSet
  11. from apps.log.models import BizLog
  12. from apps.images.models import Images
  13. from apps.order.models import *
  14. from apps.order.filters import *
  15. from apps.order.serializers import *
  16. from apps.option.models import Option
  17. from apps.base import Formater
  18. from apps.rebate.models import PointLogOrder
  19. class OrderDict(APIView):
  20. permission_classes = [IsEmployee, ]
  21. def get(self, request):
  22. rows = Option.objects.filter(type=Option.EXPRESS_COMPANY, enable=True, delete=False).order_by('sort').values('id', 'name')
  23. data = [{'value': row['id'], 'name': row['name']} for row in rows]
  24. ret = {
  25. 'express_company': data
  26. }
  27. return response_ok(ret)
  28. class OrderViewSet(CustomModelViewSet):
  29. permission_classes = [IsEmployee, ]
  30. queryset = Order.objects.filter()
  31. serializer_class = OrderSerializer
  32. def filter_queryset(self, queryset):
  33. queryset = queryset.filter()
  34. f = OrderFilter(self.request.GET, queryset=queryset)
  35. return f.qs
  36. @action(methods=['get'], detail=True)
  37. def get_details(self, request, pk):
  38. '''
  39. 获取详细订单
  40. :param request:
  41. :param pk:
  42. :return:
  43. '''
  44. order = self.get_object()
  45. details = OrderDetails.objects.filter(order=order).order_by('-id')
  46. data = OrderDetailsSerializer(details, many=True).data
  47. return response_ok(data)
  48. @action(methods=['post'], detail=True)
  49. def submit_express(self, request, pk):
  50. '''
  51. 快递信息添加/修改
  52. :param request:
  53. :param pk:
  54. :return:
  55. '''
  56. order = self.get_object()
  57. express_no =request.POST.get('express_no')
  58. express_company = request.POST.get('express_company')
  59. if order.status != Order.WAIT_DISPATCH:
  60. raise CustomError(u'该订单状态禁止发货!')
  61. try:
  62. express_company_id = int(express_company)
  63. except:
  64. raise CustomError(u'无效的快递公司ID!')
  65. express_company = Option.objects.filter(id=express_company_id).first()
  66. if not express_company.enable:
  67. raise CustomError(u'该快递公司已被禁用!')
  68. if express_company.delete:
  69. raise CustomError(u'该快递公司已被删除!')
  70. with transaction.atomic():
  71. order.status = Order.CONFIRM_DISPATCH
  72. order.dispatch_time = timezone.now()
  73. order.dispatch_user = request.user
  74. order.express_no = express_no
  75. order.express_company = express_company
  76. order.save()
  77. return response_ok()
  78. @action(methods=['post'], detail=True)
  79. def cancel_order(self, request, pk):
  80. '''
  81. 取消订单
  82. :param request:
  83. :param pk:
  84. :return:
  85. '''
  86. cancel_reason = request.POST.get('cancel_reason')
  87. order = self.get_object()
  88. if order.status == Order.CANCEL:
  89. raise CustomError(u'该订单已取消,禁止重复操作!')
  90. if order.status != Order.WAIT_PAY:
  91. raise CustomError(u'该订单已付款,禁止取消!')
  92. with transaction.atomic():
  93. order.status = Order.CANCEL
  94. order.cancel_reason = cancel_reason
  95. order.cancel_user = request.user
  96. order.cancel_time = timezone.now()
  97. order.save()
  98. if order.total_point > 0:
  99. # 取消订单的时候 如果该订单有积分 要把积分返还给用户 因为积分在下单的时候已经扣除了
  100. PointLogOrder.addnew(order, cancel_order=True)
  101. return response_ok()