Skip to content

Commit f383af6

Browse files
authored
Merge pull request #178 from mlibrary/LIBSEARCH-1140-consolidate-offiste-shelving
Libsearch 1140 consolidate offiste shelving
2 parents d28bd93 + 62a1b36 commit f383af6

File tree

9 files changed

+488
-16
lines changed

9 files changed

+488
-16
lines changed

api/catalog_api/schemas.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ class PhysicalItem(BaseModel):
8080
class PhysicalHolding(BaseModel):
8181
holding_id: str | None
8282
call_number: str | None
83-
summary: str | None
84-
# public_note: str | None
83+
summary: list[str] | None
84+
public_note: list[str] | None
8585
physical_location: PhysicalLocation
8686
items: list[PhysicalItem]
8787

umich_catalog_indexing/lib/umich_traject.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
require "umich_traject/holdings"
88
require "umich_traject/digital_holding"
99
require "umich_traject/physical_holding"
10+
require "umich_traject/physical_holdings"
1011
require "umich_traject/physical_item"
1112
require "umich_traject/electronic_holding"
1213
require "umich_traject/availability"

umich_catalog_indexing/lib/umich_traject/holdings.rb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def run
9595
if link_text =~ /finding aid/i and hol[:link] =~ /umich/i
9696
hol[:finding_aid] = true
9797
record_has_finding_aid = true
98-
id = context.output_hash["id"]
98+
context.output_hash["id"]
9999
else
100100
hol[:finding_aid] = false
101101
end
@@ -112,10 +112,7 @@ def run
112112
inst_codes << "MIU"
113113
end
114114

115-
physical_holdings = physical_holding_ids.map do |id|
116-
PhysicalHolding.new(record: @record, holding_id: id)
117-
end.reject { |x| x.items.empty? }
118-
physical_holdings.each do |holding|
115+
PhysicalHoldings.new(holding_ids: physical_holding_ids, record: @record).each do |holding|
119116
hol_list << holding.to_h
120117
locations << holding.institution_code
121118
inst_codes << holding.institution_code

umich_catalog_indexing/lib/umich_traject/physical_holding.rb

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,27 @@ module Traject
22
module UMich
33
class PhysicalHolding
44
attr_reader :holding_id
5+
def self.for(record:, holding_id:)
6+
holding_data = record.fields("852").find do |f|
7+
f.subfields.any? { |sf| sf.code == "8" && sf.value == holding_id }
8+
end
9+
klass = if ["OFFS", "BUHR", "HSRS"].include?(holding_data["b"])
10+
Offsite
11+
else
12+
self
13+
end
14+
klass.new(record: record, holding_id: holding_id)
15+
end
516

617
def initialize(record:, holding_id:)
718
@holding_id = holding_id
819
@record = record
920
end
1021

22+
def offsite?
23+
false
24+
end
25+
1126
def institution_code
1227
f852["a"]&.upcase
1328
end
@@ -18,7 +33,7 @@ def summary_holdings
1833
output.push(f["a"]) if f["8"] == holding_id
1934
end
2035
str = output.join(" : ")
21-
(str == "") ? nil : str
36+
(str == "") ? [] : [str]
2237
end
2338

2439
# An array of PhysicalItem objects with enumcron sorting and not including
@@ -74,7 +89,7 @@ def circulating?
7489
end
7590

7691
def public_note
77-
f852.filter_map { |x| x.value if x.code == "z" }
92+
f852.filter_map { |x| x.value if public_note_subfields.include?(x.code) }
7893
end
7994

