umlaut-primo 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -40,13 +40,13 @@
40
40
  # - table_of_contents
41
41
  # - referent_enhance
42
42
  # - highlighted_link
43
- #
43
+ #
44
44
  # base_url:: _required_ host and port of Primo server; used for Primo web services, deep links and holding_search
45
45
  # base_path:: *DEPRECATED* previous name of base_url
46
46
  # vid:: _required_ view id for Primo deep links and holding_search.
47
47
  # institution:: _required_ institution id for Primo institution; used for Primo web services
48
48
  # base_view_id:: *DEPRECATED* previous name of vid
49
- # holding_search_institution:: if service types include holding_search_ and the holding search institution is different from
49
+ # holding_search_institution:: if service types include holding_search_ and the holding search institution is different from
50
50
  # institution to be used for the holding_search
51
51
  # holding_search_text:: _optional_ text to display for the holding_search
52
52
  # default holding search text:: "Search for this title."
@@ -102,7 +102,7 @@
102
102
  # class_name: Source2Implementation (in exlibris/primo/sources or exlibris/primo/sources/local)
103
103
  # source2_config_option1: source2_config_option1
104
104
  # source2_config_option2: source2_config_option2
105
- #
105
+ #
106
106
  require 'exlibris-primo'
107
107
  class PrimoService < Service
108
108
 
@@ -166,99 +166,79 @@ class PrimoService < Service
166
166
 
167
167
  # Overwrites Service#handle.
168
168
  def handle(request)
169
- # Get the possible search params
170
- @identifier = request.referrer_id
171
- @record_id = record_id(request)
172
- @isbn = isbn(request)
173
- @issn = issn(request)
174
- @title = title(request)
175
- @author = author(request)
176
- @genre = genre(request)
177
- # Setup the Primo search object
178
- search = Exlibris::Primo::Search.new.base_url!(@base_url).institution!(@institution)
179
- # Search if we have a:
180
- # Primo record id OR
181
- # ISBN OR
182
- # ISSN OR
183
- # Title and author and genre
184
- if((not @record_id.blank?))
185
- search.record_id! @record_id
186
- elsif((not @isbn.blank?))
187
- search.isbn_is @isbn
188
- elsif((not @issn.blank?))
189
- search.isbn_is @issn
190
- elsif((not @title.blank?) and (not @author.blank?) and (not @genre.blank?))
191
- search.title_is(@title).creator_is(@author).any_is(@genre)
192
- else # Don't do a search.
193
- return request.dispatched(self, true)
194
- end
195
-
196
- begin
169
+ search = search(request)
170
+ return request.dispatched(self, true) if search.nil?
171
+ records = search.records
172
+ if records.blank? && /^dedupmrg/ === @record_id
173
+ @record_id = nil
174
+ search = search(request, true)
175
+ return request.dispatched(self, true) if search.nil?
197
176
  records = search.records
198
- # Enhance the referent with metadata from Primo Searcher if Primo record id, ISSN
199
- # or ISBN is present i.e. if we did our search with a Primo ID number
200
- if (not (@record_id.blank? and @issn.blank? and @isbn.blank?)) and @service_types.include?("referent_enhance")
201
- # We'll take the first record, since there should only be one.
202
- enhance_referent(request, records.first)
203
- end
204
- # Get cover image only if @record_id is defined
205
- # TODO: make cover image service smarter and only
206
- # include things that are actually URLs.
207
- # if @record_id and @service_types.include?("cover_image")
208
- # cover_image = primo_searcher.cover_image
209
- # unless cover_image.nil?
210
- # request.add_service_response(
211
- # :service => self,
212
- # :display_text => 'Cover Image',
213
- # :key => 'medium',
214
- # :url => cover_image,
215
- # :size => 'medium',
216
- # :service_type_value => :cover_image)
217
- # end
218
- # end
219
- # Add holding services
220
- if @service_types.include?("holding") or @service_types.include?("primo_source")
221
- # Get holdings from the returned Primo records
222
- holdings = records.collect{|record| record.holdings}.flatten
223
- # Add the holding services
224
- add_holding_services(request, holdings) unless holdings.empty?
225
- # Provide title search functionality in the absence of available holdings.
226
- # The logic below says only present the holdings search in the following case:
227
- # We've configured to present holding search
228
- # We didn't find any actual holdings
229
- # We didn't come from Primo (prevent round trips since that would be weird)
230
- # We have a title to search for.
231
- if @service_types.include?("holding_search") and holdings.empty? and (not primo_identifier?) and (not @title.nil?)
232
- # Add the holding search service
233
- add_holding_search_service(request)
234
- end
235
- end
236
- # Add fulltext services
237
- if @service_types.include?("fulltext")
238
- # Get fulltexts from the returned Primo records
239
- fulltexts = records.collect{|record| record.fulltexts}.flatten
240
- # Add the fulltext services
241
- add_fulltext_services(request, fulltexts) unless fulltexts.empty?
242
- end
243
- # Add table of contents services
244
- if @service_types.include?("table_of_contents")
245
- # Get tables of contents from the returned Primo records
246
- tables_of_contents = records.collect{|record| record.tables_of_contents}.flatten
247
- # Add the table of contents services
248
- add_table_of_contents_services(request, tables_of_contents) unless tables_of_contents.empty?
249
- end
250
- if @service_types.include?("highlighted_link")
251
- # Get related links from the returned Primo records
252
- highlighted_links = records.collect{|record| record.related_links}.flatten
253
- add_highlighted_link_services(request, highlighted_links) unless highlighted_links.empty?
177
+ end
178
+ # Enhance the referent with metadata from Primo Searcher if Primo record id, ISSN
179
+ # or ISBN is present i.e. if we did our search with a Primo ID number
180
+ if (@record_id.present? || @issn.present? || @isbn.present?) && @service_types.include?("referent_enhance")
181
+ # We'll take the first record, since there should only be one.
182
+ enhance_referent(request, records.first)
183
+ end
184
+ # Get cover image only if @record_id is defined
185
+ # TODO: make cover image service smarter and only
186
+ # include things that are actually URLs.
187
+ # if @record_id and @service_types.include?("cover_image")
188
+ # cover_image = primo_searcher.cover_image
189
+ # unless cover_image.nil?
190
+ # request.add_service_response(
191
+ # :service => self,
192
+ # :display_text => 'Cover Image',
193
+ # :key => 'medium',
194
+ # :url => cover_image,
195
+ # :size => 'medium',
196
+ # :service_type_value => :cover_image)
197
+ # end
198
+ # end
199
+ # Add holding services
200
+ if @service_types.include?("holding") || @service_types.include?("primo_source")
201
+ # Get holdings from the returned Primo records
202
+ holdings = records.collect{|record| record.holdings}.flatten
203
+ # Add the holding services
204
+ add_holding_services(request, holdings) unless holdings.empty?
205
+ # Provide title search functionality in the absence of available holdings.
206
+ # The logic below says only present the holdings search in the following case:
207
+ # We've configured to present holding search
208
+ # We didn't find any actual holdings
209
+ # We didn't come from Primo (prevent round trips since that would be weird)
210
+ # We have a title to search for.
211
+ if @service_types.include?("holding_search") and holdings.empty? and (not primo_identifier?) and (not @title.nil?)
212
+ # Add the holding search service
213
+ add_holding_search_service(request)
254
214
  end
