From cacf53c92ee6aecc642170ff0ab4bf58b4b348ae Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Fri, 23 Feb 2018 14:18:06 -0800 Subject: [PATCH 01/24] Pass param of limit for recent activity (#4475) --- superset/views/core.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/superset/views/core.py b/superset/views/core.py index e5a6bf052f1dc..b51f0cd49dea7 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -1651,6 +1651,12 @@ def testconn(self): def recent_activity(self, user_id): """Recent activity (actions) for a given user""" M = models # noqa + + if request.args.get('limit'): + limit = int(request.args.get('limit')) + else: + limit = 1000 + qry = ( db.session.query(M.Log, M.Dashboard, M.Slice) .outerjoin( @@ -1668,7 +1674,7 @@ def recent_activity(self, user_id): ), ) .order_by(M.Log.dttm.desc()) - .limit(1000) + .limit(limit) ) payload = [] for log in qry.all(): From 8aac63e74c8cc8a1d3e27bd702ea8e169a9dd1bd Mon Sep 17 00:00:00 2001 From: John Bodley <4567245+john-bodley@users.noreply.github.com> Date: Fri, 23 Feb 2018 14:46:26 -0800 Subject: [PATCH 02/24] [flake8] Fixing additional flake8 issue w/ the presence of ignore (#4474) --- .gitignore | 1 + superset/connectors/druid/models.py | 16 ++++++++-------- superset/forms.py | 4 ++-- superset/models/helpers.py | 28 ++++++++++++++++------------ superset/views/core.py | 16 ++++++++-------- tests/dict_import_export_tests.py | 29 +++++++++++++++-------------- tox.ini | 1 + 7 files changed, 51 insertions(+), 44 deletions(-) diff --git a/.gitignore b/.gitignore index 44a7521162528..9109bf14978b4 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ app.db *.sqllite .vscode .python-version +.tox # Node.js, webpack artifacts *.entry.js diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index edd7ec1009721..f64a24969b78f 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -29,7 +29,7 @@ from superset import conf, db, import_util, sm, utils from superset.connectors.base.models import BaseColumn, BaseDatasource, BaseMetric from superset.models.helpers import ( - AuditMixinNullable, ImportMixin, QueryResult, set_perm, + AuditMixinNullable, ImportMixin, QueryResult, set_perm, ) from superset.utils import ( DimSelector, DTTM_ALIAS, flasher, MetricPermException, @@ -582,11 +582,11 @@ def int_or_0(v): v1nums = (v1nums + [0, 0, 0])[:3] v2nums = (v2nums + [0, 0, 0])[:3] return ( - v1nums[0] > v2nums[0] or - (v1nums[0] == v2nums[0] and v1nums[1] > v2nums[1]) or - (v1nums[0] == v2nums[0] and v1nums[1] == v2nums[1] and - v1nums[2] > v2nums[2]) - ) + v1nums[0] > v2nums[0] or + (v1nums[0] == v2nums[0] and v1nums[1] > v2nums[1]) or + (v1nums[0] == v2nums[0] and v1nums[1] == v2nums[1] and + v1nums[2] > v2nums[2]) + ) def latest_metadata(self): """Returns segment metadata from the latest segment""" @@ -869,8 +869,8 @@ def recursive_get_fields(_conf): def resolve_postagg(postagg, post_aggs, agg_names, visited_postaggs, metrics_dict): mconf = postagg.json_obj required_fields = set( - DruidDatasource.recursive_get_fields(mconf) - + mconf.get('fieldNames', [])) + DruidDatasource.recursive_get_fields(mconf) + + mconf.get('fieldNames', [])) # Check if the fields are already in aggs # or is a previous postagg required_fields = set([ diff --git a/superset/forms.py b/superset/forms.py index cacb9067eb81b..e24ff03fa8db8 100644 --- a/superset/forms.py +++ b/superset/forms.py @@ -35,8 +35,8 @@ def all_db_items(): validators=[ FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) con = QuerySelectField( - query_factory=all_db_items, - get_pk=lambda a: a.id, get_label=lambda a: a.database_name) + query_factory=all_db_items, + get_pk=lambda a: a.id, get_label=lambda a: a.database_name) sep = StringField( _('Delimiter'), description=_('Delimiter used by CSV file (for whitespace use \s+).'), diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 948cf0d49ede2..52e17f3cf0ec1 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -61,8 +61,9 @@ def export_schema(cls, recursive=True, include_parent_ref=False): if parent_ref: parent_excludes = {c.name for c in parent_ref.local_columns} - def formatter(c): return ('{0} Default ({1})'.format( - str(c.type), c.default.arg) if c.default else str(c.type)) + def formatter(c): + return ('{0} Default ({1})'.format( + str(c.type), c.default.arg) if c.default else str(c.type)) schema = {c.name: formatter(c) for c in cls.__table__.columns if (c.name in cls.export_fields and @@ -96,7 +97,7 @@ def import_from_dict(cls, session, dict_rep, parent=None, for p in parent_refs.keys(): if p not in dict_rep: raise RuntimeError( - '{0}: Missing field {1}'.format(cls.__name__, p)) + '{0}: Missing field {1}'.format(cls.__name__, p)) else: # Set foreign keys to parent obj for k, v in parent_refs.items(): @@ -176,19 +177,22 @@ def export_to_dict(self, recursive=True, include_parent_ref=False, if (c.name in self.export_fields and c.name not in parent_excludes and (include_defaults or ( - getattr(self, c.name) is not None and - (not c.default or - getattr(self, c.name) != c.default.arg)))) + getattr(self, c.name) is not None and + (not c.default or + getattr(self, c.name) != c.default.arg)))) } if recursive: for c in self.export_children: # sorting to make lists of children stable - dict_rep[c] = sorted([child.export_to_dict( - recursive=recursive, - include_parent_ref=include_parent_ref, - include_defaults=include_defaults) - for child in getattr(self, c)], - key=lambda k: sorted(k.items())) + dict_rep[c] = sorted( + [ + child.export_to_dict( + recursive=recursive, + include_parent_ref=include_parent_ref, + include_defaults=include_defaults, + ) for child in getattr(self, c) + ], + key=lambda k: sorted(k.items())) return dict_rep diff --git a/superset/views/core.py b/superset/views/core.py index b51f0cd49dea7..d5bbfc6e63cc9 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -350,7 +350,7 @@ def form_post(self, form): except OSError: pass message = u'Table name {} already exists. Please pick another'.format( - form.name.data) if isinstance(e, IntegrityError) else text_type(e) + form.name.data) if isinstance(e, IntegrityError) else text_type(e) flash( message, 'danger') @@ -993,10 +993,10 @@ def get_viz( def slice(self, slice_id): viz_obj = self.get_viz(slice_id) endpoint = '/superset/explore/{}/{}?form_data={}'.format( - viz_obj.datasource.type, - viz_obj.datasource.id, - parse.quote(json.dumps(viz_obj.form_data)), - ) + viz_obj.datasource.type, + viz_obj.datasource.id, + parse.quote(json.dumps(viz_obj.form_data)), + ) if request.args.get('standalone') == 'true': endpoint += '&standalone=true' return redirect(endpoint) @@ -1098,9 +1098,9 @@ def annotation_json(self, layer_id): 'val': layer_id}] datasource = AnnotationDatasource() viz_obj = viz.viz_types['table']( - datasource, - form_data=form_data, - force=False, + datasource, + form_data=form_data, + force=False, ) try: payload = viz_obj.get_payload() diff --git a/tests/dict_import_export_tests.py b/tests/dict_import_export_tests.py index 592930a8af08c..340c70a767418 100644 --- a/tests/dict_import_export_tests.py +++ b/tests/dict_import_export_tests.py @@ -11,7 +11,8 @@ from superset import db from superset.connectors.druid.models import ( - DruidColumn, DruidDatasource, DruidMetric) + DruidColumn, DruidDatasource, DruidMetric, +) from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn from .base_tests import SupersetTestCase @@ -81,12 +82,12 @@ def create_druid_datasource( cluster_name = 'druid_test' params = {DBREF: id, 'database_name': cluster_name} dict_rep = { - 'cluster_name': cluster_name, - 'datasource_name': name, - 'id': id, - 'params': json.dumps(params), - 'columns': [{'column_name': c} for c in cols_names], - 'metrics': [{'metric_name': c} for c in metric_names], + 'cluster_name': cluster_name, + 'datasource_name': name, + 'id': id, + 'params': json.dumps(params), + 'columns': [{'column_name': c} for c in cols_names], + 'metrics': [{'metric_name': c} for c in metric_names], } datasource = DruidDatasource( @@ -180,12 +181,12 @@ def test_import_table_override_append(self): imported_table = SqlaTable.import_from_dict(db.session, dict_table) db.session.commit() table_over, dict_table_over = self.create_table( - 'table_override', id=ID_PREFIX + 3, - cols_names=['new_col1', 'col2', 'col3'], - metric_names=['new_metric1']) + 'table_override', id=ID_PREFIX + 3, + cols_names=['new_col1', 'col2', 'col3'], + metric_names=['new_metric1']) imported_over_table = SqlaTable.import_from_dict( - db.session, - dict_table_over) + db.session, + dict_table_over) db.session.commit() imported_over = self.get_table(imported_over_table.id) @@ -289,8 +290,8 @@ def test_import_druid_override_append(self): cols_names=['new_col1', 'col2', 'col3'], metric_names=['new_metric1']) imported_over_cluster = DruidDatasource.import_from_dict( - db.session, - table_over_dict) + db.session, + table_over_dict) db.session.commit() imported_over = self.get_datasource(imported_over_cluster.id) self.assertEquals(imported_cluster.id, imported_over.id) diff --git a/tox.ini b/tox.ini index a4d5af4aa6f2f..bd94424253b98 100644 --- a/tox.ini +++ b/tox.ini @@ -16,6 +16,7 @@ exclude = superset/data superset/migrations superset/templates +ignore = import-order-style = google max-line-length = 90 From e112e4417cb7386fe161c5ff2fe0f1b5d05c3a17 Mon Sep 17 00:00:00 2001 From: John Bodley <4567245+john-bodley@users.noreply.github.com> Date: Fri, 23 Feb 2018 16:42:09 -0800 Subject: [PATCH 03/24] [flake8] Adding future-import check (#4476) --- scripts/permissions_cleanup.py | 5 +++++ setup.py | 5 +++++ superset/cache_util.py | 5 +++++ superset/connectors/base/models.py | 5 +++++ superset/connectors/base/views.py | 5 +++++ superset/connectors/connector_registry.py | 5 +++++ superset/connectors/druid/models.py | 5 +++++ superset/connectors/druid/views.py | 5 +++++ superset/connectors/sqla/models.py | 5 +++++ superset/connectors/sqla/views.py | 5 +++++ superset/db_engines/hive.py | 5 +++++ superset/db_engines/presto.py | 5 +++++ superset/dict_import_export_util.py | 5 +++++ superset/extract_table_names.py | 4 ++++ superset/import_util.py | 5 +++++ superset/stats_logger.py | 5 +++++ superset/views/base.py | 5 +++++ superset/views/sql_lab.py | 5 +++++ tests/druid_func_tests.py | 5 +++++ tests/model_tests.py | 5 +++++ tests/security_tests.py | 5 +++++ tests/utils_tests.py | 5 +++++ tests/viz_tests.py | 5 +++++ tox.ini | 10 ++++++++++ 24 files changed, 124 insertions(+) diff --git a/scripts/permissions_cleanup.py b/scripts/permissions_cleanup.py index 8d57a0132765a..8d6e81eb6f23e 100644 --- a/scripts/permissions_cleanup.py +++ b/scripts/permissions_cleanup.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from collections import defaultdict from superset import sm diff --git a/setup.py b/setup.py index 2c14b90a45304..cb5303173c3c1 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + import json import os import subprocess diff --git a/superset/cache_util.py b/superset/cache_util.py index 9612324d5d487..833ee419b693e 100644 --- a/superset/cache_util.py +++ b/superset/cache_util.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from flask import request from superset import tables_cache diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py index 940cc446ee87c..9291562d4d2dd 100644 --- a/superset/connectors/base/models.py +++ b/superset/connectors/base/models.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + import json from sqlalchemy import ( diff --git a/superset/connectors/base/views.py b/superset/connectors/base/views.py index 46a7120c2b068..11c88cabbddf2 100644 --- a/superset/connectors/base/views.py +++ b/superset/connectors/base/views.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from flask import Markup from superset.utils import SupersetException diff --git a/superset/connectors/connector_registry.py b/superset/connectors/connector_registry.py index ffcf5ad32b0aa..9b349975a596d 100644 --- a/superset/connectors/connector_registry.py +++ b/superset/connectors/connector_registry.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from sqlalchemy.orm import subqueryload diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index f64a24969b78f..e02bbf615d5e0 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -1,4 +1,9 @@ # pylint: disable=invalid-unary-operand-type +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from collections import OrderedDict from copy import deepcopy from datetime import datetime, timedelta diff --git a/superset/connectors/druid/views.py b/superset/connectors/druid/views.py index ca407fb05ede2..1277dc6f554d7 100644 --- a/superset/connectors/druid/views.py +++ b/superset/connectors/druid/views.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from datetime import datetime import json import logging diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 9e2ae2005f3ca..c3d36e7645cbe 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from datetime import datetime import logging diff --git a/superset/connectors/sqla/views.py b/superset/connectors/sqla/views.py index 3bc31f0a006b3..db1fe3d753f22 100644 --- a/superset/connectors/sqla/views.py +++ b/superset/connectors/sqla/views.py @@ -1,4 +1,9 @@ """Views used by the SqlAlchemy connector""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from flask import flash, Markup, redirect from flask_appbuilder import CompactCRUDMixin, expose from flask_appbuilder.actions import action diff --git a/superset/db_engines/hive.py b/superset/db_engines/hive.py index ae3c1eaacee63..67ccb4d853eb3 100644 --- a/superset/db_engines/hive.py +++ b/superset/db_engines/hive.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from pyhive import hive from TCLIService import ttypes from thrift import Thrift diff --git a/superset/db_engines/presto.py b/superset/db_engines/presto.py index eb3246451d120..60837cc943c8f 100644 --- a/superset/db_engines/presto.py +++ b/superset/db_engines/presto.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from pyhive import presto diff --git a/superset/dict_import_export_util.py b/superset/dict_import_export_util.py index 26cfc5de2ed7a..8a02df05778d2 100644 --- a/superset/dict_import_export_util.py +++ b/superset/dict_import_export_util.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + import logging from superset.connectors.druid.models import DruidCluster diff --git a/superset/extract_table_names.py b/superset/extract_table_names.py index a86b067994551..8cac1e1ee43e2 100644 --- a/superset/extract_table_names.py +++ b/superset/extract_table_names.py @@ -11,6 +11,10 @@ # # See: # http://groups.google.com/group/sqlparse/browse_thread/thread/b0bd9a022e9d4895 +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals import sqlparse from sqlparse.sql import Identifier, IdentifierList diff --git a/superset/import_util.py b/superset/import_util.py index 47ffc4d04aff9..180477d7eb741 100644 --- a/superset/import_util.py +++ b/superset/import_util.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + import logging from sqlalchemy.orm.session import make_transient diff --git a/superset/stats_logger.py b/superset/stats_logger.py index 9644f10ea8998..681b9066dde88 100644 --- a/superset/stats_logger.py +++ b/superset/stats_logger.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + import logging from colorama import Fore, Style diff --git a/superset/views/base.py b/superset/views/base.py index 7e0edc476d47c..b3d698f4e20f3 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from datetime import datetime import functools import json diff --git a/superset/views/sql_lab.py b/superset/views/sql_lab.py index 488a36e33c54d..f8d22b4f4ca92 100644 --- a/superset/views/sql_lab.py +++ b/superset/views/sql_lab.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from flask import g, redirect from flask_appbuilder import expose from flask_appbuilder.models.sqla.interface import SQLAInterface diff --git a/tests/druid_func_tests.py b/tests/druid_func_tests.py index 3deb3e29afb25..a5a0c0400b125 100644 --- a/tests/druid_func_tests.py +++ b/tests/druid_func_tests.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + import json import unittest diff --git a/tests/model_tests.py b/tests/model_tests.py index 94a5358807135..d23c84a2de2e1 100644 --- a/tests/model_tests.py +++ b/tests/model_tests.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + import unittest from sqlalchemy.engine.url import make_url diff --git a/tests/security_tests.py b/tests/security_tests.py index 6cd77804ebbc8..5839cb892c688 100644 --- a/tests/security_tests.py +++ b/tests/security_tests.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from superset import app, security, sm from .base_tests import SupersetTestCase diff --git a/tests/utils_tests.py b/tests/utils_tests.py index 04a70b8f60f03..c5d13c6624eca 100644 --- a/tests/utils_tests.py +++ b/tests/utils_tests.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from datetime import date, datetime, time, timedelta from decimal import Decimal import unittest diff --git a/tests/viz_tests.py b/tests/viz_tests.py index e9e8d6b9c1665..e2417e52beade 100644 --- a/tests/viz_tests.py +++ b/tests/viz_tests.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from datetime import datetime import unittest diff --git a/tox.ini b/tox.ini index bd94424253b98..e9ff3a6c77242 100644 --- a/tox.ini +++ b/tox.ini @@ -17,8 +17,17 @@ exclude = superset/migrations superset/templates ignore = + FI12 + FI15 + FI16 + FI17 + FI50 + FI51 + FI53 + FI54 import-order-style = google max-line-length = 90 +require-code = True [global] wheel_dir = {homedir}/.wheelhouse @@ -57,6 +66,7 @@ commands = deps = flake8 flake8-commas + flake8-future-import flake8-import-order flake8-quotes From 094eb71f86a8e0eb880cff97a3e9fa275481dd47 Mon Sep 17 00:00:00 2001 From: Raffaele Spangaro Date: Sun, 25 Feb 2018 23:58:14 +0100 Subject: [PATCH 04/24] [FilterBox] Make filterbox localizable (#4466) * Make filterbox i18n * Change double-quote to single-quote in localization function t() to pass lint test * Updated .po file with italian translation. New strings generated and translated via babel-extract --- superset/assets/visualizations/filter_box.jsx | 10 +- .../translations/it/LC_MESSAGES/messages.json | 2 +- .../translations/it/LC_MESSAGES/messages.mo | Bin 64566 -> 83973 bytes .../translations/it/LC_MESSAGES/messages.po | 3165 +++++++++++------ 4 files changed, 2146 insertions(+), 1031 deletions(-) diff --git a/superset/assets/visualizations/filter_box.jsx b/superset/assets/visualizations/filter_box.jsx index 7653ec2cc2a77..f157f509837e2 100644 --- a/superset/assets/visualizations/filter_box.jsx +++ b/superset/assets/visualizations/filter_box.jsx @@ -111,8 +111,8 @@ class FilterBox extends React.Component {
@@ -120,8 +120,8 @@ class FilterBox extends React.Component {
@@ -227,7 +227,7 @@ class FilterBox extends React.Component { onClick={this.clickApply.bind(this)} disabled={!this.state.hasChanged} > - Apply + {t('Apply')} }
diff --git a/superset/translations/it/LC_MESSAGES/messages.json b/superset/translations/it/LC_MESSAGES/messages.json index 03177dedc653e..82e70a69ceeed 100644 --- a/superset/translations/it/LC_MESSAGES/messages.json +++ b/superset/translations/it/LC_MESSAGES/messages.json @@ -1 +1 @@ -{"domain":"superset","locale_data":{"superset":{"":{"domain":"superset","plural_forms":"nplurals=1; plural=0","lang":"it"},"Time Column":["Colonna del Tempo"],"second":["secondo"],"minute":["minuto"],"hour":["ora"],"day":["giorno"],"week":["settimana"],"month":["mese"],"quarter":["quartile"],"year":["anno"],"week_start_monday":["settimana_inizio_lunedì"],"week_ending_saturday":["settimana_fine_domenica"],"week_start_sunday":["settimana_inizio_domenica"],"5 minute":["5 minuti"],"half hour":["mezz'ora"],"10 minute":["10 minuti"],"[Superset] Access to the datasource %(name)s was granted":["[Superset] Accesso al datasource $(name) concesso"],"Viz is missing a datasource":["Datasource mancante per la visualizzazione"],"From date cannot be larger than to date":["La data di inizio non può essere dopo la data di fine"],"Table View":["Vista Tabella"],"Pick a granularity in the Time section or uncheck 'Include Time'":["Seleziona una granularità nella sezione tempo e deseleziona 'Includi Tempo'"],"Choose either fields to [Group By] and [Metrics] or [Columns], not both":["Selezionare i campi [Group By] e [Metrica] o [Colonne], non entrambi"],"Pivot Table":["Vista Pivot"],"Please choose at least one \"Group by\" field ":["Seleziona almeno un campo \"Group by\""],"Please choose at least one metric":["Seleziona almeno una metrica"],"'Group By' and 'Columns' can't overlap":["'Group by' e 'Colonne' non possono sovrapporsi"],"Markup":["Marcatore"],"Separator":["Separatore"],"Word Cloud":["Cloud di Parole"],"Treemap":["Treemap"],"Calendar Heatmap":["Calendario di Intensità"],"Box Plot":["Box Plot"],"Bubble Chart":["Grafico a Bolle"],"Pick a metric for x, y and size":["Seleziona una metrica per x, y e grandezza"],"Bullet Chart":["Grafico a Proiettile"],"Pick a metric to display":["Seleziona una metrica da visualizzare"],"Big Number with Trendline":["Numero Grande con Linea del Trend"],"Pick a metric!":["Seleziona una metrica!"],"Big Number":["Numero Grande"],"Time Series - Line Chart":["Serie Temporali - Grafico Lineare"],"Pick a time granularity for your time series":["Seleziona una granularità per la serie temporale"],"Time Series - Dual Axis Line Chart":["Serie Temporali - Grafico Lineare ad Assi Duali"],"Pick a metric for left axis!":["Seleziona una metrica per l'asse sinistro"],"Pick a metric for right axis!":["Seleziona una metrica per l'asse destro"],"Please choose different metrics on left and right axis":["Seleziona metriche differenti per gli assi destro e sinistro"],"Time Series - Bar Chart":["Serie Temporali - Grafico Barre"],"Time Series - Percent Change":["Serie Temporali - Cambiamento Percentuale"],"Time Series - Stacked":["Serie Temporali - Stacked"],"Distribution - NVD3 - Pie Chart":["Distribuzione - NVD3 - Grafico Torta"],"Histogram":["Istogramma"],"Must have one numeric column specified":["Devi specificare una colonna numerica"],"Distribution - Bar Chart":["Distribuzione - Grafico Barre"],"Can't have overlap between Series and Breakdowns":[""],"Pick at least one metric":["Seleziona almeno una metrica"],"Pick at least one field for [Series]":["Seleziona almeno un campo per [Series]"],"Sunburst":["Sunburst"],"Sankey":["Sankey"],"Pick exactly 2 columns as [Source / Target]":["Seleziona esattamente 2 colonne come [Sorgente / Destinazione]"],"There's a loop in your Sankey, please provide a tree. Here's a faulty link: {}":[""],"Directed Force Layout":["Disposizione a Forza Diretta"],"Pick exactly 2 columns to 'Group By'":["Seleziona esattamente 2 colonne per 'Group By'"],"Country Map":["Mappa della Nazione"],"World Map":["Mappa del Mondo"],"Filters":["Filtri"],"Pick at least one filter field":[""],"iFrame":["iFrame"],"Parallel Coordinates":["Coordinate Parallele"],"Heatmap":["Mappa di Intensità"],"Horizon Charts":["Grafici d'orizzonte"],"Mapbox":["Mapbox"],"Must have a [Group By] column to have 'count' as the [Label]":[""],"Choice of [Label] must be present in [Group By]":[""],"Choice of [Point Radius] must be present in [Group By]":[""],"[Longitude] and [Latitude] columns must be present in [Group By]":[""],"Event flow":[""],"Time Series - Paired t-test":[""],"Your query was saved":["La tua query è stata salvata"],"Your query could not be saved":["La tua query non può essere salvata"],"Failed at retrieving results from the results backend":["Errore nel recupero dei dati dal backend"],"Could not connect to server":["Non posso connettermi al server"],"Your session timed out, please refresh your page and try again.":["La tua sessione è scaduta, ricarica la pagina e riprova."],"Query was stopped.":["La query è stata fermata."],"Failed at stopping query.":["Errore nel fermare la query."],"Error occurred while fetching table metadata":["Errore nel recupero dei metadati della tabella"],"shared query":["query condivisa"],"The query couldn't be loaded":["La query non può essere caricata"],"An error occurred while creating the data source":["Errore nel creare il datasource"],"Pick a chart type!":["Seleziona un tipo di grafico"],"To use this chart type you need at least one column flagged as a date":["Per usare questo tipo di grafico devi avere almeno una colonna selezionata come data"],"To use this chart type you need at least one dimension":["Per usare questo tipo di grafico devi avere almeno una dimensione"],"To use this chart type you need at least one aggregation function":["Per usare questo tipo di grafico devi avere almeno uan funziona di aggregazione"],"Untitled Query":["Query senza nome"],"Copy of %s":["Copia di %s"],"share query":["condividi query"],"copy URL to clipboard":["copia URL in appunti"],"Raw SQL":[""],"Source SQL":[""],"SQL":[""],"No query history yet...":[""],"It seems you don't have access to any database":[""],"Search Results":["Risultati della ricerca"],"[From]-":[""],"[To]-":[""],"[Query Status]":[""],"Search":["Cerca"],"Open in SQL Editor":["Apri in SQL Editor"],"view results":["visualizza risultati"],"Data preview":[""],"Visualize the data out of this query":[""],"Overwrite text in editor with a query on this table":[""],"Run query in a new tab":[""],"Remove query from log":[""],".CSV":["CSV"],"Visualize":[""],"Table":["Tabella"],"was created":["è stata creata"],"Query in a new tab":["Query in un nuovo tab"],"Fetch data preview":[""],"Track Job":[""],"Loading...":[""],"Run Selected Query":[""],"Run Query":[""],"Run query asynchronously":[""],"Stop":[""],"Undefined":[""],"Label":[""],"Label for your query":[""],"Description":["Descrizione"],"Write a description for your query":[""],"Save":[""],"Cancel":["Annulla"],"Save Query":[""],"Run a query to display results here":[""],"Preview for %s":[""],"Results":[""],"Query History":[""],"Create table as with query results":[""],"new table name":[""],"Error while fetching table list":[""],"Error while fetching schema list":[""],"Error while fetching database list":[""],"Database:":[""],"Select a database":[""],"Select a schema (%s)":[""],"Schema:":[""],"Add a table (%s)":[""],"Type to search ...":[""],"Reset State":[""],"Enter a new title for the tab":[""],"Untitled Query %s":[""],"close tab":[""],"rename tab":[""],"expand tool bar":[""],"hide tool bar":[""],"Copy partition query to clipboard":[""],"latest partition:":[""],"Keys for table":[""],"View keys & indexes (%s)":[""],"Sort columns alphabetically":[""],"Original table column order":[""],"Copy SELECT statement to clipboard":[""],"Remove table preview":[""],"%s is not right as a column name, please alias it (as in SELECT count(*) ":[""],"AS my_alias":[""],"using only alphanumeric characters and underscores":[""],"Creating a data source and popping a new tab":[""],"No results available for this query":[""],"Chart Type":[""],"[Chart Type]":[""],"Datasource Name":[""],"datasource name":[""],"Select ...":[""],"Loaded data cached":[""],"Loaded from cache":[""],"Click to force-refresh":[""],"Copy to clipboard":[""],"Not successful":[""],"Sorry, your browser does not support copying. Use Ctrl / Cmd + C!":[""],"Copied!":[""],"Title":["Titolo"],"click to edit title":[""],"You don't have the rights to alter this title.":[""],"Click to favorite/unfavorite":[""],"You have unsaved changes.":[""],"Click the":[""],"button on the top right to save your changes.":[""],"Served from data cached %s . Click to force refresh.":[""],"Click to force refresh":[""],"Error":[""],"Sorry, there was an error adding slices to this dashboard: %s":[""],"Active Dashboard Filters":[""],"Checkout this dashboard: %s":[""],"Force refresh the whole dashboard":[""],"Edit this dashboard's properties":[""],"Load a template":[""],"Load a CSS template":[""],"CSS":["CSS"],"Live CSS Editor":[""],"Don't refresh":[""],"10 seconds":[""],"30 seconds":[""],"1 minute":[""],"5 minutes":[""],"Refresh Interval":[""],"Choose the refresh frequency for this dashboard":[""],"This dashboard was saved successfully.":[""],"Sorry, there was an error saving this dashboard: ":[""],"You must pick a name for the new dashboard":[""],"Save Dashboard":[""],"Overwrite Dashboard [%s]":[""],"Save as:":[""],"[dashboard name]":[""],"Name":["Nome"],"Viz":[""],"Modified":["Modificato"],"Add Slices":[""],"Add a new slice to the dashboard":[""],"Add Slices to Dashboard":[""],"Move chart":[""],"Force refresh data":[""],"Toggle chart description":[""],"Edit chart":[""],"Export CSV":[""],"Explore chart":[""],"Remove chart from dashboard":[""],"%s - untitled":[""],"Edit slice properties":[""],"description":[""],"bolt":[""],"Error...":[""],"Query":[""],"Height":["Altezza"],"Width":["Larghezza"],"Export to .json":["Esporta in .json"],"Export to .csv format":["Esporta nel formato .csv"],"Please enter a slice name":["Inserisci un nome per la slice"],"Please select a dashboard":["Seleziona una dashboard"],"Please enter a dashboard name":["Inserisci un nome per la dashboard"],"Save A Slice":["Salva una slice"],"Overwrite slice %s":["Sovrascrivi la slice %s"],"Save as":["Salva come"],"[slice name]":["[nome slice]"],"Do not add to a dashboard":["Non aggiugere alla dashboard"],"Add slice to existing dashboard":["Aggiungi la slice alla dashboard esistente"],"Add to new dashboard":["Aggiungi ad una nuova dashboard"],"Save & go to dashboard":["Salva e vai alla dashboard"],"Check out this slice: %s":["Guarda questa slice: %s"],"`Min` value should be numeric or empty":[""],"`Max` value should be numeric or empty":[""],"Min":["Min"],"Max":["Max"],"Something went wrong while fetching the datasource list":[""],"Click to point to another datasource":[""],"Edit the datasource's configuration":[""],"Select a datasource":["Seleziona un datasource"],"Search / Filter":["Cerca / Filtra"],"Filter value":["Valore del filtro"],"Select metric":["Seleziona una metrica"],"Select column":["Seleziona una colonna"],"Select operator":["Seleziona operatore"],"Add Filter":["Aggiungi filtro"],"Error while fetching data":["Errore nel recupero dati"],"Select %s":["Seleziona %s"],"textarea":["textarea"],"Edit":["Modifica"],"in modal":["in modale"],"Select a visualization type":["Seleziona un tipo di visualizzazione"],"Updating chart was stopped":["L'aggiornamento del grafico è stato fermato"],"An error occurred while rendering the visualization: %s":["Errore nel rendering della visualizzazione: %s"],"Perhaps your data has grown, your database is under unusual load, or you are simply querying a data source that is to large to be processed within the timeout range. If that is the case, we recommend that you summarize your data further.":[""],"Network error.":["Errore di rete."],"A reference to the [Time] configuration, taking granularity into account":[""],"Group by":["Raggruppa per"],"One or many controls to group by":["Uno o più controlli per 'Raggruppa per'"],"Datasource":["Sorgente Dati"],"Visualization Type":["Tipo di Visualizzazione"],"The type of visualization to display":["Il tipo di visualizzazione da mostrare"],"Metrics":["Metriche"],"One or many metrics to display":["Una o più metriche da mostrare"],"Y Axis Bounds":["Limite asse Y"],"Bounds for the Y axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.":[""],"Ordering":["Ordina per"],"Annotation Layers":[""],"Annotation layers to overlay on the visualization":[""],"Select a annotation layer":[""],"Error while fetching annotation layers":[""],"Metric":["Metrica"],"Choose the metric":["Seleziona la metrica"],"Right Axis Metric":["Metrica asse destro"],"Choose a metric for right axis":["Seleziona una metrica per l'asse destro"],"Stacked Style":[""],"Linear Color Scheme":[""],"Normalize Across":[""],"Color will be rendered based on a ratio of the cell against the sum of across this criteria":[""],"Horizon Color Scale":[""],"Defines how the color are attributed.":[""],"Rendering":[""],"image-rendering CSS attribute of the canvas object that defines how the browser scales up the image":[""],"XScale Interval":[""],"Number of steps to take between ticks when displaying the X scale":[""],"YScale Interval":[""],"Number of steps to take between ticks when displaying the Y scale":[""],"Include Time":[""],"Whether to include the time granularity as defined in the time section":[""],"Stacked Bars":[""],"Show totals":[""],"Display total row/column":["Mostra totali riga/colonna"],"Show Markers":["Mostra marcatori"],"Show data points as circle markers on the lines":[""],"Bar Values":[""],"Show the value on top of the bar":[""],"Sort Bars":[""],"Sort bars by x labels.":[""],"Combine Metrics":[""],"Display metrics side by side within each column, as opposed to each column being displayed side by side for each metric.":[""],"Extra Controls":[""],"Whether to show extra controls or not. Extra controls include things like making mulitBar charts stacked or side by side.":[""],"Reduce X ticks":[""],"Reduces the number of X axis ticks to be rendered. If true, the x axis wont overflow and labels may be missing. If false, a minimum width will be applied to columns and the width may overflow into an horizontal scroll.":[""],"Include Series":[""],"Include series name as an axis":[""],"Color Metric":[""],"A metric to use for color":[""],"Country Name":[""],"The name of country that Superset should display":[""],"Country Field Type":[""],"The country code standard that Superset should expect to find in the [country] column":[""],"Columns":[""],"One or many controls to pivot as columns":[""],"Columns to display":[""],"Origin":[""],"Defines the origin where time buckets start, accepts natural dates as in `now`, `sunday` or `1970-01-01`":[""],"Bottom Margin":[""],"Bottom margin, in pixels, allowing for more room for axis labels":[""],"Left Margin":[""],"Left margin, in pixels, allowing for more room for axis labels":[""],"Time Granularity":[""],"The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`, `1 day` or `56 weeks`":[""],"Domain":[""],"The time unit used for the grouping of blocks":[""],"Subdomain":[""],"The time unit for each block. Should be a smaller unit than domain_granularity. Should be larger or equal to Time Grain":[""],"Link Length":[""],"Link length in the force layout":[""],"Charge":[""],"Charge in the force layout":[""],"The time column for the visualization. Note that you can define arbitrary expression that return a DATETIME column in the table or. Also note that the filter below is applied against this column or expression":[""],"Time Grain":[""],"The time granularity for the visualization. This applies a date transformation to alter your time column and defines a new time granularity. The options here are defined on a per database engine basis in the Superset source code.":[""],"Resample Rule":[""],"Pandas resample rule":[""],"Resample How":[""],"Pandas resample how":[""],"Resample Fill Method":[""],"Pandas resample fill method":[""],"Since":["Data inizio"],"7 days ago":["7 giorni"],"Until":["Data fine"],"Max Bubble Size":[""],"Whisker/outlier options":[""],"Determines how whiskers and outliers are calculated.":[""],"Ratio":[""],"Target aspect ratio for treemap tiles.":[""],"Number format":[""],"Row limit":[""],"Series limit":[""],"Limits the number of time series that get displayed":[""],"Sort By":[""],"Metric used to define the top series":[""],"Rolling":[""],"Defines a rolling window function to apply, works along with the [Periods] text box":[""],"Periods":[""],"Defines the size of the rolling window function, relative to the time granularity selected":[""],"Min Periods":[""],"The minimum number of rolling periods required to show a value. For instance if you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so that all data points shown are the total of 7 periods. This will hide the \"ramp up\" taking place over the first 7 periods":[""],"Series":[""],"Defines the grouping of entities. Each series is shown as a specific color on the chart and has a legend toggle":[""],"Entity":[""],"This defines the element to be plotted on the chart":[""],"X Axis":[""],"Metric assigned to the [X] axis":[""],"Y Axis":[""],"Metric assigned to the [Y] axis":[""],"Bubble Size":[""],"URL":[""],"The URL, this control is templated, so you can integrate {{ width }} and/or {{ height }} in your URL string.":[""],"X Axis Label":[""],"Y Axis Label":[""],"Custom WHERE clause":[""],"The text in this box gets included in your query's WHERE clause, as an AND to other criteria. You can include complex expression, parenthesis and anything else supported by the backend it is directed towards.":[""],"Custom HAVING clause":[""],"The text in this box gets included in your query's HAVING clause, as an AND to other criteria. You can include complex expression, parenthesis and anything else supported by the backend it is directed towards.":[""],"Comparison Period Lag":[""],"Based on granularity, number of time periods to compare against":[""],"Comparison suffix":[""],"Suffix to apply after the percentage display":[""],"Table Timestamp Format":[""],"Timestamp Format":[""],"Series Height":[""],"Pixel height of each series":[""],"Page Length":[""],"Rows per page, 0 means no pagination":[""],"X Axis Format":[""],"Y Axis Format":[""],"Right Axis Format":[""],"Markup Type":[""],"Pick your favorite markup language":[""],"Rotation":[""],"Rotation to apply to words in the cloud":[""],"Line Style":[""],"Line interpolation as defined by d3.js":[""],"Label Type":[""],"What should be shown on the label?":[""],"Code":[""],"Put your code here":[""],"Aggregation function":[""],"Aggregate function to apply when pivoting and computing the total rows and columns":[""],"Font Size From":[""],"Font size for the smallest value in the list":[""],"Font Size To":[""],"Font size for the biggest value in the list":[""],"Instant Filtering":[""],"Range Filter":[""],"Whether to display the time range interactive selector":[""],"Date Filter":[""],"Whether to include a time filter":[""],"Data Table":[""],"Whether to display the interactive data table":[""],"Search Box":[""],"Whether to include a client side search box":[""],"Table Filter":[""],"Whether to apply filter when table cell is clicked":[""],"Show Bubbles":[""],"Whether to display bubbles on top of countries":[""],"Legend":[""],"Whether to display the legend (toggles)":[""],"X bounds":[""],"Whether to display the min and max values of the X axis":[""],"Y bounds":[""],"Whether to display the min and max values of the Y axis":[""],"Rich Tooltip":[""],"The rich tooltip shows a list of all series for that point in time":[""],"Y Log Scale":[""],"Use a log scale for the Y axis":[""],"X Log Scale":[""],"Use a log scale for the X axis":[""],"Donut":[""],"Do you want a donut or a pie?":[""],"Put labels outside":[""],"Put the labels outside the pie?":[""],"Contribution":[""],"Compute the contribution to the total":[""],"Period Ratio":[""],"[integer] Number of period to compare against, this is relative to the granularity selected":[""],"Period Ratio Type":[""],"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` is (new-previous)":[""],"Time Shift":[""],"Overlay a timeseries from a relative time period. Expects relative time delta in natural language (example: 24 hours, 7 days, 56 weeks, 365 days)":[""],"Subheader":[""],"Description text that shows up below your Big Number":[""],"label":[""],"`count` is COUNT(*) if a group by is used. Numerical columns will be aggregated with the aggregator. Non-numerical columns will be used to label points. Leave empty to get a count of points in each cluster.":[""],"Map Style":[""],"Base layer map style":[""],"Clustering Radius":[""],"The radius (in pixels) the algorithm uses to define a cluster. Choose 0 to turn off clustering, but beware that a large number of points (>1000) will cause lag.":[""],"Point Radius":[""],"The radius of individual points (ones that are not in a cluster). Either a numerical column or `Auto`, which scales the point based on the largest cluster":[""],"Point Radius Unit":[""],"The unit of measure for the specified point radius":[""],"Opacity":[""],"Opacity of all clusters, points, and labels. Between 0 and 1.":[""],"Zoom":[""],"Zoom level of the map":[""],"Default latitude":[""],"Latitude of default viewport":[""],"Default longitude":[""],"Longitude of default viewport":[""],"Live render":[""],"Points and clusters will update as viewport is being changed":[""],"RGB Color":[""],"The color for points and clusters in RGB":[""],"Ranges":[""],"Ranges to highlight with shading":[""],"Range labels":[""],"Labels for the ranges":[""],"Markers":[""],"List of values to mark with triangles":[""],"Marker labels":[""],"Labels for the markers":[""],"Marker lines":[""],"List of values to mark with lines":[""],"Marker line labels":[""],"Labels for the marker lines":[""],"Slice ID":[""],"The id of the active slice":[""],"Cache Timeout (seconds)":[""],"The number of seconds before expiring the cache":[""],"Order by entity id":[""],"Important! Select this if the table is not already sorted by entity id, else there is no guarantee that all events for each entity are returned.":[""],"Minimum leaf node event count":[""],"Leaf nodes that represent fewer than this number of events will be initially hidden in the visualization":[""],"Color Scheme":[""],"The color scheme for rendering chart":[""],"Time":["Tempo"],"Time related form attributes":["Attributi relativi al tempo"],"Datasource & Chart Type":["Sorgente dati e tipo di grafico"],"This section exposes ways to include snippets of SQL in your query":[""],"Annotations":[""],"Advanced Analytics":["Analytics avanzate"],"This section contains options that allow for advanced analytical post processing of query results":[""],"Result Filters":[""],"The filters to apply after post-aggregation.Leave the value control empty to filter empty strings or nulls":[""],"Chart Options":["Opzioni del grafico"],"Breakdowns":[""],"Defines how each series is broken down":[""],"Pie Chart":["Grafico a torta"],"Dual Axis Line Chart":["Grafico lineare a due assi"],"Y Axis 1":["Asse Y 1"],"Y Axis 2":["Asse Y 2"],"Left Axis Metric":["Metrica asse sinistro"],"Choose a metric for left axis":["Seleziona una metrica per l'asse sinistro"],"Left Axis Format":["Formato asse sinistro"],"Axes":["Assi"],"GROUP BY":["RAGGRUPPA PER"],"Use this section if you want a query that aggregates":[""],"NOT GROUPED BY":["NON RAGGRUPPARE PER"],"Use this section if you want to query atomic rows":[""],"Options":["Opzioni"],"Bubbles":["Bolle"],"Numeric Column":["Colonne numeriche"],"Select the numeric column to draw the histogram":[""],"No of Bins":[""],"Select number of bins for the histogram":[""],"Primary Metric":[""],"The primary metric is used to define the arc segment sizes":[""],"Secondary Metric":["Metrica secondaria"],"This secondary metric is used to define the color as a ratio against the primary metric. If the two metrics match, color is mapped level groups":[""],"Hierarchy":["Gerarchia"],"This defines the level of the hierarchy":[""],"Source / Target":["Sorgente / Destinazione"],"Choose a source and a target":["Seleziona una sorgente ed una destinazione"],"Chord Diagram":[""],"Choose a number format":["Seleziona una formato numerico"],"Source":["Sorgente"],"Choose a source":["Seleziona una sorgente"],"Target":["Destinazione"],"Choose a target":["Seleziona una destinazione"],"ISO 3166-2 codes of region/province/department":[""],"It's ISO 3166-2 of your region/province/department in your table. (see documentation for list of ISO 3166-2)":[""],"Country Control":[""],"3 letter code of the country":["Codice a 3 lettere della nazione"],"Metric for color":["Metrica per il colore"],"Metric that defines the color of the country":[""],"Bubble size":["Grandezza della bolla"],"Metric that defines the size of the bubble":["Metrica che definisce la grandezza di una bolla"],"Filter Box":[""],"Filter controls":["Controlli del filtro"],"The controls you want to filter on. Note that only columns checked as \"filterable\" will show up on this list.":[""],"Heatmap Options":[""],"Horizon":[""],"Points":[""],"Labelling":[""],"Visual Tweaks":[""],"Viewport":[""],"Longitude":["Longitudine"],"Column containing longitude data":[""],"Latitude":["Latitudine"],"Column containing latitude data":[""],"Cluster label aggregator":[""],"Aggregate function applied to the list of points in each cluster to produce the cluster label.":[""],"Tooltip":["Suggerimento"],"Show a tooltip when hovering over points and clusters describing the label":[""],"One or many controls to group by. If grouping, latitude and longitude columns must be present.":[""],"Event definition":[""],"Additional meta data":[""],"Column containing entity ids":[""],"e.g., a \"user id\" column":[""],"Column containing event names":[""],"Event count limit":[""],"The maximum number of events to return, equivalent to number of rows":[""],"Meta data":[""],"Select any columns for meta data inspection":[""],"The server could not be reached. You may want to verify your connection and try again.":[""],"An unknown error occurred. (Status: %s )":[""],"Favorites":[""],"Created Content":[""],"Recent Activity":[""],"Security & Access":[""],"No slices":[""],"No dashboards":[""],"Dashboards":["Elenco Dashboard"],"Slices":["Slice"],"No favorite slices yet, go click on stars!":[""],"No favorite dashboards yet, go click on stars!":[""],"Roles":[""],"Databases":[""],"Datasources":[""],"Profile picture provided by Gravatar":[""],"joined":[""],"id:":[""],"Sorry, there appears to be no data":[""],"Select [%s]":[""],"No data was returned.":["Nessun dato restituito."],"List Druid Column":[""],"Show Druid Column":[""],"Add Druid Column":[""],"Edit Druid Column":[""],"Column":["Colonna"],"Type":["Tipo"],"Groupable":["Raggruppabile"],"Filterable":["Filtrabile"],"Count Distinct":["Count Distinct"],"Sum":["Sum"],"Whether this column is exposed in the `Filters` section of the explore view.":["Se questa colonna è esposta nella sezione `Filtri` della vista esplorazione."],"List Druid Metric":[""],"Show Druid Metric":[""],"Add Druid Metric":[""],"Edit Druid Metric":[""],"Whether the access to this metric is restricted to certain roles. Only roles with the permission 'metric access on XXX (the name of this metric)' are allowed to access this metric":["Se l'accesso a questa metrica è limitato a determinati ruoli. Solo i ruoli con l'autorizzazione 'accesso metrico su XXX (il nome di questa metrica)' possono accedervi"],"Verbose Name":["Nome Completo"],"JSON":["JSON"],"Druid Datasource":["Sorgente Dati Druid"],"Warning Message":[""],"List Druid Cluster":[""],"Show Druid Cluster":[""],"Add Druid Cluster":[""],"Edit Druid Cluster":[""],"Cluster":["Cluster"],"Coordinator Host":["Host Coordinatore"],"Coordinator Port":["Porta Coordinatore"],"Coordinator Endpoint":["Endpoint Coordinatore"],"Broker Host":["Host Broker"],"Broker Port":["Porta Broker"],"Broker Endpoint":["Endpoint Broker"],"Druid Clusters":[""],"Sources":[""],"List Druid Datasource":[""],"Show Druid Datasource":[""],"Add Druid Datasource":[""],"Edit Druid Datasource":[""],"The list of slices associated with this table. By altering this datasource, you may change how these associated slices behave. Also note that slices need to point to a datasource, so this form will fail at saving if removing slices from a datasource. If you want to change the datasource for a slice, overwrite the slice from the 'explore view'":["Elenco delle slice associate a questa tabella. Modificando questa origine dati, è possibile modificare le modalità di comportamento delle slice associate. Inoltre, va tenuto presente che le slice devono indicare un'origine dati, pertanto questo modulo non registra le impostazioni qualora si modifica un'origine dati. Se vuoi modificare l'origine dati per una slide, devi sovrascriverla dal 'vista di esplorazione'"],"Timezone offset (in hours) for this datasource":["Timezone offset (in ore) per questa sorgente dati"],"Time expression to use as a predicate when retrieving distinct values to populate the filter component. Only applies when `Enable Filter Select` is on. If you enter `7 days ago`, the distinct list of values in the filter will be populated based on the distinct value over the past week":["Espressione temporale da utilizzare come predicato durante il recupero di valori distinti per popolare la componente del filtro. Viene applicata solo quando è attivata l'opzione \"Abilita selezione filtro\". Se si inserisce `7 giorni fa`, l'elenco distinto di valori nel filtro verrà popolato in base al valore distinto della settimana passata"],"Whether to populate the filter's dropdown in the explore view's filter section with a list of distinct values fetched from the backend on the fly":["Usato per popolare la finestra a cascata dei filtri dall'elenco dei valori distinti prelevati dal backend al volo"],"Redirects to this endpoint when clicking on the datasource from the datasource list":["Rinvia a questo endpoint al clic sulla sorgente dati dall'elenco delle sorgenti dati"],"Associated Slices":["Slice associate"],"Data Source":["Sorgente Dati"],"Owner":["Proprietario"],"Is Hidden":["è nascosto"],"Enable Filter Select":["Abilita il filtro di Select"],"Default Endpoint":["Endpoint predefinito"],"Time Offset":["Offset temporale"],"Cache Timeout":["Cache Timeout"],"Druid Datasources":[""],"Scan New Datasources":[""],"Refresh Druid Metadata":[""],"Datetime column not provided as part table configuration and is required by this type of chart":["la colonna Datetime è necessaria per questo tipo di grafico. Nella configurazione della tabella però non è stata definita"],"Empty query?":[""],"Metric '{}' is not valid":["Metrica '{}' non valida"],"Table [{}] doesn't seem to exist in the specified database, couldn't fetch column information":[""],"List Columns":[""],"Show Column":[""],"Add Column":[""],"Edit Column":[""],"Whether to make this column available as a [Time Granularity] option, column has to be DATETIME or DATETIME-like":["Se rendere disponibile questa colonna come opzione [Time Granularity], la colonna deve essere di tipo DATETIME o simile"],"The data type that was inferred by the database. It may be necessary to input a type manually for expression-defined columns in some cases. In most case users should not need to alter this.":["Il tipo di dato è dedotto dal database. In alcuni casi potrebbe essere necessario inserire manualmente un tipo di colonna definito dall'espressione. Nella maggior parte dei casi gli utenti non hanno bisogno di fare questa modifica."],"Expression":["Espressione"],"Is temporal":["è temporale"],"Datetime Format":["Formato Datetime"],"Database Expression":["Espressione del Database"],"List Metrics":[""],"Show Metric":[""],"Add Metric":[""],"Edit Metric":[""],"SQL Expression":["Espressione SQL"],"D3 Format":[""],"Is Restricted":[""],"List Tables":[""],"Show Table":[""],"Add Table":[""],"Edit Table":[""],"Name of the table that exists in the source database":["Nome delle tabella esistente nella sorgente del database"],"Schema, as used only in some databases like Postgres, Redshift and DB2":["Schema, va utilizzato soltanto in alcuni database come Postgres, Redshift e DB2"],"This fields acts a Superset view, meaning that Superset will run a query against this string as a subquery.":["Questo campo agisce come una vista Superset, il che vuol dire che Superset eseguirà una query su questa stringa come sotto-query."],"Predicate applied when fetching distinct value to populate the filter control component. Supports jinja template syntax. Applies only when `Enable Filter Select` is on.":["Predicato utilizzato quando si fornisce un valore univoco per popolare il componente di controllo del filtro. Supporta la sintassi del template jinja. È utilizzabile solo quando è abilitata l'opzione \"Abilita selezione filtro\"."],"Redirects to this endpoint when clicking on the table from the table list":["Reinvia a questo endpoint al clic sulla tabella dall'elenco delle tabelle"],"Changed By":["Modificato da"],"Database":["Database"],"Last Changed":["Ultima Modifica"],"Schema":["Schema"],"Offset":["Offset"],"Table Name":[""],"Fetch Values Predicate":[""],"Main Datetime Column":[""],"Table [{}] could not be found, please double check your database connection, schema, and table name":[""],"The table was created. As part of this two phase configuration process, you should now click the edit button by the new table to configure it.":["Tabella creata. Come parte di questo processo di configurazione in due fasi, è necessario andare sul pulsante di modifica della nuova tabella per configurarla."],"Tables":[""],"Profile":["Profilo"],"Logout":["Logout"],"Login":["Login"],"Record Count":[""],"No records found":[""],"Import":[""],"No Access!":["Nessun Accesso!"],"You do not have permissions to access the datasource(s): %(name)s.":["Non hai i permessi per accedere alla/e sorgente/i dati: %(name)s."],"Request Permissions":["Richiesta di Permessi"],"Welcome!":[""],"Test Connection":["Testa la Connessione"],"Manage":[""],"Datasource %(name)s already exists":[""],"json isn't valid":[""],"Delete":[""],"Delete all Really?":[""],"This endpoint requires the `all_datasource_access` permission":[""],"The datasource seems to have been deleted":[""],"The access requests seem to have been deleted":[""],"The user seems to have been deleted":[""],"You don't have access to this datasource":[""],"This view requires the database %(name)s or `all_datasource_access` permission":[""],"This endpoint requires the datasource %(name)s, database or `all_datasource_access` permission":[""],"List Databases":[""],"Show Database":[""],"Add Database":[""],"Edit Database":[""],"Expose this DB in SQL Lab":["Esponi questo DB in SQL Lab"],"Allow users to run synchronous queries, this is the default and should work well for queries that can be executed within a web request scope (<~1 minute)":["Permetti agli utenti di eseguire query sincrone, questa è l'impostazione predefinita e dovrebbe funzionare bene per query che possono essere eseguite con una richiesta web (<-1 minuto)"],"Allow users to run queries, against an async backend. This assumes that you have a Celery worker setup as well as a results backend.":["Permetti agli utenti di eseguire query, contro un back-office asincrono. Questo presuppone che si abbia una installazione funzionante di Celery nel backend."],"Allow CREATE TABLE AS option in SQL Lab":["Permetti l'opzione CREATE TABLE AS in SQL Lab"],"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab":["Permetti agli utenti di eseguire dichiarazioni diverse da SELECT (UPDATE, DELETE, CREATE, ...) nel SQL Lab"],"When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema":["Se si abilita l'opzione CREATE TABLE AS in SQL Lab, verrà forzata la creazione della tabella con questo schema"],"All the queries in Sql Lab are going to be executed on behalf of currently authorized user.":[""],"Expose in SQL Lab":["Esponi in SQL Lab"],"Allow CREATE TABLE AS":["Permetti CREATE TABLE AS"],"Allow DML":["Permetti DML"],"CTAS Schema":["Schema CTAS"],"Creator":["Creatore"],"SQLAlchemy URI":["URI SQLAlchemy"],"Extra":["Extra"],"Allow Run Sync":[""],"Allow Run Async":[""],"Impersonate queries to the database":[""],"Import Dashboards":[""],"User":["Utente"],"User Roles":["Ruoli Utente"],"Database URL":["URL del Database"],"Roles to grant":["Ruoli per l'accesso"],"Created On":["Creato il"],"Access requests":[""],"Security":[""],"List Slices":[""],"Show Slice":[""],"Add Slice":[""],"Edit Slice":[""],"These parameters are generated dynamically when clicking the save or overwrite button in the explore view. This JSON object is exposed here for reference and for power users who may want to alter specific parameters.":["Questi parametri sono generati dinamicamente al clic su salva o con il bottone di sovrascrittura nella vista di esplorazione. Questo oggetto JSON è esposto qui per referenza e per utenti esperti che vogliono modificare parametri specifici."],"Duration (in seconds) of the caching timeout for this slice.":["Durata (in secondi) per il timeout della cache per questa slice."],"Last Modified":["Ultima Modifica"],"Owners":["Proprietari"],"Parameters":["Parametri"],"Slice":["Slice"],"List Dashboards":[""],"Show Dashboard":[""],"Add Dashboard":[""],"Edit Dashboard":[""],"This json object describes the positioning of the widgets in the dashboard. It is dynamically generated when adjusting the widgets size and positions by using drag & drop in the dashboard view":["L'oggetto JSON descrive la posizione dei vari widget nella dashboard. È generato automaticamente nel momento in cui se ne cambia la posizione e la dimensione usando la funzione di drag & drop nella vista della dashboard. "],"The css for individual dashboards can be altered here, or in the dashboard view where changes are immediately visible":["Il CSS di ogni singola dashboard può essere modificato qui, oppure nella vista della dashboard dove i cambiamenti sono visibili immediatamente"],"To get a readable URL for your dashboard":["ottenere una URL leggibile per la tua dashboard"],"This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter specific parameters.":["Questo oggetto JSON è generato in maniera dinamica al clic sul pulsante di salvataggio o sovrascrittura nella vista dashboard. Il JSON è esposto qui come riferimento e per gli utenti esperti che vogliono modificare parametri specifici."],"Owners is a list of users who can alter the dashboard.":["Proprietari è una lista di utenti che può alterare la dashboard."],"Dashboard":["Dashboard"],"Slug":["Slug"],"Position JSON":["Posizione del JSON"],"JSON Metadata":["Metadati JSON"],"Underlying Tables":["Tabelle sottostanti"],"Export":[""],"Export dashboards?":[""],"Action":["Azione"],"dttm":["dttm"],"Action Log":[""],"Access was requested":[""],"%(user)s was granted the role %(role)s that gives access to the %(datasource)s":[""],"Role %(r)s was extended to provide the access to the datasource %(ds)s":[""],"You have no permission to approve this request":[""],"Malformed request. slice_id or table_name and db_name arguments are expected":[""],"Slice %(id)s not found":[""],"Table %(t)s wasn't found in the database %(d)s":[""],"Can't find User '%(name)s', please ask your admin to create one.":[""],"Can't find DruidCluster with cluster_name = '%(name)s'":[""],"Query record was not created as expected.":[""],"Template Name":[""],"CSS Templates":[""],"SQL Editor":["Editor SQL"],"SQL Lab":[""],"Query Search":["Ricerca Query"],"Status":[""],"Start Time":[""],"End Time":[""],"Queries":[""],"List Saved Query":[""],"Show Saved Query":[""],"Add Saved Query":[""],"Edit Saved Query":[""],"Pop Tab Link":[""],"Changed on":[""],"Saved Queries":[""]}}} \ No newline at end of file +{"domain":"superset","locale_data":{"superset":{"":{"domain":"superset","plural_forms":"nplurals=1; plural=0","lang":"it"},"Time Column":["Colonna del Tempo"],"second":["secondo"],"minute":["minuto"],"hour":["ora"],"day":["giorno"],"week":["settimana"],"month":["mese"],"quarter":["quartile"],"year":["anno"],"week_start_monday":["settimana_inizio_lunedì"],"week_ending_saturday":["settimana_fine_domenica"],"week_start_sunday":["settimana_inizio_domenica"],"5 minute":["5 minuti"],"half hour":["mezz'ora"],"10 minute":["10 minuti"],"Table Name":[""],"Name of table to be created from csv data.":[""],"CSV File":[""],"Select a CSV file to be uploaded to a database.":[""],"CSV Files Only!":[""],"Delimiter":[""],"Delimiter used by CSV file (for whitespace use \\s+).":[""],"Table Exists":[""],"If table exists do one of the following: Fail (do nothing), Replace (drop and recreate table) or Append (insert data).":[""],"Fail":[""],"Replace":[""],"Append":[""],"Schema":["Schema"],"Specify a schema (if database flavour supports this).":[""],"Header Row":[""],"Row containing the headers to use as column names (0 is first line of data). Leave empty if there is no header row.":[""],"Index Column":[""],"Column to use as the row labels of the dataframe. Leave empty if no index column.":[""],"Mangle Duplicate Columns":[""],"Specify duplicate columns as \"X.0, X.1\".":[""],"Skip Initial Space":[""],"Skip spaces after delimiter.":[""],"Skip Rows":[""],"Number of rows to skip at start of file.":[""],"Rows to Read":[""],"Number of rows of file to read.":[""],"Skip Blank Lines":[""],"Skip blank lines rather than interpreting them as NaN values.":[""],"Parse Dates":[""],"Parse date values.":[""],"Infer Datetime Format":[""],"Use Pandas to interpret the datetime format automatically.":[""],"Decimal Character":[""],"Character to interpret as decimal point.":[""],"Dataframe Index":[""],"Write dataframe index as a column.":[""],"Column Label(s)":[""],"Column label for index column(s). If None is given and Dataframe Index is True, Index Names are used.":[""],"[Superset] Access to the datasource %(name)s was granted":["[Superset] Accesso al datasource $(name) concesso"],"Viz is missing a datasource":["Datasource mancante per la visualizzazione"],"From date cannot be larger than to date":["La data di inizio non può essere dopo la data di fine"],"Table View":["Vista Tabella"],"Pick a granularity in the Time section or uncheck 'Include Time'":["Seleziona una granularità nella sezione tempo e deseleziona 'Includi Tempo'"],"Choose either fields to [Group By] and [Metrics] or [Columns], not both":["Selezionare i campi [Group By] e [Metrica] o [Colonne], non entrambi"],"Time Table View":[""],"Pick at least one metric":["Seleziona almeno una metrica"],"When using 'Group By' you are limited to use a single metric":[""],"Pivot Table":["Vista Pivot"],"Please choose at least one 'Group by' field ":[""],"Please choose at least one metric":["Seleziona almeno una metrica"],"Group By' and 'Columns' can't overlap":[""],"Markup":["Marcatore"],"Separator":["Separatore"],"Word Cloud":["Cloud di Parole"],"Treemap":["Treemap"],"Calendar Heatmap":["Calendario di Intensità"],"Box Plot":["Box Plot"],"Bubble Chart":["Grafico a Bolle"],"Pick a metric for x, y and size":["Seleziona una metrica per x, y e grandezza"],"Bullet Chart":["Grafico a Proiettile"],"Pick a metric to display":["Seleziona una metrica da visualizzare"],"Big Number with Trendline":["Numero Grande con Linea del Trend"],"Pick a metric!":["Seleziona una metrica!"],"Big Number":["Numero Grande"],"Time Series - Line Chart":["Serie Temporali - Grafico Lineare"],"Pick a time granularity for your time series":["Seleziona una granularità per la serie temporale"],"`Since` and `Until` time bounds should be specified when using the `Time Shift` feature.":[""],"Time Series - Dual Axis Line Chart":["Serie Temporali - Grafico Lineare ad Assi Duali"],"Pick a metric for left axis!":["Seleziona una metrica per l'asse sinistro"],"Pick a metric for right axis!":["Seleziona una metrica per l'asse destro"],"Please choose different metrics on left and right axis":["Seleziona metriche differenti per gli assi destro e sinistro"],"Time Series - Bar Chart":["Serie Temporali - Grafico Barre"],"Time Series - Period Pivot":[""],"Time Series - Percent Change":["Serie Temporali - Cambiamento Percentuale"],"Time Series - Stacked":["Serie Temporali - Stacked"],"Distribution - NVD3 - Pie Chart":["Distribuzione - NVD3 - Grafico Torta"],"Histogram":["Istogramma"],"Must have one numeric column specified":["Devi specificare una colonna numerica"],"Distribution - Bar Chart":["Distribuzione - Grafico Barre"],"Can't have overlap between Series and Breakdowns":[""],"Pick at least one field for [Series]":["Seleziona almeno un campo per [Series]"],"Sunburst":["Sunburst"],"Sankey":["Sankey"],"Pick exactly 2 columns as [Source / Target]":["Seleziona esattamente 2 colonne come [Sorgente / Destinazione]"],"There's a loop in your Sankey, please provide a tree. Here's a faulty link: {}":[""],"Directed Force Layout":["Disposizione a Forza Diretta"],"Pick exactly 2 columns to 'Group By'":["Seleziona esattamente 2 colonne per 'Group By'"],"Country Map":["Mappa della Nazione"],"World Map":["Mappa del Mondo"],"Filters":["Filtri"],"Pick at least one filter field":[""],"iFrame":["iFrame"],"Parallel Coordinates":["Coordinate Parallele"],"Heatmap":["Mappa di Intensità"],"Horizon Charts":["Grafici d'orizzonte"],"Mapbox":["Mapbox"],"Must have a [Group By] column to have 'count' as the [Label]":[""],"Choice of [Label] must be present in [Group By]":[""],"Choice of [Point Radius] must be present in [Group By]":[""],"[Longitude] and [Latitude] columns must be present in [Group By]":[""],"Deck.gl - Multiple Layers":[""],"Bad spatial key":[""],"Deck.gl - Scatter plot":[""],"Deck.gl - Screen Grid":[""],"Deck.gl - 3D Grid":[""],"Deck.gl - Paths":[""],"Deck.gl - Polygon":[""],"Deck.gl - 3D HEX":[""],"Deck.gl - GeoJSON":[""],"Deck.gl - Arc":[""],"Event flow":[""],"Time Series - Paired t-test":[""],"Time Series - Nightingale Rose Chart":[""],"Partition Diagram":[""],"Your query was saved":["La tua query è stata salvata"],"Your query could not be saved":["La tua query non può essere salvata"],"Failed at retrieving results from the results backend":["Errore nel recupero dei dati dal backend"],"Unknown error":[""],"Your session timed out, please refresh your page and try again.":["La tua sessione è scaduta, ricarica la pagina e riprova."],"Query was stopped.":["La query è stata fermata."],"Failed at stopping query.":["Errore nel fermare la query."],"Error occurred while fetching table metadata":["Errore nel recupero dei metadati della tabella"],"shared query":["query condivisa"],"The query couldn't be loaded":["La query non può essere caricata"],"An error occurred while creating the data source":["Errore nel creare il datasource"],"Pick a chart type!":["Seleziona un tipo di grafico"],"To use this chart type you need at least one column flagged as a date":["Per usare questo tipo di grafico devi avere almeno una colonna selezionata come data"],"To use this chart type you need at least one dimension":["Per usare questo tipo di grafico devi avere almeno una dimensione"],"To use this chart type you need at least one aggregation function":["Per usare questo tipo di grafico devi avere almeno uan funziona di aggregazione"],"Untitled Query":["Query senza nome"],"Copy of %s":["Copia di %s"],"share query":["condividi query"],"copy URL to clipboard":["copia URL in appunti"],"Raw SQL":[""],"Source SQL":[""],"SQL":[""],"No query history yet...":[""],"It seems you don't have access to any database":[""],"Search Results":["Risultati della ricerca"],"[From]-":[""],"[To]-":[""],"[Query Status]":[""],"Search":["Cerca"],"Open in SQL Editor":["Apri in SQL Editor"],"view results":["visualizza risultati"],"Data preview":[""],"Visualize the data out of this query":[""],"Overwrite text in editor with a query on this table":[""],"Run query in a new tab":[""],"Remove query from log":[""],".CSV":["CSV"],"Visualize":[""],"Table":["Tabella"],"was created":["è stata creata"],"Query in a new tab":["Query in un nuovo tab"],"Fetch data preview":[""],"Track Job":[""],"Loading...":[""],"Run Selected Query":[""],"Run Query":[""],"Run query synchronously":[""],"Run query asynchronously":[""],"Stop":[""],"Undefined":[""],"Label":[""],"Label for your query":[""],"Description":["Descrizione"],"Write a description for your query":[""],"Save":[""],"Cancel":["Annulla"],"Save Query":[""],"Run a query to display results here":[""],"Preview for %s":[""],"Results":[""],"Query History":[""],"Create table as with query results":[""],"new table name":[""],"Error while fetching table list":[""],"Error while fetching schema list":[""],"Error while fetching database list":[""],"Database:":[""],"Select a database":[""],"Select a schema (%s)":[""],"Schema:":[""],"Add a table (%s)":[""],"Type to search ...":[""],"Reset State":[""],"Enter a new title for the tab":[""],"Untitled Query %s":[""],"close tab":[""],"rename tab":[""],"expand tool bar":[""],"hide tool bar":[""],"Copy partition query to clipboard":[""],"latest partition:":[""],"Keys for table":[""],"View keys & indexes (%s)":[""],"Sort columns alphabetically":[""],"Original table column order":[""],"Copy SELECT statement to clipboard":[""],"Remove table preview":[""],"Template Parameters":[""],"Edit template parameters":[""],"Invalid JSON":[""],"%s is not right as a column name, please alias it (as in SELECT count(*) ":[""],"AS my_alias":[""],"using only alphanumeric characters and underscores":[""],"Creating a data source and popping a new tab":[""],"No results available for this query":[""],"Chart Type":[""],"[Chart Type]":[""],"Datasource Name":[""],"datasource name":[""],"Create a new slice":[""],"Choose a datasource":[""],"Choose a visualization type":[""],"Create new slice":[""],"Updating chart was stopped":["L'aggiornamento del grafico è stato fermato"],"An error occurred while rendering the visualization: %s":["Errore nel rendering della visualizzazione: %s"],"visualization queries are set to timeout at ${action.timeout} seconds. ":[""],"Perhaps your data has grown, your database is under unusual load, or you are simply querying a data source that is too large to be processed within the timeout range. If that is the case, we recommend that you summarize your data further.":[""],"Network error.":["Errore di rete."],"Click to see difference":[""],"Altered":[""],"Slice changes":[""],"Select ...":[""],"Loaded data cached":[""],"Loaded from cache":[""],"Click to force-refresh":[""],"Copy to clipboard":[""],"Not successful":[""],"Sorry, your browser does not support copying. Use Ctrl / Cmd + C!":[""],"Copied!":[""],"Title":["Titolo"],"click to edit title":[""],"You don't have the rights to alter this title.":[""],"Click to favorite/unfavorite":[""],"Active Dashboard Filters":[""],"Checkout this dashboard: %s":[""],"Save as":["Salva come"],"Force Refresh":[""],"Force refresh the whole dashboard":[""],"Set autorefresh":[""],"Set the auto-refresh interval for this session":[""],"Save the dashboard":[""],"Edit properties":[""],"Edit the dashboards's properties":[""],"Email":[""],"Email a link to this dashboard":[""],"Add Slices":[""],"Add some slices to this dashboard":[""],"Edit CSS":[""],"Change the style of the dashboard using CSS code":[""],"Load a template":[""],"Load a CSS template":[""],"CSS":["CSS"],"Live CSS Editor":[""],"You have unsaved changes.":[""],"Unsaved changes":[""],"Don't refresh":[""],"10 seconds":[""],"30 seconds":[""],"1 minute":[""],"5 minutes":[""],"Refresh Interval":[""],"Choose the refresh frequency for this dashboard":[""],"This dashboard was saved successfully.":[""],"Sorry, there was an error saving this dashboard: ":[""],"Error":[""],"You must pick a name for the new dashboard":[""],"Save Dashboard":[""],"Overwrite Dashboard [%s]":[""],"Save as:":[""],"[dashboard name]":[""],"Sorry, there was an error fetching slices to this dashboard: ":[""],"Sorry, there was an error adding slices to this dashboard: ":[""],"Name":["Nome"],"Viz":[""],"Datasource":["Sorgente Dati"],"Modified":["Modificato"],"Add a new slice to the dashboard":[""],"Add Slices to Dashboard":[""],"Served from data cached %s . Click to force refresh.":[""],"Force refresh data":[""],"Annotation layers are still loading.":[""],"One ore more annotation layers failed loading.":[""],"Move chart":[""],"Toggle chart description":[""],"Edit chart":[""],"Export CSV":["Esporta CSV"],"Explore chart":["Esplora grafico"],"Remove chart from dashboard":["Rimuovi il grafico dalla dashboard"],"is expected to be a number":[""],"is expected to be an integer":[""],"cannot be empty":["non può essere vuoto"],"description":["descrizione"],"bolt":[""],"Changing this control takes effect instantly":[""],"Error...":["Errore..."],"Query":[""],"Height":["Altezza"],"Width":["Larghezza"],"Export to .json":["Esporta in .json"],"Export to .csv format":["Esporta nel formato .csv"],"%s - untitled":["%s - senza nome"],"Edit slice properties":[""],"Limit reached":[""],"Please enter a slice name":["Inserisci un nome per la slice"],"Please select a dashboard":["Seleziona una dashboard"],"Please enter a dashboard name":["Inserisci un nome per la dashboard"],"Save A Slice":["Salva una slice"],"Overwrite slice %s":["Sovrascrivi la slice %s"],"[slice name]":["[nome slice]"],"Do not add to a dashboard":["Non aggiugere alla dashboard"],"Add slice to existing dashboard":["Aggiungi la slice alla dashboard esistente"],"Add to new dashboard":["Aggiungi ad una nuova dashboard"],"Save & go to dashboard":["Salva e vai alla dashboard"],"Check out this slice: %s":["Guarda questa slice: %s"],"Add Annotation Layer":[""],"`Min` value should be numeric or empty":[""],"`Max` value should be numeric or empty":[""],"Min":["Min"],"Max":["Max"],"Something went wrong while fetching the datasource list":[""],"Select a datasource":["Seleziona un datasource"],"Search / Filter":["Cerca / Filtra"],"Click to point to another datasource":[""],"Edit the datasource's configuration":[""],"Show datasource configuration":[""],"Filter value":["Valore del filtro"],"Select metric":["Seleziona una metrica"],"Select column":["Seleziona una colonna"],"Select operator":["Seleziona operatore"],"Add Filter":["Aggiungi filtro"],"Error while fetching data":["Errore nel recupero dati"],"%s option(s)":[""],"Invalid lat/long configuration.":[""],"Longitude & Latitude columns":[""],"Delimited long & lat single column":[""],"Multiple formats accepted, look the geopy.points Python library for more details":[""],"Reverse lat/long ":[""],"Geohash":[""],"textarea":["textarea"],"Edit":["Modifica"],"in modal":["in modale"],"Select a visualization type":["Seleziona un tipo di visualizzazione"],"A reference to the [Time] configuration, taking granularity into account":[""],"Group by":["Raggruppa per"],"One or many controls to group by":["Uno o più controlli per 'Raggruppa per'"],"For more information about objects are in context in the scope of this function, refer to the":[""]," source code of Superset's sandboxed parser":[""],"This functionality is disabled in your environment for security reasons.":[""],"Visualization Type":["Tipo di Visualizzazione"],"The type of visualization to display":["Il tipo di visualizzazione da mostrare"],"Metrics":["Metriche"],"One or many metrics to display":["Una o più metriche da mostrare"],"Percentage Metrics":[""],"Metrics for which percentage of total are to be displayed":[""],"Y Axis Bounds":["Limite asse Y"],"Bounds for the Y axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.":[""],"Ordering":["Ordina per"],"Fixed Color":[""],"Use this to define a static color for all circles":[""],"Fill Color":[""]," Set the opacity to 0 if you do not want to override the color specified in the GeoJSON":[""],"Stroke Color":[""],"Metric":["Metrica"],"Choose the metric":["Seleziona la metrica"],"Right Axis Metric":["Metrica asse destro"],"Choose a metric for right axis":["Seleziona una metrica per l'asse destro"],"Stacked Style":[""],"Sort X Axis":[""],"Sort Y Axis":[""],"Linear Color Scheme":[""],"Normalize Across":[""],"Color will be rendered based on a ratio of the cell against the sum of across this criteria":[""],"Horizon Color Scale":[""],"Defines how the color are attributed.":[""],"Rendering":[""],"image-rendering CSS attribute of the canvas object that defines how the browser scales up the image":[""],"XScale Interval":[""],"Number of steps to take between ticks when displaying the X scale":[""],"YScale Interval":[""],"Number of steps to take between ticks when displaying the Y scale":[""],"Include Time":[""],"Whether to include the time granularity as defined in the time section":[""],"Auto Zoom":[""],"When checked, the map will zoom to your data after each query":[""],"Show percentage":[""],"Whether to include the percentage in the tooltip":[""],"Stacked Bars":[""],"Show totals":[""],"Display total row/column":["Mostra totali riga/colonna"],"Show Markers":["Mostra marcatori"],"Show data points as circle markers on the lines":[""],"Bar Values":[""],"Show the value on top of the bar":[""],"Sort Bars":[""],"Sort bars by x labels.":[""],"Combine Metrics":[""],"Display metrics side by side within each column, as opposed to each column being displayed side by side for each metric.":[""],"Extra Controls":[""],"Whether to show extra controls or not. Extra controls include things like making mulitBar charts stacked or side by side.":[""],"Reduce X ticks":[""],"Reduces the number of X axis ticks to be rendered. If true, the x axis wont overflow and labels may be missing. If false, a minimum width will be applied to columns and the width may overflow into an horizontal scroll.":[""],"Include Series":[""],"Include series name as an axis":[""],"Color Metric":[""],"A metric to use for color":[""],"Country Name":[""],"The name of country that Superset should display":[""],"Country Field Type":[""],"The country code standard that Superset should expect to find in the [country] column":[""],"Frequency":[""],"The periodicity over which to pivot time. Users can provide\n \"Pandas\" offset alias.\n Click on the info bubble for more details on accepted \"freq\" expressions.":[""],"Dimension":[""],"Select a dimension":[""],"Columns":[""],"One or many controls to pivot as columns":[""],"Columns to display":[""],"Longitude & Latitude":[""],"Point to your spatial columns":[""],"Start Longitude & Latitude":[""],"End Longitude & Latitude":[""],"Longitude":["Longitudine"],"Select the longitude column":[""],"Latitude":["Latitudine"],"Select the latitude column":[""],"GeoJson Column":[""],"Select the geojson column":[""],"Polygon Column":[""],"Select the polygon column. Each row should contain JSON.array(N) of [longitude, latitude] points":[""],"Point Radius Scale":[""],"Stroke Width":[""],"Origin":[""],"Defines the origin where time buckets start, accepts natural dates as in `now`, `sunday` or `1970-01-01`":[""],"Bottom Margin":[""],"Bottom margin, in pixels, allowing for more room for axis labels":[""],"Left Margin":[""],"Left margin, in pixels, allowing for more room for axis labels":[""],"Time Granularity":[""],"The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`, `1 day` or `56 weeks`":[""],"Domain":[""],"The time unit used for the grouping of blocks":[""],"Subdomain":[""],"The time unit for each block. Should be a smaller unit than domain_granularity. Should be larger or equal to Time Grain":[""],"Link Length":[""],"Link length in the force layout":[""],"Charge":[""],"Charge in the force layout":[""],"The time column for the visualization. Note that you can define arbitrary expression that return a DATETIME column in the table. Also note that the filter below is applied against this column or expression":[""],"Time Grain":[""],"The time granularity for the visualization. This applies a date transformation to alter your time column and defines a new time granularity. The options here are defined on a per database engine basis in the Superset source code.":[""],"Resample Rule":[""],"Pandas resample rule":[""],"Resample How":[""],"Pandas resample how":[""],"Resample Fill Method":[""],"Pandas resample fill method":[""],"Since":["Data inizio"],"7 days ago":["7 giorni"],"Until":["Data fine"],"Max Bubble Size":[""],"Whisker/outlier options":[""],"Determines how whiskers and outliers are calculated.":[""],"Ratio":[""],"Target aspect ratio for treemap tiles.":[""],"Number format":[""],"Row limit":[""],"Series limit":[""],"Limits the number of time series that get displayed. A sub query (or an extra phase where sub queries are not supported) is applied to limit the number of time series that get fetched and displayed. This feature is useful when grouping by high cardinality dimension(s).":[""],"Sort By":[""],"Metric used to define the top series":[""],"Sort Descending":[""],"Whether to sort descending or ascending":[""],"Rolling":[""],"Defines a rolling window function to apply, works along with the [Periods] text box":[""],"Multiplier":[""],"Factor to multiply the metric by":[""],"Periods":[""],"Defines the size of the rolling window function, relative to the time granularity selected":[""],"Grid Size":[""],"Defines the grid size in pixels":[""],"Min Periods":[""],"The minimum number of rolling periods required to show a value. For instance if you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so that all data points shown are the total of 7 periods. This will hide the \"ramp up\" taking place over the first 7 periods":[""],"Series":[""],"Defines the grouping of entities. Each series is shown as a specific color on the chart and has a legend toggle":[""],"Entity":[""],"This defines the element to be plotted on the chart":[""],"X Axis":[""],"Metric assigned to the [X] axis":[""],"Y Axis":[""],"Metric assigned to the [Y] axis":[""],"Bubble Size":[""],"URL":[""],"The URL, this control is templated, so you can integrate {{ width }} and/or {{ height }} in your URL string.":[""],"X Axis Label":[""],"Y Axis Label":[""],"Custom WHERE clause":[""],"The text in this box gets included in your query's WHERE clause, as an AND to other criteria. You can include complex expression, parenthesis and anything else supported by the backend it is directed towards.":[""],"Custom HAVING clause":[""],"The text in this box gets included in your query's HAVING clause, as an AND to other criteria. You can include complex expression, parenthesis and anything else supported by the backend it is directed towards.":[""],"Comparison Period Lag":[""],"Based on granularity, number of time periods to compare against":[""],"Comparison suffix":[""],"Suffix to apply after the percentage display":[""],"Table Timestamp Format":[""],"Timestamp Format":[""],"Series Height":[""],"Pixel height of each series":[""],"Page Length":[""],"Rows per page, 0 means no pagination":[""],"X Axis Format":[""],"Y Axis Format":[""],"Right Axis Format":[""],"Date Time Format":[""],"Markup Type":[""],"Pick your favorite markup language":[""],"Rotation":[""],"Rotation to apply to words in the cloud":[""],"Line Style":[""],"Line interpolation as defined by d3.js":[""],"Label Type":[""],"What should be shown on the label?":[""],"Code":[""],"Put your code here":[""],"Aggregation function":[""],"Aggregate function to apply when pivoting and computing the total rows and columns":[""],"Font Size From":[""],"Font size for the smallest value in the list":[""],"Font Size To":[""],"Font size for the biggest value in the list":[""],"Instant Filtering":[""],"Extruded":[""],"Range Filter":[""],"Whether to display the time range interactive selector":[""],"Date Filter":[""],"Whether to include a time filter":[""],"Show SQL Granularity Dropdown":[""],"Check to include SQL Granularity dropdown":[""],"Show SQL Time Column":[""],"Check to include Time Column dropdown":[""],"Show Druid Granularity Dropdown":[""],"Check to include Druid Granularity dropdown":[""],"Show Druid Time Origin":[""],"Check to include Time Origin dropdown":[""],"Data Table":[""],"Whether to display the interactive data table":[""],"Search Box":[""],"Whether to include a client side search box":[""],"Table Filter":[""],"Whether to apply filter when table cell is clicked":[""],"Show Bubbles":[""],"Whether to display bubbles on top of countries":[""],"Legend":[""],"Whether to display the legend (toggles)":[""],"Show Values":[""],"Whether to display the numerical values within the cells":[""],"X bounds":[""],"Whether to display the min and max values of the X axis":[""],"Y bounds":[""],"Whether to display the min and max values of the Y axis":[""],"Rich Tooltip":[""],"The rich tooltip shows a list of all series for that point in time":[""],"Y Log Scale":[""],"Use a log scale for the Y axis":[""],"X Log Scale":[""],"Use a log scale for the X axis":[""],"Log Scale":[""],"Use a log scale":[""],"Donut":[""],"Do you want a donut or a pie?":[""],"Put labels outside":[""],"Put the labels outside the pie?":[""],"Contribution":[""],"Compute the contribution to the total":[""],"Period Ratio":[""],"[integer] Number of period to compare against, this is relative to the granularity selected":[""],"Period Ratio Type":[""],"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` is (new-previous)":[""],"Time Shift":[""],"Overlay a timeseries from a relative time period. Expects relative time delta in natural language (example: 24 hours, 7 days, 56 weeks, 365 days)":[""],"Subheader":[""],"Description text that shows up below your Big Number":[""],"label":[""],"`count` is COUNT(*) if a group by is used. Numerical columns will be aggregated with the aggregator. Non-numerical columns will be used to label points. Leave empty to get a count of points in each cluster.":[""],"Map Style":[""],"Base layer map style":[""],"Clustering Radius":[""],"The radius (in pixels) the algorithm uses to define a cluster. Choose 0 to turn off clustering, but beware that a large number of points (>1000) will cause lag.":[""],"Point Size":[""],"Fixed point radius":[""],"Point Radius":[""],"The radius of individual points (ones that are not in a cluster). Either a numerical column or `Auto`, which scales the point based on the largest cluster":[""],"Point Radius Unit":[""],"The unit of measure for the specified point radius":[""],"Point Unit":[""],"Opacity":[""],"Opacity of all clusters, points, and labels. Between 0 and 1.":[""],"Viewport":[""],"Parameters related to the view and perspective on the map":[""],"Zoom":[""],"Zoom level of the map":[""],"Default latitude":[""],"Latitude of default viewport":[""],"Default longitude":[""],"Longitude of default viewport":[""],"Live render":[""],"Points and clusters will update as viewport is being changed":[""],"RGB Color":[""],"The color for points and clusters in RGB":[""],"Color":[""],"Pick a color":[""],"Ranges":[""],"Ranges to highlight with shading":[""],"Range labels":[""],"Labels for the ranges":[""],"Markers":[""],"List of values to mark with triangles":[""],"Marker labels":[""],"Labels for the markers":[""],"Marker lines":[""],"List of values to mark with lines":[""],"Marker line labels":[""],"Labels for the marker lines":[""],"Slice ID":[""],"The id of the active slice":[""],"Cache Timeout (seconds)":[""],"The number of seconds before expiring the cache":[""],"Order by entity id":[""],"Important! Select this if the table is not already sorted by entity id, else there is no guarantee that all events for each entity are returned.":[""],"Minimum leaf node event count":[""],"Leaf nodes that represent fewer than this number of events will be initially hidden in the visualization":[""],"Color Scheme":[""],"The color scheme for rendering chart":[""],"Significance Level":[""],"Threshold alpha level for determining significance":[""],"p-value precision":[""],"Number of decimal places with which to display p-values":[""],"Lift percent precision":[""],"Number of decimal places with which to display lift values":[""],"Time Series Columns":[""],"Use Area Proportions":[""],"Check if the Rose Chart should use segment area instead of segment radius for proportioning":[""],"Options":["Opzioni"],"Not Time Series":[""],"Ignore time":[""],"Time Series":[""],"Standard time series":[""],"Aggregate Mean":[""],"Mean of values over specified period":[""],"Aggregate Sum":[""],"Sum of values over specified period":[""],"Difference":[""],"Metric change in value from `since` to `until`":[""],"Percent Change":[""],"Metric percent change in value from `since` to `until`":[""],"Factor":[""],"Metric factor change from `since` to `until`":[""],"Advanced Analytics":["Analytics avanzate"],"Use the Advanced Analytics options below":[""],"Settings for time series":[""],"Equal Date Sizes":[""],"Check to force date partitions to have the same height":[""],"Partition Limit":[""],"The maximum number of subdivisions of each group; lower values are pruned first":[""],"Partition Threshold":[""],"Partitions whose height to parent height proportions are below this value are pruned":[""],"Lines column":[""],"The database columns that contains lines information":[""],"Lines encoding":[""],"The encoding format of the lines":[""],"Line width":[""],"The width of the lines":[""],"Reverse Lat & Long":[""],"deck.gl charts":[""],"Pick a set of deck.gl charts to layer on top of one another":[""],"Select charts":[""],"Error while fetching charts":[""],"Javascript data interceptor":[""],"Define a javascript function that receives the data array used in the visualization and is expected to return a modified version of that array. This can be used to alter properties of the data, filter, or enrich the array.":[""],"Javascript data mutator":[""],"Define a function that receives intercepts the data objects and can mutate it":[""],"Javascript tooltip generator":[""],"Define a function that receives the input and outputs the content for a tooltip":[""],"Javascript onClick href":[""],"Define a function that returns a URL to navigate to when user clicks":[""],"Extra data for JS":[""],"List of extra columns made available in Javascript functions":[""],"Stroked":[""],"Whether to display the stroke":[""],"Filled":[""],"Whether to fill the objects":[""],"Time":["Tempo"],"Time related form attributes":["Attributi relativi al tempo"],"Datasource & Chart Type":["Sorgente dati e tipo di grafico"],"This section exposes ways to include snippets of SQL in your query":[""],"Annotations and Layers":[""],"This section contains options that allow for advanced analytical post processing of query results":[""],"Result Filters":[""],"The filters to apply after post-aggregation.Leave the value control empty to filter empty strings or nulls":[""],"Chart Options":["Opzioni del grafico"],"Breakdowns":[""],"Defines how each series is broken down":[""],"Pie Chart":["Grafico a torta"],"Time Series - Periodicity Pivot":[""],"Dual Axis Line Chart":["Grafico lineare a due assi"],"Y Axis 1":["Asse Y 1"],"Y Axis 2":["Asse Y 2"],"Left Axis Metric":["Metrica asse sinistro"],"Choose a metric for left axis":["Seleziona una metrica per l'asse sinistro"],"Left Axis Format":["Formato asse sinistro"],"Axes":["Assi"],"Map":[""],"Deck.gl - Hexagons":[""],"Advanced":[""],"Metric used to control height":[""],"Deck.gl - Grid":[""],"Deck.gl - Screen grid":[""],"Grid":[""],"Weight":[""],"Metric used as a weight for the grid's coloring":[""],"Deck.gl - geoJson":[""],"GeoJson Settings":[""],"Polygon Settings":[""],"Arc":[""],"Point Color":[""],"Categorical Color":[""],"Pick a dimension from which categorical colors are defined":[""],"GROUP BY":["RAGGRUPPA PER"],"Use this section if you want a query that aggregates":[""],"NOT GROUPED BY":["NON RAGGRUPPARE PER"],"Use this section if you want to query atomic rows":[""],"Time Series Table":[""],"Templated link, it's possible to include {{ metric }} or other values coming from the controls.":[""],"Pivot Options":[""],"Bubbles":["Bolle"],"Numeric Column":["Colonne numeriche"],"Select the numeric column to draw the histogram":[""],"No of Bins":[""],"Select number of bins for the histogram":[""],"Primary Metric":[""],"The primary metric is used to define the arc segment sizes":[""],"Secondary Metric":["Metrica secondaria"],"[optional] this secondary metric is used to define the color as a ratio against the primary metric. When omitted, the color is categorical and based on labels":[""],"Hierarchy":["Gerarchia"],"This defines the level of the hierarchy":[""],"Source / Target":["Sorgente / Destinazione"],"Choose a source and a target":["Seleziona una sorgente ed una destinazione"],"Chord Diagram":[""],"Choose a number format":["Seleziona una formato numerico"],"Source":["Sorgente"],"Choose a source":["Seleziona una sorgente"],"Target":["Destinazione"],"Choose a target":["Seleziona una destinazione"],"ISO 3166-2 codes of region/province/department":[""],"It's ISO 3166-2 of your region/province/department in your table. (see documentation for list of ISO 3166-2)":[""],"Country Control":[""],"3 letter code of the country":["Codice a 3 lettere della nazione"],"Metric for color":["Metrica per il colore"],"Metric that defines the color of the country":[""],"Bubble size":["Grandezza della bolla"],"Metric that defines the size of the bubble":["Metrica che definisce la grandezza di una bolla"],"Filter Box":[""],"Filter controls":["Controlli del filtro"],"The controls you want to filter on. Note that only columns checked as \"filterable\" will show up on this list.":[""],"Heatmap Options":[""],"Value bounds":[""],"Value Format":[""],"Horizon":[""],"Points":[""],"Labelling":[""],"Visual Tweaks":[""],"Column containing longitude data":[""],"Column containing latitude data":[""],"Cluster label aggregator":[""],"Aggregate function applied to the list of points in each cluster to produce the cluster label.":[""],"Tooltip":["Suggerimento"],"Show a tooltip when hovering over points and clusters describing the label":[""],"One or many controls to group by. If grouping, latitude and longitude columns must be present.":[""],"Event definition":[""],"Additional meta data":[""],"Column containing entity ids":[""],"e.g., a \"user id\" column":[""],"Column containing event names":[""],"Event count limit":[""],"The maximum number of events to return, equivalent to number of rows":[""],"Meta data":[""],"Select any columns for meta data inspection":[""],"Paired t-test":[""],"Time Series Options":[""],"Favorites":[""],"Created Content":[""],"Recent Activity":[""],"Security & Access":[""],"No slices":[""],"No dashboards":[""],"Dashboards":["Elenco Dashboard"],"Slices":["Slice"],"No favorite charts yet, go click on stars!":[""],"No favorite dashboards yet, go click on stars!":[""],"Charts":["Grafici"],"Roles":["Ruoli"],"Databases":["Basi di dati"],"Datasources":[""],"Profile picture provided by Gravatar":[""],"joined":[""],"id:":[""],"Sorry, there appears to be no data":[""],"Data has no time steps":[""],"Select starting date":["Seleziona data iniziale"],"Select end date":["Seleziona data finale"],"Select [%s]":[""],"Apply":["Applica"],"No data was returned.":["Nessun dato restituito."],"List Druid Column":[""],"Show Druid Column":[""],"Add Druid Column":[""],"Edit Druid Column":[""],"Column":["Colonna"],"Type":["Tipo"],"Groupable":["Raggruppabile"],"Filterable":["Filtrabile"],"Count Distinct":["Count Distinct"],"Sum":["Sum"],"Whether this column is exposed in the `Filters` section of the explore view.":["Se questa colonna è esposta nella sezione `Filtri` della vista esplorazione."],"List Druid Metric":[""],"Show Druid Metric":[""],"Add Druid Metric":[""],"Edit Druid Metric":[""],"Whether the access to this metric is restricted to certain roles. Only roles with the permission 'metric access on XXX (the name of this metric)' are allowed to access this metric":["Se l'accesso a questa metrica è limitato a determinati ruoli. Solo i ruoli con l'autorizzazione 'accesso metrico su XXX (il nome di questa metrica)' possono accedervi"],"Verbose Name":["Nome Completo"],"JSON":["JSON"],"Druid Datasource":["Sorgente Dati Druid"],"Warning Message":[""],"List Druid Cluster":[""],"Show Druid Cluster":[""],"Add Druid Cluster":[""],"Edit Druid Cluster":[""],"Cluster":["Cluster"],"Coordinator Host":["Host Coordinatore"],"Coordinator Port":["Porta Coordinatore"],"Coordinator Endpoint":["Endpoint Coordinatore"],"Broker Host":["Host Broker"],"Broker Port":["Porta Broker"],"Broker Endpoint":["Endpoint Broker"],"Druid Clusters":[""],"Sources":["Sorgenti"],"List Druid Datasource":[""],"Show Druid Datasource":[""],"Add Druid Datasource":[""],"Edit Druid Datasource":[""],"The list of slices associated with this table. By altering this datasource, you may change how these associated slices behave. Also note that slices need to point to a datasource, so this form will fail at saving if removing slices from a datasource. If you want to change the datasource for a slice, overwrite the slice from the 'explore view'":["Elenco delle slice associate a questa tabella. Modificando questa origine dati, è possibile modificare le modalità di comportamento delle slice associate. Inoltre, va tenuto presente che le slice devono indicare un'origine dati, pertanto questo modulo non registra le impostazioni qualora si modifica un'origine dati. Se vuoi modificare l'origine dati per una slide, devi sovrascriverla dal 'vista di esplorazione'"],"Timezone offset (in hours) for this datasource":["Timezone offset (in ore) per questa sorgente dati"],"Time expression to use as a predicate when retrieving distinct values to populate the filter component. Only applies when `Enable Filter Select` is on. If you enter `7 days ago`, the distinct list of values in the filter will be populated based on the distinct value over the past week":["Espressione temporale da utilizzare come predicato durante il recupero di valori distinti per popolare la componente del filtro. Viene applicata solo quando è attivata l'opzione \"Abilita selezione filtro\". Se si inserisce `7 giorni fa`, l'elenco distinto di valori nel filtro verrà popolato in base al valore distinto della settimana passata"],"Whether to populate the filter's dropdown in the explore view's filter section with a list of distinct values fetched from the backend on the fly":["Usato per popolare la finestra a cascata dei filtri dall'elenco dei valori distinti prelevati dal backend al volo"],"Redirects to this endpoint when clicking on the datasource from the datasource list":["Rinvia a questo endpoint al clic sulla sorgente dati dall'elenco delle sorgenti dati"],"Associated Charts":[""],"Data Source":["Sorgente Dati"],"Owner":["Proprietario"],"Is Hidden":["è nascosto"],"Enable Filter Select":["Abilita il filtro di Select"],"Default Endpoint":["Endpoint predefinito"],"Time Offset":["Offset temporale"],"Cache Timeout":["Cache Timeout"],"Druid Datasources":[""],"Scan New Datasources":[""],"Refresh Druid Metadata":[""],"Datetime column not provided as part table configuration and is required by this type of chart":["la colonna Datetime è necessaria per questo tipo di grafico. Nella configurazione della tabella però non è stata definita"],"Empty query?":["Query vuota?"],"Metric '{}' is not valid":["Metrica '{}' non valida"],"Table [{}] doesn't seem to exist in the specified database, couldn't fetch column information":["La tabella [{}] non sembra esistere nel database specificato, non posso recuperare le informazioni sulla colonna "],"List Columns":["Visualizza colonne"],"Show Column":["Mostra colonna"],"Add Column":["Aggiungi colonna"],"Edit Column":["Edita colonna"],"Whether to make this column available as a [Time Granularity] option, column has to be DATETIME or DATETIME-like":["Se rendere disponibile questa colonna come opzione [Time Granularity], la colonna deve essere di tipo DATETIME o simile"],"The data type that was inferred by the database. It may be necessary to input a type manually for expression-defined columns in some cases. In most case users should not need to alter this.":["Il tipo di dato è dedotto dal database. In alcuni casi potrebbe essere necessario inserire manualmente un tipo di colonna definito dall'espressione. Nella maggior parte dei casi gli utenti non hanno bisogno di fare questa modifica."],"Expression":["Espressione"],"Is temporal":["è temporale"],"Datetime Format":["Formato Datetime"],"Database Expression":["Espressione del Database"],"List Metrics":["Lista Metriche"],"Show Metric":["Mostra metrica"],"Add Metric":["Aggiungi metrica"],"Edit Metric":["Modifica metrica"],"SQL Expression":["Espressione SQL"],"D3 Format":["Formato D3"],"Is Restricted":[""],"List Tables":["Visualizza Tabelle"],"Show Table":["Mostra Tabelle"],"Add Table":["Aggiungi Tabella"],"Edit Table":["Modifica Tabella"],"Name of the table that exists in the source database":["Nome delle tabella esistente nella sorgente del database"],"Schema, as used only in some databases like Postgres, Redshift and DB2":["Schema, va utilizzato soltanto in alcuni database come Postgres, Redshift e DB2"],"This fields acts a Superset view, meaning that Superset will run a query against this string as a subquery.":["Questo campo agisce come una vista Superset, il che vuol dire che Superset eseguirà una query su questa stringa come sotto-query."],"Predicate applied when fetching distinct value to populate the filter control component. Supports jinja template syntax. Applies only when `Enable Filter Select` is on.":["Predicato utilizzato quando si fornisce un valore univoco per popolare il componente di controllo del filtro. Supporta la sintassi del template jinja. È utilizzabile solo quando è abilitata l'opzione \"Abilita selezione filtro\"."],"Redirects to this endpoint when clicking on the table from the table list":["Reinvia a questo endpoint al clic sulla tabella dall'elenco delle tabelle"],"Changed By":["Modificato da"],"Database":["Database"],"Last Changed":["Ultima Modifica"],"Offset":["Offset"],"Fetch Values Predicate":[""],"Main Datetime Column":[""],"Table [{}] could not be found, please double check your database connection, schema, and table name":[""],"The table was created. As part of this two phase configuration process, you should now click the edit button by the new table to configure it.":["Tabella creata. Come parte di questo processo di configurazione in due fasi, è necessario andare sul pulsante di modifica della nuova tabella per configurarla."],"Refresh Metadata":[""],"Refresh column metadata":[""],"Metadata refreshed for the following table(s): %(tables)s":[""],"Tables":["Tabelle"],"Profile":["Profilo"],"Logout":["Logout"],"Login":["Login"],"Record Count":[""],"No records found":["Nessun record trovato"],"Import":["Importa"],"No Access!":["Nessun Accesso!"],"You do not have permissions to access the datasource(s): %(name)s.":["Non hai i permessi per accedere alla/e sorgente/i dati: %(name)s."],"Request Permissions":["Richiesta di Permessi"],"Test Connection":["Testa la Connessione"],"Annotation Layers":[""],"Manage":["Gestisci"],"Annotations":[""],"Datasource %(name)s already exists":[""],"json isn't valid":["json non è valido"],"Export to YAML":["Esporta in YAML"],"Export to YAML?":["Esporta in YAML?"],"Delete":["Cancella"],"Delete all Really?":[""],"This endpoint requires the `all_datasource_access` permission":[""],"The datasource seems to have been deleted":[""],"The access requests seem to have been deleted":[""],"The user seems to have been deleted":[""],"You don't have access to this datasource. (Gain access)":[""],"You don't have access to this datasource":[""],"This view requires the database %(name)s or `all_datasource_access` permission":[""],"This endpoint requires the datasource %(name)s, database or `all_datasource_access` permission":[""],"List Databases":["Visualizza i database"],"Show Database":["Mostra database"],"Add Database":["Aggiungi Database"],"Edit Database":["Mostra database"],"Expose this DB in SQL Lab":["Esponi questo DB in SQL Lab"],"Allow users to run synchronous queries, this is the default and should work well for queries that can be executed within a web request scope (<~1 minute)":["Permetti agli utenti di eseguire query sincrone, questa è l'impostazione predefinita e dovrebbe funzionare bene per query che possono essere eseguite con una richiesta web (<-1 minuto)"],"Allow users to run queries, against an async backend. This assumes that you have a Celery worker setup as well as a results backend.":["Permetti agli utenti di eseguire query, contro un back-office asincrono. Questo presuppone che si abbia una installazione funzionante di Celery nel backend."],"Allow CREATE TABLE AS option in SQL Lab":["Permetti l'opzione CREATE TABLE AS in SQL Lab"],"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab":["Permetti agli utenti di eseguire dichiarazioni diverse da SELECT (UPDATE, DELETE, CREATE, ...) nel SQL Lab"],"When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema":["Se si abilita l'opzione CREATE TABLE AS in SQL Lab, verrà forzata la creazione della tabella con questo schema"],"If Presto, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.
If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.":[""],"Expose in SQL Lab":["Esponi in SQL Lab"],"Allow CREATE TABLE AS":["Permetti CREATE TABLE AS"],"Allow DML":["Permetti DML"],"CTAS Schema":["Schema CTAS"],"Creator":["Creatore"],"SQLAlchemy URI":["URI SQLAlchemy"],"Extra":["Extra"],"Allow Run Sync":[""],"Allow Run Async":[""],"Impersonate the logged on user":[""],"Import Dashboards":["Importa dashboard"],"CSV to Database configuration":[""],"CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"":[""],"User":["Utente"],"User Roles":["Ruoli Utente"],"Database URL":["URL del Database"],"Roles to grant":["Ruoli per l'accesso"],"Created On":["Creato il"],"Access requests":[""],"Security":["Sicurezza"],"List Charts":["Visualizza grafici"],"Show Chart":["Mostra grafico"],"Add Chart":["Aggiungi grafico"],"Edit Chart":["Modifica grafico"],"These parameters are generated dynamically when clicking the save or overwrite button in the explore view. This JSON object is exposed here for reference and for power users who may want to alter specific parameters.":["Questi parametri sono generati dinamicamente al clic su salva o con il bottone di sovrascrittura nella vista di esplorazione. Questo oggetto JSON è esposto qui per referenza e per utenti esperti che vogliono modificare parametri specifici."],"Duration (in seconds) of the caching timeout for this slice.":["Durata (in secondi) per il timeout della cache per questa slice."],"Last Modified":["Ultima Modifica"],"Owners":["Proprietari"],"Parameters":["Parametri"],"Chart":[""],"List Dashboards":[""],"Show Dashboard":[""],"Add Dashboard":[""],"Edit Dashboard":[""],"This json object describes the positioning of the widgets in the dashboard. It is dynamically generated when adjusting the widgets size and positions by using drag & drop in the dashboard view":["L'oggetto JSON descrive la posizione dei vari widget nella dashboard. È generato automaticamente nel momento in cui se ne cambia la posizione e la dimensione usando la funzione di drag & drop nella vista della dashboard. "],"The css for individual dashboards can be altered here, or in the dashboard view where changes are immediately visible":["Il CSS di ogni singola dashboard può essere modificato qui, oppure nella vista della dashboard dove i cambiamenti sono visibili immediatamente"],"To get a readable URL for your dashboard":["ottenere una URL leggibile per la tua dashboard"],"This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter specific parameters.":["Questo oggetto JSON è generato in maniera dinamica al clic sul pulsante di salvataggio o sovrascrittura nella vista dashboard. Il JSON è esposto qui come riferimento e per gli utenti esperti che vogliono modificare parametri specifici."],"Owners is a list of users who can alter the dashboard.":["Proprietari è una lista di utenti che può alterare la dashboard."],"Dashboard":["Dashboard"],"Slug":["Slug"],"Position JSON":["Posizione del JSON"],"JSON Metadata":["Metadati JSON"],"Underlying Tables":["Tabelle sottostanti"],"Export":[""],"Export dashboards?":[""],"Action":["Azione"],"dttm":["dttm"],"Action Log":[""],"Access was requested":[""],"%(user)s was granted the role %(role)s that gives access to the %(datasource)s":[""],"Role %(r)s was extended to provide the access to the datasource %(ds)s":[""],"You have no permission to approve this request":[""],"You don't have the rights to ":[""],"alter this ":[""],"chart":[""],"create a ":[""],"dashboard":[""],"Malformed request. slice_id or table_name and db_name arguments are expected":[""],"Slice %(id)s not found":[""],"Table %(t)s wasn't found in the database %(d)s":[""],"Can't find User '%(name)s', please ask your admin to create one.":[""],"Can't find DruidCluster with cluster_name = '%(name)s'":[""],"Query record was not created as expected.":[""],"Template Name":[""],"CSS Templates":["Template CSS"],"SQL Editor":["Editor SQL"],"SQL Lab":[""],"Query Search":["Ricerca Query"],"Upload a CSV":[""],"Status":[""],"Start Time":[""],"End Time":[""],"Queries":[""],"List Saved Query":["Visualizza query salvate"],"Show Saved Query":["Mostra query salvate"],"Add Saved Query":["Aggiungi query salvata"],"Edit Saved Query":["Modifica query salvata"],"Pop Tab Link":[""],"Changed on":["Cambiato il"],"Saved Queries":["Query salvate"]}}} \ No newline at end of file diff --git a/superset/translations/it/LC_MESSAGES/messages.mo b/superset/translations/it/LC_MESSAGES/messages.mo index 35dd479ee8c54a31e89223c5e18c1b7a8b32f2ca..7671736b845bb48358bfca5f5991f0f4efe28ef6 100644 GIT binary patch delta 35026 zcmeI42bh#aw!gn2XCzAIV_?V(IS5G383sf|kY=W5rlF^M=c1~Gt& zan|grth%}?V#chi;HqoFHK+Z*zp5G-T=u!{UU&EI{a>F)->T{gr%s(Z6}}qp_`33` z>#L^UXjtU}kAIp}@w`^>VPCNW|3pW6-dv(Zup4{?PJ{bkT{vQt=S_suU>$f7q$=+k zSOZ=UYr-;E3;qVGoyTlE?d>I?jGsbf{Ko#^RUYkm&57586JTdp8!m(O;cD0zo(-$P zEl>?y2b;lPyWe+0)%&*l{X;0hzk+qVwC7bF<9Q88Xb2C39iS@i@8Xl7DxU9{4<*1d z7e5IePJA6yLsvr|-UL3%p5 zYRoT#>iHdT1bi4i3ad`Cn%W6f(Th+O{{c$CeU3js8Dq`KHod81CRB&Bp?)7Q8U0K0 z(IlwB@vsJ*16A=tI0(jIYq%BGhL1qye+Fvo--H_LuiyY!V~Q1gIFx4BKxyn&C=K1^ z(jQL~s71nej@70z48$A2&Ttr1!2;L<#-LPwCaeq3g(`nJRK9I+KD-%f7Sv|0N}vv~ z8=Mcjz|&zCOyBAPyJ1Tbet zSO=crcmb3qwm@m-M<_w7GKJJ$6WChwzYl@7B+P(5EQVot9;A%-6_fxIbL{k-2~|-Z z)bvZi25>EuN-u*FH24Ao#7 zHiYNG+Heb0LpQnfd!ZV73TDDLp~_X7W9x4SWm~PG(I`weCSewVMz8?ZgvUFc3MJUN zPz_$<;@3hA)vZthJO(vuUVy6S4VV5IRDFMOta+3bs1a1X?TC*cumK=ePq()n7v8&sbnP zRvWG)o^D5=8G%b2%b)~$5=uoM!q%`F`j#Lapj6upYT6wErP|?8s-Fg>k>j9jYZ)90 zPlKAS4?)?=V-Ug8-ZKOw`D;)Wy$996S5RYB^*CE$GpHfy>f$4y%FTjmcp+3zIzEU`Ln*dqEXE%B3F%)x!vs;3=q{odDJ2bx`F4$IGGeZG~$0<}?Ah%==+Bd=~c4 zV4miC-g4pt3#=w?f^CT316A?MP($?=Tn|5ks_<8ZRzn-0@^5nS`=M;)38->^aOvqk z6KG3<7qOE1P{!63Y6u2F2{r~sVG>F+Z$ahT3uWbhhKIxYODsFVR>X%x33e>33YWrK za2aHFrM(jf)Fk0NsERIya=~{(N&FPlnD2pVa38Dz{{q!OjiuIOW!|x0TnNR8lnW0Ag4j~D1d5U3zPsX?Pz{cP8uK~ObO=i0325g32?V5?lid$zLV3ObO2yltJl-QN{T(=k_}5V7 z#ui%-IR#cG9)@Zl0`+?m)`hE}1Udt%qn8$=|LO#`xs10!_4rPxiXMXX;iIqv+znOn z_wWcc5v9M`~X;+tW2xCLFf)v1h za09FdABC#$MJQGN0cv)90+qjNiS21GsC>skO~)lrJw6$>hXIrZ?{w+u9R#G}XQ3K; z8>)eQa4`G}90&*FjilNH>x}AE3$)Utx!28uW?Jfvn`-a;S1IKslx#Aw!e) zTCcRKodS>KhuN?p+~Cr$aq%0WRQn*5QT-muUpx&rzz<TcF1NH7J4KgAL$!P#Ud!ysf7- zoK3tpl!i`&%6|d;nD)JG1T-Bso?t7u8p_!2fXaA3)bG#0!SD?@0ybZ5r{^(H#$kOHdmA<4H)Qo_<1t1ZaG+RbeNn_;{#{ z$3Pj;Vkiw1LN&A;D&MbQ7kHtIKM19<=b-Yv?)U*z2fl(n{4q^H6}SDBZ72)MczQq; zJQC)>NpK>(0;(tP!B^l{uqk}@6sv*v9lwQ#lV1B&J4Eea6XL_6jCu}~faxU!)WZ~% z)t}%ptcMcd8mJ!M1~ujnLJ9CBRJm87H1H18(0vJ2uEuFL-o&vJ97p;Quqs>wsVD87 zMnDx^05!iahn?WHFbSW6l62JRcBrO6HLwgS{X{4M&VcRVrBKHF0F-84g3`n%urjQE zhPAEQu%70BQv%ibA_b7CNQn}-kX3VUEsJBN{~_)KNEH$zR{&W09Da0sCm5ywtzoE z`Ge+XSwZ^4Ma09fCj1?g2A+m$Z}(Yl{_iEB9|@m9HQZ^PUCjnUjb%QR>eH|mTnB5z zjZhl83K}DY>gj_}8hQ@O>i5F7@H>~@@@zY#J!t>>McTzY?n6t!ekeT~I1|0v-upfURJo zbFHMkpvHbYtP5vAsd6Edk%r+wxCCaxEl@uH5vcky)-%j-I2;L=LA94IBOvSj4Xh6z zfs*(I$3H+>|3^?`Tjf04un(2L6O?8KLe(=0_J@;TXSfDR!`DFxeg~9hABNaW+IyLR zD)=0#M}L9pQMC=WU~R`{Pz_{3N#4V8AnZ))3%I8t-V!c=X($0-ciaOz68{ra&l;X@r<)ItBi;{6L+8UNyc+g^ z4KA>n84f$pzE?<~2%Zh+!0%uQoOvO`0w0C_;Hew!B6AP)iSL0+VAYH4^ecu(XW$3m z82x^+y^QK|2^}N76!s#0{iW7ucfj;E67~@o3@^FN8r=(UGx5(LWxU{W#ua8?fd#{5 z@EPcBVlIPc;ZAtfW~L@wb|q5|{s>pVJzH$gkG;ye@U^fH={H}+_-m}*CPAvNcD4Pu z)Ed4-JPMzHW3REQZg8#L(+z@hNKq*3J|8ZG&%&j!_g4GO=yLcV@poYeZl$;CNX_eP zJ5#Ph|B~cV5~{$bpsfEnD4Tc_9tJ;f>EAh4zuqn?ji9DmH`okLgB@T2)NEM?HI28y z7Vr_+7QO|WKrelRHJYZ5U10;#hrwEK29y!ahpidIrBD@~x!nqOEtFN?31#K)LQT65 z;YirzM)SSNn+pdJzZ^=?=V5i2{)j+L0$;d{R_0gr_eJPaGszLzARo}C6YcI%;fd^^+_-VN)+7hpBG z7i!EugiB!kTdfhUfB_ z{Ms%mbD_qr1WKUoup4{~`tWnu3pTmkZY;*ZV&Z4R^WcxL6t2I+&YD_xTI1~l&G~;4 z0b^`XnwSsO!?5ESP(8l^N_DqEsro@!8}5Ws?aNS_dK)VLXD+~S^=6s zx$ZVl=`-PYxDYD;wNM?o4QlM~gc9UQ$2VXV&HqmcY{a#G0q1&5o8Q{$wHHn!-rymt zszq=j@nWb3?}3%!qfi=o0!ow5Lv`Q{=)?D2yw<}`aHxE36sLW!GlAx?H82A+f(%iZqxPoY#_^%2XaP(#`Ys^|S3$GhL>LG%4@iAzXBHMriz zH^ZjHZ-r{`F?cw9&i(!;=oA0m#asW*PP=T_j`Vr3Ej%8o1D8T+>K51#-u*lDFDreL z1WEcTTnOKXv*3hBT|uax-U55T-$M<-S5N|1dCXdSW4MHPdw3Z<2QuZoZojv-wHHdD zk6<>e`#AcSYKA^;eg8Bl)hD5Po`%)ng|Irj99D+cK$W`=YAo-CRp28~0zD3E!B?Pq zz84OM-$HeC@Do-;6Ve2fump~PDo=#luf(|yTUJ_1a0@Mt#BwDL;Pqcm0u2f!rP#F{x+1S{1mF5y3b*AwC{BwpdL(w z>RAX%#Sz#5o(yGN=R;}aVps=ma@-E3iMyf7H+kL;X=|tkdq558B-j=fLLZ(1_5I1a zj=)S<{{<%iY)Cu;>%$XZ6Sxjape;};{WX*zufQhok5Iq=09C&Ji?+T@m`S`V)Ywmj z#y`A>{#D?366(RTp&Gmls)FsX5qtouq32xsTktUAe}<~K%5Gb(6V!AZ2r({iB$SoM zU}Lxfs=jqlwzPRS`d5J)NKl2hLygt%T!!aiQ{rzz3GgLUg_U2jLsSQTYcO_jWCc{)_Si=i60-lg9K zrOC&kH25-X4nKqvsM;&Gd{d~7r8^VQ*bR4_<1#FTQrT*#hBmnLtKd}Px5MeM@~hVB zbKo1qFM>I6#cOs4^aPZxdNyG4r+sfd0rhw@RE1?w zL-L4=zY0~sM^Iz-ql-6r+xEC4)Y$fhDmM}~gL9z|i(z|s9#ltehi%}!FfD6+g+NRA zN2r38-?2St1?4!hpfoZXN{~rV70rj)Fa%Y8JyiMaFcUrkefS=13v2GNL(>JSqkZ?F ze^oe^1kJ~zpn4L5YH%6USg(ZA&?!(2Y=kOz3sn9cF8&NOLjonx=TPMj+iL}G1*Q5- zsC>QmqJJ6PXcE-m6zIboSOunFXIKhlBU_-1>j9{t_&t4vYFpP9y+AGeFT=1(CGuKi7TM2^LnU?e-EX)XW)AH4pdK4f3h0- z6;%H9E`BrAEVvJ<+_Nry50nw^gSBCU57j}&zcm4=x*L>agJ2XEKxyWAC>6d8%`Ab3 z6R-S{WlJdA=nEy-3|JK&2W!DFlqW5Q($J|;^_&Zv(!O^C0ZIH@D3!kC_#RXRUqdxe z`D5cUJs&FnnU0&FdUQJ+26w<}(EG$1X?0kaXd5vDJA$fr@TZJ_M*?FBC?N_pRx4l~ zcowV&FM?`dE0hY$pp5l7$9G|U;@?0CR&$^Iy)D!b^npqrcp*nOPl*%uI8j@?FG_xJ5p0dx- zzsBYP5~Skip*-F`sPy`Ows$xkU=8BSpafn8E5iV)fsIfVUkRn^ZLlG{14@&>hcf0D zq4K{0CBS=W0;=e9C>4GUJHQ&B+l)Qn5yS^VRj>@o_)4LM;ylM&VK(t+V0Y+!VO8D( z$`6c&N?!$g!mWR;N1v!Hr9398{7C;`uglK4ER{Fg(i_+H1~!5PG#aq-Nr z>`?ZA8p0*85nK;7tFDG!87c2N0)t3+9!djszqV`*rOF=ga5w}~z{`Q^>4{JR+~|J4 z3pOGCG;9ywg;I5`Z>+~_3{`&?l=1b4X8w;MFqni{a3DMzO0|!`&Tuar3G01pIRnbb zHb9N})lm6vfD7UCF5dS$ThFmj0-pdigg3w=VHs?Q{dxP`4^_UmMpFl>XKkSx=n7lH z-f#n)3Y)>VpfvLh>3~#xEXeVAHh!W@Qe&&3&Wu?F4&ax^>7H>3VXwMU`N=bQifS0hC;P7 z9}a^nE2T5c*xX5ib}a8g^{8g$45O;%P(AMirLw+I(`Y(WMJK?a@M5U)FTytP8>pda zR>hX@1=X>kP#T;FrNLv<1T@w$$5Pmu_$g3hzXhs+>!4KnE<6l=0aanOs#zl^UOmH1 zvrH&~x;q{L)q!!)hf|^IjX|}Of@qree*{!;9hC803@5^mp?Wf?MuvImFdk}*GizE6 z9N{<#O4akBh9C(g=!H;5y&cLA?0{nRWpne|!~*9`j#;I`u6xVJG5)pvH0$RK+RS9Ik`X(6vzhUW_RMg*bjAIT|!NpKLO+abjRH%+@gqqhky7Zk; zv*t}Gzwsqhz1169Ka*}sK&tBJI1wttLMT-i!AY{$EBwuJjcsNxyJEo8nk*8c+h1L5=O>P=dS*Wdol;8DVw4 zr7OK5>_4=#gqn%RmT zg{oi|>U%@$WUkm2{xdg_y z%<$fWyP>AXgRSf$^9A&Yx8>9K5;y`%l{di68C=uBF~kenT1T@TqAc%w*o*W=?X1y` zf!m0u;9%G~Gs9~KkIrQNZziycgiBz{_8Df&bO%)WH}DyFNrw#c(jl6aVO}~M*)hYs zbg13QF1r`O734dyv+enpP#WvdCBuBAnhZ5mCqk)y3!Db;P80Z)K#i^$>~3ffs^A~H zWtcr(z3$c_je@f7C2%3!22Y07dt{hzMr+|4#Giv9cw4sZNaLQip}DXR>DNNdrkA1o zM*2+xGKzgr^YnYiy1ndtZUf~|xa=1vRFZLE{Nw7vir&4N>*pwp=EZ=Ntv) zQIB;jh6s@MP9Y!xE`*wwSHiiB;jK^=*X(Nr%Ywa$4}h9Jg-`;;;dHnO&W4}Bk#I~u z>rqdGGU828vuQijEV%=k?|=6bkjHumYFfPrmGKoQiT6NR{nt~t zP3cy+mG~Yw6|OtN8rdsQ4yf*6I~#_=PQ;f$x$X^)j}K=447;fvS2USmtGyzrA z9?EL_LfJwIoB*$Yt>GV`R9ba}Wk0BCl?yd=tD(kp8&v+C@Cf)PSOsQ{wEKguP=btr zng!{p1V#{;1M9&Hp^WbuC`Yjy%F17d^Wn$v3OH$$t>}H&k@%O6tw(2=mkwj#Q>0%G zkAcxKw&#yR3G^If!;sLhC84d&KhSuT2H8r$|R`#1yFt? z2GxO+p!~q;?)QtK1lbHF;5F{|UqcD5IUZoc!^8Kc}QPoJfXKosxbs6w6y2UrCwb5J?Fyt8)qHlJr*uEBahsCo73GsYpE5 zIoYLbaNiyoEk?!=BcvpMN~n|)BlGh7(S@NzDp=faQ&7AAsz%9pQP@vLBe~(EL`@Y& zlEL!+M+VpTZ_{vUI27|n78E4H1))?JQHp}!^napk&wv**szp=bL^vx-Xgpal?9&S?4avpD;aHv!E%inwa=nqsWIQ)QV@^!6lpxhH z@pzFpa%DK_jSA(VJGvB#`b)#5#1sBep=jCNN3^Mw&N<2-7m0?w(Jqkmr^lkD?MytM zAN5N2Ph=fp5Is2^6GzG~traUz_9?Opulq8Hwz0tEr z=J+|eh2f%*H#(GC7`!`VPa4?^;)zHu@{QI=d#F2BV23`LDy1<7RfdxnN)|4ThZ1>y zNfLeeqjPf1pt}Nj{;1OZ!FbFDl}{r?##ky5k0Sn3#x0zmAI?o7e=?Pg$)QV)aVVD| zQXeBR0>udoHk9=9u)89JD~^+#9lSBL^M)f^Ey5y_6bk1ql?h9{S#h*rOvO(Y#!I3S zlOYZl6ooNrhC5{13o{;cs60Kv*q0>zd@Q^;5igD>WP3;*G(WO!TC(s9#*Lc8GU8N3 zzZ=6V3@vv`3Sp3i;YdMY%1LCpkQ*&wLX1h2MDqOciBPO08cIY`rG6gGI3lOok&|l-f!yO7z`l0AnNz<`;KAcBY6j>Oc;A~g#>w< z0|m;xZ-tbD%TEZe3>9Fi70RTimPAvLVrI1QtrdTo5lR&v6pu$sDP5s(PHrfr>4_^! z9h961GmbwIJ}1|t791>6^#YcRWIPr$7&9b|@#UAqa*eA`6^2rNBAgq>CX#mc=Z1?@ zc4+0{{P^M}I1J1HSDYJ)`9&qH64;SM$&X-Bf3r4OM_^aE zGWgxZiB*kgWo;)l&S;S^JFa;nr%v(4uG9jgp;B~skUe?o_^~Tf3G1hgolc^|q)>I9 zH;x69_1Z$EitPMmYln5yFGdj^lOYlfR!u&mUik_?j%^QHp&ut7*@|&w=VI3VaVBh* zS>G&+!JsLt3b8a?ZzRU>;KpQWp~cLi12fY6YUk2QE$OE5WG?!)_JswPTYh)!mz6`J zBB6(8WT0n-^Aq7@VQ|xwLDj>{O2V<+(%_vbeFs=y;TAbh{tnlnU2F>DN-6;_T<96k zqyHG~dO?%E9b1o2#7m0Ra}zKIF@bfTmS@FR1f8ayTRY#ML8Ga7cRv*DxVTZJnNxyG z2ee7M)g-qh!Scqo1e-1>KtVKYX7`FhDLI+)&Ek(m6-AO}_R*t6iRpS#_Rz(Np2Jw_ zCg9D?94;h~jdNhC_Q?*%Bu{o;d?cQZ$!(%}-Tf7eNxHleA3Y>ALlH;?+3fnE+}wCc zEY;m#jP@f%+GNLLvMLSs-;{WHB;+5|J~LruX}0N&n-rzl9@1)GnP!n(8A;+FIS*)^ zb`Byx9*xFVp!UJOY{~Czj|+vQbm`6jGMNytv$hzf!?<$0aGK3(7r7L>arQg2Y8&j+kmc{mm>x2dBqlqqPM1 zg_wH9{BC*i3&OE5+i?m_4wu@Er_qvUHc{S`VE(TYW!+}@8SU~@K7*XA6^gxZZbXLW zO_8%@8im-!2jAY_e_pmf(odEwHWpLrch*uCV-)2yikTo`txc%7Jc}_Z;yUdmON!-h z!g*a}i6PE3T2L@$6#myDXA$a zxub7Y`SN6N?2h?po*9F^ zm1uEgx>q}Pd0W|HiZ43^F= zoXrBFLmFK*&H4F>c#*$|bvHM>NJF>?R}qOWQY%^o^377=yHbB6bMVCM<~_?z?q@a- zyf!;L5-%08=mf!1jER+>2kp5j`10=VL(ruW)=mnx0=b3d z6Cgxa<%_r*U=fzbh-+iB-y(z1oU!xV-qtQuNR+Ed8^*Op<8jt(^veFTxHQ|Wa7lkg zX{r#v9*rzcgc7AjZnM5n#_Y4dEFlS7#6(P|LBM71cET(t?hWz zN{SX^J#_hJ6)o=ZSLHYmnf;yiR(;eAE`!6m{n)bR{I2juKRun4sX6W+Bxca0EGjAwn=2^Cq z?6KS*6A2a2NQD&RE^Rz*HZQaB%Ulmc^A2QUKnislwx%duanP67bqNRV1u!b~!0DFL zrr7}6xu?WpmVdTnGn~U7ZKh{=ROUOisxj`M-TW27#`*V-FcZU@p``+cQ0^A(JhrwW zH&cEyV{+T(^UTpAFPL=fll{16b4IdM=Sb!(PEtKEV`Fs4lFXoLF%RMMSqsYQEvTPS zeY&}KO9o9Bj%m=Te81F*!4GqB5)50|DmZ=Ng;jBK@kDUm!!4^?pLxZ@&9d!2Yld!P z{5dgBU^YmjTqMflu}fr@A~C1_WN^#F<6E1vWck89!yYa7@8rr#kNdiEN8C^X&=_%N2l48w%lyLy;&}4{{kO$%zGj&XA_F(TF2N_ zq1g)>J>ibD$Fjn5q|;SHXKqC?>qvrq9@~B6c_b9~7eBd3kUGu!$6bJ}R2LE19=lAt zhANcwgI$letE~V!nnl~e$B!otpT%}jyS!3ASsKeNOvGdHl4P_rSQoyao{{pv;i6Uk z8^KpkHt)FqtVBIJ)>XI_v}=kk0~ zuyAmH!L)^D>PtCF@p8gZ-OXw8;V+kH({0sL@fY-Kk2;6=Y5y_E{uVTQs_(-6RTjI^ zx4&ikW7)`<+Z%Uh=Z4B`*Rsvov-31Ikoo?6?bl43ICR(g0(&W#4Eh!3rgdA$)vH@g z5!UuWX+2yb%O$%)Caqhg80KWyY~YpMoGa`vOh@gz*(`ZEg$(AXlErK+T!gvJvC^cE zHb!p3!DCMycVxwTzA@$3awey}2eb>EEo)QEN@1_)f@TrF`%kU_53WQPgrJ783g?s@S1ND+_Rrcck|zDkqqBQ;_m9r*otYiH_DtJuu{_<8n^Q@-4Vks|5IfA^ zsiiG^?!}jy{Um3C92=RdJ+X`A1@)et(5^^xz^-_Q-dP6SqGPL$)#YkgH9-!?S8apLARGtXF0vgl^nF)?4bRo7VGjYtDnhoxGYmQf9zIt?n`Eu z9hZ77qinPB^XdsPZ$9J#^vb*ksC2n2&d6nGVO6 zM_6;rw-FsXl3}h8qyYAbxcp>rb^3|mFKa&PUA|wUUz{iXsN92*o_(_JKg_C{tl&X{ z4^A2zv_Cnw{xp3N!B#kI>EldLeDd_}?2kAF`7@+f&$u$POHOhHZhx|)V15s7Il1*T zAE7QS36yo;i7UrRGaxe17ry!pVf26HD@KfJP=JWygZS{B^PWiFwJMVWKebeg1KgOUu2G4i{_Yn0=rz9ac56tKcBM2 zJn+$ZcY}^wuJX_L);F8IG+& zUA&kG-nwA&!S5~RU6`FQ@xYS@`%O@fCn6sVga&RepUC%A)7D7qZ)5M=bvs$c#KzL`lI3bOn63r@eNo6mEPLp<&lSNqX?O4)H3aFW%T(;{TnmLV~TE+i{hL(MD+HpZ752 zcbnV%uYDNO=nxM>g3y(_s=3D@@q!jXzb%*kj7K4>8XISU{pg8``L^+&`#>Z(bHwSv zw^v^qJb2A9|Hb=|D{9%D6mPKl26tUM_z+J;KD>5vt5Kn3giX0lo)K>hPO;+Kkr7*0 z9Y$K%H;b&TFSvW_xoIAIn5R(8NBdZc59?FA15m zly*PnwaJ0)&(t_44K81U54O+A*l?xL@d%%Lg}~_|sP|dAE%FANtB=)~(|P@{Gm2Yq1NZUbXz} zXD-1-x3;QP;ayAFty})@T?;24-Oq8hPyNq%*V3Px!vk-14u037cQ2YM<*abj**A69 zKmEl^tZetc`^8Jy{9j-7f3ICCzIN#``6zcs!Rg(4)`(Xj$sWbS-V|>8`7U1mUa?{p zv$ZrIHG-XY%u0v!X_ad;Uforwr{c17&<}QDat&|?{|`L3Nm}XbSBv1pI~!DddsE}C z4u8kno0GD}^JyWH_?v*(_5fAxH)U1Pqv@O7T;bzC3v_}ateMX>MQG5 z^^~1)U;m81?@>?Ly}zki>EH)F59I&fgC2QQ_n_y>VBn6{1WFW4OEn7Af)lzRnq=I@vO%vV5u(D3nNtCYl}ks$H-tpBJd zLB~C@xt00qvi}y`o#2w@LOmRG&Cd#YJb77-2;XqSt5$`AxAI&3eJ_Uk9rRjgX-ysg zxo}*%t+%512Eqt=%Hn3^%+Rl-AtN1EnUmdZ|MON`3A2&<1762;K2`qe#Wb!@~VnL3Ejsh*hAU6%P%QR z%Rl|o!-~y}T;c!Z;Zb=N2k#$Uz2$pHQ?L1+ocu+eB3wsq{_xy9C(yfio;?(W zd=m2*N89K9iKa|J;DezwBG7vJtxzmHxkc zClwr*8d|pK)h!ui^Ire0-b%e+=}_;af~*r}l;ym0a^>-}^_P;rz=Nsh-hKZcd@wce z{c*MJdkXW~DLCQ%lMeBCszXrwgRX-sSsQu>i0prU-~)KybmT+ZapXVHy>2- z*N&S%I`%*8Nmb9k^GQ{3#m7yX+lNzs{fa6XlzseY`7^5X)8^sMzvmTI4)3hWntj^) zU-E=1ICt%YvL8On|M}0T@_)t?s^GeH(}Tueyz+OwqAGjii}96y`hsfgKmLNso3HmY z=6?_n9JYSeKlL$H_rH2frRA}>+w@ zZPBda>Cw}Jwgmfj{xT%!{p~|D5Am4l=e)D>mhgul{NaoFI{^vz&^BFqMe^doha1`i XUA}92h*wy{zB}g^dxiDHcT4{tiYbPu delta 16316 zcmcKB2Xs``-uLl2gc?F1kPup62#`=i0)$>d57J3Mqz}oEM3YRIN$5C=3JNG?qoW9l zz*P|&MvMg!5y1kY6h%c5K|v8k5K*wa-(SwT*Z1CapY_~lJ@4yUtk2&2oU_Y+w^^{f zV`ZfmehCYHUc2JGF8*r~=5jT{0ri#p>%aUCF4qXM1y}=j;1GNV6EM1?%T*D3U{y@R zYB&VLF#}ca6em9)_1T<=BuYoFWfo^P% zs(2JOK@Udbt&aC$ZSq@j3hu-)7}uHiXx~*tVj|vwF?bRa@d~P;CSB|fwZcg9-EcIf zAJBVUU9Mz&2`O@Yi!Cv}n;n6nm_mLsDzYmusL(t}LUZ^ODiY73M(`^3!9z}Y z?e6vz#i2sn1=DaK?!(2XxgF8NuIGAGB&VYq^gG^+nwq6On14M8IS)2r74pwGFO(tc z(zOTG;9IEoKXme6Vl4R!s41x0)8!&)uKJjUqfil9g<3PaQ3HJ2@kmeNuLmb6Xn{$L~t zji3!S!6E3zJX8ZqQLA?~Y6O2nEz<3%2H(XN_!+9fu)g-%sfC)77LJ`!^$o^&9EnUt z(B&u5l!Aq*3Li#=dK+rBA3!yH9MzHUP;1~%RD;#~*%j79z1IUZ$3w9#jzcwk8){K6 z!#cPDtI@ve`SJw&67}I*s0I!@`4gyyzD2F>E2s)w{q6E-)RZ-KY=f#N72`1twMes2 z9h{GJ7SDl2F6Rs0gGvFAR1Zjq1Qe zR0pz9+s}_lxEM93+fmr-5RAEQIFY z;;#pFGwcQvPz`oNjbJD$wBt~7I|&uiEY$WaK!ti4vd&x^Q16{bz4w!o{{t1_N||;$ zbx;FH$Rz$+TpcOUhdodu>4#xB0@cAWs0yc}-pfawkO5REmpeX*ipYL!i=Sa@3?FM> z+o`DbCZOt{9wea#XP`#pN3DUCs0ciOIx06~0-i)oQPpwwVvNO3$30I&xv=jAS@Ea1koqj^~JmPwLJH??!+!s|o6xF~aEUy^*lAr7Niu3$;RD>eN z+b3Zi)TP!5TcSa2za3b<|34+si-J>F8=Kx>ho}=O-xC#)k*JEtqqfsjT#fUw9!7HI z>HS3Ph}}_Zrx5jBF?PoJsE9v@4a@gGi8>T~g33kJzw=!)O!a}Q}fX@;;)K7qd*OvLw)!Qw!-Qj zJD-XgaXRX~F^*GF9nMEL22d5RK{d1%wS70DzIzTi3S6(@5UevjXpdm>bmpIee5{Lu zv+Pwr1r=H!Y8x#>t&vAi9eM$^c6K@CM^FuYgBsY+s41$LZMRbk)v+e1_Y#97bmDb# z9E5|&k4KHR>UUBk`ymsUguo>muP-|*3YJjsa41;%* z&?;YrYG@s*p{-876cys#SP|bwRq!5a1Ye=PyNIgCnqhw*f$C^9DiU$1$hE=Bn1+LB z-!+(o8oUQ9<9(<(TaT*nDO3Y5q7I^csEUuFB6kuMflH|Oe@BJ9YL30yqp|!FLrqm0 zsw0_LzW?(`Xq(-E>ghJe*D#U%0aS-BV|%QWYd4sRmC5%(eK!adkxcA_9w&bvszaMl z19=AZ{!XmT`g83kp&p(OH7fEsCk#}RlP`5RCj+>CBKg8J?< zRzmAW+bXCjtbxI*B$|`ZNZO(1xD$54Zm0uiCicQLn1Y9}FIK$Cj>I6WLVgsg;_+C% zYf$wrLq%{khT}%m`%m4({3~SJDNsmuJ1@MC`tVa!hrYyWc*gNZY)k$cY8AK4x7S2l z)JRh?3434!-iT^=HmZY*ocsg%#Gftd+Drkbs;g>&-S7;@0!*O17;E5zsF7?zK5@N- z?J%LxzTGmhIr)XiBiBac#&*^6@hb^u;H!8XTjAPZ5xpa^2OD7fnS{?`K5+o~O@4Yz z{wyYw|1)6EadI&?9QkS32p_}^_#&>w8)&T`{)FSO%Pe*n-h&@t+-!dEV(()=i4J(fEw8o*Z~is4wecF?7tsOz+>b~@Le3S(2iV#o9*kkFDB|a zYAvnDDcb*^l3*HL-Ih$eC#a5`$L4qi)xkzf z>=3%KCi$MI?}uSLjzul%IarFPa2ST}wAapQOd=n97xCBj8FZJuIEt|g`E`y*P@#-i zY9G=4(M{fmgK#CXaa79+jdx%lT#K69Pf&~a1ghc7SOqJvmC`UABXKBp#R;g$1Puvo zn+I?rK7p#B@=AOE)^Y5P?@{i-37Aa0)$lTGhbvLn>rPaN51~4A9Bbl5)Y_@A+KxzN z&6so4EMbZk@P$$&f^*}{rFsh+U?0}P<@|CFf)}uPQ1vN!aqZ)q0@u>6s z42C#gzQYmP|F_?3kMuAOA%7B+u+4q;NGG5go`Q-@4yvOw(Txk7{Cd=TkE7n(=Hy>N zt))Gfj-R7CoEReh3VBBo>T!S6$j74^n2MU38=d@Zs42Mz6_ItQ5pF?+{1sF^`p>y~vDm?Ra2>kIXQC=D!PdAKo8UH7Lmyym{2IATT)*NN z9RGm*d@E{E@4|Z6h^tYHH5E00thK~nJuIR?+v66z5m(?kyoxVj=s~;T(G+TGW@1a+ zfQrD|n1Y|8LR(|KU2lEVnrMX@XcDU9-LMai2$CodDK@2Gos-{*Y2^3gKCJPOJ-0_u z6@8BC_&2Bqe?^U`(!+LnZB%(YY8xh@cEbQv2d+cyqTo~#>OdCigPBf#A!-rKVQh`xq8fTiX|38!`=_IJ?2HQGAZ&}HuqrM@g?usU`v+0)J>&QiY8$_Snu;T+ zHSp!5#J_xG6sV%BsE~&}W`EEKRZ%;~E~pCnqDDFrH6lN%gR4;^-{|->s^OP$0ltgs zX!_%J`Q*o$e}$%yf(*O`6YvPOz-#Ekrd#a4id}^h$X~_EIQ9uUa+6RE`>+$vcYGGL z7QVtcSYfNZSm&eG#(hB&%}G3udhuiD!Oy4$qMx)!+z=~~Z-tt>_NY+zMh##LY8PZ< z8V0c{?!xN$HtM^hs0f}$O?mJl2~|+(DSPq7qVnxfANE0oa43f3B*z>_KWfn~#AayF zjb#{t$57k*D^!Q9r|pr4BLn2`|4C?M?J)^cQB#nOS_{iibG;eexDPewXHgYaea7x^ z6sn`mP#x`rHLwpVlEa-hv9*i`WL=#J2b&s=~(G?ERdA zIw3PqBV6iuzvH8*wedXG#J8{t9z*S>FHjx(7K3_lnS?(0-7)Gpdn#I><}?!(!Z{d) zL0pNeP#upiwL6}II-+}{-kXeypbyp2`KSTjg-Li{De=!I@g@ZovBUHBi(OC^4@8AN z6V>Ah7>!=kNamrY>ULDNuz0LN@pq;AKyxE9;vKGX?%1$7=Ydf9HE1**YTr~##-MxNm~1$%1$ z=aEn-A4P?3KWZ_4fnD({REQhDVw;2-ac@*dhoM$;Hnv8CYG|kP{B6`!oLwD z-9b6+yWAwSI8sm*r(s_l;kXhtcZX0@a2m@GAe=%z`c*q0Kt*gFDv~>}7w$n#O@*Cy zc?>Eahe7o;nS?6tfeo=AuEr@?4}V0BH2gJt7sR9HcpNIkS=bMKPX0MmJv&hm{RFj^ zzIP1UWk;aiF5-Wl2k{iB!dkD}BaK6ipglIiE;tM`u@ydoiTExmn4h+B) z@)I!u@5aXXJgUCK*c&hG4%&0q{tf$*nSz?@TTvrhg&N6v)FOKcRl(=j6R%-BcHLt) zFcB50d8h%cMorzrs0eREefOgC{Bn>)`P{r||Fv5TYAsxI4Bu-JbMQ}ehz~Ij$v>K!K**$LP*b*yKo{DbliK=)qR>3S( zq;5iubUtR{oj3$PLk%SHE#@CPV_l4T+d0^f$Oc{ANT_FHQH$gztcJHZ9Z5%{40X2|<@^a=sKtdlbK^-6~FcI&^YPbs( z`gffC52z{l6`NtiyY?s1II6 zy?6js(Q(H!sE%GlMdBJNa@F?RQ`Q(ql5c@(umm;Yg{b;&L)Et$gIcZYNoYjdQ5C<1 z3f%`7fu~R(T)^sh4eMi-1NM7OQT230bz~?iV$-k<-hrCpZI1g;5&rA|^REM<(tGw< zULV!a5Y*z!#2Ppe)sZ~xgtMIdR#b;x#7NwOdjBwLKqpZH`3cp5$_MRyBh-iwgrh<%2N$hXe(Ur><^ zJ7jk#7*0Z~yryG)Y)ifwY88({HI#{}crqrT7uCQTRKt&;I`|~2!8b4qKfuYDdf0B* zpuSs+3EKaUkz%zi!|iLUEcWENfTer~(&g#9lo1z*@l{8gOI^Dj;^K-zbW|I)st7GnqUPoWN$ zFK`4_JjJ@e3_OnmPTTKy_{zSHZ$NFQyRjE;$0>LT7vY$%xv=mkDpJp%vHxXd0O1Pu zqu@~zYUmrRgk8U}w@Gi*+>XLpIMFd5n~-0Kir9K=iU&}O^9O8&)xWjRiBwcQBk_8s zU;^sB=gu+zs`$Ng_Ub=@TAfkf*%jBrk>t}c6Ys~qcpmk`q&?w?&~vPYV^NEADr&ps zU~SCDFbtyJyAA8$-RFtF3Lc?A9odRexC7hbd)OGSIX3v-K7hJm3gv~U4sSqp`}{PWfq!C4UjsZg}tqdsRoHde{wHV=t_Uxu^=}U_9Q6KHQ9tVKfV4IPO5L zo$w#+?b!?4kS_CKwhL5;xk zlRbjDSd;v1jt14yO{mE1MMdNQDng&4PR_H)z=E!yNT`C}Q6JQ}Y>znFF%DHhf@3FC zMg33}jYLIgBC4Kj)EX(qmiPiD;R(mcpY2823tQ8^>v|G8SQcR%K8D@!P1GX#6JxOA z6}#aEs702DY1keku?SNzh}uQlP;06TC*oVEjyM0s-o7caeE*Ypj|V}VfFpjj8{UGN z!>3WJ^*CzLT)=3&iW+gvt9Im?pdylh>UamNhh0$bjY36g8Y-fB7}TPhO+ulckIFB? zEL@Cg@LT8kPpA=HLya)vn!Q_UqrPvBYPbz5BFU%*`=IuJIx2D*s18lM#{b8l#7)kN z^RWZ@+fgGdb6(t!>d0}7#jjB#`vdD^>~D6%DQGVAecVbk$=-z0zx8WtnG5~bnp+0k zZW0D2g}eI}dh+KM=Vb-V*}ZQ~?3-Ns^W|b6sv)#Tzvbmo88E)SUcUFnt?=39OpX>IN6zBT3B+%X6BH(Ui zdc4!3A5HpZdHwmGxoS>5oRt?S@#N>t^AzX#3SE5*3w?Y;GT`bP2>7z{JnC9TeqNTB zk~!W$Y4VVS3TE%nOXjy>^-S-B&CQzObxn;CjZB4+OUx@HtDF3V)y%e$^G*7w`zz#n z%@2p#nz-dvO~m0oChKqyv-xmwSV=*lNf{Gu(vJ8{&e2=U!HmuI^0VEv?auNQ7J9Ra z6&yxOUyUy_!+f3jzBw@VI+HlA&^$V>z%(4+)x=ELQu_IXewJA@X;x{C$*)`H%PFfX zm3P$?PHkiceHm-cO>NR7JCE9O^8)T{Pat=?&*RTd47iK@z9O%`n7J|SrX?EpsWz1r zJl8C12r!O(1v$~lrS+mXZ>`vyL z?BpoFucXL5eXeV;5}xV#UK8-Hh%cb6fUl5P{$oWjK7~KqQ|y`U33$!1oU`W0xhT^# z?~oaF{?5|VH@Yp8^h1j2cA<-zRZz$Lt)RX6qTs&D_FR~v!WeV9FnaaHhfUDe*j&3f ztMYJ9p(n>{a*JkGDfX1tZ2HX1HDUfJGlxHu{KHJ>l}OX)=O`;+Mg<0%9|J-2VDT)| zvm_yMhG!P5j1C4g*JfbJD)V(oGc)08vPr*so#`|CMCtH3r!CWGUbfjXzt}Wh@Un3) z++!+ij4`P+bj7iSdBveeDq4d}tK51y%(S>;w7L0? z8KLRnR%4U6c&iz-q^$`qDKb^=Tw|WT^JA-px%sa6TK^h&v-hs#(6UIYmZ`sVSS4S+ z7SNqbM}$t-wAz@rmQAak>znQFS2CS|2h4rTi$ceutcW_pJ^q^ryemUbhkJ|td0A$~ z-LbXGLui*~YK}s4YFoF466;v4s}*K>UG@@czaqh8tyo{7MPT*HhM^`g)=YD884<*d-I|&bMCP{=GIq6 zcOEjMe9;xp_PGnn!x5m7;;h`Z)S1uG!6qs26cw@K^S!gY`R*L8;y`FylJ&DWxTU{o z{KWO4gUME;dHjhsCUR?J#oW9Z#iciH{iuSO`gGsW=c!izP_VNVYgRrpyt>~tmLa;w z_}B!Uo-M7MpXDp?HZ|v-U0wRiwq6xNMLn!Gp|T#<4W*N}KVz9rWtpX0%UW3`?xo1m zAun;rMDCbax_d_}tHX3(ez9wMNpUeFc8)C~?)K;91o$s65UmIq=d~Jbwbk|e0y0lA4ZkOE2os!%=r9->qE~Qzo zx3i~T<19ngYH!eiR+ZDSVfO*Jp?ZDcO(ef9t64N>~czRnfQ`L{>^4{nCE z|H;izzCqlczuynKDe_G65Kn3McaK^%`e$UgGra{x`5bovv+Tg{^@jVh^Je5_d1xcs zZ57SNQ>?JInkw;`UH{O)JJc^+AML@xfDO{Go^c z{grZy={6=p*GXy4(FCi>h`&#gy;q8hz5aqcw2~Jp)5Fa4Q?X{%S6)-~>weCy)4|+% zW}s<(wvicq_L2Ymo~dP`zWcCr)cKeG(>rF%MfX47F+(`rb?%vl z=Bdk_ox3K+j0tqCskwIz=ck7|E7#*MHs1$&n;WmBnWI;h{x`QzY5LVv%M710u=K}k zJ9Yi^U;T&Mxq&v^+rx_6zQL+u-MhhRSoViyHMByBVOGoL8Qy&FJPt??lV0FutCkeH zvpfYwKKEaDRA_#f^~%3oQe{;uSpzC^ON|O0sb=NrnwnRU11u2wBHSAD_sc4j6Jb5f zZIu)nT*F#tX57`dirv`1zq~>NBCSrky*#0-kyfKn+nUy}(8-!sQmCkw<@wjEtC@XK z5v@S6-@|$ASMdCK|M@M}GD>Th-<)~$>aW`@)H>Q)_s`c^a_DS~)wYt3$UtarU8~7| zd9#J`Vyyw@%<5L5Q?Zuc1dTUzu%0!bY)O5qZY#TLVJl#zy%g=Lx}lif)^M}6Y((gAZ|f6Xgl5P~i_0EQvo=|wZ~IyQo9i$>6f=-P l^%!W?H^H4\n" "Language: it\n" @@ -17,421 +17,657 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" - -#: superset/assets/javascripts/explore/stores/controls.jsx:553 -#: superset/db_engine_specs.py:192 superset/db_engine_specs.py:223 -#: superset/db_engine_specs.py:267 superset/db_engine_specs.py:315 -#: superset/db_engine_specs.py:371 superset/db_engine_specs.py:839 -#: superset/db_engine_specs.py:875 superset/db_engine_specs.py:907 -#: superset/db_engine_specs.py:953 superset/db_engine_specs.py:990 -#: superset/db_engine_specs.py:1015 +"Generated-By: Babel 2.5.3\n" + +#: superset/assets/javascripts/explore/stores/controls.jsx:744 +#: superset/db_engine_specs.py:291 superset/db_engine_specs.py:350 +#: superset/db_engine_specs.py:370 superset/db_engine_specs.py:414 +#: superset/db_engine_specs.py:464 superset/db_engine_specs.py:520 +#: superset/db_engine_specs.py:1067 superset/db_engine_specs.py:1099 +#: superset/db_engine_specs.py:1145 superset/db_engine_specs.py:1182 +#: superset/db_engine_specs.py:1214 msgid "Time Column" msgstr "Colonna del Tempo" -#: superset/db_engine_specs.py:193 superset/db_engine_specs.py:224 -#: superset/db_engine_specs.py:316 superset/db_engine_specs.py:372 -#: superset/db_engine_specs.py:840 superset/db_engine_specs.py:908 -#: superset/db_engine_specs.py:991 +#: superset/db_engine_specs.py:292 superset/db_engine_specs.py:371 +#: superset/db_engine_specs.py:465 superset/db_engine_specs.py:521 +#: superset/db_engine_specs.py:1068 superset/db_engine_specs.py:1100 +#: superset/db_engine_specs.py:1183 msgid "second" msgstr "secondo" -#: superset/db_engine_specs.py:194 superset/db_engine_specs.py:227 -#: superset/db_engine_specs.py:319 superset/db_engine_specs.py:374 -#: superset/db_engine_specs.py:842 superset/db_engine_specs.py:876 -#: superset/db_engine_specs.py:910 superset/db_engine_specs.py:954 -#: superset/db_engine_specs.py:992 superset/db_engine_specs.py:1016 +#: superset/db_engine_specs.py:294 superset/db_engine_specs.py:351 +#: superset/db_engine_specs.py:374 superset/db_engine_specs.py:468 +#: superset/db_engine_specs.py:523 superset/db_engine_specs.py:1070 +#: superset/db_engine_specs.py:1102 superset/db_engine_specs.py:1146 +#: superset/db_engine_specs.py:1184 superset/db_engine_specs.py:1215 msgid "minute" msgstr "minuto" -#: superset/db_engine_specs.py:195 superset/db_engine_specs.py:231 -#: superset/db_engine_specs.py:321 superset/db_engine_specs.py:376 -#: superset/db_engine_specs.py:848 superset/db_engine_specs.py:878 -#: superset/db_engine_specs.py:912 superset/db_engine_specs.py:960 -#: superset/db_engine_specs.py:993 superset/db_engine_specs.py:1017 +#: superset/db_engine_specs.py:296 superset/db_engine_specs.py:352 +#: superset/db_engine_specs.py:378 superset/db_engine_specs.py:415 +#: superset/db_engine_specs.py:470 superset/db_engine_specs.py:525 +#: superset/db_engine_specs.py:1076 superset/db_engine_specs.py:1104 +#: superset/db_engine_specs.py:1152 superset/db_engine_specs.py:1185 +#: superset/db_engine_specs.py:1216 msgid "hour" msgstr "ora" -#: superset/db_engine_specs.py:196 superset/db_engine_specs.py:236 -#: superset/db_engine_specs.py:268 superset/db_engine_specs.py:323 -#: superset/db_engine_specs.py:378 superset/db_engine_specs.py:850 -#: superset/db_engine_specs.py:880 superset/db_engine_specs.py:914 -#: superset/db_engine_specs.py:962 superset/db_engine_specs.py:994 -#: superset/db_engine_specs.py:1018 +#: superset/db_engine_specs.py:298 superset/db_engine_specs.py:353 +#: superset/db_engine_specs.py:383 superset/db_engine_specs.py:417 +#: superset/db_engine_specs.py:472 superset/db_engine_specs.py:527 +#: superset/db_engine_specs.py:1078 superset/db_engine_specs.py:1106 +#: superset/db_engine_specs.py:1154 superset/db_engine_specs.py:1186 +#: superset/db_engine_specs.py:1217 msgid "day" msgstr "giorno" -#: superset/db_engine_specs.py:197 superset/db_engine_specs.py:242 -#: superset/db_engine_specs.py:269 superset/db_engine_specs.py:324 -#: superset/db_engine_specs.py:380 superset/db_engine_specs.py:852 -#: superset/db_engine_specs.py:882 superset/db_engine_specs.py:916 -#: superset/db_engine_specs.py:995 superset/db_engine_specs.py:1019 +#: superset/db_engine_specs.py:300 superset/db_engine_specs.py:354 +#: superset/db_engine_specs.py:389 superset/db_engine_specs.py:418 +#: superset/db_engine_specs.py:473 superset/db_engine_specs.py:529 +#: superset/db_engine_specs.py:1080 superset/db_engine_specs.py:1108 +#: superset/db_engine_specs.py:1187 superset/db_engine_specs.py:1218 msgid "week" msgstr "settimana" -#: superset/db_engine_specs.py:198 superset/db_engine_specs.py:244 -#: superset/db_engine_specs.py:271 superset/db_engine_specs.py:326 -#: superset/db_engine_specs.py:382 superset/db_engine_specs.py:854 -#: superset/db_engine_specs.py:884 superset/db_engine_specs.py:918 -#: superset/db_engine_specs.py:964 superset/db_engine_specs.py:996 -#: superset/db_engine_specs.py:1020 +#: superset/db_engine_specs.py:302 superset/db_engine_specs.py:355 +#: superset/db_engine_specs.py:391 superset/db_engine_specs.py:420 +#: superset/db_engine_specs.py:475 superset/db_engine_specs.py:531 +#: superset/db_engine_specs.py:1082 superset/db_engine_specs.py:1110 +#: superset/db_engine_specs.py:1156 superset/db_engine_specs.py:1188 +#: superset/db_engine_specs.py:1219 msgid "month" msgstr "mese" -#: superset/db_engine_specs.py:199 superset/db_engine_specs.py:246 -#: superset/db_engine_specs.py:328 superset/db_engine_specs.py:384 -#: superset/db_engine_specs.py:856 superset/db_engine_specs.py:886 -#: superset/db_engine_specs.py:920 superset/db_engine_specs.py:966 -#: superset/db_engine_specs.py:997 superset/db_engine_specs.py:1021 +#: superset/db_engine_specs.py:304 superset/db_engine_specs.py:356 +#: superset/db_engine_specs.py:393 superset/db_engine_specs.py:477 +#: superset/db_engine_specs.py:533 superset/db_engine_specs.py:1084 +#: superset/db_engine_specs.py:1112 superset/db_engine_specs.py:1158 +#: superset/db_engine_specs.py:1189 superset/db_engine_specs.py:1220 msgid "quarter" msgstr "quartile" -#: superset/db_engine_specs.py:200 superset/db_engine_specs.py:250 -#: superset/db_engine_specs.py:330 superset/db_engine_specs.py:858 -#: superset/db_engine_specs.py:888 superset/db_engine_specs.py:968 -#: superset/db_engine_specs.py:998 superset/db_engine_specs.py:1022 +#: superset/db_engine_specs.py:306 superset/db_engine_specs.py:357 +#: superset/db_engine_specs.py:397 superset/db_engine_specs.py:479 +#: superset/db_engine_specs.py:1086 superset/db_engine_specs.py:1160 +#: superset/db_engine_specs.py:1190 superset/db_engine_specs.py:1221 msgid "year" msgstr "anno" -#: superset/db_engine_specs.py:332 +#: superset/db_engine_specs.py:481 msgid "week_start_monday" msgstr "settimana_inizio_lunedì" -#: superset/db_engine_specs.py:386 superset/db_engine_specs.py:922 +#: superset/db_engine_specs.py:535 superset/db_engine_specs.py:1114 msgid "week_ending_saturday" msgstr "settimana_fine_domenica" -#: superset/db_engine_specs.py:389 superset/db_engine_specs.py:925 +#: superset/db_engine_specs.py:538 superset/db_engine_specs.py:1117 msgid "week_start_sunday" msgstr "settimana_inizio_domenica" -#: superset/db_engine_specs.py:844 superset/db_engine_specs.py:956 +#: superset/db_engine_specs.py:1072 superset/db_engine_specs.py:1148 msgid "5 minute" msgstr "5 minuti" -#: superset/db_engine_specs.py:846 +#: superset/db_engine_specs.py:1074 msgid "half hour" msgstr "mezz'ora" -#: superset/db_engine_specs.py:958 +#: superset/db_engine_specs.py:1150 msgid "10 minute" msgstr "10 minuti" -#: superset/utils.py:499 +#: superset/connectors/sqla/views.py:223 superset/forms.py:28 +msgid "Table Name" +msgstr "" + +#: superset/forms.py:29 +msgid "Name of table to be created from csv data." +msgstr "" + +#: superset/forms.py:33 +msgid "CSV File" +msgstr "" + +#: superset/forms.py:34 +msgid "Select a CSV file to be uploaded to a database." +msgstr "" + +#: superset/forms.py:36 +msgid "CSV Files Only!" +msgstr "" + +#: superset/forms.py:41 +msgid "Delimiter" +msgstr "" + +#: superset/forms.py:42 +msgid "Delimiter used by CSV file (for whitespace use \\s+)." +msgstr "" + +#: superset/forms.py:46 +msgid "Table Exists" +msgstr "" + +#: superset/forms.py:47 +msgid "" +"If table exists do one of the following: Fail (do nothing), Replace (drop" +" and recreate table) or Append (insert data)." +msgstr "" + +#: superset/forms.py:52 +msgid "Fail" +msgstr "" + +#: superset/forms.py:52 +msgid "Replace" +msgstr "" + +#: superset/forms.py:53 +msgid "Append" +msgstr "" + +#: superset/connectors/sqla/views.py:219 superset/forms.py:56 +msgid "Schema" +msgstr "Schema" + +#: superset/forms.py:57 +msgid "Specify a schema (if database flavour supports this)." +msgstr "" + +#: superset/forms.py:62 +msgid "Header Row" +msgstr "" + +#: superset/forms.py:63 +msgid "" +"Row containing the headers to use as column names (0 is first line of " +"data). Leave empty if there is no header row." +msgstr "" + +#: superset/forms.py:71 +msgid "Index Column" +msgstr "" + +#: superset/forms.py:72 +msgid "" +"Column to use as the row labels of the dataframe. Leave empty if no index" +" column." +msgstr "" + +#: superset/forms.py:79 +msgid "Mangle Duplicate Columns" +msgstr "" + +#: superset/forms.py:80 +msgid "Specify duplicate columns as \"X.0, X.1\"." +msgstr "" + +#: superset/forms.py:82 +msgid "Skip Initial Space" +msgstr "" + +#: superset/forms.py:83 +msgid "Skip spaces after delimiter." +msgstr "" + +#: superset/forms.py:85 +msgid "Skip Rows" +msgstr "" + +#: superset/forms.py:86 +msgid "Number of rows to skip at start of file." +msgstr "" + +#: superset/forms.py:91 +msgid "Rows to Read" +msgstr "" + +#: superset/forms.py:92 +msgid "Number of rows of file to read." +msgstr "" + +#: superset/forms.py:97 +msgid "Skip Blank Lines" +msgstr "" + +#: superset/forms.py:98 +msgid "Skip blank lines rather than interpreting them as NaN values." +msgstr "" + +#: superset/forms.py:102 +msgid "Parse Dates" +msgstr "" + +#: superset/forms.py:103 +msgid "Parse date values." +msgstr "" + +#: superset/forms.py:105 +msgid "Infer Datetime Format" +msgstr "" + +#: superset/forms.py:106 +msgid "Use Pandas to interpret the datetime format automatically." +msgstr "" + +#: superset/forms.py:110 +msgid "Decimal Character" +msgstr "" + +#: superset/forms.py:111 +msgid "Character to interpret as decimal point." +msgstr "" + +#: superset/forms.py:116 +msgid "Dataframe Index" +msgstr "" + +#: superset/forms.py:117 +msgid "Write dataframe index as a column." +msgstr "" + +#: superset/forms.py:119 +msgid "Column Label(s)" +msgstr "" + +#: superset/forms.py:120 +msgid "" +"Column label for index column(s). If None is given and Dataframe Index is" +" True, Index Names are used." +msgstr "" + +#: superset/utils.py:607 #, python-format msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "[Superset] Accesso al datasource $(name) concesso" -#: superset/viz.py:50 +#: superset/viz.py:56 msgid "Viz is missing a datasource" msgstr "Datasource mancante per la visualizzazione" -#: superset/viz.py:181 +#: superset/viz.py:220 msgid "From date cannot be larger than to date" msgstr "La data di inizio non può essere dopo la data di fine" -#: superset/assets/javascripts/explore/stores/visTypes.js:334 -#: superset/viz.py:369 +#: superset/assets/javascripts/explore/stores/visTypes.js:720 +#: superset/viz.py:417 msgid "Table View" msgstr "Vista Tabella" -#: superset/viz.py:381 +#: superset/viz.py:429 msgid "Pick a granularity in the Time section or uncheck 'Include Time'" -msgstr "Seleziona una granularità nella sezione tempo e deseleziona 'Includi Tempo'" +msgstr "" +"Seleziona una granularità nella sezione tempo e deseleziona 'Includi " +"Tempo'" -#: superset/viz.py:391 +#: superset/viz.py:439 msgid "Choose either fields to [Group By] and [Metrics] or [Columns], not both" msgstr "Selezionare i campi [Group By] e [Metrica] o [Colonne], non entrambi" -#: superset/assets/javascripts/explore/stores/visTypes.js:386 -#: superset/viz.py:430 +#: superset/viz.py:513 +msgid "Time Table View" +msgstr "" + +#: superset/viz.py:522 superset/viz.py:1354 +msgid "Pick at least one metric" +msgstr "Seleziona almeno una metrica" + +#: superset/viz.py:525 +msgid "When using 'Group By' you are limited to use a single metric" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:801 +#: superset/viz.py:554 msgid "Pivot Table" msgstr "Vista Pivot" -#: superset/viz.py:444 -msgid "Please choose at least one \"Group by\" field " -msgstr "Seleziona almeno un campo \"Group by\"" +#: superset/viz.py:568 +msgid "Please choose at least one 'Group by' field " +msgstr "" -#: superset/viz.py:446 +#: superset/viz.py:570 msgid "Please choose at least one metric" msgstr "Seleziona almeno una metrica" -#: superset/viz.py:450 -msgid "'Group By' and 'Columns' can't overlap" -msgstr "'Group by' e 'Colonne' non possono sovrapporsi" +#: superset/viz.py:574 +msgid "Group By' and 'Columns' can't overlap" +msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:373 -#: superset/viz.py:483 +#: superset/assets/javascripts/explore/stores/visTypes.js:787 +#: superset/viz.py:607 msgid "Markup" msgstr "Marcatore" -#: superset/assets/javascripts/explore/stores/visTypes.js:411 -#: superset/viz.py:502 +#: superset/assets/javascripts/explore/stores/visTypes.js:826 +#: superset/viz.py:629 msgid "Separator" msgstr "Separatore" -#: superset/assets/javascripts/explore/stores/visTypes.js:433 -#: superset/viz.py:514 +#: superset/assets/javascripts/explore/stores/visTypes.js:848 +#: superset/viz.py:641 msgid "Word Cloud" msgstr "Cloud di Parole" -#: superset/assets/javascripts/explore/stores/visTypes.js:454 -#: superset/viz.py:537 +#: superset/assets/javascripts/explore/stores/visTypes.js:870 +#: superset/viz.py:664 msgid "Treemap" msgstr "Treemap" -#: superset/assets/javascripts/explore/stores/visTypes.js:481 -#: superset/viz.py:563 +#: superset/assets/javascripts/explore/stores/visTypes.js:897 +#: superset/viz.py:690 msgid "Calendar Heatmap" msgstr "Calendario di Intensità" -#: superset/assets/javascripts/explore/stores/visTypes.js:502 -#: superset/viz.py:621 +#: superset/assets/javascripts/explore/stores/visTypes.js:918 +#: superset/viz.py:748 msgid "Box Plot" msgstr "Box Plot" -#: superset/assets/javascripts/explore/stores/visTypes.js:523 -#: superset/viz.py:710 +#: superset/assets/javascripts/explore/stores/visTypes.js:939 +#: superset/viz.py:837 msgid "Bubble Chart" msgstr "Grafico a Bolle" -#: superset/viz.py:734 +#: superset/viz.py:861 msgid "Pick a metric for x, y and size" msgstr "Seleziona una metrica per x, y e grandezza" -#: superset/assets/javascripts/explore/stores/visTypes.js:574 -#: superset/viz.py:760 +#: superset/assets/javascripts/explore/stores/visTypes.js:990 +#: superset/viz.py:887 msgid "Bullet Chart" msgstr "Grafico a Proiettile" -#: superset/viz.py:786 +#: superset/viz.py:913 msgid "Pick a metric to display" msgstr "Seleziona una metrica da visualizzare" -#: superset/assets/javascripts/explore/stores/visTypes.js:597 -#: superset/viz.py:809 +#: superset/assets/javascripts/explore/stores/visTypes.js:1013 +#: superset/viz.py:936 msgid "Big Number with Trendline" msgstr "Numero Grande con Linea del Trend" -#: superset/viz.py:817 superset/viz.py:846 +#: superset/viz.py:944 superset/viz.py:973 msgid "Pick a metric!" msgstr "Seleziona una metrica!" -#: superset/assets/javascripts/explore/stores/visTypes.js:622 -#: superset/viz.py:838 +#: superset/assets/javascripts/explore/stores/visTypes.js:1038 +#: superset/viz.py:965 msgid "Big Number" msgstr "Numero Grande" -#: superset/assets/javascripts/explore/stores/visTypes.js:157 -#: superset/viz.py:865 +#: superset/assets/javascripts/explore/stores/visTypes.js:158 +#: superset/viz.py:992 msgid "Time Series - Line Chart" msgstr "Serie Temporali - Grafico Lineare" -#: superset/viz.py:913 superset/viz.py:1058 +#: superset/viz.py:1049 superset/viz.py:1214 msgid "Pick a time granularity for your time series" msgstr "Seleziona una granularità per la serie temporale" -#: superset/viz.py:1001 +#: superset/viz.py:1128 +msgid "" +"`Since` and `Until` time bounds should be specified when using the `Time " +"Shift` feature." +msgstr "" + +#: superset/viz.py:1157 msgid "Time Series - Dual Axis Line Chart" msgstr "Serie Temporali - Grafico Lineare ad Assi Duali" -#: superset/viz.py:1011 +#: superset/viz.py:1167 msgid "Pick a metric for left axis!" msgstr "Seleziona una metrica per l'asse sinistro" -#: superset/viz.py:1013 +#: superset/viz.py:1169 msgid "Pick a metric for right axis!" msgstr "Seleziona una metrica per l'asse destro" -#: superset/viz.py:1015 +#: superset/viz.py:1171 msgid "Please choose different metrics on left and right axis" msgstr "Seleziona metriche differenti per gli assi destro e sinistro" -#: superset/assets/javascripts/explore/stores/visTypes.js:238 -#: superset/viz.py:1076 +#: superset/assets/javascripts/explore/stores/visTypes.js:283 +#: superset/viz.py:1232 msgid "Time Series - Bar Chart" msgstr "Serie Temporali - Grafico Barre" -#: superset/assets/javascripts/explore/stores/visTypes.js:274 -#: superset/viz.py:1084 +#: superset/viz.py:1241 +msgid "Time Series - Period Pivot" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:319 +#: superset/viz.py:1281 msgid "Time Series - Percent Change" msgstr "Serie Temporali - Cambiamento Percentuale" -#: superset/assets/javascripts/explore/stores/visTypes.js:297 -#: superset/viz.py:1092 +#: superset/assets/javascripts/explore/stores/visTypes.js:683 +#: superset/viz.py:1289 msgid "Time Series - Stacked" msgstr "Serie Temporali - Stacked" -#: superset/viz.py:1101 +#: superset/viz.py:1298 msgid "Distribution - NVD3 - Pie Chart" msgstr "Distribuzione - NVD3 - Grafico Torta" -#: superset/assets/javascripts/explore/stores/visTypes.js:647 -#: superset/viz.py:1119 +#: superset/assets/javascripts/explore/stores/visTypes.js:1063 +#: superset/viz.py:1316 msgid "Histogram" msgstr "Istogramma" -#: superset/viz.py:1129 +#: superset/viz.py:1326 msgid "Must have one numeric column specified" msgstr "Devi specificare una colonna numerica" #: superset/assets/javascripts/explore/stores/visTypes.js:96 -#: superset/viz.py:1144 +#: superset/viz.py:1341 msgid "Distribution - Bar Chart" msgstr "Distribuzione - Grafico Barre" -#: superset/viz.py:1155 +#: superset/viz.py:1352 msgid "Can't have overlap between Series and Breakdowns" msgstr "" -#: superset/viz.py:1157 -msgid "Pick at least one metric" -msgstr "Seleziona almeno una metrica" - -#: superset/viz.py:1159 +#: superset/viz.py:1356 msgid "Pick at least one field for [Series]" msgstr "Seleziona almeno un campo per [Series]" -#: superset/assets/javascripts/explore/stores/visTypes.js:679 -#: superset/viz.py:1212 +#: superset/assets/javascripts/explore/stores/visTypes.js:1095 +#: superset/viz.py:1409 msgid "Sunburst" msgstr "Sunburst" -#: superset/assets/javascripts/explore/stores/visTypes.js:716 -#: superset/viz.py:1245 +#: superset/assets/javascripts/explore/stores/visTypes.js:1133 +#: superset/viz.py:1440 msgid "Sankey" msgstr "Sankey" -#: superset/viz.py:1252 +#: superset/viz.py:1447 msgid "Pick exactly 2 columns as [Source / Target]" msgstr "Seleziona esattamente 2 colonne come [Sorgente / Destinazione]" -#: superset/viz.py:1283 +#: superset/viz.py:1478 msgid "" "There's a loop in your Sankey, please provide a tree. Here's a faulty " "link: {}" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:743 -#: superset/viz.py:1294 superset/viz.py:1315 +#: superset/assets/javascripts/explore/stores/visTypes.js:1160 +#: superset/viz.py:1489 superset/viz.py:1510 msgid "Directed Force Layout" msgstr "Disposizione a Forza Diretta" -#: superset/viz.py:1301 +#: superset/viz.py:1496 msgid "Pick exactly 2 columns to 'Group By'" msgstr "Seleziona esattamente 2 colonne per 'Group By'" -#: superset/assets/javascripts/explore/stores/visTypes.js:808 -#: superset/viz.py:1348 +#: superset/assets/javascripts/explore/stores/visTypes.js:1225 +#: superset/viz.py:1543 msgid "Country Map" msgstr "Mappa della Nazione" -#: superset/assets/javascripts/explore/stores/visTypes.js:841 -#: superset/viz.py:1376 +#: superset/assets/javascripts/explore/stores/visTypes.js:1259 +#: superset/viz.py:1571 msgid "World Map" msgstr "Mappa del Mondo" #: superset/assets/javascripts/explore/stores/visTypes.js:80 -#: superset/viz.py:1426 +#: superset/viz.py:1621 msgid "Filters" msgstr "Filtri" -#: superset/viz.py:1434 +#: superset/viz.py:1642 msgid "Pick at least one filter field" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:909 -#: superset/viz.py:1461 +#: superset/assets/javascripts/explore/stores/visTypes.js:1324 +#: superset/viz.py:1667 msgid "iFrame" msgstr "iFrame" -#: superset/assets/javascripts/explore/stores/visTypes.js:921 -#: superset/viz.py:1478 +#: superset/assets/javascripts/explore/stores/visTypes.js:1336 +#: superset/viz.py:1687 msgid "Parallel Coordinates" msgstr "Coordinate Parallele" -#: superset/assets/javascripts/explore/stores/visTypes.js:943 -#: superset/viz.py:1503 +#: superset/assets/javascripts/explore/stores/visTypes.js:1358 +#: superset/viz.py:1712 msgid "Heatmap" msgstr "Mappa di Intensità" -#: superset/viz.py:1562 +#: superset/viz.py:1771 msgid "Horizon Charts" msgstr "Grafici d'orizzonte" -#: superset/assets/javascripts/explore/stores/visTypes.js:1002 -#: superset/viz.py:1573 +#: superset/assets/javascripts/explore/stores/visTypes.js:1418 +#: superset/viz.py:1782 msgid "Mapbox" msgstr "Mapbox" -#: superset/viz.py:1588 +#: superset/viz.py:1797 msgid "Must have a [Group By] column to have 'count' as the [Label]" msgstr "" -#: superset/viz.py:1601 +#: superset/viz.py:1810 msgid "Choice of [Label] must be present in [Group By]" msgstr "" -#: superset/viz.py:1606 +#: superset/viz.py:1815 msgid "Choice of [Point Radius] must be present in [Group By]" msgstr "" -#: superset/viz.py:1611 +#: superset/viz.py:1820 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1073 -#: superset/viz.py:1676 +#: superset/assets/javascripts/explore/stores/visTypes.js:342 +#: superset/viz.py:1889 +msgid "Deck.gl - Multiple Layers" +msgstr "" + +#: superset/viz.py:1925 superset/viz.py:1938 +msgid "Bad spatial key" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:628 +#: superset/viz.py:2019 +msgid "Deck.gl - Scatter plot" +msgstr "" + +#: superset/viz.py:2060 +msgid "Deck.gl - Screen Grid" +msgstr "" + +#: superset/viz.py:2075 +msgid "Deck.gl - 3D Grid" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:434 +#: superset/viz.py:2090 +msgid "Deck.gl - Paths" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:550 +#: superset/viz.py:2123 +msgid "Deck.gl - Polygon" +msgstr "" + +#: superset/viz.py:2131 +msgid "Deck.gl - 3D HEX" +msgstr "" + +#: superset/viz.py:2146 +msgid "Deck.gl - GeoJSON" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:590 +#: superset/viz.py:2165 +msgid "Deck.gl - Arc" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:1488 +#: superset/viz.py:2189 msgid "Event flow" msgstr "" -#: superset/viz.py:1706 +#: superset/assets/javascripts/explore/stores/visTypes.js:1533 +#: superset/viz.py:2220 msgid "Time Series - Paired t-test" msgstr "" -#: superset/assets/javascripts/SqlLab/actions.js:57 +#: superset/assets/javascripts/explore/stores/visTypes.js:1551 +#: superset/viz.py:2278 +msgid "Time Series - Nightingale Rose Chart" +msgstr "" + +#: superset/viz.py:2308 +msgid "Partition Diagram" +msgstr "" + +#: superset/assets/javascripts/SqlLab/actions.js:58 msgid "Your query was saved" msgstr "La tua query è stata salvata" -#: superset/assets/javascripts/SqlLab/actions.js:58 +#: superset/assets/javascripts/SqlLab/actions.js:59 msgid "Your query could not be saved" msgstr "La tua query non può essere salvata" -#: superset/assets/javascripts/SqlLab/actions.js:111 +#: superset/assets/javascripts/SqlLab/actions.js:112 msgid "Failed at retrieving results from the results backend" msgstr "Errore nel recupero dei dati dal backend" -#: superset/assets/javascripts/SqlLab/actions.js:157 -msgid "Could not connect to server" -msgstr "Non posso connettermi al server" - #: superset/assets/javascripts/SqlLab/actions.js:162 +msgid "Unknown error" +msgstr "" + +#: superset/assets/javascripts/SqlLab/actions.js:166 msgid "Your session timed out, please refresh your page and try again." msgstr "La tua sessione è scaduta, ricarica la pagina e riprova." -#: superset/assets/javascripts/SqlLab/actions.js:181 +#: superset/assets/javascripts/SqlLab/actions.js:185 msgid "Query was stopped." msgstr "La query è stata fermata." -#: superset/assets/javascripts/SqlLab/actions.js:184 +#: superset/assets/javascripts/SqlLab/actions.js:188 msgid "Failed at stopping query." msgstr "Errore nel fermare la query." -#: superset/assets/javascripts/SqlLab/actions.js:297 -#: superset/assets/javascripts/SqlLab/actions.js:310 +#: superset/assets/javascripts/SqlLab/actions.js:305 +#: superset/assets/javascripts/SqlLab/actions.js:318 msgid "Error occurred while fetching table metadata" msgstr "Errore nel recupero dei metadati della tabella" -#: superset/assets/javascripts/SqlLab/actions.js:364 +#: superset/assets/javascripts/SqlLab/actions.js:372 msgid "shared query" msgstr "query condivisa" -#: superset/assets/javascripts/SqlLab/actions.js:372 -#: superset/assets/javascripts/SqlLab/actions.js:392 +#: superset/assets/javascripts/SqlLab/actions.js:380 +#: superset/assets/javascripts/SqlLab/actions.js:400 msgid "The query couldn't be loaded" msgstr "La query non può essere caricata" -#: superset/assets/javascripts/SqlLab/actions.js:426 +#: superset/assets/javascripts/SqlLab/actions.js:434 msgid "An error occurred while creating the data source" msgstr "Errore nel creare il datasource" @@ -441,7 +677,9 @@ msgstr "Seleziona un tipo di grafico" #: superset/assets/javascripts/SqlLab/constants.js:31 msgid "To use this chart type you need at least one column flagged as a date" -msgstr "Per usare questo tipo di grafico devi avere almeno una colonna selezionata come data" +msgstr "" +"Per usare questo tipo di grafico devi avere almeno una colonna " +"selezionata come data" #: superset/assets/javascripts/SqlLab/constants.js:32 msgid "To use this chart type you need at least one dimension" @@ -449,7 +687,9 @@ msgstr "Per usare questo tipo di grafico devi avere almeno una dimensione" #: superset/assets/javascripts/SqlLab/constants.js:33 msgid "To use this chart type you need at least one aggregation function" -msgstr "Per usare questo tipo di grafico devi avere almeno uan funziona di aggregazione" +msgstr "" +"Per usare questo tipo di grafico devi avere almeno uan funziona di " +"aggregazione" #: superset/assets/javascripts/SqlLab/components/QueryTable.jsx:49 #: superset/assets/javascripts/SqlLab/reducers.js:11 @@ -545,34 +785,34 @@ msgid ".CSV" msgstr "CSV" #: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:78 -#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:241 -#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:280 +#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:243 +#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:282 msgid "Visualize" msgstr "" -#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:162 -#: superset/connectors/sqla/views.py:85 superset/connectors/sqla/views.py:135 -#: superset/connectors/sqla/views.py:214 superset/views/core.py:380 +#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:163 +#: superset/connectors/sqla/views.py:81 superset/connectors/sqla/views.py:133 +#: superset/connectors/sqla/views.py:214 superset/views/core.py:455 msgid "Table" msgstr "Tabella" -#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:162 +#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:163 msgid "was created" msgstr "è stata creata" -#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:169 +#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:170 msgid "Query in a new tab" msgstr "Query in un nuovo tab" -#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:210 +#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:211 msgid "Fetch data preview" msgstr "" -#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:230 +#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:231 msgid "Track Job" msgstr "" -#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:236 +#: superset/assets/javascripts/SqlLab/components/ResultSet.jsx:237 msgid "Loading..." msgstr "" @@ -584,51 +824,57 @@ msgstr "" msgid "Run Query" msgstr "" -#: superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx:22 +#: superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx:34 +msgid "Run query synchronously" +msgstr "" + +#: superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx:45 msgid "Run query asynchronously" msgstr "" -#: superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx:57 +#: superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx:56 msgid "Stop" msgstr "" -#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:16 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:18 msgid "Undefined" msgstr "" -#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:66 -#: superset/views/sql_lab.py:53 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:67 +#: superset/views/sql_lab.py:52 msgid "Label" msgstr "" -#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:71 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:72 msgid "Label for your query" msgstr "" -#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:81 -#: superset/connectors/druid/views.py:107 -#: superset/connectors/druid/views.py:228 superset/connectors/sqla/views.py:82 -#: superset/connectors/sqla/views.py:131 superset/connectors/sqla/views.py:227 -#: superset/views/core.py:374 superset/views/sql_lab.py:56 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:82 +#: superset/connectors/druid/views.py:127 +#: superset/connectors/druid/views.py:251 superset/connectors/sqla/views.py:78 +#: superset/connectors/sqla/views.py:129 superset/connectors/sqla/views.py:227 +#: superset/views/core.py:449 superset/views/sql_lab.py:55 msgid "Description" msgstr "Descrizione" -#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:85 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:86 msgid "Write a description for your query" msgstr "" -#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:99 -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:155 -#: superset/assets/javascripts/explore/components/SaveModal.jsx:222 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:100 +#: superset/assets/javascripts/dashboard/components/Controls.jsx:125 +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:151 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:220 msgid "Save" msgstr "" -#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:102 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:103 #: superset/templates/superset/request_access.html:16 msgid "Cancel" msgstr "Annulla" -#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:123 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:115 +#: superset/assets/javascripts/SqlLab/components/SaveQuery.jsx:119 msgid "Save Query" msgstr "" @@ -649,11 +895,11 @@ msgstr "" msgid "Query History" msgstr "" -#: superset/assets/javascripts/SqlLab/components/SqlEditor.jsx:123 +#: superset/assets/javascripts/SqlLab/components/SqlEditor.jsx:133 msgid "Create table as with query results" msgstr "" -#: superset/assets/javascripts/SqlLab/components/SqlEditor.jsx:131 +#: superset/assets/javascripts/SqlLab/components/SqlEditor.jsx:141 msgid "new table name" msgstr "" @@ -757,6 +1003,18 @@ msgstr "" msgid "Remove table preview" msgstr "" +#: superset/assets/javascripts/SqlLab/components/TemplateParamsEditor.jsx:102 +msgid "Template Parameters" +msgstr "" + +#: superset/assets/javascripts/SqlLab/components/TemplateParamsEditor.jsx:106 +msgid "Edit template parameters" +msgstr "" + +#: superset/assets/javascripts/SqlLab/components/TemplateParamsEditor.jsx:116 +msgid "Invalid JSON" +msgstr "" + #: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:90 #, python-format msgid "%s is not right as a column name, please alias it (as in SELECT count(*) " @@ -770,30 +1028,86 @@ msgstr "" msgid "using only alphanumeric characters and underscores" msgstr "" -#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:166 +#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:167 msgid "Creating a data source and popping a new tab" msgstr "" -#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:196 +#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:198 msgid "No results available for this query" msgstr "" -#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:248 +#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:250 msgid "Chart Type" msgstr "" -#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:251 +#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:253 msgid "[Chart Type]" msgstr "" -#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:259 +#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:261 msgid "Datasource Name" msgstr "" -#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:263 +#: superset/assets/javascripts/SqlLab/components/VisualizeModal.jsx:265 msgid "datasource name" msgstr "" +#: superset/assets/javascripts/addSlice/AddSliceContainer.jsx:54 +msgid "Create a new slice" +msgstr "" + +#: superset/assets/javascripts/addSlice/AddSliceContainer.jsx:59 +#: superset/assets/javascripts/addSlice/AddSliceContainer.jsx:65 +msgid "Choose a datasource" +msgstr "" + +#: superset/assets/javascripts/addSlice/AddSliceContainer.jsx:71 +#: superset/assets/javascripts/addSlice/AddSliceContainer.jsx:77 +msgid "Choose a visualization type" +msgstr "" + +#: superset/assets/javascripts/addSlice/AddSliceContainer.jsx:87 +msgid "Create new slice" +msgstr "" + +#: superset/assets/javascripts/chart/chartReducer.js:55 +msgid "Updating chart was stopped" +msgstr "L'aggiornamento del grafico è stato fermato" + +#: superset/assets/javascripts/chart/chartReducer.js:66 +#, python-format +msgid "An error occurred while rendering the visualization: %s" +msgstr "Errore nel rendering della visualizzazione: %s" + +#: superset/assets/javascripts/chart/chartReducer.js:74 +msgid "visualization queries are set to timeout at ${action.timeout} seconds. " +msgstr "" + +#: superset/assets/javascripts/chart/chartReducer.js:75 +msgid "" +"Perhaps your data has grown, your database is under unusual load, or you " +"are simply querying a data source that is too large to be processed " +"within the timeout range. If that is the case, we recommend that you " +"summarize your data further." +msgstr "" + +#: superset/assets/javascripts/chart/chartReducer.js:84 +#: superset/assets/javascripts/chart/chartReducer.js:134 +msgid "Network error." +msgstr "Errore di rete." + +#: superset/assets/javascripts/components/AlteredSliceTag.jsx:113 +msgid "Click to see difference" +msgstr "" + +#: superset/assets/javascripts/components/AlteredSliceTag.jsx:119 +msgid "Altered" +msgstr "" + +#: superset/assets/javascripts/components/AlteredSliceTag.jsx:137 +msgid "Slice changes" +msgstr "" + #: superset/assets/javascripts/components/AsyncSelect.jsx:23 #: superset/assets/javascripts/explore/components/controls/SelectAsyncControl.jsx:26 msgid "Select ..." @@ -812,107 +1126,132 @@ msgid "Click to force-refresh" msgstr "" #: superset/assets/javascripts/components/CopyToClipboard.jsx:21 -#: superset/assets/javascripts/explore/components/EmbedCodeButton.jsx:67 -#: superset/assets/javascripts/explore/components/URLShortLinkButton.jsx:37 +#: superset/assets/javascripts/explore/components/EmbedCodeButton.jsx:68 +#: superset/assets/javascripts/explore/components/URLShortLinkButton.jsx:38 msgid "Copy to clipboard" msgstr "" -#: superset/assets/javascripts/components/CopyToClipboard.jsx:65 +#: superset/assets/javascripts/components/CopyToClipboard.jsx:72 msgid "Not successful" msgstr "" -#: superset/assets/javascripts/components/CopyToClipboard.jsx:68 +#: superset/assets/javascripts/components/CopyToClipboard.jsx:75 msgid "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!" msgstr "" -#: superset/assets/javascripts/components/CopyToClipboard.jsx:79 +#: superset/assets/javascripts/components/CopyToClipboard.jsx:91 msgid "Copied!" msgstr "" -#: superset/assets/javascripts/components/EditableTitle.jsx:13 -#: superset/views/core.py:475 superset/views/core.py:542 +#: superset/assets/javascripts/components/EditableTitle.jsx:14 +#: superset/views/core.py:559 superset/views/core.py:629 msgid "Title" msgstr "Titolo" -#: superset/assets/javascripts/components/EditableTitle.jsx:92 +#: superset/assets/javascripts/components/EditableTitle.jsx:105 msgid "click to edit title" msgstr "" -#: superset/assets/javascripts/components/EditableTitle.jsx:93 +#: superset/assets/javascripts/components/EditableTitle.jsx:106 msgid "You don't have the rights to alter this title." msgstr "" -#: superset/assets/javascripts/components/FaveStar.jsx:32 -#: superset/assets/javascripts/modules/superset.js:33 +#: superset/assets/javascripts/components/FaveStar.jsx:33 msgid "Click to favorite/unfavorite" msgstr "" -#: superset/assets/javascripts/dashboard/Dashboard.jsx:42 -#: superset/assets/javascripts/dashboard/Dashboard.jsx:59 -msgid "You have unsaved changes." +#: superset/assets/javascripts/dashboard/components/CodeModal.jsx:35 +msgid "Active Dashboard Filters" msgstr "" -#: superset/assets/javascripts/dashboard/Dashboard.jsx:59 -msgid "Click the" +#: superset/assets/javascripts/dashboard/components/Controls.jsx:120 +#, python-format +msgid "Checkout this dashboard: %s" msgstr "" -#: superset/assets/javascripts/dashboard/Dashboard.jsx:61 -msgid "button on the top right to save your changes." +#: superset/assets/javascripts/dashboard/components/Controls.jsx:123 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:162 +msgid "Save as" +msgstr "Salva come" + +#: superset/assets/javascripts/dashboard/components/Controls.jsx:131 +msgid "Force Refresh" msgstr "" -#: superset/assets/javascripts/dashboard/Dashboard.jsx:164 -#, python-format -msgid "Served from data cached %s . Click to force refresh." +#: superset/assets/javascripts/dashboard/components/Controls.jsx:132 +msgid "Force refresh the whole dashboard" msgstr "" -#: superset/assets/javascripts/dashboard/Dashboard.jsx:169 -msgid "Click to force refresh" +#: superset/assets/javascripts/dashboard/components/Controls.jsx:140 +msgid "Set autorefresh" msgstr "" -#: superset/assets/javascripts/dashboard/Dashboard.jsx:353 -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:100 -msgid "Error" +#: superset/assets/javascripts/dashboard/components/Controls.jsx:141 +msgid "Set the auto-refresh interval for this session" msgstr "" -#: superset/assets/javascripts/dashboard/Dashboard.jsx:354 -#, python-format -msgid "Sorry, there was an error adding slices to this dashboard: %s" +#: superset/assets/javascripts/dashboard/components/Controls.jsx:155 +msgid "Save the dashboard" msgstr "" -#: superset/assets/javascripts/dashboard/components/CodeModal.jsx:35 -msgid "Active Dashboard Filters" +#: superset/assets/javascripts/dashboard/components/Controls.jsx:162 +msgid "Edit properties" msgstr "" -#: superset/assets/javascripts/dashboard/components/Controls.jsx:48 -#, python-format -msgid "Checkout this dashboard: %s" +#: superset/assets/javascripts/dashboard/components/Controls.jsx:163 +msgid "Edit the dashboards's properties" msgstr "" -#: superset/assets/javascripts/dashboard/components/Controls.jsx:54 -msgid "Force refresh the whole dashboard" +#: superset/assets/javascripts/dashboard/components/Controls.jsx:170 +msgid "Email" +msgstr "" + +#: superset/assets/javascripts/dashboard/components/Controls.jsx:171 +msgid "Email a link to this dashboard" +msgstr "" + +#: superset/assets/javascripts/dashboard/components/Controls.jsx:183 +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:196 +msgid "Add Slices" +msgstr "" + +#: superset/assets/javascripts/dashboard/components/Controls.jsx:184 +msgid "Add some slices to this dashboard" msgstr "" -#: superset/assets/javascripts/dashboard/components/Controls.jsx:94 -msgid "Edit this dashboard's properties" +#: superset/assets/javascripts/dashboard/components/Controls.jsx:195 +msgid "Edit CSS" msgstr "" -#: superset/assets/javascripts/dashboard/components/CssEditor.jsx:65 +#: superset/assets/javascripts/dashboard/components/Controls.jsx:196 +msgid "Change the style of the dashboard using CSS code" +msgstr "" + +#: superset/assets/javascripts/dashboard/components/CssEditor.jsx:45 msgid "Load a template" msgstr "" -#: superset/assets/javascripts/dashboard/components/CssEditor.jsx:68 +#: superset/assets/javascripts/dashboard/components/CssEditor.jsx:48 msgid "Load a CSS template" msgstr "" -#: superset/assets/javascripts/dashboard/components/CssEditor.jsx:80 -#: superset/views/core.py:482 +#: superset/assets/javascripts/dashboard/components/CssEditor.jsx:60 +#: superset/views/core.py:566 msgid "CSS" msgstr "CSS" -#: superset/assets/javascripts/dashboard/components/CssEditor.jsx:86 +#: superset/assets/javascripts/dashboard/components/CssEditor.jsx:66 msgid "Live CSS Editor" msgstr "" +#: superset/assets/javascripts/dashboard/components/Dashboard.jsx:157 +msgid "You have unsaved changes." +msgstr "" + +#: superset/assets/javascripts/dashboard/components/Header.jsx:49 +msgid "Unsaved changes" +msgstr "" + #: superset/assets/javascripts/dashboard/components/RefreshIntervalModal.jsx:19 msgid "Don't refresh" msgstr "" @@ -941,243 +1280,308 @@ msgstr "" msgid "Choose the refresh frequency for this dashboard" msgstr "" -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:63 +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:66 msgid "This dashboard was saved successfully." msgstr "" -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:69 +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:72 msgid "Sorry, there was an error saving this dashboard: " msgstr "" -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:101 +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:95 +msgid "Error" +msgstr "" + +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:96 msgid "You must pick a name for the new dashboard" msgstr "" -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:115 +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:111 msgid "Save Dashboard" msgstr "" -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:123 +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:119 #, python-format msgid "Overwrite Dashboard [%s]" msgstr "" -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:131 +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:127 msgid "Save as:" msgstr "" -#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:135 -#: superset/assets/javascripts/explore/components/SaveModal.jsx:210 +#: superset/assets/javascripts/dashboard/components/SaveModal.jsx:131 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:208 msgid "[dashboard name]" msgstr "" -#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:142 -#: superset/views/core.py:379 +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:73 +msgid "Sorry, there was an error fetching slices to this dashboard: " +msgstr "" + +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:93 +msgid "Sorry, there was an error adding slices to this dashboard: " +msgstr "" + +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:163 +#: superset/views/core.py:454 msgid "Name" msgstr "Nome" -#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:148 +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:169 msgid "Viz" msgstr "" -#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:157 -#: superset/views/core.py:480 superset/views/core.py:544 -#: superset/views/sql_lab.py:57 +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:177 +#: superset/assets/javascripts/explore/stores/controls.jsx:111 +#: superset/connectors/druid/views.py:45 superset/views/core.py:392 +#: superset/views/core.py:416 superset/views/core.py:448 +msgid "Datasource" +msgstr "Sorgente Dati" + +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:186 +#: superset/views/core.py:564 superset/views/core.py:631 +#: superset/views/sql_lab.py:56 msgid "Modified" msgstr "Modificato" -#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:167 -msgid "Add Slices" -msgstr "" - -#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:176 +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:205 msgid "Add a new slice to the dashboard" msgstr "" -#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:181 +#: superset/assets/javascripts/dashboard/components/SliceAdder.jsx:211 msgid "Add Slices to Dashboard" msgstr "" -#: superset/assets/javascripts/dashboard/components/SliceCell.jsx:37 -msgid "Move chart" +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:62 +#, python-format +msgid "Served from data cached %s . Click to force refresh." msgstr "" -#: superset/assets/javascripts/dashboard/components/SliceCell.jsx:40 +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:63 msgid "Force refresh data" msgstr "" -#: superset/assets/javascripts/dashboard/components/SliceCell.jsx:44 +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:64 +msgid "Annotation layers are still loading." +msgstr "" + +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:65 +msgid "One ore more annotation layers failed loading." +msgstr "" + +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:103 +msgid "Move chart" +msgstr "" + +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:123 msgid "Toggle chart description" msgstr "" -#: superset/assets/javascripts/dashboard/components/SliceCell.jsx:54 +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:133 msgid "Edit chart" msgstr "" -#: superset/assets/javascripts/dashboard/components/SliceCell.jsx:62 +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:142 msgid "Export CSV" -msgstr "" +msgstr "Esporta CSV" -#: superset/assets/javascripts/dashboard/components/SliceCell.jsx:70 +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:151 msgid "Explore chart" -msgstr "" +msgstr "Esplora grafico" -#: superset/assets/javascripts/dashboard/components/SliceCell.jsx:77 +#: superset/assets/javascripts/dashboard/components/SliceHeader.jsx:161 msgid "Remove chart from dashboard" -msgstr "" +msgstr "Rimuovi il grafico dalla dashboard" -#: superset/assets/javascripts/explore/components/ChartContainer.jsx:180 -#, python-format -msgid "%s - untitled" +#: superset/assets/javascripts/explore/validators.js:11 +msgid "is expected to be a number" msgstr "" -#: superset/assets/javascripts/explore/components/ChartContainer.jsx:287 -msgid "Edit slice properties" +#: superset/assets/javascripts/explore/validators.js:18 +msgid "is expected to be an integer" msgstr "" -#: superset/assets/javascripts/explore/components/ControlHeader.jsx:32 +#: superset/assets/javascripts/explore/validators.js:30 +msgid "cannot be empty" +msgstr "non può essere vuoto" + +#: superset/assets/javascripts/explore/components/ControlHeader.jsx:34 msgid "description" -msgstr "" +msgstr "descrizione" -#: superset/assets/javascripts/explore/components/ControlHeader.jsx:42 +#: superset/assets/javascripts/explore/components/ControlHeader.jsx:45 msgid "bolt" msgstr "" -#: superset/assets/javascripts/explore/components/DisplayQueryButton.jsx:61 -msgid "Error..." +#: superset/assets/javascripts/explore/components/ControlHeader.jsx:46 +msgid "Changing this control takes effect instantly" msgstr "" -#: superset/assets/javascripts/explore/components/DisplayQueryButton.jsx:97 +#: superset/assets/javascripts/explore/components/DisplayQueryButton.jsx:75 +msgid "Error..." +msgstr "Errore..." + +#: superset/assets/javascripts/explore/components/DisplayQueryButton.jsx:126 #: superset/assets/javascripts/explore/stores/visTypes.js:56 -#: superset/assets/javascripts/explore/stores/visTypes.js:137 -#: superset/assets/javascripts/explore/stores/visTypes.js:389 -#: superset/assets/javascripts/explore/stores/visTypes.js:436 -#: superset/assets/javascripts/explore/stores/visTypes.js:457 -#: superset/assets/javascripts/explore/stores/visTypes.js:485 -#: superset/assets/javascripts/explore/stores/visTypes.js:505 -#: superset/assets/javascripts/explore/stores/visTypes.js:526 -#: superset/assets/javascripts/explore/stores/visTypes.js:578 -#: superset/assets/javascripts/explore/stores/visTypes.js:600 -#: superset/assets/javascripts/explore/stores/visTypes.js:625 -#: superset/assets/javascripts/explore/stores/visTypes.js:650 -#: superset/assets/javascripts/explore/stores/visTypes.js:682 -#: superset/assets/javascripts/explore/stores/visTypes.js:719 -#: superset/assets/javascripts/explore/stores/visTypes.js:746 -#: superset/assets/javascripts/explore/stores/visTypes.js:773 -#: superset/assets/javascripts/explore/stores/visTypes.js:811 -#: superset/assets/javascripts/explore/stores/visTypes.js:844 -#: superset/assets/javascripts/explore/stores/visTypes.js:881 -#: superset/assets/javascripts/explore/stores/visTypes.js:924 -#: superset/assets/javascripts/explore/stores/visTypes.js:946 -#: superset/assets/javascripts/explore/stores/visTypes.js:1005 +#: superset/assets/javascripts/explore/stores/visTypes.js:100 +#: superset/assets/javascripts/explore/stores/visTypes.js:138 +#: superset/assets/javascripts/explore/stores/visTypes.js:204 +#: superset/assets/javascripts/explore/stores/visTypes.js:361 +#: superset/assets/javascripts/explore/stores/visTypes.js:399 +#: superset/assets/javascripts/explore/stores/visTypes.js:438 +#: superset/assets/javascripts/explore/stores/visTypes.js:471 +#: superset/assets/javascripts/explore/stores/visTypes.js:515 +#: superset/assets/javascripts/explore/stores/visTypes.js:554 +#: superset/assets/javascripts/explore/stores/visTypes.js:594 +#: superset/assets/javascripts/explore/stores/visTypes.js:632 +#: superset/assets/javascripts/explore/stores/visTypes.js:764 +#: superset/assets/javascripts/explore/stores/visTypes.js:804 +#: superset/assets/javascripts/explore/stores/visTypes.js:851 +#: superset/assets/javascripts/explore/stores/visTypes.js:873 +#: superset/assets/javascripts/explore/stores/visTypes.js:901 +#: superset/assets/javascripts/explore/stores/visTypes.js:921 +#: superset/assets/javascripts/explore/stores/visTypes.js:942 +#: superset/assets/javascripts/explore/stores/visTypes.js:994 +#: superset/assets/javascripts/explore/stores/visTypes.js:1016 +#: superset/assets/javascripts/explore/stores/visTypes.js:1041 +#: superset/assets/javascripts/explore/stores/visTypes.js:1066 +#: superset/assets/javascripts/explore/stores/visTypes.js:1098 +#: superset/assets/javascripts/explore/stores/visTypes.js:1136 +#: superset/assets/javascripts/explore/stores/visTypes.js:1163 +#: superset/assets/javascripts/explore/stores/visTypes.js:1190 +#: superset/assets/javascripts/explore/stores/visTypes.js:1228 +#: superset/assets/javascripts/explore/stores/visTypes.js:1262 +#: superset/assets/javascripts/explore/stores/visTypes.js:1299 +#: superset/assets/javascripts/explore/stores/visTypes.js:1339 +#: superset/assets/javascripts/explore/stores/visTypes.js:1361 +#: superset/assets/javascripts/explore/stores/visTypes.js:1421 msgid "Query" msgstr "" -#: superset/assets/javascripts/explore/components/EmbedCodeButton.jsx:76 +#: superset/assets/javascripts/explore/components/EmbedCodeButton.jsx:77 +#: superset/assets/javascripts/explore/stores/visTypes.js:388 +#: superset/assets/javascripts/explore/stores/visTypes.js:426 msgid "Height" msgstr "Altezza" -#: superset/assets/javascripts/explore/components/EmbedCodeButton.jsx:90 +#: superset/assets/javascripts/explore/components/EmbedCodeButton.jsx:91 msgid "Width" msgstr "Larghezza" -#: superset/assets/javascripts/explore/components/ExploreActionButtons.jsx:32 +#: superset/assets/javascripts/explore/components/ExploreActionButtons.jsx:37 msgid "Export to .json" msgstr "Esporta in .json" -#: superset/assets/javascripts/explore/components/ExploreActionButtons.jsx:42 +#: superset/assets/javascripts/explore/components/ExploreActionButtons.jsx:47 msgid "Export to .csv format" msgstr "Esporta nel formato .csv" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:74 -msgid "Please enter a slice name" -msgstr "Inserisci un nome per la slice" +#: superset/assets/javascripts/explore/components/ExploreChartHeader.jsx:64 +#, python-format +msgid "%s - untitled" +msgstr "%s - senza nome" + +#: superset/assets/javascripts/explore/components/ExploreChartHeader.jsx:100 +msgid "Edit slice properties" +msgstr "" + +#: superset/assets/javascripts/explore/components/RowCountLabel.jsx:25 +msgid "Limit reached" +msgstr "" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:89 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:73 +msgid "Please enter a slice name" +msgstr "Inserisci un nome per la slice" + +#: superset/assets/javascripts/explore/components/SaveModal.jsx:88 msgid "Please select a dashboard" msgstr "Seleziona una dashboard" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:97 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:96 msgid "Please enter a dashboard name" msgstr "Inserisci un nome per la dashboard" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:134 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:132 msgid "Save A Slice" msgstr "Salva una slice" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:155 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:153 #, python-format msgid "Overwrite slice %s" msgstr "Sovrascrivi la slice %s" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:164 -msgid "Save as" -msgstr "Salva come" - -#: superset/assets/javascripts/explore/components/SaveModal.jsx:168 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:166 msgid "[slice name]" msgstr "[nome slice]" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:181 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:179 msgid "Do not add to a dashboard" msgstr "Non aggiugere alla dashboard" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:189 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:187 msgid "Add slice to existing dashboard" msgstr "Aggiungi la slice alla dashboard esistente" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:205 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:203 msgid "Add to new dashboard" msgstr "Aggiungi ad una nuova dashboard" -#: superset/assets/javascripts/explore/components/SaveModal.jsx:231 +#: superset/assets/javascripts/explore/components/SaveModal.jsx:229 msgid "Save & go to dashboard" msgstr "Salva e vai alla dashboard" -#: superset/assets/javascripts/explore/components/URLShortLinkButton.jsx:32 +#: superset/assets/javascripts/explore/components/URLShortLinkButton.jsx:33 #, python-format msgid "Check out this slice: %s" msgstr "Guarda questa slice: %s" -#: superset/assets/javascripts/explore/components/controls/BoundsControl.jsx:55 +#: superset/assets/javascripts/explore/components/controls/AnnotationLayerControl.jsx:147 +msgid "Add Annotation Layer" +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/BoundsControl.jsx:50 msgid "`Min` value should be numeric or empty" msgstr "" -#: superset/assets/javascripts/explore/components/controls/BoundsControl.jsx:58 +#: superset/assets/javascripts/explore/components/controls/BoundsControl.jsx:53 msgid "`Max` value should be numeric or empty" msgstr "" -#: superset/assets/javascripts/explore/components/controls/BoundsControl.jsx:75 -#: superset/connectors/druid/views.py:50 superset/connectors/sqla/views.py:88 +#: superset/assets/javascripts/explore/components/controls/BoundsControl.jsx:70 +#: superset/connectors/druid/views.py:50 superset/connectors/sqla/views.py:84 msgid "Min" msgstr "Min" -#: superset/assets/javascripts/explore/components/controls/BoundsControl.jsx:83 -#: superset/connectors/druid/views.py:51 superset/connectors/sqla/views.py:89 +#: superset/assets/javascripts/explore/components/controls/BoundsControl.jsx:78 +#: superset/connectors/druid/views.py:51 superset/connectors/sqla/views.py:85 msgid "Max" msgstr "Max" -#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:70 +#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:79 msgid "Something went wrong while fetching the datasource list" msgstr "" -#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:95 -msgid "Click to point to another datasource" -msgstr "" - -#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:106 -msgid "Edit the datasource's configuration" -msgstr "" - -#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:122 +#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:110 msgid "Select a datasource" msgstr "Seleziona un datasource" -#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:132 +#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:120 #: superset/assets/javascripts/explore/components/controls/VizTypeControl.jsx:120 msgid "Search / Filter" msgstr "Cerca / Filtra" +#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:180 +msgid "Click to point to another datasource" +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:191 +msgid "Edit the datasource's configuration" +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/DatasourceControl.jsx:203 +msgid "Show datasource configuration" +msgstr "" + #: superset/assets/javascripts/explore/components/controls/Filter.jsx:114 msgid "Filter value" msgstr "Valore del filtro" @@ -1194,7 +1598,7 @@ msgstr "Seleziona una colonna" msgid "Select operator" msgstr "Seleziona operatore" -#: superset/assets/javascripts/explore/components/controls/FilterControl.jsx:138 +#: superset/assets/javascripts/explore/components/controls/FilterControl.jsx:145 #: superset/templates/appbuilder/general/widgets/search.html:6 msgid "Add Filter" msgstr "Aggiungi filtro" @@ -1203,20 +1607,46 @@ msgstr "Aggiungi filtro" msgid "Error while fetching data" msgstr "Errore nel recupero dati" -#: superset/assets/javascripts/explore/components/controls/SelectControl.jsx:106 +#: superset/assets/javascripts/explore/components/controls/SelectControl.jsx:109 #, python-format -msgid "Select %s" -msgstr "Seleziona %s" +msgid "%s option(s)" +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/SpatialControl.jsx:62 +msgid "Invalid lat/long configuration." +msgstr "" -#: superset/assets/javascripts/explore/components/controls/TextAreaControl.jsx:63 +#: superset/assets/javascripts/explore/components/controls/SpatialControl.jsx:128 +msgid "Longitude & Latitude columns" +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/SpatialControl.jsx:144 +msgid "Delimited long & lat single column" +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/SpatialControl.jsx:145 +msgid "" +"Multiple formats accepted, look the geopy.points Python library for more " +"details" +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/SpatialControl.jsx:157 +msgid "Reverse lat/long " +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/SpatialControl.jsx:163 +msgid "Geohash" +msgstr "" + +#: superset/assets/javascripts/explore/components/controls/TextAreaControl.jsx:70 msgid "textarea" msgstr "textarea" -#: superset/assets/javascripts/explore/components/controls/TextAreaControl.jsx:81 +#: superset/assets/javascripts/explore/components/controls/TextAreaControl.jsx:98 msgid "Edit" msgstr "Modifica" -#: superset/assets/javascripts/explore/components/controls/TextAreaControl.jsx:81 +#: superset/assets/javascripts/explore/components/controls/TextAreaControl.jsx:98 msgid "in modal" msgstr "in modale" @@ -1224,235 +1654,259 @@ msgstr "in modale" msgid "Select a visualization type" msgstr "Seleziona un tipo di visualizzazione" -#: superset/assets/javascripts/explore/reducers/chartReducer.js:32 -msgid "Updating chart was stopped" -msgstr "L'aggiornamento del grafico è stato fermato" - -#: superset/assets/javascripts/explore/reducers/chartReducer.js:38 -#: superset/assets/javascripts/modules/superset.js:223 -#, python-format -msgid "An error occurred while rendering the visualization: %s" -msgstr "Errore nel rendering della visualizzazione: %s" - -#: superset/assets/javascripts/explore/reducers/chartReducer.js:47 -msgid "" -"Perhaps your data has grown, your database is under unusual load, or you " -"are simply querying a data source that is to large to be processed within" -" the timeout range. If that is the case, we recommend that you summarize " -"your data further." -msgstr "" - -#: superset/assets/javascripts/explore/reducers/chartReducer.js:56 -msgid "Network error." -msgstr "Errore di rete." - -#: superset/assets/javascripts/explore/stores/controls.jsx:36 +#: superset/assets/javascripts/explore/stores/controls.jsx:41 msgid "A reference to the [Time] configuration, taking granularity into account" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:50 +#: superset/assets/javascripts/explore/stores/controls.jsx:55 msgid "Group by" msgstr "Raggruppa per" -#: superset/assets/javascripts/explore/stores/controls.jsx:53 +#: superset/assets/javascripts/explore/stores/controls.jsx:58 msgid "One or many controls to group by" msgstr "Uno o più controlli per 'Raggruppa per'" -#: superset/assets/javascripts/explore/stores/controls.jsx:72 -#: superset/connectors/druid/views.py:45 superset/views/core.py:318 -#: superset/views/core.py:342 superset/views/core.py:373 -msgid "Datasource" -msgstr "Sorgente Dati" +#: superset/assets/javascripts/explore/stores/controls.jsx:79 +msgid "" +"For more information about objects are in context in the scope of this " +"function, refer to the" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:81 +msgid " source code of Superset's sandboxed parser" +msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:82 -#: superset/views/core.py:381 +#: superset/assets/javascripts/explore/stores/controls.jsx:102 +msgid "This functionality is disabled in your environment for security reasons." +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:121 +#: superset/views/core.py:456 msgid "Visualization Type" msgstr "Tipo di Visualizzazione" -#: superset/assets/javascripts/explore/stores/controls.jsx:84 +#: superset/assets/javascripts/explore/stores/controls.jsx:123 msgid "The type of visualization to display" msgstr "Il tipo di visualizzazione da mostrare" -#: superset/assets/javascripts/explore/stores/controls.jsx:90 +#: superset/assets/javascripts/explore/stores/controls.jsx:129 msgid "Metrics" msgstr "Metriche" -#: superset/assets/javascripts/explore/stores/controls.jsx:99 -#: superset/assets/javascripts/explore/stores/controls.jsx:116 +#: superset/assets/javascripts/explore/stores/controls.jsx:138 +#: superset/assets/javascripts/explore/stores/controls.jsx:170 msgid "One or many metrics to display" msgstr "Una o più metriche da mostrare" -#: superset/assets/javascripts/explore/stores/controls.jsx:103 +#: superset/assets/javascripts/explore/stores/controls.jsx:144 +msgid "Percentage Metrics" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:151 +msgid "Metrics for which percentage of total are to be displayed" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:156 msgid "Y Axis Bounds" msgstr "Limite asse Y" -#: superset/assets/javascripts/explore/stores/controls.jsx:106 +#: superset/assets/javascripts/explore/stores/controls.jsx:159 msgid "" "Bounds for the Y axis. When left empty, the bounds are dynamically " "defined based on the min/max of the data. Note that this feature will " "only expand the axis range. It won't narrow the data's extent." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:114 +#: superset/assets/javascripts/explore/stores/controls.jsx:168 msgid "Ordering" msgstr "Ordina per" -#: superset/assets/javascripts/explore/stores/controls.jsx:125 -#: superset/views/annotations.py:47 -msgid "Annotation Layers" +#: superset/assets/javascripts/explore/stores/controls.jsx:176 +msgid "Fixed Color" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:127 -msgid "Annotation layers to overlay on the visualization" +#: superset/assets/javascripts/explore/stores/controls.jsx:177 +msgid "Use this to define a static color for all circles" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:129 -msgid "Select a annotation layer" +#: superset/assets/javascripts/explore/stores/controls.jsx:184 +msgid "Fill Color" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:130 -msgid "Error while fetching annotation layers" +#: superset/assets/javascripts/explore/stores/controls.jsx:185 +#: superset/assets/javascripts/explore/stores/controls.jsx:193 +msgid "" +" Set the opacity to 0 if you do not want to override the color specified " +"in the GeoJSON" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:192 +msgid "Stroke Color" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:141 -#: superset/assets/javascripts/explore/stores/visTypes.js:832 -#: superset/connectors/druid/views.py:106 superset/connectors/sqla/views.py:130 +#: superset/assets/javascripts/explore/stores/controls.jsx:201 +#: superset/assets/javascripts/explore/stores/visTypes.js:1250 +#: superset/connectors/druid/views.py:126 superset/connectors/sqla/views.py:128 msgid "Metric" msgstr "Metrica" -#: superset/assets/javascripts/explore/stores/controls.jsx:143 +#: superset/assets/javascripts/explore/stores/controls.jsx:203 msgid "Choose the metric" msgstr "Seleziona la metrica" -#: superset/assets/javascripts/explore/stores/controls.jsx:156 +#: superset/assets/javascripts/explore/stores/controls.jsx:216 msgid "Right Axis Metric" msgstr "Metrica asse destro" -#: superset/assets/javascripts/explore/stores/controls.jsx:160 +#: superset/assets/javascripts/explore/stores/controls.jsx:220 msgid "Choose a metric for right axis" msgstr "Seleziona una metrica per l'asse destro" -#: superset/assets/javascripts/explore/stores/controls.jsx:171 +#: superset/assets/javascripts/explore/stores/controls.jsx:231 msgid "Stacked Style" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:199 +#: superset/assets/javascripts/explore/stores/controls.jsx:243 +msgid "Sort X Axis" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:251 +msgid "Sort Y Axis" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:259 msgid "Linear Color Scheme" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:216 +#: superset/assets/javascripts/explore/stores/controls.jsx:278 msgid "Normalize Across" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:223 +#: superset/assets/javascripts/explore/stores/controls.jsx:285 msgid "" "Color will be rendered based on a ratio of the cell against the sum of " "across this criteria" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:230 +#: superset/assets/javascripts/explore/stores/controls.jsx:292 msgid "Horizon Color Scale" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:237 +#: superset/assets/javascripts/explore/stores/controls.jsx:299 msgid "Defines how the color are attributed." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:242 +#: superset/assets/javascripts/explore/stores/controls.jsx:304 msgid "Rendering" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:249 +#: superset/assets/javascripts/explore/stores/controls.jsx:311 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:255 +#: superset/assets/javascripts/explore/stores/controls.jsx:317 msgid "XScale Interval" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:258 +#: superset/assets/javascripts/explore/stores/controls.jsx:320 msgid "Number of steps to take between ticks when displaying the X scale" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:264 +#: superset/assets/javascripts/explore/stores/controls.jsx:326 msgid "YScale Interval" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:267 +#: superset/assets/javascripts/explore/stores/controls.jsx:329 msgid "Number of steps to take between ticks when displaying the Y scale" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:273 +#: superset/assets/javascripts/explore/stores/controls.jsx:335 msgid "Include Time" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:274 +#: superset/assets/javascripts/explore/stores/controls.jsx:336 msgid "Whether to include the time granularity as defined in the time section" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:288 +#: superset/assets/javascripts/explore/stores/controls.jsx:342 +msgid "Auto Zoom" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:345 +msgid "When checked, the map will zoom to your data after each query" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:350 +msgid "Show percentage" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:352 +msgid "Whether to include the percentage in the tooltip" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:358 msgid "Stacked Bars" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:296 +#: superset/assets/javascripts/explore/stores/controls.jsx:366 msgid "Show totals" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:299 +#: superset/assets/javascripts/explore/stores/controls.jsx:369 msgid "Display total row/column" msgstr "Mostra totali riga/colonna" -#: superset/assets/javascripts/explore/stores/controls.jsx:304 +#: superset/assets/javascripts/explore/stores/controls.jsx:374 msgid "Show Markers" msgstr "Mostra marcatori" -#: superset/assets/javascripts/explore/stores/controls.jsx:307 +#: superset/assets/javascripts/explore/stores/controls.jsx:377 msgid "Show data points as circle markers on the lines" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:312 +#: superset/assets/javascripts/explore/stores/controls.jsx:382 msgid "Bar Values" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:315 +#: superset/assets/javascripts/explore/stores/controls.jsx:385 msgid "Show the value on top of the bar" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:320 +#: superset/assets/javascripts/explore/stores/controls.jsx:390 msgid "Sort Bars" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:322 +#: superset/assets/javascripts/explore/stores/controls.jsx:392 msgid "Sort bars by x labels." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:327 +#: superset/assets/javascripts/explore/stores/controls.jsx:397 msgid "Combine Metrics" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:329 +#: superset/assets/javascripts/explore/stores/controls.jsx:399 msgid "" "Display metrics side by side within each column, as opposed to each " "column being displayed side by side for each metric." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:335 +#: superset/assets/javascripts/explore/stores/controls.jsx:405 msgid "Extra Controls" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:338 +#: superset/assets/javascripts/explore/stores/controls.jsx:408 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:345 +#: superset/assets/javascripts/explore/stores/controls.jsx:415 msgid "Reduce X ticks" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:348 +#: superset/assets/javascripts/explore/stores/controls.jsx:418 msgid "" "Reduces the number of X axis ticks to be rendered. If true, the x axis " "wont overflow and labels may be missing. If false, a minimum width will " @@ -1460,137 +1914,219 @@ msgid "" "scroll." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:357 +#: superset/assets/javascripts/explore/stores/controls.jsx:427 msgid "Include Series" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:360 +#: superset/assets/javascripts/explore/stores/controls.jsx:430 msgid "Include series name as an axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:365 +#: superset/assets/javascripts/explore/stores/controls.jsx:435 msgid "Color Metric" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:367 +#: superset/assets/javascripts/explore/stores/controls.jsx:437 msgid "A metric to use for color" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:374 +#: superset/assets/javascripts/explore/stores/controls.jsx:444 msgid "Country Name" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:393 +#: superset/assets/javascripts/explore/stores/controls.jsx:463 msgid "The name of country that Superset should display" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:397 +#: superset/assets/javascripts/explore/stores/controls.jsx:467 msgid "Country Field Type" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:405 +#: superset/assets/javascripts/explore/stores/controls.jsx:475 msgid "" "The country code standard that Superset should expect to find in the " "[country] column" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:412 -#: superset/assets/javascripts/explore/stores/controls.jsx:419 +#: superset/assets/javascripts/explore/stores/controls.jsx:481 +msgid "Frequency" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:493 +msgid "" +"The periodicity over which to pivot time. Users can provide\n" +" \"Pandas\" offset alias.\n" +" Click on the info bubble for more details on accepted \"freq\" " +"expressions." +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:506 +msgid "Dimension" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:507 +msgid "Select a dimension" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:513 +#: superset/assets/javascripts/explore/stores/controls.jsx:520 msgid "Columns" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:413 +#: superset/assets/javascripts/explore/stores/controls.jsx:514 msgid "One or many controls to pivot as columns" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:421 -#: superset/assets/javascripts/explore/stores/controls.jsx:431 -#: superset/assets/javascripts/explore/stores/controls.jsx:441 +#: superset/assets/javascripts/explore/stores/controls.jsx:522 +#: superset/assets/javascripts/explore/stores/controls.jsx:622 +#: superset/assets/javascripts/explore/stores/controls.jsx:632 msgid "Columns to display" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:450 +#: superset/assets/javascripts/explore/stores/controls.jsx:530 +msgid "Longitude & Latitude" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:532 +#: superset/assets/javascripts/explore/stores/controls.jsx:542 +#: superset/assets/javascripts/explore/stores/controls.jsx:552 +msgid "Point to your spatial columns" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:540 +msgid "Start Longitude & Latitude" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:550 +msgid "End Longitude & Latitude" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:560 +#: superset/assets/javascripts/explore/stores/visTypes.js:1463 +msgid "Longitude" +msgstr "Longitudine" + +#: superset/assets/javascripts/explore/stores/controls.jsx:563 +msgid "Select the longitude column" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:571 +#: superset/assets/javascripts/explore/stores/visTypes.js:1467 +msgid "Latitude" +msgstr "Latitudine" + +#: superset/assets/javascripts/explore/stores/controls.jsx:574 +msgid "Select the latitude column" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:582 +msgid "GeoJson Column" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:584 +msgid "Select the geojson column" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:592 +msgid "Polygon Column" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:594 +msgid "" +"Select the polygon column. Each row should contain JSON.array(N) of " +"[longitude, latitude] points" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:603 +msgid "Point Radius Scale" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:612 +msgid "Stroke Width" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:641 msgid "Origin" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:456 +#: superset/assets/javascripts/explore/stores/controls.jsx:647 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "`now`, `sunday` or `1970-01-01`" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:463 +#: superset/assets/javascripts/explore/stores/controls.jsx:654 msgid "Bottom Margin" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:467 +#: superset/assets/javascripts/explore/stores/controls.jsx:658 msgid "Bottom margin, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:473 +#: superset/assets/javascripts/explore/stores/controls.jsx:664 msgid "Left Margin" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:477 +#: superset/assets/javascripts/explore/stores/controls.jsx:668 msgid "Left margin, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:483 +#: superset/assets/javascripts/explore/stores/controls.jsx:674 msgid "Time Granularity" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:500 +#: superset/assets/javascripts/explore/stores/controls.jsx:691 msgid "" "The time granularity for the visualization. Note that you can type and " "use simple natural language as in `10 seconds`, `1 day` or `56 weeks`" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:507 +#: superset/assets/javascripts/explore/stores/controls.jsx:698 msgid "Domain" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:510 +#: superset/assets/javascripts/explore/stores/controls.jsx:701 msgid "The time unit used for the grouping of blocks" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:515 +#: superset/assets/javascripts/explore/stores/controls.jsx:706 msgid "Subdomain" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:518 +#: superset/assets/javascripts/explore/stores/controls.jsx:709 msgid "" "The time unit for each block. Should be a smaller unit than " "domain_granularity. Should be larger or equal to Time Grain" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:525 +#: superset/assets/javascripts/explore/stores/controls.jsx:716 msgid "Link Length" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:528 +#: superset/assets/javascripts/explore/stores/controls.jsx:719 msgid "Link length in the force layout" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:534 +#: superset/assets/javascripts/explore/stores/controls.jsx:725 msgid "Charge" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:548 +#: superset/assets/javascripts/explore/stores/controls.jsx:739 msgid "Charge in the force layout" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:556 +#: superset/assets/javascripts/explore/stores/controls.jsx:745 msgid "" "The time column for the visualization. Note that you can define arbitrary" -" expression that return a DATETIME column in the table or. Also note that" -" the filter below is applied against this column or expression" +" expression that return a DATETIME column in the table. Also note that " +"the filter below is applied against this column or expression" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:568 +#: superset/assets/javascripts/explore/stores/controls.jsx:771 msgid "Time Grain" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:570 +#: superset/assets/javascripts/explore/stores/controls.jsx:773 msgid "" "The time granularity for the visualization. This applies a date " "transformation to alter your time column and defines a new time " @@ -1598,114 +2134,144 @@ msgid "" "in the Superset source code." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:583 +#: superset/assets/javascripts/explore/stores/controls.jsx:786 msgid "Resample Rule" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:586 +#: superset/assets/javascripts/explore/stores/controls.jsx:789 msgid "Pandas resample rule" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:592 +#: superset/assets/javascripts/explore/stores/controls.jsx:795 msgid "Resample How" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:595 +#: superset/assets/javascripts/explore/stores/controls.jsx:798 msgid "Pandas resample how" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:601 +#: superset/assets/javascripts/explore/stores/controls.jsx:804 msgid "Resample Fill Method" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:604 +#: superset/assets/javascripts/explore/stores/controls.jsx:807 msgid "Pandas resample fill method" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:610 +#: superset/assets/javascripts/explore/stores/controls.jsx:813 +#: superset/assets/visualizations/filter_box.jsx:114 msgid "Since" msgstr "Data inizio" -#: superset/assets/javascripts/explore/stores/controls.jsx:611 +#: superset/assets/javascripts/explore/stores/controls.jsx:814 msgid "7 days ago" msgstr "7 giorni" -#: superset/assets/javascripts/explore/stores/controls.jsx:617 +#: superset/assets/javascripts/explore/stores/controls.jsx:820 +#: superset/assets/visualizations/filter_box.jsx:123 msgid "Until" msgstr "Data fine" -#: superset/assets/javascripts/explore/stores/controls.jsx:624 +#: superset/assets/javascripts/explore/stores/controls.jsx:827 msgid "Max Bubble Size" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:632 +#: superset/assets/javascripts/explore/stores/controls.jsx:835 msgid "Whisker/outlier options" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:634 +#: superset/assets/javascripts/explore/stores/controls.jsx:837 msgid "Determines how whiskers and outliers are calculated." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:645 +#: superset/assets/javascripts/explore/stores/controls.jsx:848 msgid "Ratio" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:648 +#: superset/assets/javascripts/explore/stores/controls.jsx:851 msgid "Target aspect ratio for treemap tiles." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:654 -#: superset/assets/javascripts/explore/stores/visTypes.js:616 -#: superset/assets/javascripts/explore/stores/visTypes.js:641 -#: superset/assets/javascripts/explore/stores/visTypes.js:790 +#: superset/assets/javascripts/explore/stores/controls.jsx:857 +#: superset/assets/javascripts/explore/stores/visTypes.js:1032 +#: superset/assets/javascripts/explore/stores/visTypes.js:1057 +#: superset/assets/javascripts/explore/stores/visTypes.js:1207 msgid "Number format" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:664 +#: superset/assets/javascripts/explore/stores/controls.jsx:867 msgid "Row limit" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:672 +#: superset/assets/javascripts/explore/stores/controls.jsx:876 msgid "Series limit" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:675 -msgid "Limits the number of time series that get displayed" +#: superset/assets/javascripts/explore/stores/controls.jsx:879 +msgid "" +"Limits the number of time series that get displayed. A sub query (or an " +"extra phase where sub queries are not supported) is applied to limit the " +"number of time series that get fetched and displayed. This feature is " +"useful when grouping by high cardinality dimension(s)." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:680 +#: superset/assets/javascripts/explore/stores/controls.jsx:888 msgid "Sort By" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:682 +#: superset/assets/javascripts/explore/stores/controls.jsx:890 msgid "Metric used to define the top series" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:697 +#: superset/assets/javascripts/explore/stores/controls.jsx:898 +msgid "Sort Descending" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:900 +msgid "Whether to sort descending or ascending" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:905 msgid "Rolling" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:700 +#: superset/assets/javascripts/explore/stores/controls.jsx:908 msgid "" "Defines a rolling window function to apply, works along with the " "[Periods] text box" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:706 +#: superset/assets/javascripts/explore/stores/controls.jsx:914 +msgid "Multiplier" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:918 +msgid "Factor to multiply the metric by" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:923 msgid "Periods" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:708 +#: superset/assets/javascripts/explore/stores/controls.jsx:925 msgid "" "Defines the size of the rolling window function, relative to the time " "granularity selected" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:714 +#: superset/assets/javascripts/explore/stores/controls.jsx:931 +msgid "Grid Size" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:935 +msgid "Defines the grid size in pixels" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:940 msgid "Min Periods" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:716 +#: superset/assets/javascripts/explore/stores/controls.jsx:942 msgid "" "The minimum number of rolling periods required to show a value. For " "instance if you do a cumulative sum on 7 days you may want your \"Min " @@ -1714,561 +2280,904 @@ msgid "" "periods" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:725 -#: superset/assets/javascripts/explore/stores/visTypes.js:123 +#: superset/assets/javascripts/explore/stores/controls.jsx:951 +#: superset/assets/javascripts/explore/stores/visTypes.js:124 msgid "Series" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:727 +#: superset/assets/javascripts/explore/stores/controls.jsx:953 msgid "" "Defines the grouping of entities. Each series is shown as a specific " "color on the chart and has a legend toggle" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:737 +#: superset/assets/javascripts/explore/stores/controls.jsx:963 msgid "Entity" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:740 +#: superset/assets/javascripts/explore/stores/controls.jsx:966 msgid "This defines the element to be plotted on the chart" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:748 -#: superset/assets/javascripts/explore/stores/visTypes.js:172 -#: superset/assets/javascripts/explore/stores/visTypes.js:547 +#: superset/assets/javascripts/explore/stores/controls.jsx:974 +#: superset/assets/javascripts/explore/stores/visTypes.js:173 +#: superset/assets/javascripts/explore/stores/visTypes.js:219 +#: superset/assets/javascripts/explore/stores/visTypes.js:963 msgid "X Axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:749 +#: superset/assets/javascripts/explore/stores/controls.jsx:975 msgid "Metric assigned to the [X] axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:762 -#: superset/assets/javascripts/explore/stores/visTypes.js:179 -#: superset/assets/javascripts/explore/stores/visTypes.js:555 +#: superset/assets/javascripts/explore/stores/controls.jsx:988 +#: superset/assets/javascripts/explore/stores/visTypes.js:180 +#: superset/assets/javascripts/explore/stores/visTypes.js:226 +#: superset/assets/javascripts/explore/stores/visTypes.js:971 msgid "Y Axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:765 +#: superset/assets/javascripts/explore/stores/controls.jsx:991 msgid "Metric assigned to the [Y] axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:776 +#: superset/assets/javascripts/explore/stores/controls.jsx:1002 msgid "Bubble Size" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:789 +#: superset/assets/javascripts/explore/stores/controls.jsx:1015 msgid "URL" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:790 +#: superset/assets/javascripts/explore/stores/controls.jsx:1016 msgid "" "The URL, this control is templated, so you can integrate {{ width }} " "and/or {{ height }} in your URL string." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:797 +#: superset/assets/javascripts/explore/stores/controls.jsx:1023 msgid "X Axis Label" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:804 +#: superset/assets/javascripts/explore/stores/controls.jsx:1030 msgid "Y Axis Label" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:811 +#: superset/assets/javascripts/explore/stores/controls.jsx:1037 msgid "Custom WHERE clause" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:813 +#: superset/assets/javascripts/explore/stores/controls.jsx:1043 msgid "" "The text in this box gets included in your query's WHERE clause, as an " "AND to other criteria. You can include complex expression, parenthesis " "and anything else supported by the backend it is directed towards." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:821 +#: superset/assets/javascripts/explore/stores/controls.jsx:1051 msgid "Custom HAVING clause" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:823 +#: superset/assets/javascripts/explore/stores/controls.jsx:1057 msgid "" "The text in this box gets included in your query's HAVING clause, as an " "AND to other criteria. You can include complex expression, parenthesis " "and anything else supported by the backend it is directed towards." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:831 +#: superset/assets/javascripts/explore/stores/controls.jsx:1065 msgid "Comparison Period Lag" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:833 +#: superset/assets/javascripts/explore/stores/controls.jsx:1067 msgid "Based on granularity, number of time periods to compare against" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:838 +#: superset/assets/javascripts/explore/stores/controls.jsx:1072 msgid "Comparison suffix" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:839 +#: superset/assets/javascripts/explore/stores/controls.jsx:1073 msgid "Suffix to apply after the percentage display" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:845 +#: superset/assets/javascripts/explore/stores/controls.jsx:1079 msgid "Table Timestamp Format" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:850 +#: superset/assets/javascripts/explore/stores/controls.jsx:1084 msgid "Timestamp Format" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:856 +#: superset/assets/javascripts/explore/stores/controls.jsx:1090 msgid "Series Height" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:859 +#: superset/assets/javascripts/explore/stores/controls.jsx:1093 msgid "Pixel height of each series" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:865 +#: superset/assets/javascripts/explore/stores/controls.jsx:1099 msgid "Page Length" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:868 +#: superset/assets/javascripts/explore/stores/controls.jsx:1102 msgid "Rows per page, 0 means no pagination" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:874 -#: superset/assets/javascripts/explore/stores/controls.jsx:884 +#: superset/assets/javascripts/explore/stores/controls.jsx:1108 +#: superset/assets/javascripts/explore/stores/controls.jsx:1118 msgid "X Axis Format" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:894 +#: superset/assets/javascripts/explore/stores/controls.jsx:1128 msgid "Y Axis Format" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:904 +#: superset/assets/javascripts/explore/stores/controls.jsx:1138 msgid "Right Axis Format" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:912 +#: superset/assets/javascripts/explore/stores/controls.jsx:1147 +msgid "Date Time Format" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1156 msgid "Markup Type" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:917 +#: superset/assets/javascripts/explore/stores/controls.jsx:1161 msgid "Pick your favorite markup language" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:922 +#: superset/assets/javascripts/explore/stores/controls.jsx:1166 msgid "Rotation" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:925 +#: superset/assets/javascripts/explore/stores/controls.jsx:1169 msgid "Rotation to apply to words in the cloud" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:930 +#: superset/assets/javascripts/explore/stores/controls.jsx:1174 msgid "Line Style" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:935 +#: superset/assets/javascripts/explore/stores/controls.jsx:1179 msgid "Line interpolation as defined by d3.js" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:940 +#: superset/assets/javascripts/explore/stores/controls.jsx:1184 msgid "Label Type" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:949 +#: superset/assets/javascripts/explore/stores/controls.jsx:1193 msgid "What should be shown on the label?" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:954 -#: superset/assets/javascripts/explore/stores/visTypes.js:376 -#: superset/assets/javascripts/explore/stores/visTypes.js:414 +#: superset/assets/javascripts/explore/stores/controls.jsx:1198 +#: superset/assets/javascripts/explore/stores/visTypes.js:790 +#: superset/assets/javascripts/explore/stores/visTypes.js:829 msgid "Code" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:955 +#: superset/assets/javascripts/explore/stores/controls.jsx:1199 msgid "Put your code here" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:964 +#: superset/assets/javascripts/explore/stores/controls.jsx:1208 msgid "Aggregation function" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:976 +#: superset/assets/javascripts/explore/stores/controls.jsx:1220 msgid "" "Aggregate function to apply when pivoting and computing the total rows " "and columns" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:983 +#: superset/assets/javascripts/explore/stores/controls.jsx:1227 msgid "Font Size From" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:985 +#: superset/assets/javascripts/explore/stores/controls.jsx:1229 msgid "Font size for the smallest value in the list" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:991 +#: superset/assets/javascripts/explore/stores/controls.jsx:1235 msgid "Font Size To" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:993 +#: superset/assets/javascripts/explore/stores/controls.jsx:1237 msgid "Font size for the biggest value in the list" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:998 +#: superset/assets/javascripts/explore/stores/controls.jsx:1242 msgid "Instant Filtering" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1009 +#: superset/assets/javascripts/explore/stores/controls.jsx:1253 +msgid "Extruded" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1261 msgid "Range Filter" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1012 +#: superset/assets/javascripts/explore/stores/controls.jsx:1264 msgid "Whether to display the time range interactive selector" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1017 +#: superset/assets/javascripts/explore/stores/controls.jsx:1269 msgid "Date Filter" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1019 +#: superset/assets/javascripts/explore/stores/controls.jsx:1271 msgid "Whether to include a time filter" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1024 +#: superset/assets/javascripts/explore/stores/controls.jsx:1276 +msgid "Show SQL Granularity Dropdown" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1278 +msgid "Check to include SQL Granularity dropdown" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1283 +msgid "Show SQL Time Column" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1285 +msgid "Check to include Time Column dropdown" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1290 +msgid "Show Druid Granularity Dropdown" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1292 +msgid "Check to include Druid Granularity dropdown" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1297 +msgid "Show Druid Time Origin" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1299 +msgid "Check to include Time Origin dropdown" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1304 msgid "Data Table" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1026 +#: superset/assets/javascripts/explore/stores/controls.jsx:1306 msgid "Whether to display the interactive data table" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1031 +#: superset/assets/javascripts/explore/stores/controls.jsx:1311 msgid "Search Box" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1034 +#: superset/assets/javascripts/explore/stores/controls.jsx:1314 msgid "Whether to include a client side search box" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1039 +#: superset/assets/javascripts/explore/stores/controls.jsx:1319 msgid "Table Filter" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1041 +#: superset/assets/javascripts/explore/stores/controls.jsx:1321 msgid "Whether to apply filter when table cell is clicked" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1046 +#: superset/assets/javascripts/explore/stores/controls.jsx:1326 msgid "Show Bubbles" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1049 +#: superset/assets/javascripts/explore/stores/controls.jsx:1329 msgid "Whether to display bubbles on top of countries" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1054 +#: superset/assets/javascripts/explore/stores/controls.jsx:1334 msgid "Legend" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1057 +#: superset/assets/javascripts/explore/stores/controls.jsx:1337 msgid "Whether to display the legend (toggles)" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1062 +#: superset/assets/javascripts/explore/stores/controls.jsx:1342 +msgid "Show Values" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1345 +msgid "Whether to display the numerical values within the cells" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1350 msgid "X bounds" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1065 +#: superset/assets/javascripts/explore/stores/controls.jsx:1353 msgid "Whether to display the min and max values of the X axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1070 +#: superset/assets/javascripts/explore/stores/controls.jsx:1358 msgid "Y bounds" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1073 +#: superset/assets/javascripts/explore/stores/controls.jsx:1361 msgid "Whether to display the min and max values of the Y axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1078 +#: superset/assets/javascripts/explore/stores/controls.jsx:1366 msgid "Rich Tooltip" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1081 +#: superset/assets/javascripts/explore/stores/controls.jsx:1369 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1087 +#: superset/assets/javascripts/explore/stores/controls.jsx:1375 msgid "Y Log Scale" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1090 +#: superset/assets/javascripts/explore/stores/controls.jsx:1378 msgid "Use a log scale for the Y axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1095 +#: superset/assets/javascripts/explore/stores/controls.jsx:1383 msgid "X Log Scale" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1098 +#: superset/assets/javascripts/explore/stores/controls.jsx:1386 msgid "Use a log scale for the X axis" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1103 +#: superset/assets/javascripts/explore/stores/controls.jsx:1391 +msgid "Log Scale" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1394 +msgid "Use a log scale" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1399 msgid "Donut" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1106 +#: superset/assets/javascripts/explore/stores/controls.jsx:1402 msgid "Do you want a donut or a pie?" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1111 +#: superset/assets/javascripts/explore/stores/controls.jsx:1407 msgid "Put labels outside" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1114 +#: superset/assets/javascripts/explore/stores/controls.jsx:1410 msgid "Put the labels outside the pie?" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1119 +#: superset/assets/javascripts/explore/stores/controls.jsx:1415 msgid "Contribution" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1121 +#: superset/assets/javascripts/explore/stores/controls.jsx:1417 msgid "Compute the contribution to the total" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1126 +#: superset/assets/javascripts/explore/stores/controls.jsx:1422 msgid "Period Ratio" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1129 +#: superset/assets/javascripts/explore/stores/controls.jsx:1425 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1135 +#: superset/assets/javascripts/explore/stores/controls.jsx:1431 msgid "Period Ratio Type" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1138 +#: superset/assets/javascripts/explore/stores/controls.jsx:1434 msgid "" "`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " "is (new-previous)" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1144 +#: superset/assets/javascripts/explore/stores/controls.jsx:1440 msgid "Time Shift" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1146 +#: superset/assets/javascripts/explore/stores/controls.jsx:1442 msgid "" "Overlay a timeseries from a relative time period. Expects relative time " "delta in natural language (example: 24 hours, 7 days, 56 weeks, 365 " "days)" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1154 +#: superset/assets/javascripts/explore/stores/controls.jsx:1450 msgid "Subheader" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1155 +#: superset/assets/javascripts/explore/stores/controls.jsx:1451 msgid "Description text that shows up below your Big Number" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1161 +#: superset/assets/javascripts/explore/stores/controls.jsx:1457 msgid "label" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1163 +#: superset/assets/javascripts/explore/stores/controls.jsx:1459 msgid "" "`count` is COUNT(*) if a group by is used. Numerical columns will be " "aggregated with the aggregator. Non-numerical columns will be used to " "label points. Leave empty to get a count of points in each cluster." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1174 +#: superset/assets/javascripts/explore/stores/controls.jsx:1470 msgid "Map Style" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1184 +#: superset/assets/javascripts/explore/stores/controls.jsx:1482 msgid "Base layer map style" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1190 +#: superset/assets/javascripts/explore/stores/controls.jsx:1488 msgid "Clustering Radius" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1203 +#: superset/assets/javascripts/explore/stores/controls.jsx:1501 msgid "" "The radius (in pixels) the algorithm uses to define a cluster. Choose 0 " "to turn off clustering, but beware that a large number of points (>1000) " "will cause lag." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1210 +#: superset/assets/javascripts/explore/stores/controls.jsx:1508 +#: superset/assets/javascripts/explore/stores/visTypes.js:648 +msgid "Point Size" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1510 +msgid "Fixed point radius" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1518 msgid "Point Radius" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1212 +#: superset/assets/javascripts/explore/stores/controls.jsx:1520 msgid "" "The radius of individual points (ones that are not in a cluster). Either " "a numerical column or `Auto`, which scales the point based on the largest" " cluster" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1222 +#: superset/assets/javascripts/explore/stores/controls.jsx:1530 msgid "Point Radius Unit" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1225 +#: superset/assets/javascripts/explore/stores/controls.jsx:1533 +#: superset/assets/javascripts/explore/stores/controls.jsx:1549 msgid "The unit of measure for the specified point radius" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1230 +#: superset/assets/javascripts/explore/stores/controls.jsx:1538 +msgid "Point Unit" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1554 msgid "Opacity" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1233 +#: superset/assets/javascripts/explore/stores/controls.jsx:1557 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1239 +#: superset/assets/javascripts/explore/stores/controls.jsx:1563 +#: superset/assets/javascripts/explore/stores/visTypes.js:1454 +msgid "Viewport" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1565 +msgid "Parameters related to the view and perspective on the map" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1572 msgid "Zoom" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1242 +#: superset/assets/javascripts/explore/stores/controls.jsx:1575 msgid "Zoom level of the map" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1248 +#: superset/assets/javascripts/explore/stores/controls.jsx:1581 msgid "Default latitude" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1251 +#: superset/assets/javascripts/explore/stores/controls.jsx:1584 msgid "Latitude of default viewport" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1257 +#: superset/assets/javascripts/explore/stores/controls.jsx:1590 msgid "Default longitude" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1260 +#: superset/assets/javascripts/explore/stores/controls.jsx:1593 msgid "Longitude of default viewport" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1266 +#: superset/assets/javascripts/explore/stores/controls.jsx:1599 msgid "Live render" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1268 +#: superset/assets/javascripts/explore/stores/controls.jsx:1601 msgid "Points and clusters will update as viewport is being changed" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1274 +#: superset/assets/javascripts/explore/stores/controls.jsx:1607 msgid "RGB Color" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1284 +#: superset/assets/javascripts/explore/stores/controls.jsx:1617 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1289 +#: superset/assets/javascripts/explore/stores/controls.jsx:1622 +msgid "Color" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1624 +msgid "Pick a color" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1629 msgid "Ranges" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1291 +#: superset/assets/javascripts/explore/stores/controls.jsx:1631 msgid "Ranges to highlight with shading" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1296 +#: superset/assets/javascripts/explore/stores/controls.jsx:1636 msgid "Range labels" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1298 +#: superset/assets/javascripts/explore/stores/controls.jsx:1638 msgid "Labels for the ranges" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1303 +#: superset/assets/javascripts/explore/stores/controls.jsx:1643 msgid "Markers" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1305 +#: superset/assets/javascripts/explore/stores/controls.jsx:1645 msgid "List of values to mark with triangles" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1310 +#: superset/assets/javascripts/explore/stores/controls.jsx:1650 msgid "Marker labels" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1312 +#: superset/assets/javascripts/explore/stores/controls.jsx:1652 msgid "Labels for the markers" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1317 +#: superset/assets/javascripts/explore/stores/controls.jsx:1657 msgid "Marker lines" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1319 +#: superset/assets/javascripts/explore/stores/controls.jsx:1659 msgid "List of values to mark with lines" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1324 +#: superset/assets/javascripts/explore/stores/controls.jsx:1664 msgid "Marker line labels" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1326 +#: superset/assets/javascripts/explore/stores/controls.jsx:1666 msgid "Labels for the marker lines" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1353 +#: superset/assets/javascripts/explore/stores/controls.jsx:1701 msgid "Slice ID" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1355 +#: superset/assets/javascripts/explore/stores/controls.jsx:1703 msgid "The id of the active slice" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1360 +#: superset/assets/javascripts/explore/stores/controls.jsx:1708 msgid "Cache Timeout (seconds)" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1362 +#: superset/assets/javascripts/explore/stores/controls.jsx:1710 msgid "The number of seconds before expiring the cache" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1367 +#: superset/assets/javascripts/explore/stores/controls.jsx:1715 msgid "Order by entity id" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1368 +#: superset/assets/javascripts/explore/stores/controls.jsx:1716 msgid "" "Important! Select this if the table is not already sorted by entity id, " "else there is no guarantee that all events for each entity are returned." msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1376 +#: superset/assets/javascripts/explore/stores/controls.jsx:1724 msgid "Minimum leaf node event count" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1379 -msgid "" -"Leaf nodes that represent fewer than this number of events will be " -"initially hidden in the visualization" +#: superset/assets/javascripts/explore/stores/controls.jsx:1727 +msgid "" +"Leaf nodes that represent fewer than this number of events will be " +"initially hidden in the visualization" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1733 +#: superset/assets/javascripts/explore/stores/visTypes.js:25 +msgid "Color Scheme" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1737 +msgid "The color scheme for rendering chart" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1743 +msgid "Significance Level" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1745 +msgid "Threshold alpha level for determining significance" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1750 +msgid "p-value precision" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1752 +msgid "Number of decimal places with which to display p-values" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1757 +msgid "Lift percent precision" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1759 +msgid "Number of decimal places with which to display lift values" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1764 +msgid "Time Series Columns" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1771 +msgid "Use Area Proportions" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1772 +msgid "" +"Check if the Rose Chart should use segment area instead of segment radius" +" for proportioning" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1782 +#: superset/assets/javascripts/explore/stores/visTypes.js:742 +#: superset/assets/javascripts/explore/stores/visTypes.js:859 +#: superset/assets/javascripts/explore/stores/visTypes.js:908 +#: superset/assets/javascripts/explore/stores/visTypes.js:1172 +#: superset/assets/javascripts/explore/stores/visTypes.js:1236 +#: superset/assets/javascripts/explore/stores/visTypes.js:1327 +#: superset/assets/javascripts/explore/stores/visTypes.js:1349 +msgid "Options" +msgstr "Opzioni" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1788 +msgid "Not Time Series" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1790 +msgid "Ignore time" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1793 +msgid "Time Series" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1795 +msgid "Standard time series" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1798 +msgid "Aggregate Mean" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1800 +msgid "Mean of values over specified period" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1803 +msgid "Aggregate Sum" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1805 +msgid "Sum of values over specified period" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1808 +msgid "Difference" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1810 +msgid "Metric change in value from `since` to `until`" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1813 +msgid "Percent Change" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1815 +msgid "Metric percent change in value from `since` to `until`" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1818 +msgid "Factor" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1820 +msgid "Metric factor change from `since` to `until`" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1823 +#: superset/assets/javascripts/explore/stores/visTypes.js:66 +msgid "Advanced Analytics" +msgstr "Analytics avanzate" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1825 +msgid "Use the Advanced Analytics options below" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1830 +msgid "Settings for time series" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1835 +msgid "Equal Date Sizes" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1838 +msgid "Check to force date partitions to have the same height" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1843 +msgid "Partition Limit" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1847 +msgid "" +"The maximum number of subdivisions of each group; lower values are pruned" +" first" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1853 +msgid "Partition Threshold" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1857 +msgid "" +"Partitions whose height to parent height proportions are below this value" +" are pruned" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1863 +msgid "Lines column" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1865 +msgid "The database columns that contains lines information" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1873 +msgid "Lines encoding" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1876 +msgid "The encoding format of the lines" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1885 +msgid "Line width" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1889 +msgid "The width of the lines" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1894 +msgid "Reverse Lat & Long" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1901 +msgid "deck.gl charts" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1904 +msgid "Pick a set of deck.gl charts to layer on top of one another" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1906 +msgid "Select charts" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1907 +msgid "Error while fetching charts" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1917 +msgid "Javascript data interceptor" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1918 +msgid "" +"Define a javascript function that receives the data array used in the " +"visualization and is expected to return a modified version of that array." +" This can be used to alter properties of the data, filter, or enrich the " +"array." +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1924 +msgid "Javascript data mutator" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1925 +msgid "" +"Define a function that receives intercepts the data objects and can " +"mutate it" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1929 +msgid "Javascript tooltip generator" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1930 +msgid "" +"Define a function that receives the input and outputs the content for a " +"tooltip" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1934 +msgid "Javascript onClick href" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1935 +msgid "Define a function that returns a URL to navigate to when user clicks" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1940 +msgid "Extra data for JS" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1942 +msgid "List of extra columns made available in Javascript functions" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1947 +msgid "Stroked" +msgstr "" + +#: superset/assets/javascripts/explore/stores/controls.jsx:1949 +msgid "Whether to display the stroke" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1385 -#: superset/assets/javascripts/explore/stores/visTypes.js:25 -msgid "Color Scheme" +#: superset/assets/javascripts/explore/stores/controls.jsx:1955 +msgid "Filled" msgstr "" -#: superset/assets/javascripts/explore/stores/controls.jsx:1389 -msgid "The color scheme for rendering chart" +#: superset/assets/javascripts/explore/stores/controls.jsx:1957 +msgid "Whether to fill the objects" msgstr "" #: superset/assets/javascripts/explore/stores/visTypes.js:7 @@ -2290,14 +3199,9 @@ msgid "This section exposes ways to include snippets of SQL in your query" msgstr "" #: superset/assets/javascripts/explore/stores/visTypes.js:48 -#: superset/views/annotations.py:55 -msgid "Annotations" +msgid "Annotations and Layers" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:66 -msgid "Advanced Analytics" -msgstr "Analytics avanzate" - #: superset/assets/javascripts/explore/stores/visTypes.js:67 msgid "" "This section contains options that allow for advanced analytical post " @@ -2314,327 +3218,417 @@ msgid "" " to filter empty strings or nulls" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:100 -#: superset/assets/javascripts/explore/stores/visTypes.js:109 -#: superset/assets/javascripts/explore/stores/visTypes.js:145 -#: superset/assets/javascripts/explore/stores/visTypes.js:163 -#: superset/assets/javascripts/explore/stores/visTypes.js:202 -#: superset/assets/javascripts/explore/stores/visTypes.js:244 -#: superset/assets/javascripts/explore/stores/visTypes.js:279 -#: superset/assets/javascripts/explore/stores/visTypes.js:302 -#: superset/assets/javascripts/explore/stores/visTypes.js:465 -#: superset/assets/javascripts/explore/stores/visTypes.js:513 -#: superset/assets/javascripts/explore/stores/visTypes.js:534 -#: superset/assets/javascripts/explore/stores/visTypes.js:658 -#: superset/assets/javascripts/explore/stores/visTypes.js:691 -#: superset/assets/javascripts/explore/stores/visTypes.js:728 -#: superset/assets/javascripts/explore/stores/visTypes.js:781 -#: superset/assets/javascripts/explore/stores/visTypes.js:993 +#: superset/assets/javascripts/explore/stores/visTypes.js:110 +#: superset/assets/javascripts/explore/stores/visTypes.js:146 +#: superset/assets/javascripts/explore/stores/visTypes.js:164 +#: superset/assets/javascripts/explore/stores/visTypes.js:211 +#: superset/assets/javascripts/explore/stores/visTypes.js:247 +#: superset/assets/javascripts/explore/stores/visTypes.js:289 +#: superset/assets/javascripts/explore/stores/visTypes.js:324 +#: superset/assets/javascripts/explore/stores/visTypes.js:688 +#: superset/assets/javascripts/explore/stores/visTypes.js:881 +#: superset/assets/javascripts/explore/stores/visTypes.js:929 +#: superset/assets/javascripts/explore/stores/visTypes.js:950 +#: superset/assets/javascripts/explore/stores/visTypes.js:1001 +#: superset/assets/javascripts/explore/stores/visTypes.js:1023 +#: superset/assets/javascripts/explore/stores/visTypes.js:1048 +#: superset/assets/javascripts/explore/stores/visTypes.js:1074 +#: superset/assets/javascripts/explore/stores/visTypes.js:1107 +#: superset/assets/javascripts/explore/stores/visTypes.js:1145 +#: superset/assets/javascripts/explore/stores/visTypes.js:1198 +#: superset/assets/javascripts/explore/stores/visTypes.js:1409 +#: superset/assets/javascripts/explore/stores/visTypes.js:1557 +#: superset/assets/javascripts/explore/stores/visTypes.js:1582 msgid "Chart Options" msgstr "Opzioni del grafico" -#: superset/assets/javascripts/explore/stores/visTypes.js:126 +#: superset/assets/javascripts/explore/stores/visTypes.js:127 msgid "Breakdowns" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:127 +#: superset/assets/javascripts/explore/stores/visTypes.js:128 msgid "Defines how each series is broken down" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:133 +#: superset/assets/javascripts/explore/stores/visTypes.js:134 msgid "Pie Chart" msgstr "Grafico a torta" -#: superset/assets/javascripts/explore/stores/visTypes.js:198 +#: superset/assets/javascripts/explore/stores/visTypes.js:199 +msgid "Time Series - Periodicity Pivot" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:243 msgid "Dual Axis Line Chart" msgstr "Grafico lineare a due assi" -#: superset/assets/javascripts/explore/stores/visTypes.js:209 +#: superset/assets/javascripts/explore/stores/visTypes.js:254 msgid "Y Axis 1" msgstr "Asse Y 1" -#: superset/assets/javascripts/explore/stores/visTypes.js:215 +#: superset/assets/javascripts/explore/stores/visTypes.js:260 msgid "Y Axis 2" msgstr "Asse Y 2" -#: superset/assets/javascripts/explore/stores/visTypes.js:224 +#: superset/assets/javascripts/explore/stores/visTypes.js:269 msgid "Left Axis Metric" msgstr "Metrica asse sinistro" -#: superset/assets/javascripts/explore/stores/visTypes.js:225 +#: superset/assets/javascripts/explore/stores/visTypes.js:270 msgid "Choose a metric for left axis" msgstr "Seleziona una metrica per l'asse sinistro" -#: superset/assets/javascripts/explore/stores/visTypes.js:228 +#: superset/assets/javascripts/explore/stores/visTypes.js:273 msgid "Left Axis Format" msgstr "Formato asse sinistro" -#: superset/assets/javascripts/explore/stores/visTypes.js:254 -#: superset/assets/javascripts/explore/stores/visTypes.js:312 +#: superset/assets/javascripts/explore/stores/visTypes.js:299 +#: superset/assets/javascripts/explore/stores/visTypes.js:698 msgid "Axes" msgstr "Assi" -#: superset/assets/javascripts/explore/stores/visTypes.js:337 +#: superset/assets/javascripts/explore/stores/visTypes.js:346 +#: superset/assets/javascripts/explore/stores/visTypes.js:369 +#: superset/assets/javascripts/explore/stores/visTypes.js:407 +#: superset/assets/javascripts/explore/stores/visTypes.js:446 +#: superset/assets/javascripts/explore/stores/visTypes.js:479 +#: superset/assets/javascripts/explore/stores/visTypes.js:522 +#: superset/assets/javascripts/explore/stores/visTypes.js:562 +#: superset/assets/javascripts/explore/stores/visTypes.js:602 +#: superset/assets/javascripts/explore/stores/visTypes.js:640 +msgid "Map" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:357 +msgid "Deck.gl - Hexagons" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:377 +#: superset/assets/javascripts/explore/stores/visTypes.js:415 +#: superset/assets/javascripts/explore/stores/visTypes.js:455 +#: superset/assets/javascripts/explore/stores/visTypes.js:492 +#: superset/assets/javascripts/explore/stores/visTypes.js:538 +#: superset/assets/javascripts/explore/stores/visTypes.js:578 +#: superset/assets/javascripts/explore/stores/visTypes.js:616 +#: superset/assets/javascripts/explore/stores/visTypes.js:662 +msgid "Advanced" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:389 +#: superset/assets/javascripts/explore/stores/visTypes.js:427 +msgid "Metric used to control height" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:395 +msgid "Deck.gl - Grid" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:467 +msgid "Deck.gl - Screen grid" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:486 +msgid "Grid" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:503 +msgid "Weight" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:504 +msgid "Metric used as a weight for the grid's coloring" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:511 +msgid "Deck.gl - geoJson" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:529 +msgid "GeoJson Settings" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:569 +msgid "Polygon Settings" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:609 +msgid "Arc" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:655 +msgid "Point Color" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:673 +msgid "Categorical Color" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:674 +msgid "Pick a dimension from which categorical colors are defined" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:723 msgid "GROUP BY" msgstr "RAGGRUPPA PER" -#: superset/assets/javascripts/explore/stores/visTypes.js:338 +#: superset/assets/javascripts/explore/stores/visTypes.js:724 msgid "Use this section if you want a query that aggregates" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:346 +#: superset/assets/javascripts/explore/stores/visTypes.js:734 msgid "NOT GROUPED BY" msgstr "NON RAGGRUPPARE PER" -#: superset/assets/javascripts/explore/stores/visTypes.js:347 +#: superset/assets/javascripts/explore/stores/visTypes.js:735 msgid "Use this section if you want to query atomic rows" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:354 -#: superset/assets/javascripts/explore/stores/visTypes.js:755 -#: superset/assets/javascripts/explore/stores/visTypes.js:819 -#: superset/assets/javascripts/explore/stores/visTypes.js:912 -msgid "Options" -msgstr "Opzioni" +#: superset/assets/javascripts/explore/stores/visTypes.js:761 +msgid "Time Series Table" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:779 +msgid "" +"Templated link, it's possible to include {{ metric }} or other values " +"coming from the controls." +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:812 +msgid "Pivot Options" +msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:541 -#: superset/assets/javascripts/explore/stores/visTypes.js:853 +#: superset/assets/javascripts/explore/stores/visTypes.js:957 +#: superset/assets/javascripts/explore/stores/visTypes.js:1271 msgid "Bubbles" msgstr "Bolle" -#: superset/assets/javascripts/explore/stores/visTypes.js:667 +#: superset/assets/javascripts/explore/stores/visTypes.js:1083 msgid "Numeric Column" msgstr "Colonne numeriche" -#: superset/assets/javascripts/explore/stores/visTypes.js:668 +#: superset/assets/javascripts/explore/stores/visTypes.js:1084 msgid "Select the numeric column to draw the histogram" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:671 +#: superset/assets/javascripts/explore/stores/visTypes.js:1087 msgid "No of Bins" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:672 +#: superset/assets/javascripts/explore/stores/visTypes.js:1088 msgid "Select number of bins for the histogram" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:699 +#: superset/assets/javascripts/explore/stores/visTypes.js:1115 msgid "Primary Metric" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:700 +#: superset/assets/javascripts/explore/stores/visTypes.js:1116 msgid "The primary metric is used to define the arc segment sizes" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:703 +#: superset/assets/javascripts/explore/stores/visTypes.js:1119 msgid "Secondary Metric" msgstr "Metrica secondaria" -#: superset/assets/javascripts/explore/stores/visTypes.js:704 +#: superset/assets/javascripts/explore/stores/visTypes.js:1121 msgid "" -"This secondary metric is used to define the color as a ratio against the " -"primary metric. If the two metrics match, color is mapped level groups" +"[optional] this secondary metric is used to define the color as a ratio " +"against the primary metric. When omitted, the color is categorical and " +"based on labels" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:709 +#: superset/assets/javascripts/explore/stores/visTypes.js:1126 msgid "Hierarchy" msgstr "Gerarchia" -#: superset/assets/javascripts/explore/stores/visTypes.js:710 +#: superset/assets/javascripts/explore/stores/visTypes.js:1127 msgid "This defines the level of the hierarchy" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:736 -#: superset/assets/javascripts/explore/stores/visTypes.js:764 +#: superset/assets/javascripts/explore/stores/visTypes.js:1153 +#: superset/assets/javascripts/explore/stores/visTypes.js:1181 msgid "Source / Target" msgstr "Sorgente / Destinazione" -#: superset/assets/javascripts/explore/stores/visTypes.js:737 -#: superset/assets/javascripts/explore/stores/visTypes.js:765 +#: superset/assets/javascripts/explore/stores/visTypes.js:1154 +#: superset/assets/javascripts/explore/stores/visTypes.js:1182 msgid "Choose a source and a target" msgstr "Seleziona una sorgente ed una destinazione" -#: superset/assets/javascripts/explore/stores/visTypes.js:770 +#: superset/assets/javascripts/explore/stores/visTypes.js:1187 msgid "Chord Diagram" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:791 +#: superset/assets/javascripts/explore/stores/visTypes.js:1208 msgid "Choose a number format" msgstr "Seleziona una formato numerico" -#: superset/assets/javascripts/explore/stores/visTypes.js:794 +#: superset/assets/javascripts/explore/stores/visTypes.js:1211 msgid "Source" msgstr "Sorgente" -#: superset/assets/javascripts/explore/stores/visTypes.js:797 +#: superset/assets/javascripts/explore/stores/visTypes.js:1214 msgid "Choose a source" msgstr "Seleziona una sorgente" -#: superset/assets/javascripts/explore/stores/visTypes.js:800 +#: superset/assets/javascripts/explore/stores/visTypes.js:1217 msgid "Target" msgstr "Destinazione" -#: superset/assets/javascripts/explore/stores/visTypes.js:803 +#: superset/assets/javascripts/explore/stores/visTypes.js:1220 msgid "Choose a target" msgstr "Seleziona una destinazione" -#: superset/assets/javascripts/explore/stores/visTypes.js:828 +#: superset/assets/javascripts/explore/stores/visTypes.js:1246 msgid "ISO 3166-2 codes of region/province/department" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:829 +#: superset/assets/javascripts/explore/stores/visTypes.js:1247 msgid "" "It's ISO 3166-2 of your region/province/department in your table. (see " "documentation for list of ISO 3166-2)" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:863 +#: superset/assets/javascripts/explore/stores/visTypes.js:1281 msgid "Country Control" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:864 +#: superset/assets/javascripts/explore/stores/visTypes.js:1282 msgid "3 letter code of the country" msgstr "Codice a 3 lettere della nazione" -#: superset/assets/javascripts/explore/stores/visTypes.js:867 +#: superset/assets/javascripts/explore/stores/visTypes.js:1285 msgid "Metric for color" msgstr "Metrica per il colore" -#: superset/assets/javascripts/explore/stores/visTypes.js:868 +#: superset/assets/javascripts/explore/stores/visTypes.js:1286 msgid "Metric that defines the color of the country" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:871 +#: superset/assets/javascripts/explore/stores/visTypes.js:1289 msgid "Bubble size" msgstr "Grandezza della bolla" -#: superset/assets/javascripts/explore/stores/visTypes.js:872 +#: superset/assets/javascripts/explore/stores/visTypes.js:1290 msgid "Metric that defines the size of the bubble" msgstr "Metrica che definisce la grandezza di una bolla" -#: superset/assets/javascripts/explore/stores/visTypes.js:878 +#: superset/assets/javascripts/explore/stores/visTypes.js:1296 msgid "Filter Box" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:897 +#: superset/assets/javascripts/explore/stores/visTypes.js:1312 msgid "Filter controls" msgstr "Controlli del filtro" -#: superset/assets/javascripts/explore/stores/visTypes.js:898 +#: superset/assets/javascripts/explore/stores/visTypes.js:1313 msgid "" "The controls you want to filter on. Note that only columns checked as " "\"filterable\" will show up on this list." msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:954 +#: superset/assets/javascripts/explore/stores/visTypes.js:1369 msgid "Heatmap Options" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:989 +#: superset/assets/javascripts/explore/stores/visTypes.js:1390 +msgid "Value bounds" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:1399 +msgid "Value Format" +msgstr "" + +#: superset/assets/javascripts/explore/stores/visTypes.js:1405 msgid "Horizon" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1015 +#: superset/assets/javascripts/explore/stores/visTypes.js:1431 msgid "Points" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1022 +#: superset/assets/javascripts/explore/stores/visTypes.js:1438 msgid "Labelling" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1029 +#: superset/assets/javascripts/explore/stores/visTypes.js:1445 msgid "Visual Tweaks" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1038 -msgid "Viewport" -msgstr "" - -#: superset/assets/javascripts/explore/stores/visTypes.js:1048 -msgid "Longitude" -msgstr "Longitudine" - -#: superset/assets/javascripts/explore/stores/visTypes.js:1049 +#: superset/assets/javascripts/explore/stores/visTypes.js:1464 msgid "Column containing longitude data" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1052 -msgid "Latitude" -msgstr "Latitudine" - -#: superset/assets/javascripts/explore/stores/visTypes.js:1053 +#: superset/assets/javascripts/explore/stores/visTypes.js:1468 msgid "Column containing latitude data" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1056 +#: superset/assets/javascripts/explore/stores/visTypes.js:1471 msgid "Cluster label aggregator" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1057 +#: superset/assets/javascripts/explore/stores/visTypes.js:1472 msgid "" "Aggregate function applied to the list of points in each cluster to " "produce the cluster label." msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1061 +#: superset/assets/javascripts/explore/stores/visTypes.js:1476 msgid "Tooltip" msgstr "Suggerimento" -#: superset/assets/javascripts/explore/stores/visTypes.js:1062 +#: superset/assets/javascripts/explore/stores/visTypes.js:1477 msgid "Show a tooltip when hovering over points and clusters describing the label" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1066 +#: superset/assets/javascripts/explore/stores/visTypes.js:1481 msgid "" "One or many controls to group by. If grouping, latitude and longitude " "columns must be present." msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1077 +#: superset/assets/javascripts/explore/stores/visTypes.js:1492 msgid "Event definition" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1087 +#: superset/assets/javascripts/explore/stores/visTypes.js:1502 msgid "Additional meta data" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1095 +#: superset/assets/javascripts/explore/stores/visTypes.js:1510 msgid "Column containing entity ids" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1096 +#: superset/assets/javascripts/explore/stores/visTypes.js:1511 msgid "e.g., a \"user id\" column" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1099 +#: superset/assets/javascripts/explore/stores/visTypes.js:1514 msgid "Column containing event names" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1107 +#: superset/assets/javascripts/explore/stores/visTypes.js:1522 msgid "Event count limit" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1108 +#: superset/assets/javascripts/explore/stores/visTypes.js:1523 msgid "The maximum number of events to return, equivalent to number of rows" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1111 +#: superset/assets/javascripts/explore/stores/visTypes.js:1526 msgid "Meta data" msgstr "" -#: superset/assets/javascripts/explore/stores/visTypes.js:1112 +#: superset/assets/javascripts/explore/stores/visTypes.js:1527 msgid "Select any columns for meta data inspection" msgstr "" -#: superset/assets/javascripts/modules/superset.js:130 -msgid "" -"The server could not be reached. You may want to verify your connection " -"and try again." +#: superset/assets/javascripts/explore/stores/visTypes.js:1539 +msgid "Paired t-test" msgstr "" -#: superset/assets/javascripts/modules/superset.js:133 -#, python-format -msgid "An unknown error occurred. (Status: %s )" +#: superset/assets/javascripts/explore/stores/visTypes.js:1575 +msgid "Time Series Options" msgstr "" #: superset/assets/javascripts/profile/components/App.jsx:24 @@ -2663,47 +3657,49 @@ msgstr "" #: superset/assets/javascripts/profile/components/CreatedContent.jsx:58 #: superset/assets/javascripts/profile/components/Favorites.jsx:59 -#: superset/templates/superset/welcome.html:13 superset/views/core.py:372 -#: superset/views/core.py:532 +#: superset/views/core.py:447 superset/views/core.py:616 msgid "Dashboards" msgstr "Elenco Dashboard" #: superset/assets/javascripts/profile/components/CreatedContent.jsx:61 -#: superset/assets/javascripts/profile/components/Favorites.jsx:62 -#: superset/views/core.py:408 superset/views/core.py:477 msgid "Slices" msgstr "Slice" #: superset/assets/javascripts/profile/components/Favorites.jsx:34 -msgid "No favorite slices yet, go click on stars!" +msgid "No favorite charts yet, go click on stars!" msgstr "" #: superset/assets/javascripts/profile/components/Favorites.jsx:50 msgid "No favorite dashboards yet, go click on stars!" msgstr "" +#: superset/assets/javascripts/profile/components/Favorites.jsx:62 +#: superset/views/core.py:488 superset/views/core.py:561 +msgid "Charts" +msgstr "Grafici" + #: superset/assets/javascripts/profile/components/Security.jsx:14 msgid "Roles" -msgstr "" +msgstr "Ruoli" #: superset/assets/javascripts/profile/components/Security.jsx:23 -#: superset/views/core.py:284 +#: superset/views/core.py:303 msgid "Databases" -msgstr "" +msgstr "Basi di dati" #: superset/assets/javascripts/profile/components/Security.jsx:34 msgid "Datasources" msgstr "" -#: superset/assets/javascripts/profile/components/UserInfo.jsx:18 +#: superset/assets/javascripts/profile/components/UserInfo.jsx:19 msgid "Profile picture provided by Gravatar" msgstr "" -#: superset/assets/javascripts/profile/components/UserInfo.jsx:33 +#: superset/assets/javascripts/profile/components/UserInfo.jsx:34 msgid "joined" msgstr "" -#: superset/assets/javascripts/profile/components/UserInfo.jsx:43 +#: superset/assets/javascripts/profile/components/UserInfo.jsx:44 msgid "id:" msgstr "" @@ -2711,57 +3707,73 @@ msgstr "" msgid "Sorry, there appears to be no data" msgstr "" -#: superset/assets/visualizations/filter_box.jsx:106 +#: superset/assets/visualizations/PlaySlider.jsx:99 +msgid "Data has no time steps" +msgstr "" + +#: superset/assets/visualizations/filter_box.jsx:115 +msgid "Select starting date" +msgstr "Seleziona data iniziale" + +#: superset/assets/visualizations/filter_box.jsx:124 +msgid "Select end date" +msgstr "Seleziona data finale" + +#: superset/assets/visualizations/filter_box.jsx:193 #, python-format msgid "Select [%s]" msgstr "" -#: superset/connectors/druid/models.py:1073 +#: superset/assets/visualizations/filter_box.jsx:230 +msgid "Apply" +msgstr "Applica" + +#: superset/connectors/druid/models.py:1230 msgid "No data was returned." msgstr "Nessun dato restituito." -#: superset/connectors/druid/views.py:28 +#: superset/connectors/druid/views.py:26 msgid "List Druid Column" msgstr "" -#: superset/connectors/druid/views.py:29 +#: superset/connectors/druid/views.py:27 msgid "Show Druid Column" msgstr "" -#: superset/connectors/druid/views.py:30 +#: superset/connectors/druid/views.py:28 msgid "Add Druid Column" msgstr "" -#: superset/connectors/druid/views.py:31 +#: superset/connectors/druid/views.py:29 msgid "Edit Druid Column" msgstr "" -#: superset/connectors/druid/views.py:43 superset/connectors/sqla/views.py:80 +#: superset/connectors/druid/views.py:43 superset/connectors/sqla/views.py:76 msgid "Column" msgstr "Colonna" -#: superset/connectors/druid/views.py:44 superset/connectors/druid/views.py:109 -#: superset/connectors/sqla/views.py:94 superset/connectors/sqla/views.py:133 +#: superset/connectors/druid/views.py:44 superset/connectors/druid/views.py:129 +#: superset/connectors/sqla/views.py:90 superset/connectors/sqla/views.py:131 msgid "Type" msgstr "Tipo" -#: superset/connectors/druid/views.py:46 superset/connectors/sqla/views.py:83 +#: superset/connectors/druid/views.py:46 superset/connectors/sqla/views.py:79 msgid "Groupable" msgstr "Raggruppabile" -#: superset/connectors/druid/views.py:47 superset/connectors/sqla/views.py:84 +#: superset/connectors/druid/views.py:47 superset/connectors/sqla/views.py:80 msgid "Filterable" msgstr "Filtrabile" -#: superset/connectors/druid/views.py:48 superset/connectors/sqla/views.py:86 +#: superset/connectors/druid/views.py:48 superset/connectors/sqla/views.py:82 msgid "Count Distinct" msgstr "Count Distinct" -#: superset/connectors/druid/views.py:49 superset/connectors/sqla/views.py:87 +#: superset/connectors/druid/views.py:49 superset/connectors/sqla/views.py:83 msgid "Sum" msgstr "Sum" -#: superset/connectors/druid/views.py:54 superset/connectors/sqla/views.py:49 +#: superset/connectors/druid/views.py:54 superset/connectors/sqla/views.py:45 msgid "" "Whether this column is exposed in the `Filters` section of the explore " "view." @@ -2769,23 +3781,23 @@ msgstr "" "Se questa colonna è esposta nella sezione `Filtri` della vista " "esplorazione." -#: superset/connectors/druid/views.py:80 +#: superset/connectors/druid/views.py:100 msgid "List Druid Metric" msgstr "" -#: superset/connectors/druid/views.py:81 +#: superset/connectors/druid/views.py:101 msgid "Show Druid Metric" msgstr "" -#: superset/connectors/druid/views.py:82 +#: superset/connectors/druid/views.py:102 msgid "Add Druid Metric" msgstr "" -#: superset/connectors/druid/views.py:83 +#: superset/connectors/druid/views.py:103 msgid "Edit Druid Metric" msgstr "" -#: superset/connectors/druid/views.py:100 superset/connectors/sqla/views.py:115 +#: superset/connectors/druid/views.py:120 superset/connectors/sqla/views.py:113 msgid "" "Whether the access to this metric is restricted to certain roles. Only " "roles with the permission 'metric access on XXX (the name of this " @@ -2795,97 +3807,97 @@ msgstr "" "ruoli con l'autorizzazione 'accesso metrico su XXX (il nome di questa " "metrica)' possono accedervi" -#: superset/connectors/druid/views.py:108 superset/connectors/sqla/views.py:81 -#: superset/connectors/sqla/views.py:132 +#: superset/connectors/druid/views.py:128 superset/connectors/sqla/views.py:77 +#: superset/connectors/sqla/views.py:130 msgid "Verbose Name" msgstr "Nome Completo" -#: superset/connectors/druid/views.py:110 superset/views/core.py:559 +#: superset/connectors/druid/views.py:130 superset/views/core.py:658 msgid "JSON" msgstr "JSON" -#: superset/connectors/druid/views.py:111 +#: superset/connectors/druid/views.py:131 msgid "Druid Datasource" msgstr "Sorgente Dati Druid" -#: superset/connectors/druid/views.py:112 superset/connectors/sqla/views.py:138 +#: superset/connectors/druid/views.py:132 superset/connectors/sqla/views.py:136 msgid "Warning Message" msgstr "" -#: superset/connectors/druid/views.py:129 +#: superset/connectors/druid/views.py:150 msgid "List Druid Cluster" msgstr "" -#: superset/connectors/druid/views.py:130 +#: superset/connectors/druid/views.py:151 msgid "Show Druid Cluster" msgstr "" -#: superset/connectors/druid/views.py:131 +#: superset/connectors/druid/views.py:152 msgid "Add Druid Cluster" msgstr "" -#: superset/connectors/druid/views.py:132 +#: superset/connectors/druid/views.py:153 msgid "Edit Druid Cluster" msgstr "" -#: superset/connectors/druid/views.py:143 -#: superset/connectors/druid/views.py:227 +#: superset/connectors/druid/views.py:164 +#: superset/connectors/druid/views.py:250 msgid "Cluster" msgstr "Cluster" -#: superset/connectors/druid/views.py:144 +#: superset/connectors/druid/views.py:165 msgid "Coordinator Host" msgstr "Host Coordinatore" -#: superset/connectors/druid/views.py:145 +#: superset/connectors/druid/views.py:166 msgid "Coordinator Port" msgstr "Porta Coordinatore" -#: superset/connectors/druid/views.py:146 +#: superset/connectors/druid/views.py:167 msgid "Coordinator Endpoint" msgstr "Endpoint Coordinatore" -#: superset/connectors/druid/views.py:147 +#: superset/connectors/druid/views.py:168 msgid "Broker Host" msgstr "Host Broker" -#: superset/connectors/druid/views.py:148 +#: superset/connectors/druid/views.py:169 msgid "Broker Port" msgstr "Porta Broker" -#: superset/connectors/druid/views.py:149 +#: superset/connectors/druid/views.py:170 msgid "Broker Endpoint" msgstr "Endpoint Broker" -#: superset/connectors/druid/views.py:164 +#: superset/connectors/druid/views.py:186 msgid "Druid Clusters" msgstr "" -#: superset/connectors/druid/views.py:167 -#: superset/connectors/druid/views.py:267 -#: superset/connectors/druid/views.py:315 -#: superset/connectors/druid/views.py:323 superset/connectors/sqla/views.py:281 -#: superset/views/core.py:287 +#: superset/connectors/druid/views.py:189 +#: superset/connectors/druid/views.py:291 +#: superset/connectors/druid/views.py:340 +#: superset/connectors/druid/views.py:348 superset/connectors/sqla/views.py:298 +#: superset/views/core.py:306 superset/views/core.py:2693 msgid "Sources" -msgstr "" +msgstr "Sorgenti" -#: superset/connectors/druid/views.py:174 +#: superset/connectors/druid/views.py:197 msgid "List Druid Datasource" msgstr "" -#: superset/connectors/druid/views.py:175 +#: superset/connectors/druid/views.py:198 msgid "Show Druid Datasource" msgstr "" -#: superset/connectors/druid/views.py:176 +#: superset/connectors/druid/views.py:199 msgid "Add Druid Datasource" msgstr "" -#: superset/connectors/druid/views.py:177 +#: superset/connectors/druid/views.py:200 msgid "Edit Druid Datasource" msgstr "" -#: superset/connectors/druid/views.py:196 superset/connectors/sqla/views.py:176 +#: superset/connectors/druid/views.py:219 superset/connectors/sqla/views.py:176 msgid "" "The list of slices associated with this table. By altering this " "datasource, you may change how these associated slices behave. Also note " @@ -2900,11 +3912,11 @@ msgstr "" "qualora si modifica un'origine dati. Se vuoi modificare l'origine dati " "per una slide, devi sovrascriverla dal 'vista di esplorazione'" -#: superset/connectors/druid/views.py:204 superset/connectors/sqla/views.py:184 +#: superset/connectors/druid/views.py:227 superset/connectors/sqla/views.py:184 msgid "Timezone offset (in hours) for this datasource" msgstr "Timezone offset (in ore) per questa sorgente dati" -#: superset/connectors/druid/views.py:208 +#: superset/connectors/druid/views.py:231 msgid "" "Time expression to use as a predicate when retrieving distinct values to " "populate the filter component. Only applies when `Enable Filter Select` " @@ -2917,7 +3929,7 @@ msgstr "" "inserisce `7 giorni fa`, l'elenco distinto di valori nel filtro verrà " "popolato in base al valore distinto della settimana passata" -#: superset/connectors/druid/views.py:215 superset/connectors/sqla/views.py:206 +#: superset/connectors/druid/views.py:238 superset/connectors/sqla/views.py:206 msgid "" "Whether to populate the filter's dropdown in the explore view's filter " "section with a list of distinct values fetched from the backend on the " @@ -2926,7 +3938,7 @@ msgstr "" "Usato per popolare la finestra a cascata dei filtri dall'elenco dei " "valori distinti prelevati dal backend al volo" -#: superset/connectors/druid/views.py:219 +#: superset/connectors/druid/views.py:242 msgid "" "Redirects to this endpoint when clicking on the datasource from the " "datasource list" @@ -2934,52 +3946,52 @@ msgstr "" "Rinvia a questo endpoint al clic sulla sorgente dati dall'elenco delle " "sorgenti dati" -#: superset/connectors/druid/views.py:225 superset/connectors/sqla/views.py:213 -msgid "Associated Slices" -msgstr "Slice associate" +#: superset/connectors/druid/views.py:248 superset/connectors/sqla/views.py:213 +msgid "Associated Charts" +msgstr "" -#: superset/connectors/druid/views.py:226 +#: superset/connectors/druid/views.py:249 msgid "Data Source" msgstr "Sorgente Dati" -#: superset/connectors/druid/views.py:229 superset/connectors/sqla/views.py:225 +#: superset/connectors/druid/views.py:252 superset/connectors/sqla/views.py:225 msgid "Owner" msgstr "Proprietario" -#: superset/connectors/druid/views.py:230 +#: superset/connectors/druid/views.py:253 msgid "Is Hidden" msgstr "è nascosto" -#: superset/connectors/druid/views.py:231 superset/connectors/sqla/views.py:218 +#: superset/connectors/druid/views.py:254 superset/connectors/sqla/views.py:218 msgid "Enable Filter Select" msgstr "Abilita il filtro di Select" -#: superset/connectors/druid/views.py:232 superset/connectors/sqla/views.py:220 +#: superset/connectors/druid/views.py:255 superset/connectors/sqla/views.py:220 msgid "Default Endpoint" msgstr "Endpoint predefinito" -#: superset/connectors/druid/views.py:233 +#: superset/connectors/druid/views.py:256 msgid "Time Offset" msgstr "Offset temporale" -#: superset/connectors/druid/views.py:234 superset/connectors/sqla/views.py:222 -#: superset/views/core.py:251 superset/views/core.py:370 +#: superset/connectors/druid/views.py:257 superset/connectors/sqla/views.py:222 +#: superset/views/core.py:269 superset/views/core.py:445 msgid "Cache Timeout" msgstr "Cache Timeout" -#: superset/connectors/druid/views.py:265 +#: superset/connectors/druid/views.py:289 msgid "Druid Datasources" msgstr "" -#: superset/connectors/druid/views.py:312 +#: superset/connectors/druid/views.py:337 msgid "Scan New Datasources" msgstr "" -#: superset/connectors/druid/views.py:320 +#: superset/connectors/druid/views.py:345 msgid "Refresh Druid Metadata" msgstr "" -#: superset/connectors/sqla/models.py:394 +#: superset/connectors/sqla/models.py:478 msgid "" "Datetime column not provided as part table configuration and is required " "by this type of chart" @@ -2987,37 +3999,38 @@ msgstr "" "la colonna Datetime è necessaria per questo tipo di grafico. Nella " "configurazione della tabella però non è stata definita" -#: superset/connectors/sqla/models.py:398 +#: superset/connectors/sqla/models.py:482 msgid "Empty query?" -msgstr "" +msgstr "Query vuota?" -#: superset/connectors/sqla/models.py:401 +#: superset/connectors/sqla/models.py:485 msgid "Metric '{}' is not valid" msgstr "Metrica '{}' non valida" -#: superset/connectors/sqla/models.py:590 +#: superset/connectors/sqla/models.py:712 msgid "" "Table [{}] doesn't seem to exist in the specified database, couldn't " "fetch column information" -msgstr "" +msgstr "La tabella [{}] non sembra esistere nel database specificato, non posso " +"recuperare le informazioni sulla colonna " -#: superset/connectors/sqla/views.py:27 +#: superset/connectors/sqla/views.py:23 msgid "List Columns" -msgstr "" +msgstr "Visualizza colonne" -#: superset/connectors/sqla/views.py:28 +#: superset/connectors/sqla/views.py:24 msgid "Show Column" -msgstr "" +msgstr "Mostra colonna" -#: superset/connectors/sqla/views.py:29 +#: superset/connectors/sqla/views.py:25 msgid "Add Column" -msgstr "" +msgstr "Aggiungi colonna" -#: superset/connectors/sqla/views.py:30 +#: superset/connectors/sqla/views.py:26 msgid "Edit Column" -msgstr "" +msgstr "Edita colonna" -#: superset/connectors/sqla/views.py:45 +#: superset/connectors/sqla/views.py:41 msgid "" "Whether to make this column available as a [Time Granularity] option, " "column has to be DATETIME or DATETIME-like" @@ -3025,7 +4038,7 @@ msgstr "" "Se rendere disponibile questa colonna come opzione [Time Granularity], la" " colonna deve essere di tipo DATETIME o simile" -#: superset/connectors/sqla/views.py:52 +#: superset/connectors/sqla/views.py:48 msgid "" "The data type that was inferred by the database. It may be necessary to " "input a type manually for expression-defined columns in some cases. In " @@ -3036,65 +4049,65 @@ msgstr "" "dall'espressione. Nella maggior parte dei casi gli utenti non hanno " "bisogno di fare questa modifica." -#: superset/connectors/sqla/views.py:90 +#: superset/connectors/sqla/views.py:86 msgid "Expression" msgstr "Espressione" -#: superset/connectors/sqla/views.py:91 +#: superset/connectors/sqla/views.py:87 msgid "Is temporal" msgstr "è temporale" -#: superset/connectors/sqla/views.py:92 +#: superset/connectors/sqla/views.py:88 msgid "Datetime Format" msgstr "Formato Datetime" -#: superset/connectors/sqla/views.py:93 +#: superset/connectors/sqla/views.py:89 msgid "Database Expression" msgstr "Espressione del Database" -#: superset/connectors/sqla/views.py:102 +#: superset/connectors/sqla/views.py:100 msgid "List Metrics" -msgstr "" +msgstr "Lista Metriche" -#: superset/connectors/sqla/views.py:103 +#: superset/connectors/sqla/views.py:101 msgid "Show Metric" -msgstr "" +msgstr "Mostra metrica" -#: superset/connectors/sqla/views.py:104 +#: superset/connectors/sqla/views.py:102 msgid "Add Metric" -msgstr "" +msgstr "Aggiungi metrica" -#: superset/connectors/sqla/views.py:105 +#: superset/connectors/sqla/views.py:103 msgid "Edit Metric" -msgstr "" +msgstr "Modifica metrica" -#: superset/connectors/sqla/views.py:134 +#: superset/connectors/sqla/views.py:132 msgid "SQL Expression" msgstr "Espressione SQL" -#: superset/connectors/sqla/views.py:136 +#: superset/connectors/sqla/views.py:134 msgid "D3 Format" -msgstr "" +msgstr "Formato D3" -#: superset/connectors/sqla/views.py:137 +#: superset/connectors/sqla/views.py:135 msgid "Is Restricted" msgstr "" -#: superset/connectors/sqla/views.py:155 +#: superset/connectors/sqla/views.py:154 msgid "List Tables" -msgstr "" +msgstr "Visualizza Tabelle" -#: superset/connectors/sqla/views.py:156 +#: superset/connectors/sqla/views.py:155 msgid "Show Table" -msgstr "" +msgstr "Mostra Tabelle" -#: superset/connectors/sqla/views.py:157 +#: superset/connectors/sqla/views.py:156 msgid "Add Table" -msgstr "" +msgstr "Aggiungi Tabella" -#: superset/connectors/sqla/views.py:158 +#: superset/connectors/sqla/views.py:157 msgid "Edit Table" -msgstr "" +msgstr "Modifica Tabella" #: superset/connectors/sqla/views.py:185 msgid "Name of the table that exists in the source database" @@ -3133,27 +4146,19 @@ msgstr "Reinvia a questo endpoint al clic sulla tabella dall'elenco delle tabell msgid "Changed By" msgstr "Modificato da" -#: superset/connectors/sqla/views.py:216 superset/views/core.py:247 -#: superset/views/sql_lab.py:19 superset/views/sql_lab.py:55 +#: superset/connectors/sqla/views.py:216 superset/views/core.py:265 +#: superset/views/sql_lab.py:17 superset/views/sql_lab.py:54 msgid "Database" msgstr "Database" -#: superset/connectors/sqla/views.py:217 superset/views/core.py:249 +#: superset/connectors/sqla/views.py:217 superset/views/core.py:267 msgid "Last Changed" msgstr "Ultima Modifica" -#: superset/connectors/sqla/views.py:219 -msgid "Schema" -msgstr "Schema" - #: superset/connectors/sqla/views.py:221 msgid "Offset" msgstr "Offset" -#: superset/connectors/sqla/views.py:223 -msgid "Table Name" -msgstr "" - #: superset/connectors/sqla/views.py:224 msgid "Fetch Values Predicate" msgstr "" @@ -3177,10 +4182,23 @@ msgstr "" "fasi, è necessario andare sul pulsante di modifica della nuova tabella " "per configurarla." +#: superset/connectors/sqla/views.py:278 +msgid "Refresh Metadata" +msgstr "" + #: superset/connectors/sqla/views.py:279 -msgid "Tables" +msgid "Refresh column metadata" +msgstr "" + +#: superset/connectors/sqla/views.py:288 +#, python-format +msgid "Metadata refreshed for the following table(s): %(tables)s" msgstr "" +#: superset/connectors/sqla/views.py:296 +msgid "Tables" +msgstr "Tabelle" + #: superset/templates/appbuilder/navbar_right.html:41 msgid "Profile" msgstr "Profilo" @@ -3199,11 +4217,11 @@ msgstr "" #: superset/templates/appbuilder/general/widgets/base_list.html:46 msgid "No records found" -msgstr "" +msgstr "Nessun record trovato" #: superset/templates/superset/import_dashboards.html:11 msgid "Import" -msgstr "" +msgstr "Importa" #: superset/templates/superset/request_access.html:2 msgid "No Access!" @@ -3218,92 +4236,108 @@ msgstr "Non hai i permessi per accedere alla/e sorgente/i dati: %(name)s." msgid "Request Permissions" msgstr "Richiesta di Permessi" -#: superset/templates/superset/welcome.html:3 -msgid "Welcome!" -msgstr "" - #: superset/templates/superset/models/database/macros.html:4 msgid "Test Connection" msgstr "Testa la Connessione" +#: superset/views/annotations.py:47 +msgid "Annotation Layers" +msgstr "" + #: superset/views/annotations.py:50 superset/views/annotations.py:58 -#: superset/views/core.py:277 superset/views/core.py:2371 -#: superset/views/sql_lab.py:30 +#: superset/views/core.py:296 superset/views/core.py:2661 +#: superset/views/sql_lab.py:29 msgid "Manage" +msgstr "Gestisci" + +#: superset/views/annotations.py:55 +msgid "Annotations" msgstr "" -#: superset/views/base.py:62 +#: superset/views/base.py:74 #, python-format msgid "Datasource %(name)s already exists" msgstr "" -#: superset/views/base.py:221 +#: superset/views/base.py:233 msgid "json isn't valid" -msgstr "" +msgstr "json non è valido" + +#: superset/views/base.py:237 +msgid "Export to YAML" +msgstr "Esporta in YAML" + +#: superset/views/base.py:237 +msgid "Export to YAML?" +msgstr "Esporta in YAML?" -#: superset/views/base.py:272 +#: superset/views/base.py:297 msgid "Delete" -msgstr "" +msgstr "Cancella" -#: superset/views/base.py:273 +#: superset/views/base.py:298 msgid "Delete all Really?" msgstr "" -#: superset/views/core.py:56 +#: superset/views/core.py:61 msgid "This endpoint requires the `all_datasource_access` permission" msgstr "" -#: superset/views/core.py:58 +#: superset/views/core.py:63 msgid "The datasource seems to have been deleted" msgstr "" -#: superset/views/core.py:59 +#: superset/views/core.py:64 msgid "The access requests seem to have been deleted" msgstr "" -#: superset/views/core.py:61 +#: superset/views/core.py:66 msgid "The user seems to have been deleted" msgstr "" -#: superset/views/core.py:62 +#: superset/views/core.py:71 +msgid "You don't have access to this datasource. (Gain access)" +msgstr "" + +#: superset/views/core.py:74 msgid "You don't have access to this datasource" msgstr "" -#: superset/views/core.py:66 +#: superset/views/core.py:86 #, python-format msgid "" "This view requires the database %(name)s or `all_datasource_access` " "permission" msgstr "" -#: superset/views/core.py:71 +#: superset/views/core.py:91 #, python-format msgid "" "This endpoint requires the datasource %(name)s, database or " "`all_datasource_access` permission" msgstr "" -#: superset/views/core.py:174 +#: superset/views/core.py:185 msgid "List Databases" -msgstr "" +msgstr "Visualizza i database" -#: superset/views/core.py:175 +#: superset/views/core.py:186 msgid "Show Database" -msgstr "" +msgstr "Mostra database" -#: superset/views/core.py:176 +#: superset/views/core.py:187 msgid "Add Database" -msgstr "" +msgstr "Aggiungi Database" -#: superset/views/core.py:177 +#: superset/views/core.py:188 msgid "Edit Database" -msgstr "" +msgstr "Mostra database" -#: superset/views/core.py:212 +#: superset/views/core.py:227 msgid "Expose this DB in SQL Lab" msgstr "Esponi questo DB in SQL Lab" -#: superset/views/core.py:213 +#: superset/views/core.py:228 msgid "" "Allow users to run synchronous queries, this is the default and should " "work well for queries that can be executed within a web request scope " @@ -3313,7 +4347,7 @@ msgstr "" "predefinita e dovrebbe funzionare bene per query che possono essere " "eseguite con una richiesta web (<-1 minuto)" -#: superset/views/core.py:217 +#: superset/views/core.py:232 msgid "" "Allow users to run queries, against an async backend. This assumes that " "you have a Celery worker setup as well as a results backend." @@ -3322,11 +4356,11 @@ msgstr "" "Questo presuppone che si abbia una installazione funzionante di Celery " "nel backend." -#: superset/views/core.py:221 +#: superset/views/core.py:236 msgid "Allow CREATE TABLE AS option in SQL Lab" msgstr "Permetti l'opzione CREATE TABLE AS in SQL Lab" -#: superset/views/core.py:222 +#: superset/views/core.py:237 msgid "" "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" " SQL Lab" @@ -3334,7 +4368,7 @@ msgstr "" "Permetti agli utenti di eseguire dichiarazioni diverse da SELECT (UPDATE," " DELETE, CREATE, ...) nel SQL Lab" -#: superset/views/core.py:226 +#: superset/views/core.py:241 msgid "" "When allowing CREATE TABLE AS option in SQL Lab, this option forces the " "table to be created in this schema" @@ -3342,103 +4376,114 @@ msgstr "" "Se si abilita l'opzione CREATE TABLE AS in SQL Lab, verrà forzata la " "creazione della tabella con questo schema" -#: superset/views/core.py:238 +#: superset/views/core.py:253 msgid "" -"All the queries in Sql Lab are going to be executed on behalf of " -"currently authorized user." +"If Presto, all the queries in SQL Lab are going to be executed as the " +"currently logged on user who must have permission to run them.
If " +"Hive and hive.server2.enable.doAs is enabled, will run the queries as " +"service account, but impersonate the currently logged on user via " +"hive.server2.proxy.user property." msgstr "" -#: superset/views/core.py:243 +#: superset/views/core.py:261 msgid "Expose in SQL Lab" msgstr "Esponi in SQL Lab" -#: superset/views/core.py:244 +#: superset/views/core.py:262 msgid "Allow CREATE TABLE AS" msgstr "Permetti CREATE TABLE AS" -#: superset/views/core.py:245 +#: superset/views/core.py:263 msgid "Allow DML" msgstr "Permetti DML" -#: superset/views/core.py:246 +#: superset/views/core.py:264 msgid "CTAS Schema" msgstr "Schema CTAS" -#: superset/views/core.py:248 superset/views/core.py:371 -#: superset/views/core.py:479 superset/views/core.py:543 +#: superset/views/core.py:266 superset/views/core.py:446 +#: superset/views/core.py:563 superset/views/core.py:630 msgid "Creator" msgstr "Creatore" -#: superset/views/core.py:250 +#: superset/views/core.py:268 msgid "SQLAlchemy URI" msgstr "URI SQLAlchemy" -#: superset/views/core.py:252 +#: superset/views/core.py:270 msgid "Extra" msgstr "Extra" -#: superset/views/core.py:253 +#: superset/views/core.py:271 msgid "Allow Run Sync" msgstr "" -#: superset/views/core.py:254 +#: superset/views/core.py:272 msgid "Allow Run Async" msgstr "" -#: superset/views/core.py:255 -msgid "Impersonate queries to the database" +#: superset/views/core.py:273 +msgid "Impersonate the logged on user" msgstr "" -#: superset/views/core.py:273 +#: superset/views/core.py:292 msgid "Import Dashboards" +msgstr "Importa dashboard" + +#: superset/views/core.py:323 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views/core.py:363 +msgid "CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"" msgstr "" -#: superset/views/core.py:315 superset/views/core.py:556 -#: superset/views/sql_lab.py:18 superset/views/sql_lab.py:54 +#: superset/views/core.py:389 superset/views/core.py:655 +#: superset/views/sql_lab.py:16 superset/views/sql_lab.py:53 msgid "User" msgstr "Utente" -#: superset/views/core.py:316 +#: superset/views/core.py:390 msgid "User Roles" msgstr "Ruoli Utente" -#: superset/views/core.py:317 +#: superset/views/core.py:391 msgid "Database URL" msgstr "URL del Database" -#: superset/views/core.py:319 +#: superset/views/core.py:393 msgid "Roles to grant" msgstr "Ruoli per l'accesso" -#: superset/views/core.py:320 +#: superset/views/core.py:394 msgid "Created On" msgstr "Creato il" -#: superset/views/core.py:326 +#: superset/views/core.py:400 msgid "Access requests" msgstr "" -#: superset/views/core.py:328 superset/views/core.py:567 +#: superset/views/core.py:402 superset/views/core.py:667 msgid "Security" -msgstr "" +msgstr "Sicurezza" -#: superset/views/core.py:335 -msgid "List Slices" -msgstr "" +#: superset/views/core.py:409 +msgid "List Charts" +msgstr "Visualizza grafici" -#: superset/views/core.py:336 -msgid "Show Slice" -msgstr "" +#: superset/views/core.py:410 +msgid "Show Chart" +msgstr "Mostra grafico" -#: superset/views/core.py:337 -msgid "Add Slice" -msgstr "" +#: superset/views/core.py:411 +msgid "Add Chart" +msgstr "Aggiungi grafico" -#: superset/views/core.py:338 -msgid "Edit Slice" -msgstr "" +#: superset/views/core.py:412 +msgid "Edit Chart" +msgstr "Modifica grafico" -#: superset/views/core.py:359 +#: superset/views/core.py:434 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -3450,43 +4495,43 @@ msgstr "" "JSON è esposto qui per referenza e per utenti esperti che vogliono " "modificare parametri specifici." -#: superset/views/core.py:364 +#: superset/views/core.py:440 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "Durata (in secondi) per il timeout della cache per questa slice." -#: superset/views/core.py:375 +#: superset/views/core.py:450 msgid "Last Modified" msgstr "Ultima Modifica" -#: superset/views/core.py:376 superset/views/core.py:478 +#: superset/views/core.py:451 superset/views/core.py:562 msgid "Owners" msgstr "Proprietari" -#: superset/views/core.py:377 +#: superset/views/core.py:452 msgid "Parameters" msgstr "Parametri" -#: superset/views/core.py:378 superset/views/core.py:420 -msgid "Slice" -msgstr "Slice" +#: superset/views/core.py:453 superset/views/core.py:500 +msgid "Chart" +msgstr "" -#: superset/views/core.py:437 +#: superset/views/core.py:520 msgid "List Dashboards" msgstr "" -#: superset/views/core.py:438 +#: superset/views/core.py:521 msgid "Show Dashboard" msgstr "" -#: superset/views/core.py:439 +#: superset/views/core.py:522 msgid "Add Dashboard" msgstr "" -#: superset/views/core.py:440 +#: superset/views/core.py:523 msgid "Edit Dashboard" msgstr "" -#: superset/views/core.py:451 +#: superset/views/core.py:535 msgid "" "This json object describes the positioning of the widgets in the " "dashboard. It is dynamically generated when adjusting the widgets size " @@ -3497,7 +4542,7 @@ msgstr "" "la dimensione usando la funzione di drag & drop nella vista della " "dashboard. " -#: superset/views/core.py:456 +#: superset/views/core.py:540 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" @@ -3505,11 +4550,11 @@ msgstr "" "Il CSS di ogni singola dashboard può essere modificato qui, oppure nella " "vista della dashboard dove i cambiamenti sono visibili immediatamente" -#: superset/views/core.py:460 +#: superset/views/core.py:544 msgid "To get a readable URL for your dashboard" msgstr "ottenere una URL leggibile per la tua dashboard" -#: superset/views/core.py:461 +#: superset/views/core.py:545 msgid "" "This JSON object is generated dynamically when clicking the save or " "overwrite button in the dashboard view. It is exposed here for reference " @@ -3520,163 +4565,188 @@ msgstr "" "qui come riferimento e per gli utenti esperti che vogliono modificare " "parametri specifici." -#: superset/views/core.py:466 +#: superset/views/core.py:550 msgid "Owners is a list of users who can alter the dashboard." msgstr "Proprietari è una lista di utenti che può alterare la dashboard." -#: superset/views/core.py:474 superset/views/core.py:541 +#: superset/views/core.py:558 superset/views/core.py:628 msgid "Dashboard" msgstr "Dashboard" -#: superset/views/core.py:476 +#: superset/views/core.py:560 msgid "Slug" msgstr "Slug" -#: superset/views/core.py:481 +#: superset/views/core.py:565 msgid "Position JSON" msgstr "Posizione del JSON" -#: superset/views/core.py:483 +#: superset/views/core.py:567 msgid "JSON Metadata" msgstr "Metadati JSON" -#: superset/views/core.py:484 +#: superset/views/core.py:568 msgid "Underlying Tables" msgstr "Tabelle sottostanti" -#: superset/views/core.py:507 +#: superset/views/core.py:591 msgid "Export" msgstr "" -#: superset/views/core.py:507 +#: superset/views/core.py:591 msgid "Export dashboards?" msgstr "" -#: superset/views/core.py:557 +#: superset/views/core.py:656 msgid "Action" msgstr "Azione" -#: superset/views/core.py:558 +#: superset/views/core.py:657 msgid "dttm" msgstr "dttm" -#: superset/views/core.py:565 +#: superset/views/core.py:665 msgid "Action Log" msgstr "" -#: superset/views/core.py:796 +#: superset/views/core.py:852 msgid "Access was requested" msgstr "" -#: superset/views/core.py:857 +#: superset/views/core.py:913 #, python-format msgid "" "%(user)s was granted the role %(role)s that gives access to the " "%(datasource)s" msgstr "" -#: superset/views/core.py:873 +#: superset/views/core.py:929 #, python-format msgid "Role %(r)s was extended to provide the access to the datasource %(ds)s" msgstr "" -#: superset/views/core.py:882 +#: superset/views/core.py:938 msgid "You have no permission to approve this request" msgstr "" -#: superset/views/core.py:1646 +#: superset/views/core.py:1230 superset/views/core.py:1235 +#: superset/views/core.py:1343 superset/views/core.py:1357 +msgid "You don't have the rights to " +msgstr "" + +#: superset/views/core.py:1230 superset/views/core.py:1343 +msgid "alter this " +msgstr "" + +#: superset/views/core.py:1230 superset/views/core.py:1235 +msgid "chart" +msgstr "" + +#: superset/views/core.py:1235 superset/views/core.py:1357 +msgid "create a " +msgstr "" + +#: superset/views/core.py:1344 superset/views/core.py:1357 +msgid "dashboard" +msgstr "" + +#: superset/views/core.py:1904 msgid "" "Malformed request. slice_id or table_name and db_name arguments are " "expected" msgstr "" -#: superset/views/core.py:1652 +#: superset/views/core.py:1910 #, python-format msgid "Slice %(id)s not found" msgstr "" -#: superset/views/core.py:1664 +#: superset/views/core.py:1922 #, python-format msgid "Table %(t)s wasn't found in the database %(d)s" msgstr "" -#: superset/views/core.py:1803 +#: superset/views/core.py:2071 #, python-format msgid "Can't find User '%(name)s', please ask your admin to create one." msgstr "" -#: superset/views/core.py:1810 +#: superset/views/core.py:2078 #, python-format msgid "Can't find DruidCluster with cluster_name = '%(name)s'" msgstr "" -#: superset/views/core.py:2071 +#: superset/views/core.py:2350 msgid "Query record was not created as expected." msgstr "" -#: superset/views/core.py:2357 +#: superset/views/core.py:2646 msgid "Template Name" msgstr "" -#: superset/views/core.py:2368 +#: superset/views/core.py:2658 msgid "CSS Templates" -msgstr "" +msgstr "Template CSS" -#: superset/views/core.py:2379 +#: superset/views/core.py:2669 msgid "SQL Editor" msgstr "Editor SQL" -#: superset/views/core.py:2384 superset/views/core.py:2393 +#: superset/views/core.py:2674 superset/views/core.py:2684 msgid "SQL Lab" msgstr "" -#: superset/views/core.py:2388 +#: superset/views/core.py:2679 msgid "Query Search" msgstr "Ricerca Query" -#: superset/views/sql_lab.py:20 +#: superset/views/core.py:2689 +msgid "Upload a CSV" +msgstr "" + +#: superset/views/sql_lab.py:18 msgid "Status" msgstr "" -#: superset/views/sql_lab.py:21 +#: superset/views/sql_lab.py:19 msgid "Start Time" msgstr "" -#: superset/views/sql_lab.py:22 superset/views/sql_lab.py:58 +#: superset/views/sql_lab.py:20 superset/views/sql_lab.py:57 msgid "End Time" msgstr "" -#: superset/views/sql_lab.py:28 +#: superset/views/sql_lab.py:27 msgid "Queries" msgstr "" -#: superset/views/sql_lab.py:37 +#: superset/views/sql_lab.py:36 msgid "List Saved Query" -msgstr "" +msgstr "Visualizza query salvate" -#: superset/views/sql_lab.py:38 +#: superset/views/sql_lab.py:37 msgid "Show Saved Query" -msgstr "" +msgstr "Mostra query salvate" -#: superset/views/sql_lab.py:39 +#: superset/views/sql_lab.py:38 msgid "Add Saved Query" -msgstr "" +msgstr "Aggiungi query salvata" -#: superset/views/sql_lab.py:40 +#: superset/views/sql_lab.py:39 msgid "Edit Saved Query" -msgstr "" +msgstr "Modifica query salvata" -#: superset/views/sql_lab.py:59 +#: superset/views/sql_lab.py:58 msgid "Pop Tab Link" msgstr "" -#: superset/views/sql_lab.py:60 +#: superset/views/sql_lab.py:59 msgid "Changed on" -msgstr "" +msgstr "Cambiato il" #: superset/views/sql_lab.py:79 msgid "Saved Queries" -msgstr "" +msgstr "Query salvate" #~ msgid "Your query was saved" #~ msgstr "" @@ -3688,7 +4758,7 @@ msgstr "" #~ msgstr "" #~ msgid "Could not connect to server" -#~ msgstr "" +#~ msgstr "Non posso connettermi al server" #~ msgid "Your session timed out, please refresh your page and try again." #~ msgstr "" @@ -4205,7 +5275,7 @@ msgstr "" #~ msgstr "" #~ msgid "Select %s" -#~ msgstr "" +#~ msgstr "Seleziona %s" #~ msgid "textarea" #~ msgstr "" @@ -5350,3 +6420,48 @@ msgstr "" #~ msgid "Select [%s]" #~ msgstr "" +#~ msgid "Please choose at least one \"Group by\" field " +#~ msgstr "Seleziona almeno un campo \"Group by\"" + +#~ msgid "'Group By' and 'Columns' can't overlap" +#~ msgstr "'Group by' e 'Colonne' non possono sovrapporsi" + +#~ msgid "Annotation layers to overlay on the visualization" +#~ msgstr "" + +#~ msgid "Select a annotation layer" +#~ msgstr "" + +#~ msgid "Error while fetching annotation layers" +#~ msgstr "" + +#~ msgid "Associated Slices" +#~ msgstr "Slice associate" + +#~ msgid "Welcome!" +#~ msgstr "" + +#~ msgid "" +#~ "All the queries in Sql Lab are " +#~ "going to be executed on behalf of" +#~ " currently authorized user." +#~ msgstr "" + +#~ msgid "Impersonate queries to the database" +#~ msgstr "" + +#~ msgid "List Slices" +#~ msgstr "" + +#~ msgid "Show Slice" +#~ msgstr "" + +#~ msgid "Add Slice" +#~ msgstr "" + +#~ msgid "Edit Slice" +#~ msgstr "" + +#~ msgid "Slice" +#~ msgstr "Slice" + From ff685db4d95987092f38c3fb83b0313e7363c9d1 Mon Sep 17 00:00:00 2001 From: Jinyang Zhou Date: Mon, 26 Feb 2018 07:00:10 +0800 Subject: [PATCH 05/24] add organization (#4478) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0f3d12c0b15c7..ef5464ee6c11c 100644 --- a/README.md +++ b/README.md @@ -178,6 +178,7 @@ the world know they are using Superset. Join our growing community! - [Udemy](https://www.udemy.com/) - [VIPKID](https://www.vipkid.com.cn/) - [Yahoo!](https://yahoo.com/) + - [Zaihang](http://www.zaih.com/) - [Zalando](https://www.zalando.com) From d57a37e34113323a478d04b0ad26eff4fe39c32b Mon Sep 17 00:00:00 2001 From: John Bodley <4567245+john-bodley@users.noreply.github.com> Date: Sun, 25 Feb 2018 15:06:11 -0800 Subject: [PATCH 06/24] [flake8] Adding flake8-coding (#4477) --- scripts/permissions_cleanup.py | 1 + setup.py | 1 + superset/__init__.py | 1 + superset/cache_util.py | 1 + superset/cli.py | 1 + superset/config.py | 1 + superset/connectors/base/models.py | 1 + superset/connectors/base/views.py | 1 + superset/connectors/connector_registry.py | 1 + superset/connectors/druid/__init__.py | 1 + superset/connectors/druid/models.py | 1 + superset/connectors/druid/views.py | 1 + superset/connectors/sqla/__init__.py | 1 + superset/connectors/sqla/models.py | 1 + superset/connectors/sqla/views.py | 1 + superset/dataframe.py | 1 + superset/db_engine_specs.py | 1 + superset/db_engines/hive.py | 1 + superset/db_engines/presto.py | 1 + superset/dict_import_export_util.py | 1 + superset/forms.py | 1 + superset/import_util.py | 1 + superset/jinja_context.py | 1 + superset/legacy.py | 1 + superset/migrations/env.py | 1 + ...1226819ee0e3_fix_wrong_constraint_on_table_columns.py | 1 + .../migrations/versions/1296d28ec131_druid_exports.py | 1 + superset/migrations/versions/12d55656cbca_is_featured.py | 1 + .../versions/18e88e1cc004_making_audit_nullable.py | 1 + .../versions/19a814813610_adding_metric_warning_text.py | 1 + .../versions/1a48a5411020_adding_slug_to_dash.py | 1 + superset/migrations/versions/1d2ddd543133_log_dt.py | 1 + superset/migrations/versions/1e2841a4128_.py | 1 + .../versions/21e88bc06c02_annotation_migration.py | 1 + superset/migrations/versions/2591d77e9831_user_id.py | 1 + .../versions/27ae655e4247_make_creator_owners.py | 1 + .../versions/289ce07647b_add_encrypted_password_field.py | 1 + .../versions/2929af7925ed_tz_offsets_in_data_sources.py | 1 + .../migrations/versions/2fcdcb35e487_saved_queries.py | 5 +++-- .../migrations/versions/315b3f4da9b0_adding_log_model.py | 1 + .../versions/33d996bcc382_update_slice_model.py | 1 + .../versions/3b626e2a6783_sync_db_with_models.py | 1 + .../versions/3c3ffe173e4f_add_sql_string_to_table.py | 1 + .../41f6a59a61f2_database_options_for_sql_lab.py | 1 + superset/migrations/versions/430039611635_log_more.py | 1 + superset/migrations/versions/43df8de3a5f4_dash_json.py | 1 + .../versions/4500485bde7d_allow_run_sync_async.py | 1 + superset/migrations/versions/472d2f73dfd4_.py | 1 + superset/migrations/versions/4736ec66ce19_.py | 1 + superset/migrations/versions/4e6a06bad7a8_init.py | 1 + .../versions/4fa88fe24e94_owners_many_to_many.py | 9 +++++---- .../migrations/versions/525c854f0005_log_this_plus.py | 1 + superset/migrations/versions/55179c7f25c7_sqla_descr.py | 1 + superset/migrations/versions/5a7bad26f2a7_.py | 1 + .../versions/5e4a03ef0bf0_add_request_access_model.py | 1 + superset/migrations/versions/6414e83d82b7_.py | 1 + superset/migrations/versions/65903709c321_allow_dml.py | 1 + .../versions/67a6ac9b727b_update_spatial_params.py | 1 + .../versions/732f1c06bcbf_add_fetch_values_predicate.py | 1 + .../migrations/versions/763d4b211ec9_fixing_audit_fk.py | 1 + .../versions/7dbf98566af7_slice_description.py | 1 + .../versions/7e3ddad2a00b_results_key_to_query.py | 1 + .../migrations/versions/836c0bf75904_cache_timeouts.py | 1 + .../867bf4f117f9_adding_extra_field_to_database_model.py | 1 + superset/migrations/versions/8e80a26a31db_.py | 1 + .../versions/956a063c52b3_adjusting_key_length.py | 1 + superset/migrations/versions/960c69cb1f5b_.py | 1 + superset/migrations/versions/979c03af3341_.py | 1 + .../versions/a2d606a761d9_adding_favstar_model.py | 1 + .../a65458420354_add_result_backend_time_logging.py | 1 + .../versions/a6c18f869a4e_query_start_running_time.py | 1 + ...a99f2f7c195a_rewriting_url_from_shortner_with_new_.py | 1 + .../versions/a9c47e2c1547_add_impersonate_user_to_dbs.py | 1 + .../ab3d66c4246e_add_cache_timeout_to_druid_cluster.py | 1 + .../migrations/versions/ad4d656d92bc_add_avg_metric.py | 1 + .../migrations/versions/ad82a75afd82_add_query_model.py | 5 +++-- .../b318dfe5fb6c_adding_verbose_name_to_druid_column.py | 1 + superset/migrations/versions/b347b202819b_.py | 1 + .../b4456560d4f3_change_table_unique_constraint.py | 5 +++-- .../versions/b46fa1b0b39e_add_params_to_tables.py | 1 + .../versions/bb51420eaf83_add_schema_to_table_model.py | 1 + .../migrations/versions/bcf3126872fc_add_keyvalue.py | 1 + .../versions/c3a8f8611885_materializing_permission.py | 1 + superset/migrations/versions/c611f2b591b8_dim_spec.py | 1 + .../migrations/versions/ca69c70ec99b_tracking_url.py | 1 + superset/migrations/versions/d2424a248d63_.py | 1 + superset/migrations/versions/d39b1e37131d_.py | 1 + superset/migrations/versions/d6db5a5cdb5d_.py | 1 + .../migrations/versions/d827694c7555_css_templates.py | 1 + .../d8bc074f7aad_add_new_field_is_restricted_to_.py | 5 +++-- .../versions/db0c65b146bd_update_slice_model_json.py | 1 + .../versions/db527d8c4c78_add_db_verbose_name.py | 1 + superset/migrations/versions/ddd6ebdd853b_annotations.py | 3 ++- .../versions/e46f2d27a08e_materialize_perms.py | 1 + .../migrations/versions/e866bd2d4976_smaller_grid.py | 1 + superset/migrations/versions/ea033256294a_.py | 1 + .../versions/eca4694defa7_sqllab_setting_defaults.py | 1 + superset/migrations/versions/ef8843b41dac_.py | 1 + .../f0fbf6129e13_adding_verbose_name_to_tablecolumn.py | 1 + .../versions/f162a1dea4c4_d3format_by_metric.py | 1 + .../versions/f18570e03440_add_query_result_key_index.py | 1 + superset/migrations/versions/f1f2d4af5b90_.py | 1 + superset/migrations/versions/f959a6652acd_.py | 1 + superset/migrations/versions/fee7b758c130_.py | 1 + superset/models/__init__.py | 1 + superset/models/annotations.py | 1 + superset/models/core.py | 1 + superset/models/helpers.py | 1 + superset/models/sql_lab.py | 1 + superset/security.py | 1 + superset/sql_lab.py | 1 + superset/sql_parse.py | 1 + superset/stats_logger.py | 1 + superset/translations/utils.py | 1 + superset/utils.py | 1 + superset/views/__init__.py | 1 + superset/views/annotations.py | 1 + superset/views/base.py | 1 + superset/views/core.py | 5 +++-- superset/views/sql_lab.py | 1 + superset/viz.py | 1 + tests/access_tests.py | 1 + tests/base_tests.py | 1 + tests/celery_tests.py | 1 + tests/core_tests.py | 1 + tests/db_engine_specs_test.py | 1 + tests/dict_import_export_tests.py | 1 + tests/druid_func_tests.py | 1 + tests/druid_tests.py | 1 + tests/email_tests.py | 1 + tests/import_export_tests.py | 1 + tests/model_tests.py | 1 + tests/security_tests.py | 1 + tests/sqllab_tests.py | 1 + tests/superset_test_config.py | 1 + tests/utils_tests.py | 1 + tests/viz_tests.py | 1 + tox.ini | 2 ++ 138 files changed, 154 insertions(+), 15 deletions(-) diff --git a/scripts/permissions_cleanup.py b/scripts/permissions_cleanup.py index 8d6e81eb6f23e..edc9790b1a480 100644 --- a/scripts/permissions_cleanup.py +++ b/scripts/permissions_cleanup.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/setup.py b/setup.py index cb5303173c3c1..4bc9412a45991 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/__init__.py b/superset/__init__.py index 8aabca403cc63..778bb6161681c 100644 --- a/superset/__init__.py +++ b/superset/__init__.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Package's main module!""" from __future__ import absolute_import from __future__ import division diff --git a/superset/cache_util.py b/superset/cache_util.py index 833ee419b693e..be6b6d5d742c3 100644 --- a/superset/cache_util.py +++ b/superset/cache_util.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/cli.py b/superset/cli.py index 5c1f6081308ab..48db7394b9dae 100755 --- a/superset/cli.py +++ b/superset/cli.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/config.py b/superset/config.py index 9e84c466b1dab..ae81cfcb6e402 100644 --- a/superset/config.py +++ b/superset/config.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """The main config file for Superset All configuration in this file can be overridden by providing a superset_config diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py index 9291562d4d2dd..7a115988af8c2 100644 --- a/superset/connectors/base/models.py +++ b/superset/connectors/base/models.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/connectors/base/views.py b/superset/connectors/base/views.py index 11c88cabbddf2..42ce670270872 100644 --- a/superset/connectors/base/views.py +++ b/superset/connectors/base/views.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/connectors/connector_registry.py b/superset/connectors/connector_registry.py index 9b349975a596d..0a6291ab48d77 100644 --- a/superset/connectors/connector_registry.py +++ b/superset/connectors/connector_registry.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/connectors/druid/__init__.py b/superset/connectors/druid/__init__.py index b2df79851f224..a60249b87bb83 100644 --- a/superset/connectors/druid/__init__.py +++ b/superset/connectors/druid/__init__.py @@ -1,2 +1,3 @@ +# -*- coding: utf-8 -*- from . import models # noqa from . import views # noqa diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index e02bbf615d5e0..339dd6986b155 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # pylint: disable=invalid-unary-operand-type from __future__ import absolute_import from __future__ import division diff --git a/superset/connectors/druid/views.py b/superset/connectors/druid/views.py index 1277dc6f554d7..53b3670debec3 100644 --- a/superset/connectors/druid/views.py +++ b/superset/connectors/druid/views.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/connectors/sqla/__init__.py b/superset/connectors/sqla/__init__.py index b2df79851f224..a60249b87bb83 100644 --- a/superset/connectors/sqla/__init__.py +++ b/superset/connectors/sqla/__init__.py @@ -1,2 +1,3 @@ +# -*- coding: utf-8 -*- from . import models # noqa from . import views # noqa diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index c3d36e7645cbe..3b636e8fa2870 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/connectors/sqla/views.py b/superset/connectors/sqla/views.py index db1fe3d753f22..8398cbcbdd135 100644 --- a/superset/connectors/sqla/views.py +++ b/superset/connectors/sqla/views.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Views used by the SqlAlchemy connector""" from __future__ import absolute_import from __future__ import division diff --git a/superset/dataframe.py b/superset/dataframe.py index cd9f95fd2f323..62d6cf45dd8d6 100644 --- a/superset/dataframe.py +++ b/superset/dataframe.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Superset wrapper around pandas.DataFrame. TODO(bkyryliuk): add support for the conventions like: *_dim or dim_* diff --git a/superset/db_engine_specs.py b/superset/db_engine_specs.py index f0e7c67620712..0c5d5ec2d914b 100644 --- a/superset/db_engine_specs.py +++ b/superset/db_engine_specs.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Compatibility layer for different database engines This modules stores logic specific to different database engines. Things diff --git a/superset/db_engines/hive.py b/superset/db_engines/hive.py index 67ccb4d853eb3..4f677faefb33e 100644 --- a/superset/db_engines/hive.py +++ b/superset/db_engines/hive.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/db_engines/presto.py b/superset/db_engines/presto.py index 60837cc943c8f..724cb9e08fe96 100644 --- a/superset/db_engines/presto.py +++ b/superset/db_engines/presto.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/dict_import_export_util.py b/superset/dict_import_export_util.py index 8a02df05778d2..4f7660ec84ceb 100644 --- a/superset/dict_import_export_util.py +++ b/superset/dict_import_export_util.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/forms.py b/superset/forms.py index e24ff03fa8db8..eb8aba889a086 100644 --- a/superset/forms.py +++ b/superset/forms.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Contains the logic to create cohesive forms on the explore view""" from __future__ import absolute_import from __future__ import division diff --git a/superset/import_util.py b/superset/import_util.py index 180477d7eb741..877cb90020c06 100644 --- a/superset/import_util.py +++ b/superset/import_util.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/jinja_context.py b/superset/jinja_context.py index dad3e9ace30fc..fe93594fce064 100644 --- a/superset/jinja_context.py +++ b/superset/jinja_context.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Defines the templating context for SQL Lab""" from __future__ import absolute_import from __future__ import division diff --git a/superset/legacy.py b/superset/legacy.py index b89b84f0fd2e7..88d75709967cd 100644 --- a/superset/legacy.py +++ b/superset/legacy.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Code related with dealing with legacy / change management""" from __future__ import absolute_import from __future__ import division diff --git a/superset/migrations/env.py b/superset/migrations/env.py index 599bda71fa822..07340485f8d4c 100755 --- a/superset/migrations/env.py +++ b/superset/migrations/env.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import with_statement import logging diff --git a/superset/migrations/versions/1226819ee0e3_fix_wrong_constraint_on_table_columns.py b/superset/migrations/versions/1226819ee0e3_fix_wrong_constraint_on_table_columns.py index b77cb9c38fade..a3279ca3b5a8a 100644 --- a/superset/migrations/versions/1226819ee0e3_fix_wrong_constraint_on_table_columns.py +++ b/superset/migrations/versions/1226819ee0e3_fix_wrong_constraint_on_table_columns.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Fix wrong constraint on table columns Revision ID: 1226819ee0e3 diff --git a/superset/migrations/versions/1296d28ec131_druid_exports.py b/superset/migrations/versions/1296d28ec131_druid_exports.py index 6df37bcda5931..0b97806f75197 100644 --- a/superset/migrations/versions/1296d28ec131_druid_exports.py +++ b/superset/migrations/versions/1296d28ec131_druid_exports.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Adds params to the datasource (druid) table Revision ID: 1296d28ec131 diff --git a/superset/migrations/versions/12d55656cbca_is_featured.py b/superset/migrations/versions/12d55656cbca_is_featured.py index 3158223743064..66f6ef2154588 100644 --- a/superset/migrations/versions/12d55656cbca_is_featured.py +++ b/superset/migrations/versions/12d55656cbca_is_featured.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """is_featured Revision ID: 12d55656cbca diff --git a/superset/migrations/versions/18e88e1cc004_making_audit_nullable.py b/superset/migrations/versions/18e88e1cc004_making_audit_nullable.py index 0143aad58722b..3bb660005b60b 100644 --- a/superset/migrations/versions/18e88e1cc004_making_audit_nullable.py +++ b/superset/migrations/versions/18e88e1cc004_making_audit_nullable.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """making audit nullable Revision ID: 18e88e1cc004 diff --git a/superset/migrations/versions/19a814813610_adding_metric_warning_text.py b/superset/migrations/versions/19a814813610_adding_metric_warning_text.py index cf39a0e631599..ab0165e87730e 100644 --- a/superset/migrations/versions/19a814813610_adding_metric_warning_text.py +++ b/superset/migrations/versions/19a814813610_adding_metric_warning_text.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Adding metric warning_text Revision ID: 19a814813610 diff --git a/superset/migrations/versions/1a48a5411020_adding_slug_to_dash.py b/superset/migrations/versions/1a48a5411020_adding_slug_to_dash.py index c6b88642b254b..b5efe73432998 100644 --- a/superset/migrations/versions/1a48a5411020_adding_slug_to_dash.py +++ b/superset/migrations/versions/1a48a5411020_adding_slug_to_dash.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """adding slug to dash Revision ID: 1a48a5411020 diff --git a/superset/migrations/versions/1d2ddd543133_log_dt.py b/superset/migrations/versions/1d2ddd543133_log_dt.py index a5f50f4f64c38..70cda0a0061a0 100644 --- a/superset/migrations/versions/1d2ddd543133_log_dt.py +++ b/superset/migrations/versions/1d2ddd543133_log_dt.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """log dt Revision ID: 1d2ddd543133 diff --git a/superset/migrations/versions/1e2841a4128_.py b/superset/migrations/versions/1e2841a4128_.py index 330b3b217c010..459a555086734 100644 --- a/superset/migrations/versions/1e2841a4128_.py +++ b/superset/migrations/versions/1e2841a4128_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 1e2841a4128 diff --git a/superset/migrations/versions/21e88bc06c02_annotation_migration.py b/superset/migrations/versions/21e88bc06c02_annotation_migration.py index 4c7bb807aff04..9a0e407eb0476 100644 --- a/superset/migrations/versions/21e88bc06c02_annotation_migration.py +++ b/superset/migrations/versions/21e88bc06c02_annotation_migration.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import json from alembic import op diff --git a/superset/migrations/versions/2591d77e9831_user_id.py b/superset/migrations/versions/2591d77e9831_user_id.py index 4fac61ce9eb31..2e3b7d1b30803 100644 --- a/superset/migrations/versions/2591d77e9831_user_id.py +++ b/superset/migrations/versions/2591d77e9831_user_id.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """user_id Revision ID: 2591d77e9831 diff --git a/superset/migrations/versions/27ae655e4247_make_creator_owners.py b/superset/migrations/versions/27ae655e4247_make_creator_owners.py index 2c3cdc1ed289c..92b455b86b564 100644 --- a/superset/migrations/versions/27ae655e4247_make_creator_owners.py +++ b/superset/migrations/versions/27ae655e4247_make_creator_owners.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Make creator owners Revision ID: 27ae655e4247 diff --git a/superset/migrations/versions/289ce07647b_add_encrypted_password_field.py b/superset/migrations/versions/289ce07647b_add_encrypted_password_field.py index 6d64887b2ff32..027a2555938ab 100644 --- a/superset/migrations/versions/289ce07647b_add_encrypted_password_field.py +++ b/superset/migrations/versions/289ce07647b_add_encrypted_password_field.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Add encrypted password field Revision ID: 289ce07647b diff --git a/superset/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py b/superset/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py index 85b54bc5cc31c..19845604e397c 100644 --- a/superset/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py +++ b/superset/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """TZ offsets in data sources Revision ID: 2929af7925ed diff --git a/superset/migrations/versions/2fcdcb35e487_saved_queries.py b/superset/migrations/versions/2fcdcb35e487_saved_queries.py index 43aa277c55055..629cc7610f1ff 100644 --- a/superset/migrations/versions/2fcdcb35e487_saved_queries.py +++ b/superset/migrations/versions/2fcdcb35e487_saved_queries.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """saved_queries Revision ID: 2fcdcb35e487 @@ -30,8 +31,8 @@ def upgrade(): sa.Column('created_by_fk', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['changed_by_fk'], ['ab_user.id'], ), sa.ForeignKeyConstraint(['created_by_fk'], ['ab_user.id'], ), - sa.ForeignKeyConstraint(['user_id'], [u'ab_user.id'], ), - sa.ForeignKeyConstraint(['db_id'], [u'dbs.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['ab_user.id'], ), + sa.ForeignKeyConstraint(['db_id'], ['dbs.id'], ), sa.PrimaryKeyConstraint('id') ) diff --git a/superset/migrations/versions/315b3f4da9b0_adding_log_model.py b/superset/migrations/versions/315b3f4da9b0_adding_log_model.py index d9fdfaccea1b3..ddceff571f513 100644 --- a/superset/migrations/versions/315b3f4da9b0_adding_log_model.py +++ b/superset/migrations/versions/315b3f4da9b0_adding_log_model.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """adding log model Revision ID: 315b3f4da9b0 diff --git a/superset/migrations/versions/33d996bcc382_update_slice_model.py b/superset/migrations/versions/33d996bcc382_update_slice_model.py index a92a959c5c151..28ef8310a3fe7 100644 --- a/superset/migrations/versions/33d996bcc382_update_slice_model.py +++ b/superset/migrations/versions/33d996bcc382_update_slice_model.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from alembic import op import sqlalchemy as sa from superset import db diff --git a/superset/migrations/versions/3b626e2a6783_sync_db_with_models.py b/superset/migrations/versions/3b626e2a6783_sync_db_with_models.py index e20b8d4806566..f1bf94968fbd8 100644 --- a/superset/migrations/versions/3b626e2a6783_sync_db_with_models.py +++ b/superset/migrations/versions/3b626e2a6783_sync_db_with_models.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Sync DB with the models.py. Sqlite doesn't support alter on tables, that's why most of the operations diff --git a/superset/migrations/versions/3c3ffe173e4f_add_sql_string_to_table.py b/superset/migrations/versions/3c3ffe173e4f_add_sql_string_to_table.py index 5b64bc40df2f0..d73bdc0be486f 100644 --- a/superset/migrations/versions/3c3ffe173e4f_add_sql_string_to_table.py +++ b/superset/migrations/versions/3c3ffe173e4f_add_sql_string_to_table.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """add_sql_string_to_table Revision ID: 3c3ffe173e4f diff --git a/superset/migrations/versions/41f6a59a61f2_database_options_for_sql_lab.py b/superset/migrations/versions/41f6a59a61f2_database_options_for_sql_lab.py index 18a54416e67c5..484d0935dd421 100644 --- a/superset/migrations/versions/41f6a59a61f2_database_options_for_sql_lab.py +++ b/superset/migrations/versions/41f6a59a61f2_database_options_for_sql_lab.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """database options for sql lab Revision ID: 41f6a59a61f2 diff --git a/superset/migrations/versions/430039611635_log_more.py b/superset/migrations/versions/430039611635_log_more.py index aec2b32ed95c4..6b8cbb331a85a 100644 --- a/superset/migrations/versions/430039611635_log_more.py +++ b/superset/migrations/versions/430039611635_log_more.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """log more Revision ID: 430039611635 diff --git a/superset/migrations/versions/43df8de3a5f4_dash_json.py b/superset/migrations/versions/43df8de3a5f4_dash_json.py index c56ddc8f5fb26..9dcc7b2ff67d0 100644 --- a/superset/migrations/versions/43df8de3a5f4_dash_json.py +++ b/superset/migrations/versions/43df8de3a5f4_dash_json.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 43df8de3a5f4 diff --git a/superset/migrations/versions/4500485bde7d_allow_run_sync_async.py b/superset/migrations/versions/4500485bde7d_allow_run_sync_async.py index 0695e2cda59b6..deee3c019660f 100644 --- a/superset/migrations/versions/4500485bde7d_allow_run_sync_async.py +++ b/superset/migrations/versions/4500485bde7d_allow_run_sync_async.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """allow_run_sync_async Revision ID: 4500485bde7d diff --git a/superset/migrations/versions/472d2f73dfd4_.py b/superset/migrations/versions/472d2f73dfd4_.py index d74fd03a7b7c1..d5a1c039208c8 100644 --- a/superset/migrations/versions/472d2f73dfd4_.py +++ b/superset/migrations/versions/472d2f73dfd4_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 472d2f73dfd4 diff --git a/superset/migrations/versions/4736ec66ce19_.py b/superset/migrations/versions/4736ec66ce19_.py index de86a392292ad..280132d61ec81 100644 --- a/superset/migrations/versions/4736ec66ce19_.py +++ b/superset/migrations/versions/4736ec66ce19_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 4736ec66ce19 diff --git a/superset/migrations/versions/4e6a06bad7a8_init.py b/superset/migrations/versions/4e6a06bad7a8_init.py index add55f86714a9..7c06134c09aea 100644 --- a/superset/migrations/versions/4e6a06bad7a8_init.py +++ b/superset/migrations/versions/4e6a06bad7a8_init.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Init Revision ID: 4e6a06bad7a8 diff --git a/superset/migrations/versions/4fa88fe24e94_owners_many_to_many.py b/superset/migrations/versions/4fa88fe24e94_owners_many_to_many.py index 8cd1123097f8e..b8601e14fe248 100644 --- a/superset/migrations/versions/4fa88fe24e94_owners_many_to_many.py +++ b/superset/migrations/versions/4fa88fe24e94_owners_many_to_many.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """owners_many_to_many Revision ID: 4fa88fe24e94 @@ -19,16 +20,16 @@ def upgrade(): sa.Column('id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('dashboard_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint(['dashboard_id'], [u'dashboards.id'], ), - sa.ForeignKeyConstraint(['user_id'], [u'ab_user.id'], ), + sa.ForeignKeyConstraint(['dashboard_id'], ['dashboards.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['ab_user.id'], ), sa.PrimaryKeyConstraint('id'), ) op.create_table('slice_user', sa.Column('id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('slice_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint(['slice_id'], [u'slices.id'], ), - sa.ForeignKeyConstraint(['user_id'], [u'ab_user.id'], ), + sa.ForeignKeyConstraint(['slice_id'], ['slices.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['ab_user.id'], ), sa.PrimaryKeyConstraint('id'), ) diff --git a/superset/migrations/versions/525c854f0005_log_this_plus.py b/superset/migrations/versions/525c854f0005_log_this_plus.py index 9eaebef2a9900..1db3f5c76006a 100644 --- a/superset/migrations/versions/525c854f0005_log_this_plus.py +++ b/superset/migrations/versions/525c854f0005_log_this_plus.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """log_this_plus Revision ID: 525c854f0005 diff --git a/superset/migrations/versions/55179c7f25c7_sqla_descr.py b/superset/migrations/versions/55179c7f25c7_sqla_descr.py index aade0b930aa0c..814da0b184f0e 100644 --- a/superset/migrations/versions/55179c7f25c7_sqla_descr.py +++ b/superset/migrations/versions/55179c7f25c7_sqla_descr.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """sqla_descr Revision ID: 55179c7f25c7 diff --git a/superset/migrations/versions/5a7bad26f2a7_.py b/superset/migrations/versions/5a7bad26f2a7_.py index 66dc20aae35e2..d70a5ab7eb1b8 100644 --- a/superset/migrations/versions/5a7bad26f2a7_.py +++ b/superset/migrations/versions/5a7bad26f2a7_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 5a7bad26f2a7 diff --git a/superset/migrations/versions/5e4a03ef0bf0_add_request_access_model.py b/superset/migrations/versions/5e4a03ef0bf0_add_request_access_model.py index ad6375f1837c4..b580e239cca0f 100644 --- a/superset/migrations/versions/5e4a03ef0bf0_add_request_access_model.py +++ b/superset/migrations/versions/5e4a03ef0bf0_add_request_access_model.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Add access_request table to manage requests to access datastores. Revision ID: 5e4a03ef0bf0 diff --git a/superset/migrations/versions/6414e83d82b7_.py b/superset/migrations/versions/6414e83d82b7_.py index 35dabe1bc2dfa..ed1edec6fe674 100644 --- a/superset/migrations/versions/6414e83d82b7_.py +++ b/superset/migrations/versions/6414e83d82b7_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 6414e83d82b7 diff --git a/superset/migrations/versions/65903709c321_allow_dml.py b/superset/migrations/versions/65903709c321_allow_dml.py index 9860c503a9ba3..cf5f50a6fb853 100644 --- a/superset/migrations/versions/65903709c321_allow_dml.py +++ b/superset/migrations/versions/65903709c321_allow_dml.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """allow_dml Revision ID: 65903709c321 diff --git a/superset/migrations/versions/67a6ac9b727b_update_spatial_params.py b/superset/migrations/versions/67a6ac9b727b_update_spatial_params.py index b3e81d6e96443..e322c5eea52c1 100644 --- a/superset/migrations/versions/67a6ac9b727b_update_spatial_params.py +++ b/superset/migrations/versions/67a6ac9b727b_update_spatial_params.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """update_spatial_params Revision ID: 67a6ac9b727b diff --git a/superset/migrations/versions/732f1c06bcbf_add_fetch_values_predicate.py b/superset/migrations/versions/732f1c06bcbf_add_fetch_values_predicate.py index 2d7ce54107a83..7ad56c7f23b6e 100644 --- a/superset/migrations/versions/732f1c06bcbf_add_fetch_values_predicate.py +++ b/superset/migrations/versions/732f1c06bcbf_add_fetch_values_predicate.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """add fetch values predicate Revision ID: 732f1c06bcbf diff --git a/superset/migrations/versions/763d4b211ec9_fixing_audit_fk.py b/superset/migrations/versions/763d4b211ec9_fixing_audit_fk.py index d8feb778216fe..f25b3bab36444 100644 --- a/superset/migrations/versions/763d4b211ec9_fixing_audit_fk.py +++ b/superset/migrations/versions/763d4b211ec9_fixing_audit_fk.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """fixing audit fk Revision ID: 763d4b211ec9 diff --git a/superset/migrations/versions/7dbf98566af7_slice_description.py b/superset/migrations/versions/7dbf98566af7_slice_description.py index 329af9ef2d78d..58e295d426045 100644 --- a/superset/migrations/versions/7dbf98566af7_slice_description.py +++ b/superset/migrations/versions/7dbf98566af7_slice_description.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 7dbf98566af7 diff --git a/superset/migrations/versions/7e3ddad2a00b_results_key_to_query.py b/superset/migrations/versions/7e3ddad2a00b_results_key_to_query.py index f2a46085631da..b2ae3dabd962e 100644 --- a/superset/migrations/versions/7e3ddad2a00b_results_key_to_query.py +++ b/superset/migrations/versions/7e3ddad2a00b_results_key_to_query.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """results_key to query Revision ID: 7e3ddad2a00b diff --git a/superset/migrations/versions/836c0bf75904_cache_timeouts.py b/superset/migrations/versions/836c0bf75904_cache_timeouts.py index d050c49c0bb4b..b5e5d4719004b 100644 --- a/superset/migrations/versions/836c0bf75904_cache_timeouts.py +++ b/superset/migrations/versions/836c0bf75904_cache_timeouts.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """cache_timeouts Revision ID: 836c0bf75904 diff --git a/superset/migrations/versions/867bf4f117f9_adding_extra_field_to_database_model.py b/superset/migrations/versions/867bf4f117f9_adding_extra_field_to_database_model.py index 3a46ffe18a902..86818545696d2 100644 --- a/superset/migrations/versions/867bf4f117f9_adding_extra_field_to_database_model.py +++ b/superset/migrations/versions/867bf4f117f9_adding_extra_field_to_database_model.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Adding extra field to Database model Revision ID: 867bf4f117f9 diff --git a/superset/migrations/versions/8e80a26a31db_.py b/superset/migrations/versions/8e80a26a31db_.py index 54edc58a80a36..b80c82dcf0ae4 100644 --- a/superset/migrations/versions/8e80a26a31db_.py +++ b/superset/migrations/versions/8e80a26a31db_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 8e80a26a31db diff --git a/superset/migrations/versions/956a063c52b3_adjusting_key_length.py b/superset/migrations/versions/956a063c52b3_adjusting_key_length.py index d83f63212846d..843433ee50509 100644 --- a/superset/migrations/versions/956a063c52b3_adjusting_key_length.py +++ b/superset/migrations/versions/956a063c52b3_adjusting_key_length.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """adjusting key length Revision ID: 956a063c52b3 diff --git a/superset/migrations/versions/960c69cb1f5b_.py b/superset/migrations/versions/960c69cb1f5b_.py index 62ee976577d11..a7ac3dfdef1d6 100644 --- a/superset/migrations/versions/960c69cb1f5b_.py +++ b/superset/migrations/versions/960c69cb1f5b_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """add dttm_format related fields in table_columns Revision ID: 960c69cb1f5b diff --git a/superset/migrations/versions/979c03af3341_.py b/superset/migrations/versions/979c03af3341_.py index 6cb241f388d01..48c37277e1095 100644 --- a/superset/migrations/versions/979c03af3341_.py +++ b/superset/migrations/versions/979c03af3341_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: 979c03af3341 diff --git a/superset/migrations/versions/a2d606a761d9_adding_favstar_model.py b/superset/migrations/versions/a2d606a761d9_adding_favstar_model.py index 16087cb82cf2e..5de6fe09cb31e 100644 --- a/superset/migrations/versions/a2d606a761d9_adding_favstar_model.py +++ b/superset/migrations/versions/a2d606a761d9_adding_favstar_model.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """adding favstar model Revision ID: a2d606a761d9 diff --git a/superset/migrations/versions/a65458420354_add_result_backend_time_logging.py b/superset/migrations/versions/a65458420354_add_result_backend_time_logging.py index 49a9d1b74e812..5eddea19489ce 100644 --- a/superset/migrations/versions/a65458420354_add_result_backend_time_logging.py +++ b/superset/migrations/versions/a65458420354_add_result_backend_time_logging.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """add_result_backend_time_logging Revision ID: a65458420354 diff --git a/superset/migrations/versions/a6c18f869a4e_query_start_running_time.py b/superset/migrations/versions/a6c18f869a4e_query_start_running_time.py index 0f89b3f516df9..53b4fcbeac04d 100644 --- a/superset/migrations/versions/a6c18f869a4e_query_start_running_time.py +++ b/superset/migrations/versions/a6c18f869a4e_query_start_running_time.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """query.start_running_time Revision ID: a6c18f869a4e diff --git a/superset/migrations/versions/a99f2f7c195a_rewriting_url_from_shortner_with_new_.py b/superset/migrations/versions/a99f2f7c195a_rewriting_url_from_shortner_with_new_.py index 818d08d830088..0ef58981c372c 100644 --- a/superset/migrations/versions/a99f2f7c195a_rewriting_url_from_shortner_with_new_.py +++ b/superset/migrations/versions/a99f2f7c195a_rewriting_url_from_shortner_with_new_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """rewriting url from shortner with new format Revision ID: a99f2f7c195a diff --git a/superset/migrations/versions/a9c47e2c1547_add_impersonate_user_to_dbs.py b/superset/migrations/versions/a9c47e2c1547_add_impersonate_user_to_dbs.py index e0cf1e286cbfd..5bc122277dda9 100644 --- a/superset/migrations/versions/a9c47e2c1547_add_impersonate_user_to_dbs.py +++ b/superset/migrations/versions/a9c47e2c1547_add_impersonate_user_to_dbs.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """add impersonate_user to dbs Revision ID: a9c47e2c1547 diff --git a/superset/migrations/versions/ab3d66c4246e_add_cache_timeout_to_druid_cluster.py b/superset/migrations/versions/ab3d66c4246e_add_cache_timeout_to_druid_cluster.py index 07c9c9172699c..82982a18de4b4 100644 --- a/superset/migrations/versions/ab3d66c4246e_add_cache_timeout_to_druid_cluster.py +++ b/superset/migrations/versions/ab3d66c4246e_add_cache_timeout_to_druid_cluster.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """add_cache_timeout_to_druid_cluster Revision ID: ab3d66c4246e diff --git a/superset/migrations/versions/ad4d656d92bc_add_avg_metric.py b/superset/migrations/versions/ad4d656d92bc_add_avg_metric.py index 2adad5242d2dd..83f36f7e3ee53 100644 --- a/superset/migrations/versions/ad4d656d92bc_add_avg_metric.py +++ b/superset/migrations/versions/ad4d656d92bc_add_avg_metric.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Add avg() to default metrics Revision ID: ad4d656d92bc diff --git a/superset/migrations/versions/ad82a75afd82_add_query_model.py b/superset/migrations/versions/ad82a75afd82_add_query_model.py index 91959c6a7d216..1ae6f768ccb4d 100644 --- a/superset/migrations/versions/ad82a75afd82_add_query_model.py +++ b/superset/migrations/versions/ad82a75afd82_add_query_model.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Update models to support storing the queries. Revision ID: ad82a75afd82 @@ -39,8 +40,8 @@ def upgrade(): sa.Column('start_time', sa.Numeric(precision=20, scale=6), nullable=True), sa.Column('changed_on', sa.DateTime(), nullable=True), sa.Column('end_time', sa.Numeric(precision=20, scale=6), nullable=True), - sa.ForeignKeyConstraint(['database_id'], [u'dbs.id'], ), - sa.ForeignKeyConstraint(['user_id'], [u'ab_user.id'], ), + sa.ForeignKeyConstraint(['database_id'], ['dbs.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['ab_user.id'], ), sa.PrimaryKeyConstraint('id') ) op.add_column('dbs', sa.Column('select_as_create_table_as', sa.Boolean(), diff --git a/superset/migrations/versions/b318dfe5fb6c_adding_verbose_name_to_druid_column.py b/superset/migrations/versions/b318dfe5fb6c_adding_verbose_name_to_druid_column.py index d492427b644f8..42d841a30b43d 100644 --- a/superset/migrations/versions/b318dfe5fb6c_adding_verbose_name_to_druid_column.py +++ b/superset/migrations/versions/b318dfe5fb6c_adding_verbose_name_to_druid_column.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """adding verbose_name to druid column Revision ID: b318dfe5fb6c diff --git a/superset/migrations/versions/b347b202819b_.py b/superset/migrations/versions/b347b202819b_.py index e73751814879a..a55eed1e9aaaf 100644 --- a/superset/migrations/versions/b347b202819b_.py +++ b/superset/migrations/versions/b347b202819b_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: b347b202819b diff --git a/superset/migrations/versions/b4456560d4f3_change_table_unique_constraint.py b/superset/migrations/versions/b4456560d4f3_change_table_unique_constraint.py index 1c5c50a5f635a..157c3229440e6 100644 --- a/superset/migrations/versions/b4456560d4f3_change_table_unique_constraint.py +++ b/superset/migrations/versions/b4456560d4f3_change_table_unique_constraint.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """change_table_unique_constraint Revision ID: b4456560d4f3 @@ -17,9 +18,9 @@ def upgrade(): try: # Trying since sqlite doesn't like constraints op.drop_constraint( - u'tables_table_name_key', 'tables', type_='unique') + 'tables_table_name_key', 'tables', type_='unique') op.create_unique_constraint( - u'_customer_location_uc', 'tables', + '_customer_location_uc', 'tables', ['database_id', 'schema', 'table_name']) except Exception: pass diff --git a/superset/migrations/versions/b46fa1b0b39e_add_params_to_tables.py b/superset/migrations/versions/b46fa1b0b39e_add_params_to_tables.py index 9d02ec5b4b105..c07110ac20577 100644 --- a/superset/migrations/versions/b46fa1b0b39e_add_params_to_tables.py +++ b/superset/migrations/versions/b46fa1b0b39e_add_params_to_tables.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Add json_metadata to the tables table. Revision ID: b46fa1b0b39e diff --git a/superset/migrations/versions/bb51420eaf83_add_schema_to_table_model.py b/superset/migrations/versions/bb51420eaf83_add_schema_to_table_model.py index 5e5d231111cc5..771d77efc3380 100644 --- a/superset/migrations/versions/bb51420eaf83_add_schema_to_table_model.py +++ b/superset/migrations/versions/bb51420eaf83_add_schema_to_table_model.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """add schema to table model Revision ID: bb51420eaf83 diff --git a/superset/migrations/versions/bcf3126872fc_add_keyvalue.py b/superset/migrations/versions/bcf3126872fc_add_keyvalue.py index c58dad5eb1e17..39b7bb4c75339 100644 --- a/superset/migrations/versions/bcf3126872fc_add_keyvalue.py +++ b/superset/migrations/versions/bcf3126872fc_add_keyvalue.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Add keyvalue table Revision ID: bcf3126872fc diff --git a/superset/migrations/versions/c3a8f8611885_materializing_permission.py b/superset/migrations/versions/c3a8f8611885_materializing_permission.py index 3ad446b61768a..f4c65a88b9382 100644 --- a/superset/migrations/versions/c3a8f8611885_materializing_permission.py +++ b/superset/migrations/versions/c3a8f8611885_materializing_permission.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Materializing permission Revision ID: c3a8f8611885 diff --git a/superset/migrations/versions/c611f2b591b8_dim_spec.py b/superset/migrations/versions/c611f2b591b8_dim_spec.py index 58d50871c1c21..4ea66ec0fb64a 100644 --- a/superset/migrations/versions/c611f2b591b8_dim_spec.py +++ b/superset/migrations/versions/c611f2b591b8_dim_spec.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """dim_spec Revision ID: c611f2b591b8 diff --git a/superset/migrations/versions/ca69c70ec99b_tracking_url.py b/superset/migrations/versions/ca69c70ec99b_tracking_url.py index 8a2ef38295c67..85901af11415f 100644 --- a/superset/migrations/versions/ca69c70ec99b_tracking_url.py +++ b/superset/migrations/versions/ca69c70ec99b_tracking_url.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """tracking_url Revision ID: ca69c70ec99b diff --git a/superset/migrations/versions/d2424a248d63_.py b/superset/migrations/versions/d2424a248d63_.py index fdfabc9166c21..beba1c9f9f50c 100644 --- a/superset/migrations/versions/d2424a248d63_.py +++ b/superset/migrations/versions/d2424a248d63_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: d2424a248d63 diff --git a/superset/migrations/versions/d39b1e37131d_.py b/superset/migrations/versions/d39b1e37131d_.py index adcaa7732bcd7..f132d62800031 100644 --- a/superset/migrations/versions/d39b1e37131d_.py +++ b/superset/migrations/versions/d39b1e37131d_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: d39b1e37131d diff --git a/superset/migrations/versions/d6db5a5cdb5d_.py b/superset/migrations/versions/d6db5a5cdb5d_.py index 4a51fb8ff563d..0bb75ec6ef7dc 100644 --- a/superset/migrations/versions/d6db5a5cdb5d_.py +++ b/superset/migrations/versions/d6db5a5cdb5d_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: d6db5a5cdb5d diff --git a/superset/migrations/versions/d827694c7555_css_templates.py b/superset/migrations/versions/d827694c7555_css_templates.py index 3b20e44055969..9abd5fb2fa591 100644 --- a/superset/migrations/versions/d827694c7555_css_templates.py +++ b/superset/migrations/versions/d827694c7555_css_templates.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """css templates Revision ID: d827694c7555 diff --git a/superset/migrations/versions/d8bc074f7aad_add_new_field_is_restricted_to_.py b/superset/migrations/versions/d8bc074f7aad_add_new_field_is_restricted_to_.py index daa885767a023..0e4e92db27eef 100644 --- a/superset/migrations/versions/d8bc074f7aad_add_new_field_is_restricted_to_.py +++ b/superset/migrations/versions/d8bc074f7aad_add_new_field_is_restricted_to_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Add new field 'is_restricted' to SqlMetric and DruidMetric Revision ID: d8bc074f7aad @@ -30,7 +31,7 @@ class SqlMetric(Base): __tablename__ = 'sql_metrics' id = Column(Integer, primary_key=True) is_restricted = Column(Boolean, default=False, nullable=True) - + def upgrade(): op.add_column('metrics', sa.Column('is_restricted', sa.Boolean(), nullable=True)) op.add_column('sql_metrics', sa.Column('is_restricted', sa.Boolean(), nullable=True)) @@ -38,7 +39,7 @@ def upgrade(): bind = op.get_bind() session = db.Session(bind=bind) - # don't use models.DruidMetric + # don't use models.DruidMetric # because it assumes the context is consistent with the application for obj in session.query(DruidMetric).all(): obj.is_restricted = False diff --git a/superset/migrations/versions/db0c65b146bd_update_slice_model_json.py b/superset/migrations/versions/db0c65b146bd_update_slice_model_json.py index d4135562cf4a2..e348ae06fba66 100644 --- a/superset/migrations/versions/db0c65b146bd_update_slice_model_json.py +++ b/superset/migrations/versions/db0c65b146bd_update_slice_model_json.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """update_slice_model_json Revision ID: db0c65b146bd diff --git a/superset/migrations/versions/db527d8c4c78_add_db_verbose_name.py b/superset/migrations/versions/db527d8c4c78_add_db_verbose_name.py index 4c0d4167f551f..654f0c35c9447 100644 --- a/superset/migrations/versions/db527d8c4c78_add_db_verbose_name.py +++ b/superset/migrations/versions/db527d8c4c78_add_db_verbose_name.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Add verbose name to DruidCluster and Database Revision ID: db527d8c4c78 diff --git a/superset/migrations/versions/ddd6ebdd853b_annotations.py b/superset/migrations/versions/ddd6ebdd853b_annotations.py index 99f17babb0f32..f218a65b2bf85 100644 --- a/superset/migrations/versions/ddd6ebdd853b_annotations.py +++ b/superset/migrations/versions/ddd6ebdd853b_annotations.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """annotations Revision ID: ddd6ebdd853b @@ -42,7 +43,7 @@ def upgrade(): sa.Column('created_by_fk', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['changed_by_fk'], ['ab_user.id'], ), sa.ForeignKeyConstraint(['created_by_fk'], ['ab_user.id'], ), - sa.ForeignKeyConstraint(['layer_id'], [u'annotation_layer.id'], ), + sa.ForeignKeyConstraint(['layer_id'], ['annotation_layer.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index( diff --git a/superset/migrations/versions/e46f2d27a08e_materialize_perms.py b/superset/migrations/versions/e46f2d27a08e_materialize_perms.py index 7611671fe16be..6b13a2ddafce6 100644 --- a/superset/migrations/versions/e46f2d27a08e_materialize_perms.py +++ b/superset/migrations/versions/e46f2d27a08e_materialize_perms.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """materialize perms Revision ID: e46f2d27a08e diff --git a/superset/migrations/versions/e866bd2d4976_smaller_grid.py b/superset/migrations/versions/e866bd2d4976_smaller_grid.py index ad996d4c4c158..1388cd7816a3f 100644 --- a/superset/migrations/versions/e866bd2d4976_smaller_grid.py +++ b/superset/migrations/versions/e866bd2d4976_smaller_grid.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """smaller_grid Revision ID: e866bd2d4976 Revises: 21e88bc06c02 diff --git a/superset/migrations/versions/ea033256294a_.py b/superset/migrations/versions/ea033256294a_.py index 8a5bbd21c32d4..2a08ebdbcdc33 100644 --- a/superset/migrations/versions/ea033256294a_.py +++ b/superset/migrations/versions/ea033256294a_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: ea033256294a diff --git a/superset/migrations/versions/eca4694defa7_sqllab_setting_defaults.py b/superset/migrations/versions/eca4694defa7_sqllab_setting_defaults.py index b4f7038b2bf83..7bc2c46ae1ecc 100644 --- a/superset/migrations/versions/eca4694defa7_sqllab_setting_defaults.py +++ b/superset/migrations/versions/eca4694defa7_sqllab_setting_defaults.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """sqllab_setting_defaults Revision ID: eca4694defa7 diff --git a/superset/migrations/versions/ef8843b41dac_.py b/superset/migrations/versions/ef8843b41dac_.py index 00e4de515838d..cf7d587a60ecb 100644 --- a/superset/migrations/versions/ef8843b41dac_.py +++ b/superset/migrations/versions/ef8843b41dac_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: ef8843b41dac diff --git a/superset/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py b/superset/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py index 51f4923b9cedf..f09b08a351a1f 100644 --- a/superset/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py +++ b/superset/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Adding verbose_name to tablecolumn Revision ID: f0fbf6129e13 diff --git a/superset/migrations/versions/f162a1dea4c4_d3format_by_metric.py b/superset/migrations/versions/f162a1dea4c4_d3format_by_metric.py index 9e266e23a7296..391bdbd013723 100644 --- a/superset/migrations/versions/f162a1dea4c4_d3format_by_metric.py +++ b/superset/migrations/versions/f162a1dea4c4_d3format_by_metric.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """d3format_by_metric Revision ID: f162a1dea4c4 diff --git a/superset/migrations/versions/f18570e03440_add_query_result_key_index.py b/superset/migrations/versions/f18570e03440_add_query_result_key_index.py index 383e7b0e3b724..32d3b00d3176c 100644 --- a/superset/migrations/versions/f18570e03440_add_query_result_key_index.py +++ b/superset/migrations/versions/f18570e03440_add_query_result_key_index.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Add index on the result key to the query table. Revision ID: f18570e03440 diff --git a/superset/migrations/versions/f1f2d4af5b90_.py b/superset/migrations/versions/f1f2d4af5b90_.py index 36bae518ce063..8c77f715355c1 100644 --- a/superset/migrations/versions/f1f2d4af5b90_.py +++ b/superset/migrations/versions/f1f2d4af5b90_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Enable Filter Select Revision ID: f1f2d4af5b90 diff --git a/superset/migrations/versions/f959a6652acd_.py b/superset/migrations/versions/f959a6652acd_.py index 96186a6e3a006..73b7fcb0033d1 100644 --- a/superset/migrations/versions/f959a6652acd_.py +++ b/superset/migrations/versions/f959a6652acd_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: f959a6652acd diff --git a/superset/migrations/versions/fee7b758c130_.py b/superset/migrations/versions/fee7b758c130_.py index 28b05b17e3e7d..5b2e88d95d13d 100644 --- a/superset/migrations/versions/fee7b758c130_.py +++ b/superset/migrations/versions/fee7b758c130_.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """empty message Revision ID: fee7b758c130 diff --git a/superset/models/__init__.py b/superset/models/__init__.py index bed8c30ede7c1..18df0e60881cb 100644 --- a/superset/models/__init__.py +++ b/superset/models/__init__.py @@ -1,2 +1,3 @@ +# -*- coding: utf-8 -*- from . import core # noqa from . import sql_lab # noqa diff --git a/superset/models/annotations.py b/superset/models/annotations.py index e082be0923d11..057aae2be6871 100644 --- a/superset/models/annotations.py +++ b/superset/models/annotations.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """a collection of Annotation-related models""" from __future__ import absolute_import from __future__ import division diff --git a/superset/models/core.py b/superset/models/core.py index df45ccf533530..9c267ba498f37 100644 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """A collection of ORM sqlalchemy models for Superset""" from __future__ import absolute_import from __future__ import division diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 52e17f3cf0ec1..db395c11074d4 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """a collection of model-related helper classes and functions""" from __future__ import absolute_import from __future__ import division diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py index 44b692b915da9..bf37db75f6172 100644 --- a/superset/models/sql_lab.py +++ b/superset/models/sql_lab.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """A collection of ORM sqlalchemy models for SQL Lab""" from __future__ import absolute_import from __future__ import division diff --git a/superset/security.py b/superset/security.py index fa056c3987912..4d5b9f42b350c 100644 --- a/superset/security.py +++ b/superset/security.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """A set of constants and methods to manage permissions and security""" from __future__ import absolute_import from __future__ import division diff --git a/superset/sql_lab.py b/superset/sql_lab.py index 64deaffea6c22..4dae72720dc97 100644 --- a/superset/sql_lab.py +++ b/superset/sql_lab.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/sql_parse.py b/superset/sql_parse.py index d42e891c64552..83eac2715f910 100644 --- a/superset/sql_parse.py +++ b/superset/sql_parse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/stats_logger.py b/superset/stats_logger.py index 681b9066dde88..3caa38ada5c91 100644 --- a/superset/stats_logger.py +++ b/superset/stats_logger.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/translations/utils.py b/superset/translations/utils.py index 56839f5e3017e..fb4f8404ee778 100644 --- a/superset/translations/utils.py +++ b/superset/translations/utils.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/utils.py b/superset/utils.py index f4fcd93d07687..c60f128d0e603 100644 --- a/superset/utils.py +++ b/superset/utils.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Utility functions used across Superset""" from __future__ import absolute_import from __future__ import division diff --git a/superset/views/__init__.py b/superset/views/__init__.py index c61472739814b..ab93a55ce7c13 100644 --- a/superset/views/__init__.py +++ b/superset/views/__init__.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from . import base # noqa from . import core # noqa from . import sql_lab # noqa diff --git a/superset/views/annotations.py b/superset/views/annotations.py index e11a412b78b13..dea84561df4d1 100644 --- a/superset/views/annotations.py +++ b/superset/views/annotations.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/views/base.py b/superset/views/base.py index b3d698f4e20f3..9ff883fcc6d15 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/views/core.py b/superset/views/core.py index d5bbfc6e63cc9..c1c62796e081c 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function @@ -349,7 +350,7 @@ def form_post(self, form): os.remove(os.path.join(config['UPLOAD_FOLDER'], csv_filename)) except OSError: pass - message = u'Table name {} already exists. Please pick another'.format( + message = 'Table name {} already exists. Please pick another'.format( form.name.data) if isinstance(e, IntegrityError) else text_type(e) flash( message, @@ -359,7 +360,7 @@ def form_post(self, form): os.remove(os.path.join(config['UPLOAD_FOLDER'], csv_filename)) # Go back to welcome page / splash screen db_name = table.database.database_name - message = _(u'CSV file "{0}" uploaded to table "{1}" in ' + message = _('CSV file "{0}" uploaded to table "{1}" in ' 'database "{2}"'.format(csv_filename, form.name.data, db_name)) diff --git a/superset/views/sql_lab.py b/superset/views/sql_lab.py index f8d22b4f4ca92..aac1d6d2c1d7d 100644 --- a/superset/views/sql_lab.py +++ b/superset/views/sql_lab.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/superset/viz.py b/superset/viz.py index c1a8d9aa0d7e8..31e06967a1285 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """This module contains the 'Viz' objects These objects represent the backend of all the visualizations that diff --git a/tests/access_tests.py b/tests/access_tests.py index 22231518b626a..39938c9b5534b 100644 --- a/tests/access_tests.py +++ b/tests/access_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for Superset""" from __future__ import absolute_import from __future__ import division diff --git a/tests/base_tests.py b/tests/base_tests.py index 1b213faed7a5c..dcc67988c3172 100644 --- a/tests/base_tests.py +++ b/tests/base_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for Superset""" from __future__ import absolute_import from __future__ import division diff --git a/tests/celery_tests.py b/tests/celery_tests.py index 591e7939450f9..172176ebb53b2 100644 --- a/tests/celery_tests.py +++ b/tests/celery_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for Superset Celery worker""" from __future__ import absolute_import from __future__ import division diff --git a/tests/core_tests.py b/tests/core_tests.py index aa5c3617950e4..ab2c6e6782fe7 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for Superset""" from __future__ import absolute_import from __future__ import division diff --git a/tests/db_engine_specs_test.py b/tests/db_engine_specs_test.py index a2310d1d8098d..1a1282ad1a47f 100644 --- a/tests/db_engine_specs_test.py +++ b/tests/db_engine_specs_test.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/tests/dict_import_export_tests.py b/tests/dict_import_export_tests.py index 340c70a767418..cbe8aa2ea240f 100644 --- a/tests/dict_import_export_tests.py +++ b/tests/dict_import_export_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for Superset""" from __future__ import absolute_import from __future__ import division diff --git a/tests/druid_func_tests.py b/tests/druid_func_tests.py index a5a0c0400b125..5b535e9b7150b 100644 --- a/tests/druid_func_tests.py +++ b/tests/druid_func_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/tests/druid_tests.py b/tests/druid_tests.py index ee8cfba5f6f11..d2a44f968d5b4 100644 --- a/tests/druid_tests.py +++ b/tests/druid_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for Superset""" from __future__ import absolute_import from __future__ import division diff --git a/tests/email_tests.py b/tests/email_tests.py index f7b33c9c5f5f8..3ee9f3ebf22d7 100644 --- a/tests/email_tests.py +++ b/tests/email_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for email service in Superset""" from __future__ import absolute_import from __future__ import division diff --git a/tests/import_export_tests.py b/tests/import_export_tests.py index 245d4199908fa..dc9c4ade5b023 100644 --- a/tests/import_export_tests.py +++ b/tests/import_export_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for Superset""" from __future__ import absolute_import from __future__ import division diff --git a/tests/model_tests.py b/tests/model_tests.py index d23c84a2de2e1..0b4a16bd450b9 100644 --- a/tests/model_tests.py +++ b/tests/model_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/tests/security_tests.py b/tests/security_tests.py index 5839cb892c688..e117394a366ce 100644 --- a/tests/security_tests.py +++ b/tests/security_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/tests/sqllab_tests.py b/tests/sqllab_tests.py index 53144eadacdab..01b10b262681f 100644 --- a/tests/sqllab_tests.py +++ b/tests/sqllab_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Unit tests for Sql Lab""" from __future__ import absolute_import from __future__ import division diff --git a/tests/superset_test_config.py b/tests/superset_test_config.py index 4f8c32c448163..4d13744cf8d62 100644 --- a/tests/superset_test_config.py +++ b/tests/superset_test_config.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # flake8: noqa from superset.config import * diff --git a/tests/utils_tests.py b/tests/utils_tests.py index c5d13c6624eca..172818964f684 100644 --- a/tests/utils_tests.py +++ b/tests/utils_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/tests/viz_tests.py b/tests/viz_tests.py index e2417e52beade..2fe73677bd19d 100644 --- a/tests/viz_tests.py +++ b/tests/viz_tests.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function diff --git a/tox.ini b/tox.ini index e9ff3a6c77242..280bcb4798155 100644 --- a/tox.ini +++ b/tox.ini @@ -8,6 +8,7 @@ envlist = skipsdist=True [flake8] +accept-encodings = utf-8 application-import-names = superset exclude = .tox @@ -65,6 +66,7 @@ commands = flake8 deps = flake8 + flake8-coding flake8-commas flake8-future-import flake8-import-order From 2932585c659de9fa57bef0fe30d5adf4c0fc87aa Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Mon, 26 Feb 2018 10:56:19 -0800 Subject: [PATCH 07/24] [geo] add controls for minRadiusPixels and maxRadiusPixels in deck_scatter (#4467) --- .../javascripts/explore/stores/controls.jsx | 24 +++++++++++++++++++ .../javascripts/explore/stores/visTypes.js | 1 + .../visualizations/deckgl/layers/scatter.jsx | 2 ++ 3 files changed, 27 insertions(+) diff --git a/superset/assets/javascripts/explore/stores/controls.jsx b/superset/assets/javascripts/explore/stores/controls.jsx index 22b8b32365cb0..11b572a900075 100644 --- a/superset/assets/javascripts/explore/stores/controls.jsx +++ b/superset/assets/javascripts/explore/stores/controls.jsx @@ -1848,6 +1848,30 @@ export const controls = { 'lower values are pruned first'), }, + min_radius: { + type: 'TextControl', + label: t('Minimum Radius'), + isFloat: true, + validators: [v.nonEmpty], + renderTrigger: true, + default: 2, + description: + t('Minimum radius size of the circle, in pixels. As the zoom level changes, this ' + + 'insures that the circle respects this minimum radius.'), + }, + + max_radius: { + type: 'TextControl', + label: t('Maximum Radius'), + isFloat: true, + validators: [v.nonEmpty], + renderTrigger: true, + default: 250, + description: + t('Maxium radius size of the circle, in pixels. As the zoom level changes, this ' + + 'insures that the circle respects this maximum radius.'), + }, + partition_threshold: { type: 'TextControl', label: t('Partition Threshold'), diff --git a/superset/assets/javascripts/explore/stores/visTypes.js b/superset/assets/javascripts/explore/stores/visTypes.js index 3135b2613dc72..e81e7b815f8b2 100644 --- a/superset/assets/javascripts/explore/stores/visTypes.js +++ b/superset/assets/javascripts/explore/stores/visTypes.js @@ -648,6 +648,7 @@ export const visTypes = { label: t('Point Size'), controlSetRows: [ ['point_radius_fixed', 'point_unit'], + ['min_radius', 'max_radius'], ['multiplier', null], ], }, diff --git a/superset/assets/visualizations/deckgl/layers/scatter.jsx b/superset/assets/visualizations/deckgl/layers/scatter.jsx index 5022fbccdad07..087df3d7ef363 100644 --- a/superset/assets/visualizations/deckgl/layers/scatter.jsx +++ b/superset/assets/visualizations/deckgl/layers/scatter.jsx @@ -76,6 +76,8 @@ function getLayer(formData, payload, slice, inFrame) { id: `scatter-layer-${fd.slice_id}`, data, fp64: true, + radiusMinPixels: fd.min_radius || null, + radiusMaxPixels: fd.max_radius || null, outline: false, ...common.commonLayerProps(fd, slice), }); From 56f65158a29e93a008a3c1c4572b8f28d4c44528 Mon Sep 17 00:00:00 2001 From: Gabe Lyons Date: Mon, 26 Feb 2018 10:57:20 -0800 Subject: [PATCH 08/24] [Explore] highlighting run query when chart is stale on explore view (#4459) * highlighting run query when chart is stale on explore view * refactoring control changed code --- .../components/ExploreViewContainer.jsx | 27 ++++++++++++++----- .../explore/components/QueryAndSaveBtns.jsx | 12 +++++++-- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx b/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx index 9d1c7ac591b3a..c4b9fe525fcd6 100644 --- a/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx +++ b/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx @@ -49,6 +49,7 @@ class ExploreViewContainer extends React.Component { height: this.getHeight(), width: this.getWidth(), showModal: false, + chartIsStale: false, }; this.addHistory = this.addHistory.bind(this); @@ -75,19 +76,24 @@ class ExploreViewContainer extends React.Component { if (np.controls.datasource.value !== this.props.controls.datasource.value) { this.props.actions.fetchDatasourceMetadata(np.form_data.datasource, true); } - // if any control value changed and it's an instant control - if (this.instantControlChanged(this.props.controls, np.controls)) { + + const changedControlKeys = this.findChangedControlKeys(this.props.controls, np.controls); + if (this.hasDisplayControlChanged(changedControlKeys, np.controls)) { this.props.actions.updateQueryFormData( getFormDataFromControls(np.controls), this.props.chart.chartKey); this.props.actions.renderTriggered(new Date().getTime(), this.props.chart.chartKey); } + if (this.hasQueryControlChanged(changedControlKeys, np.controls)) { + this.setState({ chartIsStale: true }); + } } /* eslint no-unused-vars: 0 */ componentDidUpdate(prevProps, prevState) { this.triggerQueryIfNeeded(); - if (this.instantControlChanged(prevProps.controls, this.props.controls)) { + const changedControlKeys = this.findChangedControlKeys(prevProps.controls, this.props.controls); + if (this.hasDisplayControlChanged(changedControlKeys, this.props.controls)) { this.addHistory({}); } } @@ -102,6 +108,7 @@ class ExploreViewContainer extends React.Component { this.props.actions.removeControlPanelAlert(); this.props.actions.triggerQuery(true, this.props.chart.chartKey); + this.setState({ chartIsStale: false }); this.addHistory({}); } @@ -121,14 +128,21 @@ class ExploreViewContainer extends React.Component { return `${window.innerHeight - navHeight}px`; } - instantControlChanged(prevControls, currentControls) { - return Object.keys(currentControls).some(key => ( - currentControls[key].renderTrigger && + findChangedControlKeys(prevControls, currentControls) { + return Object.keys(currentControls).filter(key => ( typeof prevControls[key] !== 'undefined' && !areObjectsEqual(currentControls[key].value, prevControls[key].value) )); } + hasDisplayControlChanged(changedControlKeys, currentControls) { + return changedControlKeys.some(key => (currentControls[key].renderTrigger)); + } + + hasQueryControlChanged(changedControlKeys, currentControls) { + return changedControlKeys.some(key => !currentControls[key].renderTrigger); + } + triggerQueryIfNeeded() { if (this.props.chart.triggerQuery && !this.hasErrors()) { this.props.actions.runQuery(this.props.form_data, false, @@ -245,6 +259,7 @@ class ExploreViewContainer extends React.Component { onSave={this.toggleModal.bind(this)} onStop={this.onStop.bind(this)} loading={this.props.chart.chartStatus === 'loading'} + chartIsStale={this.state.chartIsStale} errorMessage={this.renderErrorMessage()} />
diff --git a/superset/assets/javascripts/explore/components/QueryAndSaveBtns.jsx b/superset/assets/javascripts/explore/components/QueryAndSaveBtns.jsx index 6926e16fc4e34..cb823ff8e7109 100644 --- a/superset/assets/javascripts/explore/components/QueryAndSaveBtns.jsx +++ b/superset/assets/javascripts/explore/components/QueryAndSaveBtns.jsx @@ -11,6 +11,7 @@ const propTypes = { onSave: PropTypes.func, onStop: PropTypes.func, loading: PropTypes.bool, + chartIsStale: PropTypes.bool, errorMessage: PropTypes.node, }; @@ -21,11 +22,18 @@ const defaultProps = { }; export default function QueryAndSaveBtns( - { canAdd, onQuery, onSave, onStop, loading, errorMessage }) { + { canAdd, onQuery, onSave, onStop, loading, chartIsStale, errorMessage }) { const saveClasses = classnames({ 'disabled disabledButton': canAdd !== 'True', }); - const qryButtonStyle = errorMessage ? 'danger' : 'primary'; + + let qryButtonStyle = 'default'; + if (errorMessage) { + qryButtonStyle = 'danger'; + } else if (chartIsStale) { + qryButtonStyle = 'primary'; + } + const saveButtonDisabled = errorMessage ? true : loading; const qryOrStopButton = loading ? (
); diff --git a/superset/assets/javascripts/profile/components/TableLoader.jsx b/superset/assets/javascripts/profile/components/TableLoader.jsx index b14d6f6865a84..1e67426eea592 100644 --- a/superset/assets/javascripts/profile/components/TableLoader.jsx +++ b/superset/assets/javascripts/profile/components/TableLoader.jsx @@ -1,9 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Table, Tr, Td } from 'reactable'; -import { Collapse } from 'react-bootstrap'; import $ from 'jquery'; +import '../../../stylesheets/reactable-pagination.css'; + const propTypes = { dataEndpoint: PropTypes.string.isRequired, mutator: PropTypes.func, @@ -29,7 +30,7 @@ export default class TableLoader extends React.PureComponent { } render() { const tableProps = Object.assign({}, this.props); - let columns = this.props.columns; + let { columns } = this.props; if (!columns && this.state.data.length > 0) { columns = Object.keys(this.state.data[0]).filter(col => col[0] !== '_'); } @@ -40,25 +41,21 @@ export default class TableLoader extends React.PureComponent { return loading; } return ( - -
- - {this.state.data.map((row, i) => ( - - {columns.map((col) => { - if (row.hasOwnProperty('_' + col)) { - return ( - ); - } - return ; - })} - - ))} -
- {row[col]} - {row[col]}
-
-
+ + {this.state.data.map((row, i) => ( + + {columns.map((col) => { + if (row.hasOwnProperty('_' + col)) { + return ( + ); + } + return ; + })} + + ))} +
+ {row[col]} + {row[col]}
); } } diff --git a/superset/assets/javascripts/welcome/App.jsx b/superset/assets/javascripts/welcome/App.jsx index 78674c48f0e9e..8f63719ea5128 100644 --- a/superset/assets/javascripts/welcome/App.jsx +++ b/superset/assets/javascripts/welcome/App.jsx @@ -1,7 +1,14 @@ import React from 'react'; -import { Panel, Row, Col, FormControl } from 'react-bootstrap'; - +import PropTypes from 'prop-types'; +import { Panel, Row, Col, Tabs, Tab, FormControl } from 'react-bootstrap'; +import RecentActivity from '../profile/components/RecentActivity'; +import Favorites from '../profile/components/Favorites'; import DashboardTable from './DashboardTable'; +import { t } from '../locales'; + +const propTypes = { + user: PropTypes.object.isRequired, +}; export default class App extends React.PureComponent { constructor(props) { @@ -17,24 +24,48 @@ export default class App extends React.PureComponent { render() { return (
- - -

Dashboards

- - - -
-
- -
+ + + + +

{t('Recently Viewed')}

+
+
+ +
+
+ + + +

{t('Favorites')}

+
+
+ +
+
+ + + +

{t('Dashboards')}

+ + + +
+
+ +
+
+
); } } + +App.propTypes = propTypes; diff --git a/superset/assets/javascripts/welcome/index.jsx b/superset/assets/javascripts/welcome/index.jsx index 3994b9908b5ec..df0f774a81bf5 100644 --- a/superset/assets/javascripts/welcome/index.jsx +++ b/superset/assets/javascripts/welcome/index.jsx @@ -10,8 +10,13 @@ appSetup(); const container = document.getElementById('app'); const bootstrap = JSON.parse(container.getAttribute('data-bootstrap')); +const user = { + ...bootstrap.user, +}; ReactDOM.render( - , + , container, ); diff --git a/superset/assets/spec/javascripts/welcome/App_spec.jsx b/superset/assets/spec/javascripts/welcome/App_spec.jsx index 472c0e22e7ef7..1fc2987a57275 100644 --- a/superset/assets/spec/javascripts/welcome/App_spec.jsx +++ b/superset/assets/spec/javascripts/welcome/App_spec.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Panel, Col, Row } from 'react-bootstrap'; +import { Panel, Row, Tab } from 'react-bootstrap'; import { shallow } from 'enzyme'; import { describe, it } from 'mocha'; import { expect } from 'chai'; @@ -13,10 +13,10 @@ describe('App', () => { React.isValidElement(), ).to.equal(true); }); - it('renders 2 Col', () => { + it('renders 4 Tab, Panel, and Row components', () => { const wrapper = shallow(); - expect(wrapper.find(Panel)).to.have.length(1); - expect(wrapper.find(Row)).to.have.length(1); - expect(wrapper.find(Col)).to.have.length(2); + expect(wrapper.find(Tab)).to.have.length(3); + expect(wrapper.find(Panel)).to.have.length(3); + expect(wrapper.find(Row)).to.have.length(3); }); }); diff --git a/superset/views/core.py b/superset/views/core.py index c1c62796e081c..b71f73173248c 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -4,7 +4,6 @@ from __future__ import print_function from __future__ import unicode_literals -from collections import defaultdict from datetime import datetime, timedelta import json import logging @@ -21,7 +20,6 @@ from flask_appbuilder.actions import action from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access_api -from flask_appbuilder.security.sqla import models as ab_models from flask_babel import gettext as __ from flask_babel import lazy_gettext as _ import pandas as pd @@ -51,6 +49,7 @@ generate_download_headers, get_error_msg, get_user_roles, json_error_response, SupersetFilter, SupersetModelView, YamlExportMixin, ) +from .utils import bootstrap_user_data config = app.config stats_logger = config.get('STATS_LOGGER') @@ -2555,9 +2554,12 @@ def welcome(self): """Personalized welcome page""" if not g.user or not g.user.get_id(): return redirect(appbuilder.get_url_for_login) + payload = { + 'user': bootstrap_user_data(), 'common': self.common_bootsrap_payload(), } + return self.render_template( 'superset/basic.html', entry='welcome', @@ -2571,44 +2573,15 @@ def profile(self, username): """User profile page""" if not username and g.user: username = g.user.username - user = ( - db.session.query(ab_models.User) - .filter_by(username=username) - .one() - ) - roles = {} - permissions = defaultdict(set) - for role in user.roles: - perms = set() - for perm in role.permissions: - if perm.permission and perm.view_menu: - perms.add( - (perm.permission.name, perm.view_menu.name), - ) - if perm.permission.name in ('datasource_access', 'database_access'): - permissions[perm.permission.name].add(perm.view_menu.name) - roles[role.name] = [ - [perm.permission.name, perm.view_menu.name] - for perm in role.permissions - if perm.permission and perm.view_menu - ] + payload = { - 'user': { - 'username': user.username, - 'firstName': user.first_name, - 'lastName': user.last_name, - 'userId': user.id, - 'isActive': user.is_active(), - 'createdOn': user.created_on.isoformat(), - 'email': user.email, - 'roles': roles, - 'permissions': permissions, - }, + 'user': bootstrap_user_data(username, include_perms=True), 'common': self.common_bootsrap_payload(), } + return self.render_template( 'superset/basic.html', - title=user.username + "'s profile", + title=username + "'s profile", entry='profile', bootstrap_data=json.dumps(payload, default=utils.json_iso_dttm_ser), ) diff --git a/superset/views/utils.py b/superset/views/utils.py new file mode 100644 index 0000000000000..b1f3fa2db7ffe --- /dev/null +++ b/superset/views/utils.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from collections import defaultdict + +from flask import g +from flask_appbuilder.security.sqla import models as ab_models + +from superset import db + + +def bootstrap_user_data(username=None, include_perms=False): + if username: + username = username + else: + username = g.user.username + + user = ( + db.session.query(ab_models.User) + .filter_by(username=username) + .one() + ) + + payload = { + 'username': user.username, + 'firstName': user.first_name, + 'lastName': user.last_name, + 'userId': user.id, + 'isActive': user.is_active(), + 'createdOn': user.created_on.isoformat(), + 'email': user.email, + } + + if include_perms: + roles, permissions = get_permissions(user) + payload['roles'] = roles + payload['permissions'] = permissions + + return payload + + +def get_permissions(user): + if not user.roles: + raise AttributeError('User object does not have roles') + + roles = {} + permissions = defaultdict(set) + for role in user.roles: + perms = set() + for perm in role.permissions: + if perm.permission and perm.view_menu: + perms.add( + (perm.permission.name, perm.view_menu.name), + ) + if perm.permission.name in ('datasource_access', + 'database_access'): + permissions[perm.permission.name].add(perm.view_menu.name) + roles[role.name] = [ + [perm.permission.name, perm.view_menu.name] + for perm in role.permissions + if perm.permission and perm.view_menu + ] + + return roles, permissions From bcca1717f2014fa631e0713f4b25e2229646dc56 Mon Sep 17 00:00:00 2001 From: Grace Guo Date: Tue, 27 Feb 2018 10:18:32 -0800 Subject: [PATCH 10/24] [dashboard] Fix JS error when position_json data is empty (#4485) --- superset/assets/javascripts/dashboard/reducers.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/superset/assets/javascripts/dashboard/reducers.js b/superset/assets/javascripts/dashboard/reducers.js index cbbb26348ff1f..80137c5af008f 100644 --- a/superset/assets/javascripts/dashboard/reducers.js +++ b/superset/assets/javascripts/dashboard/reducers.js @@ -34,10 +34,12 @@ export function getInitialState(bootstrapData) { dashboard.posDict = {}; dashboard.layout = []; - if (dashboard.position_json) { + if (Array.isArray(dashboard.position_json)) { dashboard.position_json.forEach((position) => { dashboard.posDict[position.slice_id] = position; }); + } else { + dashboard.position_json = []; } const lastRowId = Math.max.apply(null, dashboard.position_json.map(pos => (pos.row + pos.size_y))); From 83524f97d7fcf3c8c86efd25f6e5f76fda1b48f5 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Tue, 27 Feb 2018 15:08:06 -0800 Subject: [PATCH 11/24] [WiP] Cleanup & fix URL scheme for the explore view (#4490) * Improve URLs * Fix js tests --- run_specific_test.sh | 1 + run_tests.sh | 1 + .../addSlice/AddSliceContainer.jsx | 3 +- .../javascripts/explore/exploreUtils.js | 3 - .../addSlice/AddSliceContainer_spec.jsx | 2 +- .../spec/javascripts/explore/utils_spec.jsx | 18 ++-- superset/models/core.py | 24 +++--- superset/views/core.py | 84 ++++++++++++------- tests/core_tests.py | 38 ++++++++- 9 files changed, 114 insertions(+), 60 deletions(-) diff --git a/run_specific_test.sh b/run_specific_test.sh index 47e8307440264..f267e08226bfd 100755 --- a/run_specific_test.sh +++ b/run_specific_test.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash echo $DB rm -f .coverage +export PYTHONPATH=./ export SUPERSET_CONFIG=tests.superset_test_config set -e superset/bin/superset version -v diff --git a/run_tests.sh b/run_tests.sh index 448a750fdf30f..de40d6c75c163 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -4,6 +4,7 @@ rm ~/.superset/unittests.db rm ~/.superset/celerydb.sqlite rm ~/.superset/celery_results.sqlite rm -f .coverage +export PYTHONPATH=./ export SUPERSET_CONFIG=tests.superset_test_config set -e superset/bin/superset db upgrade diff --git a/superset/assets/javascripts/addSlice/AddSliceContainer.jsx b/superset/assets/javascripts/addSlice/AddSliceContainer.jsx index 2396b1b303f40..48b31eb4797b8 100644 --- a/superset/assets/javascripts/addSlice/AddSliceContainer.jsx +++ b/superset/assets/javascripts/addSlice/AddSliceContainer.jsx @@ -23,9 +23,8 @@ export default class AddSliceContainer extends React.PureComponent { } exploreUrl() { - const baseUrl = `/superset/explore/${this.state.datasourceType}/${this.state.datasourceId}`; const formData = encodeURIComponent(JSON.stringify({ viz_type: this.state.visType })); - return `${baseUrl}?form_data=${formData}`; + return `/superset/explore/?form_data=${formData}`; } gotoSlice() { diff --git a/superset/assets/javascripts/explore/exploreUtils.js b/superset/assets/javascripts/explore/exploreUtils.js index 309fce1e8e19c..1c1271b0458c2 100644 --- a/superset/assets/javascripts/explore/exploreUtils.js +++ b/superset/assets/javascripts/explore/exploreUtils.js @@ -25,9 +25,6 @@ export function getURIDirectory(formData, endpointType = 'base') { if (['json', 'csv', 'query'].indexOf(endpointType) >= 0) { directory = '/superset/explore_json/'; } - const [datasource_id, datasource_type] = formData.datasource.split('__'); - directory += `${datasource_type}/${datasource_id}/`; - return directory; } diff --git a/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx b/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx index ab3d4ff878a9c..2a1f09b79c11c 100644 --- a/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx +++ b/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx @@ -53,7 +53,7 @@ describe('AddSliceContainer', () => { datasourceId: datasourceValue.split('__')[0], datasourceType: datasourceValue.split('__')[1], }); - const formattedUrl = '/superset/explore/table/1?form_data=%7B%22viz_type%22%3A%22table%22%7D'; + const formattedUrl = '/superset/explore/?form_data=%7B%22viz_type%22%3A%22table%22%7D'; expect(wrapper.instance().exploreUrl()).to.equal(formattedUrl); }); }); diff --git a/superset/assets/spec/javascripts/explore/utils_spec.jsx b/superset/assets/spec/javascripts/explore/utils_spec.jsx index 8d4f86837fc22..fe18f3907335b 100644 --- a/superset/assets/spec/javascripts/explore/utils_spec.jsx +++ b/superset/assets/spec/javascripts/explore/utils_spec.jsx @@ -27,7 +27,7 @@ describe('utils', () => { }); compareURI( URI(url), - URI('/superset/explore/table/1/'), + URI('/superset/explore/'), ); expect(payload).to.deep.equals(formData); }); @@ -40,7 +40,7 @@ describe('utils', () => { }); compareURI( URI(url), - URI('/superset/explore_json/table/1/'), + URI('/superset/explore_json/'), ); expect(payload).to.deep.equals(formData); }); @@ -53,7 +53,7 @@ describe('utils', () => { }); compareURI( URI(url), - URI('/superset/explore_json/table/1/') + URI('/superset/explore_json/') .search({ force: 'true' }), ); expect(payload).to.deep.equals(formData); @@ -67,7 +67,7 @@ describe('utils', () => { }); compareURI( URI(url), - URI('/superset/explore_json/table/1/') + URI('/superset/explore_json/') .search({ csv: 'true' }), ); expect(payload).to.deep.equals(formData); @@ -81,7 +81,7 @@ describe('utils', () => { }); compareURI( URI(url), - URI('/superset/explore/table/1/') + URI('/superset/explore/') .search({ standalone: 'true' }), ); expect(payload).to.deep.equals(formData); @@ -95,7 +95,7 @@ describe('utils', () => { }); compareURI( URI(url), - URI('/superset/explore_json/table/1/') + URI('/superset/explore_json/') .search({ foo: 'bar' }), ); expect(payload).to.deep.equals(formData); @@ -109,7 +109,7 @@ describe('utils', () => { }); compareURI( URI(url), - URI('/superset/explore_json/table/1/') + URI('/superset/explore_json/') .search({ foo: 'bar' }), ); expect(payload).to.deep.equals(formData); @@ -123,7 +123,7 @@ describe('utils', () => { }); compareURI( URI(url), - URI('/superset/explore_json/table/1/') + URI('/superset/explore_json/') .search({ foo: 'bar' }), ); expect(payload).to.deep.equals(formData); @@ -134,7 +134,7 @@ describe('utils', () => { it('generates proper base url with form_data', () => { compareURI( URI(getExploreLongUrl(formData, 'base')), - URI('/superset/explore/table/1/').search({ form_data: sFormData }), + URI('/superset/explore/').search({ form_data: sFormData }), ); }); }); diff --git a/superset/models/core.py b/superset/models/core.py index 9c267ba498f37..b4dbada947f4e 100644 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -201,26 +201,30 @@ def form_data(self): form_data.update({ 'slice_id': self.id, 'viz_type': self.viz_type, - 'datasource': str(self.datasource_id) + '__' + self.datasource_type, + 'datasource': '{}__{}'.format( + self.datasource_id, self.datasource_type), }) if self.cache_timeout: form_data['cache_timeout'] = self.cache_timeout return form_data + def get_explore_url(self, base_url='/superset/explore', overrides=None): + overrides = overrides or {} + form_data = {'slice_id': self.id} + form_data.update(overrides) + params = parse.quote(json.dumps(form_data)) + return ( + '{base_url}/?form_data={params}'.format(**locals())) + @property def slice_url(self): """Defines the url to access the slice""" - form_data = {'slice_id': self.id} - return ( - '/superset/explore/{obj.datasource_type}/' - '{obj.datasource_id}/?form_data={params}'.format( - obj=self, params=parse.quote(json.dumps(form_data)))) + return self.get_explore_url() @property - def slice_id_url(self): - return ( - '/superset/{slc.datasource_type}/{slc.datasource_id}/{slc.id}/' - ).format(slc=self) + def explore_json_url(self): + """Defines the url to access the slice""" + return self.get_explore_url('/superset/explore_json') @property def edit_url(self): diff --git a/superset/views/core.py b/superset/views/core.py index b71f73173248c..c8101b8a8fc49 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -943,24 +943,39 @@ def clean_fulfilled_requests(session): session.commit() return redirect('/accessrequestsmodelview/list/') - def get_form_data(self): - d = {} + def get_form_data(self, slice_id=None): + form_data = {} post_data = request.form.get('form_data') request_args_data = request.args.get('form_data') # Supporting POST if post_data: - d.update(json.loads(post_data)) + form_data.update(json.loads(post_data)) # request params can overwrite post body if request_args_data: - d.update(json.loads(request_args_data)) + form_data.update(json.loads(request_args_data)) if request.args.get('viz_type'): # Converting old URLs - d = cast_form_data(d) + form_data = cast_form_data(form_data) - d = {k: v for k, v in d.items() if k not in FORM_DATA_KEY_BLACKLIST} + form_data = { + k: v + for k, v in form_data.items() + if k not in FORM_DATA_KEY_BLACKLIST + } - return d + # When a slice_id is present, load from DB and override + # the form_data from the DB with the other form_data provided + slice_id = form_data.get('slice_id') or slice_id + slc = None + if slice_id: + slc = db.session.query(models.Slice).filter_by(id=slice_id).first() + slice_form_data = slc.form_data.copy() + # allow form_data in request override slice from_data + slice_form_data.update(form_data) + form_data = slice_form_data + + return form_data, slc def get_viz( self, @@ -991,11 +1006,9 @@ def get_viz( @has_access @expose('/slice//') def slice(self, slice_id): - viz_obj = self.get_viz(slice_id) - endpoint = '/superset/explore/{}/{}?form_data={}'.format( - viz_obj.datasource.type, - viz_obj.datasource.id, - parse.quote(json.dumps(viz_obj.form_data)), + form_data, slc = self.get_form_data(slice_id) + endpoint = '/superset/explore/?form_data={}'.format( + parse.quote(json.dumps(form_data)), ) if request.args.get('standalone') == 'true': endpoint += '&standalone=true' @@ -1075,10 +1088,7 @@ def slice_json(self, slice_id): viz_obj = self.get_viz(slice_id) datasource_type = viz_obj.datasource.type datasource_id = viz_obj.datasource.id - form_data = viz_obj.form_data - # This allows you to override the saved slice form data with - # data from the current request (e.g. change the time window) - form_data.update(self.get_form_data()) + form_data, slc = self.get_form_data() except Exception as e: return json_error_response( utils.error_msg_from_exception(e), @@ -1091,7 +1101,7 @@ def slice_json(self, slice_id): @has_access_api @expose('/annotation_json/') def annotation_json(self, layer_id): - form_data = self.get_form_data() + form_data = self.get_form_data()[0] form_data['layer_id'] = layer_id form_data['filters'] = [{'col': 'layer_id', 'op': '==', @@ -1115,12 +1125,15 @@ def annotation_json(self, layer_id): @log_this @has_access_api @expose('/explore_json///', methods=['GET', 'POST']) - def explore_json(self, datasource_type, datasource_id): + @expose('/explore_json/', methods=['GET', 'POST']) + def explore_json(self, datasource_type=None, datasource_id=None): try: csv = request.args.get('csv') == 'true' query = request.args.get('query') == 'true' force = request.args.get('force') == 'true' - form_data = self.get_form_data() + form_data = self.get_form_data()[0] + datasource_id, datasource_type = self.datasource_info( + datasource_id, datasource_type, form_data) except Exception as e: logging.exception(e) return json_error_response( @@ -1157,19 +1170,36 @@ def import_dashboards(self): @has_access @expose('/explorev2///') def explorev2(self, datasource_type, datasource_id): + """Deprecated endpoint, here for backward compatibility of urls""" return redirect(url_for( 'Superset.explore', datasource_type=datasource_type, datasource_id=datasource_id, **request.args)) + @staticmethod + def datasource_info(datasource_id, datasource_type, form_data): + """Compatibility layer for handling of datasource info + + datasource_id & datasource_type used to be passed in the URL + directory, now they should come as part of the form_data, + This function allows supporting both without duplicating code""" + datasource = form_data.get('datasource', '') + if '__' in datasource: + datasource_id, datasource_type = datasource.split('__') + datasource_id = int(datasource_id) + return datasource_id, datasource_type + @log_this @has_access @expose('/explore///', methods=['GET', 'POST']) - def explore(self, datasource_type, datasource_id): - datasource_id = int(datasource_id) + @expose('/explore/', methods=['GET', 'POST']) + def explore(self, datasource_type=None, datasource_id=None): user_id = g.user.get_id() if g.user else None - form_data = self.get_form_data() + form_data, slc = self.get_form_data() + + datasource_id, datasource_type = self.datasource_info( + datasource_id, datasource_type, form_data) saved_url = None url_id = request.args.get('r') @@ -1182,14 +1212,6 @@ def explore(self, datasource_type, datasource_id): # allow form_date in request override saved url url_form_data.update(form_data) form_data = url_form_data - slice_id = form_data.get('slice_id') - slc = None - if slice_id: - slc = db.session.query(models.Slice).filter_by(id=slice_id).first() - slice_form_data = slc.form_data.copy() - # allow form_data in request override slice from_data - slice_form_data.update(form_data) - form_data = slice_form_data error_redirect = '/slicemodelview/list/' datasource = ConnectorRegistry.get_datasource( @@ -1308,7 +1330,7 @@ def save_or_overwrite_slice( """Save or overwrite a slice""" slice_name = args.get('slice_name') action = args.get('action') - form_data = self.get_form_data() + form_data, _ = self.get_form_data() if action in ('saveas'): if 'slice_id' in form_data: diff --git a/tests/core_tests.py b/tests/core_tests.py index ab2c6e6782fe7..91ae56f158679 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -97,7 +97,7 @@ def test_cache_key(self): qobj['groupby'] = [] self.assertNotEqual(cache_key, viz.cache_key(qobj)) - def test_slice_json_endpoint(self): + def test_old_slice_json_endpoint(self): self.login(username='admin') slc = self.get_slice('Girls', db.session) @@ -108,7 +108,13 @@ def test_slice_json_endpoint(self): resp = self.get_resp(json_endpoint, {'form_data': json.dumps(slc.viz.form_data)}) assert '"Jennifer"' in resp - def test_slice_csv_endpoint(self): + def test_slice_json_endpoint(self): + self.login(username='admin') + slc = self.get_slice('Girls', db.session) + resp = self.get_resp(slc.explore_json_url) + assert '"Jennifer"' in resp + + def test_old_slice_csv_endpoint(self): self.login(username='admin') slc = self.get_slice('Girls', db.session) @@ -119,6 +125,15 @@ def test_slice_csv_endpoint(self): resp = self.get_resp(csv_endpoint, {'form_data': json.dumps(slc.viz.form_data)}) assert 'Jennifer,' in resp + def test_slice_csv_endpoint(self): + self.login(username='admin') + slc = self.get_slice('Girls', db.session) + + csv_endpoint = '/superset/explore_json/?csv=true' + resp = self.get_resp( + csv_endpoint, {'form_data': json.dumps({'slice_id': slc.id})}) + assert 'Jennifer,' in resp + def test_admin_only_permissions(self): def assert_admin_permission_in(role_name, assert_func): role = sm.find_role(role_name) @@ -225,8 +240,8 @@ def test_slices(self): urls = [] for slc in db.session.query(Slc).all(): urls += [ - (slc.slice_name, 'slice_url', slc.slice_url), - (slc.slice_name, 'slice_id_url', slc.slice_id_url), + (slc.slice_name, 'explore', slc.slice_url), + (slc.slice_name, 'explore_json', slc.explore_json_url), ] for name, method, url in urls: logging.info('[{name}]/[{method}]: {url}'.format(**locals())) @@ -879,6 +894,21 @@ def test_comments_in_sqlatable_query(self): rendered_query = text_type(table.get_from_clause()) self.assertEqual(clean_query, rendered_query) + def test_slice_url_overrides(self): + # No override + self.login(username='admin') + slice_name = 'Girls' + slc = self.get_slice(slice_name, db.session) + resp = self.get_resp(slc.explore_json_url) + assert '"Jennifer"' in resp + + # Overriding groupby + url = slc.get_explore_url( + base_url='/superset/explore_json', + overrides={'groupby': ['state']}) + resp = self.get_resp(url) + assert '"CA"' in resp + if __name__ == '__main__': unittest.main() From c2b42c49c6af373a40d90b4f27591bebec3b9924 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Tue, 27 Feb 2018 16:44:02 -0800 Subject: [PATCH 12/24] Change limit form 50k to 10k (#4496) --- superset/assets/javascripts/explore/stores/controls.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/assets/javascripts/explore/stores/controls.jsx b/superset/assets/javascripts/explore/stores/controls.jsx index 11b572a900075..a15333e29ddf4 100644 --- a/superset/assets/javascripts/explore/stores/controls.jsx +++ b/superset/assets/javascripts/explore/stores/controls.jsx @@ -866,7 +866,7 @@ export const controls = { freeForm: true, label: t('Row limit'), validators: [v.integer], - default: 50000, + default: 10000, choices: formatSelectOptions(ROW_LIMIT_OPTIONS), }, From 8626793655e2d0ecf9896d0f214f962dc20e4665 Mon Sep 17 00:00:00 2001 From: timifasubaa <30888507+timifasubaa@users.noreply.github.com> Date: Tue, 27 Feb 2018 17:43:37 -0800 Subject: [PATCH 13/24] check for access before requesting access (#4469) --- superset/views/core.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/superset/views/core.py b/superset/views/core.py index c8101b8a8fc49..5b0ee5f3bc104 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -842,6 +842,15 @@ def request_access(self): .one() ) datasources.add(datasource) + + has_access = all( + ( + datasource and self.datasource_access(datasource) + for datasource in datasources + )) + if has_access: + return redirect('/superset/dashboard/{}'.format(dashboard_id)) + if request.args.get('action') == 'go': for datasource in datasources: access_request = DAR( From 404e2d552ae430d549226df54e74fe760f7cb8d1 Mon Sep 17 00:00:00 2001 From: timifasubaa <30888507+timifasubaa@users.noreply.github.com> Date: Tue, 27 Feb 2018 22:13:06 -0800 Subject: [PATCH 14/24] fixes to csv - hive upload (#4488) --- setup.py | 1 + superset/db_engine_specs.py | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 4bc9412a45991..c32696e698418 100644 --- a/setup.py +++ b/setup.py @@ -87,6 +87,7 @@ def get_git_sha(): 'thrift>=0.9.3', 'thrift-sasl>=0.2.1', 'unidecode>=0.04.21', + 'unicodecsv==0.14.1', 'bleach==2.1.2', ], extras_require={ diff --git a/superset/db_engine_specs.py b/superset/db_engine_specs.py index 0c5d5ec2d914b..4d373dff5a0de 100644 --- a/superset/db_engine_specs.py +++ b/superset/db_engine_specs.py @@ -18,7 +18,6 @@ from __future__ import unicode_literals from collections import defaultdict, namedtuple -import csv import inspect import logging import os @@ -35,6 +34,7 @@ from sqlalchemy.engine.url import make_url from sqlalchemy.sql import text import sqlparse +import unicodecsv from werkzeug.utils import secure_filename from superset import app, cache_util, conf, db, utils @@ -850,7 +850,7 @@ def create_table_from_csv(form, table): """Uploads a csv file and creates a superset datasource in Hive.""" def get_column_names(filepath): with open(filepath, 'rb') as f: - return csv.reader(f).next() + return unicodecsv.reader(f, encoding='utf-8-sig').next() table_name = form.name.data filename = form.csv_file.data.filename @@ -874,11 +874,12 @@ def get_column_names(filepath): s3 = boto3.client('s3') location = os.path.join('s3a://', bucket_path, upload_prefix, table_name) s3.upload_file( - upload_path, 'airbnb-superset', + upload_path, bucket_path, os.path.join(upload_prefix, table_name, filename)) sql = """CREATE EXTERNAL TABLE {table_name} ( {schema_definition} ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS - TEXTFILE LOCATION '{location}'""".format(**locals()) + TEXTFILE LOCATION '{location}' + tblproperties ('skip.header.line.count'='1')""".format(**locals()) logging.info(form.con.data) engine = create_engine(form.con.data.sqlalchemy_uri) engine.execute(sql) From 264822b1ee22f8851c10a2fd6d6e3c956281eae0 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Tue, 27 Feb 2018 22:36:52 -0800 Subject: [PATCH 15/24] Introduce an onInit method for when a new viz_type is selected (#4491) * Introduce an onInit method for when a new viz_type is selected This allows for clearing certain controls where/when needed. For instance here, when loading deck_scatter, even if there was a time granularity picked for the previous viz_type, we want to unselect it. * making it functional --- superset/assets/javascripts/explore/stores/store.js | 3 +++ .../assets/javascripts/explore/stores/visTypes.js | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/superset/assets/javascripts/explore/stores/store.js b/superset/assets/javascripts/explore/stores/store.js index af809ed2fa517..02bd121e650d1 100644 --- a/superset/assets/javascripts/explore/stores/store.js +++ b/superset/assets/javascripts/explore/stores/store.js @@ -81,6 +81,9 @@ export function getControlsState(state, form_data) { control.value = formData[k] !== undefined ? formData[k] : control.default; controlsState[k] = control; }); + if (viz.onInit) { + return viz.onInit(controlsState); + } return controlsState; } diff --git a/superset/assets/javascripts/explore/stores/visTypes.js b/superset/assets/javascripts/explore/stores/visTypes.js index e81e7b815f8b2..a41b81b3391ea 100644 --- a/superset/assets/javascripts/explore/stores/visTypes.js +++ b/superset/assets/javascripts/explore/stores/visTypes.js @@ -627,6 +627,17 @@ export const visTypes = { deck_scatter: { label: t('Deck.gl - Scatter plot'), requiresTime: true, + onInit: controlState => ({ + ...controlState, + time_grain_sqla: { + ...controlState.time_grain_sqla, + value: null, + }, + granularity: { + ...controlState.granularity, + value: null, + }, + }), controlPanelSections: [ { label: t('Query'), From 849a2cecee2737a8392049e29daecb4154249f6a Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Wed, 28 Feb 2018 10:12:17 -0800 Subject: [PATCH 16/24] Add https support for Druid (#4480) * Add https support for Druid * addressing comment --- superset/connectors/druid/models.py | 24 +++++++++++++-------- tests/druid_tests.py | 33 +++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index 339dd6986b155..a16baf1039e65 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -11,6 +11,7 @@ import json import logging from multiprocessing.pool import ThreadPool +import re from dateutil.parser import parse as dparse from flask import escape, Markup @@ -107,24 +108,29 @@ def data(self): 'backend': 'druid', } + @staticmethod + def get_base_url(host, port): + if not re.match('http(s)?://', host): + host = 'http://' + host + return '{0}:{1}'.format(host, port) + + def get_base_coordinator_url(self): + base_url = self.get_base_url( + self.coordinator_host, self.coordinator_port) + return '{base_url}/{self.coordinator_endpoint}'.format(**locals()) + def get_pydruid_client(self): cli = PyDruid( - 'http://{0}:{1}/'.format(self.broker_host, self.broker_port), + self.get_base_url(self.broker_host, self.broker_port), self.broker_endpoint) return cli def get_datasources(self): - endpoint = ( - 'http://{obj.coordinator_host}:{obj.coordinator_port}/' - '{obj.coordinator_endpoint}/datasources' - ).format(obj=self) - + endpoint = self.get_base_coordinator_url() + '/datasources' return json.loads(requests.get(endpoint).text) def get_druid_version(self): - endpoint = ( - 'http://{obj.coordinator_host}:{obj.coordinator_port}/status' - ).format(obj=self) + endpoint = self.get_base_coordinator_url() + '/status' return json.loads(requests.get(endpoint).text)['version'] def refresh_datasources( diff --git a/tests/druid_tests.py b/tests/druid_tests.py index d2a44f968d5b4..fc360b6656bc0 100644 --- a/tests/druid_tests.py +++ b/tests/druid_tests.py @@ -77,6 +77,16 @@ class DruidTests(SupersetTestCase): def __init__(self, *args, **kwargs): super(DruidTests, self).__init__(*args, **kwargs) + def get_test_cluster_obj(self): + return DruidCluster( + cluster_name='test_cluster', + coordinator_host='localhost', + coordinator_endpoint='druid/coordinator/v1/metadata', + coordinator_port=7979, + broker_host='localhost', + broker_port=7980, + metadata_last_refreshed=datetime.now()) + @patch('superset.connectors.druid.models.PyDruid') def test_client(self, PyDruid): self.login(username='admin') @@ -95,13 +105,7 @@ def test_client(self, PyDruid): db.session.delete(cluster) db.session.commit() - cluster = DruidCluster( - cluster_name='test_cluster', - coordinator_host='localhost', - coordinator_port=7979, - broker_host='localhost', - broker_port=7980, - metadata_last_refreshed=datetime.now()) + cluster = self.get_test_cluster_obj() db.session.add(cluster) cluster.get_datasources = PickableMock(return_value=['test_datasource']) @@ -323,6 +327,21 @@ def test_sync_druid_perm(self, PyDruid): permission=permission, view_menu=view_menu).first() assert pv is not None + def test_urls(self): + cluster = self.get_test_cluster_obj() + self.assertEquals( + cluster.get_base_url('localhost', '9999'), 'http://localhost:9999') + self.assertEquals( + cluster.get_base_url('http://localhost', '9999'), + 'http://localhost:9999') + self.assertEquals( + cluster.get_base_url('https://localhost', '9999'), + 'https://localhost:9999') + + self.assertEquals( + cluster.get_base_coordinator_url(), + 'http://localhost:7979/druid/coordinator/v1/metadata') + if __name__ == '__main__': unittest.main() From 764a92cd1094d97aa746f69c51f1285c7034e659 Mon Sep 17 00:00:00 2001 From: Gabe Lyons Date: Wed, 28 Feb 2018 14:19:06 -0800 Subject: [PATCH 17/24] [Explore] applying refresh chart overlay when chart is stale (#4486) * adding refresh chart overlay when chart is out of sync with control panel * fading the visualization when stale * addressing comments from team on layout of UI --- superset/assets/javascripts/chart/Chart.jsx | 17 ++++++++ .../assets/javascripts/chart/ChartBody.jsx | 3 +- .../components/RefreshChartOverlay.jsx | 42 +++++++++++++++++++ .../explore/components/ExploreChartPanel.jsx | 8 ++++ .../components/ExploreViewContainer.jsx | 13 +++++- superset/assets/stylesheets/superset.less | 25 +++++++++++ 6 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 superset/assets/javascripts/components/RefreshChartOverlay.jsx diff --git a/superset/assets/javascripts/chart/Chart.jsx b/superset/assets/javascripts/chart/Chart.jsx index 0e064278f5c1a..54736e53cbf91 100644 --- a/superset/assets/javascripts/chart/Chart.jsx +++ b/superset/assets/javascripts/chart/Chart.jsx @@ -9,6 +9,7 @@ import ChartBody from './ChartBody'; import Loading from '../components/Loading'; import { Logger, LOG_ACTIONS_RENDER_EVENT } from '../logger'; import StackTraceMessage from '../components/StackTraceMessage'; +import RefreshChartOverlay from '../components/RefreshChartOverlay'; import visMap from '../../visualizations/main'; import sandboxedEval from '../modules/sandbox'; import './chart.css'; @@ -36,11 +37,15 @@ const propTypes = { queryResponse: PropTypes.object, lastRendered: PropTypes.number, triggerQuery: PropTypes.bool, + refreshOverlayVisible: PropTypes.bool, + errorMessage: PropTypes.node, // dashboard callbacks addFilter: PropTypes.func, getFilters: PropTypes.func, clearFilter: PropTypes.func, removeFilter: PropTypes.func, + onQuery: PropTypes.func, + onDismissRefreshOverlay: PropTypes.func, }; const defaultProps = { @@ -214,12 +219,24 @@ class Chart extends React.PureComponent { /> } + {!isLoading && + !this.props.chartAlert && + this.props.refreshOverlayVisible && + !this.props.errorMessage && + + } {!isLoading && !this.props.chartAlert && { this.container = inner; }} diff --git a/superset/assets/javascripts/chart/ChartBody.jsx b/superset/assets/javascripts/chart/ChartBody.jsx index 89352f58b3fea..b459f4418207d 100644 --- a/superset/assets/javascripts/chart/ChartBody.jsx +++ b/superset/assets/javascripts/chart/ChartBody.jsx @@ -7,6 +7,7 @@ const propTypes = { vizType: PropTypes.string.isRequired, height: PropTypes.func.isRequired, width: PropTypes.func.isRequired, + faded: PropTypes.bool, }; class ChartBody extends React.PureComponent { @@ -42,7 +43,7 @@ class ChartBody extends React.PureComponent { return (
{ this.el = el; }} /> ); diff --git a/superset/assets/javascripts/components/RefreshChartOverlay.jsx b/superset/assets/javascripts/components/RefreshChartOverlay.jsx new file mode 100644 index 0000000000000..9e3fced23aea7 --- /dev/null +++ b/superset/assets/javascripts/components/RefreshChartOverlay.jsx @@ -0,0 +1,42 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Button from '../components/Button'; +import { t } from '../locales'; + +const propTypes = { + height: PropTypes.number.isRequired, + width: PropTypes.number.isRequired, + onQuery: PropTypes.func, + onDismiss: PropTypes.func, +}; + +class RefreshChartOverlay extends React.PureComponent { + render() { + return ( +
+
+ + +
+
+ ); + } +} + +RefreshChartOverlay.propTypes = propTypes; + +export default RefreshChartOverlay; diff --git a/superset/assets/javascripts/explore/components/ExploreChartPanel.jsx b/superset/assets/javascripts/explore/components/ExploreChartPanel.jsx index 5e4926ed26fca..bfb24fff7f1ec 100644 --- a/superset/assets/javascripts/explore/components/ExploreChartPanel.jsx +++ b/superset/assets/javascripts/explore/components/ExploreChartPanel.jsx @@ -10,6 +10,8 @@ import ExploreChartHeader from './ExploreChartHeader'; const propTypes = { actions: PropTypes.object.isRequired, addHistory: PropTypes.func, + onQuery: PropTypes.func, + onDismissRefreshOverlay: PropTypes.func, can_overwrite: PropTypes.bool.isRequired, can_download: PropTypes.bool.isRequired, datasource: PropTypes.object, @@ -24,7 +26,9 @@ const propTypes = { form_data: PropTypes.object, standalone: PropTypes.bool, timeout: PropTypes.number, + refreshOverlayVisible: PropTypes.bool, chart: PropTypes.shape(chartPropType), + errorMessage: PropTypes.node, }; class ExploreChartPanel extends React.PureComponent { @@ -45,6 +49,10 @@ class ExploreChartPanel extends React.PureComponent { setControlValue={this.props.actions.setControlValue} timeout={this.props.timeout} vizType={this.props.vizType} + refreshOverlayVisible={this.props.refreshOverlayVisible} + errorMessage={this.props.errorMessage} + onQuery={this.props.onQuery} + onDismissRefreshOverlay={this.props.onDismissRefreshOverlay} /> ); } diff --git a/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx b/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx index c4b9fe525fcd6..e1b7acbee0031 100644 --- a/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx +++ b/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx @@ -50,6 +50,7 @@ class ExploreViewContainer extends React.Component { width: this.getWidth(), showModal: false, chartIsStale: false, + refreshOverlayVisible: false, }; this.addHistory = this.addHistory.bind(this); @@ -84,7 +85,7 @@ class ExploreViewContainer extends React.Component { this.props.actions.renderTriggered(new Date().getTime(), this.props.chart.chartKey); } if (this.hasQueryControlChanged(changedControlKeys, np.controls)) { - this.setState({ chartIsStale: true }); + this.setState({ chartIsStale: true, refreshOverlayVisible: true }); } } @@ -108,10 +109,14 @@ class ExploreViewContainer extends React.Component { this.props.actions.removeControlPanelAlert(); this.props.actions.triggerQuery(true, this.props.chart.chartKey); - this.setState({ chartIsStale: false }); + this.setState({ chartIsStale: false, refreshOverlayVisible: false }); this.addHistory({}); } + onDismissRefreshOverlay() { + this.setState({ refreshOverlayVisible: false }); + } + onStop() { return this.props.chart.queryRequest.abort(); } @@ -227,7 +232,11 @@ class ExploreViewContainer extends React.Component { width={this.state.width} height={this.state.height} {...this.props} + errorMessage={this.renderErrorMessage()} + refreshOverlayVisible={this.state.refreshOverlayVisible} addHistory={this.addHistory} + onQuery={this.onQuery.bind(this)} + onDismissRefreshOverlay={this.onDismissRefreshOverlay.bind(this)} />); } diff --git a/superset/assets/stylesheets/superset.less b/superset/assets/stylesheets/superset.less index 701375010aed1..4ac5ba8ae2c3b 100644 --- a/superset/assets/stylesheets/superset.less +++ b/superset/assets/stylesheets/superset.less @@ -185,6 +185,10 @@ div.widget .chart-header a { display: none; } +.slice_container.faded { + opacity: .2; +} + div.widget { .slice_container { overflow: hidden; @@ -424,3 +428,24 @@ g.annotation-container { content: "\f0dd"; color: @brand-primary; } + +.explore-chart-overlay { + position: absolute; + z-index: 100; + display: flex; + align-items: center; + justify-content: center; + text-align: center; +} + +.refresh-overlay-btn { + font-weight: bold; + margin-right: 10px; +} + +.dismiss-overlay-btn { + font-weight: bold; + background: white; + color: @brand-primary; + border-color: @brand-primary; +} From 7440d34936784283f692a39402bcb11a9eeaa6a3 Mon Sep 17 00:00:00 2001 From: John Bodley Date: Tue, 27 Feb 2018 15:11:01 -0800 Subject: [PATCH 18/24] [payload] Fixing regression introducted in ##4396 --- superset/viz.py | 17 ++++++++--------- tests/core_tests.py | 28 ++++++++++++++++++++++++++++ tests/viz_tests.py | 3 --- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/superset/viz.py b/superset/viz.py index 31e06967a1285..3595ebf767fa0 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -151,9 +151,6 @@ def get_df(self, query_obj=None): # If the datetime format is unix, the parse will use the corresponding # parsing logic. if df is None or df.empty: - self.status = utils.QueryStatus.FAILED - if not self.error_message: - self.error_message = 'No data.' return pd.DataFrame() else: if DTTM_ALIAS in df.columns: @@ -290,10 +287,11 @@ def get_payload(self, query_obj=None): payload = self.get_df_payload(query_obj) df = payload.get('df') - if df is not None and len(df.index) == 0: - raise Exception('No data') if self.status != utils.QueryStatus.FAILED: - payload['data'] = self.get_data(df) + if df is None or df.empty: + payload['error'] = 'No data' + else: + payload['data'] = self.get_data(df) if 'df' in payload: del payload['df'] return payload @@ -327,8 +325,9 @@ def get_df_payload(self, query_obj=None): if query_obj and not is_loaded: try: df = self.get_df(query_obj) - stats_logger.incr('loaded_from_source') - is_loaded = True + if self.status != utils.QueryStatus.FAILED: + stats_logger.incr('loaded_from_source') + is_loaded = True except Exception as e: logging.exception(e) if not self.error_message: @@ -612,7 +611,7 @@ def query_obj(self): return None def get_df(self, query_obj=None): - return None + return pd.DataFrame() def get_data(self, df): markup_type = self.form_data.get('markup_type') diff --git a/tests/core_tests.py b/tests/core_tests.py index 91ae56f158679..43a3bdfc716c7 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -909,6 +909,34 @@ def test_slice_url_overrides(self): resp = self.get_resp(url) assert '"CA"' in resp + def test_slice_payload_no_data(self): + self.login(username='admin') + slc = self.get_slice('Girls', db.session) + + url = slc.get_explore_url( + base_url='/superset/explore_json', + overrides={ + 'filters': [{'col': 'state', 'op': 'in', 'val': ['N/A']}], + }, + ) + + data = self.get_json_resp(url) + self.assertEqual(data['status'], utils.QueryStatus.SUCCESS) + assert 'No data' in data['error'] + + def test_slice_payload_invalid_query(self): + self.login(username='admin') + slc = self.get_slice('Girls', db.session) + + url = slc.get_explore_url( + base_url='/superset/explore_json', + overrides={'groupby': ['N/A']}, + ) + + data = self.get_json_resp(url) + self.assertEqual(data['status'], utils.QueryStatus.FAILED) + assert 'KeyError' in data['stacktrace'] + if __name__ == '__main__': unittest.main() diff --git a/tests/viz_tests.py b/tests/viz_tests.py index 2fe73677bd19d..6822837e28312 100644 --- a/tests/viz_tests.py +++ b/tests/viz_tests.py @@ -10,7 +10,6 @@ from mock import Mock, patch import pandas as pd -import superset.utils as utils from superset.utils import DTTM_ALIAS import superset.viz as viz @@ -53,8 +52,6 @@ def test_get_df_returns_empty_df(self): result = test_viz.get_df(query_obj) self.assertEqual(type(result), pd.DataFrame) self.assertTrue(result.empty) - self.assertEqual(test_viz.error_message, 'No data.') - self.assertEqual(test_viz.status, utils.QueryStatus.FAILED) def test_get_df_handles_dttm_col(self): datasource = Mock() From 3a58dc7ecf9a5d0d669f2576a16fa03c92fe0595 Mon Sep 17 00:00:00 2001 From: Jeffrey Wang Date: Wed, 28 Feb 2018 18:48:15 -0500 Subject: [PATCH 19/24] Make margin width based on container width instead of slice width (#4487) * Make width based on container width instead of slice width * fix const var name and add comment * Actually 30 looks good too --- superset/assets/visualizations/nvd3_vis.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/superset/assets/visualizations/nvd3_vis.js b/superset/assets/visualizations/nvd3_vis.js index b60c32a0e57c0..ef544065228de 100644 --- a/superset/assets/visualizations/nvd3_vis.js +++ b/superset/assets/visualizations/nvd3_vis.js @@ -18,6 +18,8 @@ import './nvd3_vis.css'; import { VIZ_TYPES } from './main'; const minBarWidth = 15; +// Limit on how large axes margins can grow as the chart window is resized +const maxMarginPad = 30; const animationTime = 1000; const BREAKPOINTS = { @@ -463,7 +465,9 @@ function nvd3Vis(slice, payload) { if (chart.yAxis !== undefined || chart.yAxis2 !== undefined) { // Hack to adjust y axis left margin to accommodate long numbers - const marginPad = isExplore ? width * 0.01 : width * 0.03; + const containerWidth = slice.container.width(); + const marginPad = Math.min(isExplore ? containerWidth * 0.01 : containerWidth * 0.03, + maxMarginPad); const maxYAxisLabelWidth = chart.yAxis2 ? getMaxLabelSize(slice.container, 'nv-y1') : getMaxLabelSize(slice.container, 'nv-y'); const maxXAxisLabelHeight = getMaxLabelSize(slice.container, 'nv-x'); From 79bb54a173c895ca439480f08388f27533eee33d Mon Sep 17 00:00:00 2001 From: Gabe Lyons Date: Thu, 1 Mar 2018 14:24:09 -0800 Subject: [PATCH 20/24] chart style options get their own tab (#4482) --- .../components/ControlPanelsContainer.jsx | 97 ++++++++++++------- .../javascripts/explore/stores/controls.jsx | 4 + .../javascripts/explore/stores/visTypes.js | 47 +++++++-- 3 files changed, 102 insertions(+), 46 deletions(-) diff --git a/superset/assets/javascripts/explore/components/ControlPanelsContainer.jsx b/superset/assets/javascripts/explore/components/ControlPanelsContainer.jsx index 915a04f283f15..71e2bc1032871 100644 --- a/superset/assets/javascripts/explore/components/ControlPanelsContainer.jsx +++ b/superset/assets/javascripts/explore/components/ControlPanelsContainer.jsx @@ -3,7 +3,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { Alert } from 'react-bootstrap'; +import { Alert, Tab, Tabs } from 'react-bootstrap'; import visTypes, { sectionsToRender } from '../stores/visTypes'; import ControlPanelSection from './ControlPanelSection'; import ControlRow from './ControlRow'; @@ -26,6 +26,7 @@ class ControlPanelsContainer extends React.Component { super(props); this.removeAlert = this.removeAlert.bind(this); this.getControlData = this.getControlData.bind(this); + this.renderControlPanelSection = this.renderControlPanelSection.bind(this); } getControlData(controlName) { const control = this.props.controls[controlName]; @@ -49,8 +50,56 @@ class ControlPanelsContainer extends React.Component { removeAlert() { this.props.actions.removeControlPanelAlert(); } - render() { + renderControlPanelSection(section) { const ctrls = this.props.controls; + const hasErrors = section.controlSetRows.some(rows => rows.some(s => ( + ctrls[s] && + ctrls[s].validationErrors && + (ctrls[s].validationErrors.length > 0) + ))); + return ( + + {section.controlSetRows.map((controlSets, i) => ( + ( + controlName && + ctrls[controlName] && + + ))} + /> + ))} + + ); + } + render() { + const allSectionsToRender = this.sectionsToRender(); + const querySectionsToRender = []; + const displaySectionsToRender = []; + allSectionsToRender.forEach((section) => { + if (section.controlSetRows.some(rows => rows.some( + control => controls[control] && !controls[control].renderTrigger, + ))) { + querySectionsToRender.push(section); + } else { + displaySectionsToRender.push(section); + } + }); + return (
@@ -64,40 +113,16 @@ class ControlPanelsContainer extends React.Component { /> } - {this.sectionsToRender().map((section) => { - const hasErrors = section.controlSetRows.some(rows => rows.some(s => ( - ctrls[s] && - ctrls[s].validationErrors && - (ctrls[s].validationErrors.length > 0) - ))); - return ( - - {section.controlSetRows.map((controlSets, i) => ( - ( - controlName && - ctrls[controlName] && - - ))} - /> - ))} - ); - })} + + + {querySectionsToRender.map(this.renderControlPanelSection)} + + {displaySectionsToRender.length > 0 && + + {displaySectionsToRender.map(this.renderControlPanelSection)} + + } +
); diff --git a/superset/assets/javascripts/explore/stores/controls.jsx b/superset/assets/javascripts/explore/stores/controls.jsx index a15333e29ddf4..5e2c44e839d7a 100644 --- a/superset/assets/javascripts/explore/stores/controls.jsx +++ b/superset/assets/javascripts/explore/stores/controls.jsx @@ -229,6 +229,7 @@ export const controls = { stacked_style: { type: 'SelectControl', label: t('Stacked Style'), + renderTrigger: true, choices: [ ['stack', 'stack'], ['stream', 'stream'], @@ -389,6 +390,7 @@ export const controls = { type: 'CheckboxControl', label: t('Sort Bars'), default: false, + renderTrigger: true, description: t('Sort bars by x labels.'), }, @@ -846,6 +848,7 @@ export const controls = { treemap_ratio: { type: 'TextControl', label: t('Ratio'), + renderTrigger: true, isFloat: true, default: 0.5 * (1 + Math.sqrt(5)), // d3 default, golden ratio description: t('Target aspect ratio for treemap tiles.'), @@ -1183,6 +1186,7 @@ export const controls = { type: 'SelectControl', label: t('Label Type'), default: 'key', + renderTrigger: true, choices: [ ['key', 'Category Name'], ['value', 'Value'], diff --git a/superset/assets/javascripts/explore/stores/visTypes.js b/superset/assets/javascripts/explore/stores/visTypes.js index a41b81b3391ea..df00bc5da5a79 100644 --- a/superset/assets/javascripts/explore/stores/visTypes.js +++ b/superset/assets/javascripts/explore/stores/visTypes.js @@ -59,7 +59,7 @@ export const sections = { ['metrics'], ['groupby'], ['limit', 'timeseries_limit_metric'], - ['order_desc', null], + ['order_desc', 'contribution'], ], }, { @@ -104,18 +104,19 @@ export const visTypes = { ['groupby'], ['columns'], ['row_limit'], + ['contribution'], ], }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['show_legend', 'show_bar_value'], ['bar_stacked', 'order_bars'], ['y_axis_format', 'bottom_margin'], ['x_axis_label', 'y_axis_label'], - ['reduce_x_ticks', 'contribution'], - ['show_controls'], + ['reduce_x_ticks', 'show_controls'], ], }, ], @@ -144,6 +145,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['pie_label_type'], ['donut', 'show_legend'], @@ -162,15 +164,17 @@ export const visTypes = { sections.NVD3TimeSeries[0], { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['show_brush', 'show_legend'], ['rich_tooltip', 'show_markers'], - ['line_interpolation', 'contribution'], + ['line_interpolation'], ], }, { label: t('X Axis'), + expanded: true, controlSetRows: [ ['x_axis_label', 'bottom_margin'], ['x_axis_showminmax', 'x_axis_format'], @@ -178,6 +182,7 @@ export const visTypes = { }, { label: t('Y Axis'), + expanded: true, controlSetRows: [ ['y_axis_label', 'left_margin'], ['y_axis_showminmax', 'y_log_scale'], @@ -217,6 +222,7 @@ export const visTypes = { }, { label: t('X Axis'), + expanded: true, controlSetRows: [ ['x_axis_label', 'bottom_margin'], ['x_axis_showminmax', 'x_axis_format'], @@ -224,6 +230,7 @@ export const visTypes = { }, { label: t('Y Axis'), + expanded: true, controlSetRows: [ ['y_axis_label', 'left_margin'], ['y_axis_showminmax', 'y_log_scale'], @@ -245,6 +252,7 @@ export const visTypes = { controlPanelSections: [ { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['x_axis_format'], @@ -252,12 +260,14 @@ export const visTypes = { }, { label: t('Y Axis 1'), + expanded: true, controlSetRows: [ ['metric', 'y_axis_format'], ], }, { label: t('Y Axis 2'), + expanded: true, controlSetRows: [ ['metric_2', 'y_axis_2_format'], ], @@ -287,16 +297,18 @@ export const visTypes = { sections.NVD3TimeSeries[0], { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['show_brush', 'show_legend', 'show_bar_value'], - ['rich_tooltip', 'contribution'], - ['line_interpolation', 'bar_stacked'], - ['bottom_margin', 'show_controls'], + ['rich_tooltip', 'bar_stacked'], + ['line_interpolation', 'show_controls'], + ['bottom_margin'], ], }, { label: t('Axes'), + expanded: true, controlSetRows: [ ['x_axis_format', 'y_axis_format'], ['x_axis_showminmax', 'reduce_x_ticks'], @@ -322,6 +334,7 @@ export const visTypes = { sections.NVD3TimeSeries[0], { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['x_axis_format', 'y_axis_format'], @@ -698,16 +711,17 @@ export const visTypes = { sections.NVD3TimeSeries[0], { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['show_brush', 'show_legend'], ['line_interpolation', 'stacked_style'], ['color_scheme'], - ['rich_tooltip', 'contribution'], - ['show_controls', null], + ['rich_tooltip', 'show_controls'], ], }, { label: t('Axes'), + expanded: true, controlSetRows: [ ['x_axis_format', 'x_axis_showminmax'], ['y_axis_format', 'y_axis_bounds'], @@ -891,6 +905,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['treemap_ratio'], @@ -939,6 +954,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['whisker_options'], @@ -960,6 +976,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['show_legend', null], @@ -973,6 +990,7 @@ export const visTypes = { }, { label: t('X Axis'), + expanded: true, controlSetRows: [ ['x_axis_label', 'left_margin'], ['x', 'x_axis_format'], @@ -981,6 +999,7 @@ export const visTypes = { }, { label: t('Y Axis'), + expanded: true, controlSetRows: [ ['y_axis_label', 'bottom_margin'], ['y', 'y_axis_format'], @@ -1011,6 +1030,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['metric'], ['ranges', 'range_labels'], @@ -1033,6 +1053,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['compare_lag', 'compare_suffix'], ['y_axis_format', null], @@ -1058,6 +1079,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['subheader'], ['y_axis_format'], @@ -1084,6 +1106,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ['link_length'], @@ -1117,6 +1140,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ], @@ -1155,6 +1179,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['color_scheme'], ], @@ -1208,6 +1233,7 @@ export const visTypes = { }, { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['y_axis_format', null], ['color_scheme'], @@ -1419,6 +1445,7 @@ export const visTypes = { sections.NVD3TimeSeries[0], { label: t('Chart Options'), + expanded: true, controlSetRows: [ ['series_height', 'horizon_color_scale'], ], @@ -1567,7 +1594,7 @@ export const visTypes = { sections.NVD3TimeSeries[0], { label: t('Chart Options'), - expanded: false, + expanded: true, controlSetRows: [ ['color_scheme'], ['number_format', 'date_time_format'], From 2637d3d5e2d73ed018ddcac444d95dfaa460a8d3 Mon Sep 17 00:00:00 2001 From: Grace Guo Date: Thu, 1 Mar 2018 15:48:04 -0800 Subject: [PATCH 21/24] [dashboard] (#4515) --- superset/assets/javascripts/dashboard/reducers.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/superset/assets/javascripts/dashboard/reducers.js b/superset/assets/javascripts/dashboard/reducers.js index 80137c5af008f..bf42532edb51a 100644 --- a/superset/assets/javascripts/dashboard/reducers.js +++ b/superset/assets/javascripts/dashboard/reducers.js @@ -41,8 +41,9 @@ export function getInitialState(bootstrapData) { } else { dashboard.position_json = []; } - const lastRowId = Math.max.apply(null, - dashboard.position_json.map(pos => (pos.row + pos.size_y))); + + const lastRowId = Math.max(0, Math.max.apply(null, + dashboard.position_json.map(pos => (pos.row + pos.size_y)))); let newSliceCounter = 0; dashboard.slices.forEach((slice) => { const sliceId = slice.slice_id; From 41defdceaa0af44916973365889433e1517d0a3f Mon Sep 17 00:00:00 2001 From: EvelynTurner <36863942+EvelynTurner@users.noreply.github.com> Date: Fri, 2 Mar 2018 00:02:04 -0500 Subject: [PATCH 22/24] Fix how the annotation layer interpretes the timestamp string without timezone info; use it as UTC (#4511) --- superset/assets/visualizations/nvd3_vis.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/superset/assets/visualizations/nvd3_vis.js b/superset/assets/visualizations/nvd3_vis.js index ef544065228de..3739aa41029c8 100644 --- a/superset/assets/visualizations/nvd3_vis.js +++ b/superset/assets/visualizations/nvd3_vis.js @@ -4,6 +4,7 @@ import throttle from 'lodash.throttle'; import d3 from 'd3'; import nv from 'nvd3'; import mathjs from 'mathjs'; +import moment from 'moment'; import d3tip from 'd3-tip'; import { getColorFromScheme } from '../javascripts/modules/colors'; @@ -628,7 +629,7 @@ function nvd3Vis(slice, payload) { const tip = tipFactory(e); const records = (slice.annotationData[e.name].records || []).map((r) => { - const timeColumn = new Date(r[e.timeColumn]); + const timeColumn = new Date(moment.utc(r[e.timeColumn])); return { ...r, [e.timeColumn]: timeColumn, From 413585448e660cd5421d52e4f510d5de57e92d42 Mon Sep 17 00:00:00 2001 From: Ariel Shemtov Date: Fri, 2 Mar 2018 13:45:46 -0800 Subject: [PATCH 23/24] Superset issue #4512: fixing histogram (#4513) * fixing histogram axes and colors, adding normalized and x-axis label options * adding y-axis label option --- .../javascripts/explore/stores/controls.jsx | 8 ++ .../javascripts/explore/stores/visTypes.js | 2 + superset/assets/visualizations/histogram.js | 91 ++++++++++--------- 3 files changed, 57 insertions(+), 44 deletions(-) diff --git a/superset/assets/javascripts/explore/stores/controls.jsx b/superset/assets/javascripts/explore/stores/controls.jsx index 5e2c44e839d7a..1a5b554297627 100644 --- a/superset/assets/javascripts/explore/stores/controls.jsx +++ b/superset/assets/javascripts/explore/stores/controls.jsx @@ -1985,5 +1985,13 @@ export const controls = { description: t('Whether to fill the objects'), default: false, }, + + normalized: { + type: 'CheckboxControl', + label: t('Normalized'), + renderTrigger: true, + description: t('Whether to normalize the histogram'), + default: false, + }, }; export default controls; diff --git a/superset/assets/javascripts/explore/stores/visTypes.js b/superset/assets/javascripts/explore/stores/visTypes.js index df00bc5da5a79..a4ffe4d22e97b 100644 --- a/superset/assets/javascripts/explore/stores/visTypes.js +++ b/superset/assets/javascripts/explore/stores/visTypes.js @@ -1110,6 +1110,8 @@ export const visTypes = { controlSetRows: [ ['color_scheme'], ['link_length'], + ['x_axis_label', 'y_axis_label'], + ['normalized'], ], }, ], diff --git a/superset/assets/visualizations/histogram.js b/superset/assets/visualizations/histogram.js index b5bbf0951946b..b4bf6fcc746dd 100644 --- a/superset/assets/visualizations/histogram.js +++ b/superset/assets/visualizations/histogram.js @@ -4,40 +4,54 @@ import { getColorFromScheme } from '../javascripts/modules/colors'; require('./histogram.css'); function histogram(slice, payload) { + const data = payload.data; const div = d3.select(slice.selector); - const draw = function (data, numBins) { + const numBins = Number(slice.formData.link_length) || 10; + const normalized = slice.formData.normalized; + const xAxisLabel = slice.formData.x_axis_label; + const yAxisLabel = slice.formData.y_axis_label; + + const draw = function () { // Set Margins + const left = yAxisLabel ? 70 : 50; const margin = { top: 50, right: 10, bottom: 20, - left: 50, + left, }; const navBarHeight = 36; const navBarBuffer = 10; const width = slice.width() - margin.left - margin.right; const height = slice.height() - margin.top - margin.bottom - navBarHeight - navBarBuffer; + // set number of ticks + const maxTicks = 20; + const numTicks = d3.min([maxTicks, numBins]); + // Set Histogram objects - const formatNumber = d3.format(',.0f'); - const formatTicks = d3.format(',.00f'); - const x = d3.scale.ordinal(); + const x = d3.scale.linear(); const y = d3.scale.linear(); const xAxis = d3.svg.axis() .scale(x) .orient('bottom') - .ticks(numBins) - .tickFormat(formatTicks); + .ticks(numTicks, 's'); const yAxis = d3.svg.axis() .scale(y) .orient('left') - .ticks(numBins); + .ticks(numTicks, 's'); // Calculate bins for the data - const bins = d3.layout.histogram().bins(numBins)(data); + let bins = d3.layout.histogram().bins(numBins)(data); + if (normalized) { + const total = data.length; + bins = bins.map(d => ({ ...d, y: d.y / total })); + } // Set the x-values - x.domain(bins.map(d => d.x)) - .rangeRoundBands([0, width], 0.1); + const max = d3.max(data); + const min = d3.min(data); + x.domain([min, max]) + .range([0, width], 0.1); // Set the y-values y.domain([0, d3.max(bins, d => d.y)]) .range([height, 0]); @@ -72,42 +86,13 @@ function histogram(slice, payload) { bar.enter().append('rect'); bar.exit().remove(); // Set the Height and Width for each bar - bar.attr('width', x.rangeBand()) + bar.attr('width', (x(bins[0].dx) - x(0)) - 1) .attr('x', d => x(d.x)) .attr('y', d => y(d.y)) .attr('height', d => y.range()[0] - y(d.y)) - .style('fill', d => getColorFromScheme(d.length, slice.formData.color_scheme)) + .style('fill', getColorFromScheme(1, slice.formData.color_scheme)) .order(); - // Find maximum length to position the ticks on top of the bar correctly - const maxLength = d3.max(bins, d => d.length); - function textAboveBar(d) { - return d.length / maxLength < 0.1; - } - - // Add a bar text to each bar in the histogram - svg.selectAll('.bartext') - .data(bins) - .enter() - .append('text') - .attr('dy', '.75em') - .attr('y', function (d) { - let padding = 0.0; - if (textAboveBar(d)) { - padding = 12.0; - } else { - padding = -8.0; - } - return y(d.y) - padding; - }) - .attr('x', d => x(d.x) + (x.rangeBand() / 2)) - .attr('text-anchor', 'middle') - .attr('font-weight', 'bold') - .attr('font-size', '15px') - .text(d => formatNumber(d.y)) - .attr('fill', d => textAboveBar(d) ? 'black' : 'white') - .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); - // Update the x-axis svg.append('g') .attr('class', 'axis') @@ -124,11 +109,29 @@ function histogram(slice, payload) { .selectAll('g') .filter(function (d) { return d; }) .classed('minor', true); + + // add axis labels if passed + if (xAxisLabel) { + svg.append('text') + .attr('transform', + 'translate(' + ((width + margin.left) / 2) + ' ,' + + (height + margin.top + 50) + ')') + .style('text-anchor', 'middle') + .text(xAxisLabel); + } + if (yAxisLabel) { + svg.append('text') + .attr('transform', 'rotate(-90)') + .attr('y', '1em') + .attr('x', 0 - (height / 2)) + .attr('dy', '1em') + .style('text-anchor', 'middle') + .text(yAxisLabel); + } }; - const numBins = Number(slice.formData.link_length) || 10; div.selectAll('*').remove(); - draw(payload.data, numBins); + draw(); } module.exports = histogram; From 007ad351cf8d27e1218ecc5f1619701a18787241 Mon Sep 17 00:00:00 2001 From: Riku Pelkonen Date: Mon, 5 Mar 2018 21:43:59 +0200 Subject: [PATCH 24/24] Pass datasource as form_data param (#4538) * Pass datasource as form_data param * add comma after datasource * change test to match new addSlice --- superset/assets/javascripts/addSlice/AddSliceContainer.jsx | 6 +++++- .../spec/javascripts/addSlice/AddSliceContainer_spec.jsx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/superset/assets/javascripts/addSlice/AddSliceContainer.jsx b/superset/assets/javascripts/addSlice/AddSliceContainer.jsx index 48b31eb4797b8..05169346885c4 100644 --- a/superset/assets/javascripts/addSlice/AddSliceContainer.jsx +++ b/superset/assets/javascripts/addSlice/AddSliceContainer.jsx @@ -23,7 +23,11 @@ export default class AddSliceContainer extends React.PureComponent { } exploreUrl() { - const formData = encodeURIComponent(JSON.stringify({ viz_type: this.state.visType })); + const formData = encodeURIComponent( + JSON.stringify({ + viz_type: this.state.visType, + datasource: this.state.datasourceValue, + })); return `/superset/explore/?form_data=${formData}`; } diff --git a/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx b/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx index 2a1f09b79c11c..f91b301cdf491 100644 --- a/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx +++ b/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx @@ -53,7 +53,7 @@ describe('AddSliceContainer', () => { datasourceId: datasourceValue.split('__')[0], datasourceType: datasourceValue.split('__')[1], }); - const formattedUrl = '/superset/explore/?form_data=%7B%22viz_type%22%3A%22table%22%7D'; + const formattedUrl = '/superset/explore/?form_data=%7B%22viz_type%22%3A%22table%22%2C%22datasource%22%3A%221__table%22%7D'; expect(wrapper.instance().exploreUrl()).to.equal(formattedUrl); }); });