8095
def field_is_finding_aid?(f)
@@ -123,6 +138,83 @@ def f852
123138
def f974
124139
@f974 ||= @record.fields("974").select { |f| f["8"] == @holding_id }
125140
end
141+
142+
private
143+
144+
def public_note_subfields
145+
["z", "g"]
146+
end
147+
end
148+
149+
class PhysicalHolding::Offsite < PhysicalHolding
150+
def offsite?
151+
true
152+
end
153+
154+
private
155+
156+
def public_note_subfields
157+
["g"]
158+
end
159+
end
160+
161+
class PhysicalHolding::CombinedOffsite < PhysicalHolding::Offsite
162+
def initialize(holdings)
163+
@holdings = holdings
164+
@first_holding = holdings.first
165+
end
166+
167+
def public_note
168+
@holdings.map { |h| h.public_note }.flatten.compact.uniq
169+
end
170+
171+
def institution_code
172+
@first_holding.institution_code
173+
end
174+
175+
def summary_holdings
176+
# TBD
177+
@holdings.map { |h| h.summary_holdings }.flatten.compact.uniq
178+
end
179+
180+
def items
181+
@items ||= @holdings.map { |h| h.items }.flatten
182+
end
183+
184+
def callnumber
185+
@first_holding.callnumber
186+
end
187+
188+
def floor_location
189+
""
190+
end
191+
192+
# Checks whether there exists a finding aid in the 856 field
193+
#
194+
# @return [Boolean] whether or not the 856 has a a finding aid
195+
def finding_aid?
196+
false
197+
end
198+
199+
def display_name
200+
"Offsite Shelving"
201+
end
202+
203+
def locations
204+
["OFFS"]
205+
end
206+
207+
def library
208+
"OFFS"
209+
end
210+
211+
def location
212+
"MAIN"
213+
end
214+
215+
def info_link
216+
"https://lib.umich.edu/find-borrow-request/request-items-pick-or-delivery/request-offsite-shelving"
217+
end
126218
end
127219
end
128220
end
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Traject::UMich::PhysicalHoldings
2+
include Enumerable
3+
4+
def initialize(record:, holding_ids:)
5+
@record = record
6+
@holding_ids = holding_ids
7+
end
8+
9+
def all
10+
@all ||= @holding_ids.map do |id|
11+
Traject::UMich::PhysicalHolding.for(record: @record, holding_id: id)
12+
end.reject { |x| x.items.empty? }
13+
end
14+
15+
def not_offsite
16+
all.reject { |x| x.offsite? } || []
17+
end
18+
19+
def offsite
20+
@offsite ||= all.select { |x| x.offsite? }
21+
end
22+
23+
def combined
24+
if offsite.any?
25+
not_offsite.push(Traject::UMich::PhysicalHolding::CombinedOffsite.new(offsite))
26+
else
27+
all
28+
end
29+
end
30+
31+
def each(&block)
32+
combined.each do |item|
33+
block.call(item)
34+
end
35+
end
36+
end
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
<record xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" xmlns="http://www.loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2+
<leader>02601nam a2200421 i 4500</leader>
3+
<controlfield tag="005">20250801230613.0</controlfield>
4+
<controlfield tag="008">250731t20222022caua b 001 0deng</controlfield>
5+
<controlfield tag="001">99188996570906381</controlfield>
6+
<datafield tag="020" ind1=" " ind2=" ">
7+
<subfield code="a">9781793510686</subfield>
8+
</datafield>
9+
<datafield tag="020" ind1=" " ind2=" ">
10+
<subfield code="a">1793510687</subfield>
11+
</datafield>
12+
<datafield tag="035" ind1=" " ind2=" ">
13+
<subfield code="a">(OCoLC)1530058420</subfield>
14+
</datafield>
15+
<datafield tag="035" ind1=" " ind2=" ">
16+
<subfield code="a">(OCoLC)on1530058420</subfield>
17+
</datafield>
18+
<datafield tag="040" ind1=" " ind2=" ">
19+
<subfield code="a">EYM</subfield>
20+
<subfield code="b">eng</subfield>
21+
<subfield code="e">rda</subfield>
22+
<subfield code="c">EYM</subfield>
23+
</datafield>
24+
<datafield tag="050" ind1=" " ind2="4">
25+
<subfield code="a">R834</subfield>
26+
<subfield code="b">.I5862 2022</subfield>
27+
</datafield>
28+
<datafield tag="245" ind1="0" ind2="0">
29+
<subfield code="a">Interprofessional education and collaborative practice :</subfield>
30+
<subfield code="b">international approaches at micro, meso, and macro levels /</subfield>
31+
<subfield code="c">Dawn Joosten-Hagye &amp; Hossein Khalili, Editors.</subfield>
32+
</datafield>
33+
<datafield tag="246" ind1="1" ind2=" ">
34+
<subfield code="i">Cover and spine title:</subfield>
35+
<subfield code="a">Interprofessional education &amp; collaborative practice</subfield>
36+
</datafield>
37+
<datafield tag="264" ind1=" " ind2="1">
38+
<subfield code="a">San Diego [California] :</subfield>
39+
<subfield code="b">Cognella,</subfield>
40+
<subfield code="c">[2022]</subfield>
41+
</datafield>
42+
<datafield tag="264" ind1=" " ind2="4">
43+
<subfield code="c">©2022</subfield>
44+
</datafield>
45+
<datafield tag="300" ind1=" " ind2=" ">
46+
<subfield code="a">xxiv, 430 pages :</subfield>
47+
<subfield code="b">illustrations (some color) ;</subfield>
48+
<subfield code="c">26 cm</subfield>
49+
</datafield>
50+
<datafield tag="336" ind1=" " ind2=" ">
51+
<subfield code="a">text</subfield>
52+
<subfield code="b">txt</subfield>
53+
<subfield code="2">rdacontent</subfield>
54+
</datafield>
55+
<datafield tag="337" ind1=" " ind2=" ">
56+
<subfield code="a">unmediated</subfield>
57+
<subfield code="b">n</subfield>
58+
<subfield code="2">rdamedia</subfield>
59+
</datafield>
60+
<datafield tag="338" ind1=" " ind2=" ">
61+
<subfield code="a">volume</subfield>
62+
<subfield code="b">nc</subfield>
63+
<subfield code="2">rdacarrier</subfield>
64+
</datafield>
65+
<datafield tag="520" ind1=" " ind2=" ">
66+
<subfield code="a">Featuring contributed chapters written by practitioners, scholars, researchers, and students within the health care discipline, Interprofessional Education and Collaborative Practice: International Approaches at the Micro, Meso, and Macro Levels assists readers in expanding their knowledge, ability, understanding, and perspectives regarding interprofessional education (IPE) and collaborative practice (CP). The book provides readers with international, system-based approaches, emphasizes applications at all levels, and includes examples of student-led initiatives.</subfield>
67+
</datafield>
68+
<datafield tag="504" ind1=" " ind2=" ">
69+
<subfield code="a">Includes bibliographical references and index.</subfield>
70+
</datafield>
71+
<datafield tag="650" ind1=" " ind2="0">
72+
<subfield code="a">Interprofessional education.</subfield>
73+
<subfield code="0">http://id.loc.gov/authorities/subjects/sh2010013958</subfield>
74+
</datafield>
75+
<datafield tag="650" ind1=" " ind2="0">
76+
<subfield code="a">Professional education.</subfield>
77+
<subfield code="0">http://id.loc.gov/authorities/subjects/sh85107250</subfield>
78+
</datafield>
79+
<datafield tag="650" ind1=" " ind2="0">
80+
<subfield code="a">World health.</subfield>
81+
<subfield code="0">http://id.loc.gov/authorities/subjects/sh85148199</subfield>
82+
</datafield>
83+
<datafield tag="650" ind1=" " ind2="0">
84+
<subfield code="a">Interprofessional relations.</subfield>
85+
<subfield code="0">http://id.loc.gov/authorities/subjects/sh95002729</subfield>
86+
</datafield>
87+
<datafield tag="650" ind1=" " ind2="0">
88+
<subfield code="a">Medicine</subfield>
89+
<subfield code="x">Study and teaching (Continuing education)</subfield>
90+
<subfield code="0">http://id.loc.gov/authorities/subjects/sh97000135</subfield>
91+
</datafield>
92+
<datafield tag="650" ind1=" " ind2="0">
93+
<subfield code="a">Patient-centered health care.</subfield>
94+
<subfield code="0">http://id.loc.gov/authorities/subjects/sh2012000674</subfield>
95+
</datafield>
96+
<datafield tag="650" ind1=" " ind2="2">
97+
<subfield code="a">Global Health.</subfield>
98+
<subfield code="0">http://id.nlm.nih.gov/mesh/D014943</subfield>
99+
</datafield>
100+
<datafield tag="650" ind1=" " ind2="2">
101+
<subfield code="a">Interprofessional Relations.</subfield>
102+
<subfield code="0">http://id.nlm.nih.gov/mesh/D007400</subfield>
103+
</datafield>
104+
<datafield tag="650" ind1="1" ind2="2">
105+
<subfield code="a">Education, Medical, Continuing.</subfield>
106+
<subfield code="0">http://id.nlm.nih.gov/mesh/D004502</subfield>
107+
</datafield>
108+
<datafield tag="650" ind1="2" ind2="2">
109+
<subfield code="a">Patient-Centered Care.</subfield>
110+
<subfield code="0">http://id.nlm.nih.gov/mesh/D018802</subfield>
111+
</datafield>
112+
<datafield tag="700" ind1="1" ind2=" ">
113+
<subfield code="a">Joosten-Hagye, Dawn,</subfield>
114+
<subfield code="e">editor.</subfield>
115+
</datafield>
116+
<datafield tag="700" ind1="1" ind2=" ">
117+
<subfield code="a">Khalili, Hossein,</subfield>
118+
<subfield code="e">editor.</subfield>
119+
</datafield>
120+
<datafield tag="908" ind1=" " ind2=" ">
121+
<subfield code="a">AuthComplete 2025-08-01</subfield>
122+
</datafield>
123+
<datafield tag="998" ind1=" " ind2=" ">
124+
<subfield code="c">bdede-rdu FullCatMono 20250731 TAUB</subfield>
125+
</datafield>
126+
<datafield tag="BIB" ind1=" " ind2=" ">
127+
<subfield code="u">2025-08-02 18:01:01 US/Eastern</subfield>
128+
<subfield code="c">2025-07-21 11:37:07 US/Eastern</subfield>
129+
<subfield code="s">false</subfield>
130+
</datafield>
131+
<datafield tag="852" ind1="0" ind2=" ">
132+
<subfield code="b">HSRS</subfield>
133+
<subfield code="a">MiU</subfield>
134+
<subfield code="c">NONE</subfield>
135+
<subfield code="h">R 834 .I5862 2022</subfield>
136+
<subfield code="8">221349371140006381</subfield>
137+
</datafield>
138+
<datafield tag="974" ind1=" " ind2=" ">
139+
<subfield code="8">221349371140006381</subfield>
140+
<subfield code="f">1</subfield>
141+
<subfield code="c">NONE</subfield>
142+
<subfield code="m">BOOK</subfield>
143+
<subfield code="a">39015108094551</subfield>
144+
<subfield code="e">NONE</subfield>
145+
<subfield code="7">231349371130006381</subfield>
146+
<subfield code="r">2025-07-30 13:29:48 US/Eastern</subfield>
147+
<subfield code="h">R 834 .I5862 2022</subfield>
148+
<subfield code="d">HSRS</subfield>
149+
<subfield code="b">HSRS</subfield>
150+
</datafield>
151+
</record>

umich_catalog_indexing/spec/indexers/umich_alma_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@
113113
"public_note" => ["CURRENT ISSUES IN SERIAL SERVICES, 203 NORTH HATCHER",
114114
"MISSING: 24 no.1-2 2015, v.28 no.6 2019"],
115115
"record_has_finding_aid" => false,
116-
"summary_holdings" => "2- : 1993-"
116+
"summary_holdings" => ["2- : 1993-"]
117117
}
118118
]
119119
end
@@ -150,7 +150,7 @@
150150
"location" => "MAIN",
151151
"public_note" => [],
152152
"record_has_finding_aid" => false,
153-
"summary_holdings" => nil}]
153+
"summary_holdings" => []}]
154154
end
155155
before(:each) do
156156
@record = nil

0 commit comments

Comments
 (0)