Noosfero/noosfero

View on GitHub
plugins/custom_forms/lib/custom_forms_plugin/answer.rb

Summary

Maintainability
A
0 mins
Test Coverage
class CustomFormsPlugin::Answer < ApplicationRecord
  self.table_name = :custom_forms_plugin_answers
  belongs_to :field, class_name: "CustomFormsPlugin::Field", optional: true
  belongs_to :submission, class_name: "CustomFormsPlugin::Submission", optional: true
  has_many :form_answers, class_name: "CustomFormsPlugin::FormAnswer"
  has_many :alternatives, through: :form_answers
  validates_presence_of :field
  validate :value_is_mandatory, if: "field.present?"
  validate :value_is_valid, if: "field.try(:alternatives).present?"

  attr_accessible :field, :value, :submission, :imported, :alternatives

  def to_text_list
    return [value] if value.blank? || field.alternatives.blank?

    selected = value.split(",")
    field.alternatives.select { |alt| selected.include? alt.id.to_s }
         .map(&:label)
  end

  def to_s
    unless value.nil?
      to_text_list.map { |l| l.gsub(";", ".") }.join(";")
    end
  end

  def value
    if field.is_a? CustomFormsPlugin::SelectField
      form_answers.map { |f| f.alternative_id }.join(",")
    elsif field.is_a? CustomFormsPlugin::DateTimeField
      self["value"].to_date
    else
      self["value"]
    end
  end

  private

    def value_is_mandatory
      if field.mandatory && value.blank?
        errors.add(:value, _("is mandatory.").fix_i18n)
      end
    end

    def value_is_valid
      possible_values = field.alternatives.map(&:id).map(&:to_s)
      values = self.value.split(",")
      values.each do |val|
        unless val.in?(possible_values)
          errors.add(:value, _("alternative is not valid"))
        end
      end

      if (values.size > 1) && !field.accept_multiple_answers?
        errors.add(:value, _("do not accept multiple answers"))
      end
    end
end