mirror of
https://github.com/getredash/redash.git
synced 2025-12-19 09:27:23 -05:00
Merge pull request #1136 from someones/org-aware-cli
Feature: add --org option to all relevant CLI commands.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
return permissions
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user