-
Notifications
You must be signed in to change notification settings - Fork 1
/
ybp_ebl.py
327 lines (279 loc) · 11 KB
/
ybp_ebl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
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
"""
:mod:`ybp_ebl` YBP EBL DDA eBooks Module
"""
from marc_batch.marc_helpers import MARCModifier
from pymarc import Field
import re,logging,copy,codecs,datetime
VOL_RE = re.compile(r"(.*)(vol)[.|\s]*(.*)")
NO_RE = re.compile(r"(.*)([n|N]o)[.|\s]*(.*)")
BD_RE = re.compile(r"(.*)(Ba*n*d)[.|\s]*(.*)")
class ybp_ebl(MARCModifier):
"""
:class:`ybp_ebl` class takes a YBP EBL DDA MARC record
file and modifies for import into an ILS
"""
def __init__(self,marc_file):
"""
Initializes `ybp_ebl`
:param marc_file: File location of MARC records
"""
MARCModifier.__init__(self,marc_file)
def processRecord(self,
marc_record):
"""
Processes a single MARC record
:param marc_record: Single MARC record
"""
marc_record = self.validateLeader(marc_record)
marc_record = self.validate001(marc_record)
marc_record = self.validate006(marc_record)
marc_record = self.validate007s(marc_record)
marc_record = self.validate008(marc_record)
marc_record = self.validate040(marc_record)
marc_record = self.validate050s(marc_record)
marc_record = self.validate082(marc_record)
marc_record = self.validate100(marc_record)
marc_record = self.validate246(marc_record)
marc_record = self.validate300s(marc_record)
marc_record = self.validateRDA(marc_record)
marc_record = self.validateSeries(marc_record)
marc_record = self.validate506(marc_record)
marc_record = self.validate538s540(marc_record)
marc_record = self.validate710(marc_record)
marc_record = self.validate776(marc_record)
marc_record = self.validate856(marc_record)
return marc_record
def validateLeader(self,
marc_record):
"""
Changes encoding level to 3 in leader position 17
:param marc_record: MARC record
"""
leader_list = list(marc_record.leader)
leader_list[17] = '3'
leader_list[18] = 'a'
marc_record.leader = "".join(leader_list)
return marc_record
def validate001(self,
marc_record):
"""
Removes prepend in 001
:param marc_record: MARC record
"""
field001 = marc_record['001'].value()
marc_record['001'].value = field001[3:].lower()
return marc_record
def validate007s(self,
marc_record):
"""
Validates all 007s in EBL record load
:param marc_record: Single MARC record
"""
return self.replace007(marc_record,
data=r'cr n a')
def validate008(self,
marc_record):
"""
Validates all 008 in EBL record load
:param marc_record: Single MARC record
"""
field008_data = marc_record['008'].value()
marc_record['008'].value = field008_data.replace("o","|")
return marc_record
def validate040(self,
marc_record,
marc_code='CoCCC'):
"""
Validates all 040s in EBL record load by adding $d with
institution MARC code
:param marc_record: Single MARC record
:param marc_code: MARC institution code, defaults to CC
"""
all040s = marc_record.get_fields('040')
for field040 in all040s:
field040.add_subfield('d',marc_code)
return marc_record
def validate050s(self,
marc_record):
"""
Validates all 050s in EBL record load
:param marc_record: Single MARC record
"""
all050s = marc_record.get_fields('050')
for field050 in all050s:
first_a = field050.delete_subfield('a')
other_a = field050.get_subfields('a')
for counter in range(0,len(other_a)):
field050.delete_subfield('a')
field050.add_subfield('a',first_a)
first_b = field050.delete_subfield('b')
first_b = subfld_b_process(VOL_RE,first_b,"v.")
first_b = subfld_b_process(NO_RE,first_b,"no.")
first_b = subfld_b_process(BD_RE,first_b,"Bd.")
first_b += 'eb'
field050.add_subfield('b',first_b)
return marc_record
def validate082(self,
marc_record):
"""
Validates the 082 by making sure the indicators are set to 04
:param marc_record:
"""
field082s = marc_record.get_fields('082')
for field082 in field082s:
field082.indicators = ['0','4']
return marc_record
def validate100(self,
marc_record):
"""
Validates 100 field in EBL record load
:param marc_record: Single MARC record
"""
field100 = marc_record['100']
if field100 is not None:
marc_record['100'].indicators = ['1',' ']
return marc_record
def validate246(self,
marc_record):
"""
Validates 246 field in EBL record load
:param marc_record: Single MARC record
"""
field246 = marc_record['246']
if field246 is None:
return marc_record
return marc_record
def validate300s(self,
marc_record):
"""
Validates 300 fields in EBL record load
:param marc_record: Single MARC record
"""
all300s = marc_record.get_fields('300')
for field300 in all300s:
field300.delete_subfield('a')
field300.add_subfield('a','1 online resource (1 v.)')
return marc_record
def validateRDA(self,
marc_record):
"""
Validates RDA elements in 336, 337, and 338 fields
:param marc_record: Single MARC record
"""
# Creates RDA 336
self.__remove_field__(marc_record=marc_record,
tag='336')
field336 = Field('336',
indicators=[' ',' '],
subfields=['a','text',
'2','rdacontent'])
marc_record.add_field(field336)
self.__remove_field__(marc_record=marc_record,
tag='337')
field337 = Field('337',
indicators=[' ',' '],
subfields=['a','computer',
'2','rdamedia'])
marc_record.add_field(field337)
self.__remove_field__(marc_record=marc_record,
tag='338')
field338 = Field('338',
indicators=[' ',' '],
subfields=['a','online resource',
'2','rdamedia'])
marc_record.add_field(field338)
return marc_record
def validateSeries(self,
marc_record):
"""
Validates Series n 440, 490/830 fields
:param marc_record: Single MARC record
"""
if marc_record['490'] is None and marc_record['830'] is None:
return marc_record
return marc_record
def validate506(self,
marc_record):
"""
Validates 506 field
:param marc_record: Single MARC record
"""
new506 = Field('506',
indicators=[' ',' '],
subfields=['a','Access restricted to subscribing institutions. Individual titles purchased upon selection by the 7th affiliated user.'])
marc_record.add_field(new506)
return marc_record
def validate538s540(self,
marc_record):
"""
Adds 538 fields and 540 field
:param marc_record: Single MARC record
"""
first538 = Field('538',
indicators=[' ',' '],
subfields=["a","Book preview interface supplies PDF, image or read-aloud access. Adobe Digital Editions software required for book downloads."])
marc_record.add_field(first538)
second538 = Field('538',
indicators=[' ',' '],
subfields=["a","Users at some libraries may be required to establish a separate no-charge EBL account, and log in to access the full text. For security, do not use a confidential or important ID and password to log in; create a different username and password"])
marc_record.add_field(second538)
field540 = Field('540',
indicators=[' ',' '],
subfields=["a","Books may be viewed online or downloaded (to a maximum of two devices per patron) for personal use only. No derivative use, redistribution or public performance is permitted. Maximum usage allowances -- loan period: 7 days for some publishers; printing: up to 20% of the total pages; copy/paste: up to 5% of the total pages."])
marc_record.add_field(field540)
return marc_record
def validate541(self,
marc_record):
"""
Adds a 541 field
:param marc_record: Single MARC record
"""
field541 = Field('541',
indicators=[' ',' '],
subfields=["a","Permanent access license for participating libraries purchased from YBP"])
marc_record.add_field(field541)
return marc_record
def validate710(self,marc_record):
"""Adds a 710 field if missing from marc_record.
:param marc_record: Single MARC record
"""
if not marc_record['710']:
field710 = Field('710',
indicators=['2',' '],
subfields=["a","Ebooks Corporation"])
marc_record.add_field(field710)
return marc_record
def validate776(self,
marc_record):
"""
Validates 776 by insuring indicators are '0' and '8'
:param marc_record: Single MARC record
"""
all776s = marc_record.get_fields('776')
for field776 in all776s:
new776 = Field(tag='776',
indicators = ['0','8'],
subfields=field776.subfields)
marc_record.remove_field(field776)
marc_record.add_field(new776)
return marc_record
def validate856(self,
marc_record):
"""
Validates 856 by changing $z to 'View electronic book'
:param marc_record: MARC Record
"""
all856s = marc_record.get_fields('856')
for field856 in all856s:
field856.delete_subfield('z')
field856.add_subfield('z','View electronic book')
return marc_record
def subfld_b_process(regex,value,repl):
if value is None:
return ''
regex_result = regex.search(value)
if regex_result is None:
return value
b_tuples = list(regex_result.groups())
b_tuples[1] = regex.sub(repl,b_tuples[1])
return "".join(b_tuples)