views.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. # coding=utf-8
  2. from django.db import transaction
  3. from django.conf import settings
  4. from rest_framework.views import APIView
  5. from rest_framework import generics
  6. from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
  7. from rest_framework.serializers import ValidationError
  8. from utils import response_ok, response_error
  9. from utils.exceptions import CustomError
  10. from utils.permission import IsCustomerUser, IsAdministratorUser
  11. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  12. from apps.customer.serializers import WechatLoginSerializer, WechatBindSerializer, StatementSerializer, CustomerSerializer
  13. from apps.customer.models import Customer
  14. from apps.customer.filters import CustomerFilter
  15. from apps.wechat.models import Wechat
  16. class CustomerRefreshTokenView(RefreshJSONWebToken):
  17. def post(self, request, *args, **kwargs):
  18. try:
  19. ser = self.serializer_class(data=request.data)
  20. if ser.is_valid(raise_exception=True):
  21. return response_ok({'token': ser.validated_data['token']})
  22. except ValidationError as e:
  23. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  24. class CustomerVerifyTokenView(VerifyJSONWebToken):
  25. def post(self, request, *args, **kwargs):
  26. try:
  27. ser = self.serializer_class(data=request.data)
  28. if ser.is_valid(raise_exception=True):
  29. return response_ok({'token': ser.validated_data['token']})
  30. except ValidationError as e:
  31. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  32. class WxLoginView(APIView):
  33. serializer_class = WechatLoginSerializer
  34. def post(self, request, *args, **kwargs):
  35. ser = self.serializer_class(data=request.data)
  36. if ser.is_valid():
  37. return response_ok(ser.validated_data)
  38. else:
  39. return response_error('参数错误')
  40. class WxBindView(APIView):
  41. serializer_class = WechatBindSerializer
  42. def post(self, request, *args, **kwargs):
  43. ser = self.serializer_class(data=request.data)
  44. if ser.is_valid():
  45. return response_ok(ser.validated_data)
  46. else:
  47. return response_error('参数错误')
  48. class SetUserInfoView(APIView):
  49. permission_classes = [IsCustomerUser, ]
  50. def post(self, request, *args, **kwargs):
  51. appid = request.POST.get('appid')
  52. openid = request.POST.get('openid')
  53. encryptedData = request.POST.get('encryptedData')
  54. iv = request.POST.get('iv')
  55. customer = Customer.objects.filter(openid=openid, app__appid=appid).first()
  56. if not customer:
  57. raise CustomError(u'未找到相应的微信客户!')
  58. user = request.user
  59. if customer.user and customer.user.id != user.id:
  60. raise CustomError(u'该微信已同步其他客户!')
  61. if not customer.user:
  62. customer.user = user
  63. customer.save()
  64. pc = WXBizDataCrypt(appid, customer.session_key)
  65. result = pc.decrypt(encryptedData, iv)
  66. with transaction.atomic():
  67. if result['gender'] == 1:
  68. user.gender = settings.MALE
  69. elif result['gender'] == 2:
  70. user.gender = settings.FEMALE
  71. else:
  72. user.gender = settings.UNKNOW
  73. user.name = result['nickName']
  74. user.face = result['avatarUrl']
  75. user.save()
  76. return response_ok({'face': user.face,'name': user.name})
  77. class CsutomerListViewSet(generics.ListAPIView):
  78. permission_classes = [IsAdministratorUser, ]
  79. queryset = Customer.objects.filter()
  80. serializer_class = CustomerSerializer
  81. def filter_queryset(self, queryset):
  82. queryset = queryset.filter()
  83. f = CustomerFilter(self.request.GET, queryset=queryset)
  84. return f.qs
  85. class StatementViewSet(generics.RetrieveAPIView):
  86. '''查看隐私声明'''
  87. serializer_class = StatementSerializer
  88. def retrieve(self, request, *args, **kwargs):
  89. instance = Wechat.objects.filter().first()
  90. if not instance:
  91. raise CustomError(u'未添加小程序!')
  92. serializer = self.get_serializer(instance)
  93. return response_ok(serializer.data)