lib/jss/api_object/extendable.rb in ruby-jss-1.2.9 vs lib/jss/api_object/extendable.rb in ruby-jss-1.2.10

- old
+ new

@@ -178,38 +178,25 @@ # @param refresh[Boolean] Re-read the ext. attrib definition from the API, # for popup validation. # # @return [void] # - def set_ext_attr(name, value, validate_popup_choice: true, refresh: false) - raise ArgumentError, "Unknown Extension Attribute Name: '#{name}'" unless ea_types.key? name + def set_ext_attr(ea_name, value, validate_popup_choice: true, refresh: false) + raise ArgumentError, "Unknown Extension Attribute Name: '#{ea_name}'" unless ea_types.key? ea_name - value ||= JSS::BLANK - validate_popup_value(name, value, refresh) if validate_popup_choice + value = validate_ea_value(ea_name, value, validate_popup_choice, refresh) - value = - case ea_types[name] - when JSS::ExtensionAttribute::DATA_TYPE_DATE # date - JSS.parse_datetime(value).to_s - when *JSS::ExtensionAttribute::NUMERIC_TYPES # integer - if value.is_a? Integer - value - elsif value.to_s.jss_integer? - value.to_s.to_i - else - raise JSS::InvalidDataError, "The value for #{name} must be an integer" - end # if - else # string - value.to_s - end # case - # update this ea hash in the @extension_attributes array - @extension_attributes.each { |ea| ea[:value] = value if ea[:name] == name } + ea_hash = @extension_attributes.find { |ea| ea[:name] == ea_name } + raise JSS::NoSuchItemError, "#{self.class} '#{name}'(id #{id}) does not know about ExtAttr '#{ea_name}'. Please re-fetch and try again." unless ea_hash + + ea_hash[:value] = value + # update the shortcut hash too - @ext_attrs[name] = value if @ext_attrs - @changed_eas << name + @ext_attrs[ea_name] = value if @ext_attrs + @changed_eas << ea_name @need_to_update = true end # are there any changes in the EAs needing to be saved? # @@ -249,25 +236,74 @@ end # each do ea eaxml end - # Used by set_ext_attr - def validate_popup_value(name, value, refresh) - # all popups can take blanks - return if value == JSS::BLANK + # is the value being passed to set_ext_attr valid? + # Converts values as needed (e.g. strings to integers or Times) + # + # If the EA is defined to hold a string, any value is accepted and + # converted with #to_s + # + # Note: All EAs can be blank + # + # @param name[String] the name of the extension attribute to set + # + # @param value[String,Time,Integer] the new value for the extension + # attribute for this user + # + # @param validate_popup_choice[Boolean] validate the new value against the E.A. definition. + # Defaults to true. + # + # @param refresh[Boolean] Re-read the ext. attrib definition from the API, + # for popup validation. + # + # @return [Object] the possibly modified valid value + # + def validate_ea_value(ea_name, value, validate_popup_choice, refresh) + return JSS::BLANK if value.to_s == JSS::BLANK + value = + case ea_types[ea_name] + when JSS::ExtensionAttribute::DATA_TYPE_DATE + JSS.parse_datetime(value).to_s + when *JSS::ExtensionAttribute::NUMERIC_TYPES + validate_integer_ea_value ea_name, value + else + value.to_s + end # case + + validate_popup_value(ea_name, value, refresh) if validate_popup_choice + + value + end + + # raise error if the value isn't an integer + def validate_integer_ea_value(ea_name, value) + if value.is_a? Integer + value + elsif value.to_s.jss_integer? + value.to_s.to_i + else + raise JSS::InvalidDataError, "The value for #{ea_name} must be an integer" + end # if + end + + # Raise an error if the named EA has a popup menu, + # but the provided value isn't one of the menu items + # + def validate_popup_value(ea_name, value, refresh) # get the ea def. instance from the api cache, or the api api.ext_attr_definition_cache[self.class] ||= {} - api.ext_attr_definition_cache[self.class][name] = nil if refresh - api.ext_attr_definition_cache[self.class][name] ||= self.class::EXT_ATTRIB_CLASS.fetch name: name, api: api + api.ext_attr_definition_cache[self.class][ea_name] = nil if refresh + api.ext_attr_definition_cache[self.class][ea_name] ||= self.class::EXT_ATTRIB_CLASS.fetch name: ea_name, api: api - ea_def = api.ext_attr_definition_cache[self.class][name] + ea_def = api.ext_attr_definition_cache[self.class][ea_name] return unless ea_def.from_popup_menu? return if ea_def.popup_choices.include? value.to_s - raise JSS::UnsupportedError, "The value for #{name} must be one of: '#{ea_def.popup_choices.join("' '")}'" + raise JSS::UnsupportedError, "The value for #{ea_name} must be one of: '#{ea_def.popup_choices.join("' '")}'" end end # module extendable end # module JSS