views.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. # coding=utf-8
  2. import traceback
  3. import json
  4. import datetime
  5. from django.db.models import Q
  6. from rest_framework.decorators import action
  7. from django.db import transaction
  8. from rest_framework.views import APIView
  9. from rest_framework.serializers import ValidationError
  10. from utils.permission import permission_required, isLogin, check_permission
  11. from django.contrib.auth.models import Group, Permission
  12. from rest_framework_jwt.views import ObtainJSONWebToken, RefreshJSONWebToken
  13. from utils import response_error, response_ok
  14. from django.contrib.auth import get_user_model
  15. User = get_user_model()
  16. from apps.account.serializers import JWTSerializer, EmployeeSerializer, \
  17. WechatLoginSerializer, WechatBindSerializer
  18. from utils.custom_modelviewset import CustomModelViewSet
  19. from apps.account.filters import UserFilter
  20. from apps.log.models import BizLog
  21. from utils.exceptions import CustomError
  22. from apps.account.models import CustomerWechat
  23. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  24. class LoginView(ObtainJSONWebToken):
  25. serializer_class = JWTSerializer
  26. def post(self, request, *args, **kwargs):
  27. try:
  28. ser = self.serializer_class(data=request.data)
  29. ser.request = request
  30. if ser.is_valid(raise_exception=True):
  31. return response_ok(ser.validated_data)
  32. except ValidationError as e:
  33. return response_error(e.detail['error'][0])
  34. except CustomError as e:
  35. return response_error(str(e))
  36. class RefreshTokenView(RefreshJSONWebToken):
  37. def post(self, request, *args, **kwargs):
  38. try:
  39. ser = self.serializer_class(data=request.data)
  40. if ser.is_valid(raise_exception=True):
  41. return response_ok({'token': ser.validated_data['token']})
  42. except ValidationError as e:
  43. return response_ok({'error':True})
  44. except CustomError as e:
  45. return response_error(str(e))
  46. class ChangePassword(APIView):
  47. def post(self, request, *args, **kwargs):
  48. id = request.GET.get('id')
  49. data = json.loads(request.body)
  50. try:
  51. with transaction.atomic():
  52. user = User.objects.filter(id=id).first()
  53. if not user:
  54. raise CustomError(u'用户信息错误,请刷新重试!')
  55. user.change_password(data['new_password'], data['confirm_password'], data['old_password'])
  56. BizLog.objects.addnew(request.user, BizLog.UPDATE, u"修改密码[%s],id=%d" % (user.username, user.id))
  57. except CustomError as e:
  58. return response_error(str(e))
  59. except Exception as e:
  60. traceback.print_exc()
  61. return response_error(u'保存失败!')
  62. return response_ok()
  63. class EmployeeViewSet(CustomModelViewSet):
  64. permission_classes = [isLogin, ]
  65. queryset = User.objects.filter(type__lte=User.AGENT)
  66. serializer_class = EmployeeSerializer
  67. @permission_required('account.browse_user')
  68. def filter_queryset(self, queryset):
  69. queryset = queryset.filter()
  70. user = self.request.user
  71. queryset = queryset.filter(
  72. Q(id=user.id) |
  73. Q(create_user=user)
  74. )
  75. f = UserFilter(self.request.GET, queryset=queryset)
  76. return f.qs
  77. @permission_required('account.add_user')
  78. def perform_create(self, serializer):
  79. super(EmployeeViewSet, self).perform_create(serializer)
  80. instance = serializer.instance
  81. validated_data = serializer.validated_data
  82. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  83. u'添加用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  84. @permission_required('account.add_user')
  85. def perform_update(self, serializer):
  86. super(EmployeeViewSet, self).perform_update(serializer)
  87. instance = serializer.instance
  88. validated_data = serializer.validated_data
  89. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  90. u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  91. class SetUserInfoView(APIView):
  92. permission_classes = [isLogin, ]
  93. def post(self, request, *args, **kwargs):
  94. appid = request.POST.get('appid')
  95. openid = request.POST.get('openid')
  96. encryptedData = request.POST.get('encryptedData')
  97. iv = request.POST.get('iv')
  98. customer_wechat = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
  99. if not customer_wechat:
  100. raise CustomError(u'未找到相应的微信客户!')
  101. employee = self.request.user
  102. if customer_wechat.customer and customer_wechat.customer != employee:
  103. # 用户用手机号、密码登录后,同步微信信息时,customer可能会不一样
  104. #张三、李四都是注册、同步用户。 张三的账号,在李四小程序上登录,同步的李四微信信息,可能会两个用户不同。
  105. raise CustomError(u'该微信已同步其他客户!')
  106. if not customer_wechat.customer:
  107. customer_wechat.customer = employee
  108. customer_wechat.save()
  109. pc = WXBizDataCrypt(appid, customer_wechat.session_key)
  110. result = pc.decrypt(encryptedData, iv)
  111. with transaction.atomic():
  112. if employee.name == employee.tel:
  113. employee.name = result['nickName']
  114. employee.gender = result['gender']
  115. employee.face = result['avatarUrl']
  116. employee.save()
  117. return response_ok({'face':employee.face,'name':employee.name})
  118. class WxLoginView(APIView):
  119. serializer_class = WechatLoginSerializer
  120. def post(self, request, *args, **kwargs):
  121. ser = self.serializer_class(data=request.data)
  122. if ser.is_valid():
  123. return response_ok(ser.validated_data)
  124. else:
  125. return response_error('参数错误')
  126. class WxBindView(APIView):
  127. serializer_class = WechatBindSerializer
  128. def post(self, request, *args, **kwargs):
  129. ser = self.serializer_class(data=request.data)
  130. if ser.is_valid():
  131. return response_ok(ser.validated_data)
  132. else:
  133. return response_error('参数错误')