diff --git a/rd_ui/app/scripts/app.js b/rd_ui/app/scripts/app.js index 6586698e6..3d2bed39b 100644 --- a/rd_ui/app/scripts/app.js +++ b/rd_ui/app/scripts/app.js @@ -102,9 +102,10 @@ angular.module('redash', [ }); $routeProvider.when('/', { - templateUrl: '/views/index.html', - controller: 'IndexCtrl' + templateUrl: '/views/personal.html', + controller: 'PersonalIndexCtrl' }); + $routeProvider.when('/personal', { templateUrl: '/views/personal.html', controller: 'PersonalIndexCtrl' diff --git a/rd_ui/app/views/personal.html b/rd_ui/app/views/personal.html index 834f2cd7a..1a7c0e96a 100644 --- a/rd_ui/app/views/personal.html +++ b/rd_ui/app/views/personal.html @@ -1,9 +1,16 @@
+
+

+ New Query + + New Alert +

+
+
Recent Dashboards -
diff --git a/redash/controllers.py b/redash/controllers.py index 2070d5b05..1bd56bf62 100644 --- a/redash/controllers.py +++ b/redash/controllers.py @@ -18,6 +18,9 @@ from flask_login import current_user, login_user, logout_user, login_required from funcy import project import sqlparse +from itertools import chain +from funcy import distinct + from redash import statsd_client, models, settings, utils from redash.wsgi import app, api from redash.tasks import QueryTask, record_event @@ -249,9 +252,15 @@ class DataSourceSchemaAPI(BaseResource): api.add_resource(DataSourceSchemaAPI, '/api/data_sources//schema') + class DashboardRecentAPI(BaseResource): def get(self): - return [d.to_dict() for d in models.Dashboard.recent(current_user.id).limit(20)] + recent = [d.to_dict() for d in models.Dashboard.recent(current_user.id)] + + if len(recent) < 10: + global_recent = [d.to_dict() for d in models.Dashboard.recent()] + + return distinct(chain(recent, global_recent), key=lambda d: d['id']) class DashboardListAPI(BaseResource): @@ -355,7 +364,12 @@ class QuerySearchAPI(BaseResource): class QueryRecentAPI(BaseResource): @require_permission('view_query') def get(self): - return [q.to_dict() for q in models.Query.recent(current_user.id).limit(20)] + recent = [d.to_dict() for d in models.Query.recent(current_user.id)] + + if len(recent) < 10: + global_recent = [d.to_dict() for d in models.Query.recent()] + + return distinct(chain(recent, global_recent), key=lambda d: d['id']) class QueryListAPI(BaseResource): diff --git a/redash/models.py b/redash/models.py index f11d732ff..acdd08ee7 100644 --- a/redash/models.py +++ b/redash/models.py @@ -511,18 +511,24 @@ class Query(ModelTimestampsMixin, BaseModel): return cls.select().where(where).order_by(cls.created_at.desc()) @classmethod - def recent(cls, user_id): + def recent(cls, user_id=None, limit=20): # TODO: instead of t2 here, we should define table_alias for Query table - return cls.select().where(Event.created_at > peewee.SQL("current_date - 7")).\ + query = cls.select().where(Event.created_at > peewee.SQL("current_date - 7")).\ join(Event, on=(Query.id == peewee.SQL("t2.object_id::integer"))).\ where(Event.action << ('edit', 'execute', 'edit_name', 'edit_description', 'view_source')).\ - where(Event.user == user_id).\ where(~(Event.object_id >> None)).\ where(Event.object_type == 'query'). \ where(cls.is_archived == False).\ group_by(Event.object_id, Query.id).\ order_by(peewee.SQL("count(0) desc")) + if user_id: + query = query.where(Event.user == user_id) + + query = query.limit(limit) + + return query + @classmethod def update_instance(cls, query_id, **kwargs): if 'query' in kwargs: @@ -703,16 +709,22 @@ class Dashboard(ModelTimestampsMixin, BaseModel): return cls.get(cls.slug == slug) @classmethod - def recent(cls, user_id): - return cls.select().where(Event.created_at > peewee.SQL("current_date - 7")). \ + def recent(cls, user_id=None, limit=20): + query = cls.select().where(Event.created_at > peewee.SQL("current_date - 7")). \ join(Event, on=(Dashboard.id == peewee.SQL("t2.object_id::integer"))). \ where(Event.action << ('edit', 'view')).\ - where(Event.user == user_id). \ where(~(Event.object_id >> None)). \ where(Event.object_type == 'dashboard'). \ group_by(Event.object_id, Dashboard.id). \ order_by(peewee.SQL("count(0) desc")) + if user_id: + query = query.where(Event.user == user_id) + + query = query.limit(limit) + + return query + def save(self, *args, **kwargs): if not self.slug: self.slug = utils.slugify(self.name)