uw_catalog 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/uw_catalog.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'rubygems'
2
2
  require 'data_mapper'
3
3
  require 'yaml'
4
+ require 'marc'
4
5
 
5
6
  require 'uw_catalog/model/bib_data'
6
7
  require 'uw_catalog/model/location'
7
8
  require 'uw_catalog/model/holding'
9
+ require 'uw_catalog/model/holding_marc'
8
10
  require 'uw_catalog/model/item'
9
11
  require 'uw_catalog/model/items_listing'
10
12
  require 'uw_catalog/voyager_sql'
@@ -47,18 +47,42 @@ module UwCatalog
47
47
  end
48
48
  end
49
49
 
50
+ def library_has
51
+ ret = Hash.new
52
+ marc = HoldingMarc.new(@id)
53
+ val = marc.bound_copies
54
+ ret[:bound_copies] = val unless (val.nil? or val.empty?)
55
+ val = marc.indexes
56
+ ret[:indexes] = val unless (val.nil? or val.empty?)
57
+ val = marc.supplements
58
+ ret[:supplements] = val unless (val.nil? or val.empty?)
59
+ ret
60
+ end
61
+
50
62
  def get_items_display(concise = false)
51
63
  ret = Hash.new
52
64
  return ret unless items.size > 0
53
65
 
54
- status_list = Array.new
66
+ ret.merge!(library_has)
67
+
68
+ status_list = item_statuses(concise)
69
+ ret[:status] = status_list
70
+
71
+ ret
72
+ end
73
+
74
+
75
+ def item_statuses(concise)
76
+ status_list = Array.new
77
+ return status_list unless items.size > 0
55
78
 
56
79
  items.each do |item|
57
80
  status_available, status_text = get_status(item)
58
81
  status_list << {:item_id => item.id, :status_text => status_text,
59
- :available => status_available, :copy_number=> item.copy_number,
82
+ :available => status_available, :copy_number=> item.copy_number,
60
83
  :item_enum => item.item_enum}
61
84
  end
85
+
62
86
  if (concise)
63
87
  total_count = status_list.size
64
88
  status_list.keep_if{|i| i[:available] == false}.compact
@@ -68,8 +92,6 @@ module UwCatalog
68
92
  end
69
93
 
70
94
  status_list.sort! {|a,b| a[:item_enum].to_s <=> b[:item_enum].to_s} unless status_list.size < 1
71
- ret[:status] = status_list
72
- ret
73
95
  end
74
96
 
75
97
  def get_status(item)
