# frozen_string_literal: true
# Set of Guidances that pertain to a certain category of Users (e.g. Maths
# department, vs Biology department)
#
# == Schema Information
#
# Table name: guidance_groups
#
# id :integer not null, primary key
# name :string
# org_id :integer
# created_at :datetime not null
# updated_at :datetime not null
# optional_subset :boolean default("false"), not null
# published :boolean default("false"), not null
#
# Indexes
#
# guidance_groups_org_id_idx (org_id)
#
class GuidanceGroup < ActiveRecord::Base
include GlobalHelpers
include ValidationValues
include ValidationMessages
# ================
# = Associations =
# ================
belongs_to :org
has_many :guidances, dependent: :destroy
has_and_belongs_to_many :plans, join_table: :plans_guidance_groups
# ===============
# = Validations =
# ===============
validates :name, presence: { message: PRESENCE_MESSAGE },
uniqueness: { message: UNIQUENESS_MESSAGE, scope: :org_id }
validates :org, presence: { message: PRESENCE_MESSAGE }
validates :optional_subset, inclusion: { in: BOOLEAN_VALUES,
message: INCLUSION_MESSAGE }
validates :published, inclusion: { in: BOOLEAN_VALUES,
message: INCLUSION_MESSAGE }
# EVALUATE CLASS AND INSTANCE METHODS BELOW
#
# What do they do? do they do it efficiently, and do we need them?
# Retrieves every guidance group associated to an org
scope :by_org, ->(org) { where(org_id: org.id) }
scope :search, lambda { |term|
search_pattern = "%#{term}%"
where("lower(name) LIKE lower(?)", search_pattern)
}
scope :published, -> { where(published: true) }
# =================
# = Class methods =
# =================
# Whether or not a given user can view a given guidance group
# we define guidances viewable to a user by those owned by:
# the managing curation center
# a funder organisation
# an organisation, of which the user is a member
#
# id - The integer id for a guidance group
# user - A User object
#
# Returns Boolean
def self.can_view?(user, guidance_group)
viewable = false
# groups are viewable if they are owned by any of the user's organisations
viewable = true if guidance_group.org == user.org
# groups are viewable if they are owned by the managing curation center
Org.managing_orgs.each do |managing_group|
viewable = true if guidance_group.org.id == managing_group.id
end
# groups are viewable if they are owned by a funder
viewable = true if guidance_group.org.funder?
viewable
end
# A list of all guidance groups which a specified user can view
# we define guidance groups viewable to a user by those owned by:
# the Managing Curation Center
# a funder organisation
# an organisation, of which the user is a member
#
# user - A User object
#
# Returns Array
def self.all_viewable(user)
# first find all groups owned by the Managing Curation Center
managing_org_groups = Org.includes(guidance_groups: [guidances: :themes])
.managing_orgs.collect(&:guidance_groups)
# find all groups owned by a Funder organisation
funder_groups = Org.includes(:guidance_groups)
.funder
.collect(&:guidance_groups)
organisation_groups = [user.org.guidance_groups]
# pass this organisation guidance groups to the view with respond_with
# all_viewable_groups
all_viewable_groups = managing_org_groups +
funder_groups +
organisation_groups
all_viewable_groups = all_viewable_groups.flatten.uniq
all_viewable_groups
end
end