Add collection of user metadata: name and company
This commit is contained in:
parent
909be766c9
commit
0f2eb61f4a
14 changed files with 178 additions and 33 deletions
|
@ -6,13 +6,14 @@ import uuid
|
|||
from peewee import JOIN_LEFT_OUTER, IntegrityError, fn
|
||||
from uuid import uuid4
|
||||
from datetime import datetime, timedelta
|
||||
from enum import Enum
|
||||
|
||||
from data.database import (User, LoginService, FederatedLogin, RepositoryPermission, TeamMember,
|
||||
Team, Repository, TupleSelector, TeamRole, Namespace, Visibility,
|
||||
EmailConfirmation, Role, db_for_update, random_string_generator,
|
||||
UserRegion, ImageStorageLocation, QueueItem, TeamMemberInvite,
|
||||
ServiceKeyApproval, OAuthApplication, RepositoryBuildTrigger,
|
||||
UserPromptKind, UserPrompt)
|
||||
UserPromptKind, UserPrompt, UserPromptTypes)
|
||||
from data.model import (DataModelException, InvalidPasswordException, InvalidRobotException,
|
||||
InvalidUsernameException, InvalidEmailAddressException,
|
||||
TooManyLoginAttemptsException, db_transaction,
|
||||
|
@ -28,17 +29,16 @@ logger = logging.getLogger(__name__)
|
|||
|
||||
EXPONENTIAL_BACKOFF_SCALE = timedelta(seconds=1)
|
||||
|
||||
|
||||
def hash_password(password, salt=None):
|
||||
salt = salt or bcrypt.gensalt()
|
||||
return bcrypt.hashpw(password.encode('utf-8'), salt)
|
||||
|
||||
def create_user(username, password, email, auto_verify=False, email_required=True):
|
||||
def create_user(username, password, email, auto_verify=False, email_required=True, prompts=tuple()):
|
||||
""" Creates a regular user, if allowed. """
|
||||
if not validate_password(password):
|
||||
raise InvalidPasswordException(INVALID_PASSWORD_MESSAGE)
|
||||
|
||||
created = create_user_noverify(username, email, email_required=email_required)
|
||||
created = create_user_noverify(username, email, email_required=email_required, prompts=prompts)
|
||||
created.password_hash = hash_password(password)
|
||||
created.verified = auto_verify
|
||||
created.save()
|
||||
|
@ -46,7 +46,7 @@ def create_user(username, password, email, auto_verify=False, email_required=Tru
|
|||
return created
|
||||
|
||||
|
||||
def create_user_noverify(username, email, email_required=True):
|
||||
def create_user_noverify(username, email, email_required=True, prompts=tuple()):
|
||||
if email_required:
|
||||
if not validate_email(email):
|
||||
raise InvalidEmailAddressException('Invalid email address: %s' % email)
|
||||
|
@ -76,7 +76,11 @@ def create_user_noverify(username, email, email_required=True):
|
|||
logger.debug('Email and username are unique!')
|
||||
|
||||
try:
|
||||
return User.create(username=username, email=email)
|
||||
new_user = User.create(username=username, email=email)
|
||||
for prompt in prompts:
|
||||
create_user_prompt(new_user, prompt)
|
||||
|
||||
return new_user
|
||||
except Exception as ex:
|
||||
raise DataModelException(ex.message)
|
||||
|
||||
|
@ -103,6 +107,15 @@ def change_password(user, new_password):
|
|||
notification.delete_notifications_by_kind(user, 'password_required')
|
||||
|
||||
|
||||
def get_default_user_prompts(features):
|
||||
prompts = set()
|
||||
if features.USER_METADATA:
|
||||
prompts.add(UserPromptTypes.ENTER_NAME)
|
||||
prompts.add(UserPromptTypes.ENTER_COMPANY)
|
||||
|
||||
return prompts
|
||||
|
||||
|
||||
def has_user_prompts(user):
|
||||
try:
|
||||
UserPrompt.select().where(UserPrompt.user == user).get()
|
||||
|
@ -110,6 +123,7 @@ def has_user_prompts(user):
|
|||
except UserPrompt.DoesNotExist:
|
||||
return False
|
||||
|
||||
|
||||
def has_user_prompt(user, prompt_name):
|
||||
prompt_kind = UserPromptKind.get(name=prompt_name)
|
||||
|
||||
|
@ -341,16 +355,28 @@ def list_entity_robot_permission_teams(entity_name, include_permissions=False):
|
|||
return TupleSelector(query, fields)
|
||||
|
||||
|
||||
def update_user_metadata(user, name=None, company=None):
|
||||
""" Updates the metadata associated with the user, including his/her name and company. """
|
||||
with db_transaction():
|
||||
user.name = name or user.name
|
||||
user.company = company or user.company
|
||||
user.save()
|
||||
|
||||
# Remove any prompts associated with the user's metadata being needed.
|
||||
remove_user_prompt(user, UserPromptTypes.ENTER_NAME)
|
||||
remove_user_prompt(user, UserPromptTypes.ENTER_COMPANY)
|
||||
|
||||
|
||||
def create_federated_user(username, email, service_name, service_ident,
|
||||
set_password_notification, metadata={},
|
||||
email_required=True, confirm_username=False):
|
||||
new_user = create_user_noverify(username, email, email_required=email_required)
|
||||
email_required=True, prompts=tuple()):
|
||||
prompts = set(prompts)
|
||||
prompts.add(UserPromptTypes.CONFIRM_USERNAME)
|
||||
|
||||
new_user = create_user_noverify(username, email, email_required=email_required, prompts=prompts)
|
||||
new_user.verified = True
|
||||
new_user.save()
|
||||
|
||||
if confirm_username:
|
||||
create_user_prompt(new_user, 'confirm_username')
|
||||
|
||||
service = LoginService.get(LoginService.name == service_name)
|
||||
FederatedLogin.create(user=new_user, service=service,
|
||||
service_ident=service_ident,
|
||||
|
|
Reference in a new issue