@@ -0,0 +1,599 @@
1
+ module UwCatalog
2
+ class HoldingMarc
3
+
4
+ @@year_captions = ['(year)', '(Year)', 'year', '(year covered)']
5
+ @@month_captions = ['(month)', 'mo']
6
+ @@day_captions = ['(day)']
7
+ @@season_captions = ['(season)']
8
+
9
+ attr_reader :holding_id, :record
10
+
11
+ def initialize(holding_id)
12
+ @holding_id = holding_id
13
+ to_marc
14
+ end
15
+
16
+ def marc_record
17
+ @record
18
+ end
19
+
20
+ def bound_copies
21
+ bound_copies_internal
22
+ end
23
+
24
+ def indexes
25
+ indexes_internal
26
+ end
27
+
28
+ def indexes
29
+ indexes_internal
30
+ end
31
+
32
+ def supplements
33
+ supplements_internal
34
+ end
35
+
36
+
37
+
38
+ def new_issues
39
+ issues_received(0)
40
+ end
41
+
42
+ def issues_received(category)
43
+ sql = "select serial_issues.enumchron " +
44
+ "from line_item_copy_status " +
45
+ "inner join subscription on line_item_copy_status.line_item_id = subscription.line_item_id " +
46
+ "inner join component on subscription.subscription_id = component.subscription_id " +
47
+ "inner join serial_issues on component.component_id = serial_issues.component_id " +
48
+ "inner join issues_received on issues_received.issue_id = serial_issues.issue_id and component.component_id = issues_received.component_id " +
49
+ "where line_item_copy_status.mfhd_id = ? " +
50
+ "and component.category = ? " +
51
+ "and serial_issues.received = 1 " +
52
+ "and issues_received.opac_suppressed = 1"
53
+ repository(:UW).adapter.select(sql, @holding_id, category)
54
+ end
55
+
56
+ def to_marc
57
+ if @record.nil?
58
+ @record = MARC::Record.new_from_marc(marc_stream)
59
+ end
60
+ @record
61
+ end
62
+
63
+ def marc_stream
64
+ marc_stream = ''
65
+ sql = "select mfhd_data.record_segment from mfhd_master, mfhd_data where mfhd_master.mfhd_id=? and " +
66
+ " mfhd_master.mfhd_id = mfhd_data.mfhd_id"
67
+ mfhd_data_segments = repository(:UW).adapter.select(sql, @holding_id)
68
+ mfhd_data_segments.each do |segment|
69
+ marc_stream << segment
70
+ end
71
+ marc_stream
72
+ end
73
+
74
+
75
+ def classification_part
76
+ @record = to_marc
77
+ if @record['852'] and @record['852']['h']
78
+ @record['852']['h']
79
+ else
80
+ nil
81
+ end
82
+ end
83
+
84
+ def location_code
85
+ @record['852']['b']
86
+ end
87
+
88
+ def indexes_internal
89
+ indexes_key_ordered_hash = Hash.new
90
+ indexes = Array.new
91
+
92
+ caption_and_pattern = get_caption_and_pattern_hash(@record, '855')
93
+ @record.find_all {|field| field.tag == '865' or field.tag == '868'}.each do |field|
94
+
95
+ if field.tag == '868'
96
+
97
+ # I don't trust that the data in subfield $8 will always be numeric floats.
98
+ begin
99
+ key = "%04d" % field['8'].to_i
100
+ str = field['a']
101
+ str += " " + field['z'] if field['z']
102
+ indexes_key_ordered_hash[key] = str
103
+ rescue
104
+ # Move on and don't include the data if it is improperly coded.
105
+ end
106
+
107
+ # Full blown MARC Format Holdings Data. Oy!
108
+ elsif field.tag == '865'
109
+
110
+ link_and_sequence = field['8']
111
+
112
+ if link_and_sequence
113
+ link = link_and_sequence.split('.')[0]
114
+ sequence = link_and_sequence.split('.')[1]
115
+
116
+ # Make sure that we know which caption/pattern to link to before processing the 865 field
117
+ if caption_and_pattern[link]
118
+
119
+ # Parse the data
120
+ enum_chron_hash = Hash.new
121
+ add_field_chronology_data_to_enum_chron_hash(caption_and_pattern, link, enum_chron_hash, field)
122
+ add_field_enumeration_data_to_enum_chron_hash(caption_and_pattern, link, enum_chron_hash, field)
123
+
124
+ # Format it
125
+ str = get_enum_chron_type_of_unit_and_notes(enum_chron_hash, field)
126
+
127
+ # I don't trust that the data in subfield $8 will always be numeric floats.
128
+ begin
129
+ key = ("%04d" % link.to_i) + "-" + ("%04d" % sequence.to_i)
130
+ indexes_key_ordered_hash[key] = str.strip
131
+ rescue
132
+ # Move on and don't include the data if it is improperly coded.
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ indexes_key_ordered_hash.keys.sort.each {|key| indexes << indexes_key_ordered_hash[key] }
140
+
141
+ issues_received(2).each { |new_index| indexes << new_index }
142
+
143
+ indexes
144
+ end
145
+
146
+ def supplements_internal
147
+ supplements_key_ordered_hash = Hash.new
148
+ supplements = Array.new
149
+
150
+ caption_and_pattern = get_caption_and_pattern_hash(@record, '854')
151
+ @record.find_all {|field| field.tag == '864' or field.tag == '867'}.each do |field|
152
+
153
+ if field.tag == '867'
154
+
155
+ # I don't trust that the data in subfield $8 will always be numeric floats.
156
+ begin
157
+ key = "%04d" % field['8'].to_i
158
+ str = field['a']
159
+ str += " " + field['z'] if field['z']
160
+ supplements_key_ordered_hash[key] = str
161
+ rescue
162
+ # Move on and don't include the data if it is improperly coded.
163
+ end
164
+
165
+ # Full blown MARC Format Holdings Data. Oy!
166
+ elsif field.tag == '864'
167
+
168
+ link_and_sequence = field['8']
169
+ if link_and_sequence
170
+
171
+ link = link_and_sequence.split('.')[0]
172
+ sequence = link_and_sequence.split('.')[1]
173
+
174
+ # Parse the data
175
+ enum_chron_hash = Hash.new
176
+ add_field_chronology_data_to_enum_chron_hash(caption_and_pattern, link, enum_chron_hash, field)
177
+ add_field_enumeration_data_to_enum_chron_hash(caption_and_pattern, link, enum_chron_hash, field)
178
+
179
+ # Format it
180
+ str = get_enum_chron_type_of_unit_and_notes(enum_chron_hash, field)
181
+
182
+ # I don't trust that the data in subfield $8 will always be numeric floats.
183
+ begin
184
+ key = ("%04d" % link.to_i) + "-" + ("%04d" % sequence.to_i)
185
+ supplements_key_ordered_hash[key] = str.strip
186
+ rescue
187
+ # Move on and don't include the data if it is improperly coded.
188
+ end
189
+ end
190
+ end
191
+ end
192
+
193
+ supplements_key_ordered_hash.keys.sort.each {|key| supplements << supplements_key_ordered_hash[key] }
194
+
195
+ issues_received(1).each { |new_supplement| supplements << new_supplement }
196
+
197
+ supplements
198
+ end
199
+
200
+ def get_enum_chron_type_of_unit_and_notes(enum_chron_hash, field)
201
+ str = ''
202
+ str += get_formatted_enumeration_info(enum_chron_hash)
203
+ str += " (#{get_formatted_chronology_info(enum_chron_hash)})" unless get_formatted_chronology_info(enum_chron_hash).strip == ""
204
+ enum_chron_hash[:type_of_unit] = field['o'] if field['o']
205
+ if enum_chron_hash[:type_of_unit]
206
+ str = remove_trailing_punctuation(str)
207
+ str += ", " unless str.strip == ""
208
+ str += enum_chron_hash[:type_of_unit]
209
+ end
210
+ enum_chron_hash[:notes] = field['z'] if field['z']
211
+ if enum_chron_hash[:notes]
212
+ str = remove_trailing_punctuation(str)
213
+ str += ", " + enum_chron_hash[:notes]
214
+ end
215
+ str
216
+ end
217
+
218
+ # remove trailing punctuation
219
+ def remove_trailing_punctuation(str)
220
+ str.strip!
221
+ if str.match(/[\/:,.]$/)
222
+ str[0,str.length - 1].strip
223
+ else
224
+ str.strip
225
+ end
226
+ end
227
+
228
+ # Get a hash that indicates which subfields hold volume, issue, year, month
229
+ # and day info.
230
+ def get_caption_and_pattern_hash(record, field_number)
231
+ caption_and_pattern = Hash.new
232
+ record.find_all {|field| field.tag == field_number}.each do |field|
233
+ caption_and_pattern[field['8']] = Hash.new
234
+ caption_and_pattern[field['8']][:chronology] = Hash.new
235
+
236
+ # Locate the chronology subfields
237
+ field.subfields.each do |subfield|
238
+ caption_and_pattern[field['8']][:chronology][:year] = subfield.code if @@year_captions.include?(subfield.value)
239
+ caption_and_pattern[field['8']][:chronology][:month] = subfield.code if @@month_captions.include?(subfield.value)
240
+ caption_and_pattern[field['8']][:chronology][:day] = subfield.code if @@day_captions.include?(subfield.value)
241
+ caption_and_pattern[field['8']][:chronology][:season] = subfield.code if @@season_captions.include?(subfield.value)
242
+ end
243
+
244
+ # Unless the chronology data is in subfield $a...
245
+ #
246
+ # From MARC Holdongs:
247
+ #
248
+ # When only Chronology captions are used on an item (that is, the item carries no enumeration),
249
+ # the Chronology captions are contained in the relevant enumeration caption subfields ($a-$h).
250
+ # If a Chronology caption is not to be used in a display of the 863-865 Enumeration and Chronology
251
+ # field, it is enclosed in parentheses, for example, (year).
252
+ #
253
+ # 853 03$81$a(year)
254
+ # 863 40$81.1$a1964-1981
255
+ # [An annual publication identified only by year.]
256
+ unless caption_and_pattern[field['8']][:chronology].values.include?('a')
257
+ # Create a Hash to hold the enum captions
258
+ caption_and_pattern[field['8']][:enumeration] = Hash.new
259
+
260
+ # Locate the enumeration subfields
261
+ caption_and_pattern[field['8']][:enumeration][:enum_level_1_caption] = field['a']
262
+ caption_and_pattern[field['8']][:enumeration][:enum_level_2_caption] = field['b']
263
+ caption_and_pattern[field['8']][:enumeration][:enum_level_1_caption_alt] = field['g']
264
+ caption_and_pattern[field['8']][:enumeration][:enum_level_2_caption_alt] = field['h']
265
+ end
266
+ end
267
+ caption_and_pattern
268
+ end
269
+
270
+ def add_field_chronology_data_to_enum_chron_hash(caption_and_pattern, link, enumeration_hash, field)
271
+
272
+ # To handle the possibility of missing caption and pattern fields...
273
+ if caption_and_pattern[link]
274
+
275
+ enumeration_hash[:start_year] = field[caption_and_pattern[link][:chronology][:year]].split('-').first if field[caption_and_pattern[link][:chronology][:year]]
276
+ enumeration_hash[:end_year] = field[caption_and_pattern[link][:chronology][:year]].split('-').last if field[caption_and_pattern[link][:chronology][:year]]
277
+ enumeration_hash[:start_month] = field[caption_and_pattern[link][:chronology][:month]].split('-').first if field[caption_and_pattern[link][:chronology][:month]]
278
+ enumeration_hash[:end_month] = field[caption_and_pattern[link][:chronology][:month]].split('-').last if field[caption_and_pattern[link][:chronology][:month]]
279
+ enumeration_hash[:start_day] = field[caption_and_pattern[link][:chronology][:day]].split('-').first if field[caption_and_pattern[link][:chronology][:day]]
280
+ enumeration_hash[:end_day] = field[caption_and_pattern[link][:chronology][:day]].split('-').last if field[caption_and_pattern[link][:chronology][:day]]
281
+ enumeration_hash[:season] = field[caption_and_pattern[link][:chronology][:season]] if field[caption_and_pattern[link][:chronology][:season]]
282
+ end
283
+ end
284
+
285
+ def add_field_enumeration_data_to_enum_chron_hash(caption_and_pattern, link, enumeration_hash, field)
286
+
287
+ # To handle the possibility of missing caption and pattern fields...
288
+ if caption_and_pattern[link]
289
+ if field['a'] and caption_and_pattern[link][:enumeration] and caption_and_pattern[link][:enumeration][:enum_level_1_caption] #and (field['a'] or field['g'])
290
+ enumeration_hash[:enum_level_1_caption] = caption_and_pattern[link][:enumeration][:enum_level_1_caption]
291
+ enumeration_hash[:enum_level_1_start] = field['a'].split('-').first
292
+ enumeration_hash[:enum_level_1_end] = field['a'].split('-').last
293
+ end
294
+
295
+ if caption_and_pattern[link][:enumeration] and caption_and_pattern[link][:enumeration][:enum_level_2_caption] and (field['b'] or field['h'])
296
+ enumeration_hash[:enum_level_2_caption] = caption_and_pattern[link][:enumeration][:enum_level_2_caption]
297
+
298
+ if field['b']
299
+ enumeration_hash[:enum_level_2_start] = field['b'].split('-', 2).first
300
+ enumeration_hash[:enum_level_2_end] = field['b'].split('-', 2).last
301
+ end
302
+ end
303
+
304
+ if field['g'] and caption_and_pattern[link][:enumeration] and caption_and_pattern[link][:enumeration][:enum_level_1_caption_alt]
305
+ enumeration_hash[:alt_enum_level_1_caption] = caption_and_pattern[link][:enumeration][:enum_level_1_caption_alt]
306
+ enumeration_hash[:alt_enum_level_1_start] = field['g'].split('-').first
307
+ enumeration_hash[:alt_enum_level_1_end] = field['g'].split('-').last
308
+ end
309
+
310
+ if field['h']
311
+ begin
312
+ raise("#{Time.now.strftime("%D %T")} Invalid enum link for: #{self.mfhd_id}") if caption_and_pattern[link][:enumeration].nil?
313
+ enumeration_hash[:alt_enum_level_2_caption] = caption_and_pattern[link][:enumeration][:enum_level_2_caption_alt]
314
+ enumeration_hash[:alt_enum_level_2_start] = field['h'].split('-').first
315
+ enumeration_hash[:alt_enum_level_2_end] = field['h'].split('-').last
316
+
317
+ rescue Exception => ex
318
+ enumeration_hash[:alt_enum_level_2_caption] = ""
319
+ File.open("log/cataloging_errors.log", "a") {|f| f.puts ex}
320
+ end
321
+ end
322
+ end
323
+ end
324
+
325
+ def bound_copies_internal
326
+ # This Hash stores all the enumeration chronology Strings for a given holdings record.
327
+ # The Hash keys will sort to the correct order.
328
+ bound_copies_key_ordered_hash = Hash.new
329
+ # This Array will be returned containing the enumeration chronology Strings.
330
+ bound_copies = Array.new
331
+
332
+ caption_and_pattern = get_caption_and_pattern_hash(@record, '853')
333
+ @record.find_all {|field| field.tag == '863' or field.tag == '866'}.each do |field|
334
+
335
+ # Freetext holdings field
336
+ if field.tag == '866'
337
+
338
+ # I don't trust that the data in subfield $8 will always be numeric floats.
339
+ begin
340
+ key = "%04d" % field['8'].to_i
341
+ raise("#{Time.now.strftime("%D %T")} Invalid 866 for: #{self.mfhd_id}") if field['a'].nil?
342
+ str = field['a']
343
+ str += " " + field['z'] if field['z']
344
+ bound_copies_key_ordered_hash[key] = str
345
+ rescue Exception => ex
346
+ File.open("log/cataloging_errors.log", "a") {|f| f.puts ex}
347
+ # Move on and don't include the data if it is improperly coded.
348
+ end
349
+
350
+ # Full blown MARC Format Holdings Data. Oy!
351
+ elsif field.tag == '863'
352
+
353
+ # Use the $8 field to determine which 853 caption each field links to.
354
+ link_and_sequence = field['8']
355
+ if link_and_sequence
356
+ link = link_and_sequence.split('.')[0]
357
+ sequence = link_and_sequence.split('.')[1]
358
+
359
+ # Build the enumeration_hash that will be used to format the data
360
+ enum_chron_hash = Hash.new
361
+ add_field_chronology_data_to_enum_chron_hash(caption_and_pattern, link, enum_chron_hash, field)
362
+ add_field_enumeration_data_to_enum_chron_hash(caption_and_pattern, link, enum_chron_hash, field)
363
+
364
+ # Format the data in the enumeration Hash into a human readable String
365
+ str = get_enum_chron_type_of_unit_and_notes(enum_chron_hash, field)
366
+
367
+ # I don't trust that the data in subfield $8 will always be numeric floats.
368
+ begin
369
+ key = ("%04d" % link.to_i) + "-" + ("%04d" % sequence.to_i)
370
+ bound_copies_key_ordered_hash[key] = str.strip if str.strip != ""
371
+ rescue
372
+ # Move on and don't include the data if it is improperly coded.
373
+ end
374
+ end
375
+ end
376
+ end
377
+
378
+ bound_copies_key_ordered_hash.keys.sort.each {|key| bound_copies << bound_copies_key_ordered_hash[key] }
379
+
380
+
381
+ bound_copies
382
+ end
383
+
384
+ def additional_copies
385
+ record = to_marc
386
+ additional_copies = Array.new
387
+ record.find_all {|field| field.tag == '899'}.each do |field|
388
+ additional_copies << field['a'] if field['a']
389
+ end
390
+ additional_copies
391
+ end
392
+
393
+ # Takes a hash like the following:
394
+ #
395
+ # {
396
+ # :enum_level_1_caption => "v.",
397
+ # :enum_level_2_caption => "no.",
398
+ # :enum_level_1_start => "173", :enum_level_1_end => "173",
399
+ # :enum_level_2_start => "2", :enum_level_2_end => "26",
400
+ # :start_year => "2009", :end_year => "2009",
401
+ # :start_month => "1", :end_month => "6",
402
+ # :start_day => "19", :end_day => "29"
403
+ # }
404
+ #
405
+ # and returns a string like this:
406
+ #
407
+ # v. 173, no. 2 - v. 173, no. 26
408
+ def get_formatted_enumeration_info(enumeration_hash)
409
+ enum = ''
410
+
411
+ # With two levels of enumeration
412
+ if enumeration_hash[:enum_level_2_start]
413
+
414
+ # Single Issue
415
+ if enumeration_hash[:enum_level_2_start] == enumeration_hash[:enum_level_2_end] and
416
+ enumeration_hash[:enum_level_1_start] == enumeration_hash[:enum_level_1_end]
417
+ enum += "#{enumeration_hash[:enum_level_1_caption]} #{enumeration_hash[:enum_level_1_start]}, " if enumeration_hash[:enum_level_1_start]
418
+ enum += "no. #{enumeration_hash[:enum_level_2_start]}"
419
+ # Multiple issues in a single volume
420
+ elsif enumeration_hash[:enum_level_2_start] != enumeration_hash[:enum_level_2_end] and
421
+ enumeration_hash[:enum_level_1_start] == enumeration_hash[:enum_level_1_end]
422
+ enum += "#{enumeration_hash[:enum_level_1_caption]} #{enumeration_hash[:enum_level_1_start]}, " if enumeration_hash[:enum_level_1_start]
423
+ enum += "#{enumeration_hash[:enum_level_2_caption]} #{enumeration_hash[:enum_level_2_start]} - "
424
+ enum += "#{enumeration_hash[:enum_level_2_caption]} #{enumeration_hash[:enum_level_2_end]}"
425
+ # Issue Range
426
+ else
427
+ enum += "#{enumeration_hash[:enum_level_1_caption]} #{enumeration_hash[:enum_level_1_start]}, " if enumeration_hash[:enum_level_1_start]
428
+ enum += "#{enumeration_hash[:enum_level_2_caption]} #{enumeration_hash[:enum_level_2_start]} - "
429
+ enum += "#{enumeration_hash[:enum_level_1_caption]} #{enumeration_hash[:enum_level_1_end]}, " if enumeration_hash[:enum_level_1_end]
430
+ enum += "#{enumeration_hash[:enum_level_2_caption]} #{enumeration_hash[:enum_level_2_end]}"
431
+ end
432
+
433
+ # First Level Enumeration Only
434
+ elsif enumeration_hash[:enum_level_1_start]
435
+ if enumeration_hash[:enum_level_1_start] == enumeration_hash[:enum_level_1_end]
436
+ enum += "#{enumeration_hash[:enum_level_1_caption]} #{enumeration_hash[:enum_level_1_start]}"
437
+ else
438
+ enum += "#{enumeration_hash[:enum_level_1_caption]} #{enumeration_hash[:enum_level_1_start]}"
439
+ enum += " - #{enumeration_hash[:enum_level_1_caption]} #{enumeration_hash[:enum_level_1_end]}" if enumeration_hash[:enum_level_1_end]
440
+ end
441
+
442
+ # Hacked data like this:
443
+ # 854 00 $8 2 $a Building for a secure future $i (year)
444
+ # 864 40 $8 2.1 $a $i 2001-2004
445
+ # Notice that there is a free text caption with no data
446
+ elsif enumeration_hash[:enum_level_1_caption] and !enumeration_hash[:enum_level_1_start]
447
+ enum += enumeration_hash[:enum_level_1_caption]
448
+ end
449
+
450
+ if enumeration_hash[:alt_enum_level_1_start]
451
+ enum += " (#{enumeration_hash[:alt_enum_level_1_caption]} "
452
+
453
+ if enumeration_hash[:alt_enum_level_1_start] == enumeration_hash[:alt_enum_level_1_end]
454
+ enum += "#{enumeration_hash[:alt_enum_level_1_start]}"
455
+ else
456
+ enum += "#{enumeration_hash[:alt_enum_level_1_start]}"
457
+ enum += "-#{enumeration_hash[:alt_enum_level_1_end]}" if enumeration_hash[:alt_enum_level_1_end]
458
+ end
459
+
460
+ if enumeration_hash[:alt_enum_level_2_start]
461
+ enum += ", #{enumeration_hash[:alt_enum_level_2_caption]} "
462
+ if enumeration_hash[:alt_enum_level_2_start] == enumeration_hash[:alt_enum_level_2_end]
463
+ enum += "#{enumeration_hash[:alt_enum_level_2_start]}"
464
+ else
465
+ enum += "#{enumeration_hash[:alt_enum_level_2_start]}"
466
+ enum += "-#{enumeration_hash[:alt_enum_level_2_end]}" if enumeration_hash[:alt_enum_level_2_end]
467
+ end
468
+ end
469
+
470
+ enum += ")"
471
+ end
472
+
473
+ enum
474
+ end
475
+
476
+ def get_season(season_code)
477
+ case season_code
478
+ when "21" then "Spring"
479
+ when "22" then "Summer"
480
+ when "23" then "Autumn"
481
+ when "24" then "Winter"
482
+ else season_code
483
+ end
484
+ end
485
+
486
+ def get_season_old(season_code)
487
+ case season_code
488
+ when "21" then " (Spring)"
489
+ when "22" then " (Summer)"
490
+ when "23" then " (Autumn)"
491
+ when "24" then " (Winter)"
492
+ else ""
493
+ end
494
+ end
495
+
496
+ # Takes a hash like the following:
497
+ #
498
+ # {
499
+ # :enum_level_1_caption => "v.",
500
+ # :enum_level_1_start => "173", :enum_level_1_end => "173",
501
+ # :enum_level_2_start => "2", :enum_level_2_end => "26",
502
+ # :start_year => "2009", :end_year => "2009",
503
+ # :start_month => "1", :end_month => "6",
504
+ # :start_day => "19", :end_day => "29"
505
+ # }
506
+ #
507
+ # and returns a string like this:
508
+ #
509
+ # January 19, 2009 - June 29, 2009
510
+ def get_formatted_chronology_info(enumeration_hash)
511
+ date = ''
512
+
513
+ # Begin with the literal values...
514
+ start_month = enumeration_hash[:start_month]
515
+ end_month = enumeration_hash[:end_month]
516
+ # Try to convert them into a normalized form.
517
+ begin
518
+ start_month = Integer(enumeration_hash[:start_month].gsub(/^0*/, ""))
519
+ start_month = Date::MONTHNAMES[start_month]
520
+ end_month = Integer(enumeration_hash[:end_month].gsub(/^0*/, ""))
521
+ end_month = Date::MONTHNAMES[end_month]
522
+ rescue
523
+ # don't error out, just use the literal value that came out of the holdings record.
524
+ end
525
+
526
+ if enumeration_hash[:start_day] and enumeration_hash[:start_month] and enumeration_hash[:start_year]
527
+ # Lone Issue
528
+ if enumeration_hash[:start_year] == enumeration_hash[:end_year] and
529
+ enumeration_hash[:start_month] == enumeration_hash[:end_month] and
530
+ enumeration_hash[:start_day] == enumeration_hash[:end_day]
531
+ date += "#{start_month} #{enumeration_hash[:start_day]}, #{enumeration_hash[:start_year]}"
532
+ else
533
+ date += "#{start_month} #{enumeration_hash[:start_day]}, #{enumeration_hash[:start_year]} -"
534
+ date += " #{end_month} #{enumeration_hash[:end_day]}, #{enumeration_hash[:end_year]}"
535
+ end
536
+ elsif enumeration_hash[:start_month] and enumeration_hash[:start_year]
537
+
538
+ # If the month values were outside of the 1-12 range
539
+ # check to see if they are 21-24 for Spring, Summer, Fall, Winter
540
+ start_month = get_season(enumeration_hash[:start_month]) unless start_month
541
+ end_month = get_season(enumeration_hash[:end_month]) unless end_month
542
+
543
+ date += start_month
544
+ date += "," if start_month.match(/\d/)
545
+ date += " #{enumeration_hash[:start_year]}"
546
+
547
+ # Single Issue.
548
+ # Don't display the end month and end year if they just output the same chronology substring
549
+ # as the start month and start year.
550
+ if start_month != end_month or enumeration_hash[:start_year] != enumeration_hash[:end_year]
551
+ date += " - #{end_month}"
552
+ date += "," if end_month[-1,1].match(/\d/)
553
+ date += " #{enumeration_hash[:end_year]}"
554
+ end
555
+
556
+ elsif enumeration_hash[:start_year]
557
+ if enumeration_hash[:end_year] and enumeration_hash[:start_year] != enumeration_hash[:end_year]
558
+ date += "#{enumeration_hash[:start_year]} - #{enumeration_hash[:end_year]}"
559
+ else
560
+ date += "#{enumeration_hash[:start_year]} "
561
+ end
562
+ end
563
+
564
+ date += "#{get_season(enumeration_hash[:season])}" if enumeration_hash[:season]
565
+
566
+ date.strip
567
+ end
568
+
569
+ def notes
570
+ record = to_marc
571
+ notes = record['852'].subfields.reduce(Array.new) do |notes, subfield|
572
+ notes << subfield.value if subfield.code == 'z'
573
+ notes
574
+ end
575
+ notes
576
+ end
577
+
578
+ def unavailable_items
579
+ MfhdItem.all(
580
+ :mfhd_id => mfhd_id,
581
+ MfhdItem.item.item_statuses.item_status_type_id.not => 1,
582
+ MfhdItem.item.item_statuses.item_status_type_id.not => 11,
583
+ MfhdItem.item.item_statuses.item_status_type_id.not => 19,
584
+ MfhdItem.item.item_statuses.item_status_type_id.not => 20)
585
+ end
586
+
587
+ def other_permanent_locations
588
+ return false if self.mfhd_items.size > 999
589
+
590
+ locations = []
591
+ self.mfhd_items.each do |mfhd_item|
592
+ unless(mfhd_item.item.perm_location == self.location_id || locations.include?(mfhd_item.item.perm_loc_display))
593
+ locations << mfhd_item.item.perm_loc_display
594
+ end
595
+ end
596
+ locations
597
+ end
598
+ end
599
+ end
@@ -1,3 +1,3 @@
1
1
  module UwCatalog
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/uw_catalog.gemspec CHANGED
@@ -11,7 +11,6 @@ Gem::Specification.new do |gem|
11
11
  gem.summary = %q{Use UW-Madison Voyager catalog data}
