#-- # Copyright (C) 2008 Dimitrij Denissenko # Please read LICENSE document for more information. #++ class Group < ActiveRecord::Base has_and_belongs_to_many :projects, :order => 'projects.name', :uniq => true has_and_belongs_to_many :users, :order => 'users.login', :uniq => true validates_presence_of :name validates_format_of :name, :with => %r{^[A-Za-z0-9]+( [A-Za-z0-9]+)*$}, :message => 'may only contain latin characters and digits separated by spaces' validates_uniqueness_of :name validates_length_of :name, :within => 3..40 attr_protected :permissions, :projects, :project_ids serialize :permissions, Array def protected_attributes=(attrs) return unless attrs.is_a?(Hash) self.permissions = attrs[:permissions] || [] self.project_ids = attrs[:project_ids] || [] self.access_to_all_projects = attrs[:access_to_all_projects] if attrs[:access_to_all_projects] end protected def validate if !default? && permissions.blank? errors.add(:permissions, _('must be specified')) end errors.empty? end def before_destroy if default? errors.add_to_base(_('Default group cannot be deleted')) end errors.empty? end public def permissions permissions = read_attribute(:permissions) permissions.is_a?(Array) ? permissions : [] end def self.default_group Group.find_by_name('Default') end def default? name == 'Default' end def permissions=(perms) perms ||= [] perms = perms.collect do |perm| RetroAM.permission_list.include?(perm.to_s) ? perm.to_s : nil end.compact.uniq write_attribute(:permissions, perms) end def includes_permission?(permission_name) permissions.include?(permission_name.to_s) end def access_to_project?(project) projects.include?(project) end def project_names if access_to_all_projects? ['All'] else projects.map(&:name) end end private def write_attribute(attr_name, value) if new_record? || !default? || attr_name != 'name' super(attr_name, value) end end end