def build_statement(field_value, ind2): def build_place_or_agent_data(code, label, add_country): place_or_agent_data = None type_per_code = {'a': 'bf:Place', 'b': 'bf:Agent'} value = remove_trailing_punctuation(label) if value: place_or_agent_data = { 'type': type_per_code[code], 'label': [{ 'value': value }] } if add_country and marc21.country: place_or_agent_data['country'] = marc21.country return place_or_agent_data # function build_statement start here statement = [] if isinstance(field_value, utils.GroupableOrderedDict): items = field_value.iteritems(repeated=True) else: items = utils.iteritems(field_value) add_country = ind2 in (' ', '1') for blob_key, blob_value in items: if blob_key in ('a', 'b'): place_or_agent_data = build_place_or_agent_data( blob_key, blob_value, add_country) if blob_key == 'a': add_country = False if place_or_agent_data: statement.append(place_or_agent_data) return statement
def build_statement(field_value, ind2): def build_place_or_agent_data(code, label, index, link, add_country): type_per_code = {'a': 'bf:Place', 'b': 'bf:Agent'} place_or_agent_data = { 'type': type_per_code[code], 'label': [{ 'value': remove_trailing_punctuation(label) }] } if add_country: if marc21tojson.cantons: place_or_agent_data['canton'] = marc21tojson.cantons if marc21tojson.country: place_or_agent_data['country'] = marc21tojson.country try: alt_gr = marc21tojson.alternate_graphic['264'][link] subfield = \ marc21tojson.get_subfields(alt_gr['field'])[index] place_or_agent_data['label'].append({ 'value': remove_trailing_punctuation(subfield), 'language': '-'.join((marc21tojson.lang_from_008, alt_gr['script'])) }) except Exception: pass return place_or_agent_data # function build_statement start here subfield_6 = field_value.get('6', '') tag_link = subfield_6.split('-') link = '' if len(tag_link) == 2: link = tag_link[1] statement = [] if isinstance(field_value, utils.GroupableOrderedDict): items = field_value.iteritems(repeated=True) else: items = utils.iteritems(field_value) index = 1 add_country = ind2 in (' ', '1') for blob_key, blob_value in items: if blob_key in ('a', 'b'): place_or_agent_data = build_place_or_agent_data( blob_key, blob_value, index, link, add_country) if blob_key == 'a': add_country = False statement.append(place_or_agent_data) if blob_key != '__order__': index += 1 return statement
def get_subfields(self, field, code=None): """Get all subfields having the given subfield code value.""" subfields = [] if int(field['tag']) >= 10: if isinstance(field['subfields'], utils.GroupableOrderedDict): items = field['subfields'].iteritems(repeated=True) else: items = utils.iteritems(field['subfields']) for subfield_code, subfield_data in items: if (subfield_code == code) or not code: subfields.append(subfield_data) else: raise ValueError('data field expected (tag >= 01x)') return subfields
def get_fields(self, tag=None): """Get all fields having the given tag value.""" fields = [] if isinstance(self.blob_record, utils.GroupableOrderedDict): items = self.blob_record.iteritems(repeated=True) else: items = utils.iteritems(self.blob_record) for blob_key, blob_value in items: field_data = {} tag_value = blob_key[0:3] if (tag_value == tag) or not tag: field_data['tag'] = tag_value if len(blob_key) == 3: # if control field field_data['data'] = blob_value.strip() else: field_data['ind1'] = blob_key[3:4] field_data['ind2'] = blob_key[4:5] field_data['subfields'] = blob_value fields.append(field_data) return fields
def unimarc_publishers_provision_activity_publication(self, key, value): """Get provision activity dates.""" def build_place_or_agent_data(code, label, index, add_country): type_per_code = {'a': 'bf:Place', 'c': 'bf:Agent'} place_or_agent_data = { 'type': type_per_code[code], 'label': [{ 'value': remove_trailing_punctuation(label) }] } if add_country: # country from 102 field_102 = unimarctojson.get_fields(tag='102') if field_102: field_102 = field_102[0] country_codes = unimarctojson.get_subfields(field_102, 'a') if country_codes: place_or_agent_data['country'] = country_codes[0].lower() return place_or_agent_data publication = {} ind2 = key[4] type_per_ind2 = { ' ': 'bf:Publication', '_': 'bf:Publication', '0': 'bf:Publication', '1': 'bf:Production', '2': 'bf:Distribution', '3': 'bf:Manufacture' } if ind2 == '4': field_d = value.get('d') if field_d: field_d = force_list(field_d)[0] copyright_date = self.get('copyrightDate', []) if field_d[0] == 'P': copyright_date.append('℗ ' + field_d[2:]) else: copyright_date.append('© ' + field_d) self['copyrightDate'] = copyright_date else: publication = { 'type': type_per_ind2[ind2], 'statement': [], } subfields_d = utils.force_list(value.get('d')) if subfields_d: subfield_d = subfields_d[0] publication['date'] = subfield_d if ind2 in (' ', '_', '0'): dates = subfield_d.replace('[', '').replace(']', '').split('-') try: if re.search(r'(^\[?\d{4}$)', dates[0]): publication['startDate'] = dates[0] except Exception: pass try: if re.search(r'(^\d{4}\]?$)', dates[1]): publication['endDate'] = dates[1] except Exception: pass # TODO: dates from 100 not working !!!! # if ind2 in (' ', '_', '1'): # # startDate: 100, pos. 9-12 endDate: 100, pos. 13-16 # field_100 = unimarctojson.get_fields(tag='100') # if field_100: # field_100 = field_100[0] # data = unimarctojson.get_subfields(field_100, 'a') # if data: # try: # publication['startDate'] = str(int(data[0][9:13])) # except Exception: # pass # try: # publication['endDate'] = str(int(data[0][13:17])) # except Exception: # pass statement = [] if isinstance(value, GroupableOrderedDict): items = value.iteritems(repeated=True) else: items = utils.iteritems(value) index = 1 add_country = ind2 in (' ', '_', '0') for blob_key, blob_value in items: if blob_key in ('a', 'c'): place_or_agent_data = build_place_or_agent_data( blob_key, blob_value, index, add_country) if blob_key == 'a': add_country = False statement.append(place_or_agent_data) if blob_key != '__order__': index += 1 publication['statement'] = statement return publication or None
def get_field_items(value): """Get field items.""" if isinstance(value, utils.GroupableOrderedDict): return value.iteritems(repeated=True) else: return utils.iteritems(value)