PermissionManager.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from itertools import chain
  4. from django.views.generic.base import View
  5. import django.dispatch, traceback, simplejson as json
  6. from django.views.decorators.csrf import csrf_exempt
  7. from django.utils.decorators import method_decorator
  8. from Model.models import Permissions, Role, Device_User
  9. from Service.CommonService import CommonService
  10. from Service.ModelService import ModelService
  11. from Object.TokenObject import TokenObject
  12. from Object.ResponseObject import ResponseObject
  13. # 创建信号
  14. roles_done = django.dispatch.Signal(providing_args=[])
  15. perms_done = django.dispatch.Signal(providing_args=[])
  16. rmanger_done = django.dispatch.Signal(providing_args=[])
  17. class Roles(object):
  18. '''
  19. role Manager Class
  20. '''
  21. try:
  22. rid = []
  23. rolename = []
  24. roles = Role.objects.all()
  25. for role in roles:
  26. rolename.append(role.roleName)
  27. rid.append(role.rid)
  28. except Exception as e:
  29. pass
  30. def __init__(self):
  31. '''
  32. 信号监听, 注册信号
  33. Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)
  34. receiver: 信号接受者,回调函数
  35. sender: 信号发送者
  36. '''
  37. roles_done.connect(self.callback)
  38. self.startSignal()
  39. def callback(self, sender, **kwargs):
  40. '''
  41. 开启监听之后,就要去实现回调函数了, 注册信号
  42. :param sender:
  43. :param kwargs:
  44. :return:
  45. '''
  46. Roles.rid = []
  47. Roles.rolename = []
  48. Roles.roles = Role.objects.all()
  49. for role in Roles.roles:
  50. Roles.rolename.append(role.roleName)
  51. Roles.rid.append(role.rid)
  52. def startSignal(self):
  53. '''
  54. 触发信号
  55. 指定信号发送者
  56. :return:
  57. '''
  58. roles_done.send(sender=self.__class__)
  59. def toJSON(self, QuerySets, fields=None, exclude=None):
  60. listSets = []
  61. for QuerySet in QuerySets:
  62. data = {}
  63. opts = QuerySet._meta
  64. for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
  65. if not getattr(f, 'editable', False):
  66. continue
  67. if fields and f.name not in fields:
  68. continue
  69. if exclude and f.name in exclude:
  70. continue
  71. data[f.name] = f.value_from_object(QuerySet)
  72. listSets.append(data)
  73. return listSets
  74. def queryAllRoles(self, rolenames=None, exclude=None, response=ResponseObject()):
  75. roles = []
  76. for role in chain(Roles.roles):
  77. if rolenames and role.roleName not in rolenames:
  78. continue
  79. if exclude and role.roleName in exclude:
  80. continue
  81. roles.append(role)
  82. if len(roles) > 0:
  83. resultDict = CommonService.qs_to_dict(roles)
  84. for k, v in enumerate(resultDict["datas"]):
  85. if len(v['fields']['permission']) > 0:
  86. resultDict["datas"][k]['fields']['permissionJson'] = {}
  87. for pid in v['fields']['permission']:
  88. permission_query_set = Permissions.objects.get(id=pid)
  89. resultDict["datas"][k]['fields']['permissionJson'][pid] = permission_query_set.permName
  90. return response.json(0, resultDict)
  91. else:
  92. return response.json(0, {})
  93. def addRoles(self, content=None, response=ResponseObject()):
  94. try:
  95. roleContent = json.loads(content)
  96. except Exception as e:
  97. return response.json(444, repr(e))
  98. else:
  99. rid = roleContent.get('rid', None)
  100. if rid == None:
  101. return response.json(444,'rid')
  102. try:
  103. if rid in chain(Roles.rid):
  104. return response.json(174)
  105. permission_list = roleContent['permission']
  106. roleContent.pop('permission')
  107. role = Role(**roleContent)
  108. role.save()
  109. if len(permission_list) > 0:
  110. role.permission.add(*permission_list)
  111. except Exception as e:
  112. return response.json(178, repr(e))
  113. else:
  114. self.startSignal()
  115. return response.json(0)
  116. def delRoles(self, rid=None, rolename=None, response=ResponseObject()):
  117. if rid != None:
  118. if rid not in Roles.rid:
  119. return response.json(173)
  120. try:
  121. roletuple = Role.objects.filter(rid=rid).delete()
  122. except Exception as e:
  123. return response.json(176, repr(e))
  124. else:
  125. if roletuple[0] == 1:
  126. self.startSignal()
  127. return self.queryAllRoles(response=response)
  128. else:
  129. return response.json(178, {'error_msg': roletuple})
  130. elif rolename != None:
  131. if rid not in Roles.rolename:
  132. return response.json(173)
  133. try:
  134. roletuple = Role.objects.filter(roleName=rolename).delete()
  135. except Exception as e:
  136. return response.json(176)
  137. else:
  138. if roletuple[0] == 1:
  139. self.startSignal()
  140. return self.queryAllRoles(response=response)
  141. else:
  142. return response.json(178)
  143. def modifyRoles(self, rid=None, content=None, response=ResponseObject()):
  144. if rid not in Roles.rid:
  145. return response.json(173)
  146. try:
  147. roleContent = json.loads(content)
  148. except Exception as e:
  149. errorInfo = traceback.format_exc()
  150. print('The content parameter format is wrong: %s' % errorInfo)
  151. return response.json(444)
  152. else:
  153. try:
  154. permission_list = roleContent['permission']
  155. roleContent.pop('permission')
  156. roleCount = Role.objects.filter(rid=rid).update(**roleContent)
  157. if roleCount:
  158. if len(permission_list) > 0:
  159. Role.objects.get(rid=rid).permission.set(permission_list)
  160. else:
  161. Role.objects.get(rid=rid).permission.clear()
  162. except Exception as e:
  163. return response.json(177)
  164. else:
  165. if roleCount == 1:
  166. self.startSignal()
  167. return self.queryAllRoles(response=response)
  168. else:
  169. return response.json(177)
  170. class Permission(object):
  171. try:
  172. id = []
  173. permname = []
  174. perms = Permissions.objects.all()
  175. for perm in perms:
  176. id.append(perm.id)
  177. permname.append(perm.permName)
  178. except Exception as e:
  179. pass
  180. def __init__(self):
  181. perms_done.connect(self.callback)
  182. self.startSignal()
  183. def callback(self, sender, **kwargs):
  184. Permission.id = []
  185. Permission.permname = []
  186. Permission.roles = Permissions.objects.all()
  187. for perm in Permission.roles:
  188. Permission.id.append(perm.id)
  189. Permission.permname.append(perm.permName)
  190. def startSignal(self):
  191. perms_done.send(sender=self.__class__)
  192. def queryAllPerms(self, perms=None, exclude=None, response=ResponseObject()):
  193. opts = []
  194. for perm in chain(Permission.permname):
  195. if perms and perm not in perms:
  196. continue
  197. if exclude and perm in exclude:
  198. continue
  199. opts.append(perm)
  200. return response.json(0, {'perms': opts})
  201. def delPerms(self, id=None, permName=None, response=ResponseObject()):
  202. if id != None:
  203. perm = Permissions.objects.filter(id=id)
  204. elif permName != None:
  205. perm = Permissions.objects.filter(permName=permName)
  206. else:
  207. return response.json(444, 'id,perm')
  208. if not perm:
  209. return response.json(173)
  210. try:
  211. perm.delete()
  212. except Exception as e:
  213. return response.json(176, repr(e))
  214. else:
  215. self.startSignal()
  216. qs = Permissions.objects.all()
  217. res = CommonService.qs_to_dict(qs)
  218. return response.json(0, res)
  219. @staticmethod
  220. def getAllPermission(response=ResponseObject()):
  221. send_dict = CommonService.qs_to_dict(Permissions.objects.all())
  222. return response.json(0, send_dict)
  223. class permManager(object):
  224. def queryMoreRole(self, rid=None):
  225. role = Role.objects.filter(rid=rid)
  226. if not role:
  227. roleDict = {'rid': role[0].rid, 'error_msg': u'The rid does not exist!'}
  228. return roleDict
  229. roleDict = {'rid': role[0].rid, 'perms': role[0].get_all_permission()}
  230. return roleDict
  231. def queryAllRole(self, response=ResponseObject()):
  232. qs = Role.objects.all()
  233. res = CommonService.qs_to_dict(qs)
  234. return response.json(0, res)
  235. # 角色View
  236. class queryRoleView(View):
  237. @method_decorator(csrf_exempt)
  238. def dispatch(self, *args, **kwargs):
  239. return super(queryRoleView, self).dispatch(*args, **kwargs)
  240. def get(self, request, *args, **kwargs):
  241. request.encoding = 'gb2312'
  242. token = request.GET.get('token', None)
  243. return self.ValidationError(token)
  244. def post(self, request, *args, **kwargs):
  245. request.encoding = 'utf-8'
  246. token = request.POST.get('token', None)
  247. return self.ValidationError(token)
  248. def ValidationError(self, token):
  249. response = ResponseObject()
  250. tko = TokenObject(token)
  251. response.lang = tko.lang
  252. if tko.code != 0:
  253. return response.json(tko.code)
  254. userID = tko.userID
  255. if userID:
  256. return self.queryUserRole(userID, response)
  257. else:
  258. return response.json(309)
  259. def queryUserRole(self, userID, response):
  260. eUser = Device_User.objects.filter(userID=userID)
  261. if not eUser:
  262. return response.json(102)
  263. if 100 in eUser[0].get_role_id():
  264. role = Roles()
  265. return role.queryAllRoles(response=response)
  266. own_permission = ModelService.check_perm(userID=userID, permID=30)
  267. if own_permission is not True:
  268. return response.json(404)
  269. role = Roles()
  270. return role.queryAllRoles(response=response)
  271. class addNewRoleView(View):
  272. @method_decorator(csrf_exempt)
  273. def dispatch(self, *args, **kwargs):
  274. return super(addNewRoleView, self).dispatch(*args, **kwargs)
  275. def get(self, request, *args, **kwargs):
  276. request.encoding = 'gb2312'
  277. request_dict = request.GET
  278. return self.ValidationError(request_dict)
  279. def post(self, request, *args, **kwargs):
  280. request.encoding = 'utf-8'
  281. request_dict = request.POST
  282. return self.ValidationError(request_dict)
  283. def ValidationError(self, request_dict):
  284. token = request_dict.get('token', None)
  285. content = request_dict.get('content', None)
  286. response = ResponseObject()
  287. if not content:
  288. return response.json(444, 'content')
  289. tko = TokenObject(token)
  290. response.lang = tko.lang
  291. if tko.code != 0:
  292. return response.json(tko.code)
  293. userID = tko.userID
  294. if not userID:
  295. return response.json(309)
  296. return self.AddNewUserRole(userID, content, response)
  297. def AddNewUserRole(self, userID, content, response):
  298. User = Device_User.objects.filter(userID=userID)
  299. rids = User[0].get_role_id()
  300. if rids == None:
  301. return response.json(174)
  302. Aperms = False
  303. for rid in rids:
  304. if rid < 10:
  305. continue
  306. else:
  307. Aperms = True
  308. if not Aperms:
  309. return response.json(404)
  310. role = Roles()
  311. return role.addRoles(content=content, response=response)
  312. class delRoleView(View):
  313. @method_decorator(csrf_exempt)
  314. def dispatch(self, *args, **kwargs):
  315. return super(delRoleView, self).dispatch(*args, **kwargs)
  316. def get(self, request, *args, **kwargs):
  317. request.encoding = 'gb2312'
  318. request_dict = request.GET
  319. return self.ValidationError(request_dict)
  320. def post(self, request, *args, **kwargs):
  321. request.encoding = 'utf-8'
  322. request_dict = request.POST
  323. return self.ValidationError(request_dict)
  324. def ValidationError(self, request_dict):
  325. token = request_dict.get('token', None)
  326. rid = request_dict.get('rid', None)
  327. response = ResponseObject()
  328. if not rid:
  329. return response.json(444, 'rid')
  330. tko = TokenObject(token)
  331. response.lang = tko.lang
  332. if tko.code != 0:
  333. return response.json(tko.code)
  334. userID = tko.userID
  335. if not userID:
  336. return response.json(104)
  337. return self.delRole(userID, int(rid), response)
  338. def delRole(self, userID, rid, response):
  339. own_permission = ModelService.check_perm(userID=userID, permID=10)
  340. if own_permission is not True:
  341. return response.json(404)
  342. role = Roles()
  343. return role.delRoles(rid=rid, response=response)
  344. class modifyRoleView(View):
  345. @method_decorator(csrf_exempt)
  346. def dispatch(self, *args, **kwargs):
  347. return super(modifyRoleView, self).dispatch(*args, **kwargs)
  348. def get(self, request, *args, **kwargs):
  349. request.encoding = 'utf-8'
  350. request_dict = request.GET
  351. return self.ValidationError(request_dict)
  352. def post(self, request, *args, **kwargs):
  353. request.encoding = 'utf-8'
  354. request_dict = request.POST
  355. return self.ValidationError(request_dict)
  356. def ValidationError(self, request_dict):
  357. token = request_dict.get('token', None)
  358. rid = request_dict.get('rid', None)
  359. content = request_dict.get('content', None)
  360. response = ResponseObject()
  361. if not content or not rid:
  362. return response.json(444, 'rid,content')
  363. tko = TokenObject(token)
  364. response.lang = tko.lang
  365. if tko.code != 0:
  366. return response.json(tko.code)
  367. userID = tko.userID
  368. if not userID:
  369. return response.json(104)
  370. return self.modifyRole(userID, int(rid), content, response)
  371. def modifyRole(self, userID, rid, content, response):
  372. User = Device_User.objects.filter(userID=userID)
  373. rids = User[0].get_role_id()
  374. if rids == None:
  375. return response.json(174)
  376. Aperms = False
  377. for rrid in rids:
  378. if rrid < 10:
  379. continue
  380. else:
  381. Aperms = True
  382. if not Aperms:
  383. return response.json(404)
  384. role = Roles()
  385. return role.modifyRoles(rid=rid, content=content, response=response)
  386. # 权限View
  387. class addNewPermsView(View):
  388. @method_decorator(csrf_exempt)
  389. def dispatch(self, *args, **kwargs):
  390. return super(addNewPermsView, self).dispatch(*args, **kwargs)
  391. def get(self, request, *args, **kwargs):
  392. request.encoding = 'utf-8'
  393. request_dict = request.GET
  394. return self.ValidationError(request_dict)
  395. def post(self, request, *args, **kwargs):
  396. request.encoding = 'utf-8'
  397. request_dict = request.POST
  398. return self.ValidationError(request_dict)
  399. def ValidationError(self, request_dict):
  400. response = ResponseObject()
  401. token = request_dict.get('token', None)
  402. tko = TokenObject(token)
  403. response.lang = tko.lang
  404. if tko.code != 0:
  405. return response.json(tko.code)
  406. userID = tko.userID
  407. if not userID:
  408. return response.json(104)
  409. return self.addNewPermission(userID, request_dict, response)
  410. def addNewPermission(self, userID, request_dict, response):
  411. own_perm = ModelService.check_perm(userID, 40)
  412. if own_perm is not True:
  413. return response.json(404)
  414. else:
  415. add_dict = {
  416. 'id': int(request_dict['id']),
  417. 'permName': request_dict['permName'],
  418. 'description': request_dict['description']}
  419. try:
  420. perm = Permissions(**add_dict)
  421. perm.save()
  422. except Exception as e:
  423. return response.json(178, repr(e))
  424. else:
  425. return Permission.getAllPermission(response=response)
  426. class delPermsView(View):
  427. @method_decorator(csrf_exempt)
  428. def dispatch(self, *args, **kwargs):
  429. return super(delPermsView, self).dispatch(*args, **kwargs)
  430. def get(self, request, *args, **kwargs):
  431. request.encoding = 'utf-8'
  432. request_dict = request.GET
  433. return self.ValidationError(request_dict)
  434. def post(self, request, *args, **kwargs):
  435. request.encoding = 'utf-8'
  436. request_dict = request.POST
  437. return self.ValidationError(request_dict)
  438. def ValidationError(self, request_dict):
  439. token = request_dict.get('token', None)
  440. id = request_dict.get('id', None)
  441. response = ResponseObject()
  442. if not id:
  443. return response.json(444, 'id')
  444. tko = TokenObject(token)
  445. response.lang = tko.lang
  446. if tko.code != 0:
  447. return response.json(tko.code)
  448. userID = tko.userID
  449. if not userID:
  450. return response.json(104)
  451. return self.delPerms(userID, id, response)
  452. def delPerms(self, userID, id, response):
  453. User = Device_User.objects.filter(userID=userID)
  454. rids = User[0].get_role_id()
  455. if len(rids) == 0:
  456. return response.json(174)
  457. Aperms = False
  458. for rid in rids:
  459. if rid < 10:
  460. continue
  461. else:
  462. Aperms = True
  463. if not Aperms:
  464. return response.json(404)
  465. perms = Permission()
  466. return perms.delPerms(id=id, response=response)
  467. class queryPermsView(View):
  468. @method_decorator(csrf_exempt)
  469. def dispatch(self, *args, **kwargs):
  470. return super(queryPermsView, self).dispatch(*args, **kwargs)
  471. def get(self, request, *args, **kwargs):
  472. request.encoding = 'utf-8'
  473. request_dict = request.GET
  474. return self.ValidationError(request_dict)
  475. def post(self, request, *args, **kwargs):
  476. request.encoding = 'utf-8'
  477. request_dict = request.POST
  478. return self.ValidationError(request_dict)
  479. def ValidationError(self, request_dict):
  480. token = request_dict.get('token', None)
  481. type = request_dict.get('type', None)
  482. response = ResponseObject()
  483. tko = TokenObject(token)
  484. response.lang = tko.lang
  485. if tko.code != 0:
  486. return response.json(tko.code)
  487. userID = tko.userID
  488. if not userID:
  489. return response.json(104)
  490. if type == 'PC':
  491. return self.querAllPermission(userID, response)
  492. else:
  493. return self.delPerms(userID, response)
  494. def querAllPermission(self, userID, response):
  495. own_perm = ModelService.check_perm(userID, 30)
  496. if own_perm is not True:
  497. return response.json(404)
  498. qs = Permissions.objects.all()
  499. res = CommonService.qs_to_dict(qs)
  500. return response.json(0, res)
  501. def delPerms(self, userID, response):
  502. User = Device_User.objects.filter(userID=userID)
  503. rids = User[0].get_role_id()
  504. if len(rids) == 0:
  505. return response.json(174)
  506. Aperms = False
  507. for rid in rids:
  508. if rid < 10:
  509. continue
  510. else:
  511. Aperms = True
  512. if not Aperms:
  513. return response.json(404)
  514. perms = Permission()
  515. return perms.queryAllPerms(response=response)
  516. class modifyPermsView(View):
  517. @method_decorator(csrf_exempt)
  518. def dispatch(self, *args, **kwargs):
  519. return super(modifyPermsView, self).dispatch(*args, **kwargs)
  520. def get(self, request, *args, **kwargs):
  521. request.encoding = 'utf-8'
  522. request_dict = request.GET
  523. return self.ValidationError(request_dict)
  524. def post(self, request, *args, **kwargs):
  525. request.encoding = 'utf-8'
  526. request_dict = request.POST
  527. return self.ValidationError(request_dict)
  528. def ValidationError(self, request_dict):
  529. token = request_dict.get('token', None)
  530. response = ResponseObject()
  531. tko = TokenObject(token)
  532. response.lang = tko.lang
  533. if tko.code != 0:
  534. return response.json(tko.code)
  535. userID = tko.userID
  536. if userID:
  537. update_dict = {'permName': request_dict['permName'], 'description': request_dict['description']}
  538. return self.modifyPerms(userID=userID, id=request_dict['id'], update_dict=update_dict,
  539. response=response)
  540. else:
  541. return response.json(309)
  542. def modifyPerms(self, userID, id, update_dict, response):
  543. try:
  544. User = Device_User.objects.filter(userID=userID)
  545. except Exception as e:
  546. return response.json(500, repr(e))
  547. else:
  548. rids = User[0].get_role_id()
  549. if len(rids) == 0:
  550. return response.json(174)
  551. Aperms = False
  552. for rid in rids:
  553. if rid < 10:
  554. continue
  555. else:
  556. Aperms = True
  557. if not Aperms:
  558. return response.json(404)
  559. try:
  560. Permissions.objects.filter(id=int(id)).update(**update_dict)
  561. except Exception as e:
  562. return response.json(500, repr(e))
  563. else:
  564. return Permission.getAllPermission(response=response)
  565. class queryRolePermsView(View):
  566. @method_decorator(csrf_exempt)
  567. def dispatch(self, *args, **kwargs):
  568. return super(queryRolePermsView, self).dispatch(*args, **kwargs)
  569. def get(self, request, *args, **kwargs):
  570. request.encoding = 'gb2312'
  571. token = request.GET.get('token', None)
  572. allUser = request.GET.get('allUser', False)
  573. return self.ValidationError(token, allUser)
  574. def post(self, request, *args, **kwargs):
  575. request.encoding = 'utf-8'
  576. token = request.POST.get('token', None)
  577. allUser = request.POST.get('allUser', False)
  578. return self.ValidationError(token, allUser)
  579. def ValidationError(self, token, allUser):
  580. response = ResponseObject()
  581. tko = TokenObject(token)
  582. response.lang = tko.lang
  583. if tko.code != 0:
  584. return response.json(tko.code)
  585. userID = tko.userID
  586. if userID:
  587. return self.queryRolePerms(userID, allUser, response)
  588. else:
  589. return response.json(309)
  590. def queryRolePerms(self, userID, allUser, response):
  591. dUser = Device_User.objects.filter(userID=userID).order_by('-data_joined')
  592. if not dUser:
  593. return response.json(104)
  594. if allUser == '0' or allUser == 'False' or allUser == 'false':
  595. allUser = False
  596. elif allUser == '1' or allUser == 'True' or allUser == 'true':
  597. allUser = True
  598. else:
  599. allUser = False
  600. pM = permManager()
  601. if not allUser:
  602. ridslist = []
  603. rids = dUser[0].get_role_id()
  604. for rid in rids:
  605. ridslist.append(pM.queryMoreRole(rid=rid))
  606. sqlDict = dict(zip(["datas"], [ridslist]))
  607. return response.json(0, sqlDict)
  608. else:
  609. if 100 in dUser[0].get_role_id():
  610. return pM.queryAllRole(response=response)
  611. else:
  612. return response.json(404)