12
12
  gem.homepage = "https://github.com/ekrylova/uw_catalog"
13
13
 
14
- gem.add_dependency('data_mapper', '~>1.2.0')
15
14
 
16
15
  gem.files = `git ls-files`.split($/)
17
16
  gem.files = [
@@ -19,16 +18,17 @@ Gem::Specification.new do |gem|
19
18
  # "Rakefile",
20
19
  "uw_catalog.gemspec",
21
20
  "lib/uw_catalog.rb",
22
- "lib/uw_catalog/model/location.rb",
23
- "lib/uw_catalog/model/holding.rb",
24
- "lib/uw_catalog/model/bib_data.rb",
25
- "lib/uw_catalog/model/item.rb",
26
- "lib/uw_catalog/model/items_listing.rb",
27
21
  "lib/uw_catalog/version.rb",
28
22
  "lib/uw_catalog/catalog.rb",
29
23
  "lib/uw_catalog/data_loader.rb",
30
24
  "lib/uw_catalog/voyager_item_status.rb",
31
- "lib/uw_catalog/voyager_sql.rb"
25
+ "lib/uw_catalog/voyager_sql.rb",
26
+ "lib/uw_catalog/model/location.rb",
27
+ "lib/uw_catalog/model/holding.rb",
28
+ "lib/uw_catalog/model/holding_marc.rb",
29
+ "lib/uw_catalog/model/bib_data.rb",
30
+ "lib/uw_catalog/model/item.rb",
31
+ "lib/uw_catalog/model/items_listing.rb"
32
32
  ]
