class DruidDatasourceModelView(CaravelModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.DruidDatasource) list_columns = [ 'datasource_link', 'cluster', 'owner', 'created_by_', 'created_on', 'changed_by_', 'changed_on', 'offset' ] order_columns = utils.list_minus(list_columns, ['created_by_', 'changed_by_']) related_views = [DruidColumnInlineView, DruidMetricInlineView] edit_columns = [ 'datasource_name', 'cluster', 'description', 'owner', 'is_featured', 'is_hidden', 'default_endpoint', 'offset', 'cache_timeout' ] page_size = 500 base_order = ('datasource_name', 'asc') description_columns = { 'offset': "Timezone offset (in hours) for this datasource", 'description': Markup("Supports <a href='" "https://daringfireball.net/projects/markdown/'>markdown</a>"), } def post_add(self, datasource): datasource.generate_metrics() utils.merge_perm(sm, 'datasource_access', datasource.perm) def post_update(self, datasource): self.post_add(datasource)
class DashboardModelView(CaravelModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.Dashboard) label_columns = { 'created_by_': 'Creator', } list_columns = ['dashboard_link', 'created_by_', 'changed_on'] order_columns = utils.list_minus(list_columns, ['created_by_']) edit_columns = [ 'dashboard_title', 'slug', 'slices', 'position_json', 'css', 'json_metadata' ] add_columns = edit_columns base_order = ('changed_on', 'desc') description_columns = { 'position_json': ("This json object describes the positioning of the widgets in " "the dashboard. It is dynamically generated when adjusting " "the widgets size and positions by using drag & drop in " "the dashboard view"), 'css': ("The css for individual dashboards can be altered here, or " "in the dashboard view where changes are immediately " "visible"), 'slug': "To get a readable URL for your dashboard", } def pre_add(self, obj): obj.slug = obj.slug.strip() or None if obj.slug: obj.slug = obj.slug.replace(" ", "-") obj.slug = re.sub(r'\W+', '', obj.slug) def pre_update(self, obj): self.pre_add(obj)
class DatabaseView(CaravelModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.Database) list_columns = ['database_name', 'sql_link', 'created_by_', 'changed_on'] order_columns = utils.list_minus(list_columns, ['created_by_']) add_columns = ['database_name', 'sqlalchemy_uri', 'cache_timeout', 'extra'] search_exclude_columns = ('password', ) edit_columns = add_columns add_template = "caravel/models/database/add.html" edit_template = "caravel/models/database/edit.html" base_order = ('changed_on', 'desc') description_columns = { 'sqlalchemy_uri': ("Refer to the SqlAlchemy docs for more information on how " "to structure your URI here: " "http://docs.sqlalchemy.org/en/rel_1_0/core/engines.html"), 'extra': utils.markdown( "JSON string containing extra configuration elements. " "The ``engine_params`` object gets unpacked into the " "[sqlalchemy.create_engine]" "(http://docs.sqlalchemy.org/en/latest/core/engines.html#" "sqlalchemy.create_engine) call, while the ``metadata_params`` " "gets unpacked into the [sqlalchemy.MetaData]" "(http://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html" "#sqlalchemy.schema.MetaData) call. ", True), } def pre_add(self, db): conn = sqla.engine.url.make_url(db.sqlalchemy_uri) db.password = conn.password conn.password = "******" * 10 if conn.password else None db.sqlalchemy_uri = str(conn) # hides the password def pre_update(self, db): self.pre_add(db)
class DatabaseView(CaravelModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.Database) list_columns = ['database_name', 'sql_link', 'created_by_', 'changed_on'] order_columns = utils.list_minus(list_columns, ['created_by_']) add_columns = ['database_name', 'sqlalchemy_uri', 'cache_timeout'] search_exclude_columns = ('password', ) edit_columns = add_columns add_template = "caravel/models/database/add.html" edit_template = "caravel/models/database/edit.html" base_order = ('changed_on', 'desc') description_columns = { 'sqlalchemy_uri': ("Refer to the SqlAlchemy docs for more information on how " "to structure your URI here: " "http://docs.sqlalchemy.org/en/rel_1_0/core/engines.html") } def pre_add(self, db): conn = sqla.engine.url.make_url(db.sqlalchemy_uri) db.password = conn.password conn.password = "******" * 10 if conn.password else None db.sqlalchemy_uri = str(conn) # hides the password def pre_update(self, db): self.pre_add(db)
class SliceModelView(CaravelModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.Slice) add_template = "caravel/add_slice.html" can_add = False label_columns = { 'created_by_': 'Creator', 'datasource_link': 'Datasource', } list_columns = [ 'slice_link', 'viz_type', 'datasource_link', 'created_by_', 'modified'] order_columns = utils.list_minus(list_columns, ['created_by_', 'modified']) edit_columns = [ 'slice_name', 'description', 'viz_type', 'druid_datasource', 'table', 'dashboards', 'params', 'cache_timeout'] base_order = ('changed_on', 'desc') description_columns = { 'description': Markup( "The content here can be displayed as widget headers in the " "dashboard view. Supports " "<a href='https://daringfireball.net/projects/markdown/'>" "markdown</a>"), }