From 292d31e4900689809befbbcfecb575b84b072afb Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Thu, 6 Aug 2015 16:42:29 +0300 Subject: [PATCH] Improve /personal and use it as default home --- rd_ui/app/scripts/app.js | 5 +++-- rd_ui/app/views/personal.html | 9 ++++++++- redash/controllers.py | 18 ++++++++++++++++-- redash/models.py | 24 ++++++++++++++++++------ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/rd_ui/app/scripts/app.js b/rd_ui/app/scripts/app.js index 6586698e6b..3d2bed39b4 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 834f2cd7ab..1a7c0e96a2 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 2070d5b050..1bd56bf629 100644 --- a/redash/controllers.py +++ b/redash/controllers.py @@ -18,6 +18,9 @@ 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 @@ def get(self, data_source_id): 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 @@ def get(self): 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 f11d732ff0..acdd08ee7e 100644 --- a/redash/models.py +++ b/redash/models.py @@ -511,18 +511,24 @@ def search(cls, term): 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 @@ def get_by_slug(cls, slug): 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)