views.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  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. from django.utils import timezone
  16. User = get_user_model()
  17. from apps.account.serializers import JWTSerializer, EmployeeSerializer, GroupDictSerializer, GroupSerializer
  18. from utils.custom_modelviewset import CustomModelViewSet
  19. from apps.account.filters import UserFilter, GroupFilter
  20. from apps.account.models import ManageStoreUser,OfficeStoreUser
  21. from apps.log.models import BizLog
  22. from apps.account.consts import PermissionMenu
  23. from collections import OrderedDict
  24. from apps.agent.models import Store, Agent,GeneralAgent
  25. from utils.exceptions import CustomError
  26. from apps.customer.models import ReportCustomer, NewCustomerRemind, NewCustomer
  27. class LoginView(ObtainJSONWebToken):
  28. serializer_class = JWTSerializer
  29. def post(self, request, *args, **kwargs):
  30. try:
  31. ser = self.serializer_class(data=request.data)
  32. ser.request = request
  33. # 判断门店是否在用、在有效期内
  34. if ser.is_valid(raise_exception=True):
  35. user = User.objects.filter(id=ser.validated_data['user_id']).first()
  36. store = Store.objects.filter(id=user.store_id).first()
  37. if store and (store.enable == False or (store.end_date.strftime('%Y-%m-%d')) < (timezone.now().strftime('%Y-%m-%d')) ):
  38. raise CustomError(u'当前店面不可用,请联系管理员!')
  39. return response_ok(ser.validated_data)
  40. except ValidationError as e:
  41. return response_error(e.detail['error'][0])
  42. except CustomError as e:
  43. return response_error(str(e))
  44. class RefreshTokenView(RefreshJSONWebToken):
  45. def post(self, request, *args, **kwargs):
  46. try:
  47. ser = self.serializer_class(data=request.data)
  48. if ser.is_valid(raise_exception=True):
  49. user = ser.validated_data['user']
  50. store = Store.objects.filter(id=user.store_id).first()
  51. if store and (store.enable == False or (store.end_date.strftime('%Y-%m-%d')) < (
  52. timezone.now().strftime('%Y-%m-%d')) ):
  53. raise CustomError(u'当前店面不可用,请联系管理员!')
  54. return response_ok({'token': ser.validated_data['token']})
  55. except ValidationError as e:
  56. return response_ok({'error':True})
  57. except CustomError as e:
  58. return response_error(str(e))
  59. class ChangePassword(APIView):
  60. def post(self, request, *args, **kwargs):
  61. id = request.GET.get('id')
  62. data = json.loads(request.body)
  63. try:
  64. with transaction.atomic():
  65. user = User.objects.filter(id=id).first()
  66. if not user:
  67. raise CustomError(u'用户信息错误,请刷新重试!')
  68. user.change_password(data['new_password'], data['confirm_password'], data['old_password'])
  69. BizLog.objects.addnew(request.user, BizLog.UPDATE, u"修改密码[%s],id=%d" % (user.username, user.id))
  70. except CustomError as e:
  71. return response_error(str(e))
  72. except Exception as e:
  73. traceback.print_exc()
  74. return response_error(u'保存失败!')
  75. return response_ok()
  76. class EmployeeViewSet(CustomModelViewSet):
  77. permission_classes = [isLogin, ]
  78. queryset = User.objects.filter()
  79. serializer_class = EmployeeSerializer
  80. @permission_required('account.browse_user')
  81. def filter_queryset(self, queryset):
  82. queryset = queryset.filter()
  83. user = self.request.user
  84. queryset = queryset.filter(
  85. Q(store_id__in=self.request.user.get_manager_range()) |
  86. Q(id=user.id) |
  87. Q(create_user=user) |
  88. Q(agent__create_user=user) |
  89. Q(general_agent__create_user=user)
  90. )
  91. f = UserFilter(self.request.GET, queryset=queryset)
  92. return f.qs
  93. @permission_required('account.add_user')
  94. def perform_create(self, serializer):
  95. super(EmployeeViewSet, self).perform_create(serializer)
  96. instance = serializer.instance
  97. validated_data = serializer.validated_data
  98. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  99. u'添加用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  100. @permission_required('account.add_user')
  101. def perform_update(self, serializer):
  102. super(EmployeeViewSet, self).perform_update(serializer)
  103. instance = serializer.instance
  104. validated_data = serializer.validated_data
  105. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  106. u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
  107. @permission_required('account.delete_user')
  108. def perform_destroy(self, instance):
  109. ManageStoreUser.objects.filter(manage_user=instance).delete()
  110. BizLog.objects.filter(user=instance).delete()
  111. BizLog.objects.addnew(self.request.user, BizLog.DELETE,
  112. u'删除账号[%s],id=%d' % (instance.username, instance.id))
  113. super(EmployeeViewSet, self).perform_destroy(instance)
  114. @action(methods=['post'], detail=True)
  115. def join(self, request, pk):
  116. check_permission(request, 'account.check_user')
  117. try:
  118. with transaction.atomic():
  119. instance = self.get_object()
  120. instance.check_user = request.user
  121. instance.status = User.INSERVICE
  122. instance.save()
  123. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  124. u'员工[%s]入职,id=%d' % (instance.name, instance.id))
  125. return response_ok()
  126. except Exception as e:
  127. traceback.print_exc()
  128. return response_error(u'入职失败')
  129. @action(methods=['post'], detail=True)
  130. def branch(self, request, pk):
  131. # 管理门店
  132. check_permission(request, 'account.manager_store')
  133. data = json.loads(request.POST.get('stores'))
  134. try:
  135. with transaction.atomic():
  136. instance = self.get_object()
  137. ManageStoreUser.objects.filter(manage_user_id=pk).delete()
  138. for row in data:
  139. ManageStoreUser.objects.create(store_id=row, manage_user_id=pk)
  140. # 给员工设置管理门店,把已取消管理门店下面的客户提醒删除
  141. user = User.objects.filter(id=pk).first()
  142. data.extend(user.get_office_stores())
  143. # 删除不管理的门店提醒
  144. NewCustomerRemind.objects.filter(remind_user=user).exclude(store__in=data).delete()
  145. # 根据选择的人员所管理店面,创建内部跟踪提醒
  146. # 把next_time用当前日期加上5天
  147. if user.has_perm('customer.inner_review'):
  148. next_time = (timezone.now() + datetime.timedelta(days=5)).strftime('%Y-%m-%d')
  149. for store in data:
  150. customers = NewCustomer.objects.filter(store_id=store, status=NewCustomer.NORMAL).values('id')
  151. for customer in customers:
  152. remind = NewCustomerRemind.objects.filter(customer_id=customer['id'],remind_user_id=pk,store_id=store).first()
  153. if not remind:
  154. NewCustomerRemind.objects.create(customer_id=customer['id'], next_time=next_time, remind_user_id=pk,
  155. is_employee=False, store_id=store)
  156. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  157. u'设置账号[%s]管理门店,id=%d' % (instance.username, instance.id), data)
  158. return response_ok()
  159. except Exception as e:
  160. traceback.print_exc()
  161. return response_error(u'保存失败')
  162. @action(methods=['post'], detail=True)
  163. def office(self, request, pk):
  164. # 任职门店
  165. check_permission(request, 'account.manager_store')
  166. data = json.loads(request.POST.get('stores'))
  167. try:
  168. with transaction.atomic():
  169. instance = self.get_object()
  170. OfficeStoreUser.objects.filter(office_user_id=pk).delete()
  171. for row in data:
  172. OfficeStoreUser.objects.create(store_id=row, office_user_id=pk)
  173. # 删除不任职门店提醒
  174. data.extend(instance.get_office_stores())
  175. NewCustomerRemind.objects.filter(remind_user=instance).exclude(store__in=data).delete()
  176. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  177. u'设置账号[%s]任职门店,id=%d' % (instance.username, instance.id), data)
  178. return response_ok()
  179. except Exception as e:
  180. traceback.print_exc()
  181. return response_error(u'保存失败')
  182. class GroupsViewSet(CustomModelViewSet):
  183. permission_classes = [isLogin, ]
  184. queryset = Group.objects.filter()
  185. serializer_class = GroupSerializer
  186. @permission_required('account.manager_permissions')
  187. def filter_queryset(self, queryset):
  188. if not self.request.user.is_superuser:
  189. groups = self.request.user.groups.all()
  190. queryset = queryset.filter(id__in=[g.id for g in groups])
  191. f = GroupFilter(self.request.GET, queryset=queryset)
  192. return f.qs
  193. @permission_required('account.manager_permissions')
  194. def perform_create(self, serializer):
  195. super(GroupsViewSet, self).perform_create(serializer)
  196. instance = serializer.instance
  197. validated_data = serializer.validated_data
  198. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  199. u'添加权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
  200. @permission_required('account.manager_permissions')
  201. def perform_update(self, serializer):
  202. super(GroupsViewSet, self).perform_update(serializer)
  203. instance = serializer.instance
  204. validated_data = serializer.validated_data
  205. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  206. u'修改权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
  207. @permission_required('account.manager_permissions')
  208. def destroy(self, request, *args, **kwargs):
  209. with transaction.atomic():
  210. instance = self.get_object()
  211. # user_count = instance.user_set.all().count()
  212. # if user_count:
  213. # raise CustomError(u'该权限组已分配给用户,禁止删除!')
  214. BizLog.objects.addnew(self.request.user, BizLog.DELETE,
  215. u'删除权限组[%s],id=%d' % (instance.name, instance.id))
  216. instance.delete()
  217. return response_ok()
  218. class PermissionsListView(APIView):
  219. permission_classes = [isLogin, ]
  220. @permission_required('account.manager_permissions')
  221. def get(self, request):
  222. rows = Permission.objects.all().exclude(name__startswith='Can')
  223. perms_menus = PermissionMenu()
  224. rows = perms_menus.sort_perms(rows)
  225. menus = OrderedDict()
  226. for row in rows:
  227. item = {'id': row.id, 'name': row.name}
  228. mn = perms_menus.get_menuname_of_contenttype(row.content_type.app_label, row.content_type.model)
  229. if mn in menus:
  230. permissions = menus[mn]
  231. else:
  232. permissions = menus[mn] = OrderedDict()
  233. if row.content_type.name in permissions:
  234. if not item in permissions[row.content_type.name]:
  235. permissions[row.content_type.name].append(item)
  236. else:
  237. permissions[row.content_type.name] = [item, ]
  238. return response_ok(menus)
  239. class PermissionDictView(APIView):
  240. permission_classes = [isLogin, ]
  241. @permission_required('account.add_user')
  242. def get(self, request):
  243. rows = Group.objects.filter()
  244. if not request.user.is_superuser:
  245. groups = request.user.groups.all()
  246. rows = rows.filter(id__in=[g.id for g in groups])
  247. serializer = GroupDictSerializer(rows, many=True)
  248. return response_ok(serializer.data)
  249. class StoreTreeView(APIView):
  250. permission_classes = [isLogin, ]
  251. @permission_required('account.manager_store')
  252. def get(self, request):
  253. id = request.GET.get('id')
  254. store_data = []
  255. # 查询当前用户的代理商和管理的门店
  256. general_agents = GeneralAgent.objects.filter()
  257. if not request.user.is_superuser:
  258. general_agents = GeneralAgent.objects.filter(id=request.user.general_agent_id)
  259. general_agents = general_agents.values('id', 'name')
  260. for general_agent in general_agents:
  261. general_agent_item = {
  262. 'title': general_agent['name'],
  263. 'id': general_agent['id'],
  264. 'field': 'general_agent',
  265. 'children': [],
  266. }
  267. agents = Agent.objects.filter(general_agent_id=general_agent['id'])
  268. if request.user.agent:
  269. agents = agents.filter(id=request.user.agent_id)
  270. agents = agents.values('id', 'name')
  271. for agent in agents:
  272. agent_item= {
  273. 'title': agent['name'],
  274. 'id': agent['id'],
  275. 'field': 'agent',
  276. 'children': [],
  277. }
  278. general_agent_item['children'].append(agent_item)
  279. stores = Store.objects.filter(agent_id=agent['id'], id__in=request.user.get_manager_range(),
  280. check_user__isnull=False, enable=True).values('id', 'name')
  281. for store in stores:
  282. manage_store = ManageStoreUser.objects.filter(manage_user_id=id, store_id=store['id']).first()
  283. checked = manage_store and True or False
  284. store_item = {
  285. 'title': store['name'],
  286. 'id': store['id'],
  287. 'checked': checked,
  288. 'field': 'store_{}'.format(store['id']),
  289. }
  290. agent_item['children'].append(store_item)
  291. store_data.append(general_agent_item)
  292. return response_ok(store_data)
  293. class EmployeeTreeView(APIView):
  294. permission_classes = [isLogin, ]
  295. def get(self, request):
  296. # 查询当前用户管理门店树形结构
  297. agent_dict = {}
  298. general_agent_dict = {}
  299. data = []
  300. exist_agents = []
  301. manage_storess = request.user.get_manager_range()
  302. for store_id in manage_storess:
  303. store = Store.objects.filter(id=store_id, check_user__isnull=False, enable=True).values('name','agent_id')
  304. if not store:
  305. continue
  306. store_item = {
  307. 'title': store[0]['name'],
  308. 'id': store_id,
  309. 'field': 'store',
  310. 'children': [],
  311. }
  312. office_user_id = OfficeStoreUser.objects.filter(store_id=store_id).values('office_user_id')
  313. employees = User.objects.filter(Q(store_id=store_id) | Q(id__in=office_user_id), is_active=True).values('id', 'name')
  314. for employee in employees:
  315. user_item = {
  316. 'title': employee['name'],
  317. 'id': '{0}_{1}'.format(store_id, employee['id']),# 门店_人员
  318. 'field': 'user',
  319. }
  320. store_item['children'].append(user_item)
  321. try:
  322. agent_dict[store[0]['agent_id']].append(store_item)
  323. except:
  324. agent_dict[store[0]['agent_id']] = [store_item]
  325. exist_agents.append(store[0]['agent_id'])
  326. ######## 代理
  327. exist_agents = list(set(exist_agents))
  328. exist_general_agents = []
  329. agents = Agent.objects.filter(id__in=exist_agents).values('id', 'name', 'general_agent_id')
  330. for agent in agents:
  331. agent_item = {
  332. 'title': agent['name'],
  333. 'id': agent['id'],
  334. 'field': 'agent',
  335. 'children': agent_dict[agent['id']] ,
  336. }
  337. if not request.user.agent:
  338. # 当前用户有代理商。此时加载和总代理平行的账号
  339. agent_users = User.objects.filter(agent__isnull=False, is_active=True, store__isnull=True)
  340. elif not request.user.store:
  341. # 当前用户有门店。此时加载和代理商平行的账号
  342. agent_users = User.objects.filter(agent_id=agent['id'], is_active=True, store__isnull=True)
  343. else:
  344. # 有门店和代理商,这是店内人员。不需要在加载任何账号
  345. agent_users = []
  346. for agent_user in agent_users:
  347. if agent_user.has_perm('customer.inner_review'):
  348. agent_user_item = {
  349. 'title': agent_user.name,
  350. 'id': agent_user.id,
  351. 'field': 'user',
  352. }
  353. agent_item['children'].insert(0,agent_user_item)
  354. try:
  355. general_agent_dict[agent['general_agent_id']].append(agent_item)
  356. except:
  357. general_agent_dict[agent['general_agent_id']] = [agent_item]
  358. exist_general_agents.append(agent['general_agent_id'])
  359. ###### 总代理
  360. exist_general_agents = list(set(exist_general_agents))
  361. general_agents = GeneralAgent.objects.filter(id__in=exist_general_agents).values('id', 'name')
  362. for general_agent in general_agents:
  363. general_agent_item = {
  364. 'title': general_agent['name'],
  365. 'id': general_agent['id'],
  366. 'field': 'general_agent',
  367. 'children': general_agent_dict[general_agent['id']],
  368. }
  369. # 当前用户没有代理商,则是总代理账号。此时加载和总代理平行的账号
  370. if not request.user.agent:
  371. general_agent_users = User.objects.filter(general_agent_id=general_agent['id'], agent__isnull=True, store__isnull=True, is_active=True)
  372. for general_agent_user in general_agent_users:
  373. if general_agent_user.has_perm('customer.inner_review'):
  374. general_agent_user_item = {
  375. 'title': general_agent_user.name,
  376. 'id': general_agent_user.id,
  377. 'field': 'user',
  378. }
  379. general_agent_item['children'].insert(0, general_agent_user_item)
  380. data.append(general_agent_item)
  381. # 总代理只有一级,去掉总代理
  382. # if len(data) == 1:
  383. # data = data[0]['children']
  384. # 代理只有一级,去掉代理
  385. # if len(data) == 1:
  386. # data = data[0]['children']
  387. return response_ok(data)
  388. class HomeStatisticsView(APIView):
  389. # 首页统计
  390. permission_classes = [isLogin, ]
  391. def get(self, request):
  392. statistics = {
  393. 'today_report': 0, # 本日新增报备
  394. 'mouth_report': 0, # 本月新增报备
  395. 'general_report': 0, # 总报备
  396. }
  397. if request.user or request.user.is_authenticated:
  398. today = timezone.now().date()
  399. reports = ReportCustomer.objects.filter(store__in=request.user.get_manager_range(),
  400. report_status=ReportCustomer.CHECKED)
  401. statistics['today_report'] = reports.filter(check_time__gte=str(today) + ' 00:00:00').count()
  402. statistics['mouth_report'] = reports.filter(check_time__year=today.year, check_time__month=today.month).count()
  403. statistics['general_report'] = reports.count()
  404. return response_ok(statistics)
  405. else:
  406. return response_ok(statistics)
  407. class OfficeStoreView(APIView):
  408. permission_classes = [isLogin, ]
  409. @permission_required('account.manager_store')
  410. def get(self, request):
  411. id = request.GET.get('id')
  412. store_data = []
  413. # 查询当前用户的代理商和管理的门店
  414. general_agents = GeneralAgent.objects.filter()
  415. if not request.user.is_superuser:
  416. general_agents = GeneralAgent.objects.filter(id=request.user.general_agent_id)
  417. general_agents = general_agents.values('id', 'name')
  418. for general_agent in general_agents:
  419. general_agent_item = {
  420. 'title': general_agent['name'],
  421. 'id': general_agent['id'],
  422. 'field': 'general_agent',
  423. 'children': [],
  424. }
  425. agents = Agent.objects.filter(general_agent_id=general_agent['id'])
  426. if request.user.agent:
  427. agents = agents.filter(id=request.user.agent_id)
  428. agents = agents.values('id', 'name')
  429. for agent in agents:
  430. agent_item = {
  431. 'title': agent['name'],
  432. 'id': agent['id'],
  433. 'field': 'agent',
  434. 'children': [],
  435. }
  436. general_agent_item['children'].append(agent_item)
  437. stores = Store.objects.filter(agent_id=agent['id'], id__in=request.user.get_manager_range(),
  438. check_user__isnull=False, enable=True).values('id', 'name')
  439. for store in stores:
  440. office_store = OfficeStoreUser.objects.filter(office_user_id=id, store_id=store['id']).first()
  441. checked = office_store and True or False
  442. store_item = {
  443. 'title': store['name'],
  444. 'id': store['id'],
  445. 'checked': checked,
  446. 'field': 'store_{}'.format(store['id']),
  447. }
  448. agent_item['children'].append(store_item)
  449. store_data.append(general_agent_item)
  450. return response_ok(store_data)