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)