Retry with unique username both on PUT and POST.

This commit is contained in:
Sybren A. Stüvel 2016-06-01 10:33:01 +02:00
parent fb020ae4b4
commit 0daaefdcc3

View File

@ -70,43 +70,43 @@ def validate_create_user(blender_id_user_id, token, oauth_subclient_id):
# Store the user info in MongoDB. # Store the user info in MongoDB.
db_user = find_user_in_db(blender_id_user_id, user_info) db_user = find_user_in_db(blender_id_user_id, user_info)
if '_id' in db_user: r = {}
# Update the existing user for retry in range(5):
attempted_eve_method = 'PUT' if '_id' in db_user:
db_id = db_user['_id'] # Update the existing user
try: attempted_eve_method = 'PUT'
etag = {'_etag': db_user['_etag']} db_id = db_user['_id']
except KeyError: try:
etag = {} etag = {'_etag': db_user['_etag']}
r, _, _, status = put_internal('users', remove_private_keys(db_user), except KeyError:
_id=db_id, **etag) etag = {}
if status == 422: r, _, _, status = put_internal('users', remove_private_keys(db_user),
log.error('Status %i trying to PUT user, should not happen! %s', _id=db_id, **etag)
status, r) if status == 422:
else: log.error('Status %i trying to PUT user %s with values %s, should not happen! %s',
# Create a new user, retry for non-unique usernames. status, db_id, remove_private_keys(db_user), r)
attempted_eve_method = 'POST' else:
r = {} # Create a new user, retry for non-unique usernames.
for retry in range(5): attempted_eve_method = 'POST'
r, _, _, status = post_internal('users', db_user) r, _, _, status = post_internal('users', db_user)
if status == 422: db_id = r['_id']
# Probably non-unique username, so retry a few times with different usernames. db_user.update(r) # update with database/eve-generated fields.
log.info('Error creating new user: %s', r)
username_issue = r.get('_issues', {}).get(u'username', '')
if u'not unique' in username_issue:
# Retry
db_user['username'] = authentication.make_unique_username(db_user['email'])
continue
# Saving was successful. if status == 422:
break # Probably non-unique username, so retry a few times with different usernames.
else: log.info('Error creating new user: %s', r)
log.error('Unable to create new user %s: %s', db_user, r) username_issue = r.get('_issues', {}).get(u'username', '')
return abort(500) if u'not unique' in username_issue:
# Retry
db_user['username'] = authentication.make_unique_username(db_user['email'])
continue
db_id = r['_id'] # Saving was successful, or at least didn't break on a non-unique username.
db_user.update(r) # update with database/eve-generated fields. break
else:
log.error('Unable to create new user %s: %s', db_user, r)
return abort(500)
if status not in (200, 201): if status not in (200, 201):
log.error('internal response from %s to Eve: %r %r', attempted_eve_method, status, r) log.error('internal response from %s to Eve: %r %r', attempted_eve_method, status, r)