decorators.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.utils.decorators
  4. ~~~~~~~~~~~~~~~~~~~~~~~~
  5. A place for our decorators.
  6. :copyright: (c) 2014 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. from functools import wraps
  10. from flask import abort
  11. from flask_login import current_user
  12. def admin_required(f):
  13. @wraps(f)
  14. def decorated(*args, **kwargs):
  15. if current_user.is_anonymous():
  16. abort(403)
  17. if not current_user.permissions['admin']:
  18. abort(403)
  19. return f(*args, **kwargs)
  20. return decorated
  21. def moderator_required(f):
  22. @wraps(f)
  23. def decorated(*args, **kwargs):
  24. if current_user.is_anonymous():
  25. abort(403)
  26. if not any([current_user.permissions['admin'],
  27. current_user.permissions['super_mod'],
  28. current_user.permissions['mod']]):
  29. abort(403)
  30. return f(*args, **kwargs)
  31. return decorated
  32. def can_access_forum(func):
  33. def decorated(*args, **kwargs):
  34. forum_id = kwargs['forum_id'] if 'forum_id' in kwargs else args[1]
  35. from flaskbb.forum.models import Forum
  36. from flaskbb.user.models import Group
  37. # get list of user group ids
  38. if current_user.is_authenticated():
  39. user_groups = [gr.id for gr in current_user.groups]
  40. else:
  41. user_groups = [Group.get_guest_group().id]
  42. user_forums = Forum.query.filter(
  43. Forum.id == forum_id, Forum.groups.any(Group.id.in_(user_groups))
  44. ).all()
  45. if len(user_forums) < 1:
  46. abort(403)
  47. return func(*args, **kwargs)
  48. return decorated
  49. def can_access_topic(func):
  50. def decorated(*args, **kwargs):
  51. topic_id = kwargs['topic_id'] if 'topic_id' in kwargs else args[1]
  52. from flaskbb.forum.models import Forum, Topic
  53. from flaskbb.user.models import Group
  54. topic = Topic.query.get(topic_id == topic_id)
  55. # get list of user group ids
  56. if current_user.is_authenticated():
  57. user_groups = [gr.id for gr in current_user.groups]
  58. else:
  59. user_groups = [Group.get_guest_group().id]
  60. user_forums = Forum.query.filter(
  61. Forum.id == topic.forum.id,
  62. Forum.groups.any(Group.id.in_(user_groups))
  63. ).all()
  64. if len(user_forums) < 1:
  65. abort(403)
  66. return func(*args, **kwargs)
  67. return decorated