def contributor_orcid_id(self, value): # FIXME use schema v = value.replace(' ', '') if not v: return if v.startswith('http:'): v = v.replace('http:', 'https:', 1) if not (v.startswith('ORCID:') or v.startswith('https:')): v = v.strip() if not len(v): return elif v == '0': # FIXME ? someone using strange conventions ... return elif len(v) != 19: msg = f'orcid wrong length {value!r} {self.t.path.as_posix()!r}' self.addError(OrcidId.OrcidLengthError(msg)) logd.error(msg) return v = 'ORCID:' + v else: if v.startswith('https:'): _, numeric = v.rsplit('/', 1) elif v.startswith('ORCID:'): _, numeric = v.rsplit(':', 1) if not len(numeric): return elif len(numeric) != 19: msg = f'orcid wrong length {value!r} {self.t.path.as_posix()!r}' self.addError(OrcidId.OrcidLengthError(msg)) logd.error(msg) return try: #log.debug(f"{v} '{self.t.path}'") orcid = OrcidId(v) if not orcid.checksumValid: # FIXME json schema can't do this ... msg = f'orcid failed checksum {value!r} {self.t.path.as_posix()!r}' self.addError(OrcidId.OrcidChecksumError(msg)) logd.error(msg) return yield orcid except (OntId.BadCurieError, OrcidId.OrcidMalformedError) as e: msg = f'orcid malformed {value!r} {self.t.path.as_posix()!r}' self.addError(OrcidId.OrcidMalformedError(msg)) logd.error(msg) yield value
def test_validate(self): orcids = ('https://orcid.org/0000-0002-1825-0097', 'https://orcid.org/0000-0001-5109-3700', 'https://orcid.org/0000-0002-1694-233X') ids = [OrcidId(orcid) for orcid in orcids] bads = [orcid for orcid in ids if not orcid.checksumValid] assert not bads, str(bads)
def _process(self, contributor): # get member if we can find them he = dat.HasErrors(pipeline_stage=self.__class__.__name__ + '.data') if 'name' in contributor and 'first_name' in contributor: name = contributor['name'] if ';' in name: msg = f'Bad symbol in name {name!r}' he.addError(msg) logd.error(msg) fn = contributor['first_name'] ln = contributor['last_name'] if ' ' in fn: fn, mn = fn.split(' ', 1) contributor['middle_name'] = mn contributor['first_name'] = fn if ' ' in ln: msg = f'Malformed last_name {ln!r}' he.addError(msg) logd.error(msg) ln = ln.replace(' ', '-') failover = f'{fn}-{ln}' member = self.member(fn, ln) if member is not None: userid = OntId('https://api.blackfynn.io/users/' + member.id) contributor['blackfynn_user_id'] = userid else: member = None failover = 'no-orcid-no-name' log.warning(f'No name!' + lj(contributor)) orcid = None if 'contributor_orcid_id' in contributor: orcid = contributor['contributor_orcid_id'] if type(orcid) == str and 'orcid.org' in orcid: orcid = OrcidId(orcid) # FIXME reloading from json if isinstance(orcid, OrcidId): s = orcid else: # it's not an orcid or its a bad orcid orcid = None if orcid is None: if member is not None: s = userid else: log.debug(lj(contributor)) s = OntId(self.dsid + '/contributors/' + failover) contributor['id'] = s he.embedErrors(contributor)