255
- rescue Exception => e
256
- # Log error and return finished
257
- Rails.logger.error(
258
- "Error in Exlibris::Primo::Search. "+
259
- "Returning 0 Primo services for search #{search.inspect}. "+
260
- "Exlibris::Primo::Search raised the following exception:\n#{e}\n#{e.backtrace.inspect}")
261
215
  end
216
+ # Add fulltext services
217
+ if @service_types.include?("fulltext")
218
+ # Get fulltexts from the returned Primo records
219
+ fulltexts = records.collect{|record| record.fulltexts}.flatten
220
+ # Add the fulltext services
221
+ add_fulltext_services(request, fulltexts) unless fulltexts.empty?
222
+ end
223
+ # Add table of contents services
224
+ if @service_types.include?("table_of_contents")
225
+ # Get tables of contents from the returned Primo records
226
+ tables_of_contents = records.collect{|record| record.tables_of_contents}.flatten
227
+ # Add the table of contents services
228
+ add_table_of_contents_services(request, tables_of_contents) unless tables_of_contents.empty?
229
+ end
230
+ if @service_types.include?("highlighted_link")
231
+ # Get related links from the returned Primo records
232
+ highlighted_links = records.collect{|record| record.related_links}.flatten
233
+ add_highlighted_link_services(request, highlighted_links) unless highlighted_links.empty?
234
+ end
235
+ rescue Exception => e
236
+ # Log error and return finished
237
+ Rails.logger.error(
238
+ "Error in Exlibris::Primo::Search. "+
239
+ "Returning 0 Primo services for request #{request.inspect}. "+
240
+ "Exlibris::Primo::Search raised the following exception:\n#{e}\n#{e.backtrace.inspect}")
241
+ ensure
262
242
  return request.dispatched(self, true)
263
243
  end
264
244
 
@@ -287,6 +267,37 @@ class PrimoService < Service
287
267
  end
288
268
  protected :deep_link_search_url
289
269
 
270
+ def search(request, skip_id = false)
271
+ # Get the possible search params
272
+ @identifier = request.referrer_id
273
+ @record_id = record_id(request) unless skip_id
274
+ @isbn = isbn(request)
275
+ @issn = issn(request)
276
+ @title = title(request)
277
+ @author = author(request)
278
+ @genre = genre(request)
279
+ # Setup the Primo search object
280
+ search = Exlibris::Primo::Search.new.base_url!(@base_url).institution!(@institution)
281
+ # Search if we have a:
282
+ # Primo record id OR
283
+ # ISBN OR
284
+ # ISSN OR
285
+ # Title and author and genre
286
+ if(@record_id.present?)
287
+ search.record_id! @record_id
288
+ elsif(@isbn.present?)
289
+ search.isbn_is @isbn
290
+ elsif(@issn.present?)
291
+ search.isbn_is @issn
292
+ elsif(@title.present? && @author.present? && @genre.present?)
293
+ search.title_is(@title).creator_is(@author).any_is(@genre)
294
+ else
295
+ return nil
296
+ end
297
+ search
298
+ end
299
+ private :search
300
+
290
301
  # Configure Primo if this is the first time through
291
302
  def configure_primo
292
303
  Exlibris::Primo.configure { |primo_config|
@@ -507,4 +518,4 @@ class PrimoService < Service
507
518
  return @identifier.start_with?('info:sid/primo.exlibrisgroup.com')
508
519
  end
509
520
  private :primo_identifier?
510
- end
521
+ end
@@ -1,3 +1,3 @@
1
1
  module UmlautPrimo
2
- VERSION = "0.1.2"
3
- end
2
+ VERSION = "0.1.3"
3
+ end