views.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # coding=utf-8
  2. from django.db import transaction
  3. from django.db.models import Sum
  4. from rest_framework.views import APIView
  5. from rest_framework_jwt.views import VerifyJSONWebToken,RefreshJSONWebToken
  6. from rest_framework.serializers import ValidationError
  7. from rest_framework.decorators import action
  8. from utils import response_ok, response_error
  9. from utils.permission import IsCustomer, IsEmployee
  10. from utils.custom_modelviewset import CustomModelViewSet
  11. from apps.customer.serializers import WechatLoginSerializer, WechatBindSerializer, CustomerSerializer
  12. from apps.customer.models import Customer
  13. from apps.customer.filters import CustomerFilter
  14. from apps.log.models import BizLog
  15. from apps.base import Formater
  16. class WxLoginView(APIView):
  17. serializer_class = WechatLoginSerializer
  18. def post(self, request, *args, **kwargs):
  19. ser = self.serializer_class(data=request.data)
  20. if ser.is_valid():
  21. return response_ok(ser.validated_data)
  22. else:
  23. return response_error('参数错误')
  24. class WxBindView(APIView):
  25. serializer_class = WechatBindSerializer
  26. def post(self, request, *args, **kwargs):
  27. ser = self.serializer_class(data=request.data)
  28. if ser.is_valid():
  29. return response_ok(ser.validated_data)
  30. else:
  31. return response_error('参数错误')
  32. class SetUserInfoView(APIView):
  33. permission_classes = [IsCustomer, ]
  34. def post(self, request, *args, **kwargs):
  35. appid = request.POST.get('appid')
  36. openid = request.POST.get('openid')
  37. encryptedData = request.POST.get('encryptedData')
  38. iv = request.POST.get('iv')
  39. with transaction.atomic():
  40. face, name = request.customer.setInfo(appid, openid, encryptedData, iv)
  41. return response_ok({'face': face, 'name': name})
  42. class CustomerRefreshTokenView(RefreshJSONWebToken):
  43. def post(self, request, *args, **kwargs):
  44. try:
  45. ser = self.serializer_class(data=request.data)
  46. if ser.is_valid(raise_exception=True):
  47. return response_ok({'token': ser.validated_data['token']})
  48. except ValidationError as e:
  49. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  50. class CustomerVerifyTokenView(VerifyJSONWebToken):
  51. def post(self, request, *args, **kwargs):
  52. try:
  53. ser = self.serializer_class(data=request.data)
  54. if ser.is_valid(raise_exception=True):
  55. return response_ok({'token': ser.validated_data['token']})
  56. except ValidationError as e:
  57. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  58. class CustomerViewSet(CustomModelViewSet):
  59. permission_classes = [IsEmployee, ]
  60. queryset = Customer.objects.filter()
  61. serializer_class = CustomerSerializer
  62. def filter_queryset(self, queryset):
  63. queryset = queryset.filter()
  64. f = CustomerFilter(self.request.GET, queryset=queryset)
  65. return f.qs
  66. def list(self, request, *args, **kwargs):
  67. footer = {}
  68. queryset = self.filter_queryset(self.get_queryset())
  69. total_row = queryset.aggregate(
  70. balance=Sum('balance'), points=Sum('points'), success_count=Sum('success_count'),
  71. total_amount=Sum('total_amount'), total_point=Sum('total_point')
  72. )
  73. footer['total_balance'] = Formater.formatAmountShow(total_row['balance'] or 0)
  74. footer['total_points'] = str(total_row['points'] or 0)
  75. footer['total_success_count'] = str(total_row['success_count'] or 0)
  76. footer['all_total_amount'] = Formater.formatAmountShow(total_row['total_amount'] or 0)
  77. footer['all_total_point'] = str(total_row['total_point'] or 0)
  78. page = self.paginate_queryset(queryset)
  79. if page is not None:
  80. serializer = self.get_serializer(page, many=True)
  81. return self.get_paginated_response({'data': serializer.data, 'footer': footer})
  82. serializer = self.get_serializer(queryset, many=True)
  83. return response_ok({'data': serializer.data, 'footer': footer})
  84. @action(methods=['get'], detail=False)
  85. def export(self, request):
  86. queryset = self.filter_queryset(self.queryset)
  87. serializer = self.get_serializer(queryset, many=True)
  88. return response_ok(serializer.data)