diff --git a/panoramix/migrations/versions/12d55656cbca_is_featured.py b/panoramix/migrations/versions/12d55656cbca_is_featured.py new file mode 100644 index 00000000000..31582237430 --- /dev/null +++ b/panoramix/migrations/versions/12d55656cbca_is_featured.py @@ -0,0 +1,23 @@ +"""is_featured + +Revision ID: 12d55656cbca +Revises: 55179c7f25c7 +Create Date: 2015-12-14 13:37:17.374852 + +""" + +# revision identifiers, used by Alembic. +revision = '12d55656cbca' +down_revision = '55179c7f25c7' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column('tables', sa.Column('is_featured', sa.Boolean(), nullable=True)) + + +def downgrade(): + op.drop_column('tables', 'is_featured') + diff --git a/panoramix/migrations/versions/2591d77e9831_user_id.py b/panoramix/migrations/versions/2591d77e9831_user_id.py new file mode 100644 index 00000000000..4fac61ce9eb --- /dev/null +++ b/panoramix/migrations/versions/2591d77e9831_user_id.py @@ -0,0 +1,26 @@ +"""user_id + +Revision ID: 2591d77e9831 +Revises: 12d55656cbca +Create Date: 2015-12-15 17:02:45.128709 + +""" + +# revision identifiers, used by Alembic. +revision = '2591d77e9831' +down_revision = '12d55656cbca' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + with op.batch_alter_table('tables') as batch_op: + batch_op.add_column(sa.Column('user_id', sa.Integer())) + batch_op.create_foreign_key('user_id', 'ab_user', ['user_id'], ['id']) + + +def downgrade(): + with op.batch_alter_table('tables') as batch_op: + batch_op.drop_constraint('user_id', type_='foreignkey') + batch_op.drop_column('user_id') diff --git a/panoramix/models.py b/panoramix/models.py index 73d060d30c9..a2357b27a95 100644 --- a/panoramix/models.py +++ b/panoramix/models.py @@ -228,6 +228,9 @@ class SqlaTable(Model, Queryable, AuditMixinNullable): description = Column(Text) default_endpoint = Column(Text) database_id = Column(Integer, ForeignKey('dbs.id'), nullable=False) + is_featured = Column(Boolean, default=False) + user_id = Column(Integer, ForeignKey('ab_user.id')) + owner = relationship('User', backref='tables', foreign_keys=[user_id]) database = relationship( 'Database', backref='tables', foreign_keys=[database_id]) offset = Column(Integer, default=0) diff --git a/panoramix/templates/panoramix/featured_datasets.html b/panoramix/templates/panoramix/featured_datasets.html new file mode 100644 index 00000000000..18f7a353869 --- /dev/null +++ b/panoramix/templates/panoramix/featured_datasets.html @@ -0,0 +1,48 @@ +{% extends "panoramix/base.html" %} +{% block content %} +

Featured Datasets

+
+ + + + + + + + + + + {% for dataset in featured_datasets %} + + + + + + + {% endfor %} + + +{% endblock %} + +{% block head_css %} +{{ super() }} + +{% endblock %} + +{% block tail_js %} +{{ super() }} + + + +{% endblock %} diff --git a/panoramix/views.py b/panoramix/views.py index ee0256f780e..5d74bb6017a 100644 --- a/panoramix/views.py +++ b/panoramix/views.py @@ -59,6 +59,14 @@ class TableColumnInlineView(CompactCRUDMixin, PanoramixModelView): } appbuilder.add_view_no_menu(TableColumnInlineView) +appbuilder.add_link( + "Featured Datasets", + href='/panoramix/featured_datasets', + category='Sources', + category_icon='fa-table', + icon="fa-star") + +appbuilder.add_separator("Sources") class ColumnInlineView(CompactCRUDMixin, PanoramixModelView): datamodel = SQLAInterface(models.Column) @@ -140,8 +148,8 @@ class TableView(PanoramixModelView, DeleteMixin): list_columns = ['table_link', 'database', 'changed_by', 'changed_on_'] add_columns = ['table_name', 'database', 'default_endpoint', 'offset'] edit_columns = [ - 'table_name', 'database', 'description', 'main_dttm_col', - 'default_endpoint', 'offset'] + 'table_name', 'is_featured', 'database', 'description', 'owner', + 'main_dttm_col', 'default_endpoint', 'offset'] related_views = [TableColumnInlineView, SqlMetricInlineView] base_order = ('changed_on','desc') description_columns = { @@ -538,6 +546,19 @@ class Panoramix(BaseView): title=ascii_art.stacktrace, art=ascii_art.error), 500 + @has_access + @expose("/featured_datasets", methods=['GET']) + def featured_datasets(self): + session = db.session() + datasets_sqla = (session.query(models.SqlaTable) + .filter_by(is_featured=True).all()) + datasets_druid = (session.query(models.Datasource) + .filter_by(is_featured=True).all()) + featured_datasets = datasets_sqla + datasets_druid + return self.render_template( + 'panoramix/featured_datasets.html', + featured_datasets=featured_datasets) + appbuilder.add_view_no_menu(Panoramix) appbuilder.add_link( "Refresh Druid Metadata",