????

Your IP : 18.223.33.204


Current Path : C:/inetpub/vhost/redmine.gdtvietnam.com/plugins/redmine_people/lib/
Upload File :
Current File : C:/inetpub/vhost/redmine.gdtvietnam.com/plugins/redmine_people/lib/people_acl.rb

# This file is a part of Redmine People (redmine_people) plugin,
# humanr resources management plugin for Redmine
#
# Copyright (C) 2011-2024 RedmineUP
# http://www.redmineup.com/
#
# redmine_people is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# redmine_people is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with redmine_people.  If not, see <http://www.gnu.org/licenses/>.

class PeopleAcl
  attr_accessor :principal_id, :permissions

  def initialize(principal_id, permissions)
    self.principal_id = principal_id.to_s
    self.permissions = permissions
  end

  def permissions=(perms)
    perms = perms.collect {|p| p.to_sym unless p.blank? && p.is_a?(String) && p.is_a?(Symbol) }.compact.uniq if perms
    @permissions = perms
  end


  def has_permission?(perm)
    return false unless perm.is_a?(String) || perm.is_a?(Symbol)
    !@permissions.nil? && @permissions.include?(perm.to_sym)
  end

  def principal
    Principal.find_by_id(self.principal_id)
  end

  def <<(perm)
    return false unless perm.is_a?(String) || perm.is_a?(Symbol)
    @permissions << perm.to_sym
  end

  def self.delete(principal_id)
    users_acls = Setting.plugin_redmine_people[:users_acl] || {}
    users_acls.delete(principal_id.to_s)
    Setting.plugin_redmine_people = Setting.plugin_redmine_people.merge(:users_acl => users_acls)
  end

  def self.create(principal_id, permissions)
    return false unless principal_id.blank? || Principal.find_by_id(principal_id)
    acl = self.new(principal_id, permissions)
    acl.save
  end

  def self.all
    return [] unless self.acls && self.acls.is_a?(Hash)
    self.acls.map do |acl|
      self.new(acl[0], acl[1]) if acl[0] && acl[1] && acl[1].is_a?(Array) && Principal.find_by_id(acl[0])
    end.compact || []
  end

  def self.find(principal_id)
    perms = self.acls && self.acls.is_a?(Hash) && self.acls[principal_id.to_s]
    self.new(principal_id.to_s, perms) if perms && perms.is_a?(Array)
  end

  def self.first
    self.all[0]
  end

  def self.allowed_to?(principal, permission)
    return false unless principal && principal.is_a?(Principal)
    if acl = self.find(principal.id)
      acl.has_permission?(permission)
    else
      false
    end
  end

  def save
    users_acls = Setting.plugin_redmine_people[:users_acl]
    users_acls = {} unless users_acls && users_acls.is_a?(Hash)
    users_acls.merge!(self.principal_id.to_s => self.permissions)
    Setting.plugin_redmine_people = Setting.plugin_redmine_people.merge(:users_acl => users_acls)
  end

  private

  def self.acls
    Setting.plugin_redmine_people[:users_acl]
  end
end