views.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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, GroupDictSerializer, GroupSerializer
  18. from utils.custom_modelviewset import CustomModelViewSet
  19. from apps.account.filters import UserFilter, GroupFilter
  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. from apps.account.consts import PermissionMenu
  25. from collections import OrderedDict
  26. class LoginView(ObtainJSONWebToken):
  27. serializer_class = JWTSerializer
  28. def post(self, request, *args, **kwargs):
  29. try:
  30. ser = self.serializer_class(data=request.data)
  31. ser.request = request
  32. if ser.is_valid(raise_exception=True):
  33. return response_ok(ser.validated_data)
  34. except ValidationError as e:
  35. return response_error(e.detail['error'][0])
  36. except CustomError as e:
  37. return response_error(str(e))
  38. class RefreshTokenView(RefreshJSONWebToken):
  39. def post(self, request, *args, **kwargs):
  40. try:
  41. ser = self.serializer_class(data=request.data)
  42. if ser.is_valid(raise_exception=True):
  43. return response_ok({'token': ser.validated_data['token']})
  44. except ValidationError as e:
  45. return response_ok({'error':True})
  46. except CustomError as e:
  47. return response_error(str(e))
  48. class ChangePassword(APIView):
  49. def post(self, request, *args, **kwargs):
  50. id = request.GET.get('id')
  51. data = json.loads(request.body)
  52. try:
  53. with transaction.atomic():
  54. user = User.objects.filter(id=id).first()
  55. if not user:
  56. raise CustomError(u'用户信息错误,请刷新重试!')
  57. user.change_password(data['new_password'], data['confirm_password'], data['old_password'])
  58. BizLog.objects.addnew(request.user, BizLog.UPDATE, u"修改密码[%s],id=%d" % (user.username, user.id))
  59. except CustomError as e:
  60. return response_error(str(e))
  61. except Exception as e:
  62. traceback.print_exc()
  63. return response_error(u'保存失败!')
  64. return response_ok()
  65. class EmployeeViewSet(CustomModelViewSet):
  66. permission_classes = [isLogin, ]
  67. queryset = User.objects.filter(type__lte=User.AGENT)
  68. serializer_class = EmployeeSerializer
  69. @permission_required('account.browse_user')
  70. def filter_queryset(self, queryset):
  71. queryset = queryset.filter()
  72. user = self.request.user
  73. queryset = queryset.filter(
  74. Q(id=user.id) |
  75. Q(create_user=user)
  76. )
  77. f = UserFilter(self.request.GET, queryset=queryset)
  78. return f.qs
  79. @permission_required('account.add_user')
  80. def perform_create(self, serializer):
  81. super(EmployeeViewSet, self).perform_create(serializer)
  82. instance = serializer.instance
  83. validated_data = serializer.validated_data
  84. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  85. u'添加用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  86. @permission_required('account.add_user')
  87. def perform_update(self, serializer):
  88. super(EmployeeViewSet, self).perform_update(serializer)
  89. instance = serializer.instance
  90. validated_data = serializer.validated_data
  91. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  92. u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  93. class GroupsViewSet(CustomModelViewSet):
  94. permission_classes = [isLogin, ]
  95. queryset = Group.objects.filter()
  96. serializer_class = GroupSerializer
  97. @permission_required('account.manager_permissions')
  98. def filter_queryset(self, queryset):
  99. if not self.request.user.is_superuser:
  100. groups = self.request.user.groups.all()
  101. queryset = queryset.filter(id__in=[g.id for g in groups])
  102. f = GroupFilter(self.request.GET, queryset=queryset)
  103. return f.qs
  104. @permission_required('account.manager_permissions')
  105. def perform_create(self, serializer):
  106. super(GroupsViewSet, self).perform_create(serializer)
  107. instance = serializer.instance
  108. validated_data = serializer.validated_data
  109. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  110. u'添加权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
  111. @permission_required('account.manager_permissions')
  112. def perform_update(self, serializer):
  113. super(GroupsViewSet, self).perform_update(serializer)
  114. instance = serializer.instance
  115. validated_data = serializer.validated_data
  116. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  117. u'修改权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
  118. @permission_required('account.manager_permissions')
  119. def destroy(self, request, *args, **kwargs):
  120. with transaction.atomic():
  121. instance = self.get_object()
  122. # user_count = instance.user_set.all().count()
  123. # if user_count:
  124. # raise CustomError(u'该权限组已分配给用户,禁止删除!')
  125. BizLog.objects.addnew(self.request.user, BizLog.DELETE,
  126. u'删除权限组[%s],id=%d' % (instance.name, instance.id))
  127. instance.delete()
  128. return response_ok()
  129. class SetUserInfoView(APIView):
  130. permission_classes = [isLogin, ]
  131. def post(self, request, *args, **kwargs):
  132. appid = request.POST.get('appid')
  133. openid = request.POST.get('openid')
  134. encryptedData = request.POST.get('encryptedData')
  135. iv = request.POST.get('iv')
  136. customer_wechat = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
  137. if not customer_wechat:
  138. raise CustomError(u'未找到相应的微信客户!')
  139. employee = self.request.user
  140. if customer_wechat.customer and customer_wechat.customer != employee:
  141. # 用户用手机号、密码登录后,同步微信信息时,customer可能会不一样
  142. #张三、李四都是注册、同步用户。 张三的账号,在李四小程序上登录,同步的李四微信信息,可能会两个用户不同。
  143. raise CustomError(u'该微信已同步其他客户!')
  144. if not customer_wechat.customer:
  145. customer_wechat.customer = employee
  146. customer_wechat.save()
  147. pc = WXBizDataCrypt(appid, customer_wechat.session_key)
  148. result = pc.decrypt(encryptedData, iv)
  149. with transaction.atomic():
  150. if employee.name == employee.tel:
  151. employee.name = result['nickName']
  152. employee.gender = result['gender']
  153. employee.face = result['avatarUrl']
  154. employee.save()
  155. return response_ok({'face':employee.face,'name':employee.name})
  156. class WxLoginView(APIView):
  157. serializer_class = WechatLoginSerializer
  158. def post(self, request, *args, **kwargs):
  159. ser = self.serializer_class(data=request.data)
  160. if ser.is_valid():
  161. return response_ok(ser.validated_data)
  162. else:
  163. return response_error('参数错误')
  164. class WxBindView(APIView):
  165. serializer_class = WechatBindSerializer
  166. def post(self, request, *args, **kwargs):
  167. ser = self.serializer_class(data=request.data)
  168. if ser.is_valid():
  169. return response_ok(ser.validated_data)
  170. else:
  171. return response_error('参数错误')
  172. class PermissionsListView(APIView):
  173. permission_classes = [isLogin, ]
  174. @permission_required('account.manager_permissions')
  175. def get(self, request):
  176. rows = Permission.objects.all().exclude(name__startswith='Can')
  177. perms_menus = PermissionMenu()
  178. rows = perms_menus.sort_perms(rows)
  179. menus = OrderedDict()
  180. for row in rows:
  181. item = {'id': row.id, 'name': row.name}
  182. mn = perms_menus.get_menuname_of_contenttype(row.content_type.app_label, row.content_type.model)
  183. if mn in menus:
  184. permissions = menus[mn]
  185. else:
  186. permissions = menus[mn] = OrderedDict()
  187. if row.content_type.name in permissions:
  188. if not item in permissions[row.content_type.name]:
  189. permissions[row.content_type.name].append(item)
  190. else:
  191. permissions[row.content_type.name] = [item, ]
  192. return response_ok(menus)
  193. class PermissionDictView(APIView):
  194. permission_classes = [isLogin, ]
  195. @permission_required('account.add_user')
  196. def get(self, request):
  197. rows = Group.objects.filter()
  198. if not request.user.is_superuser:
  199. groups = request.user.groups.all()
  200. rows = rows.filter(id__in=[g.id for g in groups])
  201. serializer = GroupDictSerializer(rows, many=True)
  202. return response_ok(serializer.data)