예제 #1
0
 def test_is_dummy(self):
     """ Test the is_dummy method """
     dummy_record = {
         '001': [([], ' ', ' ', '1', 1)]
     }
     record = AmendableRecord(dummy_record)
     self.assertTrue(record.is_dummy())
예제 #2
0
def show_papers(personid, external_id=None, orcid=None, inspire=None):
    search = 'select * from aidPERSONIDPAPERS where personid='
    search += str(personid) + ' and flag>-2'
    result = run_sql(search)
    hep_records = ''
    for personid, table, bibref, bibrec, author, match, flag, cul, date \
                       in result:
    #for personid, table, bibref, bibrec, author in result:
        #rec = AmendableRecord(get_bibrecord(bibrec))
        position = -1
        author_name = get_name_by_bibref((table, bibref))
        for key, value in AmendableRecord(get_bibrecord(bibrec)).\
                   iterfields(['{0}__%'.format(table, )]):
            if (key[0] == '700__a' or key[0] == '100__a') and \
                                            value == author_name:
                position = key[1]
        if position >= 0:
            for key, value in AmendableRecord(get_bibrecord(bibrec)).\
                   iterfields(['{0}__%'.format(table, )]):
                if key[1] == position and key[0] in \
                      ('{0}__a'.format(table), '{0}__i'.
                       format(table), '{0}__j'.format(table),
                       '{0}__k'.format(table), '{0}__m'.format(table), ):
                    if value.replace('ORCID:', '') == external_id and \
                       value.replace('ORCID:', '') != orcid and \
                       value != inspire:
                       hep_records += "    " + " ".join([str(bibrec),
                                                         author, value, '\n'])
    if hep_records:
        return hep_records
    return None
예제 #3
0
def getInspireRecordMetadata(inspireID):
    '''For a given INSPIRE ID, collect the desired metadata fields
       and return them.
    '''

    fieldArray = {'0247_2': 'stdIDsource', '0247_a': 'stdID',
                  '245__a': 'title', '8564_u': 'files'}
    fieldValues = {}
    fieldKeys = fieldArray.keys()
    for fKey in fieldKeys:
        fieldValues[fKey] = get_fieldvalues(inspireID, fKey)
        print "fieldValues=", fKey, ":", fieldValues[fKey]

    # ThS suggested approach for dealing with the problem of two repeating
    # fields that correspond (say, a type in one field, and a value in another)
    record = AmendableRecord(get_bibrecord(inspireID))
    for _, val in record.iterfield('035__a', subfield_filter=('9', 'arXiv')):
        fieldValues['arxivID'] = val

    pdfList = []
    for z in fieldValues['8564_u']:
        if 'pdf' in z:
            pdfList.append(z)
    fieldValues['8564_u'] = pdfList

    return fieldValues
예제 #4
0
 def assertFails(self, test, **kwargs):
     """
     Assert that the plugin test marks the record as invalid when called with
     params kwargs.
     """
     record = AmendableRecord(MOCK_RECORD)
     record.set_rule(RULE_MOCK)
     test.check_record(record, **kwargs)
     self.assertFalse(record.valid)
     self.assertTrue(len(record._errors) > 0)
예제 #5
0
 def assertFails(self, test, **kwargs):
     """
     Assert that the plugin test marks the record as invalid when called with
     params kwargs.
     """
     record = AmendableRecord(MOCK_RECORD)
     record.set_rule(RULE_MOCK)
     test.check_record(record, **kwargs)
     self.assertFalse(record.valid)
     self.assertTrue(len(record.errors) > 0)
예제 #6
0
 def assertOk(self, test, **kwargs):
     """
     Assert that the plugin test doesn't make any modification to the record
     when called with params kwargs.
     """
     record = AmendableRecord(MOCK_RECORD)
     record.set_rule(RULE_MOCK)
     test.check_record(record, **kwargs)
     self.assertTrue(record.valid)
     self.assertFalse(record.amended)
     self.assertEqual(len(record._amendments), 0)
     self.assertEqual(len(record._errors), 0)
