def orcid_auth(): access_token_url = 'https://pub.orcid.org/oauth/token' payload = dict(client_id="APP-PF0PDMP7P297AU8S", redirect_uri=request.json['redirectUri'], client_secret=os.getenv('ORCID_CLIENT_SECRET'), code=request.json['code'], grant_type='authorization_code') # Exchange authorization code for access token # The access token has the ORCID ID, which is actually all we need here. r = requests.post(access_token_url, data=payload) try: my_orcid_id = r.json()["orcid"] except KeyError: print u"Aborting /api/auth/orcid " \ u"with 500 because didn't get back orcid in oauth json. got this instead: {}".format(r.json()) abort_json(500, "Invalid JSON return from ORCID during OAuth.") my_person = Person.query.filter_by(orcid_id=my_orcid_id).first() try: token = my_person.get_token() except AttributeError: # my_person is None. So make a new user my_person = make_person(my_orcid_id, high_priority=True) token = my_person.get_token() set_person_claimed_at(my_person) return jsonify(token=token)
def orcid_auth(): access_token_url = 'https://pub.orcid.org/oauth/token' payload = dict(client_id="APP-PF0PDMP7P297AU8S", redirect_uri=request.json['redirectUri'], client_secret=os.getenv('ORCID_CLIENT_SECRET'), code=request.json['code'], grant_type='authorization_code') # Exchange authorization code for access token # The access token has the ORCID ID, which is actually all we need here. r = requests.post(access_token_url, data=payload) my_orcid_id = r.json()["orcid"] my_person = Person.query.filter_by(orcid_id=my_orcid_id).first() try: token = my_person.get_token() except AttributeError: # my_person is None. So make a new user # @todo: make_person() is untested. Test. my_person = make_person(my_orcid_id, high_priority=True) token = my_person.get_token() set_person_claimed_at(my_person) return jsonify(token=token)
def load_campaign(filename, campaign=None, limit=None): with open("data/" + filename, "r") as f: lines = f.read().split("\n") print "found {} ORCID lines".format(len(lines)) print len(lines) if limit: lines = lines[:limit] total_start = time() row_num = 0 for line in lines: row_num += 1 # can have # as comments if line.startswith("#"): print "skipping comment line" continue loop_start = time() email = None if "," in line: (dirty_orcid, email, twitter) = line.split(",") else: dirty_orcid = line try: orcid_id = clean_orcid(dirty_orcid) except NoOrcidException: try: print u"\n\nWARNING: no valid orcid_id in line {}; skipping\n\n".format( line) except UnicodeDecodeError: print u"\n\nWARNING: no valid orcid_id and line throws UnicodeDecodeError; skipping\n\n" continue my_person = Person.query.filter_by(orcid_id=orcid_id).first() if my_person: print u"row {}, already have person {}, skipping".format( row_num, orcid_id) else: print u"row {}, making person {}".format(row_num, orcid_id) my_person = make_person(orcid_id, high_priority=False) my_person.campaign = campaign my_person.email = email my_person.twitter = twitter db.session.merge(my_person) commit_success = safe_commit(db) if not commit_success: print u"COMMIT fail on {}".format(my_person.orcid_id) print "row {}: finished {} in {}s\n".format(row_num, orcid_id, elapsed(loop_start)) print "finished load_campaign on {} profiles in {}s\n".format( len(lines), elapsed(total_start))
def profile_endpoint(orcid_id): my_person = Person.query.filter_by(orcid_id=orcid_id).first() if not my_person: try: my_person = make_person(orcid_id, high_priority=True) except (OrcidDoesNotExist, NoOrcidException): print u"returning 404: orcid profile {} does not exist".format(orcid_id) abort_json(404, "That ORCID profile doesn't exist") return json_resp(my_person.to_dict())
def load_campaign(filename, campaign=None, limit=None): with open("data/" + filename, "r") as f: lines = f.read().split("\n") print "found {} ORCID lines".format(len(lines)) print len(lines) if limit: lines = lines[:limit] total_start = time() row_num = 0 for line in lines: row_num += 1 # can have # as comments if line.startswith("#"): print "skipping comment line" continue loop_start = time() email = None if "," in line: (dirty_orcid, email, twitter) = line.split(",") else: dirty_orcid = line try: orcid_id = clean_orcid(dirty_orcid) except NoOrcidException: try: print u"\n\nWARNING: no valid orcid_id in line {}; skipping\n\n".format(line) except UnicodeDecodeError: print u"\n\nWARNING: no valid orcid_id and line throws UnicodeDecodeError; skipping\n\n" continue my_person = Person.query.filter_by(orcid_id=orcid_id).first() if my_person: print u"row {}, already have person {}, skipping".format(row_num, orcid_id) else: print u"row {}, making person {}".format(row_num, orcid_id) my_person = make_person(orcid_id, store_in_db=True) my_person.campaign = campaign my_person.email = email my_person.twitter = twitter db.session.merge(my_person) commit_success = safe_commit(db) if not commit_success: print u"COMMIT fail on {}".format(my_person.orcid_id) print "row {}: finished {} in {}s\n".format(row_num, orcid_id, elapsed(loop_start)) print "finished load_campaign on {} profiles in {}s\n".format(len(lines), elapsed(total_start))
def twitter_register_but_login_if_they_are_already_registered(): twitter_creds = get_twitter_creds(request.json.get('oauth_token'), request.json.get('oauth_verifier')) if not twitter_creds: print u"error in twitter_register_but_login_if_they_are_already_registered, empty twitter creds" abort_json(422, "empty twitter creds") try: my_person = make_person(twitter_creds) except PersonExistsException: my_person = Person.query.filter_by(twitter=twitter_creds["screen_name"]).first() return jsonify({"token": my_person.get_token()})
def create_person(dirty_orcid, campaign=None, store_in_db=False): try: orcid_id = clean_orcid(dirty_orcid) except NoOrcidException: print u"\n\nWARNING: no valid orcid_id in {}; skipping\n\n".format(dirty_orcid) raise if store_in_db: print u"storing in db" my_person = make_person(orcid_id, store_in_db=True) if campaign: my_person.campaign = campaign db.session.add(my_person) success = safe_commit(db) if not success: print u"ERROR! committing {}".format(my_person.orcid_id) else: print u"NOT storing in db" my_person = make_person(orcid_id, store_in_db=False) print my_person
def create_person(dirty_orcid, campaign=None, store_in_db=False): try: orcid_id = clean_orcid(dirty_orcid) except NoOrcidException: print u"\n\nWARNING: no valid orcid_id in {}; skipping\n\n".format( dirty_orcid) raise if store_in_db: print u"storing in db" my_person = make_person(orcid_id, store_in_db=True) if campaign: my_person.campaign = campaign db.session.add(my_person) success = safe_commit(db) if not success: print u"ERROR! committing {}".format(my_person.orcid_id) else: print u"NOT storing in db" my_person = make_person(orcid_id, store_in_db=False) print my_person
def twitter_register_but_login_if_they_are_already_registered(): twitter_creds = get_twitter_creds(request.json.get('oauth_token'), request.json.get('oauth_verifier')) landing_page = request.json.get("customLandingPage", "default") if not twitter_creds: print u"error in twitter_register_but_login_if_they_are_already_registered, empty twitter creds" abort_json(422, "empty twitter creds") try: my_person = make_person(twitter_creds, landing_page=landing_page) except PersonExistsException: my_person = Person.query.filter_by(twitter=twitter_creds["screen_name"]).first() return jsonify({"token": my_person.get_token()})