def special_coded_dates(self, key, value): """Special Coded Dates.""" return { 'death_date': value.get('g'), 'birth_date': value.get('f'), 'beginning_or_single_date_created': value.get('k'), 'source_of_information': utils.force_list( value.get('v') ), 'ending_date_created': value.get('l'), 'single_or_starting_date_for_aggregated_content': value.get('o'), 'establishment_date': value.get('q'), 'ending_date_for_aggregated_content': value.get('p'), 'start_period': value.get('s'), 'source_of_date_scheme': value.get('2'), 'uniform_resource_identifier': utils.force_list( value.get('u') ), 'end_period': value.get('t'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'termination_date': value.get('r'), }
def see_also_from_tracing_medium_of_performance_term(self, key, value): """See Also From Tracing-Medium of Performance Term.""" field_map = { 'a': 'medium_of_performance_term', 'i': 'relationship_information', 'w': 'control_subfield', '0': 'authority_record_control_number_or_standard_number', '4': 'relationship_code', '5': 'institution_to_which_field_applies', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'medium_of_performance_term': value.get('a'), 'relationship_information': utils.force_list( value.get('i') ), 'authority_record_control_number_or_standard_number': utils.force_list( value.get('0') ), 'institution_to_which_field_applies': utils.force_list( value.get('5') ), 'relationship_code': utils.force_list( value.get('4') ), 'control_subfield': value.get('w'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), }
def added_entry_uncontrolled_related_analytical_title(self, key, value): """Added Entry-Uncontrolled Related/Analytical Title.""" indicator_map1 = {str(x): str(x) for x in range(10)} indicator_map2 = {"2": "Analytical entry", "_": "No information provided"} field_map = { "a": "uncontrolled_related_analytical_title", "h": "medium", "5": "institution_to_which_field_applies", "8": "field_link_and_sequence_number", "p": "name_of_part_section_of_a_work", "n": "number_of_part_section_of_a_work", "6": "linkage", } order = utils.map_order(field_map, value) if key[3] in indicator_map1: order.append("nonfiling_characters") if key[4] in indicator_map2: order.append("type_of_added_entry") return { "__order__": tuple(order) if len(order) else None, "uncontrolled_related_analytical_title": value.get("a"), "medium": value.get("h"), "institution_to_which_field_applies": value.get("5"), "field_link_and_sequence_number": utils.force_list(value.get("8")), "name_of_part_section_of_a_work": utils.force_list(value.get("p")), "number_of_part_section_of_a_work": utils.force_list(value.get("n")), "linkage": value.get("6"), "nonfiling_characters": indicator_map1.get(key[3]), "type_of_added_entry": indicator_map2.get(key[4]), }
def index_term_uncontrolled(self, key, value): """Index Term-Uncontrolled.""" indicator_map1 = { "#": "No information provided", "0": "No level specified", "1": "Primary", "2": "Secondary"} indicator_map2 = { "#": "No information provided", "0": "Topical term", "1": "Personal name", "2": "Corporate name", "3": "Meeting name", "4": "Chronological term", "5": "Geographic name", "6": "Genre/form term"} return { 'uncontrolled_term': utils.force_list( value.get('a') ), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'linkage': value.get('6'), 'institute_of_the_uncontrolled_term': value.get('9'), 'level_of_index_term': indicator_map1.get(key[3]), 'type_of_term_or_name': indicator_map2.get(key[4]), }
def added_entry_geographic_name(self, key, value): """Added Entry-Geographic Name.""" field_map = { "e": "relator_term", "a": "geographic_name", "8": "field_link_and_sequence_number", "3": "materials_specified", "0": "authority_record_control_number", "2": "source_of_heading_or_term", "4": "relator_code", "6": "linkage", } order = utils.map_order(field_map, value) return { "__order__": tuple(order) if len(order) else None, "relator_term": utils.force_list(value.get("e")), "geographic_name": value.get("a"), "field_link_and_sequence_number": utils.force_list(value.get("8")), "materials_specified": value.get("3"), "authority_record_control_number": utils.force_list(value.get("0")), "source_of_heading_or_term": value.get("2"), "relator_code": utils.force_list(value.get("4")), "linkage": value.get("6"), }
def dewey_decimal_call_number(self, key, value): """Dewey Decimal Call Number.""" indicator_map1 = { "0": "Full", "1": "Abridged", "7": "Other edition specified in subfield $2"} indicator_map2 = { "#": "No information provided", "0": "Assigned by LC", "4": "Assigned by agency other than LC"} return { 'classification_number': value.get('a'), 'item_number': value.get('b'), 'volumes_dates_to_which_call_number_applies': value.get('d'), 'edition_number': value.get('2'), 'institution_to_which_field_applies': utils.force_list( value.get('5') ), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'type_of_edition': indicator_map1.get(key[3]), 'source_of_call_number': indicator_map2.get(key[4]), }
def deleted_heading_information(self, key, value): """Deleted Heading Information.""" field_map = { 'a': 'replacement_heading', 'i': 'explanatory_text', '0': 'replacement_authority_record_control_number', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'replacement_heading': utils.force_list( value.get('a') ), 'replacement_authority_record_control_number': utils.force_list( value.get('0') ), 'explanatory_text': utils.force_list( value.get('i') ), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'linkage': value.get('6'), }
def restrictions_on_access_note(self, key, value): """Restrictions on Access Note.""" indicator_map1 = {"#": "No information provided", "0": "No restrictions", "1": "Restrictions apply"} return { 'terms_governing_access': utils.force_list( value.get('a') ), 'physical_access_provisions': value.get('c'), 'jurisdiction': value.get('b'), 'authorization': value.get('e'), 'authorized_users': value.get('d'), 'standardized_terminology_for_access_restriction': value.get('f'), 'materials_specified': utils.force_list( value.get('3') ), 'source_of_term': utils.force_list( value.get('2') ), 'institution_to_which_field_applies': utils.force_list( value.get('5') ), 'linkage': utils.force_list( value.get('6') ), 'field_link_and_sequence_number': value.get('8'), 'uniform_resource_identifier': value.get('u'), 'restriction': indicator_map1.get(key[3]), }
def other_standard_identifier(self, key, value): """Other Standard Identifier.""" indicator_map1 = { "0": "International Standard Recording Code", "1": "Universal Product Code", "2": "International Standard Music Number", "3": "International Article Number", "4": "Serial Item and Contribution Identifier", "7": "Source specified in subfield $2", "8": "Unspecified type of standard number or code"} indicator_map2 = { "#": "No information provided", "0": "No difference", "1": "Difference"} return { 'standard_number_or_code': value.get('a'), 'terms_of_availability': value.get('c'), 'additional_codes_following_the_standard_number_or_code': value.get( 'd'), 'qualifying_information': utils.force_list( value.get('q')), 'source_of_number_or_code': value.get('2'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8')), 'canceled_invalid_standard_number_or_code': utils.force_list( value.get('z')), 'type_of_standard_number_or_code': indicator_map1.get( key[3]), 'difference_indicator': indicator_map2.get( key[4]), }
def series_statement_added_entry_title(self, key, value): """Series Statement/Added Entry-Title.""" indicator_map2 = { "0": "No nonfiling characters", "1": "Number of nonfiling characters", "2": "Number of nonfiling characters", "3": "Number of nonfiling characters", "4": "Number of nonfiling characters", "5": "Number of nonfiling characters", "6": "Number of nonfiling characters", "7": "Number of nonfiling characters", "8": "Number of nonfiling characters", "9": "Number of nonfiling characters"} return { 'title': value.get('a'), 'international_standard_serial_number': value.get('x'), 'name_of_part_section_of_a_work': utils.force_list( value.get('p') ), 'volume_sequential_designation': value.get('v'), 'number_of_part_section_of_a_work': utils.force_list( value.get('n') ), 'authority_record_control_number': utils.force_list( value.get('0') ), 'bibliographic_record_control_number': utils.force_list( value.get('w') ), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'nonfiling_characters': indicator_map2.get(key[4]), }
def cumulative_index_finding_aids_note(self, key, value): """Cumulative Index/Finding Aids Note.""" indicator_map1 = { "#": "Indexes", "0": "Finding aids", "8": "No display constant generated"} return { 'cumulative_index_finding_aids_note': utils.force_list( value.get('a') ), 'degree_of_control': utils.force_list( value.get('c') ), 'availability_source': value.get('b'), 'bibliographic_reference': utils.force_list( value.get('d') ), 'materials_specified': utils.force_list( value.get('3') ), 'uniform_resource_identifier': value.get('u'), 'linkage': utils.force_list( value.get('6') ), 'field_link_and_sequence_number': value.get('8'), 'display_constant_controller': indicator_map1.get(key[3]), }
def parse_institution_address(address, city, state_province, country, postal_code, country_code): """Parse an institution address.""" state_province = match_us_state(state_province) or state_province postal_code = force_list(postal_code) country = force_list(country) country_code = match_country_code(country_code) if isinstance(postal_code, (tuple, list)): postal_code = ', '.join(postal_code) if isinstance(city, (tuple, list)): city = ', '.join(city) if isinstance(country, (tuple, list)): country = ', '.join(set(country)) if not country_code and country: country_code = match_country_name_to_its_code(country) if not country_code and state_province.startswith('US-'): country_code = 'US' return { 'original_address': force_list(address), 'city': city, 'state': state_province, 'country': country, 'postal_code': postal_code, 'country_code': country_code, }
def translation_of_title_by_cataloging_agency(self, key, value): """Translation of Title by Cataloging Agency.""" indicator_map1 = {"0": "No added entry", "1": "Added entry"} indicator_map2 = { "0": "No nonfiling characters", "1": "Number of nonfiling characters", "2": "Number of nonfiling characters", "3": "Number of nonfiling characters", "4": "Number of nonfiling characters", "5": "Number of nonfiling characters", "6": "Number of nonfiling characters", "7": "Number of nonfiling characters", "8": "Number of nonfiling characters", "9": "Number of nonfiling characters"} return { 'title': value.get('a'), 'statement_of_responsibility': value.get('c'), 'remainder_of_title': value.get('b'), 'medium': value.get('h'), 'number_of_part_section_of_a_work': utils.force_list( value.get('n') ), 'name_of_part_section_of_a_work': utils.force_list( value.get('p') ), 'linkage': value.get('6'), 'language_code_of_translated_title': value.get('y'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'title_added_entry': indicator_map1.get(key[3]), 'nonfiling_characters': indicator_map2.get(key[4]), }
def security_classification_control(self, key, value): """Security Classification Control.""" indicator_map1 = { "0": "Document", "1": "Title", "2": "Abstract", "3": "Contents note", "4": "Author", "5": "Record", "8": "None of the above"} return { 'security_classification': value.get('a'), 'external_dissemination_information': utils.force_list( value.get('c') ), 'handling_instructions': utils.force_list( value.get('b') ), 'classification_system': value.get('e'), 'downgrading_or_declassification_event': value.get('d'), 'downgrading_date': value.get('g'), 'country_of_origin_code': value.get('f'), 'declassification_date': value.get('h'), 'authorization': utils.force_list( value.get('j') ), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'controlled_element': indicator_map1.get(key[3]), }
def normalized_date_and_sequential_designation(self, key, value): """Normalized Date and Sequential Designation.""" indicator_map1 = { "#": "No information provided", "0": "Starting information", "1": "Ending information"} indicator_map2 = {"#": "Not specified", "0": "Closed", "1": "Open"} return { 'first_level_of_enumeration': value.get('a'), 'nonpublic_note': utils.force_list( value.get('x') ), 'third_level_of_enumeration': value.get('c'), 'second_level_of_enumeration': value.get('b'), 'fifth_level_of_enumeration': value.get('e'), 'fourth_level_of_enumeration': value.get('d'), 'alternative_numbering_scheme_first_level_of_enumeration': value.get('g'), 'sixth_level_of_enumeration': value.get('f'), 'first_level_of_chronology': value.get('i'), 'alternative_numbering_scheme_second_level_of_enumeration': value.get('h'), 'third_level_of_chronology': value.get('k'), 'second_level_of_chronology': value.get('j'), 'alternative_numbering_scheme_chronology': value.get('m'), 'fourth_level_of_chronology': value.get('l'), 'first_level_textual_designation': value.get('u'), 'linkage': value.get('6'), 'field_link_and_sequence_number': value.get('8'), 'public_note': utils.force_list( value.get('z') ), 'first_level_of_chronology_issuance': value.get('v'), 'start_end_designator': indicator_map1.get(key[3]), 'state_of_issuance': indicator_map2.get(key[4]), }
def classification_numbers_assigned_in_canada(self, key, value): """Classification Numbers Assigned in Canada.""" indicator_map1 = {"#": "Information not provided", "0": "Work held by LAC", "1": "Work not held by LAC"} indicator_map2 = { "0": "LC-based call number assigned by LAC", "1": "Complete LC class number assigned by LAC", "2": "Incomplete LC class number assigned by LAC", "3": "LC-based call number assigned by the contributing library", "4": "Complete LC class number assigned by the contributing library", "5": "Incomplete LC class number assigned by the contributing library", "6": "Other call number assigned by LAC", "7": "Other class number assigned by LAC", "8": "Other call number assigned by the contributing library", "9": "Other class number assigned by the contributing library"} return { 'classification_number': utils.force_list( value.get('a')), 'field_link_and_sequence_number': value.get('8'), 'source_of_call_class_number': utils.force_list( value.get('2')), 'item_number': utils.force_list( value.get('b')), 'linkage': utils.force_list( value.get('6')), 'existence_in_lac_collection': indicator_map1.get( key[3]), 'type_completeness_source_of_class_call_number': indicator_map2.get( key[4]), }
def copyright_or_legal_deposit_number(self, key, value): """Copyright or Legal Deposit Number.""" indicator_map2 = { "#": "Copyright or legal deposit number", "8": "No display constant generated"} return { 'copyright_or_legal_deposit_number': value.get('a'), 'assigning_agency': utils.force_list( value.get('b') ), 'date': utils.force_list( value.get('d') ), 'display_text': utils.force_list( value.get('i') ), 'source': utils.force_list( value.get('2') ), 'linkage': utils.force_list( value.get('6') ), 'field_link_and_sequence_number': value.get('8'), 'canceled_invalid_copyright_or_legal_deposit_number': value.get('z'), 'display_constant_controller': indicator_map2.get(key[4]), }
def publisher_number(self, key, value): """Publisher Number.""" indicator_map1 = { "0": "Issue number", "1": "Matrix number", "2": "Plate number", "3": "Other music number", "4": "Videorecording number", "5": "Other publisher number"} indicator_map2 = {"0": "No note, no added entry", "1": "Note, added entry", "2": "Note, no added entry", "3": "No note, added entry"} return { 'publisher_number': utils.force_list( value.get('a') ), 'field_link_and_sequence_number': value.get('8'), 'source': utils.force_list( value.get('b') ), 'qualifying_information': value.get('q'), 'linkage': utils.force_list( value.get('6') ), 'type_of_publisher_number': indicator_map1.get(key[3]), 'note_added_entry_controller': indicator_map2.get(key[4]), }
def complex_linking_entry_data(self, key, value): """Complex Linking Entry Data.""" indicator_map2 = { "0": "Library of Congress Subject Headings", "1": "LC subject headings for children\u0027s literature", "2": "Medical Subject Headings", "3": "National Agricultural Library subject authority file", "4": "Source not specified", "5": "Canadian Subject Headings", "6": "R\\xc3\\xa9pertoire de vedettes-mati\\xc3\\xa8re", "7": "Source specified in subfield $2"} return { 'heading_referred_to': utils.force_list( value.get('a') ), 'explanatory_text': utils.force_list( value.get('i') ), 'source_of_heading_or_term': value.get('2'), 'institution_to_which_field_applies': utils.force_list( value.get('5') ), 'relationship_code': utils.force_list( value.get('4') ), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'thesaurus': indicator_map2.get(key[4]), }
def established_heading_linking_entry_meeting_name(self, key, value): """Established Heading Linking Entry-Meeting Name.""" indicator_map1 = { "0": "Inverted name", "1": "Jurisdiction name", "2": "Name in direct order"} indicator_map2 = { "0": " Library of Congress Subject Headings", "1": "LC subject headings for children\u0027s literature", "2": " Medical Subject Headings", "3": "National Agricultural Library subject authority file", "4": "Source not specified", "5": " Canadian Subject Headings", "6": " R\\xc3\\xa9pertoire de vedettes-mati\\xc3\\xa8re", "7": "Source specified in subfield $2"} return { 'authority_record_control_number_or_standard_number': utils.force_list( value.get('0')), 'source_of_heading_or_term': value.get('2'), 'institution_to_which_field_applies': utils.force_list( value.get('5')), 'relationship_code': utils.force_list( value.get('4')), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8')), 'meeting_name_or_jurisdiction_name_as_entry_element': value.get('a'), 'location_of_meeting': utils.force_list( value.get('c')), 'subordinate_unit': utils.force_list( value.get('e')), 'date_of_meeting': value.get('d'), 'miscellaneous_information': utils.force_list( value.get('g')), 'date_of_a_work': value.get('f'), 'relationship_information': utils.force_list( value.get('i')), 'medium': value.get('h'), 'form_subheading': utils.force_list( value.get('k')), 'relator_term': utils.force_list( value.get('j')), 'language_of_a_work': value.get('l'), 'number_of_part_section_meeting': utils.force_list( value.get('n')), 'name_of_meeting_following_jurisdiction_name_entry_element': value.get('q'), 'name_of_part_section_of_a_work': utils.force_list( value.get('p')), 'version': value.get('s'), 'title_of_a_work': value.get('t'), 'control_subfield': value.get('w'), 'form_subdivision': utils.force_list( value.get('v')), 'chronological_subdivision': utils.force_list( value.get('y')), 'general_subdivision': utils.force_list( value.get('x')), 'geographic_subdivision': utils.force_list( value.get('z')), 'type_of_meeting_name_entry_element': indicator_map1.get( key[3]), 'thesaurus': indicator_map2.get( key[4]), }
def language_code(self, key, value): """Language Code.""" indicator_map1 = { "#": "No information provided", "0": "Item not a translation/does not include a translation", "1": "Item is or includes a translation"} return { 'language_code_of_text_sound_track_or_separate_title': value.get('a'), 'language_code_of_summary_or_abstract': value.get('b'), 'language_code_of_librettos': value.get('e'), 'language_code_of_sung_or_spoken_text': value.get('d'), 'language_code_of_accompanying_material_other_than_librettos': value.get('g'), 'language_code_of_table_of_contents': value.get('f'), 'language_code_of_original': value.get('h'), 'language_code_of_intermediate_translations': value.get('k'), 'language_code_of_subtitles_or_captions': value.get('j'), 'language_code_of_original_accompanying_materials_other_than_librettos': value.get('m'), 'language_code_of_original_libretto': value.get('n'), 'source_of_code': utils.force_list( value.get('2')), 'linkage': utils.force_list( value.get('6')), 'field_link_and_sequence_number': value.get('8'), 'translation_indication': indicator_map1.get( key[3]), }
def dewey_decimal_classification_number(self, key, value): """Dewey Decimal Classification Number.""" indicator_map1 = {"0": "Full edition", "1": "Abridged edition", "7": "Other edition specified in subfield $2"} indicator_map2 = { "#": "No information provided", "0": "Assigned by LC", "4": "Assigned by agency other than LC"} return { 'classification_number': value.get('a'), 'item_number': utils.force_list( value.get('b') ), 'standard_or_optional_designation': utils.force_list( value.get('m') ), 'assigning_agency': utils.force_list( value.get('q') ), 'edition_number': utils.force_list( value.get('2') ), 'linkage': utils.force_list( value.get('6') ), 'field_link_and_sequence_number': value.get('8'), 'type_of_edition': indicator_map1.get(key[3]), 'source_of_classification_number': indicator_map2.get(key[4]), }
def production_publication_distribution_manufacture_and_copyright_notice( self, key, value): """Production, Publication, Distribution, Manufacture, and Copyright Notice.""" indicator_map1 = { "#": "Not applicable/No information provided/Earliest", "2": "Intervening", "3": "Current/latest"} indicator_map2 = { "0": "Production", "1": "Publication", "2": "Distribution", "3": "Manufacture", "4": "Copyright notice date"} return { 'place_of_production_publication_distribution_manufacture': utils.force_list( value.get('a') ), 'date_of_production_publication_distribution_manufacture_or_copyright_notice': utils.force_list( value.get('c') ), 'name_of_producer_publisher_distributor_manufacturer': utils.force_list( value.get('b') ), 'materials_specified': value.get('3'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'sequence_of_statements': indicator_map1.get(key[3]), 'function_of_entity': indicator_map2.get(key[4]), }
def replacement_record_information(self, key, value): """Replacement Record Information.""" field_map = { 'a': 'replacement_title', 'i': 'explanatory_text', 'w': 'replacement_bibliographic_record_control_number', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'replacement_title': utils.force_list( value.get('a') ), 'explanatory_text': utils.force_list( value.get('i') ), 'replacement_bibliographic_record_control_number': utils.force_list( value.get('w') ), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), }
def dewey_decimal_classification_number(self, key, value): """Dewey Decimal Classification Number.""" indicator_map1 = { "0": "Full", "1": "Abridged", "7": "Other edition specified in subfield $2"} indicator_map2 = { "0": "Assigned by LC", "4": "Assigned by agency other than LC"} return { 'classification_number_element_single_number_or_beginning_number_of_span': value.get('a'), 'explanatory_term': value.get('c'), 'classification_number_element_ending_number_of_span': value.get('b'), 'edition_number': value.get('2'), 'institution_to_which_field_applies': utils.force_list( value.get('5')), 'linkage': value.get('6'), 'table_sequence_number_for_internal_subarrangement_or_add_table': utils.force_list( value.get('y')), 'field_link_and_sequence_number': utils.force_list( value.get('8')), 'table_identification_table_number': value.get('z'), 'type_of_edition': indicator_map1.get( key[3]), 'source_of_classification_number': indicator_map2.get( key[4]), }
def international_standard_serial_number(self, key, value): """International Standard Serial Number.""" indicator_map1 = { "#": "No level specified", "0": "Continuing resource of international interest", "1": "Continuing resource not of international interest"} return { 'international_standard_serial_number': utils.force_list( value.get('a') ), 'canceled_issn_l': value.get('m'), 'issn_l': utils.force_list( value.get('l') ), 'source': utils.force_list( value.get('2') ), 'linkage': utils.force_list( value.get('6') ), 'incorrect_issn': value.get('y'), 'field_link_and_sequence_number': value.get('8'), 'canceled_issn': value.get('z'), 'level_of_international_interest': indicator_map1.get(key[3]), }
def added_entry_uncontrolled_name(self, key, value): """Added Entry-Uncontrolled Name.""" indicator_map1 = {"1": "Personal", "2": "Other", "_": "Not specified"} field_map = { "e": "relator_term", "a": "name", "4": "relator_code", "6": "linkage", "8": "field_link_and_sequence_number", } order = utils.map_order(field_map, value) if key[3] in indicator_map1: order.append("type_of_name") return { "__order__": tuple(order) if len(order) else None, "relator_term": utils.force_list(value.get("e")), "name": value.get("a"), "relator_code": utils.force_list(value.get("4")), "linkage": value.get("6"), "field_link_and_sequence_number": utils.force_list(value.get("8")), "type_of_name": indicator_map1.get(key[3]), }
def public_general_note(self, key, value): """Public General Note.""" field_map = { 'a': 'heading_or_subdivision_term', 'i': 'explanatory_text', '5': 'institution_to_which_field_applies', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'heading_or_subdivision_term': utils.force_list( value.get('a') ), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'institution_to_which_field_applies': utils.force_list( value.get('5') ), 'explanatory_text': utils.force_list( value.get('i') ), 'linkage': value.get('6'), }
def index_term_curriculum_objective(self, key, value): """Index Term-Curriculum Objective.""" field_map = { 'a': 'main_curriculum_objective', 'b': 'subordinate_curriculum_objective', 'c': 'curriculum_code', 'd': 'correlation_factor', '2': 'source_of_term_or_code', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'main_curriculum_objective': value.get('a'), 'subordinate_curriculum_objective': utils.force_list( value.get('b') ), 'curriculum_code': value.get('c'), 'correlation_factor': value.get('d'), 'source_of_term_or_code': value.get('2'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), }
def succeeding_entry(self, key, value): """Succeeding Entry.""" indicator_map1 = {"0": "Display note", "1": "Do not display note"} indicator_map2 = { "0": "Continued by", "1": "Continued in part by", "2": "Superseded by", "3": "Superseded in part by", "4": "Absorbed by", "5": "Absorbed in part by", "6": "Split into ... and ...", "7": "Merged with ... to form ...", "8": "Changed back to"} return { 'relationship_code': utils.force_list( value.get('4') ), 'control_subfield': value.get('7'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'main_entry_heading': value.get('a'), 'qualifying_information': value.get('c'), 'edition': value.get('b'), 'place_publisher_and_date_of_publication': value.get('d'), 'related_parts': utils.force_list( value.get('g') ), 'relationship_information': utils.force_list( value.get('i') ), 'physical_description': value.get('h'), 'series_data_for_related_item': utils.force_list( value.get('k') ), 'material_specific_details': value.get('m'), 'other_item_identifier': utils.force_list( value.get('o') ), 'note': utils.force_list( value.get('n') ), 'uniform_title': value.get('s'), 'report_number': utils.force_list( value.get('r') ), 'standard_technical_report_number': value.get('u'), 'title': value.get('t'), 'record_control_number': utils.force_list( value.get('w') ), 'coden_designation': value.get('y'), 'international_standard_serial_number': value.get('x'), 'international_standard_book_number': utils.force_list( value.get('z') ), 'note_controller': indicator_map1.get(key[3]), 'type_of_relationship': indicator_map2.get(key[4]), }
def marc21_to_translated_from(self, key, value): """Get language. languages: 008 and 041 [$a, repetitive] """ languages = self.get('language', []) unique_lang = [] if languages != []: unique_lang.extend(language['value'] for language in languages) if language := value.get('a'): for lang in utils.force_list(language): if lang not in unique_lang: unique_lang.append(lang) languages.append({'type': 'bf:Language', 'value': lang})
def marc21_to_title(self, key, value): """Get title. title: 245$a without the punctuaction. If there's a $b, then 245$a : $b without the " /" """ main_title = remove_punctuation(value.get('a')) sub_title = value.get('b') # responsability = value.get('c') if sub_title: main_title += ' : ' + ' : '.join( utils.force_list(remove_punctuation(sub_title)) ) return main_title
def key(self, key, value): """Key.""" indicator_map1 = { "#": "Relationship to original unknown ", "0": "Original key ", "1": "Transposed key "} return { 'key': value.get('a'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'linkage': value.get('6'), 'key_type': indicator_map1.get(key[3]), }
def physical_description(self, key, value): """Physical Description.""" return { 'extent': utils.force_list( value.get('a') ), 'dimensions': utils.force_list( value.get('c') ), 'other_physical_details': value.get('b'), 'accompanying_material': value.get('e'), 'size_of_unit': utils.force_list( value.get('g') ), 'type_of_unit': utils.force_list( value.get('f') ), 'materials_specified': value.get('3'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), }
def unimarclanguages(self, key, value): """Get languages. languages: 008 and 041 [$a, repetitive] """ languages = utils.force_list(value.get('a')) to_return = [] schema_in_bytes = resource_string('rero_ils.modules.documents.jsonschemas', 'documents/document-v0.0.1.json') schema = loads(schema_in_bytes.decode('utf8')) langs = schema['properties']['language']['items']['properties']['value'][ 'enum'] for language in languages: if language in langs: to_return.append({'language': language}) translatedsfrom = utils.force_list(value.get('c')) if translatedsfrom: self['translatedFrom'] = [] for translatedfrom in translatedsfrom: self['translatedFrom'].append(translatedfrom) return to_return
def immediate_source_of_acquisition_note(self, key, value): """Immediate Source of Acquisition Note.""" indicator_map1 = { "#": "No information provided", "0": "Private", "1": "Not private" } return { 'source_of_acquisition': value.get('a'), 'method_of_acquisition': value.get('c'), 'address': value.get('b'), 'accession_number': value.get('e'), 'date_of_acquisition': value.get('d'), 'owner': value.get('f'), 'purchase_price': value.get('h'), 'type_of_unit': utils.force_list(value.get('o')), 'extent': utils.force_list(value.get('n')), 'materials_specified': value.get('3'), 'institution_to_which_field_applies': value.get('5'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list(value.get('8')), 'privacy': indicator_map1.get(key[3]), }
def marc21_to_description(self, key, value): """Get extent, otherMaterialCharacteristics, formats. extent: 300$a (the first one if many) otherMaterialCharacteristics: 300$b (the first one if many) formats: 300 [$c repetitive] """ if value.get('a'): if not self.get('extent', None): self['extent'] = remove_punctuation( utils.force_list(value.get('a'))[0]) if value.get('b'): if self.get('otherMaterialCharacteristics', []) == []: self['otherMaterialCharacteristics'] = remove_punctuation( utils.force_list(value.get('b'))[0]) if value.get('c'): formats = self.get('formats', None) if not formats: data = value.get('c') formats = list(utils.force_list(data)) return formats else: return None
def references(self, key, value): """Produce list of references.""" value = utils.force_list(value) def get_value(value): recid = None number = '' year = '' if '0' in value: try: recid = int(value.get('0')) except: pass if 'o' in value: try: number = int(value.get('o')) except: pass if 'y' in value: try: year = int(value.get('y')) except: pass return { 'record': inspire_dojson_utils.get_record_ref(recid, 'literature'), 'texkey': value.get('1'), 'doi': value.get('a'), 'collaboration': utils.force_list(value.get('c')), 'editors': value.get('e'), 'authors': utils.force_list(value.get('h')), 'misc': utils.force_list(value.get('m')), 'number': number, 'isbn': value.get('i'), 'publisher': utils.force_list(value.get('p')), 'maintitle': value.get('q'), 'report_number': utils.force_list(value.get('r')), 'title': utils.force_list(value.get('t')), 'url': utils.force_list(value.get('u')), 'journal_pubnote': utils.force_list(value.get('s')), 'raw_reference': utils.force_list(value.get('x')), 'year': year, } references = self.get('references', []) for val in value: references.append(get_value(val)) return inspire_dojson_utils.remove_duplicates_from_list( strip_empty_values(references))
def unimarc_languages(self, key, value): """Get languages. languages: 008 and 041 [$a, repetitive] """ languages = utils.force_list(value.get('a')) to_return = [] schema_in_bytes = resource_string('rero_ils.jsonschemas', 'common/languages-v0.0.1.json') schema = jsonref.loads(schema_in_bytes.decode('utf8')) langs = schema['language']['enum'] for language in languages: if language in langs: to_return.append({'value': language, 'type': 'bf:Language'}) translatedsfrom = utils.force_list(value.get('c')) if translatedsfrom: self['translatedFrom'] = [] for translatedfrom in translatedsfrom: self['translatedFrom'].append(translatedfrom) return to_return
def dewey_decimal_call_number(self, key, value): """Dewey Decimal Call Number.""" indicator_map1 = { "0": "Full", "1": "Abridged", "7": "Other edition specified in subfield $2" } indicator_map2 = { "#": "No information provided", "0": "Assigned by LC", "4": "Assigned by agency other than LC" } return { 'classification_number': value.get('a'), 'item_number': value.get('b'), 'volumes_dates_to_which_call_number_applies': value.get('d'), 'edition_number': value.get('2'), 'institution_to_which_field_applies': utils.force_list(value.get('5')), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list(value.get('8')), 'type_of_edition': indicator_map1.get(key[3]), 'source_of_call_number': indicator_map2.get(key[4]), }
def other_distinguishing_characteristics_of_work_or_expression(self, key, value): """Other Distinguishing Characteristics of Work or Expression.""" field_map = { "a": "other_distinguishing_characteristic", "u": "uniform_resource_identifier", "v": "source_of_information", "0": "record_control_number", "2": "source_of_term", "6": "linkage", "8": "field_link_and_sequence_number", } order = utils.map_order(field_map, value) return { "__order__": tuple(order) if len(order) else None, "other_distinguishing_characteristic": utils.force_list(value.get("a")), "source_of_information": utils.force_list(value.get("v")), "record_control_number": utils.force_list(value.get("0")), "source_of_term": value.get("2"), "uniform_resource_identifier": utils.force_list(value.get("u")), "linkage": value.get("6"), "field_link_and_sequence_number": utils.force_list(value.get("8")), }
def dois(self, key, value): """Translates dois fields.""" _identifiers = self.get("identifiers", []) dois_url_prefix = current_app.config['CDS_ILS_DOI_URL_PREFIX'] def _clean_doi_access(subfield): return subfield.lower().replace("(open access)", "").strip() def clean_material(subfield_q): return re.sub(r'\([^)]*\)', '', subfield_q).strip() def create_eitem(subfield_a, subfield_q): eitems_external = self["_migration"]["eitems_external"] open_access = False if subfield_q: open_access = "open access" in subfield_q.lower() subfield_q = _clean_doi_access(subfield_q) eitem = { "url": { "description": subfield_q or "e-book", "value": dois_url_prefix.format(doi=subfield_a), }, "open_access": open_access } eitems_external.append(eitem) for v in force_list(value): subfield_q = clean_val("q", v, str) subfield_a = clean_val("a", v, str, req=True) create_eitem(subfield_a=subfield_a, subfield_q=subfield_q) if subfield_q: subfield_q = clean_material(subfield_q) # vocabulary controlled material = mapping( IDENTIFIERS_MEDIUM_TYPES, subfield_q, raise_exception=True, ) doi = { "value": subfield_a, "material": material, "scheme": "DOI", } if doi not in _identifiers: _identifiers.append(doi) self["_migration"]["eitems_has_external"] = True return _identifiers
def title_variation(self, key, value): """Title variation.""" value = utils.force_list(value) def get_value(value): return value.get('a') title_variation_list = self.get('title_variation', []) for element in value: title_variation_list.append(get_value(element)) return inspire_dojson_utils.remove_duplicates_from_list( title_variation_list)
def unimarctitle(self, key, value): """Get title. title: 200$a If there's a $e, then 245$a : $e """ main_title = value.get('a') sub_title = value.get('e') # responsability = value.get('c') if sub_title: main_title += ' : ' + ' : '.join( utils.force_list(sub_title) ) return main_title
def creator_contributor_characteristics(self, key, value): """Creator/Contributor Characteristics.""" return { 'creator_contributor_term': value.get('a'), 'creator_contributor_code': value.get('b'), 'demographic_group_term': utils.force_list( value.get('m') ), 'demographic_group_code': utils.force_list( value.get('n') ), 'authority_record_control_number_or_standard_number': value.get('0'), 'materials_specified': utils.force_list( value.get('3') ), 'source': utils.force_list( value.get('2') ), 'linkage': utils.force_list( value.get('6') ), 'field_link_and_sequence_number': value.get('8'), }
def heading_genre_form_term(self, key, value): """Heading-Genre/Form Term.""" field_map = { "a": "genre_form_term", "v": "form_subdivision", "x": "general_subdivision", "y": "chronological_subdivision", "z": "geographic_subdivision", "6": "linkage", "8": "field_link_and_sequence_number", } order = utils.map_order(field_map, value) return { "__order__": tuple(order) if len(order) else None, "genre_form_term": value.get("a"), "general_subdivision": utils.force_list(value.get("x")), "linkage": value.get("6"), "form_subdivision": utils.force_list(value.get("v")), "chronological_subdivision": utils.force_list(value.get("y")), "field_link_and_sequence_number": utils.force_list(value.get("8")), "geographic_subdivision": utils.force_list(value.get("z")), }
def immediate_source_of_acquisition_note(self, key, value): """Immediate Source of Acquisition Note.""" return { 'source_of_acquisition': value.get('a'), 'method_of_acquisition': value.get('c'), 'address': value.get('b'), 'accession_number': value.get('e'), 'date_of_acquisition': value.get('d'), 'owner': value.get('f'), 'purchase_price': value.get('h'), 'type_of_unit': utils.force_list( value.get('o') ), 'extent': utils.force_list( value.get('n') ), 'materials_specified': value.get('3'), 'institution_to_which_field_applies': value.get('5'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), }
def occupation(self, key, value): """Occupation.""" return { 'occupation': utils.force_list( value.get('a') ), 'source_of_information': utils.force_list( value.get('v') ), 'record_control_number': utils.force_list( value.get('0') ), 'start_period': value.get('s'), 'source_of_term': value.get('2'), 'uniform_resource_identifier': utils.force_list( value.get('u') ), 'end_period': value.get('t'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), }
def marc21_to_subjects(self, key, value): """Get subjects. subjects: 6xx [duplicates could exist between several vocabularies, if possible deduplicate] """ subjects = self.get('subjects', []) subfields_a = utils.force_list(value.get('a')) if subfields_a: for subfield_a in subfields_a: if subfield_a not in subjects: subjects.append(subfield_a) if subjects: self['subjects'] = subjects
def sound_characteristics(self, key, value): """Sound Characteristics.""" return { 'type_of_recording': value.get('a'), 'playing_speed': value.get('c'), 'recording_medium': value.get('b'), 'track_configuration': value.get('e'), 'groove_characteristic': value.get('d'), 'configuration_of_playback_channels': value.get('g'), 'tape_configuration': value.get('f'), 'special_playback_characteristics': value.get('h'), 'authority_record_control_number_or_standard_number': value.get('0'), 'materials_specified': utils.force_list( value.get('3') ), 'source': utils.force_list( value.get('2') ), 'linkage': utils.force_list( value.get('6') ), 'field_link_and_sequence_number': value.get('8'), }
def national_bibliographic_agency_control_number(self, key, value): """National Bibliographic Agency Control Number.""" field_map = { 'a': 'record_control_number', 'z': 'canceled_or_invalid_record_control_number', '2': 'source', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'record_control_number': value.get('a'), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'source': value.get('2'), 'canceled_or_invalid_record_control_number': utils.force_list( value.get('z') ), 'national_bibliographic_agency': value.get('2') if key[3] == '7' else 'Library and Archives Canada', }
def eitem(self, key, value): """Translate included eitems.""" _eitem = self.get("_eitem", {}) urls = [] for v in force_list(value): urls.append( { "description": "E-book by Springer", "value": clean_val("u", v, str), } ) _eitem.update({"urls": urls}) return _eitem
def dewey_decimal_classification_number(self, key, value): """Dewey Decimal Classification Number.""" indicator_map1 = { "0": "Full edition", "1": "Abridged edition", "7": "Other edition specified in subfield $2" } indicator_map2 = { "#": "No information provided", "0": "Assigned by LC", "4": "Assigned by agency other than LC" } return { 'classification_number': utils.force_list(value.get('a')), 'item_number': value.get('b'), 'standard_or_optional_designation': value.get('m'), 'assigning_agency': value.get('q'), 'edition_number': value.get('2'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list(value.get('8')), 'type_of_edition': indicator_map1.get(key[3]), 'source_of_classification_number': indicator_map2.get(key[4]), }
def heading_genre_form_term(self, key, value): """Heading-Genre/Form Term.""" field_map = { 'a': 'genre_form_term', 'v': 'form_subdivision', 'x': 'general_subdivision', 'y': 'chronological_subdivision', 'z': 'geographic_subdivision', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'genre_form_term': value.get('a'), 'general_subdivision': utils.force_list(value.get('x')), 'linkage': value.get('6'), 'form_subdivision': utils.force_list(value.get('v')), 'chronological_subdivision': utils.force_list(value.get('y')), 'field_link_and_sequence_number': utils.force_list(value.get('8')), 'geographic_subdivision': utils.force_list(value.get('z')), }
def see_from_tracing_medium_of_performance_term(self, key, value): """See From Tracing-Medium of Performance Term.""" field_map = { 'a': 'medium_of_performance_term', 'i': 'relationship_information', 'w': 'control_subfield', '4': 'relationship_code', '5': 'institution_to_which_field_applies', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'medium_of_performance_term': value.get('a'), 'relationship_information': utils.force_list(value.get('i')), 'institution_to_which_field_applies': utils.force_list(value.get('5')), 'relationship_code': utils.force_list(value.get('4')), 'control_subfield': value.get('w'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list(value.get('8')), }
def see_also_from_tracing_geographic_name(self, key, value): """See Also From Tracing-Geographic Name.""" return { 'geographic_name': value.get('a'), 'general_subdivision': utils.force_list( value.get('x') ), 'miscellaneous_information': utils.force_list( value.get('g') ), 'relationship_information': utils.force_list( value.get('i') ), 'form_subdivision': utils.force_list( value.get('v') ), 'authority_record_control_number_or_standard_number': utils.force_list( value.get('0') ), 'institution_to_which_field_applies': utils.force_list( value.get('5') ), 'relationship_code': utils.force_list( value.get('4') ), 'control_subfield': value.get('w'), 'linkage': value.get('6'), 'chronological_subdivision': utils.force_list( value.get('y') ), 'field_link_and_sequence_number': utils.force_list( value.get('8') ), 'geographic_subdivision': utils.force_list( value.get('z') ), }
def time_period_of_heading(self, key, value): """Time Period of Heading.""" field_map = { "a": "time_period_code", "b": "formatted_9999_bc_through_ce_time_period", "c": "formatted_pre_9999_bc_time_period", "6": "linkage", "8": "field_link_and_sequence_number", } order = utils.map_order(field_map, value) indicator_map1 = { "_": "Subfield $b or $c not present", "0": "Single date/time", "1": "Multiple single dates/times", "2": "Range of dates/times", } if key[3] in indicator_map1: order.append("type_of_time_period_in_subfield_b_or_c") return { "__order__": tuple(order) if len(order) else None, "time_period_code": utils.force_list(value.get("a")), "field_link_and_sequence_number": utils.force_list(value.get("8")), "formatted_pre_9999_bc_time_period": utils.force_list(value.get("c")), "formatted_9999_bc_through_ce_time_period": utils.force_list(value.get("b")), "linkage": value.get("6"), "type_of_time_period_in_subfield_b_or_c": indicator_map1.get(key[3]), }
def established_heading_linking_entry_genre_form_term(self, key, value): """Established Heading Linking Entry-Genre/Form Term.""" indicator_map2 = { "0": "Library of Congress Subject Headings", "1": "LC subject headings for children's literature", "2": "Medical Subject Headings", "3": "National Agricultural Library subject authority file", "4": "Source not specified", "5": "Canadian Subject Headings", "6": "Répertoire de vedettes-matière", "7": "Source specified in subfield $2" } return { 'genre_form_term_as_entry_element': value.get('a'), 'general_subdivision': utils.force_list(value.get('x')), 'relationship_information': utils.force_list(value.get('i')), 'form_subdivision': utils.force_list(value.get('v')), 'authority_record_control_number_or_standard_number': utils.force_list(value.get('0')), 'source_of_heading_or_term': value.get('2'), 'institution_to_which_field_applies': utils.force_list(value.get('5')), 'relationship_code': utils.force_list(value.get('4')), 'control_subfield': value.get('w'), 'linkage': value.get('6'), 'chronological_subdivision': utils.force_list(value.get('y')), 'field_link_and_sequence_number': utils.force_list(value.get('8')), 'geographic_subdivision': utils.force_list(value.get('z')), 'thesaurus': indicator_map2.get(key[4]), }
def creator_contributor_characteristics(self, key, value): """Creator/Contributor Characteristics.""" field_map = { 'a': 'creator_contributor_term', 'b': 'creator_contributor_code', 'm': 'demographic_group_term', 'n': 'demographic_group_code', '0': 'authority_record_control_number_or_standard_number', '2': 'source', '3': 'materials_specified', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) return { '__order__': tuple(order) if len(order) else None, 'creator_contributor_term': utils.force_list(value.get('a')), 'creator_contributor_code': utils.force_list(value.get('b')), 'demographic_group_term': value.get('m'), 'demographic_group_code': value.get('n'), 'authority_record_control_number_or_standard_number': utils.force_list(value.get('0')), 'materials_specified': value.get('3'), 'source': value.get('2'), 'linkage': value.get('6'), 'field_link_and_sequence_number': utils.force_list(value.get('8')), }
def abbreviated_title(self, key, value): """Abbreviated Title.""" indicator_map1 = { '0': 'No added entry', '1': 'Added entry', } indicator_map2 = { '_': 'Abbreviated key title', '0': 'Other abbreviated title', } field_map = { 'a': 'abbreviated_title', 'b': 'qualifying_information', '2': 'source', '6': 'linkage', '8': 'field_link_and_sequence_number', } order = utils.map_order(field_map, value) if key[3] in indicator_map1: order.append('title_added_entry') if key[4] in indicator_map2: order.append('type') return { '__order__': tuple(order) if len(order) else None, 'abbreviated_title': value.get('a'), 'field_link_and_sequence_number': utils.force_list(value.get('8')), 'source': utils.force_list(value.get('2')), 'qualifying_information': value.get('b'), 'linkage': value.get('6'), 'title_added_entry': indicator_map1.get(key[3]), 'type': indicator_map2.get(key[4]), }