예제 #7
0
 def assertOk(self, test, **kwargs):
     """
     Assert that the plugin test doesn't make any modification to the record
     when called with params kwargs.
     """
     record = AmendableRecord(MOCK_RECORD)
     record.set_rule(RULE_MOCK)
     test.check_record(record, **kwargs)
     self.assertTrue(record.valid)
     self.assertFalse(record.amended)
     self.assertEqual(len(record.amendments), 0)
     self.assertEqual(len(record.errors), 0)
예제 #8
0
 def assertAmends(self, test, changes, **kwargs):
     """
     Assert that the plugin "test" amends the mock record when called with
     params kwargs.
     """
     record = AmendableRecord(MOCK_RECORD)
     record.set_rule(RULE_MOCK)
     test.check_record(record, **kwargs)
     self.assertTrue(record.amended)
     self.assertEqual(len(record.amendments), len(changes))
     for field, val in changes.iteritems():
         if val is not None:
             self.assertEqual(
                 [((field, 0, 0), val)],
                 list(record.iterfield(field))
             )
         else:
             self.assertEqual(len(list(record.iterfield(field))), 1)
예제 #9
0
 def assertDeletions(self, test, deletions, **kwargs):
     """
     Assert that the plugin "test" deletes from the mock record
     the fields in the list 'deletions' and makes the record amended
     when called with params kwargs.
     """
     record = AmendableRecord(MOCK_RECORD)
     record.set_rule(RULE_MOCK)
     test.check_record(record)
     self.assertTrue(record.amended)
     self.assertEqual(len(record._amendments), len(deletions))
     for field in deletions:
         self.assertEqual(0, len(list(record.iterfield(field))))
     if kwargs.get('tagremoved'):
         self.assertFalse(record.get(kwargs.get('tagremoved')))
예제 #10
0
 def assertAmends(self, test, changes, **kwargs):
     """
     Assert that the plugin "test" amends the mock record when called with
     params kwargs.
     """
     record = AmendableRecord(MOCK_RECORD)
     record.set_rule(RULE_MOCK)
     test.check_record(record, **kwargs)
     self.assertTrue(record.amended)
     self.assertEqual(len(record._amendments), len(changes))
     for field, val in changes.iteritems():
         if val is not None:
             self.assertEqual(((field, 0, 0), val),
                              list(record.iterfield(field))[0])
         else:
             self.assertEqual(len(list(record.iterfield(field))), 1)
예제 #11
0
 def setUp(self):
     """ Create a mock amenda record to test with """
     self.record = AmendableRecord(MOCK_RECORD)
     self.record.set_rule(RULE_MOCK)
예제 #12
0
class BibCheckAmendableRecordTest(InvenioTestCase):
    """ Check the AmendableRecord class """

    def setUp(self):
        """ Create a mock amenda record to test with """
        self.record = AmendableRecord(MOCK_RECORD)
        self.record.set_rule(RULE_MOCK)

    def test_valid(self):
        """ Test the set_invalid method """
        self.assertTrue(self.record.valid)
        self.record.set_invalid("test message")
        self.assertFalse(self.record.valid)
        self.assertEqual(self.record.errors, ["Rule test_rule: test message"])

    def test_amend(self):
        """ Test the amend method """
        self.assertFalse(self.record.amendments)
        self.record.amend_field(("100__a", 0, 0), "Pepe", "Changed author")
        self.assertEqual(self.record["100"][0][0][0][1], "Pepe")
        self.assertTrue(self.record.amended)
        self.assertEqual(self.record.amendments, ["Rule test_rule: Changed author"])

    def test_itertags(self):
        """ Test the itertags method """
        self.assertEqual(
            set(self.record.keys()),
            set(self.record.itertags("%%%"))
        )
        self.assertEqual(set(['100']), set(self.record.itertags("100")))
        self.assertEqual(set(['001', '005']), set(self.record.itertags("00%")))
        self.assertEqual(set(), set(self.record.itertags("111")))

    def test_iterfields(self):
        """ Test the iterfields method """
        self.assertEqual(set(), set(self.record.iterfields(["111%%%"])))
        self.assertEqual(
            set([(("100__a", 0, 0), "Pepe")]),
            set(self.record.iterfields(["1%%%%%"]))
        )
        self.assertEqual(
            set([(("9944_u", 0, 0), self.record["994"][0][0][0][1]),
            (("9954_u", 0, 0), self.record["995"][0][0][0][1]),
            (("9964_u", 0, 0), self.record["996"][0][0][0][1]),
            (("9974_u", 0, 0), self.record["997"][0][0][0][1]),
            (("9984_u", 0, 0), self.record["998"][0][0][0][1]),
            (("9994_u", 0, 0), self.record["999"][0][0][0][1])]),
            set(self.record.iterfields(["9%%%%u"]))
        )

    def test_is_dummy(self):
        """ Test the is_dummy method """
        dummy_record = {
            '001': [([], ' ', ' ', '1', 1)]
        }
        record = AmendableRecord(dummy_record)
        self.assertTrue(record.is_dummy())
    ind2 = marc[4].replace('_', ' ')
    sfcode = marc[5]
    to_split = fields_to_split(record, tag, ind1, ind2, sfcode)

    if not to_split:
        continue
