def merge_record_with_template(rec, template_name): """ Extend the record rec with the contents of the template and return it""" template = get_record_template(template_name) if not template: return template_bibrec = create_record(template)[0] for field_tag in template_bibrec: if not record_has_field(rec, field_tag): for field_instance in template_bibrec[field_tag]: record_add_field(rec, field_tag, field_instance[1], field_instance[2], subfields=field_instance[0]) else: for template_field_instance in template_bibrec[field_tag]: subfield_codes_template = field_get_subfield_codes( template_field_instance) for field_instance in rec[field_tag]: subfield_codes = field_get_subfield_codes(field_instance) for code in subfield_codes_template: if code not in subfield_codes: field_add_subfield( field_instance, code, field_get_subfield_values( template_field_instance, code)[0]) return rec
def merge_record_with_template(rec, template_name, is_hp_record=False): """ Extend the record rec with the contents of the template and return it""" template = get_record_template(template_name) if not template: return template_bibrec = create_record(template)[0] # if the record is a holding pen record make all subfields volatile if is_hp_record: record_make_all_subfields_volatile(template_bibrec) for field_tag in template_bibrec: if not record_has_field(rec, field_tag): for field_instance in template_bibrec[field_tag]: record_add_field(rec, field_tag, field_instance[1], field_instance[2], subfields=field_instance[0]) else: for template_field_instance in template_bibrec[field_tag]: subfield_codes_template = field_get_subfield_codes(template_field_instance) for field_instance in rec[field_tag]: subfield_codes = field_get_subfield_codes(field_instance) for code in subfield_codes_template: if code not in subfield_codes: field_add_subfield(field_instance, code, field_get_subfield_values(template_field_instance, code)[0]) return rec
def merge_record_with_template(rec, template_name, is_hp_record=False): """ Extend the record rec with the contents of the template and return it""" template = get_record_template(template_name) if not template: return template_bibrec = create_record(template)[0] # if the record is a holding pen record make all subfields volatile if is_hp_record: record_make_all_subfields_volatile(template_bibrec) for field_tag in template_bibrec: if not record_has_field(rec, field_tag): for field_instance in template_bibrec[field_tag]: record_add_field(rec, field_tag, field_instance[1], field_instance[2], subfields=field_instance[0]) else: for template_field_instance in template_bibrec[field_tag]: subfield_codes_template = field_get_subfield_codes( template_field_instance) for field_instance in rec[field_tag]: subfield_codes = field_get_subfield_codes(field_instance) for code in subfield_codes_template: if code not in subfield_codes: field_add_subfield( field_instance, code, field_get_subfield_values( template_field_instance, code)[0]) record_order_subfields(rec) return rec
def merge_record_with_template(rec, template_name): """ Extend the record rec with the contents of the template and return it""" template = get_record_template(template_name) template_bibrec = create_record(template)[0] for field_tag in template_bibrec: if not record_has_field(rec, field_tag): for field_instance in template_bibrec[field_tag]: record_add_field(rec, field_tag, field_instance[1], field_instance[2], subfields=field_instance[0]) else: for template_field_instance in template_bibrec[field_tag]: subfield_codes_template = field_get_subfield_codes(template_field_instance) for field_instance in rec[field_tag]: subfield_codes = field_get_subfield_codes(field_instance) for code in subfield_codes_template: if code not in subfield_codes: field_add_subfield( field_instance, code, field_get_subfield_values(template_field_instance, code)[0] ) return rec
def author_merger(fields1, fields2, tag): """function that merges the author lists and return the first author or all the other authors""" #if one of the two lists is empty, I don't have to do anything if len(fields1) == 0 or len(fields2) == 0: logger.info(' Only one field for "%s".' % tag) return fields1+fields2 #I need to copy locally the lists of records because I'm going to modify them fields1 = deepcopy(fields1) fields2 = deepcopy(fields2) try: trusted, untrusted = get_trusted_and_untrusted_fields(fields1, fields2, tag) except EqualOrigins: #if they have the same origin I try with another approach trusted, untrusted = _get_best_fields(fields1, fields2, tag) #and since I am in this case the two sets of fields are already too similar to enrich the trusted one #so I simply return it return trusted # Sanity check: we have a problem if we have identical normalized author # names in the trusted list or if we have identical author names in the # untrusted list that is present in the trusted list of authors. trusted_authors = set() for field in trusted: author = bibrecord.field_get_subfield_values(field, AUTHOR_NORM_NAME_SUBFIELD)[0] if author in trusted_authors: #I don't raise an error if I have duplicated normalized author names, #I simply return the trusted list logger.info(' Duplicated normalized author name. Skipping author subfield merging.') return trusted #raise DuplicateNormalizedAuthorError(author) else: trusted_authors.add(author) #I extract all the authors in the untrusted list in case I need to merge some subfields untrusted_authors = {} for field in untrusted: author = bibrecord.field_get_subfield_values(field, AUTHOR_NORM_NAME_SUBFIELD)[0] if author in trusted_authors: untrusted_authors[author] = field # Now add information from the least trusted list of authors to the most # trusted list of authors. for index, field in enumerate(trusted): author = bibrecord.field_get_subfield_values(field, AUTHOR_NORM_NAME_SUBFIELD)[0] if author in untrusted_authors: trusted_subfield_codes = bibrecord.field_get_subfield_codes(field) untrusted_field = untrusted_authors[author] untrusted_subfield_codes = bibrecord.field_get_subfield_codes(untrusted_field) trusted_subfields = bibrecord.field_get_subfield_instances(field) additional_subfield_codes = set(untrusted_subfield_codes) - set(trusted_subfield_codes) for code in additional_subfield_codes: logger.info(' Subfield "%s" to add to author "%s".' % (code, author)) additional_subfields = bibrecord.field_get_subfield_values(untrusted_field, code) for additional_subfield in additional_subfields: trusted_subfields.append((code, additional_subfield)) else: # Replace the subfields with the new subfields. field = (trusted_subfields, field[1], field[2], field[3], field[4]) return trusted