app/models/loc_group.rb
class LocGroup < ActiveRecord::Base
belongs_to :department
belongs_to :view_permission,
class_name: "Permission",
foreign_key: "view_perm_id",
dependent: :destroy
belongs_to :signup_permission,
class_name: "Permission",
foreign_key: "signup_perm_id",
dependent: :destroy
belongs_to :admin_permission,
class_name: "Permission",
foreign_key: "admin_perm_id",
dependent: :destroy
has_many :locations, dependent: :destroy
# These make loc groups connect to the superclass notice, as well as its subclasses
has_and_belongs_to_many :announcements, join_table: :loc_groups_notices, association_foreign_key: :notice_id
has_and_belongs_to_many :links, join_table: :loc_groups_notices, association_foreign_key: :notice_id
has_and_belongs_to_many :stickies, join_table: :loc_groups_notices, association_foreign_key: :notice_id
has_and_belongs_to_many :notices
has_and_belongs_to_many :restrictions
scope :active, where(active: true)
before_validation :create_permissions, on: :create
before_validation :update_permissions, on: :update
validates_presence_of :department
def permissions
[view_permission, signup_permission, admin_permission]
end
# Conventional has_many :through won't work -Ben
def data_objects
self.locations.map{|loc| loc.data_objects}.flatten.uniq.compact
end
def users
department.users.select { |u| u.can_signup?(self) }
end
def roles
department.roles.select { |u| u.permissions.include?(signup_permission) }
end
def deactivate
self.active = false
self.save!
self.locations.each do |location|
location.deactivate
end
end
def activate
self.active = true
self.save!
self.locations.each do |location|
location.activate
end
end
private
def create_permissions
self.create_view_permission(name: name + " view")
self.create_signup_permission(name: name + " signup")
self.create_admin_permission(name: name + " admin")
end
# in case loc group name is changed, update permission names accordingly
# note update_attribute does the saving as well
def update_permissions
self.view_permission.update_attribute(:name, name + " view")
self.signup_permission.update_attribute(:name, name + " signup")
self.admin_permission.update_attribute(:name, name + " admin")
end
end