utils.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # pylint: disable=C,R,W
  2. from collections import defaultdict
  3. from flask import g
  4. from flask_appbuilder.security.sqla import models as ab_models
  5. from superset import db
  6. def bootstrap_user_data(username=None, include_perms=False):
  7. if username:
  8. username = username
  9. else:
  10. username = g.user.username
  11. user = (
  12. db.session.query(ab_models.User)
  13. .filter_by(username=username)
  14. .one()
  15. )
  16. payload = {
  17. 'username': user.username,
  18. 'firstName': user.first_name,
  19. 'lastName': user.last_name,
  20. 'userId': user.id,
  21. 'isActive': user.is_active,
  22. 'createdOn': user.created_on.isoformat(),
  23. 'email': user.email,
  24. }
  25. if include_perms:
  26. roles, permissions = get_permissions(user)
  27. payload['roles'] = roles
  28. payload['permissions'] = permissions
  29. return payload
  30. def get_permissions(user):
  31. if not user.roles:
  32. raise AttributeError('User object does not have roles')
  33. roles = {}
  34. permissions = defaultdict(set)
  35. for role in user.roles:
  36. perms = set()
  37. for perm in role.permissions:
  38. if perm.permission and perm.view_menu:
  39. perms.add(
  40. (perm.permission.name, perm.view_menu.name),
  41. )
  42. if perm.permission.name in ('datasource_access',
  43. 'database_access'):
  44. permissions[perm.permission.name].add(perm.view_menu.name)
  45. roles[role.name] = [
  46. [perm.permission.name, perm.view_menu.name]
  47. for perm in role.permissions
  48. if perm.permission and perm.view_menu
  49. ]
  50. return roles, permissions