views.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. class OrderDict(APIView):
  19. permission_classes = [IsEmployee, ]
  20. def get(self, request):
  21. rows = Option.objects.filter(type=Option.EXPRESS_COMPANY, enable=True, delete=False).order_by('sort').values('id', 'name')
  22. data = [{'value': row['id'], 'name': row['name']} for row in rows]
  23. ret = {
  24. 'express_company': data
  25. }
  26. return response_ok(ret)
  27. class OrderViewSet(CustomModelViewSet):
  28. permission_classes = [IsEmployee, ]
  29. queryset = Order.objects.filter()
  30. serializer_class = OrderSerializer
  31. def filter_queryset(self, queryset):
  32. queryset = queryset.filter()
  33. f = OrderFilter(self.request.GET, queryset=queryset)
  34. return f.qs
  35. @action(methods=['get'], detail=True)
  36. def get_details(self, request, pk):
  37. '''
  38. 获取详细订单
  39. :param request:
  40. :param pk:
  41. :return:
  42. '''
  43. order = self.get_object()
  44. details = OrderDetails.objects.filter(order=order).order_by('-id')
  45. data = OrderDetailsSerializer(details, many=True).data
  46. return response_ok(data)
  47. @action(methods=['post'], detail=True)
  48. def submit_express(self, request, pk):
  49. '''
  50. 快递信息添加/修改
  51. :param request:
  52. :param pk:
  53. :return:
  54. '''
  55. order = self.get_object()
  56. express_no =request.POST.get('express_no')
  57. express_company = request.POST.get('express_company')
  58. if order.status != Order.WAIT_DISPATCH:
  59. raise CustomError(u'该订单状态禁止发货!')
  60. try:
  61. express_company_id = int(express_company)
  62. except:
  63. raise CustomError(u'无效的快递公司ID!')
  64. express_company = Option.objects.filter(id=express_company_id).first()
  65. if not express_company.enable:
  66. raise CustomError(u'该快递公司已被禁用!')
  67. if express_company.delete:
  68. raise CustomError(u'该快递公司已被删除!')
  69. with transaction.atomic():
  70. order.status = Order.WAIT_EVALUATE
  71. order.dispatch_time = timezone.now()
  72. order.dispatch_user = request.user
  73. order.express_no = express_no
  74. order.express_company = express_company
  75. order.save()
  76. return response_ok()
  77. @action(methods=['post'], detail=True)
  78. def cancel_order(self, request, pk):
  79. '''
  80. 取消订单
  81. :param request:
  82. :param pk:
  83. :return:
  84. '''
  85. cancel_reason = request.POST.get('cancel_reason')
  86. order = self.get_object()
  87. if order.status == Order.CANCEL:
  88. raise CustomError(u'该订单已取消,禁止重复操作!')
  89. if order.status != Order.WAIT_PAY:
  90. raise CustomError(u'该订单已付款,禁止取消!')
  91. with transaction.atomic():
  92. order.status = Order.CANCEL
  93. order.cancel_reason = cancel_reason
  94. order.cancel_user = request.user
  95. order.cancel_time = timezone.now()
  96. order.save()
  97. return response_ok()