"""ws-create-user script.
Create a new site user from command line.
"""
# Standard Library
import getpass
import os
import sys
import typing as t
# Websauna
from websauna.system.devop.cmdline import init_websauna
from websauna.system.devop.scripts import feedback_and_exit
from websauna.system.devop.scripts import get_config_uri
from websauna.system.user.events import UserCreated
from websauna.system.user.interfaces import IUserModel
from websauna.system.user.models import Group
from websauna.system.user.utils import get_user_class
from websauna.system.user.utils import get_user_registry
from websauna.utils.time import now
[docs]def usage_message(argv: t.List[str]):
"""Display usage message and exit.
:param argv: Command line arguments.
:raises sys.SystemExit:
"""
cmd = os.path.basename(argv[0])
msg = (
'usage: {cmd} <config_uri> [password] [--admin]\n'
'(example: "{cmd} ws://conf/production.ini [email protected] verysecret --admin")'
).format(cmd=cmd)
feedback_and_exit(msg, status_code=1, display_border=False)
[docs]def create(
request,
username: str,
email: str,
password: t.Optional[str] = None,
source: str = 'command_line',
admin: bool = False
) -> IUserModel:
"""Create a new site user from command line.
:param request:
:param username: Username, usually an email.
:param email: User's email.
:param password: Password.
:param source: Source of this user, in here, command_line.
:param admin: Set this user to admin. The first user is always implicitly admin.
:return: Newly created user.
"""
User = get_user_class(request.registry)
dbsession = request.dbsession
u = dbsession.query(User).filter_by(email=email).first()
if u is not None:
return u
u = User(email=email, username=username)
dbsession.add(u)
dbsession.flush() # Make sure u.user_data is set
if password:
user_registry = get_user_registry(request)
user_registry.set_password(u, password)
u.registration_source = source
u.activated_at = now()
request.registry.notify(UserCreated(request, u))
if admin:
group = dbsession.query(Group).filter_by(name='admin').one_or_none()
group.users.append(u)
return u
[docs]def main(argv: t.List[str] = sys.argv):
"""Create a new site user from command line.
:param argv: Command line arguments, second one needs to be the uri to a configuration file.
:raises sys.SystemExit:
"""
if len(argv) < 3:
usage_message(argv)
config_uri = get_config_uri(argv)
request = init_websauna(config_uri)
email = argv[2]
is_admin = True if '--admin' in argv else False
password = argv[3] if len(argv) >= 4 and argv[3] != '--admin' else ''
if not password:
password = getpass.getpass('Password:')
password2 = getpass.getpass('Password (again):')
if password != password2:
feedback_and_exit('Passwords did not match', display_border=False)
with request.tm:
u = create(request, email=email, username=email, password=password, admin=is_admin)
message = 'Created user #{id}: {email}, admin: {is_admin}'.format(
id=u.id,
email=u.email,
is_admin=u.is_admin()
)
feedback_and_exit(message, status_code=None, display_border=True)
if __name__ == "__main__":
main()