diff --git a/redash/cli/data_sources.py b/redash/cli/data_sources.py index 7225ef988..9e51003d2 100644 --- a/redash/cli/data_sources.py +++ b/redash/cli/data_sources.py @@ -8,10 +8,15 @@ from redash.utils.configuration import ConfigurationContainer manager = Manager(help="Data sources management commands.") -@manager.command -def list(): +@manager.option('--org', dest='organization', default=None, help="The organization the user belongs to (leave blank for all organizations).") +def list(organization=None): """List currently configured data sources.""" - for i, ds in enumerate(models.DataSource.select()): + if organization: + org = models.Organization.get_by_slug(organization) + data_sources = models.DataSource.select().where(models.DataSource.org==org.id) + else: + data_sources = models.DataSource.select() + for i, ds in enumerate(data_sources): if i > 0: print "-" * 20 @@ -24,8 +29,11 @@ def validate_data_source_type(type): exit() -@manager.command -def new(name=None, type=None, options=None): +@manager.option('name', default=None, help="name of data source to create") +@manager.option('--type', dest='type', default=None, help="new type for the data source") +@manager.option('--options', dest='options', default=None, help="updated options for the data source") +@manager.option('--org', dest='organization', default='default', help="The organization the user belongs to (leave blank for 'default').") +def new(name=None, type=None, options=None, organization='default'): """Create new data source.""" if name is None: name = click.prompt("Name") @@ -84,15 +92,20 @@ def new(name=None, type=None, options=None): data_source = models.DataSource.create_with_group(name=name, type=type, options=options, - org=models.Organization.get_by_slug('default')) + org=models.Organization.get_by_slug(organization)) print "Id: {}".format(data_source.id) -@manager.command -def delete(name): +@manager.option('name', default=None, help="name of data source to delete") +@manager.option('--org', dest='organization', default='default', help="The organization the user belongs to (leave blank for 'default').") +def delete(name, organization='default'): """Delete data source by name.""" try: - data_source = models.DataSource.get(models.DataSource.name==name) + org = models.Organization.get_by_slug(organization) + data_source = models.DataSource.get( + models.DataSource.name==name, + models.DataSource.org==org, + ) print "Deleting data source: {} (id={})".format(name, data_source.id) data_source.delete_instance(recursive=True) except models.DataSource.DoesNotExist: @@ -110,13 +123,17 @@ def update_attr(obj, attr, new_value): @manager.option('--name', dest='new_name', default=None, help="new name for the data source") @manager.option('--options', dest='options', default=None, help="updated options for the data source") @manager.option('--type', dest='type', default=None, help="new type for the data source") -def edit(name, new_name=None, options=None, type=None): +@manager.option('--org', dest='organization', default='default', help="The organization the user belongs to (leave blank for 'default').") +def edit(name, new_name=None, options=None, type=None, organization='default'): """Edit data source settings (name, options, type).""" try: if type is not None: validate_data_source_type(type) - data_source = models.DataSource.get(models.DataSource.name==name) + data_source = models.DataSource.get( + models.DataSource.name==name, + models.DataSource.org==org, + ) if options is not None: schema = get_configuration_schema_for_query_runner_type(data_source.type) diff --git a/redash/cli/groups.py b/redash/cli/groups.py index ab41a9160..a3afd7109 100644 --- a/redash/cli/groups.py +++ b/redash/cli/groups.py @@ -1,14 +1,15 @@ from flask_script import Manager, prompt_pass from redash import models -manager = Manager(help="Groups management commands. This commands assume single organization operation.") +manager = Manager(help="Groups management commands.") @manager.option('name', help="Group's name") +@manager.option('--org', dest='organization', default='default', help="The organization the user belongs to (leave blank for 'default').") @manager.option('--permissions', dest='permissions', default=None, help="Comma seperated list of permissions ('create_dashboard', 'create_query', 'edit_dashboard', 'edit_query', 'view_query', 'view_source', 'execute_query', 'list_users', 'schedule_query', 'list_dashboards', 'list_alerts', 'list_data_sources') (leave blank for default).") -def create(name, permissions=None): +def create(name, permissions=None, organization='default'): print "Creating group (%s)..." % (name) - org = models.Organization.get_by_slug('default') + org = models.Organization.get_by_slug(organization) permissions = extract_permissions_string(permissions) @@ -17,7 +18,7 @@ def create(name, permissions=None): try: models.Group.create(name=name, org=org, permissions=permissions) except Exception, e: - print "Failed create group: %s" % e.message + print "Failed create group: %s" % e.message @manager.option('id', help="Group's id") @manager.option('--permissions', dest='permissions', default=None, help="Comma seperated list of permissions ('create_dashboard', 'create_query', 'edit_dashboard', 'edit_query', 'view_query', 'view_source', 'execute_query', 'list_users', 'schedule_query', 'list_dashboards', 'list_alerts', 'list_data_sources') (leave blank for default).") @@ -30,7 +31,7 @@ def change_permissions(id, permissions=None): print "User [%s] not found." % id return - permissions = extract_permissions_string(permissions) + permissions = extract_permissions_string(permissions) print "current permissions [%s] will be modify to [%s]" % (",".join(group.permissions), ",".join(permissions)) group.permissions = permissions @@ -38,7 +39,7 @@ def change_permissions(id, permissions=None): try: group.save() except Exception, e: - print "Failed change permission: %s" % e.message + print "Failed change permission: %s" % e.message def extract_permissions_string(permissions): @@ -47,4 +48,4 @@ def extract_permissions_string(permissions): else: permissions = permissions.split(',') permissions = [p.strip() for p in permissions] - return permissions \ No newline at end of file + return permissions diff --git a/redash/cli/users.py b/redash/cli/users.py index 157572389..33a7eb050 100644 --- a/redash/cli/users.py +++ b/redash/cli/users.py @@ -4,11 +4,10 @@ from peewee import IntegrityError from redash import models from redash.handlers.users import invite_user -manager = Manager(help="Users management commands. This commands assume single organization operation.") +manager = Manager(help="Users management commands.") -def build_groups(groups, is_admin): - org = models.Organization.get_by_slug('default') +def build_groups(org, groups, is_admin): if isinstance(groups, basestring): groups= groups.split(',') groups.remove('') # in case it was empty string @@ -23,9 +22,10 @@ def build_groups(groups, is_admin): return groups @manager.option('email', help="email address of the user to grant admin to") -def grant_admin(email): +@manager.option('--org', dest='organization', default='default', help="the organization the user belongs to, (leave blank for 'default').") +def grant_admin(email, organization='default'): try: - org = models.Organization.get_by_slug('default') + org = models.Organization.get_by_slug(organization) admin_group = org.admin_group user = models.User.get_by_email_and_org(email, org) @@ -42,17 +42,18 @@ def grant_admin(email): @manager.option('email', help="User's email") @manager.option('name', help="User's full name") +@manager.option('--org', dest='organization', default='default', help="The organization the user belongs to (leave blank for 'default').") @manager.option('--admin', dest='is_admin', action="store_true", default=False, help="set user as admin") @manager.option('--google', dest='google_auth', action="store_true", default=False, help="user uses Google Auth to login") @manager.option('--password', dest='password', default=None, help="Password for users who don't use Google Auth (leave blank for prompt).") @manager.option('--groups', dest='groups', default=None, help="Comma seperated list of groups (leave blank for default).") -def create(email, name, groups, is_admin=False, google_auth=False, password=None): - print "Creating user (%s, %s)..." % (email, name) +def create(email, name, groups, is_admin=False, google_auth=False, password=None, organization='default'): + print "Creating user (%s, %s) in organization %s..." % (email, name, organization) print "Admin: %r" % is_admin print "Login with Google Auth: %r\n" % google_auth - org = models.Organization.get_by_slug('default') - groups = build_groups(groups, is_admin) + org = models.Organization.get_by_slug(organization) + groups = build_groups(org, groups, is_admin) user = models.User(org=org, email=email, name=name, groups=groups) if not google_auth: @@ -66,16 +67,32 @@ def create(email, name, groups, is_admin=False, google_auth=False, password=None @manager.option('email', help="email address of user to delete") -def delete(email): - deleted_count = models.User.delete().where(models.User.email == email).execute() +@manager.option('--org', dest='organization', default=None, help="The organization the user belongs to (leave blank for all organizations).") +def delete(email, organization=None): + if organization: + org = models.Organization.get_by_slug(organization) + deleted_count = models.User.delete().where( + models.User.email == email, + models.User.org == org.id, + ).execute() + else: + deleted_count = models.User.delete().where(models.User.email == email).execute() print "Deleted %d users." % deleted_count @manager.option('password', help="new password for the user") @manager.option('email', help="email address of the user to change password for") -def password(email, password): +@manager.option('--org', dest='organization', default=None, help="The organization the user belongs to (leave blank for all organizations).") +def password(email, password, organization=None): try: - user = models.User.get_by_email_and_org(email, models.Organization.get_by_slug('default')) + if organization: + org = models.Organization.get_by_slug(organization) + user = models.User.select().where( + models.User.email == email, + models.User.org == org.id, + ).first() + else: + user = models.User.select().where(models.User.email == email).first() user.hash_password(password) user.save() @@ -88,11 +105,12 @@ def password(email, password): @manager.option('email', help="The invitee's email") @manager.option('name', help="The invitee's full name") @manager.option('inviter_email', help="The email of the inviter") +@manager.option('--org', dest='organization', default='default', help="The organization the user belongs to (leave blank for 'default')") @manager.option('--admin', dest='is_admin', action="store_true", default=False, help="set user as admin") @manager.option('--groups', dest='groups', default=None, help="Comma seperated list of groups (leave blank for default).") -def invite(email, name, inviter_email, groups, is_admin=False): - org = models.Organization.get_by_slug('default') - groups = build_groups(groups, is_admin) +def invite(email, name, inviter_email, groups, is_admin=False, organization='default'): + org = models.Organization.get_by_slug(organization) + groups = build_groups(org, groups, is_admin) try: user_from = models.User.get_by_email_and_org(inviter_email, org) user = models.User(org=org, name=name, email=email, groups=groups) @@ -110,11 +128,16 @@ def invite(email, name, inviter_email, groups, is_admin=False): print "The inviter [%s] was not found." % inviterEmail -@manager.command -def list(): +@manager.option('--org', dest='organization', default=None, help="The organization the user belongs to (leave blank for all organizations)") +def list(organization=None): """List all users""" - for i, user in enumerate(models.User.select()): + if organization: + org = models.Organization.get_by_slug(organization) + users = models.Users.select().where(models.Users.org==org.id) + else: + users = models.DataSource.select() + for i, user in enumerate(users): if i > 0: print "-" * 20 - print "Id: {}\nName: {}\nEmail: {}".format(user.id, user.name.encode('utf-8'), user.email) + print "Id: {}\nName: {}\nEmail: {}\nOrganization: {}".format(user.id, user.name.encode('utf-8'), user.email, user.org.name)