views.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #coding=utf-8
  2. import traceback
  3. from django.db.models import Q
  4. from rest_framework.decorators import action
  5. from django.db import transaction
  6. from rest_framework.views import APIView
  7. from rest_framework.serializers import ValidationError
  8. from utils.permission import permission_required, isLogin
  9. from django.contrib.auth.models import Group, Permission
  10. from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
  11. from utils import response_error, response_ok
  12. from django.contrib.auth import get_user_model
  13. User = get_user_model()
  14. from apps.account.serializers import JWTSerializer, EmployeeSerializer, GroupDictSerializer, GroupSerializer
  15. from utils.custom_modelviewset import CustomModelViewSet
  16. from apps.account.filters import UserFilter, GroupFilter
  17. from apps.account.models import ManageStoreUser
  18. from apps.log.models import BizLog
  19. from apps.account.consts import PermissionMenu
  20. from collections import OrderedDict
  21. class LoginView(ObtainJSONWebToken):
  22. serializer_class = JWTSerializer
  23. def post(self, request, *args, **kwargs):
  24. try:
  25. ser = self.serializer_class(data=request.data)
  26. ser.request = request
  27. if ser.is_valid(raise_exception=True):
  28. return response_ok(ser.validated_data)
  29. except ValidationError as e:
  30. return response_error(e.detail['error'][0])
  31. class RefreshTokenView(RefreshJSONWebToken):
  32. def post(self, request, *args, **kwargs):
  33. try:
  34. ser = self.serializer_class(data=request.data)
  35. if ser.is_valid(raise_exception=True):
  36. return response_ok({'token': ser.validated_data['token']})
  37. except ValidationError as e:
  38. return response_error(u'登录状态失效,请重新登录')
  39. class EmployeeViewSet(CustomModelViewSet):
  40. permission_classes = [isLogin, ]
  41. queryset = User.objects.filter()
  42. serializer_class = EmployeeSerializer
  43. @permission_required('account.browse_user')
  44. def filter_queryset(self, queryset):
  45. queryset = queryset.filter()
  46. user = self.request.user
  47. queryset = queryset.filter(
  48. Q(store_id__in=self.request.user.get_manager_range()) |
  49. Q(id=user.id) |
  50. Q(create_user=user))
  51. f = UserFilter(self.request.GET, queryset=queryset)
  52. return f.qs
  53. @permission_required('account.add_user')
  54. def perform_create(self, serializer):
  55. super(EmployeeViewSet, self).perform_create(serializer)
  56. instance = serializer.instance
  57. validated_data = serializer.validated_data
  58. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  59. u'添加用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  60. @permission_required('account.add_user')
  61. def perform_update(self, serializer):
  62. super(EmployeeViewSet, self).perform_update(serializer)
  63. instance = serializer.instance
  64. validated_data = serializer.validated_data
  65. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  66. u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  67. @permission_required('account.delete_user')
  68. def perform_destroy(self, instance):
  69. ManageStoreUser.objects.filter(manage_user=instance).delete()
  70. BizLog.objects.filter(user=instance).delete()
  71. BizLog.objects.addnew(self.request.user, BizLog.DELETE,
  72. u'删除账号[%s],id=%d' % (instance.username, instance.id))
  73. super(EmployeeViewSet, self).perform_destroy(instance)
  74. @action(methods=['post'], detail=True)
  75. def branch(self, request, pk):
  76. data = request.POST.get('managers')
  77. try:
  78. with transaction.atomic():
  79. ManageStoreUser.objects.filter(manage_user_id=pk).delete()
  80. rows = data.split(',')
  81. for row in rows:
  82. branch = row.split('_')[1]
  83. ManageStoreUser.objects.create(store_id=branch,manage_user_id=pk)
  84. return response_ok()
  85. except Exception as e:
  86. traceback.print_exc()
  87. return response_error(u'保存失败')
  88. class GroupsViewSet(CustomModelViewSet):
  89. permission_classes = [isLogin, ]
  90. queryset = Group.objects.filter()
  91. serializer_class = GroupSerializer
  92. @permission_required('account.manager_permissions')
  93. def filter_queryset(self, queryset):
  94. if not self.request.user.is_superuser:
  95. groups = self.request.user.groups.all()
  96. queryset =queryset.filter(id__in=[g.id for g in groups])
  97. f = GroupFilter(self.request.GET, queryset=queryset)
  98. return f.qs
  99. @permission_required('account.manager_permissions')
  100. def perform_create(self, serializer):
  101. super(GroupsViewSet, self).perform_create(serializer)
  102. instance = serializer.instance
  103. validated_data = serializer.validated_data
  104. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  105. u'添加权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
  106. @permission_required('account.manager_permissions')
  107. def perform_update(self, serializer):
  108. super(GroupsViewSet, self).perform_update(serializer)
  109. instance = serializer.instance
  110. validated_data = serializer.validated_data
  111. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  112. u'修改权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
  113. @permission_required('account.manager_permissions')
  114. def destroy(self, request, *args, **kwargs):
  115. with transaction.atomic():
  116. instance = self.get_object()
  117. # user_count = instance.user_set.all().count()
  118. # if user_count:
  119. # raise CustomError(u'该权限组已分配给用户,禁止删除!')
  120. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  121. u'删除权限组[%s],id=%d' % (instance.name, instance.id))
  122. instance.delete()
  123. return response_ok()
  124. class PermissionsListView(APIView):
  125. permission_classes = [isLogin, ]
  126. def get(self, request):
  127. rows = Permission.objects.all().exclude(name__startswith='Can')
  128. perms_menus = PermissionMenu()
  129. rows = perms_menus.sort_perms(rows)
  130. menus = OrderedDict()
  131. for row in rows:
  132. item = {'id': row.id, 'name': row.name}
  133. mn = perms_menus.get_menuname_of_contenttype(row.content_type.app_label, row.content_type.model)
  134. if mn in menus:
  135. permissions = menus[mn]
  136. else:
  137. permissions = menus[mn] = OrderedDict()
  138. if row.content_type.name in permissions:
  139. if not item in permissions[row.content_type.name]:
  140. permissions[row.content_type.name].append(item)
  141. else:
  142. permissions[row.content_type.name] = [item, ]
  143. return response_ok(menus)
  144. class PermissionDictView(APIView):
  145. permission_classes = [isLogin, ]
  146. def get(self, request):
  147. rows = Group.objects.filter()
  148. print()
  149. if not request.user.is_superuser:
  150. groups = request.user.groups.all()
  151. rows =rows.filter(id__in=[g.id for g in groups])
  152. serializer = GroupDictSerializer(rows, many=True)
  153. return response_ok(serializer.data)