#   work from the back to try to preserve order
    positions = to_split.keys()
    positions.sort(reverse=True)
    for global_pos in positions:
        (parts, rest_before, rest_after) = to_split[global_pos]
        message += " - split %s %s" % (tag, parts)
        record_delete_field(record, tag, ind1, ind2,
                            field_position_global=global_pos)
        parts.reverse()
        for subfield in parts:
            field = rest_before + [subfield, ] + rest_after
            record_add_field(record, tag, ind1, ind2, '', field,
                             field_position_global=global_pos)
    if message:
        record.set_amended(message)


if __name__ == '__main__':
    for record in test_records:
        record = AmendableRecord(get_bibrecord(record))
        record.rule  = {}
        record.rule['name'] = 'melissa'
        record.rule['holdingpen'] = False
        check_record(record)
                                id[1][0], id[2], recid, inspire_id)
#                          record.warn("%s from HEPNames doesn't match id for author %s in record %s (%s)" % (id[1][0], id[2], record, inspire_id))
                    else:
                        print "email: %s, inspire-id: %s" % (id[2], id[1][0])
                        additions.append((id[0], 'i', id[1][0]))
                if id[1][1]:
                    if orcid_true:
                        if orcid == id[1][1]:
                            print "%s in %s already has an ORICD" % (id[2],
                                                                     recid)
                        else:
                            print "%s from HEPNames doesn't match id for author %s in record %s (%s)" % (
                                id[1][1], id[2], recid, orcid)
#                        record.warn("%s from HEPNames doesn't match id for author %s in record %s (%s)" % (id[1][1], id[2], recid, orcid))
                    else:
                        print "email: %s, orcid: %s" % (id[2], id[1][1])
                        additions.append((id[0], 'j', id[1][1]))
    print "additions: ", additions
    for addition in additions:
        print "Adding %s to tag %s at position %s in %s" % (
            addition[2], addition[0][0], addition[0][1], recid)


#          record_add_subfield_into(record, addition[0][0], addition[1], addition[2], field_position_local=addition[0][1])

if __name__ == '__main__':
    for r in test_records:
        print 'working on ', r
        record = AmendableRecord(get_bibrecord(r))
        check_record(record)
예제 #15
0
#    codes = get_fieldvalues(record, '980__a')

    journals = []
    dois = []
    codes = []
    for key, val in record.iterfields(['001___', '0247_a', '773__p', '980__a']):
        if key[0] == '001___':
            recid = val
        if key[0] == '0247_a':
            dois.append(val)
        if key[0] == '773__p':
            journals.append(val)
        if key[0] == '980__a':
            codes.append(val)

    
    
    for type_code, mapping in type_codes:
        if try_dict(mapping, type_code=type_code, journals=journals, dois=dois, codes=codes):
            #print "Adding 980__a:%s to record %s" % (type_code, recid)
            record.add_field('980__', '', subfields=[('a', type_code)])


