Newer
Older
dmpopidor / app / models / phase.rb
@briley briley on 23 May 2018 2 KB Template Versioning
# [+Project:+] DMPRoadmap
# [+Description:+] This model describes informmation about the phase of a plan, it's title, order of display and which template it belongs to.
#
# [+Created:+] 03/09/2014
# [+Copyright:+] Digital Curation Centre and University of California Curation Center
class Phase < ActiveRecord::Base
  ##
  # Sort order: Number ASC
  default_scope { order(number: :asc) }

  ##
  # Associations
  belongs_to :template
  has_many :sections, -> { order(:number => :asc) }, dependent: :destroy

  ##
  # Possibly needed for active_admin
  #   -relies on protected_attributes gem as syntax depricated in rails 4.2
  attr_accessible :description, :number, :title, :template_id, 
                  :template, :sections, :modifiable, :as => [:default, :admin]

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

  scope :titles, -> (template_id) {
    Phase.where(template_id: template_id).select(:id, :title)
  }
  
# TODO: Remove after implementing new template versioning logic
  # Callbacks
  after_save do |phase|
    # Updates the template.updated_at attribute whenever a phase has been created/updated 
    phase.template.touch if template.present?
  end

  def deep_copy(**options)
    copy = self.dup
    copy.modifiable = options.fetch(:modifiable, self.modifiable)
    copy.template_id = options.fetch(:template_id, nil)
    copy.save!(validate:false)  if options.fetch(:save, false)
    options[:phase_id] = id
    self.sections.each{ |section| copy.sections << section.deep_copy(options) }
    return copy
  end

# TODO: Move this to Plan model as `num_answered_questions(phase=nil)`
  # Returns the number of answered question for the phase.
  def num_answered_questions(plan)
    return 0 if plan.nil?
    return sections.reduce(0) do |m, s|
      m + s.num_answered_questions(plan) 
    end
  end

  # Returns the number of questions for a phase. Note, this method becomes useful
  # for when sections and their questions are eager loaded so that avoids SQL queries.
  def num_questions
    n = 0
    self.sections.each do |s|
      n+= s.questions.size()
    end
    return n
  end
end