mirror of
https://github.com/getredash/redash.git
synced 2025-12-20 09:57:35 -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 = Manager(help="Data sources management commands.")
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@manager.option('--org', dest='organization', default=None, help="The organization the user belongs to (leave blank for all organizations).")
|
||||||
def list():
|
def list(organization=None):
|
||||||
"""List currently configured data sources."""
|
"""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:
|
if i > 0:
|
||||||
print "-" * 20
|
print "-" * 20
|
||||||
|
|
||||||
@@ -24,8 +29,11 @@ def validate_data_source_type(type):
|
|||||||
exit()
|
exit()
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@manager.option('name', default=None, help="name of data source to create")
|
||||||
def new(name=None, type=None, options=None):
|
@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."""
|
"""Create new data source."""
|
||||||
if name is None:
|
if name is None:
|
||||||
name = click.prompt("Name")
|
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,
|
data_source = models.DataSource.create_with_group(name=name,
|
||||||
type=type,
|
type=type,
|
||||||
options=options,
|
options=options,
|
||||||
org=models.Organization.get_by_slug('default'))
|
org=models.Organization.get_by_slug(organization))
|
||||||
print "Id: {}".format(data_source.id)
|
print "Id: {}".format(data_source.id)
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@manager.option('name', default=None, help="name of data source to delete")
|
||||||
def delete(name):
|
@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."""
|
"""Delete data source by name."""
|
||||||
try:
|
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)
|
print "Deleting data source: {} (id={})".format(name, data_source.id)
|
||||||
data_source.delete_instance(recursive=True)
|
data_source.delete_instance(recursive=True)
|
||||||
except models.DataSource.DoesNotExist:
|
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('--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('--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")
|
@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)."""
|
"""Edit data source settings (name, options, type)."""
|
||||||
try:
|
try:
|
||||||
if type is not None:
|
if type is not None:
|
||||||
validate_data_source_type(type)
|
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:
|
if options is not None:
|
||||||
schema = get_configuration_schema_for_query_runner_type(data_source.type)
|
schema = get_configuration_schema_for_query_runner_type(data_source.type)
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
from flask_script import Manager, prompt_pass
|
from flask_script import Manager, prompt_pass
|
||||||
from redash import models
|
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('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).")
|
@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)
|
print "Creating group (%s)..." % (name)
|
||||||
|
|
||||||
org = models.Organization.get_by_slug('default')
|
org = models.Organization.get_by_slug(organization)
|
||||||
|
|
||||||
permissions = extract_permissions_string(permissions)
|
permissions = extract_permissions_string(permissions)
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,10 @@ from peewee import IntegrityError
|
|||||||
from redash import models
|
from redash import models
|
||||||
from redash.handlers.users import invite_user
|
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):
|
def build_groups(org, groups, is_admin):
|
||||||
org = models.Organization.get_by_slug('default')
|
|
||||||
if isinstance(groups, basestring):
|
if isinstance(groups, basestring):
|
||||||
groups= groups.split(',')
|
groups= groups.split(',')
|
||||||
groups.remove('') # in case it was empty string
|
groups.remove('') # in case it was empty string
|
||||||
@@ -23,9 +22,10 @@ def build_groups(groups, is_admin):
|
|||||||
return groups
|
return groups
|
||||||
|
|
||||||
@manager.option('email', help="email address of the user to grant admin to")
|
@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:
|
try:
|
||||||
org = models.Organization.get_by_slug('default')
|
org = models.Organization.get_by_slug(organization)
|
||||||
admin_group = org.admin_group
|
admin_group = org.admin_group
|
||||||
user = models.User.get_by_email_and_org(email, org)
|
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('email', help="User's email")
|
||||||
@manager.option('name', help="User's full name")
|
@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('--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('--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('--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).")
|
@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):
|
def create(email, name, groups, is_admin=False, google_auth=False, password=None, organization='default'):
|
||||||
print "Creating user (%s, %s)..." % (email, name)
|
print "Creating user (%s, %s) in organization %s..." % (email, name, organization)
|
||||||
print "Admin: %r" % is_admin
|
print "Admin: %r" % is_admin
|
||||||
print "Login with Google Auth: %r\n" % google_auth
|
print "Login with Google Auth: %r\n" % google_auth
|
||||||
|
|
||||||
org = models.Organization.get_by_slug('default')
|
org = models.Organization.get_by_slug(organization)
|
||||||
groups = build_groups(groups, is_admin)
|
groups = build_groups(org, groups, is_admin)
|
||||||
|
|
||||||
user = models.User(org=org, email=email, name=name, groups=groups)
|
user = models.User(org=org, email=email, name=name, groups=groups)
|
||||||
if not google_auth:
|
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")
|
@manager.option('email', help="email address of user to delete")
|
||||||
def delete(email):
|
@manager.option('--org', dest='organization', default=None, help="The organization the user belongs to (leave blank for all organizations).")
|
||||||
deleted_count = models.User.delete().where(models.User.email == email).execute()
|
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
|
print "Deleted %d users." % deleted_count
|
||||||
|
|
||||||
|
|
||||||
@manager.option('password', help="new password for the user")
|
@manager.option('password', help="new password for the user")
|
||||||
@manager.option('email', help="email address of the user to change password for")
|
@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:
|
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.hash_password(password)
|
||||||
user.save()
|
user.save()
|
||||||
@@ -88,11 +105,12 @@ def password(email, password):
|
|||||||
@manager.option('email', help="The invitee's email")
|
@manager.option('email', help="The invitee's email")
|
||||||
@manager.option('name', help="The invitee's full name")
|
@manager.option('name', help="The invitee's full name")
|
||||||
@manager.option('inviter_email', help="The email of the inviter")
|
@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('--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).")
|
@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):
|
def invite(email, name, inviter_email, groups, is_admin=False, organization='default'):
|
||||||
org = models.Organization.get_by_slug('default')
|
org = models.Organization.get_by_slug(organization)
|
||||||
groups = build_groups(groups, is_admin)
|
groups = build_groups(org, groups, is_admin)
|
||||||
try:
|
try:
|
||||||
user_from = models.User.get_by_email_and_org(inviter_email, org)
|
user_from = models.User.get_by_email_and_org(inviter_email, org)
|
||||||
user = models.User(org=org, name=name, email=email, groups=groups)
|
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
|
print "The inviter [%s] was not found." % inviterEmail
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@manager.option('--org', dest='organization', default=None, help="The organization the user belongs to (leave blank for all organizations)")
|
||||||
def list():
|
def list(organization=None):
|
||||||
"""List all users"""
|
"""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:
|
if i > 0:
|
||||||
print "-" * 20
|
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