Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
 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
Пример #5
0
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
Пример #6
0
def get_field_items(value):
    """Get field items."""
    if isinstance(value, utils.GroupableOrderedDict):
        return value.iteritems(repeated=True)
    else:
        return utils.iteritems(value)