views.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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 isLogin
  11. from rest_framework_jwt.views import ObtainJSONWebToken, RefreshJSONWebToken
  12. from utils import response_error, response_ok
  13. from django.contrib.auth import get_user_model
  14. User = get_user_model()
  15. from apps.account.serializers import JWTSerializer, EmployeeSerializer, \
  16. WechatLoginSerializer, WechatBindSerializer
  17. from utils.custom_modelviewset import CustomModelViewSet
  18. from apps.account.filters import UserFilter
  19. from apps.log.models import BizLog
  20. from utils.exceptions import CustomError
  21. from apps.account.models import CustomerWechat
  22. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  23. class LoginView(ObtainJSONWebToken):
  24. serializer_class = JWTSerializer
  25. def post(self, request, *args, **kwargs):
  26. try:
  27. ser = self.serializer_class(data=request.data)
  28. ser.request = request
  29. if ser.is_valid(raise_exception=True):
  30. return response_ok(ser.validated_data)
  31. except ValidationError as e:
  32. return response_error(e.detail['error'][0])
  33. except CustomError as e:
  34. return response_error(str(e))
  35. class RefreshTokenView(RefreshJSONWebToken):
  36. def post(self, request, *args, **kwargs):
  37. try:
  38. ser = self.serializer_class(data=request.data)
  39. if ser.is_valid(raise_exception=True):
  40. return response_ok({'token': ser.validated_data['token'], 'error':False})
  41. except ValidationError as e:
  42. return response_ok({'error':True})
  43. except CustomError as e:
  44. return response_error(str(e))
  45. class ChangePassword(APIView):
  46. permission_classes = [isLogin, ]
  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().exclude(type=User.CUSTOMER)
  66. serializer_class = EmployeeSerializer
  67. def filter_queryset(self, queryset):
  68. queryset = queryset.filter()
  69. user = self.request.user
  70. queryset = queryset.filter(
  71. Q(id=user.id) |
  72. Q(create_user=user)
  73. )
  74. f = UserFilter(self.request.GET, queryset=queryset)
  75. return f.qs
  76. def perform_create(self, serializer):
  77. super(EmployeeViewSet, self).perform_create(serializer)
  78. instance = serializer.instance
  79. validated_data = serializer.validated_data
  80. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  81. u'添加用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  82. def perform_update(self, serializer):
  83. super(EmployeeViewSet, self).perform_update(serializer)
  84. instance = serializer.instance
  85. validated_data = serializer.validated_data
  86. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  87. u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  88. @action(methods=['post'], detail=True)
  89. def manager(self, request, pk):
  90. # 管理员工
  91. if not request.user.is_superuser:
  92. return response_error('无权操作')
  93. data = json.loads(request.POST.get('users'))
  94. try:
  95. instance = self.get_object()
  96. with transaction.atomic():
  97. instance.manager_users = ','.join(data)
  98. instance.save()
  99. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  100. u'设置[%s]管理员工,id=%d' % (instance.name, instance.id), data)
  101. return response_ok()
  102. except Exception as e:
  103. traceback.print_exc()
  104. return response_error(u'保存失败')
  105. class SetUserInfoView(APIView):
  106. permission_classes = [isLogin, ]
  107. def post(self, request, *args, **kwargs):
  108. appid = request.POST.get('appid')
  109. openid = request.POST.get('openid')
  110. encryptedData = request.POST.get('encryptedData')
  111. iv = request.POST.get('iv')
  112. customer_wechat = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
  113. if not customer_wechat:
  114. raise CustomError(u'未找到相应的微信客户!')
  115. employee = self.request.user
  116. if customer_wechat.customer and customer_wechat.customer != employee:
  117. # 用户用手机号、密码登录后,同步微信信息时,customer可能会不一样
  118. #张三、李四都是注册、同步用户。 张三的账号,在李四小程序上登录,同步的李四微信信息,可能会两个用户不同。
  119. raise CustomError(u'该微信已同步其他客户!')
  120. if not customer_wechat.customer:
  121. customer_wechat.customer = employee
  122. customer_wechat.save()
  123. pc = WXBizDataCrypt(appid, customer_wechat.session_key)
  124. result = pc.decrypt(encryptedData, iv)
  125. with transaction.atomic():
  126. if employee.name == employee.tel:
  127. employee.name = result['nickName']
  128. employee.gender = result['gender']
  129. employee.face = result['avatarUrl']
  130. employee.save()
  131. return response_ok({'face':employee.face,'name':employee.name})
  132. class WxLoginView(APIView):
  133. serializer_class = WechatLoginSerializer
  134. def post(self, request, *args, **kwargs):
  135. ser = self.serializer_class(data=request.data)
  136. if ser.is_valid():
  137. return response_ok(ser.validated_data)
  138. else:
  139. return response_error('参数错误')
  140. class WxBindView(APIView):
  141. serializer_class = WechatBindSerializer
  142. def post(self, request, *args, **kwargs):
  143. ser = self.serializer_class(data=request.data)
  144. if ser.is_valid():
  145. return response_ok(ser.validated_data)
  146. else:
  147. return response_error('参数错误')
  148. class UserDictView(APIView):
  149. def get(self, request):
  150. seller = request.GET.get('seller')
  151. data = []
  152. queryset = User.objects.filter(is_active=True, id=seller, type=User.SELLER)
  153. for row in queryset:
  154. item = {
  155. 'id': row.id,
  156. 'name': '{}-{}'.format(row.name, row.username),
  157. }
  158. data.append(item)
  159. return response_ok(data)
  160. class UserTreeView(APIView):
  161. permission_classes = [isLogin, ]
  162. def get(self, request):
  163. if not request.user.is_superuser:
  164. return response_error('无权操作')
  165. id = request.GET.get('id')
  166. agent_data = []
  167. user = User.objects.filter(id=id).first()
  168. manager_users = user.manager_users and user.manager_users.split(',') or [] # 选择用户
  169. companys = User.objects.filter(is_active=True, is_superuser=False, type=User.SELLER)
  170. for company in companys:
  171. checked = False
  172. if str(company.id) in manager_users:
  173. checked = True
  174. agent_item = {
  175. 'title': company.name,
  176. 'id': company.id,
  177. 'checked': checked,
  178. }
  179. agent_data.append(agent_item)
  180. return response_ok(agent_data)