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