has_roles.rb 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. module HasRoles
  3. extend ActiveSupport::Concern
  4. included do
  5. has_and_belongs_to_many :roles,
  6. before_add: %i[validate_agent_limit_by_role validate_roles],
  7. after_add: %i[cache_update check_notifications push_ticket_create_screen_for_role_change],
  8. before_remove: :last_admin_check_by_role,
  9. after_remove: %i[cache_update push_ticket_create_screen_for_role_change]
  10. end
  11. # Checks a given Group( ID) for given access(es) for the instance associated roles.
  12. #
  13. # @example Group ID param
  14. # user.role_access?(1, 'read')
  15. # #=> true
  16. #
  17. # @example Group param
  18. # user.role_access?(group, 'read')
  19. # #=> true
  20. #
  21. # @example Access list
  22. # user.role_access?(group, ['read', 'create'])
  23. # #=> true
  24. #
  25. # @return [Boolean]
  26. def role_access?(group_id, access)
  27. return false if !groups_access_permission?
  28. group_id = self.class.ensure_group_id_parameter(group_id)
  29. access = self.class.ensure_group_access_list_parameter(access)
  30. RoleGroup.eager_load(:group, :role).exists?(
  31. role_id: roles.pluck(:id),
  32. group_id: group_id,
  33. access: access,
  34. groups: {
  35. active: true
  36. },
  37. roles: {
  38. active: true
  39. }
  40. )
  41. end
  42. def push_ticket_create_screen_for_role_change(role)
  43. return if Setting.get('import_mode')
  44. permission = Permission.lookup(name: 'ticket.agent')
  45. return if !role.permissions.exists?(id: permission.id)
  46. push_ticket_create_screen_background_job
  47. end
  48. # methods defined here are going to extend the class, not the instance of it
  49. class_methods do
  50. # Lists instances having the given access(es) to the given Group through Roles.
  51. #
  52. # @example Group ID param
  53. # User.role_access(1, 'read')
  54. # #=> [1, 3, ...]
  55. #
  56. # @example Group param
  57. # User.role_access(group, 'read')
  58. # #=> [1, 3, ...]
  59. #
  60. # @example Access list
  61. # User.role_access(group, ['read', 'create'])
  62. # #=> [1, 3, ...]
  63. #
  64. # @return [Array<Integer>]
  65. def role_access(group_id, access)
  66. group_id = ensure_group_id_parameter(group_id)
  67. access = ensure_group_access_list_parameter(access)
  68. role_ids = RoleGroup.eager_load(:role).where(group_id: group_id, access: access, roles: { active: true }).pluck(:role_id)
  69. join_table = reflect_on_association(:roles).join_table
  70. joins(:roles).where(active: true, join_table => { role_id: role_ids }).distinct.select(&:groups_access_permission?)
  71. end
  72. # Lists IDs of instances having the given access(es) to the given Group through Roles.
  73. #
  74. # @example Group ID param
  75. # User.role_access_ids(1, 'read')
  76. # #=> [1, 3, ...]
  77. #
  78. # @example Group param
  79. # User.role_access_ids(group, 'read')
  80. # #=> [1, 3, ...]
  81. #
  82. # @example Access list
  83. # User.role_access_ids(group, ['read', 'create'])
  84. # #=> [1, 3, ...]
  85. #
  86. # @return [Array<Integer>]
  87. def role_access_ids(group_id, access)
  88. role_access(group_id, access).collect(&:id)
  89. end
  90. def ensure_group_id_parameter(group_or_id)
  91. return group_or_id if group_or_id.is_a?(Integer)
  92. group_or_id.id
  93. end
  94. def ensure_group_access_list_parameter(access)
  95. access = [access] if access.is_a?(String)
  96. access.push('full') if !access.include?('full')
  97. access
  98. end
  99. end
  100. end