This is an automated email from the ASF dual-hosted git repository. beto pushed a commit to branch lyftga in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/lyftga by this push: new c6876f7 Fix for tagging backend (#7240) c6876f7 is described below commit c6876f7829ee0adc3430ae5305ec05005402cb0d Author: Beto Dealmeida <robe...@dealmeida.net> AuthorDate: Mon Apr 8 11:06:45 2019 -0700 Fix for tagging backend (#7240) --- superset/models/tags.py | 4 +- superset/views/tags.py | 172 ++++++++++++++++++++++++++---------------------- 2 files changed, 96 insertions(+), 80 deletions(-) diff --git a/superset/models/tags.py b/superset/models/tags.py index 897c189..9c30f55 100644 --- a/superset/models/tags.py +++ b/superset/models/tags.py @@ -123,7 +123,7 @@ class ObjectUpdater(object): tagged_object = TaggedObject( tag_id=tag.id, object_id=target.id, - object_type=ObjectTypes.chart, + object_type=cls.object_type, ) session.add(tagged_object) @@ -141,7 +141,7 @@ class ObjectUpdater(object): tagged_object = TaggedObject( tag_id=tag.id, object_id=target.id, - object_type=ObjectTypes.query, + object_type=cls.object_type, ) session.add(tagged_object) diff --git a/superset/views/tags.py b/superset/views/tags.py index fc34490..65cbbc9 100644 --- a/superset/views/tags.py +++ b/superset/views/tags.py @@ -30,7 +30,7 @@ from werkzeug.routing import BaseConverter from superset import app, appbuilder, db, utils from superset.jinja_context import current_user_id, current_username -import superset.models.core +from superset.models.core import Dashboard, Slice from superset.models.sql_lab import SavedQuery from superset.models.tags import ObjectTypes, Tag, TaggedObject, TagTypes from .base import BaseSupersetView, json_success @@ -57,33 +57,6 @@ def process_template(content): return template.render(context) -def get_name(obj): - if obj.Dashboard: - return obj.Dashboard.dashboard_title - elif obj.Slice: - return obj.Slice.slice_name - elif obj.SavedQuery: - return obj.SavedQuery.label - - -def get_creator(obj): - if obj.Dashboard: - return obj.Dashboard.creator() - elif obj.Slice: - return obj.Slice.creator() - elif obj.SavedQuery: - return obj.SavedQuery.creator() - - -def get_attribute(obj, attr): - if obj.Dashboard: - return getattr(obj.Dashboard, attr) - elif obj.Slice: - return getattr(obj.Slice, attr) - elif obj.SavedQuery: - return getattr(obj.SavedQuery, attr) - - class TagView(BaseSupersetView): @has_access_api @@ -91,11 +64,13 @@ class TagView(BaseSupersetView): def suggestions(self): query = ( db.session.query(TaggedObject) - .group_by(TaggedObject.tag_id) + .join(Tag) + .with_entities(TaggedObject.tag_id, Tag.name) + .group_by(TaggedObject.tag_id, Tag.name) .order_by(func.count().desc()) .all() ) - tags = [{'id': obj.tag.id, 'name': obj.tag.name} for obj in query] + tags = [{'id': id, 'name': name} for id, name in query] return json_success(json.dumps(tags)) @has_access_api @@ -157,60 +132,101 @@ class TagView(BaseSupersetView): @has_access_api @expose('/tagged_objects/', methods=['GET', 'POST']) def tagged_objects(self): - query = db.session.query( - TaggedObject, - superset.models.core.Dashboard, - superset.models.core.Slice, - SavedQuery, - ).join(Tag) - - tags = request.args.get('tags') + tags = [ + process_template(tag) + for tag in request.args.get('tags', '').split(',') if tag + ] if not tags: return json_success(json.dumps([])) - tags = [process_template(tag) for tag in tags.split(',')] - query = query.filter(Tag.name.in_(tags)) - # filter types - types = request.args.get('types') - if types: - query = query.filter(TaggedObject.object_type.in_(types.split(','))) - - # get names - query = query.outerjoin( - superset.models.core.Dashboard, - and_( - TaggedObject.object_id == superset.models.core.Dashboard.id, - TaggedObject.object_type == ObjectTypes.dashboard, - ), - ).outerjoin( - superset.models.core.Slice, - and_( - TaggedObject.object_id == superset.models.core.Slice.id, - TaggedObject.object_type == ObjectTypes.chart, - ), - ).outerjoin( - SavedQuery, - and_( - TaggedObject.object_id == SavedQuery.id, - TaggedObject.object_type == ObjectTypes.query, - ), - ).group_by(TaggedObject.object_id, TaggedObject.object_type) - - objects = [ - { - 'id': get_attribute(obj, 'id'), - 'type': obj.TaggedObject.object_type.name, - 'name': get_name(obj), - 'url': get_attribute(obj, 'url'), - 'changed_on': get_attribute(obj, 'changed_on'), - 'created_by': get_attribute(obj, 'created_by_fk'), - 'creator': get_creator(obj), - } - for obj in query if get_attribute(obj, 'id') + types = [ + type_ + for type_ in request.args.get('types', '').split(',') + if type_ ] - return json_success(json.dumps(objects, default=utils.core.json_int_dttm_ser)) + results = [] + + # dashboards + if not types or 'dashboard' in types: + dashboards = ( + db.session.query(Dashboard) + .join( + TaggedObject, + and_( + TaggedObject.object_id == Dashboard.id, + TaggedObject.object_type == ObjectTypes.dashboard, + ), + ) + .join(Tag, TaggedObject.tag_id == Tag.id) + .filter(Tag.name.in_(tags)) + ) + results.extend( + { + 'id': obj.id, + 'type': ObjectTypes.dashboard.name, + 'name': obj.dashboard_title, + 'url': obj.url, + 'changed_on': obj.changed_on, + 'created_by': obj.created_by_fk, + 'creator': obj.creator(), + } for obj in dashboards + ) + + # charts + if not types or 'chart' in types: + charts = ( + db.session.query(Slice) + .join( + TaggedObject, + and_( + TaggedObject.object_id == Slice.id, + TaggedObject.object_type == ObjectTypes.chart, + ), + ) + .join(Tag, TaggedObject.tag_id == Tag.id) + .filter(Tag.name.in_(tags)) + ) + results.extend( + { + 'id': obj.id, + 'type': ObjectTypes.chart.name, + 'name': obj.slice_name, + 'url': obj.url, + 'changed_on': obj.changed_on, + 'created_by': obj.created_by_fk, + 'creator': obj.creator(), + } for obj in charts + ) + + # saved queries + if not types or 'query' in types: + saved_queries = ( + db.session.query(SavedQuery) + .join( + TaggedObject, + and_( + TaggedObject.object_id == SavedQuery.id, + TaggedObject.object_type == ObjectTypes.query, + ), + ) + .join(Tag, TaggedObject.tag_id == Tag.id) + .filter(Tag.name.in_(tags)) + ) + results.extend( + { + 'id': obj.id, + 'type': ObjectTypes.query.name, + 'name': obj.label, + 'url': obj.url, + 'changed_on': obj.changed_on, + 'created_by': obj.created_by_fk, + 'creator': obj.creator(), + } for obj in saved_queries + ) + + return json_success(json.dumps(results, default=utils.core.json_int_dttm_ser)) app.url_map.converters['object_type'] = ObjectTypeConverter