33
33
  gem.require_paths = ["lib"]
34
34
 
@@ -39,5 +39,6 @@ Gem::Specification.new do |gem|
39
39
  gem.add_dependency('data_mapper', '~> 1.2.0')
40
40
  gem.add_dependency('dm-oracle-adapter', '~> 1.2.0')
41
41
  gem.add_dependency('ruby-oci8', '~> 2.1.3')
42
+ gem.add_dependency('marc', '~> 0.5.0')
42
43
 
43
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uw_catalog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-08 00:00:00.000000000 Z
12
+ date: 2013-07-09 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: data_mapper
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 1.2.0
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: 1.2.0
30
14
  - !ruby/object:Gem::Dependency
31
15
  name: rake
32
16
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +107,22 @@ dependencies:
123
107
  - - ~>
124
108
  - !ruby/object:Gem::Version
125
109
  version: 2.1.3
110
+ - !ruby/object:Gem::Dependency
111
+ name: marc
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.5.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.5.0
126
126
  description: Gem for the University of Wisconsin Library Voyager catalog data
127
127
  email:
128
128
  - ekrylova@wisc.edu
@@ -132,16 +132,17 @@ extra_rdoc_files: []
132
132
  files:
133
133
  - uw_catalog.gemspec
134
134
  - lib/uw_catalog.rb
135
- - lib/uw_catalog/model/location.rb
136
- - lib/uw_catalog/model/holding.rb
137
- - lib/uw_catalog/model/bib_data.rb
138
- - lib/uw_catalog/model/item.rb
139
- - lib/uw_catalog/model/items_listing.rb
140
135
  - lib/uw_catalog/version.rb
141
136
  - lib/uw_catalog/catalog.rb
142
137
  - lib/uw_catalog/data_loader.rb
143
138
  - lib/uw_catalog/voyager_item_status.rb
144
139
  - lib/uw_catalog/voyager_sql.rb
140
+ - lib/uw_catalog/model/location.rb
141
+ - lib/uw_catalog/model/holding.rb
142
+ - lib/uw_catalog/model/holding_marc.rb
143
+ - lib/uw_catalog/model/bib_data.rb
144
+ - lib/uw_catalog/model/item.rb
145
+ - lib/uw_catalog/model/items_listing.rb
145
146
  homepage: https://github.com/ekrylova/uw_catalog
146
147
  licenses: []
147
148
  post_install_message: