Class: JSS::AdvancedSearch
- Includes:
- Creatable, Criteriable, Updatable
- Defined in:
- lib/jss.rb,
lib/jss/api_object/advanced_search.rb
Overview
A Parent class for Advanced Computer, MobileDevice, and User searchs
Subclasses must define:
-
the constant RESULT_CLASS which is the JSS Module class of the item returned by the search, e.g. JSS::Computer
-
the constant RESULT_ID_FIELDS, which is an Array of Symbols that come from the API in the search_results along with the symbolized display fields. E.g. for AdvancedComputerSearches, :id, :name, and :udid are present along with whatever display fields have been defined.
Direct Known Subclasses
AdvancedComputerSearch, AdvancedMobileDeviceSearch, AdvancedUserSearch
Constant Summary collapse
- EXPORT_FORMATS =
Class Constants
[:csv, :tab, :xml]
Instance Attribute Summary collapse
-
#criteria ⇒ JSS::Criteriable::Criteria
included
from Criteriable
The criteria for the instance into which we’re mixed.
-
#need_to_update ⇒ Boolean
included
from Updatable
readonly
Do we have unsaved changes?.
-
#result_display_keys ⇒ Array<Symbol>
readonly
The search result Hash keys for the #display_fields of the search.
-
#search_results ⇒ Array<Hash>
readonly
Each Hash is one object that matches the criteria.
-
#site ⇒ String
readonly
The name of the site for this search.
-
#sql_text ⇒ String
readonly
The SQL query generated by the JSS based on the critera.
Instance Method Summary collapse
-
#clone(new_name) ⇒ APIObject
included
from Creatable
make a clone of this API object, with a new name.
-
#count ⇒ Integer
The number of items found by the search.
-
#create(get_results = false) ⇒ Integer
Create in the JSS.
-
#display_fields ⇒ Array<String>
The API delivers these as an array of Hashes, where each hash has only one key, :name => the name of the fields/ExtAttrib to display.
-
#display_fields=(new_val) ⇒ Object
Set the list of fields to be retrieved with the search results.
-
#export(output_file, format = :csv, overwrite = false) ⇒ Pathname
Export the display fields of the search results to a file.
-
#initialize(args = {}) ⇒ AdvancedSearch
constructor
A new instance of AdvancedSearch.
-
#name=(newname) ⇒ void
included
from Updatable
Change the name of this item Remember to #update to push changes to the server.
-
#parse_criteria ⇒ void
included
from Criteriable
During initialization, convert the @init_data Hash into a JSS::Criteriable::Criteria instance stored in @criteria.
-
#requery_search_results ⇒ Array<Hash>
Requery the API for the search results.
-
#should_update ⇒ void
included
from Criteriable
private
Allow our Criteria to tell us when there’s been a change that needs to be updated.
-
#update(get_results = false) ⇒ Integer
Save any changes.
Constructor Details
#initialize(args = {}) ⇒ AdvancedSearch
Returns a new instance of AdvancedSearch.
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/jss/api_object/advanced_search.rb', line 132 def initialize(args = {}) super args ### @init_data now has the raw data ### so fill in our attributes or set defaults @sql_text = @init_data[:sql_text] @site = JSS::APIObject.get_name(@init_data[:site]) @display_fields = @init_data[:display_fields] ? @init_data[:display_fields].map{|f| f[:name]} : [] @search_results = @init_data[self.class::RESULT_CLASS::RSRC_LIST_KEY] @search_results ||= [] if @search_results.empty? @result_display_keys =[] else @result_display_keys = @search_results[0].keys - self.class::RESULT_ID_FIELDS end # make sure each hash of the search results # has a key matching a standard key. # @search_results.each do |hash| hash.keys.each do |key| std_key = key.to_s.gsub(/ |-/,"_").to_sym next if hash[std_key] hash[std_key] = hash[key] end end parse_criteria end |
Instance Attribute Details
#criteria ⇒ JSS::Criteriable::Criteria Originally defined in module Criteriable
Returns the criteria for the instance into which we’re mixed.
#need_to_update ⇒ Boolean (readonly) Originally defined in module Updatable
Returns do we have unsaved changes?.
#result_display_keys ⇒ Array<Symbol> (readonly)
The search result Hash keys for the #display_fields of the search
The field names in #display_fields are strings matching how the field is labeled in the web UI (including the names of Extension Attributes). They have to be that way when submitting them to the API, and thats mostly what #display_fields and related methods are for.
However, when those names come back as the Hash Keys of the #search_results they (inconsistently) have spaces and/or dashes converted to underscores, and, the JSON module converts the keys to Symbols, so they don’t match the #display_fields.
For example, the display field “Last Check-in” might come back as any of these Symbols:
-
:“Last Check-in”
-
:Last_Check_in
-
:“Last_Check-in”
Also, the data returned in the #search_results contains more keys than just the #display_fields - namely it comes with some standard identifiers for each found item. such as JSS id number and name.
#result_display_keys will hold just the Hash keys corresponding to the #display_fields by taking the keys from the first result Hash, and removing the identifier keys as listed in each subclass’s RESULT_ID_FIELDS constant.
117 118 119 |
# File 'lib/jss/api_object/advanced_search.rb', line 117 def result_display_keys @result_display_keys end |
#search_results ⇒ Array<Hash> (readonly)
Each Hash is one object that matches the criteria. Within each hash there are variable keys, but always at least the keys defined in each subclasses RESULT_ID_FIELDS
The other keys correspond to the #display_fields defined for this Advanced Search.
89 90 91 |
# File 'lib/jss/api_object/advanced_search.rb', line 89 def search_results @search_results end |
#site ⇒ String (readonly)
Returns the name of the site for this search.
120 121 122 |
# File 'lib/jss/api_object/advanced_search.rb', line 120 def site @site end |
#sql_text ⇒ String (readonly)
Returns the SQL query generated by the JSS based on the critera.
123 124 125 |
# File 'lib/jss/api_object/advanced_search.rb', line 123 def sql_text @sql_text end |
Instance Method Details
#clone(new_name) ⇒ APIObject Originally defined in module Creatable
make a clone of this API object, with a new name. The class must be creatable
#count ⇒ Integer
Returns the number of items found by the search.
277 278 279 |
# File 'lib/jss/api_object/advanced_search.rb', line 277 def count @search_results.count end |
#create(get_results = false) ⇒ Integer
Create in the JSS
If get_results is true, they’ll be available in #search_results. This might be slow.
183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/jss/api_object/advanced_search.rb', line 183 def create(get_results = false) raise JSS::InvalidDataError, "JSS::Criteriable::Criteria instance required" unless @criteria.kind_of? JSS::Criteriable::Criteria raise JSS::InvalidDataError, "display_fields must be an Array." unless @display_fields.kind_of? Array orig_timeout = JSS::API.cnx.[:timeout] JSS::API.timeout = 1800 super() requery_search_results if get_results JSS::API.timeout = orig_timeout @id # remember to return the id end |
#display_fields ⇒ Array<String>
The API delivers these as an array of Hashes, where each hash has only one key, :name => the name of the fields/ExtAttrib to display. It should probably not have the underlying Hashes, and just be an array of names. This class converts it to just an Array of field names (Strings) for internal use.
These fields are returned in the @search_results data along with :id, :name, and other unique identifiers for each found item. In that data, their names have spaces and dashes converted to underscores, and they are symbolized.
255 256 257 |
# File 'lib/jss/api_object/advanced_search.rb', line 255 def display_fields @display_fields end |
#display_fields=(new_val) ⇒ Object
Set the list of fields to be retrieved with the search results.
265 266 267 268 269 270 |
# File 'lib/jss/api_object/advanced_search.rb', line 265 def display_fields= (new_val) raise JSS::InvalidDataError, "display_fields must be an Array." unless new_val.kind_of? Array return if new_val.sort == @display_fields.sort @display_fields = new_val @need_to_update = true end |
#export(output_file, format = :csv, overwrite = false) ⇒ Pathname
This method only exports the display fields defined in this advanced search for
Export the display fields of the search results to a file.
the search_result members (computers, mobile_devices, or users) It doesn’t currently provide the ability to export subsets of info about those objects, as the Web UI does (e.g. group memberships, applications, receipts, etc)
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 |
# File 'lib/jss/api_object/advanced_search.rb', line 297 def export(output_file, format = :csv, overwrite = false) raise JSS::InvalidDataError, "Export format must be one of: :#{EXPORT_FORMATS.join ', :'}" unless EXPORT_FORMATS.include? format out = Pathname.new output_file unless overwrite raise JSS::AlreadyExistsError, "The output file already exists: #{out}" if out.exist? end case format when :csv require 'csv' CSV.open(out.to_s, 'wb') do |csv| csv << @result_display_keys @search_results.each do |row| csv << @result_display_keys.map {|key| row[key]} end # each do row end #CSV.open when :tab tabbed = @result_display_keys.join("\t") + "\n" @search_results.each do |row| tabbed << @result_display_keys.map {|key| row[key]}.join("\t") + "\n" end # each do row out.jss_save tabbed.chomp else # :xml doc = REXML::Document.new '<?xml version="1.0" encoding="ISO-8859-1"?>' members = doc.add_element self.class::RESULT_CLASS::RSRC_LIST_KEY.to_s @search_results.each do |row| member = members.add_element self.class::RESULT_CLASS::RSRC_OBJECT_KEY.to_s @result_display_keys.each do |field| member.add_element(field.to_s.gsub(' ',"_")).text = row[field].empty? ? nil : row[field] end # ech do field end #each do row out.jss_save doc.to_s.gsub('><', ">\n<") end # case return out end |
#name=(newname) ⇒ void Originally defined in module Updatable
This method returns an undefined value.
Change the name of this item Remember to #update to push changes to the server.
#parse_criteria ⇒ void Originally defined in module Criteriable
This method returns an undefined value.
During initialization, convert the @init_data Hash into a JSS::Criteriable::Criteria instance stored in @criteria
Classes mixing in this module must call this in #initialize
#requery_search_results ⇒ Array<Hash>
Requery the API for the search results.
This can be very slow, so temporarily reset the API timeout to 30 minutes
224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
# File 'lib/jss/api_object/advanced_search.rb', line 224 def requery_search_results orig_open_timeout = JSS::API.cnx.[:open_timeout] orig_timeout = JSS::API.cnx.[:timeout] JSS::API.timeout = 1800 JSS::API.open_timeout = 1800 begin requery = self.class.new(:id => @id) @search_results = requery.search_results @result_display_keys = requery.result_display_keys ensure JSS::API.timeout = orig_timeout JSS::API.open_timeout = orig_open_timeout end end |
#should_update ⇒ void Originally defined in module Criteriable
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Allow our Criteria to tell us when there’s been a change that needs to be updated.
#update(get_results = false) ⇒ Integer
Save any changes
If get_results is true, they’ll be available in #search_results. This might be slow.
206 207 208 209 210 211 212 213 214 |
# File 'lib/jss/api_object/advanced_search.rb', line 206 def update(get_results = false) orig_timeout = JSS::API.cnx.[:timeout] JSS::API.timeout = 1800 super() requery_search_results if get_results JSS::API.timeout = orig_timeout @id # remember to return the id end |