Newer
Older
dmpopidor / app / models / settings / dmptemplate.rb
@Marta Ribeiro Marta Ribeiro on 3 Jun 2016 2 KB DMPonline4 - RAILS 4.0 (#4)
module Settings
  class Dmptemplate < RailsSettings::SettingObject
  
  #attr_accessible :var, :target, :target_id, :target_type

    VALID_FONT_FACES = [
      'Arial, Helvetica, Sans-Serif',
      '"Times New Roman", Times, Serif'
    ]

    VALID_FONT_SIZE_RANGE = (8..14)
    VALID_MARGIN_RANGE = (5..25)

    VALID_ADMIN_FIELDS = %i(
      project_name project_identifier grant_title principal_investigator
      project_data_contact project_description funder institution
    )

    DEFAULT_SETTINGS = {
      formatting: {
        margin: { # in millimeters
          top:    20,
          bottom: 20,
          left:   20,
          right:  20
        },
        font_face: VALID_FONT_FACES.first,
        font_size: 12 # pt
      },
      max_pages: 3,
      fields: {
        admin: VALID_ADMIN_FIELDS,
        questions: :all
      },
      title: ""
    }

    validate do
      formatting = value['formatting']
      max_pages  = value['max_pages']
      fields     = value['fields']

      if formatting.present?
        errs = []
        default_formatting = DEFAULT_SETTINGS[:formatting]

        unless (default_formatting.keys - formatting.keys).empty?
          errs << :missing_key
        else
          unless formatting[:margin].is_a?(Hash)
            errs << :invalid_margin
          else
            errs << :negative_margin if formatting[:margin].any? {|k,v| v.to_i < 0 }
            errs << :unknown_margin unless (formatting[:margin].keys - default_formatting[:margin].keys).empty?
            errs << :invalid_margin unless formatting[:margin].all? {|k,v| VALID_MARGIN_RANGE.member?(v) }
          end

          errs << :invalid_font_size unless VALID_FONT_SIZE_RANGE.member?(formatting[:font_size])
          errs << :invalid_font_face unless VALID_FONT_FACES.member?(formatting[:font_face])
          errs << :unknown_key unless (formatting.keys - default_formatting.keys).empty?
        end

        errs.map do |key|
          errors.add(:formatting, I18n.t("helpers.settings.plans.errors.#{key}"))
        end

      end

      if max_pages.present? && (!max_pages.is_a?(Integer) || max_pages <= 0)
        errors.add(:max_pages, I18n.t('helpers.settings.plans.errors.invalid_max_pages'))
      end
    end

    before_validation do
      self.formatting[:font_size] = self.formatting[:font_size].to_i if self.formatting[:font_size].present?
      unless self.formatting[:margin].nil? or (not self.formatting[:margin].is_a?(Hash))
        self.formatting[:margin].each do |key, val|
          self.formatting[:margin][key] = val.to_i
        end
      end

      self.fields.each do |key, val|
        if val.is_a?(Hash)
          val = key == :questions ? val.keys.map {|k| k.to_s.to_i } : val.keys
        end

        self.fields[key] = val
      end

      # Save empty arrays if we don't have any fields for them
      self.fields[:admin] ||= []
      self.fields[:questions] ||= []
    end
  end
end