Esempio n. 1
0
def check_records(records, doi_field="0247_a", extra_subfields=(("2", "DOI"), ("9", "bibcheck"))):
    """
    Find the DOI for the records using crossref and add it to the specified
    field.

    This plugin won't ask for the DOI if it's already set.
    """
    records_to_check = {}
    for record in records:
        has_doi = False
        for position, value in record.iterfield("0247_2"):
            if value.lower() == "doi":
                has_doi = True
                break
        if not has_doi:
            records_to_check[record.record_id] = record

    dois = get_doi_for_records(records_to_check.values())
    for record_id, doi in dois.iteritems():
        record = records_to_check[record_id]
        dup_doi_recid = find_record_from_doi(doi)
        if dup_doi_recid:
            record.warn("DOI %s to be added to record %s already exists in record/s %s" % (doi, record_id, dup_doi_recid))
            continue
        subfields = [(doi_field[5], doi.encode("utf-8"))] + map(tuple, extra_subfields)
        record_add_field(record, tag=doi_field[:3], ind1=doi_field[3],
                ind2=doi_field[4], subfields=subfields)
        record.set_amended("Added DOI in field %s" % doi_field)
Esempio n. 2
0
def check_records(records, doi_field="0247_a", extra_subfields=(("2", "DOI"),)):
    """
    Find the DOI for the records using crossref and add it to the specified
    field.

    This plugin won't ask for the DOI if it's already set.
    """
    records_to_check = {}
    for record in records:
        has_doi = False
        for position, value in record.iterfield("0247_2"):
            if value.lower() == "doi":
                has_doi = True
                break
        if not has_doi:
            records_to_check[record.record_id] = record

    dois = get_doi_for_records(records_to_check.values())
    for record_id, doi in dois.iteritems():
        dup_doi_recid = find_record_from_doi(doi)
        if dup_doi_recid:
            record.warn("DOI %s to be added to record %s already exists in record/s %s" % (doi, record_id, dup_doi_recid))
            continue
        record = records_to_check[record_id]
        subfields = [(doi_field[5], doi.encode("utf-8"))] + map(tuple, extra_subfields)
        record_add_field(record, tag=doi_field[:3], ind1=doi_field[3],
                ind2=doi_field[4], subfields=subfields)
        record.set_amended("Added DOI in field %s" % doi_field)
Esempio n. 3
0
def check_records(records, doi_field="0247_a", extra_subfields=(("2", "DOI"), ("9", "bibcheck")), create_ticket=False):
    """
    Find the DOI for the records using crossref and add it to the specified
    field.

    This plugin won't ask for the DOI if it's already set.
    """
    records_to_check = {}
    for record in records:
        has_doi = False
        for position, value in record.iterfield("0247_2"):
            if value.lower() == "doi":
                has_doi = True
                break
        if not has_doi:
            records_to_check[record.record_id] = record

    dois = get_doi_for_records(records_to_check.values())
    for record_id, doi in dois.iteritems():
        record = records_to_check[record_id]
        dup_doi_recid = find_record_from_doi(doi)
        if dup_doi_recid:
            record.warn("DOI %s to be added to record %s already exists in record/s %s" % (doi, record_id, dup_doi_recid))
            if create_ticket:
                subject = "DOI conflict record #%s" % str(record_id)
                res = BIBCATALOG_SYSTEM.ticket_submit(
                    subject=subject,
                    recordid=record_id,
                    text=subject,
                    queue="Bibcheck"
                )
                if res > 0:
                    msg = """
                        DOI %s to be added to record %s already exists in record/s %s

                        Record with conflict: %s
                        Record with original DOI: %s

                        Merge both records: %s
                    """
                    dup_doi_recid = int(dup_doi_recid)
                    record_id = int(record_id)
                    msg = msg % (
                        doi,
                        record_id,
                        dup_doi_recid,
                        "%s/record/%s" % (CFG_SITE_URL, record_id),
                        "%s/record/%s" % (CFG_SITE_URL, dup_doi_recid),
                        "%s/record/merge/?#recid1=%s&recid2=%s" % (CFG_SITE_URL, min(dup_doi_recid, record_id), max(dup_doi_recid, record_id))
                    )
                    if isinstance(msg, unicode):
                        msg = msg.encode("utf-8")
                    BIBCATALOG_SYSTEM.ticket_comment(None, res, msg)
            continue
        subfields = [(doi_field[5], doi.encode("utf-8"))] + map(tuple, extra_subfields)
        record_add_field(record, tag=doi_field[:3], ind1=doi_field[3],
                ind2=doi_field[4], subfields=subfields)
        record.set_amended("Added DOI in field %s" % doi_field)
Esempio n. 4
0
def check_records(records,
                  doi_field="0247_a",
                  extra_subfields=(("2", "DOI"), ("9", "bibcheck")),
                  create_ticket=False):
    """
    Find the DOI for the records using crossref and add it to the specified
    field.

    This plugin won't ask for the DOI if it's already set.
    """
    records_to_check = {}
    for record in records:
        check_record = True
        for position, value in record.iterfield("0247_2"):
            if value.lower() == "doi":
                check_record = False
                break
        # Do not consider records in the proceedings collection
        for position, value in record.iterfield("980__a"):
            if value.lower() == "proceedings":
                check_record = False
                break
        if check_record:
            records_to_check[record.record_id] = record

    dois = get_doi_for_records(records_to_check.values())
    for record_id, doi in dois.iteritems():
        record = records_to_check[record_id]
        dup_doi_recid = find_record_from_doi(doi)
        if dup_doi_recid:
            record.warn(
                "DOI %s to be added to record %s already exists in record/s %s"
                % (doi, record_id, dup_doi_recid))
            if create_ticket:
                subject = "DOI conflict record #%s" % str(record_id)
                res = BIBCATALOG_SYSTEM.ticket_submit(subject=subject,
                                                      recordid=record_id,
                                                      text=subject,
                                                      queue="Bibcheck")
                if res:
                    msg = """
                        DOI %s to be added to record %s already exists in record/s %s

                        Record with conflict: %s
                        Record with original DOI: %s

                        Merge both records: %s
                    """
                    dup_doi_recid = int(dup_doi_recid)
                    record_id = int(record_id)
                    msg = msg % (doi, record_id, dup_doi_recid,
                                 "%s/record/%s" %
                                 (CFG_SITE_URL, record_id), "%s/record/%s" %
                                 (CFG_SITE_URL, dup_doi_recid),
                                 "%s/record/merge/?#recid1=%s&recid2=%s" %
                                 (CFG_SITE_URL, min(dup_doi_recid, record_id),
                                  max(dup_doi_recid, record_id)))
                    if isinstance(msg, unicode):
                        msg = msg.encode("utf-8")
                    BIBCATALOG_SYSTEM.ticket_comment(None, res, msg)
            continue
        subfields = [(doi_field[5], doi.encode("utf-8"))] + map(
            tuple, extra_subfields)
        record_add_field(record,
                         tag=doi_field[:3],
                         ind1=doi_field[3],
                         ind2=doi_field[4],
                         subfields=subfields)
        record.set_amended("Added DOI in field %s" % doi_field)