views.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. # coding=utf-8
  2. import traceback
  3. import json
  4. from django.db.models import Q
  5. from rest_framework.decorators import action
  6. from django.db import transaction
  7. from rest_framework.views import APIView
  8. from rest_framework.serializers import ValidationError
  9. from utils.permission import permission_required, isLogin, check_permission
  10. from django.contrib.auth.models import Group, Permission
  11. from rest_framework_jwt.views import ObtainJSONWebToken, VerifyJSONWebToken, 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, GroupDictSerializer, GroupSerializer
  16. from utils.custom_modelviewset import CustomModelViewSet
  17. from apps.account.filters import UserFilter, GroupFilter
  18. from apps.account.models import ManageStoreUser
  19. from apps.log.models import BizLog
  20. from apps.account.consts import PermissionMenu
  21. from collections import OrderedDict
  22. from apps.agent.models import Store, Agent,GeneralAgent
  23. from utils.exceptions import CustomError
  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. # TODO 判断门店是否在用、在有效期内
  31. if ser.is_valid(raise_exception=True):
  32. return response_ok(ser.validated_data)
  33. except ValidationError as e:
  34. return response_error(e.detail['error'][0])
  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']})
  41. except ValidationError as e:
  42. return response_error(u'登录状态失效,请重新登录')
  43. class EmployeeViewSet(CustomModelViewSet):
  44. permission_classes = [isLogin, ]
  45. queryset = User.objects.filter()
  46. serializer_class = EmployeeSerializer
  47. @permission_required('account.browse_user')
  48. def filter_queryset(self, queryset):
  49. queryset = queryset.filter()
  50. user = self.request.user
  51. queryset = queryset.filter(
  52. Q(store_id__in=self.request.user.get_manager_range()) |
  53. Q(id=user.id) |
  54. Q(create_user=user) |
  55. Q(agent__create_user=user) |
  56. Q(general_agent__create_user=user)
  57. )
  58. f = UserFilter(self.request.GET, queryset=queryset)
  59. return f.qs
  60. @permission_required('account.add_user')
  61. def perform_create(self, serializer):
  62. super(EmployeeViewSet, self).perform_create(serializer)
  63. instance = serializer.instance
  64. validated_data = serializer.validated_data
  65. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  66. u'添加用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  67. @permission_required('account.add_user')
  68. def perform_update(self, serializer):
  69. super(EmployeeViewSet, self).perform_update(serializer)
  70. instance = serializer.instance
  71. validated_data = serializer.validated_data
  72. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  73. u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  74. @permission_required('account.delete_user')
  75. def perform_destroy(self, instance):
  76. ManageStoreUser.objects.filter(manage_user=instance).delete()
  77. BizLog.objects.filter(user=instance).delete()
  78. BizLog.objects.addnew(self.request.user, BizLog.DELETE,
  79. u'删除账号[%s],id=%d' % (instance.username, instance.id))
  80. super(EmployeeViewSet, self).perform_destroy(instance)
  81. @action(methods=['post'], detail=True)
  82. def join(self, request, pk):
  83. check_permission(request, 'account.check_user')
  84. try:
  85. with transaction.atomic():
  86. instance = self.get_object()
  87. instance.check_user = request.user
  88. instance.status = User.INSERVICE
  89. instance.save()
  90. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  91. u'员工[%s]入职,id=%d' % (instance.name, instance.id))
  92. return response_ok()
  93. except Exception as e:
  94. traceback.print_exc()
  95. return response_error(u'入职失败')
  96. @action(methods=['post'], detail=True)
  97. def branch(self, request, pk):
  98. check_permission(request, 'account.manager_store')
  99. data = json.loads(request.POST.get('sotres'))
  100. try:
  101. with transaction.atomic():
  102. instance = self.get_object()
  103. ManageStoreUser.objects.filter(manage_user_id=pk).delete()
  104. for row in data:
  105. ManageStoreUser.objects.create(store_id=row, manage_user_id=pk)
  106. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  107. u'设置账号[%s]管理门店,id=%d' % (instance.username, instance.id), data)
  108. return response_ok()
  109. except Exception as e:
  110. traceback.print_exc()
  111. return response_error(u'保存失败')
  112. class GroupsViewSet(CustomModelViewSet):
  113. permission_classes = [isLogin, ]
  114. queryset = Group.objects.filter()
  115. serializer_class = GroupSerializer
  116. @permission_required('account.manager_permissions')
  117. def filter_queryset(self, queryset):
  118. if not self.request.user.is_superuser:
  119. groups = self.request.user.groups.all()
  120. queryset = queryset.filter(id__in=[g.id for g in groups])
  121. f = GroupFilter(self.request.GET, queryset=queryset)
  122. return f.qs
  123. @permission_required('account.manager_permissions')
  124. def perform_create(self, serializer):
  125. super(GroupsViewSet, self).perform_create(serializer)
  126. instance = serializer.instance
  127. validated_data = serializer.validated_data
  128. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  129. u'添加权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
  130. @permission_required('account.manager_permissions')
  131. def perform_update(self, serializer):
  132. super(GroupsViewSet, self).perform_update(serializer)
  133. instance = serializer.instance
  134. validated_data = serializer.validated_data
  135. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  136. u'修改权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
  137. @permission_required('account.manager_permissions')
  138. def destroy(self, request, *args, **kwargs):
  139. with transaction.atomic():
  140. instance = self.get_object()
  141. # user_count = instance.user_set.all().count()
  142. # if user_count:
  143. # raise CustomError(u'该权限组已分配给用户,禁止删除!')
  144. BizLog.objects.addnew(self.request.user, BizLog.DELETE,
  145. u'删除权限组[%s],id=%d' % (instance.name, instance.id))
  146. instance.delete()
  147. return response_ok()
  148. class PermissionsListView(APIView):
  149. permission_classes = [isLogin, ]
  150. @permission_required('account.manager_permissions')
  151. def get(self, request):
  152. rows = Permission.objects.all().exclude(name__startswith='Can')
  153. perms_menus = PermissionMenu()
  154. rows = perms_menus.sort_perms(rows)
  155. menus = OrderedDict()
  156. for row in rows:
  157. item = {'id': row.id, 'name': row.name}
  158. mn = perms_menus.get_menuname_of_contenttype(row.content_type.app_label, row.content_type.model)
  159. if mn in menus:
  160. permissions = menus[mn]
  161. else:
  162. permissions = menus[mn] = OrderedDict()
  163. if row.content_type.name in permissions:
  164. if not item in permissions[row.content_type.name]:
  165. permissions[row.content_type.name].append(item)
  166. else:
  167. permissions[row.content_type.name] = [item, ]
  168. return response_ok(menus)
  169. class PermissionDictView(APIView):
  170. permission_classes = [isLogin, ]
  171. @permission_required('account.add_user')
  172. def get(self, request):
  173. rows = Group.objects.filter()
  174. if not request.user.is_superuser:
  175. groups = request.user.groups.all()
  176. rows = rows.filter(id__in=[g.id for g in groups])
  177. serializer = GroupDictSerializer(rows, many=True)
  178. return response_ok(serializer.data)
  179. class StoreTreeView(APIView):
  180. permission_classes = [isLogin, ]
  181. @permission_required('account.manager_store')
  182. def get(self, request):
  183. id = request.GET.get('id')
  184. store_data = []
  185. # 查询当前用户的代理商和管理的门店
  186. agents = Agent.objects.filter()
  187. if not request.user.is_superuser:
  188. agents = agents.filter(id=request.user.agent_id)
  189. agents = agents.values('id', 'name')
  190. for agent in agents:
  191. item = {
  192. 'title': agent['name'],
  193. 'id': agent['id'],
  194. 'field': 'agent',
  195. 'children': [],
  196. }
  197. stores = Store.objects.filter(agent_id=agent['id'], enable=True).values('id', 'name')
  198. for store in stores:
  199. manage_store = ManageStoreUser.objects.filter(manage_user_id=id, store_id=store['id']).first()
  200. checked = manage_store and True or False
  201. store_item = {
  202. 'title': store['name'],
  203. 'id': store['id'],
  204. 'checked': checked,
  205. 'field': 'store_{}'.format(store['id']),
  206. }
  207. item['checked'] = checked
  208. item['children'].append(store_item)
  209. store_data.append(item)
  210. return response_ok(store_data)
  211. class EmployeeTreeView(APIView):
  212. permission_classes = [isLogin, ]
  213. def get(self, request):
  214. id = request.GET.get('id')
  215. employee_data = []
  216. # 查询当前用户的代理商账号和门店人员账号
  217. employees = User.objects.filter()
  218. general_agents = GeneralAgent.objects.filter()
  219. agents = Agent.objects.filter()
  220. stores = Store.objects.filter()
  221. manage_user = ManageStoreUser.objects.filter(manage_user_id=request.user.id)
  222. if not request.user.is_superuser:
  223. general_agents = general_agents.filter(id=request.user.general_agent_id)
  224. if request.user.agent:
  225. general_agents = None
  226. agents = Agent.objects.filter(id=request.user.agent_id,
  227. general_agent_id=request.user.general_agent_id)
  228. if request.user.store:
  229. if not manage_user:
  230. raise CustomError(u'无人员查看权限!')
  231. general_agents = None
  232. agents = Agent.objects.filter(id=request.user.agent_id,
  233. general_agent_id=request.user.general_agent_id)
  234. stores = Store.objects.filter(id=request.user.store_id, enable=True)
  235. if general_agents:
  236. general_agents = general_agents.values('id', 'name')
  237. for general_agent in general_agents:
  238. general_agent_item = {
  239. 'title': general_agent['name'],
  240. 'id': general_agent['id'],
  241. 'field': 'general_agent',
  242. 'children': [],
  243. }
  244. general_agent_user = employees.filter(general_agent_id=general_agent['id'], agent__isnull=True).first()
  245. if general_agent_user:
  246. general_agent_user_item = {
  247. 'title': general_agent_user.name,
  248. 'id': general_agent_user.id,
  249. 'field': 'general_agent_user',
  250. }
  251. general_agent_item['children'].append(general_agent_user_item)
  252. employee_data.append(general_agent_item)
  253. agents = agents.values('id', 'name')
  254. for agent in agents:
  255. agent_item = {
  256. 'title': agent['name'],
  257. 'id': agent['id'],
  258. 'field': 'agent',
  259. 'children': [],
  260. }
  261. agent_user = employees.filter(agent_id=agent['id'], store__isnull=True).first()
  262. if agent_user and not request.user.store:
  263. agent_user_item = {
  264. 'title': agent_user.name,
  265. 'id': agent_user.id,
  266. 'field': 'agent_user',
  267. }
  268. agent_item['children'].append(agent_user_item)
  269. stores = stores.values('id', 'name')
  270. for store in stores:
  271. store_item = {
  272. 'title': store['name'],
  273. 'id': store['id'],
  274. 'field': 'store_{}'.format(store['id']),
  275. 'children': [],
  276. }
  277. agent_item['children'].append(store_item)
  278. store_users = employees.filter(store_id=store['id'])
  279. for store_user in store_users:
  280. store_user_item = {
  281. 'title': store_user.name,
  282. 'id': store_user.id,
  283. 'field': 'store_user_{}'.format(store_user.id),
  284. }
  285. store_item['children'].append(store_user_item)
  286. employee_data.append(agent_item)
  287. return response_ok(employee_data)