Newer
Older
dmpopidor / app / models / section.rb
@briley briley on 23 May 2018 1 KB Template Versioning
class Section < ActiveRecord::Base
  ##
  # Associations
  belongs_to :phase
  belongs_to :organisation
  has_many :questions, :dependent => :destroy
  has_one :template, through: :phase

  #Link the data
  accepts_nested_attributes_for :questions, :reject_if => lambda {|a| a[:text].blank? },  :allow_destroy => true

  attr_accessible :phase_id, :description, :number, :title, :published,
                  :questions_attributes, :organisation, :phase, :modifiable,
                  :as => [:default, :admin]

  validates :phase, :title, :number, presence: {message: _("can't be blank")}

  before_validation :set_defaults

  ##
  # return the title of the section
  #
  # @return [String] the title of the section
  def to_s
    "#{title}"
  end

  # Returns the number of answered questions for a given plan
  def num_answered_questions(plan)
    return 0 if plan.nil?
    questions_hash = questions.reduce({}){ |m, q| m[q.id] = q; m }
    return plan.answers.includes({ question: :question_format }, :question_options).reduce(0) do |m, a|
      if questions_hash[a.question_id].present? && a.is_valid?
        m+= 1
      end
      m
    end
  end

  def deep_copy(**options)
    copy = self.dup
    copy.modifiable = options.fetch(:modifiable, self.modifiable)
    copy.phase_id = options.fetch(:phase_id, nil)
    copy.save!(validate: false)  if options.fetch(:save, false)
    options[:section_id] = id
    self.questions.map{ |question| copy.questions << question.deep_copy(options) }
    return copy
  end

  private
    def set_defaults
      self.modifiable = true if modifiable.nil?
    end
end