if __name__ == '__main__':
    for record in test_records:
        record = AmendableRecord(get_bibrecord(record))
        record.rule  = {}
        record.rule['name'] = 'melissa'
        record.rule['holdingpen'] = False
        check_record(record)
예제 #16
0
class BibCheckAmendableRecordTest(InvenioTestCase):
    """ Check the AmendableRecord class """
    def setUp(self):
        """ Create a mock amenda record to test with """
        self.record = AmendableRecord(MOCK_RECORD)
        self.record.set_rule(RULE_MOCK)

    def test_valid(self):
        """ Test the set_invalid method """
        self.assertTrue(self.record.valid)
        self.record.set_invalid("test message")
        self.assertFalse(self.record.valid)
        self.assertEqual(len(self.record._errors), 1)
        error = self.record._errors[0]
        self.assertEqual(error.nature, "error")
        self.assertEqual(error.rule, "test_rule")
        self.assertEqual(error.msg, "test message")

    def test_amend(self):
        """ Test the amend method """
        self.assertFalse(self.record._amendments)
        self.record.amend_field(("100__a", 0, 0), "Pepe", "Changed author")
        self.assertEqual(self.record["100"][0][0][0][1], "Pepe")
        self.assertTrue(self.record.amended)
        self.assertEqual(len(self.record._amendments), 1)
        amendment = self.record._amendments[0]
        self.assertEqual(amendment.nature, "amendment")
        self.assertEqual(amendment.rule, "test_rule")
        self.assertEqual(amendment.msg, "Changed author")

    def test_itertags(self):
        """ Test the itertags method """
        self.assertEqual(set(self.record.keys()),
                         set(self.record.itertags("%%%")))
        self.assertEqual(set(['100']), set(self.record.itertags("100")))
        self.assertEqual(set(['001', '005']), set(self.record.itertags("00%")))
        self.assertEqual(set(), set(self.record.itertags("111")))

    def test_iterfields(self):
        """ Test the iterfields method """
        self.assertEqual(set(), set(self.record.iterfields(["111%%%"])))
        self.assertEqual(set([(("100__a", 0, 0), "Pepe")]),
                         set(self.record.iterfields(["1%%%%%"])))
        self.assertEqual(
            set([(("695__a", 0, 0, 1), "gravitation: nonlocal")]),
            set(
                self.record.iterfields(["695__a"],
                                       subfield_filter=('2', 'INSPIRE'))))
        self.assertEqual(
            set([(("696__a", 0, 1, 0), "gravitation: nonlocal")]),
            set(
                self.record.iterfields(["696__a"],
                                       subfield_filter=('2', 'INSPIRE'))))
        self.assertEqual(
            set(),
            set(
                self.record.iterfields(["697__a"],
                                       subfield_filter=('2', 'INSPIRE'))))
        self.assertEqual(
            set([(("698__a", 0, 0, 2), "gravitation: nonlocal"),
                 (("698__a", 0, 1, 2), "propagator"),
                 (("698__a", 0, 3, 2), "singularity")]),
            set(
                self.record.iterfields(["698__a"],
                                       subfield_filter=('2', 'INSPIRE'))))
        self.assertEqual(
            set([(("699__a", 0, 1, 0), "gravitation"),
                 (("699__a", 1, 1, 0), "antigravitation")]),
            set(
                self.record.iterfields(["699__a"],
                                       subfield_filter=('2', 'INSPIRE'))))
        self.assertEqual(
            set([(("9944_u", 0, 0), self.record["994"][0][0][0][1]),
                 (("9954_u", 0, 0), self.record["995"][0][0][0][1]),
                 (("9964_u", 0, 0), self.record["996"][0][0][0][1]),
                 (("9974_u", 0, 0), self.record["997"][0][0][0][1]),
                 (("9984_u", 0, 0), self.record["998"][0][0][0][1]),
                 (("9994_u", 0, 0), self.record["999"][0][0][0][1])]),
            set(self.record.iterfields(["9%%%%u"])))

    def test_is_dummy(self):
        """ Test the is_dummy method """
        dummy_record = {'001': [([], ' ', ' ', '1', 1)]}
        record = AmendableRecord(dummy_record)
        self.assertTrue(record.is_dummy())