From 71665f7a1ec7f42ca27765cce0aa414d75759219 Mon Sep 17 00:00:00 2001 From: Wood Date: Mon, 14 Nov 2016 13:00:17 +0000 Subject: [PATCH 01/37] Testing gitlab remote repo --- TODO.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TODO.md b/TODO.md index 7bcdcad83617..c5bde0304008 100644 --- a/TODO.md +++ b/TODO.md @@ -46,3 +46,6 @@ List of TODO items for Superset ## Community * Turorial vids + +## Stuff I'm doing! +* CSV input From fe81595dcf3abcc8bde412b6bb32705fd2888181 Mon Sep 17 00:00:00 2001 From: raw Date: Mon, 14 Nov 2016 13:14:56 +0000 Subject: [PATCH 02/37] test commit --- TODO.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/TODO.md b/TODO.md index c5bde0304008..7bcdcad83617 100644 --- a/TODO.md +++ b/TODO.md @@ -46,6 +46,3 @@ List of TODO items for Superset ## Community * Turorial vids - -## Stuff I'm doing! -* CSV input From 3f3ab333bb87715c4b96ec773017fc1a1766ca69 Mon Sep 17 00:00:00 2001 From: dev Date: Tue, 29 Nov 2016 13:51:55 +0000 Subject: [PATCH 03/37] trying out various ways of uploading xls/csv with flask --- flask_excel_demo.py | 76 +++++++++++++++++++++++++++++++++++++++++++++ superset/views.py | 59 +++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 flask_excel_demo.py diff --git a/flask_excel_demo.py b/flask_excel_demo.py new file mode 100644 index 000000000000..3249cc6efc59 --- /dev/null +++ b/flask_excel_demo.py @@ -0,0 +1,76 @@ +# insert database related code here + +from flask_sqlalchemy import SQLAlchemy # sql operations +import pyexcel.ext.xls # import it to be able to handle xls file format + +# connection to the database +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tmp.db' +db = SQLAlchemy(app) + +# models for the uploaded files +class Post(db.Model): + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(80)) + body = db.Column(db.Text) + pub_date = db.Column(db.DateTime) + + category_id = db.Column(db.Integer, db.ForeignKey('category.id')) + category = db.relationship('Category', + backref=db.backref('posts', lazy='dynamic')) + + def __init__(self, title, body, category, pub_date=None): + self.title = title + self.body = body + if pub_date is None: + pub_date = datetime.utcnow() + self.pub_date = pub_date + self.category = category + + def __repr__(self): + return '' % self.title + +class Category(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(50)) + + def __init__(self, name): + self.name = name + + def __repr__(self): + return '' % self.name + +# Create tables in the database +db.create_all() + +# View function for data import +@app.route("/import", methods=['GET', 'POST']) +def doimport(): + if request.method == 'POST': + def category_init_func(row): + c = Category(row['name']) + c.id = row['id'] + return c + def post_init_func(row): + c = Category.query.filter_by(name=row['category']).first() + p = Post(row['title'], row['body'], c, row['pub_date']) + return p + request.save_book_to_database(field_name='file', session=db.session, + tables=[Category, Post], + initializers=(category_init_func, + post_init_func]) + return "Saved" + return ''' + + Upload an excel file +

Excel file upload (xls, xlsx, ods please)

+

+ +

+ ''' + +# View function for data export +@app.route("/export", methods=['GET']) +def doexport(): + return excel.make_response_from_tables(db.session, [Category, Post], "xls") + +# Visit http://localhost:5000/import and upload sample-data.xls . Then visit http://localhost:5000/export to download the data back. \ No newline at end of file diff --git a/superset/views.py b/superset/views.py index 5614209bbcf0..f9b7d888db07 100755 --- a/superset/views.py +++ b/superset/views.py @@ -508,6 +508,7 @@ class DatabaseView(SupersetModelView, DeleteMixin): # noqa 'database_name', 'sqlalchemy_uri', 'cache_timeout', 'extra', 'expose_in_sqllab', 'allow_run_sync', 'allow_run_async', 'allow_ctas', 'allow_dml', 'force_ctas_schema'] + search_exclude_columns = ('password',) edit_columns = add_columns show_columns = [ @@ -579,6 +580,11 @@ def pre_add(self, db): def pre_update(self, db): self.pre_add(db) + # @has_access + # @expose('/method1/') + # def method1(self): + # return 'Hello' + appbuilder.add_link( 'Import Dashboards', @@ -616,6 +622,59 @@ class DatabaseTablesAsync(DatabaseView): appbuilder.add_view_no_menu(DatabaseTablesAsync) +# TODO: Add CSV import wizard/forms +# add_csv_columns = [ +# 'csv_name', 'database_name', '' +# ] # NOTE: these are the wizard columns when adding a csv file as a new database +# edit_csv_columns = add_csv_columns # NOTE these are the wizard columns when adding a csv file as a new database + +# Just add new upload icon to the database view? + +# +# class FileView(SupersetModelView, DeleteMixin): #noqa +# datamodel = SQLAInterface(models.File) +# list_columns = ['file_name', 'creator', 'changed_on_'] +# add_columns = ['file_name', 'file_path'] +# search_exclude_columns = ('password',) +# edit_columns = add_columns +# show_columns = ['file_name', 'created_by', 'created_on', 'changed_by', 'changed_on'] +# add_template = "superset/models/database/add.html" # change to file add +# edit_template = "superset/models/database/edit.html" # change to file add +# base_order = ('changed_on', 'desc') +# description_columns = {} +# label_columns = { +# 'file_name': _("Database"), +# 'creator': _("Creator"), +# 'changed_on_': _("Last Changed"), +# } +# +# @expose("/files", methods=['GET', 'POST']) +# @log_this +# def import_dashboards(self): +# """Overrides the dashboards using pickled instances from the file.""" +# f = request.files.get('file') +# if request.method == 'POST' and f: +# current_tt = int(time.time()) +# data = pickle.load(f) +# for table in data['datasources']: +# models.SqlaTable.import_obj(table, import_time=current_tt) +# for dashboard in data['dashboards']: +# models.Dashboard.import_obj( +# dashboard, import_time=current_tt) +# db.session.commit() +# return redirect('/dashboardmodelview/list/') +# return self.render_template('superset/import_dashboards.html') +# +# +# appbuilder.add_view( +# FileView, +# "Files", +# label=__("Files"), +# icon="fa-database", +# category="Sources", +# category_label=__("Sources"), +# category_icon='fa-database', ) + class TableModelView(SupersetModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.SqlaTable) From 9ffbf9a4c6c78b268d9b795c448d8c74c1836b86 Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Tue, 29 Nov 2016 14:06:52 +0000 Subject: [PATCH 04/37] revert previous changes --- flask_excel_demo.py | 76 --------------------------------------------- superset/views.py | 7 ----- 2 files changed, 83 deletions(-) delete mode 100644 flask_excel_demo.py diff --git a/flask_excel_demo.py b/flask_excel_demo.py deleted file mode 100644 index 3249cc6efc59..000000000000 --- a/flask_excel_demo.py +++ /dev/null @@ -1,76 +0,0 @@ -# insert database related code here - -from flask_sqlalchemy import SQLAlchemy # sql operations -import pyexcel.ext.xls # import it to be able to handle xls file format - -# connection to the database -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tmp.db' -db = SQLAlchemy(app) - -# models for the uploaded files -class Post(db.Model): - id = db.Column(db.Integer, primary_key=True) - title = db.Column(db.String(80)) - body = db.Column(db.Text) - pub_date = db.Column(db.DateTime) - - category_id = db.Column(db.Integer, db.ForeignKey('category.id')) - category = db.relationship('Category', - backref=db.backref('posts', lazy='dynamic')) - - def __init__(self, title, body, category, pub_date=None): - self.title = title - self.body = body - if pub_date is None: - pub_date = datetime.utcnow() - self.pub_date = pub_date - self.category = category - - def __repr__(self): - return '' % self.title - -class Category(db.Model): - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(50)) - - def __init__(self, name): - self.name = name - - def __repr__(self): - return '' % self.name - -# Create tables in the database -db.create_all() - -# View function for data import -@app.route("/import", methods=['GET', 'POST']) -def doimport(): - if request.method == 'POST': - def category_init_func(row): - c = Category(row['name']) - c.id = row['id'] - return c - def post_init_func(row): - c = Category.query.filter_by(name=row['category']).first() - p = Post(row['title'], row['body'], c, row['pub_date']) - return p - request.save_book_to_database(field_name='file', session=db.session, - tables=[Category, Post], - initializers=(category_init_func, - post_init_func]) - return "Saved" - return ''' - - Upload an excel file -

Excel file upload (xls, xlsx, ods please)

-

- -

- ''' - -# View function for data export -@app.route("/export", methods=['GET']) -def doexport(): - return excel.make_response_from_tables(db.session, [Category, Post], "xls") - -# Visit http://localhost:5000/import and upload sample-data.xls . Then visit http://localhost:5000/export to download the data back. \ No newline at end of file diff --git a/superset/views.py b/superset/views.py index b536208eb2cf..556ff115fb37 100755 --- a/superset/views.py +++ b/superset/views.py @@ -508,7 +508,6 @@ class DatabaseView(SupersetModelView, DeleteMixin): # noqa 'database_name', 'sqlalchemy_uri', 'cache_timeout', 'extra', 'expose_in_sqllab', 'allow_run_sync', 'allow_run_async', 'allow_ctas', 'allow_dml', 'force_ctas_schema'] - search_exclude_columns = ('password',) edit_columns = add_columns show_columns = [ @@ -580,12 +579,6 @@ def pre_add(self, db): def pre_update(self, db): self.pre_add(db) - # @has_access - # @expose('/method1/') - # def method1(self): - # return 'Hello' - - appbuilder.add_link( 'Import Dashboards', label=__("Import Dashboards"), From dcb0f1477b97cdf515024c693b144a7328729904 Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Tue, 29 Nov 2016 15:33:57 +0000 Subject: [PATCH 05/37] Add CSV button placed on database page --- superset/templates/superset/widgets/list.html | 10 ++++++++++ superset/views.py | 2 ++ superset/widgets.py | 5 +++++ 3 files changed, 17 insertions(+) create mode 100644 superset/templates/superset/widgets/list.html create mode 100644 superset/widgets.py diff --git a/superset/templates/superset/widgets/list.html b/superset/templates/superset/widgets/list.html new file mode 100644 index 000000000000..11329135ad6f --- /dev/null +++ b/superset/templates/superset/widgets/list.html @@ -0,0 +1,10 @@ +{% import "appbuilder/general/lib.html" as lib %} +{% extends "appbuilder/general/widgets/list.html" %} + + {% block list_header %} + {{ super() }} + + Add CSV Database + + {% endblock %} diff --git a/superset/views.py b/superset/views.py index 556ff115fb37..28c69d49a107 100755 --- a/superset/views.py +++ b/superset/views.py @@ -40,6 +40,7 @@ ) from superset.source_registry import SourceRegistry from superset.models import DatasourceAccessRequest as DAR +from superset.widgets import CsvListWidget config = app.config log_this = models.Log.log_this @@ -522,6 +523,7 @@ class DatabaseView(SupersetModelView, DeleteMixin): # noqa 'changed_by', 'changed_on', ] + list_widget = CsvListWidget add_template = "superset/models/database/add.html" edit_template = "superset/models/database/edit.html" base_order = ('changed_on', 'desc') diff --git a/superset/widgets.py b/superset/widgets.py new file mode 100644 index 000000000000..83d8b64ca75f --- /dev/null +++ b/superset/widgets.py @@ -0,0 +1,5 @@ +from flask_appbuilder.widgets import ListWidget + + +class CsvListWidget(ListWidget): + template = 'superset/widgets/list.html' \ No newline at end of file From a539090582794bbe22b709b2e9f6848f311cd7aa Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Thu, 1 Dec 2016 11:59:55 +0000 Subject: [PATCH 06/37] Changed upload csv to use same layout/template as import dashboards --- superset/config.py | 3 + superset/templates/superset/upload_files.html | 23 +++++ superset/templates/superset/widgets/list.html | 2 +- superset/views.py | 95 ++++++++----------- 4 files changed, 68 insertions(+), 55 deletions(-) create mode 100644 superset/templates/superset/upload_files.html diff --git a/superset/config.py b/superset/config.py index a6dac3ba9fea..d7e670539c53 100644 --- a/superset/config.py +++ b/superset/config.py @@ -151,6 +151,9 @@ ENABLE_CORS = False CORS_OPTIONS = {} +# Allowed format types for upload on Database view +ALLOWED_EXTENSIONS = set(['csv', 'xls']) + # --------------------------------------------------- # List of viz_types not allowed in your environment diff --git a/superset/templates/superset/upload_files.html b/superset/templates/superset/upload_files.html new file mode 100644 index 000000000000..8cd71b0c98a4 --- /dev/null +++ b/superset/templates/superset/upload_files.html @@ -0,0 +1,23 @@ +{% extends "superset/basic.html" %} + +# TODO: move the libs required by flask into the common.js from welcome.js. +{% block head_js %} + {{ super() }} + {% with filename="welcome" %} + {% include "superset/partials/_script_tag.html" %} + {% endwith %} +{% endblock %} + +{% block title %}{{ _("Import") }}{% endblock %} +{% block body %} + {% include "superset/flash_wrapper.html" %} +
+ Upload CSV file to turn into database. +

Upload CSV.

+
+

+ +

+
+
+{% endblock %} \ No newline at end of file diff --git a/superset/templates/superset/widgets/list.html b/superset/templates/superset/widgets/list.html index 11329135ad6f..b1ef18a8c59c 100644 --- a/superset/templates/superset/widgets/list.html +++ b/superset/templates/superset/widgets/list.html @@ -3,7 +3,7 @@ {% block list_header %} {{ super() }} - Add CSV Database diff --git a/superset/views.py b/superset/views.py index 28c69d49a107..364d63914a97 100755 --- a/superset/views.py +++ b/superset/views.py @@ -8,6 +8,7 @@ import logging import pickle import re +import os import sys import time import traceback @@ -17,7 +18,7 @@ import sqlalchemy as sqla from flask import ( - g, request, redirect, flash, Response, render_template, Markup) + g, request, redirect, flash, Response, render_template, Markup, url_for, send_from_directory) from flask_appbuilder import ModelView, CompactCRUDMixin, BaseView, expose from flask_appbuilder.actions import action from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -31,6 +32,7 @@ from sqlalchemy import create_engine from werkzeug.routing import BaseConverter +from werkzeug.utils import secure_filename from wtforms.validators import ValidationError import superset @@ -581,6 +583,44 @@ def pre_add(self, db): def pre_update(self, db): self.pre_add(db) + # TODO: Add CSV import wizard/forms - right now it just adds a file + # 1: Select local file + # 2: Pandas to turn into dataframe + # 3: Pandas to turn into database + # 4: Database upload wizard + + @staticmethod + def allowed_file(filename): + # Only allow specific file extensions as specified in the config + return '.' in filename and \ + filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] + + @expose('/upload_file', methods=['GET', 'POST']) + def upload_file(self): + if request.method == 'POST': + # check if the post request has the file part + if 'file' not in request.files: + flash('No file part') + return redirect(request.url) + file = request.files['file'] + # if user does not select file, browser also + # submit a empty part without filename + if file.filename == '': + flash('No selected file') + return redirect(request.url) + if file and self.allowed_file(file.filename): + filename = secure_filename(file.filename) + file.save(os.path.join(config['UPLOAD_FOLDER'], filename)) + return redirect(request.url) # - > This is where I add the Pandas form? + # TODO: Use the following redirect if you want to download an uploaded file + # redirect(url_for('uploaded_file', filename=filename)) + return self.render_template('superset/upload_files.html') + + @expose('/uploads/') + def uploaded_file(self, filename): + return send_from_directory(config['UPLOAD_FOLDER'], + filename) + appbuilder.add_link( 'Import Dashboards', label=__("Import Dashboards"), @@ -617,59 +657,6 @@ class DatabaseTablesAsync(DatabaseView): appbuilder.add_view_no_menu(DatabaseTablesAsync) -# TODO: Add CSV import wizard/forms -# add_csv_columns = [ -# 'csv_name', 'database_name', '' -# ] # NOTE: these are the wizard columns when adding a csv file as a new database -# edit_csv_columns = add_csv_columns # NOTE these are the wizard columns when adding a csv file as a new database - -# Just add new upload icon to the database view? - -# -# class FileView(SupersetModelView, DeleteMixin): #noqa -# datamodel = SQLAInterface(models.File) -# list_columns = ['file_name', 'creator', 'changed_on_'] -# add_columns = ['file_name', 'file_path'] -# search_exclude_columns = ('password',) -# edit_columns = add_columns -# show_columns = ['file_name', 'created_by', 'created_on', 'changed_by', 'changed_on'] -# add_template = "superset/models/database/add.html" # change to file add -# edit_template = "superset/models/database/edit.html" # change to file add -# base_order = ('changed_on', 'desc') -# description_columns = {} -# label_columns = { -# 'file_name': _("Database"), -# 'creator': _("Creator"), -# 'changed_on_': _("Last Changed"), -# } -# -# @expose("/files", methods=['GET', 'POST']) -# @log_this -# def import_dashboards(self): -# """Overrides the dashboards using pickled instances from the file.""" -# f = request.files.get('file') -# if request.method == 'POST' and f: -# current_tt = int(time.time()) -# data = pickle.load(f) -# for table in data['datasources']: -# models.SqlaTable.import_obj(table, import_time=current_tt) -# for dashboard in data['dashboards']: -# models.Dashboard.import_obj( -# dashboard, import_time=current_tt) -# db.session.commit() -# return redirect('/dashboardmodelview/list/') -# return self.render_template('superset/import_dashboards.html') -# -# -# appbuilder.add_view( -# FileView, -# "Files", -# label=__("Files"), -# icon="fa-database", -# category="Sources", -# category_label=__("Sources"), -# category_icon='fa-database', ) - class TableModelView(SupersetModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.SqlaTable) From b5222fc7a59dd4b04a862837944a36feecdee6b0 Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Fri, 2 Dec 2016 15:24:04 +0000 Subject: [PATCH 07/37] Starting to add csv to db form (to expose panda api) --- superset/config.py | 3 +- superset/views.py | 89 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 76 insertions(+), 16 deletions(-) diff --git a/superset/config.py b/superset/config.py index d7e670539c53..1efebf184d72 100644 --- a/superset/config.py +++ b/superset/config.py @@ -152,7 +152,8 @@ CORS_OPTIONS = {} # Allowed format types for upload on Database view -ALLOWED_EXTENSIONS = set(['csv', 'xls']) +# TODO: Add processing of other spreadsheet formats (xls, xlsx etc) +ALLOWED_EXTENSIONS = set(['csv']) # --------------------------------------------------- diff --git a/superset/views.py b/superset/views.py index 364d63914a97..061de7b64e4c 100755 --- a/superset/views.py +++ b/superset/views.py @@ -13,19 +13,22 @@ import time import traceback import zlib +import pandas import functools import sqlalchemy as sqla from flask import ( g, request, redirect, flash, Response, render_template, Markup, url_for, send_from_directory) -from flask_appbuilder import ModelView, CompactCRUDMixin, BaseView, expose +from flask_appbuilder import ModelView, CompactCRUDMixin, BaseView, expose, SimpleFormView from flask_appbuilder.actions import action from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access, has_access_api from flask_appbuilder.widgets import ListWidget from flask_appbuilder.models.sqla.filters import BaseFilter from flask_appbuilder.security.sqla import models as ab_models +from flask_appbuilder.fieldwidgets import BS3TextFieldWidget +from flask_appbuilder.forms import DynamicForm from flask_babel import gettext as __ from flask_babel import lazy_gettext as _ @@ -33,12 +36,14 @@ from sqlalchemy import create_engine from werkzeug.routing import BaseConverter from werkzeug.utils import secure_filename -from wtforms.validators import ValidationError + +from wtforms import Form, StringField +from wtforms.validators import ValidationError, DataRequired import superset from superset import ( appbuilder, cache, db, models, viz, utils, app, - sm, sql_lab, results_backend, security, + sm, sql_lab, results_backend, security, dataframe ) from superset.source_registry import SourceRegistry from superset.models import DatasourceAccessRequest as DAR @@ -595,6 +600,27 @@ def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] + @staticmethod + def csv_to_df(filename): + # Use Pandas to parse csv file to a dataframe + upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + str(config['SUPERSET_WEBSERVER_PORT']) \ + + url_for('uploaded_file', filename=filename) + # TODO: Expose this to api so can specify each field + df = pandas.read_csv(filepath_or_buffer=upload_path, error_bad_lines=False) + # Convert to superset dataframe? + # sdf = dataframe.SupersetDataFrame(df) + return df + + @staticmethod + def df_to_db(df, tablename): + # Use Pandas to parse dataframe to database + + engine = create_engine(config['SQLALCHEMY_DATABASE_URI'], echo=False) + tablename = 'csvtable' + + # TODO: Expose this to API so can specify each field + df.to_sql(name=tablename, con=engine, if_exists='replace') + @expose('/upload_file', methods=['GET', 'POST']) def upload_file(self): if request.method == 'POST': @@ -602,25 +628,27 @@ def upload_file(self): if 'file' not in request.files: flash('No file part') return redirect(request.url) - file = request.files['file'] + f = request.files['file'] # if user does not select file, browser also # submit a empty part without filename - if file.filename == '': + if f.filename == '': flash('No selected file') return redirect(request.url) - if file and self.allowed_file(file.filename): - filename = secure_filename(file.filename) - file.save(os.path.join(config['UPLOAD_FOLDER'], filename)) - return redirect(request.url) # - > This is where I add the Pandas form? + if f and self.allowed_file(f.filename): + filename = secure_filename(f.filename) + f.save(os.path.join(config['UPLOAD_FOLDER'], filename)) + + # TODO: Use Pandas to convert csv to superset dataframe + df = self.csv_to_df(filename) + # TODO: Use Pandas to convert superset dataframe to database + self.df_to_db(df, filename) + + return redirect('/csvtodatabaseview') + # return redirect(request.url) # - > This is where I add the Pandas form? # TODO: Use the following redirect if you want to download an uploaded file - # redirect(url_for('uploaded_file', filename=filename)) + # return redirect(url_for('uploaded_file', filename=filename)) return self.render_template('superset/upload_files.html') - @expose('/uploads/') - def uploaded_file(self, filename): - return send_from_directory(config['UPLOAD_FOLDER'], - filename) - appbuilder.add_link( 'Import Dashboards', label=__("Import Dashboards"), @@ -657,6 +685,37 @@ class DatabaseTablesAsync(DatabaseView): appbuilder.add_view_no_menu(DatabaseTablesAsync) +# TODO: This should prob be moved elsewhere +@app.route('/uploads/') +def uploaded_file(filename): + return send_from_directory(config['UPLOAD_FOLDER'], + filename) + +# TODO: Custom form for when converting CSV to Database + + +class CsvToDatabaseForm(DynamicForm): + field1 = StringField('Field1', description='Your field 1', + validators=[DataRequired()], widget=BS3TextFieldWidget()) + field2 = StringField('Field2', description='Your field 2', + validators=[DataRequired()], widget=BS3TextFieldWidget()) + + +class CsvToDatabaseView(SimpleFormView): + form = CsvToDatabaseForm + form_title = 'This is my first form view' + message = 'Form view submitted' + + def form_get(self, form): + # pre process form + form.field1.data = 'This was prefilled' + + def form_post(self, form): + # post process form + flash(self.message, 'info') + +appbuilder.add_view_no_menu(CsvToDatabaseView) + class TableModelView(SupersetModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.SqlaTable) From 38762b0e8d3a55a9e1aa1a088b80865eabfb57f9 Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Mon, 5 Dec 2016 16:25:51 +0000 Subject: [PATCH 08/37] CsvToDatabaseView updated to include most of the pandas api read_csv fields. --- superset/views.py | 201 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 160 insertions(+), 41 deletions(-) diff --git a/superset/views.py b/superset/views.py index 061de7b64e4c..956d93920c85 100755 --- a/superset/views.py +++ b/superset/views.py @@ -19,7 +19,7 @@ import sqlalchemy as sqla from flask import ( - g, request, redirect, flash, Response, render_template, Markup, url_for, send_from_directory) + g, request, redirect, flash, Response, render_template, Markup, url_for, send_from_directory, session) from flask_appbuilder import ModelView, CompactCRUDMixin, BaseView, expose, SimpleFormView from flask_appbuilder.actions import action from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -37,8 +37,8 @@ from werkzeug.routing import BaseConverter from werkzeug.utils import secure_filename -from wtforms import Form, StringField -from wtforms.validators import ValidationError, DataRequired +from wtforms import Form, StringField, IntegerField, FieldList, BooleanField +from wtforms.validators import ValidationError, DataRequired, InputRequired, Optional import superset from superset import ( @@ -600,27 +600,6 @@ def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] - @staticmethod - def csv_to_df(filename): - # Use Pandas to parse csv file to a dataframe - upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + str(config['SUPERSET_WEBSERVER_PORT']) \ - + url_for('uploaded_file', filename=filename) - # TODO: Expose this to api so can specify each field - df = pandas.read_csv(filepath_or_buffer=upload_path, error_bad_lines=False) - # Convert to superset dataframe? - # sdf = dataframe.SupersetDataFrame(df) - return df - - @staticmethod - def df_to_db(df, tablename): - # Use Pandas to parse dataframe to database - - engine = create_engine(config['SQLALCHEMY_DATABASE_URI'], echo=False) - tablename = 'csvtable' - - # TODO: Expose this to API so can specify each field - df.to_sql(name=tablename, con=engine, if_exists='replace') - @expose('/upload_file', methods=['GET', 'POST']) def upload_file(self): if request.method == 'POST': @@ -635,16 +614,10 @@ def upload_file(self): flash('No selected file') return redirect(request.url) if f and self.allowed_file(f.filename): - filename = secure_filename(f.filename) - f.save(os.path.join(config['UPLOAD_FOLDER'], filename)) - - # TODO: Use Pandas to convert csv to superset dataframe - df = self.csv_to_df(filename) - # TODO: Use Pandas to convert superset dataframe to database - self.df_to_db(df, filename) - - return redirect('/csvtodatabaseview') - # return redirect(request.url) # - > This is where I add the Pandas form? + session['filename'] = secure_filename(f.filename) + f.save(os.path.join(config['UPLOAD_FOLDER'], session['filename'])) + return redirect('/csvtodatabaseview/form') + #return redirect(request.url) # - > This is where I add the Pandas form? # TODO: Use the following redirect if you want to download an uploaded file # return redirect(url_for('uploaded_file', filename=filename)) return self.render_template('superset/upload_files.html') @@ -695,25 +668,171 @@ def uploaded_file(filename): class CsvToDatabaseForm(DynamicForm): - field1 = StringField('Field1', description='Your field 1', - validators=[DataRequired()], widget=BS3TextFieldWidget()) - field2 = StringField('Field2', description='Your field 2', - validators=[DataRequired()], widget=BS3TextFieldWidget()) + csv_filename = StringField('CSV Filename', description='CSV File to be uploaded to Database.', + validators=[DataRequired()], widget=BS3TextFieldWidget()) # For now make sure this cannot be edited + sep = StringField('Delimiter', description='Delimiter used by CSV file (for whitespace use \s+).', + validators=[DataRequired()], widget=BS3TextFieldWidget()) + header = IntegerField('Header Row', description='Row containing the headers to use as column names ' + '(0 is first line of data). Leave empty if there is no header row.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + names = StringField('Column Names', description='List of comma-separated column names to use if header ' + 'row not specified above. Leave empty if header field populated.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + index_col = IntegerField('Index Column', description='Column to use as the row labels of the dataframe. Leave ' + 'empty if no index column.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + squeeze = BooleanField('Squeeze', description='Parse the data as a series (specify this option if the data ' + 'contains only one column.') + prefix = StringField('Prefix', description='Prefix to add to column numbers when no header ' + '(e.g. "X" for "X0, X1").', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + mangle_dupe_cols = BooleanField('Mangle Duplicate Columns', description='Specify duplicate columns as "X.0, X.1".') + skipinitialspace = BooleanField('Skip Initial Space', description='Skip spaces after delimiter.') + skiprows = IntegerField('Skip Rows', description='Number of rows to skip at start of file.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + nrows = IntegerField('Rows to Read', description='Number of rows of file to read.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + skip_blank_lines = BooleanField('Skip Blank Lines', description='Skip blank lines rather than interpreting them ' + 'as NaN values.') + parse_dates = BooleanField('Parse Dates', description='Parse date values.') + infer_datetime_format = BooleanField('Infer Datetime Format', description='Use Pandas to interpret the ' + 'datetime format.') + dayfirst = BooleanField('Day First', description='Use DD/MM (European/International) date format.') + thousands = StringField('Thousands Separator', description='Separator for values in thousands.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + decimal = StringField('Decimal Character', description='Character to interpret as decimal point.', + validators=[DataRequired()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + quotechar = StringField('Quote Character', description='Character used to denote the start and end of a ' + 'quoted item.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or "'"]) + escapechar = StringField('Escape Character', description='Character used to escape a quoted item.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + comment = StringField('Comment Character', description='Character used to denote the start of a comment.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + encoding = StringField('Encoding', description='Encoding to use for UTF when reading/writing (e.g. "utf-8").', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + error_bad_lines = BooleanField('Error On Bad Lines', description='Error on bad lines (e.g. a line with too many ' + 'commas). If false these bad lines will instead ' + 'be dropped from the resulting dataframe.') + + # TODO: There are more fields in the Pandas API, but these are the most obviously used + # TODO: Check all the validators + class CsvToDatabaseView(SimpleFormView): form = CsvToDatabaseForm - form_title = 'This is my first form view' - message = 'Form view submitted' + form_title = 'CSV to Database configuration' + message = 'CSV uploaded to table in database ' # insert name here def form_get(self, form): # pre process form - form.field1.data = 'This was prefilled' + # default values + form.csv_filename.data = session['filename'] + form.sep.data = ',' + form.header.data = None + form.names.data = None + form.index_col.data = None + form.squeeze.data = False + form.prefix.data = None + form.mangle_dupe_cols.data = False + form.skipinitialspace.data = False + form.skiprows.data = None + form.nrows.data = None + form.skip_blank_lines.data = True + form.parse_dates.data = False + form.infer_datetime_format.data = False + form.dayfirst.data = False + form.thousands.data = None + form.decimal.data = '.' + form.quotechar.data = None + form.escapechar.data = None + form.comment.data = None + form.encoding.data = None + form.error_bad_lines.data = False def form_post(self, form): # post process form + + # Turn into list of strings + if form.names.data is not None: + form.names.data = form.names.data.split(",") + + # TODO: Use Pandas to convert csv to superset dataframe + + print(str(form.encoding.data)) + + df = self.csv_to_df(filepath_or_buffer=form.csv_filename.data, + sep=form.sep.data, + header=form.header.data, + names=form.names.data, + index_col=form.index_col.data, + squeeze=form.squeeze.data, + prefix=form.prefix.data, + mangle_dupe_cols=form.mangle_dupe_cols.data, + skipinitialspace=form.skipinitialspace.data, + skiprows=form.skiprows.data, + nrows=form.nrows.data, + skip_blank_lines=form.skip_blank_lines.data, + parse_dates=form.parse_dates.data, + infer_datetime_format=form.infer_datetime_format.data, + dayfirst=form.dayfirst.data, + thousands=form.thousands.data, + decimal=form.decimal.data, + quotechar=form.quotechar.data, + escapechar=form.escapechar.data, + comment=form.comment.data, + encoding=form.encoding.data, + error_bad_lines=form.error_bad_lines.data) + # TODO: Use Pandas to convert superset dataframe to database + self.df_to_db(df, form.csv_filename.data) flash(self.message, 'info') + @staticmethod + def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix, mangle_dupe_cols, + skipinitialspace, skiprows, nrows, skip_blank_lines, parse_dates, infer_datetime_format, + dayfirst, thousands, decimal, quotechar, escapechar, comment, encoding, error_bad_lines): + # Use Pandas to parse csv file to a dataframe + upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + str(config['SUPERSET_WEBSERVER_PORT']) \ + + url_for('uploaded_file', filename=filepath_or_buffer) + # TODO: Expose this to api so can specify each field + df = pandas.read_csv(filepath_or_buffer=upload_path, + sep=sep, + header=header, + names=names, + index_col=index_col, + squeeze=squeeze, + prefix=prefix, + mangle_dupe_cols=mangle_dupe_cols, + skipinitialspace=skipinitialspace, + skiprows=skiprows, + nrows=nrows, + skip_blank_lines=skip_blank_lines, + parse_dates=parse_dates, + infer_datetime_format=infer_datetime_format, + dayfirst=dayfirst, + thousands=thousands, + decimal=decimal, + quotechar=quotechar, + escapechar=escapechar, + comment=comment, + encoding=encoding, + error_bad_lines=error_bad_lines, + ) + # Convert to superset dataframe? + # sdf = dataframe.SupersetDataFrame(df) + return df + + @staticmethod + def df_to_db(df, tablename): + # Use Pandas to parse dataframe to database + + engine = create_engine(config['SQLALCHEMY_DATABASE_URI'], echo=False) + tablename = 'csvtable' + + # TODO: Expose this to API so can specify each field + df.to_sql(name=tablename, con=engine, if_exists='replace') + appbuilder.add_view_no_menu(CsvToDatabaseView) From ae1e9d5074fc40b0b50b390861c5ae13abea6ec3 Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Tue, 6 Dec 2016 14:36:54 +0000 Subject: [PATCH 09/37] Exposed the pandas .to_sql API in the upload csv form. Removed the separate upload page. --- superset/templates/superset/upload_files.html | 23 --- superset/templates/superset/widgets/list.html | 6 +- superset/views.py | 142 +++++++++++------- 3 files changed, 88 insertions(+), 83 deletions(-) delete mode 100644 superset/templates/superset/upload_files.html diff --git a/superset/templates/superset/upload_files.html b/superset/templates/superset/upload_files.html deleted file mode 100644 index 8cd71b0c98a4..000000000000 --- a/superset/templates/superset/upload_files.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "superset/basic.html" %} - -# TODO: move the libs required by flask into the common.js from welcome.js. -{% block head_js %} - {{ super() }} - {% with filename="welcome" %} - {% include "superset/partials/_script_tag.html" %} - {% endwith %} -{% endblock %} - -{% block title %}{{ _("Import") }}{% endblock %} -{% block body %} - {% include "superset/flash_wrapper.html" %} -
- Upload CSV file to turn into database. -

Upload CSV.

-
-

- -

-
-
-{% endblock %} \ No newline at end of file diff --git a/superset/templates/superset/widgets/list.html b/superset/templates/superset/widgets/list.html index b1ef18a8c59c..d5053176e7ab 100644 --- a/superset/templates/superset/widgets/list.html +++ b/superset/templates/superset/widgets/list.html @@ -3,8 +3,8 @@ {% block list_header %} {{ super() }} - - Add CSV Database + + Add CSV Table to Database {% endblock %} diff --git a/superset/views.py b/superset/views.py index 956d93920c85..0a3239c5ac39 100755 --- a/superset/views.py +++ b/superset/views.py @@ -37,8 +37,8 @@ from werkzeug.routing import BaseConverter from werkzeug.utils import secure_filename -from wtforms import Form, StringField, IntegerField, FieldList, BooleanField -from wtforms.validators import ValidationError, DataRequired, InputRequired, Optional +from wtforms import Form, StringField, IntegerField, FieldList, BooleanField, SelectField, FileField +from wtforms.validators import ValidationError, DataRequired, InputRequired, Optional, Regexp import superset from superset import ( @@ -588,40 +588,6 @@ def pre_add(self, db): def pre_update(self, db): self.pre_add(db) - # TODO: Add CSV import wizard/forms - right now it just adds a file - # 1: Select local file - # 2: Pandas to turn into dataframe - # 3: Pandas to turn into database - # 4: Database upload wizard - - @staticmethod - def allowed_file(filename): - # Only allow specific file extensions as specified in the config - return '.' in filename and \ - filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] - - @expose('/upload_file', methods=['GET', 'POST']) - def upload_file(self): - if request.method == 'POST': - # check if the post request has the file part - if 'file' not in request.files: - flash('No file part') - return redirect(request.url) - f = request.files['file'] - # if user does not select file, browser also - # submit a empty part without filename - if f.filename == '': - flash('No selected file') - return redirect(request.url) - if f and self.allowed_file(f.filename): - session['filename'] = secure_filename(f.filename) - f.save(os.path.join(config['UPLOAD_FOLDER'], session['filename'])) - return redirect('/csvtodatabaseview/form') - #return redirect(request.url) # - > This is where I add the Pandas form? - # TODO: Use the following redirect if you want to download an uploaded file - # return redirect(url_for('uploaded_file', filename=filename)) - return self.render_template('superset/upload_files.html') - appbuilder.add_link( 'Import Dashboards', label=__("Import Dashboards"), @@ -658,18 +624,25 @@ class DatabaseTablesAsync(DatabaseView): appbuilder.add_view_no_menu(DatabaseTablesAsync) -# TODO: This should prob be moved elsewhere + @app.route('/uploads/') def uploaded_file(filename): return send_from_directory(config['UPLOAD_FOLDER'], filename) -# TODO: Custom form for when converting CSV to Database - class CsvToDatabaseForm(DynamicForm): - csv_filename = StringField('CSV Filename', description='CSV File to be uploaded to Database.', - validators=[DataRequired()], widget=BS3TextFieldWidget()) # For now make sure this cannot be edited + + # These are the fields exposed by Pandas read_csv() + csv_filename = FileField('CSV File', description='Select a CSV file to be uploaded to a database.', + validators=[DataRequired()]) + + # , Regexp(r'^[^/\\]\.csv$', message='Selected file does not have ' + # 'the .csv extension.') + + + #csv_filename = StringField('CSV Filename', description='CSV File to be uploaded to Database.', + # validators=[DataRequired()], widget=BS3TextFieldWidget()) # For now make sure this cannot be edited sep = StringField('Delimiter', description='Delimiter used by CSV file (for whitespace use \s+).', validators=[DataRequired()], widget=BS3TextFieldWidget()) header = IntegerField('Header Row', description='Row containing the headers to use as column names ' @@ -701,7 +674,7 @@ class CsvToDatabaseForm(DynamicForm): thousands = StringField('Thousands Separator', description='Separator for values in thousands.', validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) decimal = StringField('Decimal Character', description='Character to interpret as decimal point.', - validators=[DataRequired()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or '.']) quotechar = StringField('Quote Character', description='Character used to denote the start and end of a ' 'quoted item.', validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or "'"]) @@ -718,17 +691,37 @@ class CsvToDatabaseForm(DynamicForm): # TODO: There are more fields in the Pandas API, but these are the most obviously used # TODO: Check all the validators + # TODO: Check all the fields use correct format - i.e. multiple choice??? + + # These are the fields exposed by Pandas .to_sql() + name = StringField('Table Name', description='Name of table to be created from csv data.', + validators=[DataRequired()], widget=BS3TextFieldWidget()) + con = StringField('Database URI', description='URI of database in which to add above table.', + validators=[DataRequired()], widget=BS3TextFieldWidget()) + schema = StringField('Schema', description='Specify a schema (if database flavour supports this).', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + if_exists = SelectField('Table Exists', description='If table exists do one of the following: Fail (do nothing), ' + 'Replace (drop and recreate table) or Append (insert data).', + choices=[('fail', 'Fail'), ('replace', 'Replace'), ('append', 'Append')], + validators=[DataRequired()]) + index = BooleanField('Dataframe Index', description='Write dataframe index as a column.') + index_label = StringField('Column Label(s)', description='Column label for index column(s). If None is given and ' + 'Dataframe Index is True, Index Names are used.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + chunksize = IntegerField('Chunksize', description='If not None, then rows will be written in batches of this size ' + 'at a time. If None, all rows will be written at once.', + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + # dtype class CsvToDatabaseView(SimpleFormView): form = CsvToDatabaseForm form_title = 'CSV to Database configuration' - message = 'CSV uploaded to table in database ' # insert name here def form_get(self, form): # pre process form # default values - form.csv_filename.data = session['filename'] + form.csv_filename.data = None form.sep.data = ',' form.header.data = None form.names.data = None @@ -750,6 +743,13 @@ def form_get(self, form): form.comment.data = None form.encoding.data = None form.error_bad_lines.data = False + form.name.data = None + form.con.data = config['SQLALCHEMY_DATABASE_URI'] + form.schema.data = None + form.if_exists.data = 'replace' + form.index.data = None + form.index_label.data = None + form.chunksize.data = None def form_post(self, form): # post process form @@ -758,11 +758,11 @@ def form_post(self, form): if form.names.data is not None: form.names.data = form.names.data.split(",") - # TODO: Use Pandas to convert csv to superset dataframe - - print(str(form.encoding.data)) + # Attempt to upload csv file + filename = self.upload_file(form) - df = self.csv_to_df(filepath_or_buffer=form.csv_filename.data, + # Use Pandas to convert csv to dataframe + df = self.csv_to_df(filepath_or_buffer=filename, sep=form.sep.data, header=form.header.data, names=form.names.data, @@ -784,9 +784,22 @@ def form_post(self, form): comment=form.comment.data, encoding=form.encoding.data, error_bad_lines=form.error_bad_lines.data) - # TODO: Use Pandas to convert superset dataframe to database - self.df_to_db(df, form.csv_filename.data) - flash(self.message, 'info') + + # Use Pandas to convert superset dataframe to database + self.df_to_db(df=df, + name=form.name.data, + con=form.con.data, + schema=form.schema.data, + if_exists=form.if_exists.data, + index=form.index.data, + index_label=form.index_label.data, + chunksize=form.chunksize.data) + + # Go back to welcome page / splash screen + message = 'CSV file "{0}" uploaded to table "{1}" in database "{2}"'.format(filename, + form.name.data, form.con.data) + flash(message, 'info') + redirect('/databaseview/list') @staticmethod def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix, mangle_dupe_cols, @@ -795,7 +808,7 @@ def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix # Use Pandas to parse csv file to a dataframe upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + str(config['SUPERSET_WEBSERVER_PORT']) \ + url_for('uploaded_file', filename=filepath_or_buffer) - # TODO: Expose this to api so can specify each field + # Expose this to api so can specify each field df = pandas.read_csv(filepath_or_buffer=upload_path, sep=sep, header=header, @@ -824,14 +837,29 @@ def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix return df @staticmethod - def df_to_db(df, tablename): + def df_to_db(df, name, con, schema, if_exists, index, index_label, chunksize): + + # SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(DATA_DIR, 'superset.db') + # DATA_DIR = os.path.join(os.path.expanduser('~'), '.superset') + + engine = create_engine(con, echo=False) # Can only add to existing database - make dropdown? + # Use Pandas to parse dataframe to database + df.to_sql(name=name, con=engine, schema=schema, if_exists=if_exists, index=index, + index_label=index_label, chunksize=chunksize) - engine = create_engine(config['SQLALCHEMY_DATABASE_URI'], echo=False) - tablename = 'csvtable' + @staticmethod + def allowed_file(filename): + # Only allow specific file extensions as specified in the config + return '.' in filename and \ + filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] - # TODO: Expose this to API so can specify each field - df.to_sql(name=tablename, con=engine, if_exists='replace') + @staticmethod + def upload_file(form): + if form.csv_filename.data: + filename = secure_filename(form.csv_filename.data.filename) + form.csv_filename.data.save(os.path.join(config['UPLOAD_FOLDER'], filename)) + return filename appbuilder.add_view_no_menu(CsvToDatabaseView) From 04742532840add7e0944838f1325d0054d214867 Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Wed, 7 Dec 2016 10:41:50 +0000 Subject: [PATCH 10/37] File select part of csvtodatabaseview form --- superset/views.py | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/superset/views.py b/superset/views.py index 0a3239c5ac39..a50668dcc94a 100755 --- a/superset/views.py +++ b/superset/views.py @@ -33,13 +33,14 @@ from flask_babel import gettext as __ from flask_babel import lazy_gettext as _ +from flask_wtf.file import FileField, FileAllowed, FileRequired +from wtforms import Form, StringField, IntegerField, FieldList, BooleanField, SelectField +from wtforms.validators import ValidationError, DataRequired, InputRequired, Optional + from sqlalchemy import create_engine from werkzeug.routing import BaseConverter from werkzeug.utils import secure_filename -from wtforms import Form, StringField, IntegerField, FieldList, BooleanField, SelectField, FileField -from wtforms.validators import ValidationError, DataRequired, InputRequired, Optional, Regexp - import superset from superset import ( appbuilder, cache, db, models, viz, utils, app, @@ -632,17 +633,9 @@ def uploaded_file(filename): class CsvToDatabaseForm(DynamicForm): - # These are the fields exposed by Pandas read_csv() - csv_filename = FileField('CSV File', description='Select a CSV file to be uploaded to a database.', - validators=[DataRequired()]) - - # , Regexp(r'^[^/\\]\.csv$', message='Selected file does not have ' - # 'the .csv extension.') - - - #csv_filename = StringField('CSV Filename', description='CSV File to be uploaded to Database.', - # validators=[DataRequired()], widget=BS3TextFieldWidget()) # For now make sure this cannot be edited + csv_file = FileField('CSV File', description='Select a CSV file to be uploaded to a database.', + validators=[FileRequired(), FileAllowed(['csv'], 'CSV Files Only!')]) sep = StringField('Delimiter', description='Delimiter used by CSV file (for whitespace use \s+).', validators=[DataRequired()], widget=BS3TextFieldWidget()) header = IntegerField('Header Row', description='Row containing the headers to use as column names ' @@ -721,7 +714,7 @@ class CsvToDatabaseView(SimpleFormView): def form_get(self, form): # pre process form # default values - form.csv_filename.data = None + form.csv_file.data = None form.sep.data = ',' form.header.data = None form.names.data = None @@ -854,11 +847,10 @@ def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] - @staticmethod - def upload_file(form): - if form.csv_filename.data: - filename = secure_filename(form.csv_filename.data.filename) - form.csv_filename.data.save(os.path.join(config['UPLOAD_FOLDER'], filename)) + def upload_file(self, form): + if form.csv_file.data and self.allowed_file(form.csv_file.data.filename): + filename = secure_filename(form.csv_file.data.filename) + form.csv_file.data.save(os.path.join(config['UPLOAD_FOLDER'], filename)) return filename appbuilder.add_view_no_menu(CsvToDatabaseView) From 96ebb823fdf02c2555bfcfaedc240d81155f58dc Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Thu, 8 Dec 2016 14:57:05 +0000 Subject: [PATCH 11/37] Used flask-babel lazy_gettext to ready the new strings for translation. --- babel/messages.pot | 1539 ++++++++++------ .../translations/es/LC_MESSAGES/messages.mo | Bin 5877 -> 39307 bytes .../translations/es/LC_MESSAGES/messages.po | 1593 ++++++++++------ .../translations/fr/LC_MESSAGES/messages.mo | Bin 5950 -> 39306 bytes .../translations/fr/LC_MESSAGES/messages.po | 1593 ++++++++++------ .../translations/it/LC_MESSAGES/messages.mo | Bin 5975 -> 39339 bytes .../translations/it/LC_MESSAGES/messages.po | 1622 ++++++++++------ .../translations/zh/LC_MESSAGES/messages.mo | Bin 5798 -> 35621 bytes .../translations/zh/LC_MESSAGES/messages.po | 1634 +++++++++++------ superset/views.py | 97 +- 10 files changed, 5228 insertions(+), 2850 deletions(-) mode change 100755 => 100644 superset/translations/es/LC_MESSAGES/messages.po mode change 100755 => 100644 superset/translations/fr/LC_MESSAGES/messages.po mode change 100755 => 100644 superset/translations/it/LC_MESSAGES/messages.po mode change 100755 => 100644 superset/translations/zh/LC_MESSAGES/messages.po diff --git a/babel/messages.pot b/babel/messages.pot index e19c73590cb9..86677fe7afec 100755 --- a/babel/messages.pot +++ b/babel/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-07-01 17:17+0800\n" +"POT-Creation-Date: 2016-12-08 14:45+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,165 +17,258 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: superset/forms.py:140 -msgid "Viz" +#: superset/db_engine_specs.py:79 superset/db_engine_specs.py:102 +#: superset/db_engine_specs.py:125 superset/db_engine_specs.py:160 +#: superset/db_engine_specs.py:268 superset/db_engine_specs.py:304 +#: superset/forms.py:436 +msgid "Time Column" +msgstr "" + +#: superset/db_engine_specs.py:80 superset/db_engine_specs.py:126 +#: superset/db_engine_specs.py:161 superset/db_engine_specs.py:269 +msgid "second" +msgstr "" + +#: superset/db_engine_specs.py:81 superset/db_engine_specs.py:129 +#: superset/db_engine_specs.py:163 superset/db_engine_specs.py:271 +#: superset/db_engine_specs.py:305 +msgid "minute" +msgstr "" + +#: superset/db_engine_specs.py:82 superset/db_engine_specs.py:131 +#: superset/db_engine_specs.py:165 superset/db_engine_specs.py:277 +#: superset/db_engine_specs.py:307 superset/forms.py:380 superset/forms.py:394 +msgid "hour" +msgstr "" + +#: superset/db_engine_specs.py:83 superset/db_engine_specs.py:103 +#: superset/db_engine_specs.py:133 superset/db_engine_specs.py:167 +#: superset/db_engine_specs.py:279 superset/db_engine_specs.py:309 +#: superset/forms.py:381 superset/forms.py:395 +msgid "day" +msgstr "" + +#: superset/db_engine_specs.py:84 superset/db_engine_specs.py:104 +#: superset/db_engine_specs.py:134 superset/db_engine_specs.py:169 +#: superset/db_engine_specs.py:281 superset/db_engine_specs.py:311 +#: superset/forms.py:366 superset/forms.py:382 superset/forms.py:396 +msgid "week" +msgstr "" + +#: superset/db_engine_specs.py:85 superset/db_engine_specs.py:106 +#: superset/db_engine_specs.py:136 superset/db_engine_specs.py:171 +#: superset/db_engine_specs.py:283 superset/db_engine_specs.py:313 +#: superset/forms.py:369 superset/forms.py:383 superset/forms.py:397 +msgid "month" +msgstr "" + +#: superset/db_engine_specs.py:86 superset/db_engine_specs.py:138 +#: superset/db_engine_specs.py:173 superset/db_engine_specs.py:285 +#: superset/db_engine_specs.py:315 +msgid "quarter" +msgstr "" + +#: superset/db_engine_specs.py:87 superset/db_engine_specs.py:140 +#: superset/db_engine_specs.py:287 superset/db_engine_specs.py:317 +#: superset/forms.py:384 +msgid "year" +msgstr "" + +#: superset/db_engine_specs.py:175 superset/forms.py:368 +msgid "week_ending_saturday" +msgstr "" + +#: superset/db_engine_specs.py:178 +msgid "week_start_sunday" +msgstr "" + +#: superset/db_engine_specs.py:273 +msgid "5 minute" +msgstr "" + +#: superset/db_engine_specs.py:275 +msgid "half hour" +msgstr "" + +#: superset/forms.py:30 +msgid "D3 format syntax https://github.com/d3/d3-format" msgstr "" #: superset/forms.py:143 -msgid "The type of visualization to display" +msgid "Viz" msgstr "" #: superset/forms.py:146 +msgid "The type of visualization to display" +msgstr "" + +#: superset/forms.py:149 msgid "Metrics" msgstr "" -#: superset/forms.py:149 superset/forms.py:154 +#: superset/forms.py:152 superset/forms.py:157 msgid "One or many metrics to display" msgstr "" -#: superset/forms.py:152 +#: superset/forms.py:155 msgid "Ordering" msgstr "" -#: superset/forms.py:157 superset/views.py:294 superset/views.py:334 +#: superset/forms.py:160 superset/views.py:455 superset/views.py:495 msgid "Metric" msgstr "" -#: superset/forms.py:160 +#: superset/forms.py:163 msgid "Choose the metric" msgstr "" -#: superset/forms.py:163 +#: superset/forms.py:166 msgid "Chart Style" msgstr "" -#: superset/forms.py:165 +#: superset/forms.py:168 msgid "stack" msgstr "" -#: superset/forms.py:166 +#: superset/forms.py:169 msgid "stream" msgstr "" -#: superset/forms.py:167 +#: superset/forms.py:170 msgid "expand" msgstr "" -#: superset/forms.py:173 +#: superset/forms.py:176 msgid "Color Scheme" msgstr "" -#: superset/forms.py:175 +#: superset/forms.py:178 msgid "fire" msgstr "" -#: superset/forms.py:176 +#: superset/forms.py:179 msgid "blue_white_yellow" msgstr "" -#: superset/forms.py:177 +#: superset/forms.py:180 msgid "white_black" msgstr "" -#: superset/forms.py:178 +#: superset/forms.py:181 msgid "black_white" msgstr "" -#: superset/forms.py:184 +#: superset/forms.py:187 msgid "Normalize Across" msgstr "" -#: superset/forms.py:186 +#: superset/forms.py:189 msgid "heatmap" msgstr "" -#: superset/forms.py:187 +#: superset/forms.py:190 msgid "x" msgstr "" -#: superset/forms.py:188 +#: superset/forms.py:191 msgid "y" msgstr "" -#: superset/forms.py:191 +#: superset/forms.py:194 msgid "" "Color will be rendered based on a ratio of the cell against the sum of " "across this criteria" msgstr "" -#: superset/forms.py:197 +#: superset/forms.py:200 msgid "Color Scale" msgstr "" -#: superset/forms.py:199 +#: superset/forms.py:202 msgid "series" msgstr "" -#: superset/forms.py:200 +#: superset/forms.py:203 msgid "overall" msgstr "" -#: superset/forms.py:201 +#: superset/forms.py:204 msgid "change" msgstr "" -#: superset/forms.py:204 +#: superset/forms.py:207 msgid "Defines how the color are attributed." msgstr "" -#: superset/forms.py:207 +#: superset/forms.py:210 msgid "Rendering" msgstr "" -#: superset/forms.py:209 +#: superset/forms.py:212 msgid "pixelated (Sharp)" msgstr "" -#: superset/forms.py:210 +#: superset/forms.py:213 msgid "auto (Smooth)" msgstr "" -#: superset/forms.py:213 +#: superset/forms.py:216 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "" -#: superset/forms.py:218 +#: superset/forms.py:221 msgid "XScale Interval" msgstr "" -#: superset/forms.py:221 +#: superset/forms.py:224 msgid "Number of step to take between ticks when printing the x scale" msgstr "" -#: superset/forms.py:226 +#: superset/forms.py:229 msgid "YScale Interval" msgstr "" -#: superset/forms.py:229 +#: superset/forms.py:232 msgid "Number of step to take between ticks when printing the y scale" msgstr "" -#: superset/forms.py:234 +#: superset/forms.py:237 msgid "Stacked Bars" msgstr "" -#: superset/forms.py:239 +#: superset/forms.py:242 +msgid "Show Markers" +msgstr "" + +#: superset/forms.py:249 +msgid "Bar Values" +msgstr "" + +#: superset/forms.py:254 +msgid "Sort Bars" +msgstr "" + +#: superset/forms.py:256 +msgid "Sort bars by x labels." +msgstr "" + +#: superset/forms.py:259 msgid "Extra Controls" msgstr "" -#: superset/forms.py:241 +#: superset/forms.py:261 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" -#: superset/forms.py:247 +#: superset/forms.py:267 msgid "Reduce X ticks" msgstr "" -#: superset/forms.py:249 +#: superset/forms.py:269 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 " @@ -183,874 +276,919 @@ msgid "" "scroll." msgstr "" -#: superset/forms.py:257 +#: superset/forms.py:277 msgid "Include Series" msgstr "" -#: superset/forms.py:259 +#: superset/forms.py:279 msgid "Include series name as an axis" msgstr "" -#: superset/forms.py:262 +#: superset/forms.py:282 msgid "Color Metric" msgstr "" -#: superset/forms.py:265 +#: superset/forms.py:285 msgid "A metric to use for color" msgstr "" -#: superset/forms.py:268 +#: superset/forms.py:288 msgid "Country Field Type" msgstr "" -#: superset/forms.py:271 +#: superset/forms.py:291 msgid "Full name" msgstr "" -#: superset/forms.py:272 +#: superset/forms.py:292 msgid "code International Olympic Committee (cioc)" msgstr "" -#: superset/forms.py:273 +#: superset/forms.py:293 msgid "code ISO 3166-1 alpha-2 (cca2)" msgstr "" -#: superset/forms.py:274 +#: superset/forms.py:294 msgid "code ISO 3166-1 alpha-3 (cca3)" msgstr "" -#: superset/forms.py:276 +#: superset/forms.py:296 msgid "" "The country code standard that Superset should expect to find in the " "[country] column" msgstr "" -#: superset/forms.py:281 +#: superset/forms.py:301 msgid "Group by" msgstr "" -#: superset/forms.py:283 +#: superset/forms.py:303 msgid "One or many fields to group by" msgstr "" -#: superset/forms.py:286 superset/forms.py:291 +#: superset/forms.py:306 superset/forms.py:311 msgid "Columns" msgstr "" -#: superset/forms.py:288 +#: superset/forms.py:308 msgid "One or many fields to pivot as columns" msgstr "" -#: superset/forms.py:293 superset/forms.py:298 superset/forms.py:303 +#: superset/forms.py:313 superset/forms.py:319 superset/forms.py:325 msgid "Columns to display" msgstr "" -#: superset/forms.py:296 +#: superset/forms.py:316 msgid "X" msgstr "" -#: superset/forms.py:301 +#: superset/forms.py:322 msgid "Y" msgstr "" -#: superset/forms.py:306 +#: superset/forms.py:328 msgid "Origin" msgstr "" -#: superset/forms.py:308 +#: superset/forms.py:330 msgid "default" msgstr "" -#: superset/forms.py:309 superset/forms.py:467 +#: superset/forms.py:331 superset/forms.py:500 msgid "now" msgstr "" -#: superset/forms.py:312 +#: superset/forms.py:334 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "'now', 'sunday' or '1970-01-01'" msgstr "" -#: superset/forms.py:317 +#: superset/forms.py:339 msgid "Bottom Margin" msgstr "" -#: superset/forms.py:320 +#: superset/forms.py:342 msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/forms.py:325 +#: superset/forms.py:347 +msgid "Page Length" +msgstr "" + +#: superset/forms.py:350 +msgid "Number of rows per page, 0 means no pagination" +msgstr "" + +#: superset/forms.py:354 msgid "Time Granularity" msgstr "" -#: superset/forms.py:328 +#: superset/forms.py:357 msgid "all" msgstr "" -#: superset/forms.py:329 +#: superset/forms.py:358 msgid "5 seconds" msgstr "" -#: superset/forms.py:330 +#: superset/forms.py:359 msgid "30 seconds" msgstr "" -#: superset/forms.py:331 +#: superset/forms.py:360 msgid "1 minute" msgstr "" -#: superset/forms.py:332 +#: superset/forms.py:361 msgid "5 minutes" msgstr "" -#: superset/forms.py:333 +#: superset/forms.py:362 msgid "1 hour" msgstr "" -#: superset/forms.py:334 +#: superset/forms.py:363 msgid "6 hour" msgstr "" -#: superset/forms.py:335 +#: superset/forms.py:364 msgid "1 day" msgstr "" -#: superset/forms.py:336 +#: superset/forms.py:365 msgid "7 days" msgstr "" -#: superset/forms.py:338 +#: superset/forms.py:367 +msgid "week_starting_sunday" +msgstr "" + +#: superset/forms.py:371 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/forms.py:344 +#: superset/forms.py:377 msgid "Domain" msgstr "" -#: superset/forms.py:347 superset/forms.py:361 superset/models.py:417 -#: superset/models.py:435 -msgid "hour" -msgstr "" - -#: superset/forms.py:348 superset/forms.py:362 superset/models.py:419 -#: superset/models.py:427 superset/models.py:436 -msgid "day" -msgstr "" - -#: superset/forms.py:349 superset/forms.py:363 superset/models.py:407 -#: superset/models.py:420 superset/models.py:428 superset/models.py:437 -msgid "week" -msgstr "" - -#: superset/forms.py:350 superset/forms.py:364 superset/models.py:408 -#: superset/models.py:422 superset/models.py:429 superset/models.py:438 -msgid "month" -msgstr "" - -#: superset/forms.py:351 superset/models.py:439 -msgid "year" -msgstr "" - -#: superset/forms.py:353 +#: superset/forms.py:386 msgid "The time unit used for the grouping of blocks" msgstr "" -#: superset/forms.py:357 +#: superset/forms.py:390 msgid "Subdomain" msgstr "" -#: superset/forms.py:360 superset/forms.py:701 +#: superset/forms.py:393 superset/forms.py:744 msgid "min" msgstr "" -#: superset/forms.py:366 +#: superset/forms.py:399 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/forms.py:371 +#: superset/forms.py:404 msgid "Link Length" msgstr "" -#: superset/forms.py:383 +#: superset/forms.py:416 msgid "Link length in the force layout" msgstr "" -#: superset/forms.py:386 +#: superset/forms.py:419 msgid "Charge" msgstr "" -#: superset/forms.py:400 +#: superset/forms.py:433 msgid "Charge in the force layout" msgstr "" -#: superset/forms.py:403 superset/models.py:406 superset/models.py:416 -#: superset/models.py:426 superset/models.py:432 -msgid "Time Column" -msgstr "" - -#: superset/forms.py:406 +#: superset/forms.py:439 msgid "" "The time column for the visualization. Note that you can define arbitrary" " expression that return a DATETIME column in the table editor. Also note " "that the filter below is applied against this column or expression" msgstr "" -#: superset/forms.py:414 +#: superset/forms.py:447 msgid "Resample Rule" msgstr "" -#: superset/forms.py:417 +#: superset/forms.py:450 msgid "1T" msgstr "" -#: superset/forms.py:418 +#: superset/forms.py:451 msgid "1H" msgstr "" -#: superset/forms.py:419 +#: superset/forms.py:452 msgid "1D" msgstr "" -#: superset/forms.py:420 +#: superset/forms.py:453 msgid "7D" msgstr "" -#: superset/forms.py:421 +#: superset/forms.py:454 msgid "1M" msgstr "" -#: superset/forms.py:422 +#: superset/forms.py:455 msgid "1AS" msgstr "" -#: superset/forms.py:424 +#: superset/forms.py:457 msgid "Pandas resample rule" msgstr "" -#: superset/forms.py:427 +#: superset/forms.py:460 msgid "Resample How" msgstr "" -#: superset/forms.py:431 superset/forms.py:700 +#: superset/forms.py:464 superset/forms.py:743 msgid "mean" msgstr "" -#: superset/forms.py:432 superset/forms.py:699 +#: superset/forms.py:465 superset/forms.py:742 msgid "sum" msgstr "" -#: superset/forms.py:433 superset/forms.py:703 +#: superset/forms.py:466 superset/forms.py:746 msgid "median" msgstr "" -#: superset/forms.py:435 +#: superset/forms.py:468 msgid "Pandas resample how" msgstr "" -#: superset/forms.py:438 +#: superset/forms.py:471 msgid "Resample Fill Method" msgstr "" -#: superset/forms.py:442 +#: superset/forms.py:475 msgid "ffill" msgstr "" -#: superset/forms.py:443 +#: superset/forms.py:476 msgid "bfill" msgstr "" -#: superset/forms.py:445 +#: superset/forms.py:478 msgid "Pandas resample fill method" msgstr "" -#: superset/forms.py:448 +#: superset/forms.py:481 msgid "Since" msgstr "" -#: superset/forms.py:451 +#: superset/forms.py:484 msgid "1 hour ago" msgstr "" -#: superset/forms.py:452 +#: superset/forms.py:485 msgid "12 hours ago" msgstr "" -#: superset/forms.py:453 superset/forms.py:468 +#: superset/forms.py:486 superset/forms.py:501 msgid "1 day ago" msgstr "" -#: superset/forms.py:454 superset/forms.py:469 +#: superset/forms.py:487 superset/forms.py:502 msgid "7 days ago" msgstr "" -#: superset/forms.py:455 superset/forms.py:470 +#: superset/forms.py:488 superset/forms.py:503 msgid "28 days ago" msgstr "" -#: superset/forms.py:456 superset/forms.py:471 +#: superset/forms.py:489 superset/forms.py:504 msgid "90 days ago" msgstr "" -#: superset/forms.py:457 superset/forms.py:472 +#: superset/forms.py:490 superset/forms.py:505 msgid "1 year ago" msgstr "" -#: superset/forms.py:459 +#: superset/forms.py:492 msgid "" "Timestamp from filter. This supports free form typing and natural " "language as in '1 day ago', '28 days' or '3 years'" msgstr "" -#: superset/forms.py:464 +#: superset/forms.py:497 msgid "Until" msgstr "" -#: superset/forms.py:476 +#: superset/forms.py:509 msgid "Max Bubble Size" msgstr "" -#: superset/forms.py:489 +#: superset/forms.py:522 msgid "Whisker/outlier options" msgstr "" -#: superset/forms.py:491 +#: superset/forms.py:524 msgid "Determines how whiskers and outliers are calculated." msgstr "" -#: superset/forms.py:494 +#: superset/forms.py:527 msgid "Tukey" msgstr "" -#: superset/forms.py:495 +#: superset/forms.py:528 msgid "Min/max (no outliers)" msgstr "" -#: superset/forms.py:496 +#: superset/forms.py:529 msgid "2/98 percentiles" msgstr "" -#: superset/forms.py:497 +#: superset/forms.py:530 msgid "9/91 percentiles" msgstr "" -#: superset/forms.py:501 +#: superset/forms.py:534 msgid "Ratio" msgstr "" -#: superset/forms.py:503 +#: superset/forms.py:536 msgid "Target aspect ratio for treemap tiles." msgstr "" -#: superset/forms.py:506 superset/viz.py:856 superset/viz.py:905 +#: superset/forms.py:539 superset/viz.py:918 superset/viz.py:967 msgid "Number format" msgstr "" -#: superset/forms.py:516 -msgid "" -"D3 format syntax for numbers https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "" - -#: superset/forms.py:521 +#: superset/forms.py:552 msgid "Row limit" msgstr "" -#: superset/forms.py:527 +#: superset/forms.py:558 msgid "Series limit" msgstr "" -#: superset/forms.py:530 +#: superset/forms.py:561 msgid "Limits the number of time series that get displayed" msgstr "" -#: superset/forms.py:534 +#: superset/forms.py:565 +msgid "Sort By" +msgstr "" + +#: superset/forms.py:568 +msgid "Metric used to define the top series" +msgstr "" + +#: superset/forms.py:571 msgid "Rolling" msgstr "" -#: superset/forms.py:537 +#: superset/forms.py:574 msgid "" "Defines a rolling window function to apply, works along with the " "[Periods] text box" msgstr "" -#: superset/forms.py:542 +#: superset/forms.py:579 msgid "Periods" msgstr "" -#: superset/forms.py:544 +#: superset/forms.py:581 msgid "" "Defines the size of the rolling window function, relative to the time " "granularity selected" msgstr "" -#: superset/forms.py:549 superset/viz.py:1192 +#: superset/forms.py:586 superset/viz.py:1329 msgid "Series" msgstr "" -#: superset/forms.py:552 +#: superset/forms.py:589 msgid "" -"Defines the grouping of entities. Each serie is shown as a specific color" -" on the chart and has a legend toggle" +"Defines the grouping of entities. Each series is shown as a specific " +"color on the chart and has a legend toggle" msgstr "" -#: superset/forms.py:558 +#: superset/forms.py:595 msgid "Entity" msgstr "" -#: superset/forms.py:561 +#: superset/forms.py:598 msgid "This define the element to be plotted on the chart" msgstr "" -#: superset/forms.py:564 +#: superset/forms.py:601 msgid "X Axis" msgstr "" -#: superset/forms.py:567 +#: superset/forms.py:604 msgid "Metric assigned to the [X] axis" msgstr "" -#: superset/forms.py:570 +#: superset/forms.py:607 msgid "Y Axis" msgstr "" -#: superset/forms.py:573 +#: superset/forms.py:610 msgid "Metric assigned to the [Y] axis" msgstr "" -#: superset/forms.py:576 +#: superset/forms.py:613 msgid "Bubble Size" msgstr "" -#: superset/forms.py:581 +#: superset/forms.py:618 msgid "URL" msgstr "" -#: superset/forms.py:582 +#: superset/forms.py:619 msgid "" "The URL, this field is templated, so you can integrate {{ width }} and/or" " {{ height }} in your URL string." msgstr "" -#: superset/forms.py:589 +#: superset/forms.py:626 msgid "X Axis Label" msgstr "" -#: superset/forms.py:593 +#: superset/forms.py:630 msgid "Y Axis Label" msgstr "" -#: superset/forms.py:597 +#: superset/forms.py:634 msgid "Custom WHERE clause" msgstr "" -#: superset/forms.py:599 +#: superset/forms.py:636 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/forms.py:606 +#: superset/forms.py:643 msgid "Custom HAVING clause" msgstr "" -#: superset/forms.py:608 +#: superset/forms.py:645 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/forms.py:615 +#: superset/forms.py:652 msgid "Comparison Period Lag" msgstr "" -#: superset/forms.py:616 +#: superset/forms.py:653 msgid "Based on granularity, number of time periods to compare against" msgstr "" -#: superset/forms.py:621 +#: superset/forms.py:658 msgid "Comparison suffix" msgstr "" -#: superset/forms.py:622 +#: superset/forms.py:659 msgid "Suffix to apply after the percentage display" msgstr "" -#: superset/forms.py:625 +#: superset/forms.py:662 msgid "Table Timestamp Format" msgstr "" -#: superset/forms.py:628 +#: superset/forms.py:665 msgid "Timestamp Format" msgstr "" -#: superset/forms.py:631 +#: superset/forms.py:668 msgid "Series Height" msgstr "" -#: superset/forms.py:634 +#: superset/forms.py:671 msgid "Pixel height of each series" msgstr "" -#: superset/forms.py:637 +#: superset/forms.py:674 msgid "X axis format" msgstr "" -#: superset/forms.py:640 superset/forms.py:655 -msgid "" -"D3 format syntax for y axis https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "" - -#: superset/forms.py:645 +#: superset/forms.py:680 msgid "Y axis format" msgstr "" -#: superset/forms.py:660 +#: superset/forms.py:693 msgid "Markup Type" msgstr "" -#: superset/forms.py:662 +#: superset/forms.py:695 msgid "markdown" msgstr "" -#: superset/forms.py:663 +#: superset/forms.py:696 msgid "html" msgstr "" -#: superset/forms.py:666 +#: superset/forms.py:699 msgid "Pick your favorite markup language" msgstr "" -#: superset/forms.py:669 +#: superset/forms.py:702 msgid "Rotation" msgstr "" -#: superset/forms.py:671 +#: superset/forms.py:704 msgid "random" msgstr "" -#: superset/forms.py:672 +#: superset/forms.py:705 msgid "flat" msgstr "" -#: superset/forms.py:673 +#: superset/forms.py:706 msgid "square" msgstr "" -#: superset/forms.py:676 +#: superset/forms.py:709 msgid "Rotation to apply to words in the cloud" msgstr "" -#: superset/forms.py:679 +#: superset/forms.py:712 msgid "Line Style" msgstr "" -#: superset/forms.py:681 +#: superset/forms.py:714 msgid "linear" msgstr "" -#: superset/forms.py:682 +#: superset/forms.py:715 msgid "basis" msgstr "" -#: superset/forms.py:683 +#: superset/forms.py:716 msgid "cardinal" msgstr "" -#: superset/forms.py:684 +#: superset/forms.py:717 msgid "monotone" msgstr "" -#: superset/forms.py:685 +#: superset/forms.py:718 msgid "step-before" msgstr "" -#: superset/forms.py:686 +#: superset/forms.py:719 msgid "step-after" msgstr "" -#: superset/forms.py:689 +#: superset/forms.py:722 msgid "Line interpolation as defined by d3.js" msgstr "" -#: superset/forms.py:692 +#: superset/forms.py:725 +msgid "Label Type" +msgstr "" + +#: superset/forms.py:728 +msgid "Category Name" +msgstr "" + +#: superset/forms.py:729 +msgid "Value" +msgstr "" + +#: superset/forms.py:730 +msgid "Percentage" +msgstr "" + +#: superset/forms.py:732 +msgid "What should be shown on the label?" +msgstr "" + +#: superset/forms.py:735 msgid "Code" msgstr "" -#: superset/forms.py:693 +#: superset/forms.py:736 msgid "Put your code here" msgstr "" -#: superset/forms.py:697 +#: superset/forms.py:740 msgid "Aggregation function" msgstr "" -#: superset/forms.py:702 +#: superset/forms.py:745 msgid "max" msgstr "" -#: superset/forms.py:704 +#: superset/forms.py:747 msgid "stdev" msgstr "" -#: superset/forms.py:705 +#: superset/forms.py:748 msgid "var" msgstr "" -#: superset/forms.py:708 +#: superset/forms.py:751 msgid "" "Aggregate function to apply when pivoting and computing the total rows " "and columns" msgstr "" -#: superset/forms.py:713 +#: superset/forms.py:756 msgid "Font Size From" msgstr "" -#: superset/forms.py:715 +#: superset/forms.py:758 msgid "Font size for the smallest value in the list" msgstr "" -#: superset/forms.py:718 +#: superset/forms.py:761 msgid "Font Size To" msgstr "" -#: superset/forms.py:720 +#: superset/forms.py:763 msgid "Font size for the biggest value in the list" msgstr "" -#: superset/forms.py:723 +#: superset/forms.py:766 msgid "Range Filter" msgstr "" -#: superset/forms.py:725 +#: superset/forms.py:768 msgid "Whether to display the time range interactive selector" msgstr "" -#: superset/forms.py:729 +#: superset/forms.py:772 +msgid "Date Filter" +msgstr "" + +#: superset/forms.py:774 +msgid "Whether to include a time filter" +msgstr "" + +#: superset/forms.py:777 msgid "Data Table" msgstr "" -#: superset/forms.py:731 +#: superset/forms.py:779 msgid "Whether to display the interactive data table" msgstr "" -#: superset/forms.py:734 +#: superset/forms.py:782 msgid "Search Box" msgstr "" -#: superset/forms.py:736 +#: superset/forms.py:784 msgid "Whether to include a client side search box" msgstr "" -#: superset/forms.py:740 +#: superset/forms.py:788 +msgid "Table Filter" +msgstr "" + +#: superset/forms.py:790 +msgid "Whether to apply filter when table cell is clicked" +msgstr "" + +#: superset/forms.py:794 msgid "Show Bubbles" msgstr "" -#: superset/forms.py:742 +#: superset/forms.py:796 msgid "Whether to display bubbles on top of countries" msgstr "" -#: superset/forms.py:746 +#: superset/forms.py:800 msgid "Legend" msgstr "" -#: superset/forms.py:748 +#: superset/forms.py:802 msgid "Whether to display the legend (toggles)" msgstr "" -#: superset/forms.py:751 +#: superset/forms.py:805 msgid "X bounds" msgstr "" -#: superset/forms.py:753 +#: superset/forms.py:807 msgid "Whether to display the min and max values of the X axis" msgstr "" -#: superset/forms.py:757 +#: superset/forms.py:811 msgid "Rich Tooltip" msgstr "" -#: superset/forms.py:759 +#: superset/forms.py:813 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" -#: superset/forms.py:764 +#: superset/forms.py:818 msgid "Y Axis Zero" msgstr "" -#: superset/forms.py:766 +#: superset/forms.py:820 msgid "Force the Y axis to start at 0 instead of the minimum value" msgstr "" -#: superset/forms.py:771 +#: superset/forms.py:825 msgid "Y Log" msgstr "" -#: superset/forms.py:773 +#: superset/forms.py:827 msgid "Use a log scale for the Y axis" msgstr "" -#: superset/forms.py:776 +#: superset/forms.py:830 msgid "X Log" msgstr "" -#: superset/forms.py:778 +#: superset/forms.py:832 msgid "Use a log scale for the X axis" msgstr "" -#: superset/forms.py:781 +#: superset/forms.py:835 msgid "Donut" msgstr "" -#: superset/forms.py:783 +#: superset/forms.py:837 msgid "Do you want a donut or a pie?" msgstr "" -#: superset/forms.py:786 +#: superset/forms.py:840 +msgid "Put labels outside" +msgstr "" + +#: superset/forms.py:842 +msgid "Put the labels outside the pie?" +msgstr "" + +#: superset/forms.py:845 msgid "Contribution" msgstr "" -#: superset/forms.py:788 +#: superset/forms.py:847 msgid "Compute the contribution to the total" msgstr "" -#: superset/forms.py:791 +#: superset/forms.py:850 msgid "Period Ratio" msgstr "" -#: superset/forms.py:794 +#: superset/forms.py:853 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "" -#: superset/forms.py:799 +#: superset/forms.py:858 +msgid "Period Ratio Type" +msgstr "" + +#: superset/forms.py:861 +msgid "factor" +msgstr "" + +#: superset/forms.py:862 +msgid "growth" +msgstr "" + +#: superset/forms.py:863 +msgid "value" +msgstr "" + +#: superset/forms.py:865 +msgid "" +"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " +"is (new-previous)" +msgstr "" + +#: superset/forms.py:870 msgid "Time Shift" msgstr "" -#: superset/forms.py:801 +#: superset/forms.py:872 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/forms.py:808 +#: superset/forms.py:879 msgid "Subheader" msgstr "" -#: superset/forms.py:809 +#: superset/forms.py:880 msgid "Description text that shows up below your Big Number" msgstr "" -#: superset/forms.py:816 +#: superset/forms.py:887 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/forms.py:832 +#: superset/forms.py:904 msgid "Base layer map style" msgstr "" -#: superset/forms.py:835 +#: superset/forms.py:907 msgid "Clustering Radius" msgstr "" -#: superset/forms.py:848 +#: superset/forms.py:920 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/forms.py:854 +#: superset/forms.py:926 msgid "Point Radius" msgstr "" -#: superset/forms.py:857 +#: superset/forms.py:929 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/forms.py:863 +#: superset/forms.py:935 msgid "Point Radius Unit" msgstr "" -#: superset/forms.py:870 +#: superset/forms.py:942 msgid "The unit of measure for the specified point radius" msgstr "" -#: superset/forms.py:873 +#: superset/forms.py:945 msgid "Opacity" msgstr "" -#: superset/forms.py:875 +#: superset/forms.py:947 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/forms.py:880 +#: superset/forms.py:952 msgid "Zoom" msgstr "" -#: superset/forms.py:883 +#: superset/forms.py:955 msgid "Zoom level of the map" msgstr "" -#: superset/forms.py:887 +#: superset/forms.py:959 msgid "Default latitude" msgstr "" -#: superset/forms.py:889 +#: superset/forms.py:961 msgid "Latitude of default viewport" msgstr "" -#: superset/forms.py:893 +#: superset/forms.py:965 msgid "Default longitude" msgstr "" -#: superset/forms.py:895 +#: superset/forms.py:967 msgid "Longitude of default viewport" msgstr "" -#: superset/forms.py:899 +#: superset/forms.py:971 msgid "Live render" msgstr "" -#: superset/forms.py:901 +#: superset/forms.py:973 msgid "Points and clusters will update as viewport is being changed" msgstr "" -#: superset/forms.py:905 +#: superset/forms.py:978 msgid "RGB Color" msgstr "" -#: superset/forms.py:915 +#: superset/forms.py:988 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/forms.py:978 +#: superset/forms.py:1051 msgid "SQL" msgstr "" -#: superset/forms.py:980 +#: superset/forms.py:1053 msgid "This section exposes ways to include snippets of SQL in your query" msgstr "" -#: superset/forms.py:991 +#: superset/forms.py:1064 msgid "Time Grain" msgstr "" -#: superset/forms.py:994 +#: superset/forms.py:1067 msgid "" "The time granularity for the visualization. This applies a date " "transformation to alter your time column and defines a new time " @@ -1058,226 +1196,560 @@ msgid "" "in the Superset source code" msgstr "" -#: superset/forms.py:1027 superset/forms.py:1031 +#: superset/forms.py:1102 superset/forms.py:1106 msgid "Filter 1" msgstr "" -#: superset/forms.py:1036 +#: superset/forms.py:1111 msgid "Super" msgstr "" -#: superset/forms.py:1040 +#: superset/forms.py:1115 msgid "Time" msgstr "" -#: superset/forms.py:1045 +#: superset/forms.py:1120 msgid "Time related form attributes" msgstr "" -#: superset/models.py:409 -msgid "quarter" +#: superset/models.py:1019 +msgid "" +"Datetime column not provided as part table configuration and is required " +"by this type of chart" msgstr "" -#: superset/models.py:410 -msgid "week_ending_saturday" +#: superset/models.py:2138 +msgid "No data was returned." msgstr "" -#: superset/models.py:412 -msgid "week_start_sunday" +#: superset/views.py:342 +msgid "" +"Whether to make this column available as a [Time Granularity] option, " +"column has to be DATETIME or DATETIME-like" msgstr "" -#: superset/models.py:433 -msgid "second" -msgstr "" - -#: superset/models.py:434 -msgid "minute" -msgstr "" - -#: superset/models.py:620 -msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" -msgstr "" - -#: superset/models.py:1328 -msgid "No data was returned." -msgstr "" - -#: superset/views.py:203 -msgid "" -"Whether to make this column available as a [Time Granularity] option, " -"column has to be DATETIME or DATETIME-like" -msgstr "" - -#: superset/views.py:230 superset/views.py:259 +#: superset/views.py:369 superset/views.py:399 msgid "Column" msgstr "" -#: superset/views.py:231 superset/views.py:296 superset/views.py:336 +#: superset/views.py:370 superset/views.py:457 superset/views.py:497 msgid "Verbose Name" msgstr "" -#: superset/views.py:232 superset/views.py:295 superset/views.py:335 -#: superset/views.py:537 superset/views.py:691 +#: superset/views.py:371 superset/views.py:456 superset/views.py:496 +#: superset/views.py:1042 superset/views.py:1266 msgid "Description" msgstr "" -#: superset/views.py:233 superset/views.py:262 +#: superset/views.py:372 superset/views.py:402 msgid "Groupable" msgstr "" -#: superset/views.py:234 superset/views.py:263 +#: superset/views.py:373 superset/views.py:403 msgid "Filterable" msgstr "" -#: superset/views.py:235 superset/views.py:299 superset/views.py:433 -#: superset/views.py:543 +#: superset/views.py:374 superset/views.py:460 superset/views.py:891 +#: superset/views.py:1048 msgid "Table" msgstr "" -#: superset/views.py:236 superset/views.py:264 +#: superset/views.py:375 superset/views.py:404 msgid "Count Distinct" msgstr "" -#: superset/views.py:237 superset/views.py:265 +#: superset/views.py:376 superset/views.py:405 msgid "Sum" msgstr "" -#: superset/views.py:238 superset/views.py:266 +#: superset/views.py:377 superset/views.py:406 msgid "Min" msgstr "" -#: superset/views.py:239 superset/views.py:267 +#: superset/views.py:378 superset/views.py:407 msgid "Max" msgstr "" -#: superset/views.py:240 +#: superset/views.py:379 msgid "Expression" msgstr "" -#: superset/views.py:241 +#: superset/views.py:380 msgid "Is temporal" msgstr "" -#: superset/views.py:242 +#: superset/views.py:381 msgid "Datetime Format" msgstr "" -#: superset/views.py:243 +#: superset/views.py:382 msgid "Database Expression" msgstr "" -#: superset/views.py:260 superset/views.py:297 superset/views.py:337 -#: superset/views.py:568 +#: superset/views.py:400 superset/views.py:458 superset/views.py:498 msgid "Type" msgstr "" -#: superset/views.py:261 superset/views.py:536 +#: superset/views.py:401 superset/views.py:958 superset/views.py:1041 msgid "Datasource" msgstr "" -#: superset/views.py:286 superset/views.py:328 +#: superset/views.py:440 superset/views.py:489 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 " "metric)' are allowed to access this metric" msgstr "" -#: superset/views.py:298 +#: superset/views.py:459 msgid "SQL Expression" msgstr "" -#: superset/views.py:338 superset/views.py:656 +#: superset/views.py:499 superset/views.py:1215 msgid "JSON" msgstr "" -#: superset/views.py:339 +#: superset/views.py:500 msgid "Druid Datasource" msgstr "" -#: superset/views.py:378 superset/views.py:435 -msgid "Database" +#: superset/views.py:545 +msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/views.py:379 -msgid "SQL link" +#: superset/views.py:546 +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 " +"(<~1 minute)" +msgstr "" + +#: superset/views.py:550 +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." +msgstr "" + +#: superset/views.py:554 +msgid "Allow CREATE TABLE AS option in SQL Lab" +msgstr "" + +#: superset/views.py:555 +msgid "" +"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" +" SQL Lab" +msgstr "" + +#: superset/views.py:559 +msgid "" +"When allowing CREATE TABLE AS option in SQL Lab, this option forces the " +"table to be created in this schema" msgstr "" -#: superset/views.py:380 superset/views.py:534 superset/views.py:610 +#: superset/views.py:573 +msgid "Expose in SQL Lab" +msgstr "" + +#: superset/views.py:574 +msgid "Allow CREATE TABLE AS" +msgstr "" + +#: superset/views.py:575 +msgid "Allow DML" +msgstr "" + +#: superset/views.py:576 +msgid "CTAS Schema" +msgstr "" + +#: superset/views.py:577 superset/views.py:893 +msgid "Database" +msgstr "" + +#: superset/views.py:578 superset/views.py:1039 superset/views.py:1143 msgid "Creator" msgstr "" -#: superset/views.py:381 superset/views.py:436 +#: superset/views.py:579 superset/views.py:894 msgid "Last Changed" msgstr "" -#: superset/views.py:382 +#: superset/views.py:580 msgid "SQLAlchemy URI" msgstr "" -#: superset/views.py:383 superset/views.py:442 superset/views.py:533 -#: superset/views.py:697 +#: superset/views.py:581 superset/views.py:899 superset/views.py:1038 +#: superset/views.py:1272 msgid "Cache Timeout" msgstr "" -#: superset/views.py:384 +#: superset/views.py:582 msgid "Extra" msgstr "" -#: superset/views.py:434 -msgid "Changed By" +#: superset/views.py:637 +msgid "CSV File" msgstr "" -#: superset/views.py:437 -msgid "SQL Editor" +#: superset/views.py:637 +msgid "Select a CSV file to be uploaded to a database." msgstr "" -#: superset/views.py:438 superset/views.py:693 -msgid "Is Featured" +#: superset/views.py:638 +msgid "CSV Files Only!" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter used by CSV file (for whitespace use \\s+)." +msgstr "" + +#: superset/views.py:641 +msgid "Header Row" +msgstr "" + +#: superset/views.py:641 +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/views.py:644 +msgid "Column Names" +msgstr "" + +#: superset/views.py:644 +msgid "" +"List of comma-separated column names to use if header row not specified " +"above. Leave empty if header field populated." +msgstr "" + +#: superset/views.py:647 +msgid "Index Column" +msgstr "" + +#: superset/views.py:647 +msgid "" +"Column to use as the row labels of the dataframe. Leave empty if no index" +" column." +msgstr "" + +#: superset/views.py:650 +msgid "Squeeze" +msgstr "" + +#: superset/views.py:650 +msgid "" +"Parse the data as a series (specify this option if the data contains only" +" one column." +msgstr "" + +#: superset/views.py:652 +msgid "Prefix" +msgstr "" + +#: superset/views.py:652 +msgid "" +"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " +"X1\")." +msgstr "" + +#: superset/views.py:655 +msgid "Mangle Duplicate Columns" +msgstr "" + +#: superset/views.py:655 +msgid "Specify duplicate columns as \"X.0, X.1\"." +msgstr "" + +#: superset/views.py:657 +msgid "Skip Initial Space" +msgstr "" + +#: superset/views.py:657 +msgid "Skip spaces after delimiter." +msgstr "" + +#: superset/views.py:658 +msgid "Skip Rows" +msgstr "" + +#: superset/views.py:658 +msgid "Number of rows to skip at start of file." +msgstr "" + +#: superset/views.py:660 +msgid "Rows to Read" +msgstr "" + +#: superset/views.py:660 +msgid "Number of rows of file to read." +msgstr "" + +#: superset/views.py:662 +msgid "Skip Blank Lines" +msgstr "" + +#: superset/views.py:662 +msgid "Skip blank lines rather than interpreting them as NaN values." +msgstr "" + +#: superset/views.py:664 +msgid "Parse Dates" +msgstr "" + +#: superset/views.py:664 +msgid "Parse date values." +msgstr "" + +#: superset/views.py:665 +msgid "Infer Datetime Format" +msgstr "" + +#: superset/views.py:665 +msgid "Use Pandas to interpret the datetime format automatically." +msgstr "" + +#: superset/views.py:667 +msgid "Day First" +msgstr "" + +#: superset/views.py:667 +msgid "Use DD/MM (European/International) date format." +msgstr "" + +#: superset/views.py:668 +msgid "Thousands Separator" +msgstr "" + +#: superset/views.py:668 +msgid "Separator for values in thousands." +msgstr "" + +#: superset/views.py:670 +msgid "Decimal Character" +msgstr "" + +#: superset/views.py:670 +msgid "Character to interpret as decimal point." +msgstr "" + +#: superset/views.py:672 +msgid "Quote Character" +msgstr "" + +#: superset/views.py:672 +msgid "Character used to denote the start and end of a quoted item." +msgstr "" + +#: superset/views.py:675 +msgid "Escape Character" +msgstr "" + +#: superset/views.py:675 +msgid "Character used to escape a quoted item." +msgstr "" + +#: superset/views.py:677 +msgid "Comment Character" +msgstr "" + +#: superset/views.py:677 +msgid "Character used to denote the start of a comment." +msgstr "" + +#: superset/views.py:679 +msgid "Encoding" +msgstr "" + +#: superset/views.py:679 +msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." +msgstr "" + +#: superset/views.py:681 +msgid "Error On Bad Lines" +msgstr "" + +#: superset/views.py:681 +msgid "" +"Error on bad lines (e.g. a line with too many commas). If false these bad" +" lines will instead be dropped from the resulting dataframe." +msgstr "" + +#: superset/views.py:687 +msgid "Table Name" +msgstr "" + +#: superset/views.py:687 +msgid "Name of table to be created from csv data." +msgstr "" + +#: superset/views.py:689 +msgid "Database URI" +msgstr "" + +#: superset/views.py:689 +msgid "URI of database in which to add above table." msgstr "" -#: superset/views.py:439 +#: superset/views.py:691 superset/views.py:896 msgid "Schema" msgstr "" -#: superset/views.py:440 superset/views.py:695 +#: superset/views.py:691 +msgid "Specify a schema (if database flavour supports this)." +msgstr "" + +#: superset/views.py:693 +msgid "Table Exists" +msgstr "" + +#: superset/views.py:693 +msgid "" +"If table exists do one of the following: Fail (do nothing), Replace (drop" +" and recreate table) or Append (insert data)." +msgstr "" + +#: superset/views.py:696 +msgid "Fail" +msgstr "" + +#: superset/views.py:696 +msgid "Replace" +msgstr "" + +#: superset/views.py:696 +msgid "Append" +msgstr "" + +#: superset/views.py:698 +msgid "Dataframe Index" +msgstr "" + +#: superset/views.py:698 +msgid "Write dataframe index as a column." +msgstr "" + +#: superset/views.py:699 +msgid "Column Label(s)" +msgstr "" + +#: superset/views.py:699 +msgid "" +"Column label for index column(s). If None is given and Dataframe Index is" +" True, Index Names are used." +msgstr "" + +#: superset/views.py:702 +msgid "Chunksize" +msgstr "" + +#: superset/views.py:702 +msgid "" +"If not None, rows will be written in batches of this size at a time. If " +"None, all rows will be written at once." +msgstr "" + +#: superset/views.py:709 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views.py:792 +msgid "CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"" +msgstr "" + +#: superset/views.py:875 superset/views.py:1257 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: superset/views.py:876 +msgid "Name of the table that exists in the source database" +msgstr "" + +#: superset/views.py:878 +msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" +msgstr "" + +#: superset/views.py:884 +msgid "" +"This fields acts a Superset view, meaning that Superset will run a query " +"against this string as a subquery." +msgstr "" + +#: superset/views.py:892 +msgid "Changed By" +msgstr "" + +#: superset/views.py:895 superset/views.py:1268 +msgid "Is Featured" +msgstr "" + +#: superset/views.py:897 superset/views.py:1270 msgid "Default Endpoint" msgstr "" -#: superset/views.py:441 +#: superset/views.py:898 msgid "Offset" msgstr "" -#: superset/views.py:482 superset/views.py:690 +#: superset/views.py:927 +msgid "" +"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." +msgstr "" + +#: superset/views.py:955 superset/views.py:1212 +msgid "User" +msgstr "" + +#: superset/views.py:956 +msgid "User Roles" +msgstr "" + +#: superset/views.py:957 +msgid "Database URL" +msgstr "" + +#: superset/views.py:959 +msgid "Roles to grant" +msgstr "" + +#: superset/views.py:960 +msgid "Created On" +msgstr "" + +#: superset/views.py:982 superset/views.py:1265 msgid "Cluster" msgstr "" -#: superset/views.py:483 +#: superset/views.py:983 msgid "Coordinator Host" msgstr "" -#: superset/views.py:484 +#: superset/views.py:984 msgid "Coordinator Port" msgstr "" -#: superset/views.py:485 +#: superset/views.py:985 msgid "Coordinator Endpoint" msgstr "" -#: superset/views.py:486 +#: superset/views.py:986 msgid "Broker Host" msgstr "" -#: superset/views.py:487 +#: superset/views.py:987 msgid "Broker Port" msgstr "" -#: superset/views.py:488 +#: superset/views.py:988 msgid "Broker Endpoint" msgstr "" -#: superset/views.py:522 +#: superset/views.py:1027 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -1285,524 +1757,469 @@ msgid "" "parameters." msgstr "" -#: superset/views.py:527 +#: superset/views.py:1032 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/templates/superset/welcome.html:26 superset/views.py:535 +#: superset/views.py:1040 msgid "Dashboards" msgstr "" -#: superset/views.py:538 +#: superset/views.py:1043 msgid "Last Modified" msgstr "" -#: superset/views.py:539 superset/views.py:609 +#: superset/views.py:1044 superset/views.py:1142 msgid "Owners" msgstr "" -#: superset/views.py:540 +#: superset/views.py:1045 msgid "Parameters" msgstr "" -#: superset/views.py:541 superset/views.py:569 +#: superset/views.py:1046 superset/views.py:1091 msgid "Slice" msgstr "" -#: superset/views.py:542 +#: superset/views.py:1047 msgid "Name" msgstr "" -#: superset/views.py:544 superset/views.py:570 +#: superset/views.py:1049 msgid "Visualization Type" msgstr "" -#: superset/views.py:586 +#: superset/views.py:1070 +msgid "Click on a {} link to create a Slice" +msgstr "" + +#: superset/views.py:1115 msgid "" "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" msgstr "" -#: superset/views.py:591 +#: superset/views.py:1120 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: superset/views.py:595 +#: superset/views.py:1124 msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/views.py:596 +#: superset/views.py:1125 msgid "" "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." msgstr "" -#: superset/views.py:601 +#: superset/views.py:1130 msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/views.py:605 +#: superset/views.py:1138 msgid "Dashboard" msgstr "" -#: superset/views.py:606 +#: superset/views.py:1139 msgid "Title" msgstr "" -#: superset/views.py:607 +#: superset/views.py:1140 msgid "Slug" msgstr "" -#: superset/views.py:608 +#: superset/views.py:1141 msgid "Slices" msgstr "" -#: superset/views.py:611 +#: superset/views.py:1144 msgid "Modified" msgstr "" -#: superset/views.py:612 +#: superset/views.py:1145 msgid "Position JSON" msgstr "" -#: superset/views.py:613 +#: superset/views.py:1146 msgid "CSS" msgstr "" -#: superset/views.py:614 +#: superset/views.py:1147 msgid "JSON Metadata" msgstr "" -#: superset/views.py:615 +#: superset/views.py:1148 msgid "Underlying Tables" msgstr "" -#: superset/views.py:653 -msgid "User" -msgstr "" - -#: superset/views.py:654 +#: superset/views.py:1213 msgid "Action" msgstr "" -#: superset/views.py:655 +#: superset/views.py:1214 msgid "dttm" msgstr "" -#: superset/views.py:683 -msgid "Timezone offset (in hours) for this datasource" -msgstr "" - -#: superset/views.py:689 +#: superset/views.py:1264 msgid "Data Source" msgstr "" -#: superset/views.py:692 +#: superset/views.py:1267 msgid "Owner" msgstr "" -#: superset/views.py:694 +#: superset/views.py:1269 msgid "Is Hidden" msgstr "" -#: superset/views.py:696 +#: superset/views.py:1271 msgid "Time Offset" msgstr "" -#: superset/views.py:1176 -msgid "This view requires the `all_datasource_access` permission" -msgstr "" - -#: superset/views.py:1249 -msgid "Refresh Druid Metadata" -msgstr "" - -#: superset/viz.py:367 +#: superset/viz.py:408 msgid "Table View" msgstr "" -#: superset/viz.py:370 +#: superset/viz.py:411 msgid "GROUP BY" msgstr "" -#: superset/viz.py:371 +#: superset/viz.py:412 msgid "Use this section if you want a query that aggregates" msgstr "" -#: superset/viz.py:374 +#: superset/viz.py:415 msgid "NOT GROUPED BY" msgstr "" -#: superset/viz.py:375 +#: superset/viz.py:416 msgid "Use this section if you want to query atomic rows" msgstr "" -#: superset/viz.py:378 +#: superset/viz.py:419 msgid "Options" msgstr "" -#: superset/viz.py:429 +#: superset/viz.py:472 msgid "Pivot Table" msgstr "" -#: superset/viz.py:491 +#: superset/viz.py:534 msgid "Markup" msgstr "" -#: superset/viz.py:519 +#: superset/viz.py:558 +msgid "Separator" +msgstr "" + +#: superset/viz.py:581 msgid "Word Cloud" msgstr "" -#: superset/viz.py:551 +#: superset/viz.py:613 msgid "Treemap" msgstr "" -#: superset/viz.py:561 superset/viz.py:676 superset/viz.py:783 superset/viz.py:948 -#: superset/viz.py:1093 superset/viz.py:1122 superset/viz.py:1177 -#: superset/viz.py:1682 +#: superset/viz.py:623 superset/viz.py:738 superset/viz.py:845 +#: superset/viz.py:1011 superset/viz.py:1163 superset/viz.py:1192 +#: superset/viz.py:1314 superset/viz.py:1825 msgid "Chart Options" msgstr "" -#: superset/viz.py:595 -msgid "Calender Heatmap" +#: superset/viz.py:657 +msgid "Calendar Heatmap" msgstr "" -#: superset/viz.py:666 +#: superset/viz.py:728 msgid "Box Plot" msgstr "" -#: superset/viz.py:773 +#: superset/viz.py:835 msgid "Bubble Chart" msgstr "" -#: superset/viz.py:842 +#: superset/viz.py:904 msgid "Big Number with Trendline" msgstr "" -#: superset/viz.py:892 +#: superset/viz.py:954 msgid "Big Number" msgstr "" -#: superset/viz.py:938 +#: superset/viz.py:1000 msgid "Time Series - Line Chart" msgstr "" -#: superset/viz.py:958 +#: superset/viz.py:1022 msgid "Advanced Analytics" msgstr "" -#: superset/viz.py:959 +#: superset/viz.py:1023 msgid "" "This section contains options that allow for advanced analytical post " "processing of query results" msgstr "" -#: superset/viz.py:1091 +#: superset/viz.py:1161 msgid "Time Series - Bar Chart" msgstr "" -#: superset/viz.py:1111 +#: superset/viz.py:1181 msgid "Time Series - Percent Change" msgstr "" -#: superset/viz.py:1119 +#: superset/viz.py:1189 msgid "Time Series - Stacked" msgstr "" -#: superset/viz.py:1138 +#: superset/viz.py:1208 msgid "Distribution - NVD3 - Pie Chart" msgstr "" -#: superset/viz.py:1174 +#: superset/viz.py:1246 +msgid "Histogram" +msgstr "" + +#: superset/viz.py:1255 +msgid "Histogram Options" +msgstr "" + +#: superset/viz.py:1263 +msgid "Numeric Column" +msgstr "" + +#: superset/viz.py:1264 +msgid "Select the numeric column to draw the histogram" +msgstr "" + +#: superset/viz.py:1267 +msgid "No of Bins" +msgstr "" + +#: superset/viz.py:1268 +msgid "Select number of bins for the histogram" +msgstr "" + +#: superset/viz.py:1311 msgid "Distribution - Bar Chart" msgstr "" -#: superset/viz.py:1195 +#: superset/viz.py:1332 msgid "Breakdowns" msgstr "" -#: superset/viz.py:1196 +#: superset/viz.py:1333 msgid "Defines how each series is broken down" msgstr "" -#: superset/viz.py:1261 +#: superset/viz.py:1398 msgid "Sunburst" msgstr "" -#: superset/viz.py:1276 +#: superset/viz.py:1413 msgid "Primary Metric" msgstr "" -#: superset/viz.py:1277 +#: superset/viz.py:1414 msgid "The primary metric is used to define the arc segment sizes" msgstr "" -#: superset/viz.py:1282 +#: superset/viz.py:1419 msgid "Secondary Metric" msgstr "" -#: superset/viz.py:1283 +#: superset/viz.py:1420 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" msgstr "" -#: superset/viz.py:1289 +#: superset/viz.py:1426 msgid "Hierarchy" msgstr "" -#: superset/viz.py:1290 +#: superset/viz.py:1427 msgid "This defines the level of the hierarchy" msgstr "" -#: superset/viz.py:1327 +#: superset/viz.py:1463 msgid "Sankey" msgstr "" -#: superset/viz.py:1340 superset/viz.py:1410 +#: superset/viz.py:1476 superset/viz.py:1546 msgid "Source / Target" msgstr "" -#: superset/viz.py:1341 superset/viz.py:1411 +#: superset/viz.py:1477 superset/viz.py:1547 msgid "Choose a source and a target" msgstr "" -#: superset/viz.py:1391 +#: superset/viz.py:1527 msgid "Directed Force Layout" msgstr "" -#: superset/viz.py:1402 +#: superset/viz.py:1538 msgid "Force Layout" msgstr "" -#: superset/viz.py:1433 +#: superset/viz.py:1569 msgid "World Map" msgstr "" -#: superset/viz.py:1444 +#: superset/viz.py:1580 msgid "Bubbles" msgstr "" -#: superset/viz.py:1453 +#: superset/viz.py:1589 msgid "Country Field" msgstr "" -#: superset/viz.py:1454 +#: superset/viz.py:1590 msgid "3 letter code of the country" msgstr "" -#: superset/viz.py:1457 +#: superset/viz.py:1593 msgid "Metric for color" msgstr "" -#: superset/viz.py:1458 +#: superset/viz.py:1594 msgid "Metric that defines the color of the country" msgstr "" -#: superset/viz.py:1461 +#: superset/viz.py:1597 msgid "Bubble size" msgstr "" -#: superset/viz.py:1462 +#: superset/viz.py:1598 msgid "Metric that defines the size of the bubble" msgstr "" -#: superset/templates/superset/explore.html:147 superset/viz.py:1507 +#: superset/viz.py:1648 msgid "Filters" msgstr "" -#: superset/viz.py:1519 +#: superset/viz.py:1661 msgid "Filter fields" msgstr "" -#: superset/viz.py:1520 +#: superset/viz.py:1662 msgid "The fields you want to filter on" msgstr "" -#: superset/viz.py:1555 +#: superset/viz.py:1698 msgid "iFrame" msgstr "" -#: superset/viz.py:1573 +#: superset/viz.py:1716 msgid "Parallel Coordinates" msgstr "" -#: superset/viz.py:1609 +#: superset/viz.py:1752 msgid "Heatmap" msgstr "" -#: superset/viz.py:1622 +#: superset/viz.py:1765 msgid "Heatmap Options" msgstr "" -#: superset/viz.py:1677 +#: superset/viz.py:1820 msgid "Horizon Charts" msgstr "" -#: superset/viz.py:1693 +#: superset/viz.py:1836 msgid "Mapbox" msgstr "" -#: superset/viz.py:1707 +#: superset/viz.py:1850 msgid "Points" msgstr "" -#: superset/viz.py:1713 +#: superset/viz.py:1856 msgid "Labelling" msgstr "" -#: superset/viz.py:1719 +#: superset/viz.py:1862 msgid "Visual Tweaks" msgstr "" -#: superset/viz.py:1726 +#: superset/viz.py:1869 msgid "Viewport" msgstr "" -#: superset/viz.py:1736 +#: superset/viz.py:1879 msgid "Longitude" msgstr "" -#: superset/viz.py:1737 +#: superset/viz.py:1880 msgid "Column containing longitude data" msgstr "" -#: superset/viz.py:1740 +#: superset/viz.py:1883 msgid "Latitude" msgstr "" -#: superset/viz.py:1741 +#: superset/viz.py:1884 msgid "Column containing latitude data" msgstr "" -#: superset/viz.py:1744 +#: superset/viz.py:1887 msgid "Cluster label aggregator" msgstr "" -#: superset/viz.py:1745 +#: superset/viz.py:1888 msgid "" "Aggregate function applied to the list of points in each cluster to " "produce the cluster label." msgstr "" -#: superset/viz.py:1750 +#: superset/viz.py:1893 msgid "Tooltip" msgstr "" -#: superset/viz.py:1751 +#: superset/viz.py:1894 msgid "Show a tooltip when hovering over points and clusters describing the label" msgstr "" -#: superset/viz.py:1756 +#: superset/viz.py:1899 msgid "" "One or many fields to group by. If grouping, latitude and longitude " "columns must be present." msgstr "" -#: superset/templates/appbuilder/navbar_right.html:36 +#: superset/templates/appbuilder/navbar_right.html:41 msgid "Profile" msgstr "" -#: superset/templates/appbuilder/navbar_right.html:37 +#: superset/templates/appbuilder/navbar_right.html:42 msgid "Logout" msgstr "" -#: superset/templates/appbuilder/navbar_right.html:42 +#: superset/templates/appbuilder/navbar_right.html:47 msgid "Login" msgstr "" -#: superset/templates/superset/explore.html:34 -#: superset/templates/superset/explore.html:241 -msgid "Query" -msgstr "" - -#: superset/templates/superset/explore.html:43 -#: superset/templates/superset/explore.html:306 -msgid "Save" -msgstr "" - -#: superset/templates/superset/explore.html:72 -msgid "Force refresh" -msgstr "" - -#: superset/templates/superset/explore.html:77 -msgid "Short URL" -msgstr "" - -#: superset/templates/superset/explore.html:79 -msgid "Generate an embeddable iframe" +#: superset/templates/superset/request_access.html:2 +msgid "No Access!" msgstr "" -#: superset/templates/superset/explore.html:82 -msgid "Export to .json" +#: superset/templates/superset/request_access.html:7 +#, python-format +msgid "You do not have permissions to access the datasource(s): %(name)s." msgstr "" -#: superset/templates/superset/explore.html:86 -msgid "Export to .csv format" +#: superset/templates/superset/request_access.html:13 +msgid "Request Permissions" msgstr "" -#: superset/templates/superset/explore.html:92 -msgid "Query timer" -msgstr "" - -#: superset/templates/superset/explore.html:94 -msgid "0 sec" -msgstr "" - -#: superset/templates/superset/explore.html:100 -msgid "View database query" -msgstr "" - -#: superset/templates/superset/explore.html:101 -msgid "query" -msgstr "" - -#: superset/templates/superset/explore.html:150 -msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" -msgstr "" - -#: superset/templates/superset/explore.html:168 -msgid "Add filter" -msgstr "" - -#: superset/templates/superset/explore.html:247 -#: superset/templates/superset/explore.html:265 -msgid "Close" -msgstr "" - -#: superset/templates/superset/explore.html:259 -msgid "Datasource Description" -msgstr "" - -#: superset/templates/superset/explore.html:277 -msgid "Save a Slice" -msgstr "" - -#: superset/templates/superset/explore.html:309 -msgid "Save & go to dashboard" -msgstr "" - -#: superset/templates/superset/explore.html:312 +#: superset/templates/superset/request_access.html:16 msgid "Cancel" msgstr "" -#: superset/templates/superset/sql.html:12 -msgid "Run!" -msgstr "" - -#: superset/templates/superset/sql.html:13 -msgid "Create View" -msgstr "" - -#: superset/templates/superset/welcome.html:8 -#: superset/templates/superset/welcome.html:14 -msgid "Welcome!" -msgstr "" - #: superset/templates/superset/models/database/macros.html:4 msgid "Test Connection" msgstr "" diff --git a/superset/translations/es/LC_MESSAGES/messages.mo b/superset/translations/es/LC_MESSAGES/messages.mo index 96bca730b584261edae8f417b2db8c849f0506a3..2647be2284785314f7d661146cfbe698d1acf641 100644 GIT binary patch literal 39307 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 literal 5877 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\n" "Language: es\n" "Language-Team: es \n" @@ -18,165 +18,258 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: superset/forms.py:140 -msgid "Viz" +#: superset/db_engine_specs.py:79 superset/db_engine_specs.py:102 +#: superset/db_engine_specs.py:125 superset/db_engine_specs.py:160 +#: superset/db_engine_specs.py:268 superset/db_engine_specs.py:304 +#: superset/forms.py:436 +msgid "Time Column" +msgstr "" + +#: superset/db_engine_specs.py:80 superset/db_engine_specs.py:126 +#: superset/db_engine_specs.py:161 superset/db_engine_specs.py:269 +msgid "second" +msgstr "" + +#: superset/db_engine_specs.py:81 superset/db_engine_specs.py:129 +#: superset/db_engine_specs.py:163 superset/db_engine_specs.py:271 +#: superset/db_engine_specs.py:305 +msgid "minute" +msgstr "" + +#: superset/db_engine_specs.py:82 superset/db_engine_specs.py:131 +#: superset/db_engine_specs.py:165 superset/db_engine_specs.py:277 +#: superset/db_engine_specs.py:307 superset/forms.py:380 superset/forms.py:394 +msgid "hour" +msgstr "" + +#: superset/db_engine_specs.py:83 superset/db_engine_specs.py:103 +#: superset/db_engine_specs.py:133 superset/db_engine_specs.py:167 +#: superset/db_engine_specs.py:279 superset/db_engine_specs.py:309 +#: superset/forms.py:381 superset/forms.py:395 +msgid "day" +msgstr "" + +#: superset/db_engine_specs.py:84 superset/db_engine_specs.py:104 +#: superset/db_engine_specs.py:134 superset/db_engine_specs.py:169 +#: superset/db_engine_specs.py:281 superset/db_engine_specs.py:311 +#: superset/forms.py:366 superset/forms.py:382 superset/forms.py:396 +msgid "week" +msgstr "" + +#: superset/db_engine_specs.py:85 superset/db_engine_specs.py:106 +#: superset/db_engine_specs.py:136 superset/db_engine_specs.py:171 +#: superset/db_engine_specs.py:283 superset/db_engine_specs.py:313 +#: superset/forms.py:369 superset/forms.py:383 superset/forms.py:397 +msgid "month" +msgstr "" + +#: superset/db_engine_specs.py:86 superset/db_engine_specs.py:138 +#: superset/db_engine_specs.py:173 superset/db_engine_specs.py:285 +#: superset/db_engine_specs.py:315 +msgid "quarter" +msgstr "" + +#: superset/db_engine_specs.py:87 superset/db_engine_specs.py:140 +#: superset/db_engine_specs.py:287 superset/db_engine_specs.py:317 +#: superset/forms.py:384 +msgid "year" +msgstr "" + +#: superset/db_engine_specs.py:175 superset/forms.py:368 +msgid "week_ending_saturday" +msgstr "" + +#: superset/db_engine_specs.py:178 +msgid "week_start_sunday" +msgstr "" + +#: superset/db_engine_specs.py:273 +msgid "5 minute" +msgstr "" + +#: superset/db_engine_specs.py:275 +msgid "half hour" +msgstr "" + +#: superset/forms.py:30 +msgid "D3 format syntax https://github.com/d3/d3-format" msgstr "" #: superset/forms.py:143 -msgid "The type of visualization to display" +msgid "Viz" msgstr "" #: superset/forms.py:146 +msgid "The type of visualization to display" +msgstr "" + +#: superset/forms.py:149 msgid "Metrics" msgstr "" -#: superset/forms.py:149 superset/forms.py:154 +#: superset/forms.py:152 superset/forms.py:157 msgid "One or many metrics to display" msgstr "" -#: superset/forms.py:152 +#: superset/forms.py:155 msgid "Ordering" msgstr "" -#: superset/forms.py:157 superset/views.py:294 superset/views.py:334 +#: superset/forms.py:160 superset/views.py:455 superset/views.py:495 msgid "Metric" msgstr "" -#: superset/forms.py:160 +#: superset/forms.py:163 msgid "Choose the metric" msgstr "" -#: superset/forms.py:163 +#: superset/forms.py:166 msgid "Chart Style" msgstr "" -#: superset/forms.py:165 +#: superset/forms.py:168 msgid "stack" msgstr "" -#: superset/forms.py:166 +#: superset/forms.py:169 msgid "stream" msgstr "" -#: superset/forms.py:167 +#: superset/forms.py:170 msgid "expand" msgstr "" -#: superset/forms.py:173 +#: superset/forms.py:176 msgid "Color Scheme" msgstr "" -#: superset/forms.py:175 +#: superset/forms.py:178 msgid "fire" msgstr "" -#: superset/forms.py:176 +#: superset/forms.py:179 msgid "blue_white_yellow" msgstr "" -#: superset/forms.py:177 +#: superset/forms.py:180 msgid "white_black" msgstr "" -#: superset/forms.py:178 +#: superset/forms.py:181 msgid "black_white" msgstr "" -#: superset/forms.py:184 +#: superset/forms.py:187 msgid "Normalize Across" msgstr "" -#: superset/forms.py:186 +#: superset/forms.py:189 msgid "heatmap" msgstr "" -#: superset/forms.py:187 +#: superset/forms.py:190 msgid "x" msgstr "" -#: superset/forms.py:188 +#: superset/forms.py:191 msgid "y" msgstr "" -#: superset/forms.py:191 +#: superset/forms.py:194 msgid "" "Color will be rendered based on a ratio of the cell against the sum of " "across this criteria" msgstr "" -#: superset/forms.py:197 +#: superset/forms.py:200 msgid "Color Scale" msgstr "" -#: superset/forms.py:199 +#: superset/forms.py:202 msgid "series" msgstr "" -#: superset/forms.py:200 +#: superset/forms.py:203 msgid "overall" msgstr "" -#: superset/forms.py:201 +#: superset/forms.py:204 msgid "change" msgstr "" -#: superset/forms.py:204 +#: superset/forms.py:207 msgid "Defines how the color are attributed." msgstr "" -#: superset/forms.py:207 +#: superset/forms.py:210 msgid "Rendering" msgstr "" -#: superset/forms.py:209 +#: superset/forms.py:212 msgid "pixelated (Sharp)" msgstr "" -#: superset/forms.py:210 +#: superset/forms.py:213 msgid "auto (Smooth)" msgstr "" -#: superset/forms.py:213 +#: superset/forms.py:216 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "" -#: superset/forms.py:218 +#: superset/forms.py:221 msgid "XScale Interval" msgstr "" -#: superset/forms.py:221 +#: superset/forms.py:224 msgid "Number of step to take between ticks when printing the x scale" msgstr "" -#: superset/forms.py:226 +#: superset/forms.py:229 msgid "YScale Interval" msgstr "" -#: superset/forms.py:229 +#: superset/forms.py:232 msgid "Number of step to take between ticks when printing the y scale" msgstr "" -#: superset/forms.py:234 +#: superset/forms.py:237 msgid "Stacked Bars" msgstr "" -#: superset/forms.py:239 +#: superset/forms.py:242 +msgid "Show Markers" +msgstr "" + +#: superset/forms.py:249 +msgid "Bar Values" +msgstr "" + +#: superset/forms.py:254 +msgid "Sort Bars" +msgstr "" + +#: superset/forms.py:256 +msgid "Sort bars by x labels." +msgstr "" + +#: superset/forms.py:259 msgid "Extra Controls" msgstr "" -#: superset/forms.py:241 +#: superset/forms.py:261 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" -#: superset/forms.py:247 +#: superset/forms.py:267 msgid "Reduce X ticks" msgstr "" -#: superset/forms.py:249 +#: superset/forms.py:269 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 " @@ -184,874 +277,919 @@ msgid "" "scroll." msgstr "" -#: superset/forms.py:257 +#: superset/forms.py:277 msgid "Include Series" msgstr "" -#: superset/forms.py:259 +#: superset/forms.py:279 msgid "Include series name as an axis" msgstr "" -#: superset/forms.py:262 +#: superset/forms.py:282 msgid "Color Metric" msgstr "" -#: superset/forms.py:265 +#: superset/forms.py:285 msgid "A metric to use for color" msgstr "" -#: superset/forms.py:268 +#: superset/forms.py:288 msgid "Country Field Type" msgstr "" -#: superset/forms.py:271 +#: superset/forms.py:291 msgid "Full name" msgstr "" -#: superset/forms.py:272 +#: superset/forms.py:292 msgid "code International Olympic Committee (cioc)" msgstr "" -#: superset/forms.py:273 +#: superset/forms.py:293 msgid "code ISO 3166-1 alpha-2 (cca2)" msgstr "" -#: superset/forms.py:274 +#: superset/forms.py:294 msgid "code ISO 3166-1 alpha-3 (cca3)" msgstr "" -#: superset/forms.py:276 +#: superset/forms.py:296 msgid "" "The country code standard that Superset should expect to find in the " "[country] column" msgstr "" -#: superset/forms.py:281 +#: superset/forms.py:301 msgid "Group by" msgstr "" -#: superset/forms.py:283 +#: superset/forms.py:303 msgid "One or many fields to group by" msgstr "" -#: superset/forms.py:286 superset/forms.py:291 +#: superset/forms.py:306 superset/forms.py:311 msgid "Columns" msgstr "" -#: superset/forms.py:288 +#: superset/forms.py:308 msgid "One or many fields to pivot as columns" msgstr "" -#: superset/forms.py:293 superset/forms.py:298 superset/forms.py:303 +#: superset/forms.py:313 superset/forms.py:319 superset/forms.py:325 msgid "Columns to display" msgstr "" -#: superset/forms.py:296 +#: superset/forms.py:316 msgid "X" msgstr "" -#: superset/forms.py:301 +#: superset/forms.py:322 msgid "Y" msgstr "" -#: superset/forms.py:306 +#: superset/forms.py:328 msgid "Origin" msgstr "" -#: superset/forms.py:308 +#: superset/forms.py:330 msgid "default" msgstr "" -#: superset/forms.py:309 superset/forms.py:467 +#: superset/forms.py:331 superset/forms.py:500 msgid "now" msgstr "" -#: superset/forms.py:312 +#: superset/forms.py:334 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "'now', 'sunday' or '1970-01-01'" msgstr "" -#: superset/forms.py:317 +#: superset/forms.py:339 msgid "Bottom Margin" msgstr "" -#: superset/forms.py:320 +#: superset/forms.py:342 msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/forms.py:325 +#: superset/forms.py:347 +msgid "Page Length" +msgstr "" + +#: superset/forms.py:350 +msgid "Number of rows per page, 0 means no pagination" +msgstr "" + +#: superset/forms.py:354 msgid "Time Granularity" msgstr "" -#: superset/forms.py:328 +#: superset/forms.py:357 msgid "all" msgstr "" -#: superset/forms.py:329 +#: superset/forms.py:358 msgid "5 seconds" msgstr "" -#: superset/forms.py:330 +#: superset/forms.py:359 msgid "30 seconds" msgstr "" -#: superset/forms.py:331 +#: superset/forms.py:360 msgid "1 minute" msgstr "" -#: superset/forms.py:332 +#: superset/forms.py:361 msgid "5 minutes" msgstr "" -#: superset/forms.py:333 +#: superset/forms.py:362 msgid "1 hour" msgstr "" -#: superset/forms.py:334 +#: superset/forms.py:363 msgid "6 hour" msgstr "" -#: superset/forms.py:335 +#: superset/forms.py:364 msgid "1 day" msgstr "" -#: superset/forms.py:336 +#: superset/forms.py:365 msgid "7 days" msgstr "" -#: superset/forms.py:338 +#: superset/forms.py:367 +msgid "week_starting_sunday" +msgstr "" + +#: superset/forms.py:371 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/forms.py:344 +#: superset/forms.py:377 msgid "Domain" msgstr "" -#: superset/forms.py:347 superset/forms.py:361 superset/models.py:417 -#: superset/models.py:435 -msgid "hour" -msgstr "" - -#: superset/forms.py:348 superset/forms.py:362 superset/models.py:419 -#: superset/models.py:427 superset/models.py:436 -msgid "day" -msgstr "" - -#: superset/forms.py:349 superset/forms.py:363 superset/models.py:407 -#: superset/models.py:420 superset/models.py:428 superset/models.py:437 -msgid "week" -msgstr "" - -#: superset/forms.py:350 superset/forms.py:364 superset/models.py:408 -#: superset/models.py:422 superset/models.py:429 superset/models.py:438 -msgid "month" -msgstr "" - -#: superset/forms.py:351 superset/models.py:439 -msgid "year" -msgstr "" - -#: superset/forms.py:353 +#: superset/forms.py:386 msgid "The time unit used for the grouping of blocks" msgstr "" -#: superset/forms.py:357 +#: superset/forms.py:390 msgid "Subdomain" msgstr "" -#: superset/forms.py:360 superset/forms.py:701 +#: superset/forms.py:393 superset/forms.py:744 msgid "min" msgstr "" -#: superset/forms.py:366 +#: superset/forms.py:399 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/forms.py:371 +#: superset/forms.py:404 msgid "Link Length" msgstr "" -#: superset/forms.py:383 +#: superset/forms.py:416 msgid "Link length in the force layout" msgstr "" -#: superset/forms.py:386 +#: superset/forms.py:419 msgid "Charge" msgstr "" -#: superset/forms.py:400 +#: superset/forms.py:433 msgid "Charge in the force layout" msgstr "" -#: superset/forms.py:403 superset/models.py:406 superset/models.py:416 -#: superset/models.py:426 superset/models.py:432 -msgid "Time Column" -msgstr "" - -#: superset/forms.py:406 +#: superset/forms.py:439 msgid "" "The time column for the visualization. Note that you can define arbitrary" " expression that return a DATETIME column in the table editor. Also note " "that the filter below is applied against this column or expression" msgstr "" -#: superset/forms.py:414 +#: superset/forms.py:447 msgid "Resample Rule" msgstr "" -#: superset/forms.py:417 +#: superset/forms.py:450 msgid "1T" msgstr "" -#: superset/forms.py:418 +#: superset/forms.py:451 msgid "1H" msgstr "" -#: superset/forms.py:419 +#: superset/forms.py:452 msgid "1D" msgstr "" -#: superset/forms.py:420 +#: superset/forms.py:453 msgid "7D" msgstr "" -#: superset/forms.py:421 +#: superset/forms.py:454 msgid "1M" msgstr "" -#: superset/forms.py:422 +#: superset/forms.py:455 msgid "1AS" msgstr "" -#: superset/forms.py:424 +#: superset/forms.py:457 msgid "Pandas resample rule" msgstr "" -#: superset/forms.py:427 +#: superset/forms.py:460 msgid "Resample How" msgstr "" -#: superset/forms.py:431 superset/forms.py:700 +#: superset/forms.py:464 superset/forms.py:743 msgid "mean" msgstr "" -#: superset/forms.py:432 superset/forms.py:699 +#: superset/forms.py:465 superset/forms.py:742 msgid "sum" msgstr "" -#: superset/forms.py:433 superset/forms.py:703 +#: superset/forms.py:466 superset/forms.py:746 msgid "median" msgstr "" -#: superset/forms.py:435 +#: superset/forms.py:468 msgid "Pandas resample how" msgstr "" -#: superset/forms.py:438 +#: superset/forms.py:471 msgid "Resample Fill Method" msgstr "" -#: superset/forms.py:442 +#: superset/forms.py:475 msgid "ffill" msgstr "" -#: superset/forms.py:443 +#: superset/forms.py:476 msgid "bfill" msgstr "" -#: superset/forms.py:445 +#: superset/forms.py:478 msgid "Pandas resample fill method" msgstr "" -#: superset/forms.py:448 +#: superset/forms.py:481 msgid "Since" msgstr "" -#: superset/forms.py:451 +#: superset/forms.py:484 msgid "1 hour ago" msgstr "" -#: superset/forms.py:452 +#: superset/forms.py:485 msgid "12 hours ago" msgstr "" -#: superset/forms.py:453 superset/forms.py:468 +#: superset/forms.py:486 superset/forms.py:501 msgid "1 day ago" msgstr "" -#: superset/forms.py:454 superset/forms.py:469 +#: superset/forms.py:487 superset/forms.py:502 msgid "7 days ago" msgstr "" -#: superset/forms.py:455 superset/forms.py:470 +#: superset/forms.py:488 superset/forms.py:503 msgid "28 days ago" msgstr "" -#: superset/forms.py:456 superset/forms.py:471 +#: superset/forms.py:489 superset/forms.py:504 msgid "90 days ago" msgstr "" -#: superset/forms.py:457 superset/forms.py:472 +#: superset/forms.py:490 superset/forms.py:505 msgid "1 year ago" msgstr "" -#: superset/forms.py:459 +#: superset/forms.py:492 msgid "" "Timestamp from filter. This supports free form typing and natural " "language as in '1 day ago', '28 days' or '3 years'" msgstr "" -#: superset/forms.py:464 +#: superset/forms.py:497 msgid "Until" msgstr "" -#: superset/forms.py:476 +#: superset/forms.py:509 msgid "Max Bubble Size" msgstr "" -#: superset/forms.py:489 +#: superset/forms.py:522 msgid "Whisker/outlier options" msgstr "" -#: superset/forms.py:491 +#: superset/forms.py:524 msgid "Determines how whiskers and outliers are calculated." msgstr "" -#: superset/forms.py:494 +#: superset/forms.py:527 msgid "Tukey" msgstr "" -#: superset/forms.py:495 +#: superset/forms.py:528 msgid "Min/max (no outliers)" msgstr "" -#: superset/forms.py:496 +#: superset/forms.py:529 msgid "2/98 percentiles" msgstr "" -#: superset/forms.py:497 +#: superset/forms.py:530 msgid "9/91 percentiles" msgstr "" -#: superset/forms.py:501 +#: superset/forms.py:534 msgid "Ratio" msgstr "" -#: superset/forms.py:503 +#: superset/forms.py:536 msgid "Target aspect ratio for treemap tiles." msgstr "" -#: superset/forms.py:506 superset/viz.py:856 superset/viz.py:905 +#: superset/forms.py:539 superset/viz.py:918 superset/viz.py:967 msgid "Number format" msgstr "" -#: superset/forms.py:516 -msgid "" -"D3 format syntax for numbers https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "" - -#: superset/forms.py:521 +#: superset/forms.py:552 msgid "Row limit" msgstr "" -#: superset/forms.py:527 +#: superset/forms.py:558 msgid "Series limit" msgstr "" -#: superset/forms.py:530 +#: superset/forms.py:561 msgid "Limits the number of time series that get displayed" msgstr "" -#: superset/forms.py:534 +#: superset/forms.py:565 +msgid "Sort By" +msgstr "" + +#: superset/forms.py:568 +msgid "Metric used to define the top series" +msgstr "" + +#: superset/forms.py:571 msgid "Rolling" msgstr "" -#: superset/forms.py:537 +#: superset/forms.py:574 msgid "" "Defines a rolling window function to apply, works along with the " "[Periods] text box" msgstr "" -#: superset/forms.py:542 +#: superset/forms.py:579 msgid "Periods" msgstr "" -#: superset/forms.py:544 +#: superset/forms.py:581 msgid "" "Defines the size of the rolling window function, relative to the time " "granularity selected" msgstr "" -#: superset/forms.py:549 superset/viz.py:1192 +#: superset/forms.py:586 superset/viz.py:1329 msgid "Series" msgstr "" -#: superset/forms.py:552 +#: superset/forms.py:589 msgid "" -"Defines the grouping of entities. Each serie is shown as a specific color" -" on the chart and has a legend toggle" +"Defines the grouping of entities. Each series is shown as a specific " +"color on the chart and has a legend toggle" msgstr "" -#: superset/forms.py:558 +#: superset/forms.py:595 msgid "Entity" msgstr "" -#: superset/forms.py:561 +#: superset/forms.py:598 msgid "This define the element to be plotted on the chart" msgstr "" -#: superset/forms.py:564 +#: superset/forms.py:601 msgid "X Axis" msgstr "" -#: superset/forms.py:567 +#: superset/forms.py:604 msgid "Metric assigned to the [X] axis" msgstr "" -#: superset/forms.py:570 +#: superset/forms.py:607 msgid "Y Axis" msgstr "" -#: superset/forms.py:573 +#: superset/forms.py:610 msgid "Metric assigned to the [Y] axis" msgstr "" -#: superset/forms.py:576 +#: superset/forms.py:613 msgid "Bubble Size" msgstr "" -#: superset/forms.py:581 +#: superset/forms.py:618 msgid "URL" msgstr "" -#: superset/forms.py:582 +#: superset/forms.py:619 msgid "" "The URL, this field is templated, so you can integrate {{ width }} and/or" " {{ height }} in your URL string." msgstr "" -#: superset/forms.py:589 +#: superset/forms.py:626 msgid "X Axis Label" msgstr "" -#: superset/forms.py:593 +#: superset/forms.py:630 msgid "Y Axis Label" msgstr "" -#: superset/forms.py:597 +#: superset/forms.py:634 msgid "Custom WHERE clause" msgstr "" -#: superset/forms.py:599 +#: superset/forms.py:636 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/forms.py:606 +#: superset/forms.py:643 msgid "Custom HAVING clause" msgstr "" -#: superset/forms.py:608 +#: superset/forms.py:645 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/forms.py:615 +#: superset/forms.py:652 msgid "Comparison Period Lag" msgstr "" -#: superset/forms.py:616 +#: superset/forms.py:653 msgid "Based on granularity, number of time periods to compare against" msgstr "" -#: superset/forms.py:621 +#: superset/forms.py:658 msgid "Comparison suffix" msgstr "" -#: superset/forms.py:622 +#: superset/forms.py:659 msgid "Suffix to apply after the percentage display" msgstr "" -#: superset/forms.py:625 +#: superset/forms.py:662 msgid "Table Timestamp Format" msgstr "" -#: superset/forms.py:628 +#: superset/forms.py:665 msgid "Timestamp Format" msgstr "" -#: superset/forms.py:631 +#: superset/forms.py:668 msgid "Series Height" msgstr "" -#: superset/forms.py:634 +#: superset/forms.py:671 msgid "Pixel height of each series" msgstr "" -#: superset/forms.py:637 +#: superset/forms.py:674 msgid "X axis format" msgstr "" -#: superset/forms.py:640 superset/forms.py:655 -msgid "" -"D3 format syntax for y axis https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "" - -#: superset/forms.py:645 +#: superset/forms.py:680 msgid "Y axis format" msgstr "" -#: superset/forms.py:660 +#: superset/forms.py:693 msgid "Markup Type" msgstr "" -#: superset/forms.py:662 +#: superset/forms.py:695 msgid "markdown" msgstr "" -#: superset/forms.py:663 +#: superset/forms.py:696 msgid "html" msgstr "" -#: superset/forms.py:666 +#: superset/forms.py:699 msgid "Pick your favorite markup language" msgstr "" -#: superset/forms.py:669 +#: superset/forms.py:702 msgid "Rotation" msgstr "" -#: superset/forms.py:671 +#: superset/forms.py:704 msgid "random" msgstr "" -#: superset/forms.py:672 +#: superset/forms.py:705 msgid "flat" msgstr "" -#: superset/forms.py:673 +#: superset/forms.py:706 msgid "square" msgstr "" -#: superset/forms.py:676 +#: superset/forms.py:709 msgid "Rotation to apply to words in the cloud" msgstr "" -#: superset/forms.py:679 +#: superset/forms.py:712 msgid "Line Style" msgstr "" -#: superset/forms.py:681 +#: superset/forms.py:714 msgid "linear" msgstr "" -#: superset/forms.py:682 +#: superset/forms.py:715 msgid "basis" msgstr "" -#: superset/forms.py:683 +#: superset/forms.py:716 msgid "cardinal" msgstr "" -#: superset/forms.py:684 +#: superset/forms.py:717 msgid "monotone" msgstr "" -#: superset/forms.py:685 +#: superset/forms.py:718 msgid "step-before" msgstr "" -#: superset/forms.py:686 +#: superset/forms.py:719 msgid "step-after" msgstr "" -#: superset/forms.py:689 +#: superset/forms.py:722 msgid "Line interpolation as defined by d3.js" msgstr "" -#: superset/forms.py:692 +#: superset/forms.py:725 +msgid "Label Type" +msgstr "" + +#: superset/forms.py:728 +msgid "Category Name" +msgstr "" + +#: superset/forms.py:729 +msgid "Value" +msgstr "" + +#: superset/forms.py:730 +msgid "Percentage" +msgstr "" + +#: superset/forms.py:732 +msgid "What should be shown on the label?" +msgstr "" + +#: superset/forms.py:735 msgid "Code" msgstr "" -#: superset/forms.py:693 +#: superset/forms.py:736 msgid "Put your code here" msgstr "" -#: superset/forms.py:697 +#: superset/forms.py:740 msgid "Aggregation function" msgstr "" -#: superset/forms.py:702 +#: superset/forms.py:745 msgid "max" msgstr "" -#: superset/forms.py:704 +#: superset/forms.py:747 msgid "stdev" msgstr "" -#: superset/forms.py:705 +#: superset/forms.py:748 msgid "var" msgstr "" -#: superset/forms.py:708 +#: superset/forms.py:751 msgid "" "Aggregate function to apply when pivoting and computing the total rows " "and columns" msgstr "" -#: superset/forms.py:713 +#: superset/forms.py:756 msgid "Font Size From" msgstr "" -#: superset/forms.py:715 +#: superset/forms.py:758 msgid "Font size for the smallest value in the list" msgstr "" -#: superset/forms.py:718 +#: superset/forms.py:761 msgid "Font Size To" msgstr "" -#: superset/forms.py:720 +#: superset/forms.py:763 msgid "Font size for the biggest value in the list" msgstr "" -#: superset/forms.py:723 +#: superset/forms.py:766 msgid "Range Filter" msgstr "" -#: superset/forms.py:725 +#: superset/forms.py:768 msgid "Whether to display the time range interactive selector" msgstr "" -#: superset/forms.py:729 +#: superset/forms.py:772 +msgid "Date Filter" +msgstr "" + +#: superset/forms.py:774 +msgid "Whether to include a time filter" +msgstr "" + +#: superset/forms.py:777 msgid "Data Table" msgstr "" -#: superset/forms.py:731 +#: superset/forms.py:779 msgid "Whether to display the interactive data table" msgstr "" -#: superset/forms.py:734 +#: superset/forms.py:782 msgid "Search Box" msgstr "" -#: superset/forms.py:736 +#: superset/forms.py:784 msgid "Whether to include a client side search box" msgstr "" -#: superset/forms.py:740 +#: superset/forms.py:788 +msgid "Table Filter" +msgstr "" + +#: superset/forms.py:790 +msgid "Whether to apply filter when table cell is clicked" +msgstr "" + +#: superset/forms.py:794 msgid "Show Bubbles" msgstr "" -#: superset/forms.py:742 +#: superset/forms.py:796 msgid "Whether to display bubbles on top of countries" msgstr "" -#: superset/forms.py:746 +#: superset/forms.py:800 msgid "Legend" msgstr "" -#: superset/forms.py:748 +#: superset/forms.py:802 msgid "Whether to display the legend (toggles)" msgstr "" -#: superset/forms.py:751 +#: superset/forms.py:805 msgid "X bounds" msgstr "" -#: superset/forms.py:753 +#: superset/forms.py:807 msgid "Whether to display the min and max values of the X axis" msgstr "" -#: superset/forms.py:757 +#: superset/forms.py:811 msgid "Rich Tooltip" msgstr "" -#: superset/forms.py:759 +#: superset/forms.py:813 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" -#: superset/forms.py:764 +#: superset/forms.py:818 msgid "Y Axis Zero" msgstr "" -#: superset/forms.py:766 +#: superset/forms.py:820 msgid "Force the Y axis to start at 0 instead of the minimum value" msgstr "" -#: superset/forms.py:771 +#: superset/forms.py:825 msgid "Y Log" msgstr "" -#: superset/forms.py:773 +#: superset/forms.py:827 msgid "Use a log scale for the Y axis" msgstr "" -#: superset/forms.py:776 +#: superset/forms.py:830 msgid "X Log" msgstr "" -#: superset/forms.py:778 +#: superset/forms.py:832 msgid "Use a log scale for the X axis" msgstr "" -#: superset/forms.py:781 +#: superset/forms.py:835 msgid "Donut" msgstr "" -#: superset/forms.py:783 +#: superset/forms.py:837 msgid "Do you want a donut or a pie?" msgstr "" -#: superset/forms.py:786 +#: superset/forms.py:840 +msgid "Put labels outside" +msgstr "" + +#: superset/forms.py:842 +msgid "Put the labels outside the pie?" +msgstr "" + +#: superset/forms.py:845 msgid "Contribution" msgstr "" -#: superset/forms.py:788 +#: superset/forms.py:847 msgid "Compute the contribution to the total" msgstr "" -#: superset/forms.py:791 +#: superset/forms.py:850 msgid "Period Ratio" msgstr "" -#: superset/forms.py:794 +#: superset/forms.py:853 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "" -#: superset/forms.py:799 +#: superset/forms.py:858 +msgid "Period Ratio Type" +msgstr "" + +#: superset/forms.py:861 +msgid "factor" +msgstr "" + +#: superset/forms.py:862 +msgid "growth" +msgstr "" + +#: superset/forms.py:863 +msgid "value" +msgstr "" + +#: superset/forms.py:865 +msgid "" +"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " +"is (new-previous)" +msgstr "" + +#: superset/forms.py:870 msgid "Time Shift" msgstr "" -#: superset/forms.py:801 +#: superset/forms.py:872 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/forms.py:808 +#: superset/forms.py:879 msgid "Subheader" msgstr "" -#: superset/forms.py:809 +#: superset/forms.py:880 msgid "Description text that shows up below your Big Number" msgstr "" -#: superset/forms.py:816 +#: superset/forms.py:887 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/forms.py:832 +#: superset/forms.py:904 msgid "Base layer map style" msgstr "" -#: superset/forms.py:835 +#: superset/forms.py:907 msgid "Clustering Radius" msgstr "" -#: superset/forms.py:848 +#: superset/forms.py:920 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/forms.py:854 +#: superset/forms.py:926 msgid "Point Radius" msgstr "" -#: superset/forms.py:857 +#: superset/forms.py:929 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/forms.py:863 +#: superset/forms.py:935 msgid "Point Radius Unit" msgstr "" -#: superset/forms.py:870 +#: superset/forms.py:942 msgid "The unit of measure for the specified point radius" msgstr "" -#: superset/forms.py:873 +#: superset/forms.py:945 msgid "Opacity" msgstr "" -#: superset/forms.py:875 +#: superset/forms.py:947 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/forms.py:880 +#: superset/forms.py:952 msgid "Zoom" msgstr "" -#: superset/forms.py:883 +#: superset/forms.py:955 msgid "Zoom level of the map" msgstr "" -#: superset/forms.py:887 +#: superset/forms.py:959 msgid "Default latitude" msgstr "" -#: superset/forms.py:889 +#: superset/forms.py:961 msgid "Latitude of default viewport" msgstr "" -#: superset/forms.py:893 +#: superset/forms.py:965 msgid "Default longitude" msgstr "" -#: superset/forms.py:895 +#: superset/forms.py:967 msgid "Longitude of default viewport" msgstr "" -#: superset/forms.py:899 +#: superset/forms.py:971 msgid "Live render" msgstr "" -#: superset/forms.py:901 +#: superset/forms.py:973 msgid "Points and clusters will update as viewport is being changed" msgstr "" -#: superset/forms.py:905 +#: superset/forms.py:978 msgid "RGB Color" msgstr "" -#: superset/forms.py:915 +#: superset/forms.py:988 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/forms.py:978 +#: superset/forms.py:1051 msgid "SQL" msgstr "" -#: superset/forms.py:980 +#: superset/forms.py:1053 msgid "This section exposes ways to include snippets of SQL in your query" msgstr "" -#: superset/forms.py:991 +#: superset/forms.py:1064 msgid "Time Grain" msgstr "" -#: superset/forms.py:994 +#: superset/forms.py:1067 msgid "" "The time granularity for the visualization. This applies a date " "transformation to alter your time column and defines a new time " @@ -1059,226 +1197,560 @@ msgid "" "in the Superset source code" msgstr "" -#: superset/forms.py:1027 superset/forms.py:1031 +#: superset/forms.py:1102 superset/forms.py:1106 msgid "Filter 1" msgstr "" -#: superset/forms.py:1036 +#: superset/forms.py:1111 msgid "Super" msgstr "" -#: superset/forms.py:1040 +#: superset/forms.py:1115 msgid "Time" msgstr "" -#: superset/forms.py:1045 +#: superset/forms.py:1120 msgid "Time related form attributes" msgstr "" -#: superset/models.py:409 -msgid "quarter" +#: superset/models.py:1019 +msgid "" +"Datetime column not provided as part table configuration and is required " +"by this type of chart" msgstr "" -#: superset/models.py:410 -msgid "week_ending_saturday" +#: superset/models.py:2138 +msgid "No data was returned." msgstr "" -#: superset/models.py:412 -msgid "week_start_sunday" +#: superset/views.py:342 +msgid "" +"Whether to make this column available as a [Time Granularity] option, " +"column has to be DATETIME or DATETIME-like" msgstr "" -#: superset/models.py:433 -msgid "second" -msgstr "" - -#: superset/models.py:434 -msgid "minute" -msgstr "" - -#: superset/models.py:620 -msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" -msgstr "" - -#: superset/models.py:1328 -msgid "No data was returned." -msgstr "" - -#: superset/views.py:203 -msgid "" -"Whether to make this column available as a [Time Granularity] option, " -"column has to be DATETIME or DATETIME-like" -msgstr "" - -#: superset/views.py:230 superset/views.py:259 +#: superset/views.py:369 superset/views.py:399 msgid "Column" msgstr "" -#: superset/views.py:231 superset/views.py:296 superset/views.py:336 +#: superset/views.py:370 superset/views.py:457 superset/views.py:497 msgid "Verbose Name" msgstr "" -#: superset/views.py:232 superset/views.py:295 superset/views.py:335 -#: superset/views.py:537 superset/views.py:691 +#: superset/views.py:371 superset/views.py:456 superset/views.py:496 +#: superset/views.py:1042 superset/views.py:1266 msgid "Description" msgstr "" -#: superset/views.py:233 superset/views.py:262 +#: superset/views.py:372 superset/views.py:402 msgid "Groupable" msgstr "" -#: superset/views.py:234 superset/views.py:263 +#: superset/views.py:373 superset/views.py:403 msgid "Filterable" msgstr "" -#: superset/views.py:235 superset/views.py:299 superset/views.py:433 -#: superset/views.py:543 +#: superset/views.py:374 superset/views.py:460 superset/views.py:891 +#: superset/views.py:1048 msgid "Table" msgstr "" -#: superset/views.py:236 superset/views.py:264 +#: superset/views.py:375 superset/views.py:404 msgid "Count Distinct" msgstr "" -#: superset/views.py:237 superset/views.py:265 +#: superset/views.py:376 superset/views.py:405 msgid "Sum" msgstr "" -#: superset/views.py:238 superset/views.py:266 +#: superset/views.py:377 superset/views.py:406 msgid "Min" msgstr "" -#: superset/views.py:239 superset/views.py:267 +#: superset/views.py:378 superset/views.py:407 msgid "Max" msgstr "" -#: superset/views.py:240 +#: superset/views.py:379 msgid "Expression" msgstr "" -#: superset/views.py:241 +#: superset/views.py:380 msgid "Is temporal" msgstr "" -#: superset/views.py:242 +#: superset/views.py:381 msgid "Datetime Format" msgstr "" -#: superset/views.py:243 +#: superset/views.py:382 msgid "Database Expression" msgstr "" -#: superset/views.py:260 superset/views.py:297 superset/views.py:337 -#: superset/views.py:568 +#: superset/views.py:400 superset/views.py:458 superset/views.py:498 msgid "Type" msgstr "" -#: superset/views.py:261 superset/views.py:536 +#: superset/views.py:401 superset/views.py:958 superset/views.py:1041 msgid "Datasource" msgstr "" -#: superset/views.py:286 superset/views.py:328 +#: superset/views.py:440 superset/views.py:489 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 " "metric)' are allowed to access this metric" msgstr "" -#: superset/views.py:298 +#: superset/views.py:459 msgid "SQL Expression" msgstr "" -#: superset/views.py:338 superset/views.py:656 +#: superset/views.py:499 superset/views.py:1215 msgid "JSON" msgstr "" -#: superset/views.py:339 +#: superset/views.py:500 msgid "Druid Datasource" msgstr "" -#: superset/views.py:378 superset/views.py:435 -msgid "Database" +#: superset/views.py:545 +msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/views.py:379 -msgid "SQL link" +#: superset/views.py:546 +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 " +"(<~1 minute)" +msgstr "" + +#: superset/views.py:550 +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." +msgstr "" + +#: superset/views.py:554 +msgid "Allow CREATE TABLE AS option in SQL Lab" +msgstr "" + +#: superset/views.py:555 +msgid "" +"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" +" SQL Lab" +msgstr "" + +#: superset/views.py:559 +msgid "" +"When allowing CREATE TABLE AS option in SQL Lab, this option forces the " +"table to be created in this schema" +msgstr "" + +#: superset/views.py:573 +msgid "Expose in SQL Lab" +msgstr "" + +#: superset/views.py:574 +msgid "Allow CREATE TABLE AS" +msgstr "" + +#: superset/views.py:575 +msgid "Allow DML" +msgstr "" + +#: superset/views.py:576 +msgid "CTAS Schema" +msgstr "" + +#: superset/views.py:577 superset/views.py:893 +msgid "Database" msgstr "" -#: superset/views.py:380 superset/views.py:534 superset/views.py:610 +#: superset/views.py:578 superset/views.py:1039 superset/views.py:1143 msgid "Creator" msgstr "" -#: superset/views.py:381 superset/views.py:436 +#: superset/views.py:579 superset/views.py:894 msgid "Last Changed" msgstr "" -#: superset/views.py:382 +#: superset/views.py:580 msgid "SQLAlchemy URI" msgstr "" -#: superset/views.py:383 superset/views.py:442 superset/views.py:533 -#: superset/views.py:697 +#: superset/views.py:581 superset/views.py:899 superset/views.py:1038 +#: superset/views.py:1272 msgid "Cache Timeout" msgstr "" -#: superset/views.py:384 +#: superset/views.py:582 msgid "Extra" msgstr "" -#: superset/views.py:434 -msgid "Changed By" +#: superset/views.py:637 +msgid "CSV File" msgstr "" -#: superset/views.py:437 -msgid "SQL Editor" +#: superset/views.py:637 +msgid "Select a CSV file to be uploaded to a database." msgstr "" -#: superset/views.py:438 superset/views.py:693 -msgid "Is Featured" +#: superset/views.py:638 +msgid "CSV Files Only!" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter used by CSV file (for whitespace use \\s+)." +msgstr "" + +#: superset/views.py:641 +msgid "Header Row" +msgstr "" + +#: superset/views.py:641 +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/views.py:644 +msgid "Column Names" +msgstr "" + +#: superset/views.py:644 +msgid "" +"List of comma-separated column names to use if header row not specified " +"above. Leave empty if header field populated." +msgstr "" + +#: superset/views.py:647 +msgid "Index Column" +msgstr "" + +#: superset/views.py:647 +msgid "" +"Column to use as the row labels of the dataframe. Leave empty if no index" +" column." +msgstr "" + +#: superset/views.py:650 +msgid "Squeeze" +msgstr "" + +#: superset/views.py:650 +msgid "" +"Parse the data as a series (specify this option if the data contains only" +" one column." +msgstr "" + +#: superset/views.py:652 +msgid "Prefix" +msgstr "" + +#: superset/views.py:652 +msgid "" +"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " +"X1\")." +msgstr "" + +#: superset/views.py:655 +msgid "Mangle Duplicate Columns" +msgstr "" + +#: superset/views.py:655 +msgid "Specify duplicate columns as \"X.0, X.1\"." +msgstr "" + +#: superset/views.py:657 +msgid "Skip Initial Space" +msgstr "" + +#: superset/views.py:657 +msgid "Skip spaces after delimiter." +msgstr "" + +#: superset/views.py:658 +msgid "Skip Rows" +msgstr "" + +#: superset/views.py:658 +msgid "Number of rows to skip at start of file." +msgstr "" + +#: superset/views.py:660 +msgid "Rows to Read" +msgstr "" + +#: superset/views.py:660 +msgid "Number of rows of file to read." +msgstr "" + +#: superset/views.py:662 +msgid "Skip Blank Lines" +msgstr "" + +#: superset/views.py:662 +msgid "Skip blank lines rather than interpreting them as NaN values." +msgstr "" + +#: superset/views.py:664 +msgid "Parse Dates" +msgstr "" + +#: superset/views.py:664 +msgid "Parse date values." +msgstr "" + +#: superset/views.py:665 +msgid "Infer Datetime Format" +msgstr "" + +#: superset/views.py:665 +msgid "Use Pandas to interpret the datetime format automatically." +msgstr "" + +#: superset/views.py:667 +msgid "Day First" +msgstr "" + +#: superset/views.py:667 +msgid "Use DD/MM (European/International) date format." +msgstr "" + +#: superset/views.py:668 +msgid "Thousands Separator" +msgstr "" + +#: superset/views.py:668 +msgid "Separator for values in thousands." +msgstr "" + +#: superset/views.py:670 +msgid "Decimal Character" +msgstr "" + +#: superset/views.py:670 +msgid "Character to interpret as decimal point." +msgstr "" + +#: superset/views.py:672 +msgid "Quote Character" +msgstr "" + +#: superset/views.py:672 +msgid "Character used to denote the start and end of a quoted item." +msgstr "" + +#: superset/views.py:675 +msgid "Escape Character" +msgstr "" + +#: superset/views.py:675 +msgid "Character used to escape a quoted item." +msgstr "" + +#: superset/views.py:677 +msgid "Comment Character" +msgstr "" + +#: superset/views.py:677 +msgid "Character used to denote the start of a comment." +msgstr "" + +#: superset/views.py:679 +msgid "Encoding" +msgstr "" + +#: superset/views.py:679 +msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." +msgstr "" + +#: superset/views.py:681 +msgid "Error On Bad Lines" +msgstr "" + +#: superset/views.py:681 +msgid "" +"Error on bad lines (e.g. a line with too many commas). If false these bad" +" lines will instead be dropped from the resulting dataframe." +msgstr "" + +#: superset/views.py:687 +msgid "Table Name" msgstr "" -#: superset/views.py:439 +#: superset/views.py:687 +msgid "Name of table to be created from csv data." +msgstr "" + +#: superset/views.py:689 +msgid "Database URI" +msgstr "" + +#: superset/views.py:689 +msgid "URI of database in which to add above table." +msgstr "" + +#: superset/views.py:691 superset/views.py:896 msgid "Schema" msgstr "" -#: superset/views.py:440 superset/views.py:695 +#: superset/views.py:691 +msgid "Specify a schema (if database flavour supports this)." +msgstr "" + +#: superset/views.py:693 +msgid "Table Exists" +msgstr "" + +#: superset/views.py:693 +msgid "" +"If table exists do one of the following: Fail (do nothing), Replace (drop" +" and recreate table) or Append (insert data)." +msgstr "" + +#: superset/views.py:696 +msgid "Fail" +msgstr "" + +#: superset/views.py:696 +msgid "Replace" +msgstr "" + +#: superset/views.py:696 +msgid "Append" +msgstr "" + +#: superset/views.py:698 +msgid "Dataframe Index" +msgstr "" + +#: superset/views.py:698 +msgid "Write dataframe index as a column." +msgstr "" + +#: superset/views.py:699 +msgid "Column Label(s)" +msgstr "" + +#: superset/views.py:699 +msgid "" +"Column label for index column(s). If None is given and Dataframe Index is" +" True, Index Names are used." +msgstr "" + +#: superset/views.py:702 +msgid "Chunksize" +msgstr "" + +#: superset/views.py:702 +msgid "" +"If not None, rows will be written in batches of this size at a time. If " +"None, all rows will be written at once." +msgstr "" + +#: superset/views.py:709 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views.py:792 +msgid "CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"" +msgstr "" + +#: superset/views.py:875 superset/views.py:1257 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: superset/views.py:876 +msgid "Name of the table that exists in the source database" +msgstr "" + +#: superset/views.py:878 +msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" +msgstr "" + +#: superset/views.py:884 +msgid "" +"This fields acts a Superset view, meaning that Superset will run a query " +"against this string as a subquery." +msgstr "" + +#: superset/views.py:892 +msgid "Changed By" +msgstr "" + +#: superset/views.py:895 superset/views.py:1268 +msgid "Is Featured" +msgstr "" + +#: superset/views.py:897 superset/views.py:1270 msgid "Default Endpoint" msgstr "" -#: superset/views.py:441 +#: superset/views.py:898 msgid "Offset" msgstr "" -#: superset/views.py:482 superset/views.py:690 +#: superset/views.py:927 +msgid "" +"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." +msgstr "" + +#: superset/views.py:955 superset/views.py:1212 +msgid "User" +msgstr "" + +#: superset/views.py:956 +msgid "User Roles" +msgstr "" + +#: superset/views.py:957 +msgid "Database URL" +msgstr "" + +#: superset/views.py:959 +msgid "Roles to grant" +msgstr "" + +#: superset/views.py:960 +msgid "Created On" +msgstr "" + +#: superset/views.py:982 superset/views.py:1265 msgid "Cluster" msgstr "" -#: superset/views.py:483 +#: superset/views.py:983 msgid "Coordinator Host" msgstr "" -#: superset/views.py:484 +#: superset/views.py:984 msgid "Coordinator Port" msgstr "" -#: superset/views.py:485 +#: superset/views.py:985 msgid "Coordinator Endpoint" msgstr "" -#: superset/views.py:486 +#: superset/views.py:986 msgid "Broker Host" msgstr "" -#: superset/views.py:487 +#: superset/views.py:987 msgid "Broker Port" msgstr "" -#: superset/views.py:488 +#: superset/views.py:988 msgid "Broker Endpoint" msgstr "" -#: superset/views.py:522 +#: superset/views.py:1027 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -1286,561 +1758,562 @@ msgid "" "parameters." msgstr "" -#: superset/views.py:527 +#: superset/views.py:1032 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/templates/superset/welcome.html:26 superset/views.py:535 +#: superset/views.py:1040 msgid "Dashboards" msgstr "" -#: superset/views.py:538 +#: superset/views.py:1043 msgid "Last Modified" msgstr "" -#: superset/views.py:539 superset/views.py:609 +#: superset/views.py:1044 superset/views.py:1142 msgid "Owners" msgstr "" -#: superset/views.py:540 +#: superset/views.py:1045 msgid "Parameters" msgstr "" -#: superset/views.py:541 superset/views.py:569 +#: superset/views.py:1046 superset/views.py:1091 msgid "Slice" msgstr "" -#: superset/views.py:542 +#: superset/views.py:1047 msgid "Name" msgstr "" -#: superset/views.py:544 superset/views.py:570 +#: superset/views.py:1049 msgid "Visualization Type" msgstr "" -#: superset/views.py:586 +#: superset/views.py:1070 +msgid "Click on a {} link to create a Slice" +msgstr "" + +#: superset/views.py:1115 msgid "" "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" msgstr "" -#: superset/views.py:591 +#: superset/views.py:1120 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: superset/views.py:595 +#: superset/views.py:1124 msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/views.py:596 +#: superset/views.py:1125 msgid "" "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." msgstr "" -#: superset/views.py:601 +#: superset/views.py:1130 msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/views.py:605 +#: superset/views.py:1138 msgid "Dashboard" msgstr "" -#: superset/views.py:606 +#: superset/views.py:1139 msgid "Title" msgstr "" -#: superset/views.py:607 +#: superset/views.py:1140 msgid "Slug" msgstr "" -#: superset/views.py:608 +#: superset/views.py:1141 msgid "Slices" msgstr "" -#: superset/views.py:611 +#: superset/views.py:1144 msgid "Modified" msgstr "" -#: superset/views.py:612 +#: superset/views.py:1145 msgid "Position JSON" msgstr "" -#: superset/views.py:613 +#: superset/views.py:1146 msgid "CSS" msgstr "" -#: superset/views.py:614 +#: superset/views.py:1147 msgid "JSON Metadata" msgstr "" -#: superset/views.py:615 +#: superset/views.py:1148 msgid "Underlying Tables" msgstr "" -#: superset/views.py:653 -msgid "User" -msgstr "" - -#: superset/views.py:654 +#: superset/views.py:1213 msgid "Action" msgstr "" -#: superset/views.py:655 +#: superset/views.py:1214 msgid "dttm" msgstr "" -#: superset/views.py:683 -msgid "Timezone offset (in hours) for this datasource" -msgstr "" - -#: superset/views.py:689 +#: superset/views.py:1264 msgid "Data Source" msgstr "" -#: superset/views.py:692 +#: superset/views.py:1267 msgid "Owner" msgstr "" -#: superset/views.py:694 +#: superset/views.py:1269 msgid "Is Hidden" msgstr "" -#: superset/views.py:696 +#: superset/views.py:1271 msgid "Time Offset" msgstr "" -#: superset/views.py:1176 -msgid "This view requires the `all_datasource_access` permission" -msgstr "" - -#: superset/views.py:1249 -msgid "Refresh Druid Metadata" -msgstr "" - -#: superset/viz.py:367 +#: superset/viz.py:408 msgid "Table View" msgstr "" -#: superset/viz.py:370 +#: superset/viz.py:411 msgid "GROUP BY" msgstr "" -#: superset/viz.py:371 +#: superset/viz.py:412 msgid "Use this section if you want a query that aggregates" msgstr "" -#: superset/viz.py:374 +#: superset/viz.py:415 msgid "NOT GROUPED BY" msgstr "" -#: superset/viz.py:375 +#: superset/viz.py:416 msgid "Use this section if you want to query atomic rows" msgstr "" -#: superset/viz.py:378 +#: superset/viz.py:419 msgid "Options" msgstr "" -#: superset/viz.py:429 +#: superset/viz.py:472 msgid "Pivot Table" msgstr "" -#: superset/viz.py:491 +#: superset/viz.py:534 msgid "Markup" msgstr "" -#: superset/viz.py:519 +#: superset/viz.py:558 +msgid "Separator" +msgstr "" + +#: superset/viz.py:581 msgid "Word Cloud" msgstr "" -#: superset/viz.py:551 +#: superset/viz.py:613 msgid "Treemap" msgstr "" -#: superset/viz.py:561 superset/viz.py:676 superset/viz.py:783 superset/viz.py:948 -#: superset/viz.py:1093 superset/viz.py:1122 superset/viz.py:1177 -#: superset/viz.py:1682 +#: superset/viz.py:623 superset/viz.py:738 superset/viz.py:845 +#: superset/viz.py:1011 superset/viz.py:1163 superset/viz.py:1192 +#: superset/viz.py:1314 superset/viz.py:1825 msgid "Chart Options" msgstr "" -#: superset/viz.py:595 +#: superset/viz.py:657 msgid "Calendar Heatmap" msgstr "" -#: superset/viz.py:666 +#: superset/viz.py:728 msgid "Box Plot" msgstr "" -#: superset/viz.py:773 +#: superset/viz.py:835 msgid "Bubble Chart" msgstr "" -#: superset/viz.py:842 +#: superset/viz.py:904 msgid "Big Number with Trendline" msgstr "" -#: superset/viz.py:892 +#: superset/viz.py:954 msgid "Big Number" msgstr "" -#: superset/viz.py:938 +#: superset/viz.py:1000 msgid "Time Series - Line Chart" msgstr "" -#: superset/viz.py:958 +#: superset/viz.py:1022 msgid "Advanced Analytics" msgstr "" -#: superset/viz.py:959 +#: superset/viz.py:1023 msgid "" "This section contains options that allow for advanced analytical post " "processing of query results" msgstr "" -#: superset/viz.py:1091 +#: superset/viz.py:1161 msgid "Time Series - Bar Chart" msgstr "" -#: superset/viz.py:1111 +#: superset/viz.py:1181 msgid "Time Series - Percent Change" msgstr "" -#: superset/viz.py:1119 +#: superset/viz.py:1189 msgid "Time Series - Stacked" msgstr "" -#: superset/viz.py:1138 +#: superset/viz.py:1208 msgid "Distribution - NVD3 - Pie Chart" msgstr "" -#: superset/viz.py:1174 +#: superset/viz.py:1246 +msgid "Histogram" +msgstr "" + +#: superset/viz.py:1255 +msgid "Histogram Options" +msgstr "" + +#: superset/viz.py:1263 +msgid "Numeric Column" +msgstr "" + +#: superset/viz.py:1264 +msgid "Select the numeric column to draw the histogram" +msgstr "" + +#: superset/viz.py:1267 +msgid "No of Bins" +msgstr "" + +#: superset/viz.py:1268 +msgid "Select number of bins for the histogram" +msgstr "" + +#: superset/viz.py:1311 msgid "Distribution - Bar Chart" msgstr "" -#: superset/viz.py:1195 +#: superset/viz.py:1332 msgid "Breakdowns" msgstr "" -#: superset/viz.py:1196 +#: superset/viz.py:1333 msgid "Defines how each series is broken down" msgstr "" -#: superset/viz.py:1261 +#: superset/viz.py:1398 msgid "Sunburst" msgstr "" -#: superset/viz.py:1276 +#: superset/viz.py:1413 msgid "Primary Metric" msgstr "" -#: superset/viz.py:1277 +#: superset/viz.py:1414 msgid "The primary metric is used to define the arc segment sizes" msgstr "" -#: superset/viz.py:1282 +#: superset/viz.py:1419 msgid "Secondary Metric" msgstr "" -#: superset/viz.py:1283 +#: superset/viz.py:1420 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" msgstr "" -#: superset/viz.py:1289 +#: superset/viz.py:1426 msgid "Hierarchy" msgstr "" -#: superset/viz.py:1290 +#: superset/viz.py:1427 msgid "This defines the level of the hierarchy" msgstr "" -#: superset/viz.py:1327 +#: superset/viz.py:1463 msgid "Sankey" msgstr "" -#: superset/viz.py:1340 superset/viz.py:1410 +#: superset/viz.py:1476 superset/viz.py:1546 msgid "Source / Target" msgstr "" -#: superset/viz.py:1341 superset/viz.py:1411 +#: superset/viz.py:1477 superset/viz.py:1547 msgid "Choose a source and a target" msgstr "" -#: superset/viz.py:1391 +#: superset/viz.py:1527 msgid "Directed Force Layout" msgstr "" -#: superset/viz.py:1402 +#: superset/viz.py:1538 msgid "Force Layout" msgstr "" -#: superset/viz.py:1433 +#: superset/viz.py:1569 msgid "World Map" msgstr "" -#: superset/viz.py:1444 +#: superset/viz.py:1580 msgid "Bubbles" msgstr "" -#: superset/viz.py:1453 +#: superset/viz.py:1589 msgid "Country Field" msgstr "" -#: superset/viz.py:1454 +#: superset/viz.py:1590 msgid "3 letter code of the country" msgstr "" -#: superset/viz.py:1457 +#: superset/viz.py:1593 msgid "Metric for color" msgstr "" -#: superset/viz.py:1458 +#: superset/viz.py:1594 msgid "Metric that defines the color of the country" msgstr "" -#: superset/viz.py:1461 +#: superset/viz.py:1597 msgid "Bubble size" msgstr "" -#: superset/viz.py:1462 +#: superset/viz.py:1598 msgid "Metric that defines the size of the bubble" msgstr "" -#: superset/templates/superset/explore.html:147 superset/viz.py:1507 +#: superset/viz.py:1648 msgid "Filters" msgstr "" -#: superset/viz.py:1519 +#: superset/viz.py:1661 msgid "Filter fields" msgstr "" -#: superset/viz.py:1520 +#: superset/viz.py:1662 msgid "The fields you want to filter on" msgstr "" -#: superset/viz.py:1555 +#: superset/viz.py:1698 msgid "iFrame" msgstr "" -#: superset/viz.py:1573 +#: superset/viz.py:1716 msgid "Parallel Coordinates" msgstr "" -#: superset/viz.py:1609 +#: superset/viz.py:1752 msgid "Heatmap" msgstr "" -#: superset/viz.py:1622 +#: superset/viz.py:1765 msgid "Heatmap Options" msgstr "" -#: superset/viz.py:1677 +#: superset/viz.py:1820 msgid "Horizon Charts" msgstr "" -#: superset/viz.py:1693 +#: superset/viz.py:1836 msgid "Mapbox" msgstr "" -#: superset/viz.py:1707 +#: superset/viz.py:1850 msgid "Points" msgstr "" -#: superset/viz.py:1713 +#: superset/viz.py:1856 msgid "Labelling" msgstr "" -#: superset/viz.py:1719 +#: superset/viz.py:1862 msgid "Visual Tweaks" msgstr "" -#: superset/viz.py:1726 +#: superset/viz.py:1869 msgid "Viewport" msgstr "" -#: superset/viz.py:1736 +#: superset/viz.py:1879 msgid "Longitude" msgstr "" -#: superset/viz.py:1737 +#: superset/viz.py:1880 msgid "Column containing longitude data" msgstr "" -#: superset/viz.py:1740 +#: superset/viz.py:1883 msgid "Latitude" msgstr "" -#: superset/viz.py:1741 +#: superset/viz.py:1884 msgid "Column containing latitude data" msgstr "" -#: superset/viz.py:1744 +#: superset/viz.py:1887 msgid "Cluster label aggregator" msgstr "" -#: superset/viz.py:1745 +#: superset/viz.py:1888 msgid "" "Aggregate function applied to the list of points in each cluster to " "produce the cluster label." msgstr "" -#: superset/viz.py:1750 +#: superset/viz.py:1893 msgid "Tooltip" msgstr "" -#: superset/viz.py:1751 +#: superset/viz.py:1894 msgid "Show a tooltip when hovering over points and clusters describing the label" msgstr "" -#: superset/viz.py:1756 +#: superset/viz.py:1899 msgid "" "One or many fields to group by. If grouping, latitude and longitude " "columns must be present." msgstr "" -#: superset/templates/appbuilder/navbar_right.html:36 +#: superset/templates/appbuilder/navbar_right.html:41 msgid "Profile" msgstr "" -#: superset/templates/appbuilder/navbar_right.html:37 +#: superset/templates/appbuilder/navbar_right.html:42 msgid "Logout" msgstr "" -#: superset/templates/appbuilder/navbar_right.html:42 +#: superset/templates/appbuilder/navbar_right.html:47 msgid "Login" msgstr "" -#: superset/templates/superset/explore.html:34 -#: superset/templates/superset/explore.html:241 -msgid "Query" +#: superset/templates/superset/request_access.html:2 +msgid "No Access!" msgstr "" -#: superset/templates/superset/explore.html:43 -#: superset/templates/superset/explore.html:306 -msgid "Save" +#: superset/templates/superset/request_access.html:7 +#, python-format +msgid "You do not have permissions to access the datasource(s): %(name)s." msgstr "" -#: superset/templates/superset/explore.html:72 -msgid "Force refresh" +#: superset/templates/superset/request_access.html:13 +msgid "Request Permissions" msgstr "" -#: superset/templates/superset/explore.html:77 -msgid "Short URL" -msgstr "" - -#: superset/templates/superset/explore.html:79 -msgid "Generate an embeddable iframe" +#: superset/templates/superset/request_access.html:16 +msgid "Cancel" msgstr "" -#: superset/templates/superset/explore.html:82 -msgid "Export to .json" +#: superset/templates/superset/models/database/macros.html:4 +msgid "Test Connection" msgstr "" -#: superset/templates/superset/explore.html:86 -msgid "Export to .csv format" -msgstr "" +#~ msgid "" +#~ "D3 format syntax for numbers https: //github.com/mbostock/\n" +#~ "d3/wiki/Formatting" +#~ msgstr "" -#: superset/templates/superset/explore.html:92 -msgid "Query timer" -msgstr "" +#~ msgid "" +#~ "Defines the grouping of entities. Each" +#~ " serie is shown as a specific " +#~ "color on the chart and has a " +#~ "legend toggle" +#~ msgstr "" -#: superset/templates/superset/explore.html:94 -msgid "0 sec" -msgstr "" +#~ msgid "" +#~ "D3 format syntax for y axis https: //github.com/mbostock/\n" +#~ "d3/wiki/Formatting" +#~ msgstr "" -#: superset/templates/superset/explore.html:100 -msgid "View database query" -msgstr "" +#~ msgid "SQL link" +#~ msgstr "" -#: superset/templates/superset/explore.html:101 -msgid "query" -msgstr "" +#~ msgid "SQL Editor" +#~ msgstr "" -#: superset/templates/superset/explore.html:150 -msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" -msgstr "" +#~ msgid "This view requires the `all_datasource_access` permission" +#~ msgstr "" -#: superset/templates/superset/explore.html:168 -msgid "Add filter" -msgstr "" +#~ msgid "Refresh Druid Metadata" +#~ msgstr "" -#: superset/templates/superset/explore.html:247 -#: superset/templates/superset/explore.html:265 -msgid "Close" -msgstr "" +#~ msgid "Calender Heatmap" +#~ msgstr "" -#: superset/templates/superset/explore.html:259 -msgid "Datasource Description" -msgstr "" +#~ msgid "Query" +#~ msgstr "" -#: superset/templates/superset/explore.html:277 -msgid "Save a Slice" -msgstr "" +#~ msgid "Save" +#~ msgstr "" -#: superset/templates/superset/explore.html:309 -msgid "Save & go to dashboard" -msgstr "" +#~ msgid "Force refresh" +#~ msgstr "" -#: superset/templates/superset/explore.html:312 -msgid "Cancel" -msgstr "" +#~ msgid "Short URL" +#~ msgstr "" -#: superset/templates/superset/sql.html:12 -msgid "Run!" -msgstr "" +#~ msgid "Generate an embeddable iframe" +#~ msgstr "" -#: superset/templates/superset/sql.html:13 -msgid "Create View" -msgstr "" +#~ msgid "Export to .json" +#~ msgstr "" -#: superset/templates/superset/welcome.html:8 -#: superset/templates/superset/welcome.html:14 -msgid "Welcome!" -msgstr "" +#~ msgid "Export to .csv format" +#~ msgstr "" -#: superset/templates/superset/models/database/macros.html:4 -msgid "Test Connection" -msgstr "" +#~ msgid "Query timer" +#~ msgstr "" -#~ msgid "Databases" +#~ msgid "0 sec" #~ msgstr "" -#~ msgid "Sources" +#~ msgid "View database query" #~ msgstr "" -#~ msgid "Tables" +#~ msgid "query" #~ msgstr "" -#~ msgid "Druid Clusters" +#~ msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" #~ msgstr "" -#~ msgid "Action Log" +#~ msgid "Add filter" #~ msgstr "" -#~ msgid "Security" +#~ msgid "Close" #~ msgstr "" -#~ msgid "Druid Datasources" +#~ msgid "Datasource Description" #~ msgstr "" -#~ msgid "CSS Templates" +#~ msgid "Save a Slice" #~ msgstr "" -#~ msgid "Documentation" +#~ msgid "Save & go to dashboard" #~ msgstr "" -#~ msgid "Standalone version, use to embed anywhere" +#~ msgid "Run!" #~ msgstr "" -#~ msgid "Overwrite" +#~ msgid "Create View" #~ msgstr "" -#~ msgid "Save as" +#~ msgid "Welcome!" #~ msgstr "" diff --git a/superset/translations/fr/LC_MESSAGES/messages.mo b/superset/translations/fr/LC_MESSAGES/messages.mo index 4fdcc9a62a1e4bcb7a38a759123f941551c62dfe..0756845dcde5cbb5813dd17c1bee11a728854e3b 100644 GIT binary patch literal 39306 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

Tx*in}42q?qGTxj->i&FE(}%E@e! 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 literal 5950 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 I^|{jD0Zt%Dr2qf` diff --git a/superset/translations/fr/LC_MESSAGES/messages.po b/superset/translations/fr/LC_MESSAGES/messages.po old mode 100755 new mode 100644 index b3df8ffb4f73..246742cc3cbb --- a/superset/translations/fr/LC_MESSAGES/messages.po +++ b/superset/translations/fr/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-07-01 17:17+0800\n" -"PO-Revision-Date: 2016-05-01 23:07-0700\n" +"POT-Creation-Date: 2016-12-08 14:45+0000\n" +"PO-Revision-Date: 2016-12-08 14:44+0000\n" "Last-Translator: FULL NAME \n" "Language: fr\n" "Language-Team: fr \n" @@ -18,165 +18,258 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: superset/forms.py:140 -msgid "Viz" +#: superset/db_engine_specs.py:79 superset/db_engine_specs.py:102 +#: superset/db_engine_specs.py:125 superset/db_engine_specs.py:160 +#: superset/db_engine_specs.py:268 superset/db_engine_specs.py:304 +#: superset/forms.py:436 +msgid "Time Column" +msgstr "" + +#: superset/db_engine_specs.py:80 superset/db_engine_specs.py:126 +#: superset/db_engine_specs.py:161 superset/db_engine_specs.py:269 +msgid "second" +msgstr "" + +#: superset/db_engine_specs.py:81 superset/db_engine_specs.py:129 +#: superset/db_engine_specs.py:163 superset/db_engine_specs.py:271 +#: superset/db_engine_specs.py:305 +msgid "minute" +msgstr "" + +#: superset/db_engine_specs.py:82 superset/db_engine_specs.py:131 +#: superset/db_engine_specs.py:165 superset/db_engine_specs.py:277 +#: superset/db_engine_specs.py:307 superset/forms.py:380 superset/forms.py:394 +msgid "hour" +msgstr "" + +#: superset/db_engine_specs.py:83 superset/db_engine_specs.py:103 +#: superset/db_engine_specs.py:133 superset/db_engine_specs.py:167 +#: superset/db_engine_specs.py:279 superset/db_engine_specs.py:309 +#: superset/forms.py:381 superset/forms.py:395 +msgid "day" +msgstr "" + +#: superset/db_engine_specs.py:84 superset/db_engine_specs.py:104 +#: superset/db_engine_specs.py:134 superset/db_engine_specs.py:169 +#: superset/db_engine_specs.py:281 superset/db_engine_specs.py:311 +#: superset/forms.py:366 superset/forms.py:382 superset/forms.py:396 +msgid "week" +msgstr "" + +#: superset/db_engine_specs.py:85 superset/db_engine_specs.py:106 +#: superset/db_engine_specs.py:136 superset/db_engine_specs.py:171 +#: superset/db_engine_specs.py:283 superset/db_engine_specs.py:313 +#: superset/forms.py:369 superset/forms.py:383 superset/forms.py:397 +msgid "month" +msgstr "" + +#: superset/db_engine_specs.py:86 superset/db_engine_specs.py:138 +#: superset/db_engine_specs.py:173 superset/db_engine_specs.py:285 +#: superset/db_engine_specs.py:315 +msgid "quarter" +msgstr "" + +#: superset/db_engine_specs.py:87 superset/db_engine_specs.py:140 +#: superset/db_engine_specs.py:287 superset/db_engine_specs.py:317 +#: superset/forms.py:384 +msgid "year" +msgstr "" + +#: superset/db_engine_specs.py:175 superset/forms.py:368 +msgid "week_ending_saturday" +msgstr "" + +#: superset/db_engine_specs.py:178 +msgid "week_start_sunday" +msgstr "" + +#: superset/db_engine_specs.py:273 +msgid "5 minute" +msgstr "" + +#: superset/db_engine_specs.py:275 +msgid "half hour" +msgstr "" + +#: superset/forms.py:30 +msgid "D3 format syntax https://github.com/d3/d3-format" msgstr "" #: superset/forms.py:143 -msgid "The type of visualization to display" +msgid "Viz" msgstr "" #: superset/forms.py:146 +msgid "The type of visualization to display" +msgstr "" + +#: superset/forms.py:149 msgid "Metrics" msgstr "" -#: superset/forms.py:149 superset/forms.py:154 +#: superset/forms.py:152 superset/forms.py:157 msgid "One or many metrics to display" msgstr "" -#: superset/forms.py:152 +#: superset/forms.py:155 msgid "Ordering" msgstr "" -#: superset/forms.py:157 superset/views.py:294 superset/views.py:334 +#: superset/forms.py:160 superset/views.py:455 superset/views.py:495 msgid "Metric" msgstr "" -#: superset/forms.py:160 +#: superset/forms.py:163 msgid "Choose the metric" msgstr "" -#: superset/forms.py:163 +#: superset/forms.py:166 msgid "Chart Style" msgstr "" -#: superset/forms.py:165 +#: superset/forms.py:168 msgid "stack" msgstr "" -#: superset/forms.py:166 +#: superset/forms.py:169 msgid "stream" msgstr "" -#: superset/forms.py:167 +#: superset/forms.py:170 msgid "expand" msgstr "" -#: superset/forms.py:173 +#: superset/forms.py:176 msgid "Color Scheme" msgstr "" -#: superset/forms.py:175 +#: superset/forms.py:178 msgid "fire" msgstr "" -#: superset/forms.py:176 +#: superset/forms.py:179 msgid "blue_white_yellow" msgstr "" -#: superset/forms.py:177 +#: superset/forms.py:180 msgid "white_black" msgstr "" -#: superset/forms.py:178 +#: superset/forms.py:181 msgid "black_white" msgstr "" -#: superset/forms.py:184 +#: superset/forms.py:187 msgid "Normalize Across" msgstr "" -#: superset/forms.py:186 +#: superset/forms.py:189 msgid "heatmap" msgstr "" -#: superset/forms.py:187 +#: superset/forms.py:190 msgid "x" msgstr "" -#: superset/forms.py:188 +#: superset/forms.py:191 msgid "y" msgstr "" -#: superset/forms.py:191 +#: superset/forms.py:194 msgid "" "Color will be rendered based on a ratio of the cell against the sum of " "across this criteria" msgstr "" -#: superset/forms.py:197 +#: superset/forms.py:200 msgid "Color Scale" msgstr "" -#: superset/forms.py:199 +#: superset/forms.py:202 msgid "series" msgstr "" -#: superset/forms.py:200 +#: superset/forms.py:203 msgid "overall" msgstr "" -#: superset/forms.py:201 +#: superset/forms.py:204 msgid "change" msgstr "" -#: superset/forms.py:204 +#: superset/forms.py:207 msgid "Defines how the color are attributed." msgstr "" -#: superset/forms.py:207 +#: superset/forms.py:210 msgid "Rendering" msgstr "" -#: superset/forms.py:209 +#: superset/forms.py:212 msgid "pixelated (Sharp)" msgstr "" -#: superset/forms.py:210 +#: superset/forms.py:213 msgid "auto (Smooth)" msgstr "" -#: superset/forms.py:213 +#: superset/forms.py:216 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "" -#: superset/forms.py:218 +#: superset/forms.py:221 msgid "XScale Interval" msgstr "" -#: superset/forms.py:221 +#: superset/forms.py:224 msgid "Number of step to take between ticks when printing the x scale" msgstr "" -#: superset/forms.py:226 +#: superset/forms.py:229 msgid "YScale Interval" msgstr "" -#: superset/forms.py:229 +#: superset/forms.py:232 msgid "Number of step to take between ticks when printing the y scale" msgstr "" -#: superset/forms.py:234 +#: superset/forms.py:237 msgid "Stacked Bars" msgstr "" -#: superset/forms.py:239 +#: superset/forms.py:242 +msgid "Show Markers" +msgstr "" + +#: superset/forms.py:249 +msgid "Bar Values" +msgstr "" + +#: superset/forms.py:254 +msgid "Sort Bars" +msgstr "" + +#: superset/forms.py:256 +msgid "Sort bars by x labels." +msgstr "" + +#: superset/forms.py:259 msgid "Extra Controls" msgstr "" -#: superset/forms.py:241 +#: superset/forms.py:261 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" -#: superset/forms.py:247 +#: superset/forms.py:267 msgid "Reduce X ticks" msgstr "" -#: superset/forms.py:249 +#: superset/forms.py:269 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 " @@ -184,874 +277,919 @@ msgid "" "scroll." msgstr "" -#: superset/forms.py:257 +#: superset/forms.py:277 msgid "Include Series" msgstr "" -#: superset/forms.py:259 +#: superset/forms.py:279 msgid "Include series name as an axis" msgstr "" -#: superset/forms.py:262 +#: superset/forms.py:282 msgid "Color Metric" msgstr "" -#: superset/forms.py:265 +#: superset/forms.py:285 msgid "A metric to use for color" msgstr "" -#: superset/forms.py:268 +#: superset/forms.py:288 msgid "Country Field Type" msgstr "" -#: superset/forms.py:271 +#: superset/forms.py:291 msgid "Full name" msgstr "" -#: superset/forms.py:272 +#: superset/forms.py:292 msgid "code International Olympic Committee (cioc)" msgstr "" -#: superset/forms.py:273 +#: superset/forms.py:293 msgid "code ISO 3166-1 alpha-2 (cca2)" msgstr "" -#: superset/forms.py:274 +#: superset/forms.py:294 msgid "code ISO 3166-1 alpha-3 (cca3)" msgstr "" -#: superset/forms.py:276 +#: superset/forms.py:296 msgid "" "The country code standard that Superset should expect to find in the " "[country] column" msgstr "" -#: superset/forms.py:281 +#: superset/forms.py:301 msgid "Group by" msgstr "" -#: superset/forms.py:283 +#: superset/forms.py:303 msgid "One or many fields to group by" msgstr "" -#: superset/forms.py:286 superset/forms.py:291 +#: superset/forms.py:306 superset/forms.py:311 msgid "Columns" msgstr "" -#: superset/forms.py:288 +#: superset/forms.py:308 msgid "One or many fields to pivot as columns" msgstr "" -#: superset/forms.py:293 superset/forms.py:298 superset/forms.py:303 +#: superset/forms.py:313 superset/forms.py:319 superset/forms.py:325 msgid "Columns to display" msgstr "" -#: superset/forms.py:296 +#: superset/forms.py:316 msgid "X" msgstr "" -#: superset/forms.py:301 +#: superset/forms.py:322 msgid "Y" msgstr "" -#: superset/forms.py:306 +#: superset/forms.py:328 msgid "Origin" msgstr "" -#: superset/forms.py:308 +#: superset/forms.py:330 msgid "default" msgstr "" -#: superset/forms.py:309 superset/forms.py:467 +#: superset/forms.py:331 superset/forms.py:500 msgid "now" msgstr "" -#: superset/forms.py:312 +#: superset/forms.py:334 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "'now', 'sunday' or '1970-01-01'" msgstr "" -#: superset/forms.py:317 +#: superset/forms.py:339 msgid "Bottom Margin" msgstr "" -#: superset/forms.py:320 +#: superset/forms.py:342 msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/forms.py:325 +#: superset/forms.py:347 +msgid "Page Length" +msgstr "" + +#: superset/forms.py:350 +msgid "Number of rows per page, 0 means no pagination" +msgstr "" + +#: superset/forms.py:354 msgid "Time Granularity" msgstr "" -#: superset/forms.py:328 +#: superset/forms.py:357 msgid "all" msgstr "" -#: superset/forms.py:329 +#: superset/forms.py:358 msgid "5 seconds" msgstr "" -#: superset/forms.py:330 +#: superset/forms.py:359 msgid "30 seconds" msgstr "" -#: superset/forms.py:331 +#: superset/forms.py:360 msgid "1 minute" msgstr "" -#: superset/forms.py:332 +#: superset/forms.py:361 msgid "5 minutes" msgstr "" -#: superset/forms.py:333 +#: superset/forms.py:362 msgid "1 hour" msgstr "" -#: superset/forms.py:334 +#: superset/forms.py:363 msgid "6 hour" msgstr "" -#: superset/forms.py:335 +#: superset/forms.py:364 msgid "1 day" msgstr "" -#: superset/forms.py:336 +#: superset/forms.py:365 msgid "7 days" msgstr "" -#: superset/forms.py:338 +#: superset/forms.py:367 +msgid "week_starting_sunday" +msgstr "" + +#: superset/forms.py:371 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/forms.py:344 +#: superset/forms.py:377 msgid "Domain" msgstr "" -#: superset/forms.py:347 superset/forms.py:361 superset/models.py:417 -#: superset/models.py:435 -msgid "hour" -msgstr "" - -#: superset/forms.py:348 superset/forms.py:362 superset/models.py:419 -#: superset/models.py:427 superset/models.py:436 -msgid "day" -msgstr "" - -#: superset/forms.py:349 superset/forms.py:363 superset/models.py:407 -#: superset/models.py:420 superset/models.py:428 superset/models.py:437 -msgid "week" -msgstr "" - -#: superset/forms.py:350 superset/forms.py:364 superset/models.py:408 -#: superset/models.py:422 superset/models.py:429 superset/models.py:438 -msgid "month" -msgstr "" - -#: superset/forms.py:351 superset/models.py:439 -msgid "year" -msgstr "" - -#: superset/forms.py:353 +#: superset/forms.py:386 msgid "The time unit used for the grouping of blocks" msgstr "" -#: superset/forms.py:357 +#: superset/forms.py:390 msgid "Subdomain" msgstr "" -#: superset/forms.py:360 superset/forms.py:701 +#: superset/forms.py:393 superset/forms.py:744 msgid "min" msgstr "" -#: superset/forms.py:366 +#: superset/forms.py:399 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/forms.py:371 +#: superset/forms.py:404 msgid "Link Length" msgstr "" -#: superset/forms.py:383 +#: superset/forms.py:416 msgid "Link length in the force layout" msgstr "" -#: superset/forms.py:386 +#: superset/forms.py:419 msgid "Charge" msgstr "" -#: superset/forms.py:400 +#: superset/forms.py:433 msgid "Charge in the force layout" msgstr "" -#: superset/forms.py:403 superset/models.py:406 superset/models.py:416 -#: superset/models.py:426 superset/models.py:432 -msgid "Time Column" -msgstr "" - -#: superset/forms.py:406 +#: superset/forms.py:439 msgid "" "The time column for the visualization. Note that you can define arbitrary" " expression that return a DATETIME column in the table editor. Also note " "that the filter below is applied against this column or expression" msgstr "" -#: superset/forms.py:414 +#: superset/forms.py:447 msgid "Resample Rule" msgstr "" -#: superset/forms.py:417 +#: superset/forms.py:450 msgid "1T" msgstr "" -#: superset/forms.py:418 +#: superset/forms.py:451 msgid "1H" msgstr "" -#: superset/forms.py:419 +#: superset/forms.py:452 msgid "1D" msgstr "" -#: superset/forms.py:420 +#: superset/forms.py:453 msgid "7D" msgstr "" -#: superset/forms.py:421 +#: superset/forms.py:454 msgid "1M" msgstr "" -#: superset/forms.py:422 +#: superset/forms.py:455 msgid "1AS" msgstr "" -#: superset/forms.py:424 +#: superset/forms.py:457 msgid "Pandas resample rule" msgstr "" -#: superset/forms.py:427 +#: superset/forms.py:460 msgid "Resample How" msgstr "" -#: superset/forms.py:431 superset/forms.py:700 +#: superset/forms.py:464 superset/forms.py:743 msgid "mean" msgstr "" -#: superset/forms.py:432 superset/forms.py:699 +#: superset/forms.py:465 superset/forms.py:742 msgid "sum" msgstr "" -#: superset/forms.py:433 superset/forms.py:703 +#: superset/forms.py:466 superset/forms.py:746 msgid "median" msgstr "" -#: superset/forms.py:435 +#: superset/forms.py:468 msgid "Pandas resample how" msgstr "" -#: superset/forms.py:438 +#: superset/forms.py:471 msgid "Resample Fill Method" msgstr "" -#: superset/forms.py:442 +#: superset/forms.py:475 msgid "ffill" msgstr "" -#: superset/forms.py:443 +#: superset/forms.py:476 msgid "bfill" msgstr "" -#: superset/forms.py:445 +#: superset/forms.py:478 msgid "Pandas resample fill method" msgstr "" -#: superset/forms.py:448 +#: superset/forms.py:481 msgid "Since" msgstr "" -#: superset/forms.py:451 +#: superset/forms.py:484 msgid "1 hour ago" msgstr "" -#: superset/forms.py:452 +#: superset/forms.py:485 msgid "12 hours ago" msgstr "" -#: superset/forms.py:453 superset/forms.py:468 +#: superset/forms.py:486 superset/forms.py:501 msgid "1 day ago" msgstr "" -#: superset/forms.py:454 superset/forms.py:469 +#: superset/forms.py:487 superset/forms.py:502 msgid "7 days ago" msgstr "" -#: superset/forms.py:455 superset/forms.py:470 +#: superset/forms.py:488 superset/forms.py:503 msgid "28 days ago" msgstr "" -#: superset/forms.py:456 superset/forms.py:471 +#: superset/forms.py:489 superset/forms.py:504 msgid "90 days ago" msgstr "" -#: superset/forms.py:457 superset/forms.py:472 +#: superset/forms.py:490 superset/forms.py:505 msgid "1 year ago" msgstr "" -#: superset/forms.py:459 +#: superset/forms.py:492 msgid "" "Timestamp from filter. This supports free form typing and natural " "language as in '1 day ago', '28 days' or '3 years'" msgstr "" -#: superset/forms.py:464 +#: superset/forms.py:497 msgid "Until" msgstr "" -#: superset/forms.py:476 +#: superset/forms.py:509 msgid "Max Bubble Size" msgstr "" -#: superset/forms.py:489 +#: superset/forms.py:522 msgid "Whisker/outlier options" msgstr "" -#: superset/forms.py:491 +#: superset/forms.py:524 msgid "Determines how whiskers and outliers are calculated." msgstr "" -#: superset/forms.py:494 +#: superset/forms.py:527 msgid "Tukey" msgstr "" -#: superset/forms.py:495 +#: superset/forms.py:528 msgid "Min/max (no outliers)" msgstr "" -#: superset/forms.py:496 +#: superset/forms.py:529 msgid "2/98 percentiles" msgstr "" -#: superset/forms.py:497 +#: superset/forms.py:530 msgid "9/91 percentiles" msgstr "" -#: superset/forms.py:501 +#: superset/forms.py:534 msgid "Ratio" msgstr "" -#: superset/forms.py:503 +#: superset/forms.py:536 msgid "Target aspect ratio for treemap tiles." msgstr "" -#: superset/forms.py:506 superset/viz.py:856 superset/viz.py:905 +#: superset/forms.py:539 superset/viz.py:918 superset/viz.py:967 msgid "Number format" msgstr "" -#: superset/forms.py:516 -msgid "" -"D3 format syntax for numbers https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "" - -#: superset/forms.py:521 +#: superset/forms.py:552 msgid "Row limit" msgstr "" -#: superset/forms.py:527 +#: superset/forms.py:558 msgid "Series limit" msgstr "" -#: superset/forms.py:530 +#: superset/forms.py:561 msgid "Limits the number of time series that get displayed" msgstr "" -#: superset/forms.py:534 +#: superset/forms.py:565 +msgid "Sort By" +msgstr "" + +#: superset/forms.py:568 +msgid "Metric used to define the top series" +msgstr "" + +#: superset/forms.py:571 msgid "Rolling" msgstr "" -#: superset/forms.py:537 +#: superset/forms.py:574 msgid "" "Defines a rolling window function to apply, works along with the " "[Periods] text box" msgstr "" -#: superset/forms.py:542 +#: superset/forms.py:579 msgid "Periods" msgstr "" -#: superset/forms.py:544 +#: superset/forms.py:581 msgid "" "Defines the size of the rolling window function, relative to the time " "granularity selected" msgstr "" -#: superset/forms.py:549 superset/viz.py:1192 +#: superset/forms.py:586 superset/viz.py:1329 msgid "Series" msgstr "" -#: superset/forms.py:552 +#: superset/forms.py:589 msgid "" -"Defines the grouping of entities. Each serie is shown as a specific color" -" on the chart and has a legend toggle" +"Defines the grouping of entities. Each series is shown as a specific " +"color on the chart and has a legend toggle" msgstr "" -#: superset/forms.py:558 +#: superset/forms.py:595 msgid "Entity" msgstr "" -#: superset/forms.py:561 +#: superset/forms.py:598 msgid "This define the element to be plotted on the chart" msgstr "" -#: superset/forms.py:564 +#: superset/forms.py:601 msgid "X Axis" msgstr "" -#: superset/forms.py:567 +#: superset/forms.py:604 msgid "Metric assigned to the [X] axis" msgstr "" -#: superset/forms.py:570 +#: superset/forms.py:607 msgid "Y Axis" msgstr "" -#: superset/forms.py:573 +#: superset/forms.py:610 msgid "Metric assigned to the [Y] axis" msgstr "" -#: superset/forms.py:576 +#: superset/forms.py:613 msgid "Bubble Size" msgstr "" -#: superset/forms.py:581 +#: superset/forms.py:618 msgid "URL" msgstr "" -#: superset/forms.py:582 +#: superset/forms.py:619 msgid "" "The URL, this field is templated, so you can integrate {{ width }} and/or" " {{ height }} in your URL string." msgstr "" -#: superset/forms.py:589 +#: superset/forms.py:626 msgid "X Axis Label" msgstr "" -#: superset/forms.py:593 +#: superset/forms.py:630 msgid "Y Axis Label" msgstr "" -#: superset/forms.py:597 +#: superset/forms.py:634 msgid "Custom WHERE clause" msgstr "" -#: superset/forms.py:599 +#: superset/forms.py:636 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/forms.py:606 +#: superset/forms.py:643 msgid "Custom HAVING clause" msgstr "" -#: superset/forms.py:608 +#: superset/forms.py:645 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/forms.py:615 +#: superset/forms.py:652 msgid "Comparison Period Lag" msgstr "" -#: superset/forms.py:616 +#: superset/forms.py:653 msgid "Based on granularity, number of time periods to compare against" msgstr "" -#: superset/forms.py:621 +#: superset/forms.py:658 msgid "Comparison suffix" msgstr "" -#: superset/forms.py:622 +#: superset/forms.py:659 msgid "Suffix to apply after the percentage display" msgstr "" -#: superset/forms.py:625 +#: superset/forms.py:662 msgid "Table Timestamp Format" msgstr "" -#: superset/forms.py:628 +#: superset/forms.py:665 msgid "Timestamp Format" msgstr "" -#: superset/forms.py:631 +#: superset/forms.py:668 msgid "Series Height" msgstr "" -#: superset/forms.py:634 +#: superset/forms.py:671 msgid "Pixel height of each series" msgstr "" -#: superset/forms.py:637 +#: superset/forms.py:674 msgid "X axis format" msgstr "" -#: superset/forms.py:640 superset/forms.py:655 -msgid "" -"D3 format syntax for y axis https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "" - -#: superset/forms.py:645 +#: superset/forms.py:680 msgid "Y axis format" msgstr "" -#: superset/forms.py:660 +#: superset/forms.py:693 msgid "Markup Type" msgstr "" -#: superset/forms.py:662 +#: superset/forms.py:695 msgid "markdown" msgstr "" -#: superset/forms.py:663 +#: superset/forms.py:696 msgid "html" msgstr "" -#: superset/forms.py:666 +#: superset/forms.py:699 msgid "Pick your favorite markup language" msgstr "" -#: superset/forms.py:669 +#: superset/forms.py:702 msgid "Rotation" msgstr "" -#: superset/forms.py:671 +#: superset/forms.py:704 msgid "random" msgstr "" -#: superset/forms.py:672 +#: superset/forms.py:705 msgid "flat" msgstr "" -#: superset/forms.py:673 +#: superset/forms.py:706 msgid "square" msgstr "" -#: superset/forms.py:676 +#: superset/forms.py:709 msgid "Rotation to apply to words in the cloud" msgstr "" -#: superset/forms.py:679 +#: superset/forms.py:712 msgid "Line Style" msgstr "" -#: superset/forms.py:681 +#: superset/forms.py:714 msgid "linear" msgstr "" -#: superset/forms.py:682 +#: superset/forms.py:715 msgid "basis" msgstr "" -#: superset/forms.py:683 +#: superset/forms.py:716 msgid "cardinal" msgstr "" -#: superset/forms.py:684 +#: superset/forms.py:717 msgid "monotone" msgstr "" -#: superset/forms.py:685 +#: superset/forms.py:718 msgid "step-before" msgstr "" -#: superset/forms.py:686 +#: superset/forms.py:719 msgid "step-after" msgstr "" -#: superset/forms.py:689 +#: superset/forms.py:722 msgid "Line interpolation as defined by d3.js" msgstr "" -#: superset/forms.py:692 +#: superset/forms.py:725 +msgid "Label Type" +msgstr "" + +#: superset/forms.py:728 +msgid "Category Name" +msgstr "" + +#: superset/forms.py:729 +msgid "Value" +msgstr "" + +#: superset/forms.py:730 +msgid "Percentage" +msgstr "" + +#: superset/forms.py:732 +msgid "What should be shown on the label?" +msgstr "" + +#: superset/forms.py:735 msgid "Code" msgstr "" -#: superset/forms.py:693 +#: superset/forms.py:736 msgid "Put your code here" msgstr "" -#: superset/forms.py:697 +#: superset/forms.py:740 msgid "Aggregation function" msgstr "" -#: superset/forms.py:702 +#: superset/forms.py:745 msgid "max" msgstr "" -#: superset/forms.py:704 +#: superset/forms.py:747 msgid "stdev" msgstr "" -#: superset/forms.py:705 +#: superset/forms.py:748 msgid "var" msgstr "" -#: superset/forms.py:708 +#: superset/forms.py:751 msgid "" "Aggregate function to apply when pivoting and computing the total rows " "and columns" msgstr "" -#: superset/forms.py:713 +#: superset/forms.py:756 msgid "Font Size From" msgstr "" -#: superset/forms.py:715 +#: superset/forms.py:758 msgid "Font size for the smallest value in the list" msgstr "" -#: superset/forms.py:718 +#: superset/forms.py:761 msgid "Font Size To" msgstr "" -#: superset/forms.py:720 +#: superset/forms.py:763 msgid "Font size for the biggest value in the list" msgstr "" -#: superset/forms.py:723 +#: superset/forms.py:766 msgid "Range Filter" msgstr "" -#: superset/forms.py:725 +#: superset/forms.py:768 msgid "Whether to display the time range interactive selector" msgstr "" -#: superset/forms.py:729 +#: superset/forms.py:772 +msgid "Date Filter" +msgstr "" + +#: superset/forms.py:774 +msgid "Whether to include a time filter" +msgstr "" + +#: superset/forms.py:777 msgid "Data Table" msgstr "" -#: superset/forms.py:731 +#: superset/forms.py:779 msgid "Whether to display the interactive data table" msgstr "" -#: superset/forms.py:734 +#: superset/forms.py:782 msgid "Search Box" msgstr "" -#: superset/forms.py:736 +#: superset/forms.py:784 msgid "Whether to include a client side search box" msgstr "" -#: superset/forms.py:740 +#: superset/forms.py:788 +msgid "Table Filter" +msgstr "" + +#: superset/forms.py:790 +msgid "Whether to apply filter when table cell is clicked" +msgstr "" + +#: superset/forms.py:794 msgid "Show Bubbles" msgstr "" -#: superset/forms.py:742 +#: superset/forms.py:796 msgid "Whether to display bubbles on top of countries" msgstr "" -#: superset/forms.py:746 +#: superset/forms.py:800 msgid "Legend" msgstr "" -#: superset/forms.py:748 +#: superset/forms.py:802 msgid "Whether to display the legend (toggles)" msgstr "" -#: superset/forms.py:751 +#: superset/forms.py:805 msgid "X bounds" msgstr "" -#: superset/forms.py:753 +#: superset/forms.py:807 msgid "Whether to display the min and max values of the X axis" msgstr "" -#: superset/forms.py:757 +#: superset/forms.py:811 msgid "Rich Tooltip" msgstr "" -#: superset/forms.py:759 +#: superset/forms.py:813 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" -#: superset/forms.py:764 +#: superset/forms.py:818 msgid "Y Axis Zero" msgstr "" -#: superset/forms.py:766 +#: superset/forms.py:820 msgid "Force the Y axis to start at 0 instead of the minimum value" msgstr "" -#: superset/forms.py:771 +#: superset/forms.py:825 msgid "Y Log" msgstr "" -#: superset/forms.py:773 +#: superset/forms.py:827 msgid "Use a log scale for the Y axis" msgstr "" -#: superset/forms.py:776 +#: superset/forms.py:830 msgid "X Log" msgstr "" -#: superset/forms.py:778 +#: superset/forms.py:832 msgid "Use a log scale for the X axis" msgstr "" -#: superset/forms.py:781 +#: superset/forms.py:835 msgid "Donut" msgstr "" -#: superset/forms.py:783 +#: superset/forms.py:837 msgid "Do you want a donut or a pie?" msgstr "" -#: superset/forms.py:786 +#: superset/forms.py:840 +msgid "Put labels outside" +msgstr "" + +#: superset/forms.py:842 +msgid "Put the labels outside the pie?" +msgstr "" + +#: superset/forms.py:845 msgid "Contribution" msgstr "" -#: superset/forms.py:788 +#: superset/forms.py:847 msgid "Compute the contribution to the total" msgstr "" -#: superset/forms.py:791 +#: superset/forms.py:850 msgid "Period Ratio" msgstr "" -#: superset/forms.py:794 +#: superset/forms.py:853 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "" -#: superset/forms.py:799 +#: superset/forms.py:858 +msgid "Period Ratio Type" +msgstr "" + +#: superset/forms.py:861 +msgid "factor" +msgstr "" + +#: superset/forms.py:862 +msgid "growth" +msgstr "" + +#: superset/forms.py:863 +msgid "value" +msgstr "" + +#: superset/forms.py:865 +msgid "" +"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " +"is (new-previous)" +msgstr "" + +#: superset/forms.py:870 msgid "Time Shift" msgstr "" -#: superset/forms.py:801 +#: superset/forms.py:872 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/forms.py:808 +#: superset/forms.py:879 msgid "Subheader" msgstr "" -#: superset/forms.py:809 +#: superset/forms.py:880 msgid "Description text that shows up below your Big Number" msgstr "" -#: superset/forms.py:816 +#: superset/forms.py:887 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/forms.py:832 +#: superset/forms.py:904 msgid "Base layer map style" msgstr "" -#: superset/forms.py:835 +#: superset/forms.py:907 msgid "Clustering Radius" msgstr "" -#: superset/forms.py:848 +#: superset/forms.py:920 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/forms.py:854 +#: superset/forms.py:926 msgid "Point Radius" msgstr "" -#: superset/forms.py:857 +#: superset/forms.py:929 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/forms.py:863 +#: superset/forms.py:935 msgid "Point Radius Unit" msgstr "" -#: superset/forms.py:870 +#: superset/forms.py:942 msgid "The unit of measure for the specified point radius" msgstr "" -#: superset/forms.py:873 +#: superset/forms.py:945 msgid "Opacity" msgstr "" -#: superset/forms.py:875 +#: superset/forms.py:947 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/forms.py:880 +#: superset/forms.py:952 msgid "Zoom" msgstr "" -#: superset/forms.py:883 +#: superset/forms.py:955 msgid "Zoom level of the map" msgstr "" -#: superset/forms.py:887 +#: superset/forms.py:959 msgid "Default latitude" msgstr "" -#: superset/forms.py:889 +#: superset/forms.py:961 msgid "Latitude of default viewport" msgstr "" -#: superset/forms.py:893 +#: superset/forms.py:965 msgid "Default longitude" msgstr "" -#: superset/forms.py:895 +#: superset/forms.py:967 msgid "Longitude of default viewport" msgstr "" -#: superset/forms.py:899 +#: superset/forms.py:971 msgid "Live render" msgstr "" -#: superset/forms.py:901 +#: superset/forms.py:973 msgid "Points and clusters will update as viewport is being changed" msgstr "" -#: superset/forms.py:905 +#: superset/forms.py:978 msgid "RGB Color" msgstr "" -#: superset/forms.py:915 +#: superset/forms.py:988 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/forms.py:978 +#: superset/forms.py:1051 msgid "SQL" msgstr "" -#: superset/forms.py:980 +#: superset/forms.py:1053 msgid "This section exposes ways to include snippets of SQL in your query" msgstr "" -#: superset/forms.py:991 +#: superset/forms.py:1064 msgid "Time Grain" msgstr "" -#: superset/forms.py:994 +#: superset/forms.py:1067 msgid "" "The time granularity for the visualization. This applies a date " "transformation to alter your time column and defines a new time " @@ -1059,226 +1197,560 @@ msgid "" "in the Superset source code" msgstr "" -#: superset/forms.py:1027 superset/forms.py:1031 +#: superset/forms.py:1102 superset/forms.py:1106 msgid "Filter 1" msgstr "" -#: superset/forms.py:1036 +#: superset/forms.py:1111 msgid "Super" msgstr "" -#: superset/forms.py:1040 +#: superset/forms.py:1115 msgid "Time" msgstr "" -#: superset/forms.py:1045 +#: superset/forms.py:1120 msgid "Time related form attributes" msgstr "" -#: superset/models.py:409 -msgid "quarter" +#: superset/models.py:1019 +msgid "" +"Datetime column not provided as part table configuration and is required " +"by this type of chart" msgstr "" -#: superset/models.py:410 -msgid "week_ending_saturday" +#: superset/models.py:2138 +msgid "No data was returned." msgstr "" -#: superset/models.py:412 -msgid "week_start_sunday" +#: superset/views.py:342 +msgid "" +"Whether to make this column available as a [Time Granularity] option, " +"column has to be DATETIME or DATETIME-like" msgstr "" -#: superset/models.py:433 -msgid "second" -msgstr "" - -#: superset/models.py:434 -msgid "minute" -msgstr "" - -#: superset/models.py:620 -msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" -msgstr "" - -#: superset/models.py:1328 -msgid "No data was returned." -msgstr "" - -#: superset/views.py:203 -msgid "" -"Whether to make this column available as a [Time Granularity] option, " -"column has to be DATETIME or DATETIME-like" -msgstr "" - -#: superset/views.py:230 superset/views.py:259 +#: superset/views.py:369 superset/views.py:399 msgid "Column" msgstr "" -#: superset/views.py:231 superset/views.py:296 superset/views.py:336 +#: superset/views.py:370 superset/views.py:457 superset/views.py:497 msgid "Verbose Name" msgstr "" -#: superset/views.py:232 superset/views.py:295 superset/views.py:335 -#: superset/views.py:537 superset/views.py:691 +#: superset/views.py:371 superset/views.py:456 superset/views.py:496 +#: superset/views.py:1042 superset/views.py:1266 msgid "Description" msgstr "" -#: superset/views.py:233 superset/views.py:262 +#: superset/views.py:372 superset/views.py:402 msgid "Groupable" msgstr "" -#: superset/views.py:234 superset/views.py:263 +#: superset/views.py:373 superset/views.py:403 msgid "Filterable" msgstr "" -#: superset/views.py:235 superset/views.py:299 superset/views.py:433 -#: superset/views.py:543 +#: superset/views.py:374 superset/views.py:460 superset/views.py:891 +#: superset/views.py:1048 msgid "Table" msgstr "" -#: superset/views.py:236 superset/views.py:264 +#: superset/views.py:375 superset/views.py:404 msgid "Count Distinct" msgstr "" -#: superset/views.py:237 superset/views.py:265 +#: superset/views.py:376 superset/views.py:405 msgid "Sum" msgstr "" -#: superset/views.py:238 superset/views.py:266 +#: superset/views.py:377 superset/views.py:406 msgid "Min" msgstr "" -#: superset/views.py:239 superset/views.py:267 +#: superset/views.py:378 superset/views.py:407 msgid "Max" msgstr "" -#: superset/views.py:240 +#: superset/views.py:379 msgid "Expression" msgstr "" -#: superset/views.py:241 +#: superset/views.py:380 msgid "Is temporal" msgstr "" -#: superset/views.py:242 +#: superset/views.py:381 msgid "Datetime Format" msgstr "" -#: superset/views.py:243 +#: superset/views.py:382 msgid "Database Expression" msgstr "" -#: superset/views.py:260 superset/views.py:297 superset/views.py:337 -#: superset/views.py:568 +#: superset/views.py:400 superset/views.py:458 superset/views.py:498 msgid "Type" msgstr "" -#: superset/views.py:261 superset/views.py:536 +#: superset/views.py:401 superset/views.py:958 superset/views.py:1041 msgid "Datasource" msgstr "" -#: superset/views.py:286 superset/views.py:328 +#: superset/views.py:440 superset/views.py:489 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 " "metric)' are allowed to access this metric" msgstr "" -#: superset/views.py:298 +#: superset/views.py:459 msgid "SQL Expression" msgstr "" -#: superset/views.py:338 superset/views.py:656 +#: superset/views.py:499 superset/views.py:1215 msgid "JSON" msgstr "" -#: superset/views.py:339 +#: superset/views.py:500 msgid "Druid Datasource" msgstr "" -#: superset/views.py:378 superset/views.py:435 -msgid "Database" +#: superset/views.py:545 +msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/views.py:379 -msgid "SQL link" +#: superset/views.py:546 +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 " +"(<~1 minute)" +msgstr "" + +#: superset/views.py:550 +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." +msgstr "" + +#: superset/views.py:554 +msgid "Allow CREATE TABLE AS option in SQL Lab" +msgstr "" + +#: superset/views.py:555 +msgid "" +"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" +" SQL Lab" +msgstr "" + +#: superset/views.py:559 +msgid "" +"When allowing CREATE TABLE AS option in SQL Lab, this option forces the " +"table to be created in this schema" +msgstr "" + +#: superset/views.py:573 +msgid "Expose in SQL Lab" +msgstr "" + +#: superset/views.py:574 +msgid "Allow CREATE TABLE AS" +msgstr "" + +#: superset/views.py:575 +msgid "Allow DML" +msgstr "" + +#: superset/views.py:576 +msgid "CTAS Schema" +msgstr "" + +#: superset/views.py:577 superset/views.py:893 +msgid "Database" msgstr "" -#: superset/views.py:380 superset/views.py:534 superset/views.py:610 +#: superset/views.py:578 superset/views.py:1039 superset/views.py:1143 msgid "Creator" msgstr "" -#: superset/views.py:381 superset/views.py:436 +#: superset/views.py:579 superset/views.py:894 msgid "Last Changed" msgstr "" -#: superset/views.py:382 +#: superset/views.py:580 msgid "SQLAlchemy URI" msgstr "" -#: superset/views.py:383 superset/views.py:442 superset/views.py:533 -#: superset/views.py:697 +#: superset/views.py:581 superset/views.py:899 superset/views.py:1038 +#: superset/views.py:1272 msgid "Cache Timeout" msgstr "" -#: superset/views.py:384 +#: superset/views.py:582 msgid "Extra" msgstr "" -#: superset/views.py:434 -msgid "Changed By" +#: superset/views.py:637 +msgid "CSV File" msgstr "" -#: superset/views.py:437 -msgid "SQL Editor" +#: superset/views.py:637 +msgid "Select a CSV file to be uploaded to a database." msgstr "" -#: superset/views.py:438 superset/views.py:693 -msgid "Is Featured" +#: superset/views.py:638 +msgid "CSV Files Only!" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter used by CSV file (for whitespace use \\s+)." +msgstr "" + +#: superset/views.py:641 +msgid "Header Row" +msgstr "" + +#: superset/views.py:641 +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/views.py:644 +msgid "Column Names" +msgstr "" + +#: superset/views.py:644 +msgid "" +"List of comma-separated column names to use if header row not specified " +"above. Leave empty if header field populated." +msgstr "" + +#: superset/views.py:647 +msgid "Index Column" +msgstr "" + +#: superset/views.py:647 +msgid "" +"Column to use as the row labels of the dataframe. Leave empty if no index" +" column." +msgstr "" + +#: superset/views.py:650 +msgid "Squeeze" +msgstr "" + +#: superset/views.py:650 +msgid "" +"Parse the data as a series (specify this option if the data contains only" +" one column." +msgstr "" + +#: superset/views.py:652 +msgid "Prefix" +msgstr "" + +#: superset/views.py:652 +msgid "" +"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " +"X1\")." +msgstr "" + +#: superset/views.py:655 +msgid "Mangle Duplicate Columns" +msgstr "" + +#: superset/views.py:655 +msgid "Specify duplicate columns as \"X.0, X.1\"." +msgstr "" + +#: superset/views.py:657 +msgid "Skip Initial Space" +msgstr "" + +#: superset/views.py:657 +msgid "Skip spaces after delimiter." +msgstr "" + +#: superset/views.py:658 +msgid "Skip Rows" +msgstr "" + +#: superset/views.py:658 +msgid "Number of rows to skip at start of file." +msgstr "" + +#: superset/views.py:660 +msgid "Rows to Read" +msgstr "" + +#: superset/views.py:660 +msgid "Number of rows of file to read." +msgstr "" + +#: superset/views.py:662 +msgid "Skip Blank Lines" +msgstr "" + +#: superset/views.py:662 +msgid "Skip blank lines rather than interpreting them as NaN values." +msgstr "" + +#: superset/views.py:664 +msgid "Parse Dates" +msgstr "" + +#: superset/views.py:664 +msgid "Parse date values." +msgstr "" + +#: superset/views.py:665 +msgid "Infer Datetime Format" +msgstr "" + +#: superset/views.py:665 +msgid "Use Pandas to interpret the datetime format automatically." +msgstr "" + +#: superset/views.py:667 +msgid "Day First" +msgstr "" + +#: superset/views.py:667 +msgid "Use DD/MM (European/International) date format." +msgstr "" + +#: superset/views.py:668 +msgid "Thousands Separator" +msgstr "" + +#: superset/views.py:668 +msgid "Separator for values in thousands." +msgstr "" + +#: superset/views.py:670 +msgid "Decimal Character" +msgstr "" + +#: superset/views.py:670 +msgid "Character to interpret as decimal point." +msgstr "" + +#: superset/views.py:672 +msgid "Quote Character" +msgstr "" + +#: superset/views.py:672 +msgid "Character used to denote the start and end of a quoted item." +msgstr "" + +#: superset/views.py:675 +msgid "Escape Character" +msgstr "" + +#: superset/views.py:675 +msgid "Character used to escape a quoted item." +msgstr "" + +#: superset/views.py:677 +msgid "Comment Character" +msgstr "" + +#: superset/views.py:677 +msgid "Character used to denote the start of a comment." +msgstr "" + +#: superset/views.py:679 +msgid "Encoding" +msgstr "" + +#: superset/views.py:679 +msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." +msgstr "" + +#: superset/views.py:681 +msgid "Error On Bad Lines" +msgstr "" + +#: superset/views.py:681 +msgid "" +"Error on bad lines (e.g. a line with too many commas). If false these bad" +" lines will instead be dropped from the resulting dataframe." +msgstr "" + +#: superset/views.py:687 +msgid "Table Name" msgstr "" -#: superset/views.py:439 +#: superset/views.py:687 +msgid "Name of table to be created from csv data." +msgstr "" + +#: superset/views.py:689 +msgid "Database URI" +msgstr "" + +#: superset/views.py:689 +msgid "URI of database in which to add above table." +msgstr "" + +#: superset/views.py:691 superset/views.py:896 msgid "Schema" msgstr "" -#: superset/views.py:440 superset/views.py:695 +#: superset/views.py:691 +msgid "Specify a schema (if database flavour supports this)." +msgstr "" + +#: superset/views.py:693 +msgid "Table Exists" +msgstr "" + +#: superset/views.py:693 +msgid "" +"If table exists do one of the following: Fail (do nothing), Replace (drop" +" and recreate table) or Append (insert data)." +msgstr "" + +#: superset/views.py:696 +msgid "Fail" +msgstr "" + +#: superset/views.py:696 +msgid "Replace" +msgstr "" + +#: superset/views.py:696 +msgid "Append" +msgstr "" + +#: superset/views.py:698 +msgid "Dataframe Index" +msgstr "" + +#: superset/views.py:698 +msgid "Write dataframe index as a column." +msgstr "" + +#: superset/views.py:699 +msgid "Column Label(s)" +msgstr "" + +#: superset/views.py:699 +msgid "" +"Column label for index column(s). If None is given and Dataframe Index is" +" True, Index Names are used." +msgstr "" + +#: superset/views.py:702 +msgid "Chunksize" +msgstr "" + +#: superset/views.py:702 +msgid "" +"If not None, rows will be written in batches of this size at a time. If " +"None, all rows will be written at once." +msgstr "" + +#: superset/views.py:709 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views.py:792 +msgid "CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"" +msgstr "" + +#: superset/views.py:875 superset/views.py:1257 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: superset/views.py:876 +msgid "Name of the table that exists in the source database" +msgstr "" + +#: superset/views.py:878 +msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" +msgstr "" + +#: superset/views.py:884 +msgid "" +"This fields acts a Superset view, meaning that Superset will run a query " +"against this string as a subquery." +msgstr "" + +#: superset/views.py:892 +msgid "Changed By" +msgstr "" + +#: superset/views.py:895 superset/views.py:1268 +msgid "Is Featured" +msgstr "" + +#: superset/views.py:897 superset/views.py:1270 msgid "Default Endpoint" msgstr "" -#: superset/views.py:441 +#: superset/views.py:898 msgid "Offset" msgstr "" -#: superset/views.py:482 superset/views.py:690 +#: superset/views.py:927 +msgid "" +"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." +msgstr "" + +#: superset/views.py:955 superset/views.py:1212 +msgid "User" +msgstr "" + +#: superset/views.py:956 +msgid "User Roles" +msgstr "" + +#: superset/views.py:957 +msgid "Database URL" +msgstr "" + +#: superset/views.py:959 +msgid "Roles to grant" +msgstr "" + +#: superset/views.py:960 +msgid "Created On" +msgstr "" + +#: superset/views.py:982 superset/views.py:1265 msgid "Cluster" msgstr "" -#: superset/views.py:483 +#: superset/views.py:983 msgid "Coordinator Host" msgstr "" -#: superset/views.py:484 +#: superset/views.py:984 msgid "Coordinator Port" msgstr "" -#: superset/views.py:485 +#: superset/views.py:985 msgid "Coordinator Endpoint" msgstr "" -#: superset/views.py:486 +#: superset/views.py:986 msgid "Broker Host" msgstr "" -#: superset/views.py:487 +#: superset/views.py:987 msgid "Broker Port" msgstr "" -#: superset/views.py:488 +#: superset/views.py:988 msgid "Broker Endpoint" msgstr "" -#: superset/views.py:522 +#: superset/views.py:1027 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -1286,561 +1758,562 @@ msgid "" "parameters." msgstr "" -#: superset/views.py:527 +#: superset/views.py:1032 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/templates/superset/welcome.html:26 superset/views.py:535 +#: superset/views.py:1040 msgid "Dashboards" msgstr "" -#: superset/views.py:538 +#: superset/views.py:1043 msgid "Last Modified" msgstr "" -#: superset/views.py:539 superset/views.py:609 +#: superset/views.py:1044 superset/views.py:1142 msgid "Owners" msgstr "" -#: superset/views.py:540 +#: superset/views.py:1045 msgid "Parameters" msgstr "" -#: superset/views.py:541 superset/views.py:569 +#: superset/views.py:1046 superset/views.py:1091 msgid "Slice" msgstr "" -#: superset/views.py:542 +#: superset/views.py:1047 msgid "Name" msgstr "" -#: superset/views.py:544 superset/views.py:570 +#: superset/views.py:1049 msgid "Visualization Type" msgstr "" -#: superset/views.py:586 +#: superset/views.py:1070 +msgid "Click on a {} link to create a Slice" +msgstr "" + +#: superset/views.py:1115 msgid "" "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" msgstr "" -#: superset/views.py:591 +#: superset/views.py:1120 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: superset/views.py:595 +#: superset/views.py:1124 msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/views.py:596 +#: superset/views.py:1125 msgid "" "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." msgstr "" -#: superset/views.py:601 +#: superset/views.py:1130 msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/views.py:605 +#: superset/views.py:1138 msgid "Dashboard" msgstr "" -#: superset/views.py:606 +#: superset/views.py:1139 msgid "Title" msgstr "" -#: superset/views.py:607 +#: superset/views.py:1140 msgid "Slug" msgstr "" -#: superset/views.py:608 +#: superset/views.py:1141 msgid "Slices" msgstr "" -#: superset/views.py:611 +#: superset/views.py:1144 msgid "Modified" msgstr "" -#: superset/views.py:612 +#: superset/views.py:1145 msgid "Position JSON" msgstr "" -#: superset/views.py:613 +#: superset/views.py:1146 msgid "CSS" msgstr "" -#: superset/views.py:614 +#: superset/views.py:1147 msgid "JSON Metadata" msgstr "" -#: superset/views.py:615 +#: superset/views.py:1148 msgid "Underlying Tables" msgstr "" -#: superset/views.py:653 -msgid "User" -msgstr "" - -#: superset/views.py:654 +#: superset/views.py:1213 msgid "Action" msgstr "" -#: superset/views.py:655 +#: superset/views.py:1214 msgid "dttm" msgstr "" -#: superset/views.py:683 -msgid "Timezone offset (in hours) for this datasource" -msgstr "" - -#: superset/views.py:689 +#: superset/views.py:1264 msgid "Data Source" msgstr "" -#: superset/views.py:692 +#: superset/views.py:1267 msgid "Owner" msgstr "" -#: superset/views.py:694 +#: superset/views.py:1269 msgid "Is Hidden" msgstr "" -#: superset/views.py:696 +#: superset/views.py:1271 msgid "Time Offset" msgstr "" -#: superset/views.py:1176 -msgid "This view requires the `all_datasource_access` permission" -msgstr "" - -#: superset/views.py:1249 -msgid "Refresh Druid Metadata" -msgstr "" - -#: superset/viz.py:367 +#: superset/viz.py:408 msgid "Table View" msgstr "" -#: superset/viz.py:370 +#: superset/viz.py:411 msgid "GROUP BY" msgstr "" -#: superset/viz.py:371 +#: superset/viz.py:412 msgid "Use this section if you want a query that aggregates" msgstr "" -#: superset/viz.py:374 +#: superset/viz.py:415 msgid "NOT GROUPED BY" msgstr "" -#: superset/viz.py:375 +#: superset/viz.py:416 msgid "Use this section if you want to query atomic rows" msgstr "" -#: superset/viz.py:378 +#: superset/viz.py:419 msgid "Options" msgstr "" -#: superset/viz.py:429 +#: superset/viz.py:472 msgid "Pivot Table" msgstr "" -#: superset/viz.py:491 +#: superset/viz.py:534 msgid "Markup" msgstr "" -#: superset/viz.py:519 +#: superset/viz.py:558 +msgid "Separator" +msgstr "" + +#: superset/viz.py:581 msgid "Word Cloud" msgstr "" -#: superset/viz.py:551 +#: superset/viz.py:613 msgid "Treemap" msgstr "" -#: superset/viz.py:561 superset/viz.py:676 superset/viz.py:783 superset/viz.py:948 -#: superset/viz.py:1093 superset/viz.py:1122 superset/viz.py:1177 -#: superset/viz.py:1682 +#: superset/viz.py:623 superset/viz.py:738 superset/viz.py:845 +#: superset/viz.py:1011 superset/viz.py:1163 superset/viz.py:1192 +#: superset/viz.py:1314 superset/viz.py:1825 msgid "Chart Options" msgstr "" -#: superset/viz.py:595 +#: superset/viz.py:657 msgid "Calendar Heatmap" msgstr "" -#: superset/viz.py:666 +#: superset/viz.py:728 msgid "Box Plot" msgstr "" -#: superset/viz.py:773 +#: superset/viz.py:835 msgid "Bubble Chart" msgstr "" -#: superset/viz.py:842 +#: superset/viz.py:904 msgid "Big Number with Trendline" msgstr "" -#: superset/viz.py:892 +#: superset/viz.py:954 msgid "Big Number" msgstr "" -#: superset/viz.py:938 +#: superset/viz.py:1000 msgid "Time Series - Line Chart" msgstr "" -#: superset/viz.py:958 +#: superset/viz.py:1022 msgid "Advanced Analytics" msgstr "" -#: superset/viz.py:959 +#: superset/viz.py:1023 msgid "" "This section contains options that allow for advanced analytical post " "processing of query results" msgstr "" -#: superset/viz.py:1091 +#: superset/viz.py:1161 msgid "Time Series - Bar Chart" msgstr "" -#: superset/viz.py:1111 +#: superset/viz.py:1181 msgid "Time Series - Percent Change" msgstr "" -#: superset/viz.py:1119 +#: superset/viz.py:1189 msgid "Time Series - Stacked" msgstr "" -#: superset/viz.py:1138 +#: superset/viz.py:1208 msgid "Distribution - NVD3 - Pie Chart" msgstr "" -#: superset/viz.py:1174 +#: superset/viz.py:1246 +msgid "Histogram" +msgstr "" + +#: superset/viz.py:1255 +msgid "Histogram Options" +msgstr "" + +#: superset/viz.py:1263 +msgid "Numeric Column" +msgstr "" + +#: superset/viz.py:1264 +msgid "Select the numeric column to draw the histogram" +msgstr "" + +#: superset/viz.py:1267 +msgid "No of Bins" +msgstr "" + +#: superset/viz.py:1268 +msgid "Select number of bins for the histogram" +msgstr "" + +#: superset/viz.py:1311 msgid "Distribution - Bar Chart" msgstr "" -#: superset/viz.py:1195 +#: superset/viz.py:1332 msgid "Breakdowns" msgstr "" -#: superset/viz.py:1196 +#: superset/viz.py:1333 msgid "Defines how each series is broken down" msgstr "" -#: superset/viz.py:1261 +#: superset/viz.py:1398 msgid "Sunburst" msgstr "" -#: superset/viz.py:1276 +#: superset/viz.py:1413 msgid "Primary Metric" msgstr "" -#: superset/viz.py:1277 +#: superset/viz.py:1414 msgid "The primary metric is used to define the arc segment sizes" msgstr "" -#: superset/viz.py:1282 +#: superset/viz.py:1419 msgid "Secondary Metric" msgstr "" -#: superset/viz.py:1283 +#: superset/viz.py:1420 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" msgstr "" -#: superset/viz.py:1289 +#: superset/viz.py:1426 msgid "Hierarchy" msgstr "" -#: superset/viz.py:1290 +#: superset/viz.py:1427 msgid "This defines the level of the hierarchy" msgstr "" -#: superset/viz.py:1327 +#: superset/viz.py:1463 msgid "Sankey" msgstr "" -#: superset/viz.py:1340 superset/viz.py:1410 +#: superset/viz.py:1476 superset/viz.py:1546 msgid "Source / Target" msgstr "" -#: superset/viz.py:1341 superset/viz.py:1411 +#: superset/viz.py:1477 superset/viz.py:1547 msgid "Choose a source and a target" msgstr "" -#: superset/viz.py:1391 +#: superset/viz.py:1527 msgid "Directed Force Layout" msgstr "" -#: superset/viz.py:1402 +#: superset/viz.py:1538 msgid "Force Layout" msgstr "" -#: superset/viz.py:1433 +#: superset/viz.py:1569 msgid "World Map" msgstr "" -#: superset/viz.py:1444 +#: superset/viz.py:1580 msgid "Bubbles" msgstr "" -#: superset/viz.py:1453 +#: superset/viz.py:1589 msgid "Country Field" msgstr "" -#: superset/viz.py:1454 +#: superset/viz.py:1590 msgid "3 letter code of the country" msgstr "" -#: superset/viz.py:1457 +#: superset/viz.py:1593 msgid "Metric for color" msgstr "" -#: superset/viz.py:1458 +#: superset/viz.py:1594 msgid "Metric that defines the color of the country" msgstr "" -#: superset/viz.py:1461 +#: superset/viz.py:1597 msgid "Bubble size" msgstr "" -#: superset/viz.py:1462 +#: superset/viz.py:1598 msgid "Metric that defines the size of the bubble" msgstr "" -#: superset/templates/superset/explore.html:147 superset/viz.py:1507 +#: superset/viz.py:1648 msgid "Filters" msgstr "" -#: superset/viz.py:1519 +#: superset/viz.py:1661 msgid "Filter fields" msgstr "" -#: superset/viz.py:1520 +#: superset/viz.py:1662 msgid "The fields you want to filter on" msgstr "" -#: superset/viz.py:1555 +#: superset/viz.py:1698 msgid "iFrame" msgstr "" -#: superset/viz.py:1573 +#: superset/viz.py:1716 msgid "Parallel Coordinates" msgstr "" -#: superset/viz.py:1609 +#: superset/viz.py:1752 msgid "Heatmap" msgstr "" -#: superset/viz.py:1622 +#: superset/viz.py:1765 msgid "Heatmap Options" msgstr "" -#: superset/viz.py:1677 +#: superset/viz.py:1820 msgid "Horizon Charts" msgstr "" -#: superset/viz.py:1693 +#: superset/viz.py:1836 msgid "Mapbox" msgstr "" -#: superset/viz.py:1707 +#: superset/viz.py:1850 msgid "Points" msgstr "" -#: superset/viz.py:1713 +#: superset/viz.py:1856 msgid "Labelling" msgstr "" -#: superset/viz.py:1719 +#: superset/viz.py:1862 msgid "Visual Tweaks" msgstr "" -#: superset/viz.py:1726 +#: superset/viz.py:1869 msgid "Viewport" msgstr "" -#: superset/viz.py:1736 +#: superset/viz.py:1879 msgid "Longitude" msgstr "" -#: superset/viz.py:1737 +#: superset/viz.py:1880 msgid "Column containing longitude data" msgstr "" -#: superset/viz.py:1740 +#: superset/viz.py:1883 msgid "Latitude" msgstr "" -#: superset/viz.py:1741 +#: superset/viz.py:1884 msgid "Column containing latitude data" msgstr "" -#: superset/viz.py:1744 +#: superset/viz.py:1887 msgid "Cluster label aggregator" msgstr "" -#: superset/viz.py:1745 +#: superset/viz.py:1888 msgid "" "Aggregate function applied to the list of points in each cluster to " "produce the cluster label." msgstr "" -#: superset/viz.py:1750 +#: superset/viz.py:1893 msgid "Tooltip" msgstr "" -#: superset/viz.py:1751 +#: superset/viz.py:1894 msgid "Show a tooltip when hovering over points and clusters describing the label" msgstr "" -#: superset/viz.py:1756 +#: superset/viz.py:1899 msgid "" "One or many fields to group by. If grouping, latitude and longitude " "columns must be present." msgstr "" -#: superset/templates/appbuilder/navbar_right.html:36 +#: superset/templates/appbuilder/navbar_right.html:41 msgid "Profile" msgstr "" -#: superset/templates/appbuilder/navbar_right.html:37 +#: superset/templates/appbuilder/navbar_right.html:42 msgid "Logout" msgstr "" -#: superset/templates/appbuilder/navbar_right.html:42 +#: superset/templates/appbuilder/navbar_right.html:47 msgid "Login" msgstr "" -#: superset/templates/superset/explore.html:34 -#: superset/templates/superset/explore.html:241 -msgid "Query" +#: superset/templates/superset/request_access.html:2 +msgid "No Access!" msgstr "" -#: superset/templates/superset/explore.html:43 -#: superset/templates/superset/explore.html:306 -msgid "Save" +#: superset/templates/superset/request_access.html:7 +#, python-format +msgid "You do not have permissions to access the datasource(s): %(name)s." msgstr "" -#: superset/templates/superset/explore.html:72 -msgid "Force refresh" +#: superset/templates/superset/request_access.html:13 +msgid "Request Permissions" msgstr "" -#: superset/templates/superset/explore.html:77 -msgid "Short URL" -msgstr "" - -#: superset/templates/superset/explore.html:79 -msgid "Generate an embeddable iframe" +#: superset/templates/superset/request_access.html:16 +msgid "Cancel" msgstr "" -#: superset/templates/superset/explore.html:82 -msgid "Export to .json" +#: superset/templates/superset/models/database/macros.html:4 +msgid "Test Connection" msgstr "" -#: superset/templates/superset/explore.html:86 -msgid "Export to .csv format" -msgstr "" +#~ msgid "" +#~ "D3 format syntax for numbers https: //github.com/mbostock/\n" +#~ "d3/wiki/Formatting" +#~ msgstr "" -#: superset/templates/superset/explore.html:92 -msgid "Query timer" -msgstr "" +#~ msgid "" +#~ "Defines the grouping of entities. Each" +#~ " serie is shown as a specific " +#~ "color on the chart and has a " +#~ "legend toggle" +#~ msgstr "" -#: superset/templates/superset/explore.html:94 -msgid "0 sec" -msgstr "" +#~ msgid "" +#~ "D3 format syntax for y axis https: //github.com/mbostock/\n" +#~ "d3/wiki/Formatting" +#~ msgstr "" -#: superset/templates/superset/explore.html:100 -msgid "View database query" -msgstr "" +#~ msgid "SQL link" +#~ msgstr "" -#: superset/templates/superset/explore.html:101 -msgid "query" -msgstr "" +#~ msgid "SQL Editor" +#~ msgstr "" -#: superset/templates/superset/explore.html:150 -msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" -msgstr "" +#~ msgid "This view requires the `all_datasource_access` permission" +#~ msgstr "" -#: superset/templates/superset/explore.html:168 -msgid "Add filter" -msgstr "" +#~ msgid "Refresh Druid Metadata" +#~ msgstr "" -#: superset/templates/superset/explore.html:247 -#: superset/templates/superset/explore.html:265 -msgid "Close" -msgstr "" +#~ msgid "Calender Heatmap" +#~ msgstr "" -#: superset/templates/superset/explore.html:259 -msgid "Datasource Description" -msgstr "" +#~ msgid "Query" +#~ msgstr "" -#: superset/templates/superset/explore.html:277 -msgid "Save a Slice" -msgstr "" +#~ msgid "Save" +#~ msgstr "" -#: superset/templates/superset/explore.html:309 -msgid "Save & go to dashboard" -msgstr "" +#~ msgid "Force refresh" +#~ msgstr "" -#: superset/templates/superset/explore.html:312 -msgid "Cancel" -msgstr "" +#~ msgid "Short URL" +#~ msgstr "" -#: superset/templates/superset/sql.html:12 -msgid "Run!" -msgstr "" +#~ msgid "Generate an embeddable iframe" +#~ msgstr "" -#: superset/templates/superset/sql.html:13 -msgid "Create View" -msgstr "" +#~ msgid "Export to .json" +#~ msgstr "" -#: superset/templates/superset/welcome.html:8 -#: superset/templates/superset/welcome.html:14 -msgid "Welcome!" -msgstr "" +#~ msgid "Export to .csv format" +#~ msgstr "" -#: superset/templates/superset/models/database/macros.html:4 -msgid "Test Connection" -msgstr "" +#~ msgid "Query timer" +#~ msgstr "" -#~ msgid "Databases" +#~ msgid "0 sec" #~ msgstr "" -#~ msgid "Sources" +#~ msgid "View database query" #~ msgstr "" -#~ msgid "Tables" +#~ msgid "query" #~ msgstr "" -#~ msgid "Druid Clusters" +#~ msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" #~ msgstr "" -#~ msgid "Action Log" +#~ msgid "Add filter" #~ msgstr "" -#~ msgid "Security" +#~ msgid "Close" #~ msgstr "" -#~ msgid "Druid Datasources" +#~ msgid "Datasource Description" #~ msgstr "" -#~ msgid "CSS Templates" +#~ msgid "Save a Slice" #~ msgstr "" -#~ msgid "Documentation" +#~ msgid "Save & go to dashboard" #~ msgstr "" -#~ msgid "Standalone version, use to embed anywhere" +#~ msgid "Run!" #~ msgstr "" -#~ msgid "Overwrite" +#~ msgid "Create View" #~ msgstr "" -#~ msgid "Save as" +#~ msgid "Welcome!" #~ msgstr "" diff --git a/superset/translations/it/LC_MESSAGES/messages.mo b/superset/translations/it/LC_MESSAGES/messages.mo index 034d5c86e1d5b786cbce880c51da60d86a84016f..8e3b09b39711caf4320cf575b01ed1aea2dae87d 100644 GIT binary patch literal 39339 zcmeI4dvs(~o$n7%p=sU^K>-iVBWX#}NjKeeH_vn@{m^tLB^n@Mx&M{IAb6PI6x<;Q(9!N8kbQG9NC$g@mhcA9yV!i{J*&H+jCr^Jb{5Z-EEFk3f~@Q&8!D z6Ds}hK;{3q=hIN-_?72xq2m7$D!&DbT)GECrF$Yg4!#!ZyFPdXd_BAjUIvHZ-@v2b zVJ8Q{(ePB*2G4@ZKL;;>Q}B)OtMGQ%cZy5*M^NSXZ&2y{5}pV5JJmh!hbqSqJQ(hT zy>JGqp7%g~|8;mMd>E?yKk|GQO1{7G;eAeX?+=Bq;Q6cJKJa9y^xB}(>4q!e`S1id z3zhEspvv(vsCKvu?ho(t&%X&(p6|hS_#`|V9)wW3;RY!A%<^Y{_~-Cd@RLyKejO^G zN1@vFadjnnDj36yq1y3YsCU45g3KPQH-~@aCUJQG>T)H>IGYH=XmH)SV_{9<@*wp{yhXGhXWCs!bd>GAB2+kR(K;U!o%P%pz0a)xc+wplzcj%(mxX(0?&cc zw*jd1FMtQbi=pCAK6+TeWvejSv2Mxpxkb}0E@2}v?|1Jw7QhtivSq4Iqi zs-6EQtivOhyXS9#YKQkirE>>Vz8{6shfhK2$%Fp=PduN6O7~Y#cJDR|{oPRd^K~fweFUnUPeO*=;902e52iD}8XgA~e>qhA zHBjXqh5SFbgg=tw`~CAf;d;WKhLYFwQ0ecB5LBLpQ1X6_51$96C&N&BHU^bn2}&Nb zQ0ZI?e*oVB6|YF+DBToF9#=uh;TEXxKMqx{yL|YoQ0Y7b_1zDl+Tka#4gMUa@Tl`# z`ZqzP^KK~p`!Lk^AM^YxC^>x1^8vVy@IOGc!!hSOJv#|5A-ohSpE0QLTcPT450u>h z7An1`q00RnRQ`YPJP_wZ;bY+I;K@+(DMRUV4NAT@LZ$nDh^T^(!sFqOq2j*?mCrtF zT)$ZW75`8uxf}$?ZibIq$XB z<-fr5FlhDhJQ+%E-B9_T<-^19G{W1V%JW9J6W$6{oGLPxzVJ)% zAb2m7d>(>_!SDI!&%jp_{xv)nF1*0C_o+~JZw=IU+x+t!)c4oH8hjV*g8L7<_E`=k z*R!D7IqzBW?`u%yx)OH4YvDfdQ}A&3U*Uf6KDY!v0M!n^g(t#gBaXxH48m8y9(X5I zx{pDX_i?Cno`DPDb5MHp0#yIlchu?o5m5P`3Kzk}a3>sqpMzh3OW`C+qI!M^s{Q^R zs$E`ynEc@6t`v0#``TrZ-3%+Wb>u1M9 zmH%X@`gB8;e+5*1`k?fB6V!Lx;r?(3)OX`h?Vmz@e=XGaH$r{)9w>eO7?k{e3Xg{W z9bN+Wy2$y1+o9xiH`MoEhDz^2&qtv0`6sA$d=jdBzlJK$i%{*i@5PQML&<3kRJvs- zeW^mz52)|1^?ValesA~h-{bjy|Netea{M?{I-l|H|Jw6QQ0d(ZbMWtc_;f0%axR4` z$5~MMp9dAc&p&^?4-Z1c-wIWp9sYd`m2VNM{#W?$4N&R4&GX%!w|jmBDxFVwei}+I zJ_jYwuRwkOAXNDtg^K@OAO0a!d7pqs!Ka|||D6vXbg4@xgwl@=&n~F%y5XmJu^c{3 z_$S+4`hRtqljq$~`QHasu5Uus|2sbXIFz0}1697~;ok6fo`3NCqvzf`oc-7js(#17 zHQs0{rWDb{J#$`fIoq6gv%qhPH+!Yx}#&R9G5`Je;l3%ukz2o1XYgv zq592_VK00Rs-E2_qw28=sz3HYm4DRpawz$he0bLLMksxI7u*Nl4wc>qq0+e%u7rOL zPk_IGO84NrE5~tA@@j*s$4dYFJgD+)g6(h{JR80NcEhhg$>$eP-@P(+>jWo4)o&G4 zKI@^{bp%QuD^T*h9-abkhARJE@L2dosCfSf_k~YE)%#~q>HWrs_a1k4=}@TrC!y+F zg^GVYd=0z>hVZkHPlHFG+Hpm}<$Dv9KD-ku-;Y7H|L1-9TkurEk3*%q&xC8=!=U7L zs^gObZrQ1PFGs_*Z7c)y}+*TbN` zI}WNmot~?q>c1Z9`wOAIAM?-4Q2KriJPhU|z1v}mIS3`!#pc9@3-vA|t zPr?K~3@KW0?xY(RJ^_{P-X%94FNDg!*M~QGUJoVTFF>{T-$S+2Poea4|0&m=r@;LP zpAJ>N9w_}=0}p`L`tVI~f5P8@lJ`UKM)(BOcX8R(XBSley9q9UAB9T))9?`ZIVgR* z4=Vk?g9pP$pyK}ss{MWj4}rge3!#K@Iye}1z*SJs$KhEpg_6r>q0;@L=Y9V9x1iGh zE>!wIhKIsupuYR9=iU`pkA+bAp9pysbi!TmgZ}wZSNL%isvK*efrk-( z7^{moGFx((|4JK!1ceyDoC0QKGeR8ryN zq4I5mlJ82Wa;<}1a2&S7_ri1GS3F;Y%I|C%SMq&5JP{7VOW_qz{qkY|{CTMIA2sdf zYsW){FNP}r7*slw@LjM9CHH-2-17x+1>wV?1=S1wQ8Acg;HeSp^U0`8ud_ZG(&80F~b@Q2O?lQ1S1ED))m>{r^!YIUaJQ zdwx7zPxxdgc}+s4e#dpM=WiF&_@DartyZ$$d3cdfTDOorlW5>Upi_ z&G2UlQoAiNHm9e|SaG*tfAdAcJ@Xw&y=P#k!`7Wq-{(w-&Y$z5<>JZ-=tCkHXX8 z0k=9mIs;Y+Z-JP);C?81pZ{K0&Ta5O!a1n?r{G@jolyPk-B9Jf9jZQeLY4nhQ1!V7 z9tyt>_1(9jzWXlJcmE94{y&5I{&}eHUx51Vz}uYO90%1dm%^iA1TTTp@M8FFC^>b# z&walXD!ubP*Foho01t=Tpvt!ssyr!F`(5dIJCvO6hD!G-D1CVbntnii_q^vHpz_=2 z{qFsNo`*oiI}%EcuYyYF6#u@%vj-~P3YdfE`0$@YmGhHO<+uwf|IhpP_xR^u^Wkqm z#eWE@Jm2;2e+ZTD6HxVk+J}D!mG54+J09S9sOK?I>73wsGL-%qRlfC5 z@n7%57eJMF3p@&543&T4!*75}=Qb$)_^9W{p}xBl25q^dUaqx;#WY+yxMlNb`)e16 z#qlr-3)Q4v3CCvjrk=+6u5fdGDy|lDQ7OzNrTSDk4X2BxQaBceQK3+c3sEi3^Qblv z)+XkjB~`vm%AMtx{aUGqwInP>V{s|0B*k(q?Ft9tXjdG@QzZ5C3GUSgzM%p3TNl)jeBk(NY)a9SM5+ zf}RaQ&!(VfG+4T1)yl9ES95W>RxHJ7uymy|agmpWrMO1Ulq?^sV5+*6vN{_q>kiX6 zmz48qusrm+WvioZc|K4Mv*GkaTn;P6T}iE2E`(7zPhqDjbqguuT2e!~s>w96wU?%4 zjU=g1qs&Z3OUZP&cDTQHv_Bl}T{F-h(r$Zv8YUG9L&`F8!9X|=jrn+en+E(ZgjY>f zvueE@meJOc{(=6rqhVS@si$c8G;H58)JI+&VIQwVmv=|l)zw9p**)!fDPB>hsq(u% zHdczmwG+`?V5E2@g>)~{x!-B9c4UPAwub94NR1z9I9M*to@C*1UWALT>b`nWSg(|l zDDS&>q&yZ~)x&eDmyc@En54hxs-;&ivJdG4ec4k?*Lbl|uSRA|){gd$gd@3$cq$6k zVszthlr~7}H9{pMN`r2QqZ&=f1B^}y)Z#*d;%<(nDCR^|E>Mg$v-(+$ax$A_hq;fd zm8$G}iVo(AQy2l0RaaBQY>>#u<)r2;51q5>w3XbY6A>E9%Y0a*)BcA(wvSL9b@4rY z5U05a1>Qr#1*=fC5KE5gJ?H`!5j8f6s1?IOvpckwg+@%T*G?n}0*}I!afuIP=%SFC zFu)PfUMe|f*m+VfPg>KjEfsT<>JU+Q)z#SO@}z{9L(vdN6prwkA~|E6(di|9!VS-i z3qFEWc{s`!>lBWGi$4q+;U*hQd|-ruK6_!Uo&~Z&U%e=BMN1xfC9<(Q&CgU7UrbKq{&R1O|i&SAoLni5xU01kqT+RxOnudkqE`}?$k2=J7l_G>2Ej}+ttM$0U z2d!|SjE|HQHFCwIbqGtTRd+@;ZzVGEsK}P;d|wCWtE^5jSFkL_OaNx@^2M}*vXPl7 zZ`kNkdV(b^rl`u0*+-;VXnva3$H$8^_5{mqrISdj#W99rzM|kNv5m&WntMYaspgC2 zsD|ho2Cey_S+(W|X4=-u#SHs!D~fm=q(Ts@u&x-F^7BLC=q$SmYfY*1m^1fNdW(OD z!QIfib>rssxO)+z%^qI3p?|nPd)Bv1J#mWhlku(=&4d%RS|we*WC?mOQ6KA~voFan zgj zn)JuQuKVj}EGteYu-`VUt+NWug`Iw)7BzWZyNWXAs1>bT!*a-?&$HB~v*@S>;i7d= zJZN>c8p4(KFhM_)hbmw%a&$|MRM$R5&9gc6Dvrx) z+cINd!)KFXnIqU?eg!f0@!X8z5~r@|_OKSu)WWf3rjh0Z$(W;$pN1o)?m4EhlOc>j zc3w28E&|iYEO(&h^jiHgE1+W7>_%lo9P;aHq}mnsN6aPWvcL(NmZK(XT|q|Uc-k&$ z^%CV{hFvCN!eW);f`+16QYc7Uyg(E)sTOfD0WwMPrVtEbW}s!-q5v{ww94To zQf6{R>s9)Yjzn<=+?Xu;)39-!p&U>tJnBFH#pbQpkj`+Zm^ov8iTUEw5k@RR;g~(D z2_n41_`IMmnPM;kJP!J*^`aXuvi|M8r?8!N^z*&NS^MNrH|e1Cfy$UWX&p7yVBQt< zmzh-(q47iQCE-fmTSnKp2^Gdtk(Nv|lq$9MxU0|=E~?kYJ6A5E4f>_tvq68g%2$JB zDxMDqBvJneT^{3+9AaiU_Hkq(-!qd0x4b-y=1)yUevBNCN)!Xd=I`9c<{4;yLy0su z$X64b{d_oH#dNC|xM_+CiF*6NFX(qZ)|~OdrpiS^VA*udKQY<#t=a8OW`Fx}%MQ{TSE4!#gv(X4u_N9x>X5^18!yl({K5nz(>g7tnC$NjLn;-urZg~Q2okooJL4Tp6D-72c)CT4>T)F#0) zOwIk8i-l3U678{Glm@s?8lmJqVPVv(Gfz>PS;JN%p|PmO%pr9>04r|tWU$5srV}*$ zFPm}gIT0c!%r3f=pBwyQW?)#(JdP)xo0rTuw$G+)t3&BP*v@N;r~bCMBOH!#o-hsV zQc*J|SPbV%TbgvyYUpOF>bVRFHB(u-)5bE3O?aFmHWD?0e$(6@XbnxXTwoLS18rBxIm(S6l2hJ~;k%0QG&$9R0UN)90hxT~w(d6J_O&$2tra=% zg(?HgN9d+F_S4Pk5{)yc2;&%;5e2(28|IgF?M(H>B&&SoLT$qRW)jKotRK*)+|!?2i@E{9i=Dc;kAoA8&H$F6**gb5Svv&SF?4yxH((+fT>Uxy-}g zoP@o&WNCU*z)w96r_o}TDe6^(PpUT0U4wDpClij6MvY#Z+6Hdn$xlSG5Hd2W2+eDv z%o@5$sj;YK?^)EswJ%^qyIBQ@SY}5mJkY#L^Nii1YkZh2V#LsMTM+T-H>b;(Q89Ii zCKm2u9xVgqY)Lw= z3{$ouVy4BLx?m6&SN@czbdZrf+ks%M&~0Eaf~izm$6#Wy#>>3ho^lZ@TN)ayG8W5r z584DF7~B(lgw)M@Q)P96G|~D_FjbC#l7<70c23S;R42j;rpk57_ieE~2x^baQ<0 z=?NC2w5+YEtm#ocn^<=RL(15j`XS_E9VxY9s4tYX+BK2ni8ucpF8@oORqN>H5cVH; zs)Tm=6^S^tha^O4^plZ5BW?DZ9vnM2DOGv&TFP!6o8mCTb2H0!H(2-?bGCEfye*5Y zrILtVkF&v+hCB|ZIHcnxbh*&!#-%(Js6xipc6SLjsE9 znu{oGmxQC{xeaMGn!&ADn6S~XX+|6jY1=GY(`ycdTgt_ndrgM6xn@e}x6HhkR~SQOJ3ZVkk+OVKADTKQdHhK%WU5)QO|KS$ii9zf$k*3kJ*&$$oOOZIR7k z7H#Y92)FfUmNHaj-IqlnH_Q-BWF&(jrbVt3X<$fM`mjf8y7`Z-HElwsPfVt^C8r5@ zaDkSE%}=#e=U{mK8rdb*m4@Xku?%7hFs`|VW82%><_u)ug1dV|+q`pbHk8U^XR`HB zvr;u%A9Uu_b_k|5v%vYNj%%7bXB%knS$#cKWLPgVal@^(*%bz);oeUd^EgJCJFPVo zzg_2TmZhi6Ttp?=$O^TfZOZg?^VYS)#+)4QxQnXcotpLW{xDD6z6}a$1xgs*hGXAT zky1(Rqn_G$xPdO(2n?%l4i{NO8BLN>tyl?$6DB>*#4~+X&^*;)cKU2E%YK*w*(M>S zW!H&K9X~MVN=cpk5Ss6K**N7i$`Y5`*RbH;8*FE?lww_2;BvEB47EBii@dwJe+Z5R z1R~F=DFZR$Ax~TV&@anpnDIJbQmX%&m;MO$mb5c68*1@yBq~qFvw`0$aiBTfKDx6T zR4z@h;wq8+4YrVqjLmeh8f*2~U(_z0D2}`RjlMNYgAq2X5iDCw{6rM&w={aoh%MKk zFpVV{r;^QEKdfB%yt+t0%R5cGX=5^I*|e557C-0n@uXR0w|(!8oti6Oji#;FHOH@D zm{}br2mi}bwdtvEQMMn^evI&l8C(yxj%3xckQ4iemVBHeoCX%ygmsjCw*YfSr)AEG znUKm$ImGOMfI3>k(&cS6in=;S#|%g?!kTm(jL3yrgVkk9VrwJzU?ZlpNQW8GvX+Y@ zRdBz?EH>&)<56jp2x-vK+{_0@(dRRzmfsw0Zj3&bw5^me?u=`=WVCjxY)HlSaqKVo zlypLp>RCiYOhwG>WTd7&Z1(l6i1o3&TM!$m zkGUQijM#p|Tn~43mQqz3BW5;}B=QvhmB;E@m>#JUBXEPC{iV}suJ0aYX4}27S%LdG zihqPJJXHx2E&A>#Q zJyN$^b%~$fZTCIfrONi4GACY%+0Vhv03*^6tDJE7D zU#_4XU0Yp3SxCFe8Y$->paKT?F-V4JetDvu_A zc>F9xxVJP|N65Ar@|cdavM<5o8cWHV%&Tw2_H%o>ySo>=fjp-zEMoc=_XT8-Y7%<( z9bTsTr_v@9Eoo4XMiCj&`l$nUB+AS*4d!~S+NG_xUQ5_NVDVhr8=BlHHM*bqjIsu{ zeXB=Sa#Y{f&&f`oWu_Ko((#;z_piB6HccTfE2K+T>Oe=dBx*KG*96+n(YwN4zkx-K zZC$rE%`BH~6e)kxu>E2KHD*I~2IG#kbOQ&hatT*od}nz68^a55PZde(WX zV@37?@Q>!C?jpM78`M`vxkfi`>d&$;Wgs=v87Y*GE%uf$>hw0B3oV9?GK1tctJHkn z7taoMnJUk9y}A5dE2&b=`)vQ=n%UN^bVWuZElQ_eI<=>JQIEEs#<4>>eVd(#bbE%` z?7rHyhZf9P-yisfX6LrXVx+^pV(V9S*jO~#+;`gKtCnl3hO8aQ@0Q#Dt9s3M zU6_mi|EP;MT53zCW#+fg^e84WX4|YWG~+_CMPt>^dX&B?#k*J(vQab+CmI`f7SDTB zEPANtHhPJgt;5!qU4u6}i?+z1Q?NSorbDOmESvLDHKC!`)WQqe@U z5T0hc(V4+$WN0evgz9$ZHER63{w0PDtMsafz}ltsT$~ zjXNZRDl_TO9=U5qGY~Qgyr4X`+J^h$7aZMjLN}7pb8&*ykD~01cjV7_W08=8ofVSj znw0-U{=JDV~8xu)iByV-r*_<;2)9nbfhpS!*E6IB0Hiz@D? zt(YTvjbn2Mg^&#eoj-kSJg}8`=L2}V=e;%NOH3eLQkZkeTtnYWR^PKBn(<6sOKy3a zzfa)C=w)^*A!UdrQ+C(2p{<=0o4O$JYP#53y(SgWijF^MGFq%@8kJp?(9V+iGMZUR zORV7l@4b^4AKEH${&wuJ&(-OU`(46X6n9;)+{x`;dwY|$!W zX;yU}Rh}tNm_`R%7=ZfvmTcM-w)fZBXJ;>K$wnRabsJexX|XbKLW}Us72odwm=Y2b zpP6|eJxCF2QXn;!=0Qwppc}#5r_4!`f}7rW3B{pXrnQv!^!g&VajJ|>o>`Y;okT9B zKk?&wj+=gEmnW#>zxNU4_tukQGF4?g(Y~navubFoqJbTM54OhDF&%fY^$RUg*iQUb zb9KYfY0iuELCrM@F8WVQxkLK!@;?bfDhm-I|>^DZ9W;FI2GNtZCltb^}v}?M`_M&ahth3R(F?M zR;alW&6OF|w$*3v-`hyz>dZm*lI*lONE~!%RI}lp;T-AczIKGDR7K@*iz=Kc+*5QF z*cJ&HmvzEGJYgc4SS61x~|)0X^JqV{bjowVC!MZfTd*zc)v+Rna6p}$0LN1JYx_*jJ`x(^ zlr@Lkw%IxU(CjWM5nL2p=`-BZCjx&u}2iqc#!wdQE_ zG^gBdh~j+x>hRQdb=AeJT3pNp8v8TfgVkVkiIlJqSGR|AXAsCiJE}4o^KbfilSL1m z+W~h6*qdf=D5yWsdiglLE~#E_?k@|1Oi7n8%IqrQ%y2O5ay+o<+QjAR@$K_p;+OO& zhIK3#fsZ>I9|xG4K;u%_J~EZCF0?qXNop{LQ7Hv%7vv^)Fp_fhaE$YU?&pqK%nMs+ zIhJxb;86=@JnC!b&< zDsjvTcO+nu-|qalKy9iN6xV6e8L*#Qh&$b`s0}_NBXeGsGuDhHQF#|C?&l3Q#%7Zn zbyXQP4th^((DVzJY>t}&RqBCuU!rQj&avIL;>S#&Gc){Qg&8m(=RaNdoZ{viD}?rg z6K5Zdu!%{%trUpQV&x2HN;{X>iH_6|8yohG`9dtAP$!*qH>V>p(G+7>Sm45$cmvSBLBmOWPBS zUZI2v;yu)A#qez00(;&?%g#MNzradNN!K>cB`J3(Vl_*ljX>upBG!}e?16#vOU16F zS~z#XP)VogJJ;bYrmMqp#e(TMOV46ftvBbim&23Jp+hg.yN$a=cE7p!GuU}Wo* zH@w=`ikGm-Q!Jll_8wpS96MV*7f+RAb)z#oue~~4$pYkp_1S7m=bG8o%xSRI;nJ>U zU1uz4-MY5B*{xgGty|aTFSKr5Goxj>z|ZAcx2{{auKm5CpmpoI`8s#&*0uAeSx^>;Ub=`C) zqQ7;Ub((^~C^<^N-D2bRB8t%hs*y)~)LjcNa9% zZQZ)oKi|;0b=|sk{h#g{xz5}Bb?dry>zXUNty|Yz&1&7cZr!?e|2jhRRc#hA zTeq%lN4|CI+TTT=yQHm!hvv)8ty|aGKY1NSty|ZvTi2~y*YV3-t8U%8wxhykKwG!2 Lb?Lit>-v8KPwks~ literal 5975 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\n" @@ -19,165 +19,258 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: superset/forms.py:140 -msgid "Viz" +#: superset/db_engine_specs.py:79 superset/db_engine_specs.py:102 +#: superset/db_engine_specs.py:125 superset/db_engine_specs.py:160 +#: superset/db_engine_specs.py:268 superset/db_engine_specs.py:304 +#: superset/forms.py:436 +msgid "Time Column" +msgstr "" + +#: superset/db_engine_specs.py:80 superset/db_engine_specs.py:126 +#: superset/db_engine_specs.py:161 superset/db_engine_specs.py:269 +msgid "second" +msgstr "" + +#: superset/db_engine_specs.py:81 superset/db_engine_specs.py:129 +#: superset/db_engine_specs.py:163 superset/db_engine_specs.py:271 +#: superset/db_engine_specs.py:305 +msgid "minute" +msgstr "" + +#: superset/db_engine_specs.py:82 superset/db_engine_specs.py:131 +#: superset/db_engine_specs.py:165 superset/db_engine_specs.py:277 +#: superset/db_engine_specs.py:307 superset/forms.py:380 superset/forms.py:394 +msgid "hour" +msgstr "" + +#: superset/db_engine_specs.py:83 superset/db_engine_specs.py:103 +#: superset/db_engine_specs.py:133 superset/db_engine_specs.py:167 +#: superset/db_engine_specs.py:279 superset/db_engine_specs.py:309 +#: superset/forms.py:381 superset/forms.py:395 +msgid "day" +msgstr "" + +#: superset/db_engine_specs.py:84 superset/db_engine_specs.py:104 +#: superset/db_engine_specs.py:134 superset/db_engine_specs.py:169 +#: superset/db_engine_specs.py:281 superset/db_engine_specs.py:311 +#: superset/forms.py:366 superset/forms.py:382 superset/forms.py:396 +msgid "week" +msgstr "" + +#: superset/db_engine_specs.py:85 superset/db_engine_specs.py:106 +#: superset/db_engine_specs.py:136 superset/db_engine_specs.py:171 +#: superset/db_engine_specs.py:283 superset/db_engine_specs.py:313 +#: superset/forms.py:369 superset/forms.py:383 superset/forms.py:397 +msgid "month" +msgstr "" + +#: superset/db_engine_specs.py:86 superset/db_engine_specs.py:138 +#: superset/db_engine_specs.py:173 superset/db_engine_specs.py:285 +#: superset/db_engine_specs.py:315 +msgid "quarter" +msgstr "" + +#: superset/db_engine_specs.py:87 superset/db_engine_specs.py:140 +#: superset/db_engine_specs.py:287 superset/db_engine_specs.py:317 +#: superset/forms.py:384 +msgid "year" +msgstr "" + +#: superset/db_engine_specs.py:175 superset/forms.py:368 +msgid "week_ending_saturday" +msgstr "" + +#: superset/db_engine_specs.py:178 +msgid "week_start_sunday" +msgstr "" + +#: superset/db_engine_specs.py:273 +msgid "5 minute" +msgstr "" + +#: superset/db_engine_specs.py:275 +msgid "half hour" +msgstr "" + +#: superset/forms.py:30 +msgid "D3 format syntax https://github.com/d3/d3-format" msgstr "" #: superset/forms.py:143 -msgid "The type of visualization to display" +msgid "Viz" msgstr "" #: superset/forms.py:146 +msgid "The type of visualization to display" +msgstr "" + +#: superset/forms.py:149 msgid "Metrics" msgstr "" -#: superset/forms.py:149 superset/forms.py:154 +#: superset/forms.py:152 superset/forms.py:157 msgid "One or many metrics to display" msgstr "" -#: superset/forms.py:152 +#: superset/forms.py:155 msgid "Ordering" msgstr "" -#: superset/forms.py:157 superset/views.py:294 superset/views.py:334 +#: superset/forms.py:160 superset/views.py:455 superset/views.py:495 msgid "Metric" msgstr "" -#: superset/forms.py:160 +#: superset/forms.py:163 msgid "Choose the metric" msgstr "" -#: superset/forms.py:163 +#: superset/forms.py:166 msgid "Chart Style" msgstr "" -#: superset/forms.py:165 +#: superset/forms.py:168 msgid "stack" msgstr "" -#: superset/forms.py:166 +#: superset/forms.py:169 msgid "stream" msgstr "" -#: superset/forms.py:167 +#: superset/forms.py:170 msgid "expand" msgstr "" -#: superset/forms.py:173 +#: superset/forms.py:176 msgid "Color Scheme" msgstr "" -#: superset/forms.py:175 +#: superset/forms.py:178 msgid "fire" msgstr "" -#: superset/forms.py:176 +#: superset/forms.py:179 msgid "blue_white_yellow" msgstr "" -#: superset/forms.py:177 +#: superset/forms.py:180 msgid "white_black" msgstr "" -#: superset/forms.py:178 +#: superset/forms.py:181 msgid "black_white" msgstr "" -#: superset/forms.py:184 +#: superset/forms.py:187 msgid "Normalize Across" msgstr "" -#: superset/forms.py:186 +#: superset/forms.py:189 msgid "heatmap" msgstr "" -#: superset/forms.py:187 +#: superset/forms.py:190 msgid "x" msgstr "" -#: superset/forms.py:188 +#: superset/forms.py:191 msgid "y" msgstr "" -#: superset/forms.py:191 +#: superset/forms.py:194 msgid "" "Color will be rendered based on a ratio of the cell against the sum of " "across this criteria" msgstr "" -#: superset/forms.py:197 +#: superset/forms.py:200 msgid "Color Scale" msgstr "" -#: superset/forms.py:199 +#: superset/forms.py:202 msgid "series" msgstr "" -#: superset/forms.py:200 +#: superset/forms.py:203 msgid "overall" msgstr "" -#: superset/forms.py:201 +#: superset/forms.py:204 msgid "change" msgstr "" -#: superset/forms.py:204 +#: superset/forms.py:207 msgid "Defines how the color are attributed." msgstr "" -#: superset/forms.py:207 +#: superset/forms.py:210 msgid "Rendering" msgstr "" -#: superset/forms.py:209 +#: superset/forms.py:212 msgid "pixelated (Sharp)" msgstr "" -#: superset/forms.py:210 +#: superset/forms.py:213 msgid "auto (Smooth)" msgstr "" -#: superset/forms.py:213 +#: superset/forms.py:216 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "" -#: superset/forms.py:218 +#: superset/forms.py:221 msgid "XScale Interval" msgstr "" -#: superset/forms.py:221 +#: superset/forms.py:224 msgid "Number of step to take between ticks when printing the x scale" msgstr "" -#: superset/forms.py:226 +#: superset/forms.py:229 msgid "YScale Interval" msgstr "" -#: superset/forms.py:229 +#: superset/forms.py:232 msgid "Number of step to take between ticks when printing the y scale" msgstr "" -#: superset/forms.py:234 +#: superset/forms.py:237 msgid "Stacked Bars" msgstr "" -#: superset/forms.py:239 +#: superset/forms.py:242 +msgid "Show Markers" +msgstr "" + +#: superset/forms.py:249 +msgid "Bar Values" +msgstr "" + +#: superset/forms.py:254 +msgid "Sort Bars" +msgstr "" + +#: superset/forms.py:256 +msgid "Sort bars by x labels." +msgstr "" + +#: superset/forms.py:259 msgid "Extra Controls" msgstr "" -#: superset/forms.py:241 +#: superset/forms.py:261 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" -#: superset/forms.py:247 +#: superset/forms.py:267 msgid "Reduce X ticks" msgstr "" -#: superset/forms.py:249 +#: superset/forms.py:269 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 " @@ -185,874 +278,919 @@ msgid "" "scroll." msgstr "" -#: superset/forms.py:257 +#: superset/forms.py:277 msgid "Include Series" msgstr "" -#: superset/forms.py:259 +#: superset/forms.py:279 msgid "Include series name as an axis" msgstr "" -#: superset/forms.py:262 +#: superset/forms.py:282 msgid "Color Metric" msgstr "" -#: superset/forms.py:265 +#: superset/forms.py:285 msgid "A metric to use for color" msgstr "" -#: superset/forms.py:268 +#: superset/forms.py:288 msgid "Country Field Type" msgstr "" -#: superset/forms.py:271 +#: superset/forms.py:291 msgid "Full name" msgstr "" -#: superset/forms.py:272 +#: superset/forms.py:292 msgid "code International Olympic Committee (cioc)" msgstr "" -#: superset/forms.py:273 +#: superset/forms.py:293 msgid "code ISO 3166-1 alpha-2 (cca2)" msgstr "" -#: superset/forms.py:274 +#: superset/forms.py:294 msgid "code ISO 3166-1 alpha-3 (cca3)" msgstr "" -#: superset/forms.py:276 +#: superset/forms.py:296 msgid "" "The country code standard that Superset should expect to find in the " "[country] column" msgstr "" -#: superset/forms.py:281 +#: superset/forms.py:301 msgid "Group by" msgstr "" -#: superset/forms.py:283 +#: superset/forms.py:303 msgid "One or many fields to group by" msgstr "" -#: superset/forms.py:286 superset/forms.py:291 +#: superset/forms.py:306 superset/forms.py:311 msgid "Columns" msgstr "" -#: superset/forms.py:288 +#: superset/forms.py:308 msgid "One or many fields to pivot as columns" msgstr "" -#: superset/forms.py:293 superset/forms.py:298 superset/forms.py:303 +#: superset/forms.py:313 superset/forms.py:319 superset/forms.py:325 msgid "Columns to display" msgstr "" -#: superset/forms.py:296 +#: superset/forms.py:316 msgid "X" msgstr "" -#: superset/forms.py:301 +#: superset/forms.py:322 msgid "Y" msgstr "" -#: superset/forms.py:306 +#: superset/forms.py:328 msgid "Origin" msgstr "" -#: superset/forms.py:308 +#: superset/forms.py:330 msgid "default" msgstr "" -#: superset/forms.py:309 superset/forms.py:467 +#: superset/forms.py:331 superset/forms.py:500 msgid "now" msgstr "" -#: superset/forms.py:312 +#: superset/forms.py:334 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "'now', 'sunday' or '1970-01-01'" msgstr "" -#: superset/forms.py:317 +#: superset/forms.py:339 msgid "Bottom Margin" msgstr "" -#: superset/forms.py:320 +#: superset/forms.py:342 msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/forms.py:325 +#: superset/forms.py:347 +msgid "Page Length" +msgstr "" + +#: superset/forms.py:350 +msgid "Number of rows per page, 0 means no pagination" +msgstr "" + +#: superset/forms.py:354 msgid "Time Granularity" msgstr "" -#: superset/forms.py:328 +#: superset/forms.py:357 msgid "all" msgstr "" -#: superset/forms.py:329 +#: superset/forms.py:358 msgid "5 seconds" msgstr "" -#: superset/forms.py:330 +#: superset/forms.py:359 msgid "30 seconds" msgstr "" -#: superset/forms.py:331 +#: superset/forms.py:360 msgid "1 minute" msgstr "" -#: superset/forms.py:332 +#: superset/forms.py:361 msgid "5 minutes" msgstr "" -#: superset/forms.py:333 +#: superset/forms.py:362 msgid "1 hour" msgstr "" -#: superset/forms.py:334 +#: superset/forms.py:363 msgid "6 hour" msgstr "" -#: superset/forms.py:335 +#: superset/forms.py:364 msgid "1 day" msgstr "" -#: superset/forms.py:336 +#: superset/forms.py:365 msgid "7 days" msgstr "" -#: superset/forms.py:338 +#: superset/forms.py:367 +msgid "week_starting_sunday" +msgstr "" + +#: superset/forms.py:371 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/forms.py:344 +#: superset/forms.py:377 msgid "Domain" msgstr "" -#: superset/forms.py:347 superset/forms.py:361 superset/models.py:417 -#: superset/models.py:435 -msgid "hour" -msgstr "" - -#: superset/forms.py:348 superset/forms.py:362 superset/models.py:419 -#: superset/models.py:427 superset/models.py:436 -msgid "day" -msgstr "" - -#: superset/forms.py:349 superset/forms.py:363 superset/models.py:407 -#: superset/models.py:420 superset/models.py:428 superset/models.py:437 -msgid "week" -msgstr "" - -#: superset/forms.py:350 superset/forms.py:364 superset/models.py:408 -#: superset/models.py:422 superset/models.py:429 superset/models.py:438 -msgid "month" -msgstr "" - -#: superset/forms.py:351 superset/models.py:439 -msgid "year" -msgstr "" - -#: superset/forms.py:353 +#: superset/forms.py:386 msgid "The time unit used for the grouping of blocks" msgstr "" -#: superset/forms.py:357 +#: superset/forms.py:390 msgid "Subdomain" msgstr "" -#: superset/forms.py:360 superset/forms.py:701 +#: superset/forms.py:393 superset/forms.py:744 msgid "min" msgstr "" -#: superset/forms.py:366 +#: superset/forms.py:399 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/forms.py:371 +#: superset/forms.py:404 msgid "Link Length" msgstr "" -#: superset/forms.py:383 +#: superset/forms.py:416 msgid "Link length in the force layout" msgstr "" -#: superset/forms.py:386 +#: superset/forms.py:419 msgid "Charge" msgstr "" -#: superset/forms.py:400 +#: superset/forms.py:433 msgid "Charge in the force layout" msgstr "" -#: superset/forms.py:403 superset/models.py:406 superset/models.py:416 -#: superset/models.py:426 superset/models.py:432 -msgid "Time Column" -msgstr "" - -#: superset/forms.py:406 +#: superset/forms.py:439 msgid "" "The time column for the visualization. Note that you can define arbitrary" " expression that return a DATETIME column in the table editor. Also note " "that the filter below is applied against this column or expression" msgstr "" -#: superset/forms.py:414 +#: superset/forms.py:447 msgid "Resample Rule" msgstr "" -#: superset/forms.py:417 +#: superset/forms.py:450 msgid "1T" msgstr "" -#: superset/forms.py:418 +#: superset/forms.py:451 msgid "1H" msgstr "" -#: superset/forms.py:419 +#: superset/forms.py:452 msgid "1D" msgstr "" -#: superset/forms.py:420 +#: superset/forms.py:453 msgid "7D" msgstr "" -#: superset/forms.py:421 +#: superset/forms.py:454 msgid "1M" msgstr "" -#: superset/forms.py:422 +#: superset/forms.py:455 msgid "1AS" msgstr "" -#: superset/forms.py:424 +#: superset/forms.py:457 msgid "Pandas resample rule" msgstr "" -#: superset/forms.py:427 +#: superset/forms.py:460 msgid "Resample How" msgstr "" -#: superset/forms.py:431 superset/forms.py:700 +#: superset/forms.py:464 superset/forms.py:743 msgid "mean" msgstr "" -#: superset/forms.py:432 superset/forms.py:699 +#: superset/forms.py:465 superset/forms.py:742 msgid "sum" msgstr "" -#: superset/forms.py:433 superset/forms.py:703 +#: superset/forms.py:466 superset/forms.py:746 msgid "median" msgstr "" -#: superset/forms.py:435 +#: superset/forms.py:468 msgid "Pandas resample how" msgstr "" -#: superset/forms.py:438 +#: superset/forms.py:471 msgid "Resample Fill Method" msgstr "" -#: superset/forms.py:442 +#: superset/forms.py:475 msgid "ffill" msgstr "" -#: superset/forms.py:443 +#: superset/forms.py:476 msgid "bfill" msgstr "" -#: superset/forms.py:445 +#: superset/forms.py:478 msgid "Pandas resample fill method" msgstr "" -#: superset/forms.py:448 +#: superset/forms.py:481 msgid "Since" msgstr "" -#: superset/forms.py:451 +#: superset/forms.py:484 msgid "1 hour ago" msgstr "" -#: superset/forms.py:452 +#: superset/forms.py:485 msgid "12 hours ago" msgstr "" -#: superset/forms.py:453 superset/forms.py:468 +#: superset/forms.py:486 superset/forms.py:501 msgid "1 day ago" msgstr "" -#: superset/forms.py:454 superset/forms.py:469 +#: superset/forms.py:487 superset/forms.py:502 msgid "7 days ago" msgstr "" -#: superset/forms.py:455 superset/forms.py:470 +#: superset/forms.py:488 superset/forms.py:503 msgid "28 days ago" msgstr "" -#: superset/forms.py:456 superset/forms.py:471 +#: superset/forms.py:489 superset/forms.py:504 msgid "90 days ago" msgstr "" -#: superset/forms.py:457 superset/forms.py:472 +#: superset/forms.py:490 superset/forms.py:505 msgid "1 year ago" msgstr "" -#: superset/forms.py:459 +#: superset/forms.py:492 msgid "" "Timestamp from filter. This supports free form typing and natural " "language as in '1 day ago', '28 days' or '3 years'" msgstr "" -#: superset/forms.py:464 +#: superset/forms.py:497 msgid "Until" msgstr "" -#: superset/forms.py:476 +#: superset/forms.py:509 msgid "Max Bubble Size" msgstr "" -#: superset/forms.py:489 +#: superset/forms.py:522 msgid "Whisker/outlier options" msgstr "" -#: superset/forms.py:491 +#: superset/forms.py:524 msgid "Determines how whiskers and outliers are calculated." msgstr "" -#: superset/forms.py:494 +#: superset/forms.py:527 msgid "Tukey" msgstr "" -#: superset/forms.py:495 +#: superset/forms.py:528 msgid "Min/max (no outliers)" msgstr "" -#: superset/forms.py:496 +#: superset/forms.py:529 msgid "2/98 percentiles" msgstr "" -#: superset/forms.py:497 +#: superset/forms.py:530 msgid "9/91 percentiles" msgstr "" -#: superset/forms.py:501 +#: superset/forms.py:534 msgid "Ratio" msgstr "" -#: superset/forms.py:503 +#: superset/forms.py:536 msgid "Target aspect ratio for treemap tiles." msgstr "" -#: superset/forms.py:506 superset/viz.py:856 superset/viz.py:905 +#: superset/forms.py:539 superset/viz.py:918 superset/viz.py:967 msgid "Number format" msgstr "" -#: superset/forms.py:516 -msgid "" -"D3 format syntax for numbers https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "" - -#: superset/forms.py:521 +#: superset/forms.py:552 msgid "Row limit" msgstr "" -#: superset/forms.py:527 +#: superset/forms.py:558 msgid "Series limit" msgstr "" -#: superset/forms.py:530 +#: superset/forms.py:561 msgid "Limits the number of time series that get displayed" msgstr "" -#: superset/forms.py:534 +#: superset/forms.py:565 +msgid "Sort By" +msgstr "" + +#: superset/forms.py:568 +msgid "Metric used to define the top series" +msgstr "" + +#: superset/forms.py:571 msgid "Rolling" msgstr "" -#: superset/forms.py:537 +#: superset/forms.py:574 msgid "" "Defines a rolling window function to apply, works along with the " "[Periods] text box" msgstr "" -#: superset/forms.py:542 +#: superset/forms.py:579 msgid "Periods" msgstr "" -#: superset/forms.py:544 +#: superset/forms.py:581 msgid "" "Defines the size of the rolling window function, relative to the time " "granularity selected" msgstr "" -#: superset/forms.py:549 superset/viz.py:1192 +#: superset/forms.py:586 superset/viz.py:1329 msgid "Series" msgstr "" -#: superset/forms.py:552 +#: superset/forms.py:589 msgid "" -"Defines the grouping of entities. Each serie is shown as a specific color" -" on the chart and has a legend toggle" +"Defines the grouping of entities. Each series is shown as a specific " +"color on the chart and has a legend toggle" msgstr "" -#: superset/forms.py:558 +#: superset/forms.py:595 msgid "Entity" msgstr "" -#: superset/forms.py:561 +#: superset/forms.py:598 msgid "This define the element to be plotted on the chart" msgstr "" -#: superset/forms.py:564 +#: superset/forms.py:601 msgid "X Axis" msgstr "" -#: superset/forms.py:567 +#: superset/forms.py:604 msgid "Metric assigned to the [X] axis" msgstr "" -#: superset/forms.py:570 +#: superset/forms.py:607 msgid "Y Axis" msgstr "" -#: superset/forms.py:573 +#: superset/forms.py:610 msgid "Metric assigned to the [Y] axis" msgstr "" -#: superset/forms.py:576 +#: superset/forms.py:613 msgid "Bubble Size" msgstr "" -#: superset/forms.py:581 +#: superset/forms.py:618 msgid "URL" msgstr "" -#: superset/forms.py:582 +#: superset/forms.py:619 msgid "" "The URL, this field is templated, so you can integrate {{ width }} and/or" " {{ height }} in your URL string." msgstr "" -#: superset/forms.py:589 +#: superset/forms.py:626 msgid "X Axis Label" msgstr "" -#: superset/forms.py:593 +#: superset/forms.py:630 msgid "Y Axis Label" msgstr "" -#: superset/forms.py:597 +#: superset/forms.py:634 msgid "Custom WHERE clause" msgstr "" -#: superset/forms.py:599 +#: superset/forms.py:636 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/forms.py:606 +#: superset/forms.py:643 msgid "Custom HAVING clause" msgstr "" -#: superset/forms.py:608 +#: superset/forms.py:645 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/forms.py:615 +#: superset/forms.py:652 msgid "Comparison Period Lag" msgstr "" -#: superset/forms.py:616 +#: superset/forms.py:653 msgid "Based on granularity, number of time periods to compare against" msgstr "" -#: superset/forms.py:621 +#: superset/forms.py:658 msgid "Comparison suffix" msgstr "" -#: superset/forms.py:622 +#: superset/forms.py:659 msgid "Suffix to apply after the percentage display" msgstr "" -#: superset/forms.py:625 +#: superset/forms.py:662 msgid "Table Timestamp Format" msgstr "" -#: superset/forms.py:628 +#: superset/forms.py:665 msgid "Timestamp Format" msgstr "" -#: superset/forms.py:631 +#: superset/forms.py:668 msgid "Series Height" msgstr "" -#: superset/forms.py:634 +#: superset/forms.py:671 msgid "Pixel height of each series" msgstr "" -#: superset/forms.py:637 +#: superset/forms.py:674 msgid "X axis format" msgstr "" -#: superset/forms.py:640 superset/forms.py:655 -msgid "" -"D3 format syntax for y axis https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "" - -#: superset/forms.py:645 +#: superset/forms.py:680 msgid "Y axis format" msgstr "" -#: superset/forms.py:660 +#: superset/forms.py:693 msgid "Markup Type" msgstr "" -#: superset/forms.py:662 +#: superset/forms.py:695 msgid "markdown" msgstr "" -#: superset/forms.py:663 +#: superset/forms.py:696 msgid "html" msgstr "" -#: superset/forms.py:666 +#: superset/forms.py:699 msgid "Pick your favorite markup language" msgstr "" -#: superset/forms.py:669 +#: superset/forms.py:702 msgid "Rotation" msgstr "" -#: superset/forms.py:671 +#: superset/forms.py:704 msgid "random" msgstr "" -#: superset/forms.py:672 +#: superset/forms.py:705 msgid "flat" msgstr "" -#: superset/forms.py:673 +#: superset/forms.py:706 msgid "square" msgstr "" -#: superset/forms.py:676 +#: superset/forms.py:709 msgid "Rotation to apply to words in the cloud" msgstr "" -#: superset/forms.py:679 +#: superset/forms.py:712 msgid "Line Style" msgstr "" -#: superset/forms.py:681 +#: superset/forms.py:714 msgid "linear" msgstr "" -#: superset/forms.py:682 +#: superset/forms.py:715 msgid "basis" msgstr "" -#: superset/forms.py:683 +#: superset/forms.py:716 msgid "cardinal" msgstr "" -#: superset/forms.py:684 +#: superset/forms.py:717 msgid "monotone" msgstr "" -#: superset/forms.py:685 +#: superset/forms.py:718 msgid "step-before" msgstr "" -#: superset/forms.py:686 +#: superset/forms.py:719 msgid "step-after" msgstr "" -#: superset/forms.py:689 +#: superset/forms.py:722 msgid "Line interpolation as defined by d3.js" msgstr "" -#: superset/forms.py:692 +#: superset/forms.py:725 +msgid "Label Type" +msgstr "" + +#: superset/forms.py:728 +msgid "Category Name" +msgstr "" + +#: superset/forms.py:729 +msgid "Value" +msgstr "" + +#: superset/forms.py:730 +msgid "Percentage" +msgstr "" + +#: superset/forms.py:732 +msgid "What should be shown on the label?" +msgstr "" + +#: superset/forms.py:735 msgid "Code" msgstr "" -#: superset/forms.py:693 +#: superset/forms.py:736 msgid "Put your code here" msgstr "" -#: superset/forms.py:697 +#: superset/forms.py:740 msgid "Aggregation function" msgstr "" -#: superset/forms.py:702 +#: superset/forms.py:745 msgid "max" msgstr "" -#: superset/forms.py:704 +#: superset/forms.py:747 msgid "stdev" msgstr "" -#: superset/forms.py:705 +#: superset/forms.py:748 msgid "var" msgstr "" -#: superset/forms.py:708 +#: superset/forms.py:751 msgid "" "Aggregate function to apply when pivoting and computing the total rows " "and columns" msgstr "" -#: superset/forms.py:713 +#: superset/forms.py:756 msgid "Font Size From" msgstr "" -#: superset/forms.py:715 +#: superset/forms.py:758 msgid "Font size for the smallest value in the list" msgstr "" -#: superset/forms.py:718 +#: superset/forms.py:761 msgid "Font Size To" msgstr "" -#: superset/forms.py:720 +#: superset/forms.py:763 msgid "Font size for the biggest value in the list" msgstr "" -#: superset/forms.py:723 +#: superset/forms.py:766 msgid "Range Filter" msgstr "" -#: superset/forms.py:725 +#: superset/forms.py:768 msgid "Whether to display the time range interactive selector" msgstr "" -#: superset/forms.py:729 +#: superset/forms.py:772 +msgid "Date Filter" +msgstr "" + +#: superset/forms.py:774 +msgid "Whether to include a time filter" +msgstr "" + +#: superset/forms.py:777 msgid "Data Table" msgstr "" -#: superset/forms.py:731 +#: superset/forms.py:779 msgid "Whether to display the interactive data table" msgstr "" -#: superset/forms.py:734 +#: superset/forms.py:782 msgid "Search Box" msgstr "" -#: superset/forms.py:736 +#: superset/forms.py:784 msgid "Whether to include a client side search box" msgstr "" -#: superset/forms.py:740 +#: superset/forms.py:788 +msgid "Table Filter" +msgstr "" + +#: superset/forms.py:790 +msgid "Whether to apply filter when table cell is clicked" +msgstr "" + +#: superset/forms.py:794 msgid "Show Bubbles" msgstr "" -#: superset/forms.py:742 +#: superset/forms.py:796 msgid "Whether to display bubbles on top of countries" msgstr "" -#: superset/forms.py:746 +#: superset/forms.py:800 msgid "Legend" msgstr "" -#: superset/forms.py:748 +#: superset/forms.py:802 msgid "Whether to display the legend (toggles)" msgstr "" -#: superset/forms.py:751 +#: superset/forms.py:805 msgid "X bounds" msgstr "" -#: superset/forms.py:753 +#: superset/forms.py:807 msgid "Whether to display the min and max values of the X axis" msgstr "" -#: superset/forms.py:757 +#: superset/forms.py:811 msgid "Rich Tooltip" msgstr "" -#: superset/forms.py:759 +#: superset/forms.py:813 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" -#: superset/forms.py:764 +#: superset/forms.py:818 msgid "Y Axis Zero" msgstr "" -#: superset/forms.py:766 +#: superset/forms.py:820 msgid "Force the Y axis to start at 0 instead of the minimum value" msgstr "" -#: superset/forms.py:771 +#: superset/forms.py:825 msgid "Y Log" msgstr "" -#: superset/forms.py:773 +#: superset/forms.py:827 msgid "Use a log scale for the Y axis" msgstr "" -#: superset/forms.py:776 +#: superset/forms.py:830 msgid "X Log" msgstr "" -#: superset/forms.py:778 +#: superset/forms.py:832 msgid "Use a log scale for the X axis" msgstr "" -#: superset/forms.py:781 +#: superset/forms.py:835 msgid "Donut" msgstr "" -#: superset/forms.py:783 +#: superset/forms.py:837 msgid "Do you want a donut or a pie?" msgstr "" -#: superset/forms.py:786 +#: superset/forms.py:840 +msgid "Put labels outside" +msgstr "" + +#: superset/forms.py:842 +msgid "Put the labels outside the pie?" +msgstr "" + +#: superset/forms.py:845 msgid "Contribution" msgstr "" -#: superset/forms.py:788 +#: superset/forms.py:847 msgid "Compute the contribution to the total" msgstr "" -#: superset/forms.py:791 +#: superset/forms.py:850 msgid "Period Ratio" msgstr "" -#: superset/forms.py:794 +#: superset/forms.py:853 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "" -#: superset/forms.py:799 +#: superset/forms.py:858 +msgid "Period Ratio Type" +msgstr "" + +#: superset/forms.py:861 +msgid "factor" +msgstr "" + +#: superset/forms.py:862 +msgid "growth" +msgstr "" + +#: superset/forms.py:863 +msgid "value" +msgstr "" + +#: superset/forms.py:865 +msgid "" +"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " +"is (new-previous)" +msgstr "" + +#: superset/forms.py:870 msgid "Time Shift" msgstr "" -#: superset/forms.py:801 +#: superset/forms.py:872 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/forms.py:808 +#: superset/forms.py:879 msgid "Subheader" msgstr "" -#: superset/forms.py:809 +#: superset/forms.py:880 msgid "Description text that shows up below your Big Number" msgstr "" -#: superset/forms.py:816 +#: superset/forms.py:887 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/forms.py:832 +#: superset/forms.py:904 msgid "Base layer map style" msgstr "" -#: superset/forms.py:835 +#: superset/forms.py:907 msgid "Clustering Radius" msgstr "" -#: superset/forms.py:848 +#: superset/forms.py:920 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/forms.py:854 +#: superset/forms.py:926 msgid "Point Radius" msgstr "" -#: superset/forms.py:857 +#: superset/forms.py:929 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/forms.py:863 +#: superset/forms.py:935 msgid "Point Radius Unit" msgstr "" -#: superset/forms.py:870 +#: superset/forms.py:942 msgid "The unit of measure for the specified point radius" msgstr "" -#: superset/forms.py:873 +#: superset/forms.py:945 msgid "Opacity" msgstr "" -#: superset/forms.py:875 +#: superset/forms.py:947 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/forms.py:880 +#: superset/forms.py:952 msgid "Zoom" msgstr "" -#: superset/forms.py:883 +#: superset/forms.py:955 msgid "Zoom level of the map" msgstr "" -#: superset/forms.py:887 +#: superset/forms.py:959 msgid "Default latitude" msgstr "" -#: superset/forms.py:889 +#: superset/forms.py:961 msgid "Latitude of default viewport" msgstr "" -#: superset/forms.py:893 +#: superset/forms.py:965 msgid "Default longitude" msgstr "" -#: superset/forms.py:895 +#: superset/forms.py:967 msgid "Longitude of default viewport" msgstr "" -#: superset/forms.py:899 +#: superset/forms.py:971 msgid "Live render" msgstr "" -#: superset/forms.py:901 +#: superset/forms.py:973 msgid "Points and clusters will update as viewport is being changed" msgstr "" -#: superset/forms.py:905 +#: superset/forms.py:978 msgid "RGB Color" msgstr "" -#: superset/forms.py:915 +#: superset/forms.py:988 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/forms.py:978 +#: superset/forms.py:1051 msgid "SQL" msgstr "" -#: superset/forms.py:980 +#: superset/forms.py:1053 msgid "This section exposes ways to include snippets of SQL in your query" msgstr "" -#: superset/forms.py:991 +#: superset/forms.py:1064 msgid "Time Grain" msgstr "" -#: superset/forms.py:994 +#: superset/forms.py:1067 msgid "" "The time granularity for the visualization. This applies a date " "transformation to alter your time column and defines a new time " @@ -1060,226 +1198,560 @@ msgid "" "in the Superset source code" msgstr "" -#: superset/forms.py:1027 superset/forms.py:1031 +#: superset/forms.py:1102 superset/forms.py:1106 msgid "Filter 1" msgstr "" -#: superset/forms.py:1036 +#: superset/forms.py:1111 msgid "Super" msgstr "" -#: superset/forms.py:1040 +#: superset/forms.py:1115 msgid "Time" msgstr "" -#: superset/forms.py:1045 +#: superset/forms.py:1120 msgid "Time related form attributes" msgstr "" -#: superset/models.py:409 -msgid "quarter" +#: superset/models.py:1019 +msgid "" +"Datetime column not provided as part table configuration and is required " +"by this type of chart" msgstr "" -#: superset/models.py:410 -msgid "week_ending_saturday" +#: superset/models.py:2138 +msgid "No data was returned." msgstr "" -#: superset/models.py:412 -msgid "week_start_sunday" +#: superset/views.py:342 +msgid "" +"Whether to make this column available as a [Time Granularity] option, " +"column has to be DATETIME or DATETIME-like" msgstr "" -#: superset/models.py:433 -msgid "second" -msgstr "" - -#: superset/models.py:434 -msgid "minute" -msgstr "" - -#: superset/models.py:620 -msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" -msgstr "" - -#: superset/models.py:1328 -msgid "No data was returned." -msgstr "" - -#: superset/views.py:203 -msgid "" -"Whether to make this column available as a [Time Granularity] option, " -"column has to be DATETIME or DATETIME-like" -msgstr "" - -#: superset/views.py:230 superset/views.py:259 +#: superset/views.py:369 superset/views.py:399 msgid "Column" msgstr "" -#: superset/views.py:231 superset/views.py:296 superset/views.py:336 +#: superset/views.py:370 superset/views.py:457 superset/views.py:497 msgid "Verbose Name" msgstr "" -#: superset/views.py:232 superset/views.py:295 superset/views.py:335 -#: superset/views.py:537 superset/views.py:691 +#: superset/views.py:371 superset/views.py:456 superset/views.py:496 +#: superset/views.py:1042 superset/views.py:1266 msgid "Description" msgstr "" -#: superset/views.py:233 superset/views.py:262 +#: superset/views.py:372 superset/views.py:402 msgid "Groupable" msgstr "" -#: superset/views.py:234 superset/views.py:263 +#: superset/views.py:373 superset/views.py:403 msgid "Filterable" msgstr "" -#: superset/views.py:235 superset/views.py:299 superset/views.py:433 -#: superset/views.py:543 +#: superset/views.py:374 superset/views.py:460 superset/views.py:891 +#: superset/views.py:1048 msgid "Table" msgstr "" -#: superset/views.py:236 superset/views.py:264 +#: superset/views.py:375 superset/views.py:404 msgid "Count Distinct" msgstr "" -#: superset/views.py:237 superset/views.py:265 +#: superset/views.py:376 superset/views.py:405 msgid "Sum" msgstr "" -#: superset/views.py:238 superset/views.py:266 +#: superset/views.py:377 superset/views.py:406 msgid "Min" msgstr "" -#: superset/views.py:239 superset/views.py:267 +#: superset/views.py:378 superset/views.py:407 msgid "Max" msgstr "" -#: superset/views.py:240 +#: superset/views.py:379 msgid "Expression" msgstr "" -#: superset/views.py:241 +#: superset/views.py:380 msgid "Is temporal" msgstr "" -#: superset/views.py:242 +#: superset/views.py:381 msgid "Datetime Format" msgstr "" -#: superset/views.py:243 +#: superset/views.py:382 msgid "Database Expression" msgstr "" -#: superset/views.py:260 superset/views.py:297 superset/views.py:337 -#: superset/views.py:568 +#: superset/views.py:400 superset/views.py:458 superset/views.py:498 msgid "Type" msgstr "" -#: superset/views.py:261 superset/views.py:536 +#: superset/views.py:401 superset/views.py:958 superset/views.py:1041 msgid "Datasource" msgstr "" -#: superset/views.py:286 superset/views.py:328 +#: superset/views.py:440 superset/views.py:489 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 " "metric)' are allowed to access this metric" msgstr "" -#: superset/views.py:298 +#: superset/views.py:459 msgid "SQL Expression" msgstr "" -#: superset/views.py:338 superset/views.py:656 +#: superset/views.py:499 superset/views.py:1215 msgid "JSON" msgstr "" -#: superset/views.py:339 +#: superset/views.py:500 msgid "Druid Datasource" msgstr "" -#: superset/views.py:378 superset/views.py:435 -msgid "Database" +#: superset/views.py:545 +msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/views.py:379 -msgid "SQL link" +#: superset/views.py:546 +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 " +"(<~1 minute)" +msgstr "" + +#: superset/views.py:550 +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." +msgstr "" + +#: superset/views.py:554 +msgid "Allow CREATE TABLE AS option in SQL Lab" +msgstr "" + +#: superset/views.py:555 +msgid "" +"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" +" SQL Lab" msgstr "" -#: superset/views.py:380 superset/views.py:534 superset/views.py:610 +#: superset/views.py:559 +msgid "" +"When allowing CREATE TABLE AS option in SQL Lab, this option forces the " +"table to be created in this schema" +msgstr "" + +#: superset/views.py:573 +msgid "Expose in SQL Lab" +msgstr "" + +#: superset/views.py:574 +msgid "Allow CREATE TABLE AS" +msgstr "" + +#: superset/views.py:575 +msgid "Allow DML" +msgstr "" + +#: superset/views.py:576 +msgid "CTAS Schema" +msgstr "" + +#: superset/views.py:577 superset/views.py:893 +msgid "Database" +msgstr "" + +#: superset/views.py:578 superset/views.py:1039 superset/views.py:1143 msgid "Creator" msgstr "" -#: superset/views.py:381 superset/views.py:436 +#: superset/views.py:579 superset/views.py:894 msgid "Last Changed" msgstr "" -#: superset/views.py:382 +#: superset/views.py:580 msgid "SQLAlchemy URI" msgstr "" -#: superset/views.py:383 superset/views.py:442 superset/views.py:533 -#: superset/views.py:697 +#: superset/views.py:581 superset/views.py:899 superset/views.py:1038 +#: superset/views.py:1272 msgid "Cache Timeout" msgstr "" -#: superset/views.py:384 +#: superset/views.py:582 msgid "Extra" msgstr "" -#: superset/views.py:434 -msgid "Changed By" +#: superset/views.py:637 +msgid "CSV File" msgstr "" -#: superset/views.py:437 -msgid "SQL Editor" +#: superset/views.py:637 +msgid "Select a CSV file to be uploaded to a database." msgstr "" -#: superset/views.py:438 superset/views.py:693 -msgid "Is Featured" +#: superset/views.py:638 +msgid "CSV Files Only!" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter used by CSV file (for whitespace use \\s+)." +msgstr "" + +#: superset/views.py:641 +msgid "Header Row" +msgstr "" + +#: superset/views.py:641 +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/views.py:644 +msgid "Column Names" +msgstr "" + +#: superset/views.py:644 +msgid "" +"List of comma-separated column names to use if header row not specified " +"above. Leave empty if header field populated." msgstr "" -#: superset/views.py:439 +#: superset/views.py:647 +msgid "Index Column" +msgstr "" + +#: superset/views.py:647 +msgid "" +"Column to use as the row labels of the dataframe. Leave empty if no index" +" column." +msgstr "" + +#: superset/views.py:650 +msgid "Squeeze" +msgstr "" + +#: superset/views.py:650 +msgid "" +"Parse the data as a series (specify this option if the data contains only" +" one column." +msgstr "" + +#: superset/views.py:652 +msgid "Prefix" +msgstr "" + +#: superset/views.py:652 +msgid "" +"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " +"X1\")." +msgstr "" + +#: superset/views.py:655 +msgid "Mangle Duplicate Columns" +msgstr "" + +#: superset/views.py:655 +msgid "Specify duplicate columns as \"X.0, X.1\"." +msgstr "" + +#: superset/views.py:657 +msgid "Skip Initial Space" +msgstr "" + +#: superset/views.py:657 +msgid "Skip spaces after delimiter." +msgstr "" + +#: superset/views.py:658 +msgid "Skip Rows" +msgstr "" + +#: superset/views.py:658 +msgid "Number of rows to skip at start of file." +msgstr "" + +#: superset/views.py:660 +msgid "Rows to Read" +msgstr "" + +#: superset/views.py:660 +msgid "Number of rows of file to read." +msgstr "" + +#: superset/views.py:662 +msgid "Skip Blank Lines" +msgstr "" + +#: superset/views.py:662 +msgid "Skip blank lines rather than interpreting them as NaN values." +msgstr "" + +#: superset/views.py:664 +msgid "Parse Dates" +msgstr "" + +#: superset/views.py:664 +msgid "Parse date values." +msgstr "" + +#: superset/views.py:665 +msgid "Infer Datetime Format" +msgstr "" + +#: superset/views.py:665 +msgid "Use Pandas to interpret the datetime format automatically." +msgstr "" + +#: superset/views.py:667 +msgid "Day First" +msgstr "" + +#: superset/views.py:667 +msgid "Use DD/MM (European/International) date format." +msgstr "" + +#: superset/views.py:668 +msgid "Thousands Separator" +msgstr "" + +#: superset/views.py:668 +msgid "Separator for values in thousands." +msgstr "" + +#: superset/views.py:670 +msgid "Decimal Character" +msgstr "" + +#: superset/views.py:670 +msgid "Character to interpret as decimal point." +msgstr "" + +#: superset/views.py:672 +msgid "Quote Character" +msgstr "" + +#: superset/views.py:672 +msgid "Character used to denote the start and end of a quoted item." +msgstr "" + +#: superset/views.py:675 +msgid "Escape Character" +msgstr "" + +#: superset/views.py:675 +msgid "Character used to escape a quoted item." +msgstr "" + +#: superset/views.py:677 +msgid "Comment Character" +msgstr "" + +#: superset/views.py:677 +msgid "Character used to denote the start of a comment." +msgstr "" + +#: superset/views.py:679 +msgid "Encoding" +msgstr "" + +#: superset/views.py:679 +msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." +msgstr "" + +#: superset/views.py:681 +msgid "Error On Bad Lines" +msgstr "" + +#: superset/views.py:681 +msgid "" +"Error on bad lines (e.g. a line with too many commas). If false these bad" +" lines will instead be dropped from the resulting dataframe." +msgstr "" + +#: superset/views.py:687 +msgid "Table Name" +msgstr "" + +#: superset/views.py:687 +msgid "Name of table to be created from csv data." +msgstr "" + +#: superset/views.py:689 +msgid "Database URI" +msgstr "" + +#: superset/views.py:689 +msgid "URI of database in which to add above table." +msgstr "" + +#: superset/views.py:691 superset/views.py:896 msgid "Schema" msgstr "" -#: superset/views.py:440 superset/views.py:695 +#: superset/views.py:691 +msgid "Specify a schema (if database flavour supports this)." +msgstr "" + +#: superset/views.py:693 +msgid "Table Exists" +msgstr "" + +#: superset/views.py:693 +msgid "" +"If table exists do one of the following: Fail (do nothing), Replace (drop" +" and recreate table) or Append (insert data)." +msgstr "" + +#: superset/views.py:696 +msgid "Fail" +msgstr "" + +#: superset/views.py:696 +msgid "Replace" +msgstr "" + +#: superset/views.py:696 +msgid "Append" +msgstr "" + +#: superset/views.py:698 +msgid "Dataframe Index" +msgstr "" + +#: superset/views.py:698 +msgid "Write dataframe index as a column." +msgstr "" + +#: superset/views.py:699 +msgid "Column Label(s)" +msgstr "" + +#: superset/views.py:699 +msgid "" +"Column label for index column(s). If None is given and Dataframe Index is" +" True, Index Names are used." +msgstr "" + +#: superset/views.py:702 +msgid "Chunksize" +msgstr "" + +#: superset/views.py:702 +msgid "" +"If not None, rows will be written in batches of this size at a time. If " +"None, all rows will be written at once." +msgstr "" + +#: superset/views.py:709 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views.py:792 +msgid "CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"" +msgstr "" + +#: superset/views.py:875 superset/views.py:1257 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: superset/views.py:876 +msgid "Name of the table that exists in the source database" +msgstr "" + +#: superset/views.py:878 +msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" +msgstr "" + +#: superset/views.py:884 +msgid "" +"This fields acts a Superset view, meaning that Superset will run a query " +"against this string as a subquery." +msgstr "" + +#: superset/views.py:892 +msgid "Changed By" +msgstr "" + +#: superset/views.py:895 superset/views.py:1268 +msgid "Is Featured" +msgstr "" + +#: superset/views.py:897 superset/views.py:1270 msgid "Default Endpoint" msgstr "" -#: superset/views.py:441 +#: superset/views.py:898 msgid "Offset" msgstr "" -#: superset/views.py:482 superset/views.py:690 +#: superset/views.py:927 +msgid "" +"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." +msgstr "" + +#: superset/views.py:955 superset/views.py:1212 +msgid "User" +msgstr "" + +#: superset/views.py:956 +msgid "User Roles" +msgstr "" + +#: superset/views.py:957 +msgid "Database URL" +msgstr "" + +#: superset/views.py:959 +msgid "Roles to grant" +msgstr "" + +#: superset/views.py:960 +msgid "Created On" +msgstr "" + +#: superset/views.py:982 superset/views.py:1265 msgid "Cluster" msgstr "" -#: superset/views.py:483 +#: superset/views.py:983 msgid "Coordinator Host" msgstr "" -#: superset/views.py:484 +#: superset/views.py:984 msgid "Coordinator Port" msgstr "" -#: superset/views.py:485 +#: superset/views.py:985 msgid "Coordinator Endpoint" msgstr "" -#: superset/views.py:486 +#: superset/views.py:986 msgid "Broker Host" msgstr "" -#: superset/views.py:487 +#: superset/views.py:987 msgid "Broker Port" msgstr "" -#: superset/views.py:488 +#: superset/views.py:988 msgid "Broker Endpoint" msgstr "" -#: superset/views.py:522 +#: superset/views.py:1027 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -1287,561 +1759,595 @@ msgid "" "parameters." msgstr "" -#: superset/views.py:527 +#: superset/views.py:1032 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/templates/superset/welcome.html:26 superset/views.py:535 +#: superset/views.py:1040 msgid "Dashboards" msgstr "" -#: superset/views.py:538 +#: superset/views.py:1043 msgid "Last Modified" msgstr "" -#: superset/views.py:539 superset/views.py:609 +#: superset/views.py:1044 superset/views.py:1142 msgid "Owners" msgstr "" -#: superset/views.py:540 +#: superset/views.py:1045 msgid "Parameters" msgstr "" -#: superset/views.py:541 superset/views.py:569 +#: superset/views.py:1046 superset/views.py:1091 msgid "Slice" msgstr "" -#: superset/views.py:542 +#: superset/views.py:1047 msgid "Name" msgstr "" -#: superset/views.py:544 superset/views.py:570 +#: superset/views.py:1049 msgid "Visualization Type" msgstr "" -#: superset/views.py:586 +#: superset/views.py:1070 +msgid "Click on a {} link to create a Slice" +msgstr "" + +#: superset/views.py:1115 msgid "" "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" msgstr "" -#: superset/views.py:591 +#: superset/views.py:1120 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: superset/views.py:595 +#: superset/views.py:1124 msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/views.py:596 +#: superset/views.py:1125 msgid "" "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." msgstr "" -#: superset/views.py:601 +#: superset/views.py:1130 msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/views.py:605 +#: superset/views.py:1138 msgid "Dashboard" msgstr "" -#: superset/views.py:606 +#: superset/views.py:1139 msgid "Title" msgstr "" -#: superset/views.py:607 +#: superset/views.py:1140 msgid "Slug" msgstr "" -#: superset/views.py:608 +#: superset/views.py:1141 msgid "Slices" msgstr "" -#: superset/views.py:611 +#: superset/views.py:1144 msgid "Modified" msgstr "" -#: superset/views.py:612 +#: superset/views.py:1145 msgid "Position JSON" msgstr "" -#: superset/views.py:613 +#: superset/views.py:1146 msgid "CSS" msgstr "" -#: superset/views.py:614 +#: superset/views.py:1147 msgid "JSON Metadata" msgstr "" -#: superset/views.py:615 +#: superset/views.py:1148 msgid "Underlying Tables" msgstr "" -#: superset/views.py:653 -msgid "User" -msgstr "" - -#: superset/views.py:654 +#: superset/views.py:1213 msgid "Action" msgstr "" -#: superset/views.py:655 +#: superset/views.py:1214 msgid "dttm" msgstr "" -#: superset/views.py:683 -msgid "Timezone offset (in hours) for this datasource" -msgstr "" - -#: superset/views.py:689 +#: superset/views.py:1264 msgid "Data Source" msgstr "" -#: superset/views.py:692 +#: superset/views.py:1267 msgid "Owner" msgstr "" -#: superset/views.py:694 +#: superset/views.py:1269 msgid "Is Hidden" msgstr "" -#: superset/views.py:696 +#: superset/views.py:1271 msgid "Time Offset" msgstr "" -#: superset/views.py:1176 -msgid "This view requires the `all_datasource_access` permission" -msgstr "" - -#: superset/views.py:1249 -msgid "Refresh Druid Metadata" -msgstr "" - -#: superset/viz.py:367 +#: superset/viz.py:408 msgid "Table View" msgstr "" -#: superset/viz.py:370 +#: superset/viz.py:411 msgid "GROUP BY" msgstr "" -#: superset/viz.py:371 +#: superset/viz.py:412 msgid "Use this section if you want a query that aggregates" msgstr "" -#: superset/viz.py:374 +#: superset/viz.py:415 msgid "NOT GROUPED BY" msgstr "" -#: superset/viz.py:375 +#: superset/viz.py:416 msgid "Use this section if you want to query atomic rows" msgstr "" -#: superset/viz.py:378 +#: superset/viz.py:419 msgid "Options" msgstr "" -#: superset/viz.py:429 +#: superset/viz.py:472 msgid "Pivot Table" msgstr "" -#: superset/viz.py:491 +#: superset/viz.py:534 msgid "Markup" msgstr "" -#: superset/viz.py:519 +#: superset/viz.py:558 +msgid "Separator" +msgstr "" + +#: superset/viz.py:581 msgid "Word Cloud" msgstr "" -#: superset/viz.py:551 +#: superset/viz.py:613 msgid "Treemap" msgstr "" -#: superset/viz.py:561 superset/viz.py:676 superset/viz.py:783 superset/viz.py:948 -#: superset/viz.py:1093 superset/viz.py:1122 superset/viz.py:1177 -#: superset/viz.py:1682 +#: superset/viz.py:623 superset/viz.py:738 superset/viz.py:845 +#: superset/viz.py:1011 superset/viz.py:1163 superset/viz.py:1192 +#: superset/viz.py:1314 superset/viz.py:1825 msgid "Chart Options" msgstr "" -#: superset/viz.py:595 +#: superset/viz.py:657 msgid "Calendar Heatmap" msgstr "" -#: superset/viz.py:666 +#: superset/viz.py:728 msgid "Box Plot" msgstr "" -#: superset/viz.py:773 +#: superset/viz.py:835 msgid "Bubble Chart" msgstr "" -#: superset/viz.py:842 +#: superset/viz.py:904 msgid "Big Number with Trendline" msgstr "" -#: superset/viz.py:892 +#: superset/viz.py:954 msgid "Big Number" msgstr "" -#: superset/viz.py:938 +#: superset/viz.py:1000 msgid "Time Series - Line Chart" msgstr "" -#: superset/viz.py:958 +#: superset/viz.py:1022 msgid "Advanced Analytics" msgstr "" -#: superset/viz.py:959 +#: superset/viz.py:1023 msgid "" "This section contains options that allow for advanced analytical post " "processing of query results" msgstr "" -#: superset/viz.py:1091 +#: superset/viz.py:1161 msgid "Time Series - Bar Chart" msgstr "" -#: superset/viz.py:1111 +#: superset/viz.py:1181 msgid "Time Series - Percent Change" msgstr "" -#: superset/viz.py:1119 +#: superset/viz.py:1189 msgid "Time Series - Stacked" msgstr "" -#: superset/viz.py:1138 +#: superset/viz.py:1208 msgid "Distribution - NVD3 - Pie Chart" msgstr "" -#: superset/viz.py:1174 +#: superset/viz.py:1246 +msgid "Histogram" +msgstr "" + +#: superset/viz.py:1255 +msgid "Histogram Options" +msgstr "" + +#: superset/viz.py:1263 +msgid "Numeric Column" +msgstr "" + +#: superset/viz.py:1264 +msgid "Select the numeric column to draw the histogram" +msgstr "" + +#: superset/viz.py:1267 +msgid "No of Bins" +msgstr "" + +#: superset/viz.py:1268 +msgid "Select number of bins for the histogram" +msgstr "" + +#: superset/viz.py:1311 msgid "Distribution - Bar Chart" msgstr "" -#: superset/viz.py:1195 +#: superset/viz.py:1332 msgid "Breakdowns" msgstr "" -#: superset/viz.py:1196 +#: superset/viz.py:1333 msgid "Defines how each series is broken down" msgstr "" -#: superset/viz.py:1261 +#: superset/viz.py:1398 msgid "Sunburst" msgstr "" -#: superset/viz.py:1276 +#: superset/viz.py:1413 msgid "Primary Metric" msgstr "" -#: superset/viz.py:1277 +#: superset/viz.py:1414 msgid "The primary metric is used to define the arc segment sizes" msgstr "" -#: superset/viz.py:1282 +#: superset/viz.py:1419 msgid "Secondary Metric" msgstr "" -#: superset/viz.py:1283 +#: superset/viz.py:1420 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" msgstr "" -#: superset/viz.py:1289 +#: superset/viz.py:1426 msgid "Hierarchy" msgstr "" -#: superset/viz.py:1290 +#: superset/viz.py:1427 msgid "This defines the level of the hierarchy" msgstr "" -#: superset/viz.py:1327 +#: superset/viz.py:1463 msgid "Sankey" msgstr "" -#: superset/viz.py:1340 superset/viz.py:1410 +#: superset/viz.py:1476 superset/viz.py:1546 msgid "Source / Target" msgstr "" -#: superset/viz.py:1341 superset/viz.py:1411 +#: superset/viz.py:1477 superset/viz.py:1547 msgid "Choose a source and a target" msgstr "" -#: superset/viz.py:1391 +#: superset/viz.py:1527 msgid "Directed Force Layout" msgstr "" -#: superset/viz.py:1402 +#: superset/viz.py:1538 msgid "Force Layout" msgstr "" -#: superset/viz.py:1433 +#: superset/viz.py:1569 msgid "World Map" msgstr "" -#: superset/viz.py:1444 +#: superset/viz.py:1580 msgid "Bubbles" msgstr "" -#: superset/viz.py:1453 +#: superset/viz.py:1589 msgid "Country Field" msgstr "" -#: superset/viz.py:1454 +#: superset/viz.py:1590 msgid "3 letter code of the country" msgstr "" -#: superset/viz.py:1457 +#: superset/viz.py:1593 msgid "Metric for color" msgstr "" -#: superset/viz.py:1458 +#: superset/viz.py:1594 msgid "Metric that defines the color of the country" msgstr "" -#: superset/viz.py:1461 +#: superset/viz.py:1597 msgid "Bubble size" msgstr "" -#: superset/viz.py:1462 +#: superset/viz.py:1598 msgid "Metric that defines the size of the bubble" msgstr "" -#: superset/templates/superset/explore.html:147 superset/viz.py:1507 +#: superset/viz.py:1648 msgid "Filters" msgstr "" -#: superset/viz.py:1519 +#: superset/viz.py:1661 msgid "Filter fields" msgstr "" -#: superset/viz.py:1520 +#: superset/viz.py:1662 msgid "The fields you want to filter on" msgstr "" -#: superset/viz.py:1555 +#: superset/viz.py:1698 msgid "iFrame" msgstr "" -#: superset/viz.py:1573 +#: superset/viz.py:1716 msgid "Parallel Coordinates" msgstr "" -#: superset/viz.py:1609 +#: superset/viz.py:1752 msgid "Heatmap" msgstr "" -#: superset/viz.py:1622 +#: superset/viz.py:1765 msgid "Heatmap Options" msgstr "" -#: superset/viz.py:1677 +#: superset/viz.py:1820 msgid "Horizon Charts" msgstr "" -#: superset/viz.py:1693 +#: superset/viz.py:1836 msgid "Mapbox" msgstr "" -#: superset/viz.py:1707 +#: superset/viz.py:1850 msgid "Points" msgstr "" -#: superset/viz.py:1713 +#: superset/viz.py:1856 msgid "Labelling" msgstr "" -#: superset/viz.py:1719 +#: superset/viz.py:1862 msgid "Visual Tweaks" msgstr "" -#: superset/viz.py:1726 +#: superset/viz.py:1869 msgid "Viewport" msgstr "" -#: superset/viz.py:1736 +#: superset/viz.py:1879 msgid "Longitude" msgstr "" -#: superset/viz.py:1737 +#: superset/viz.py:1880 msgid "Column containing longitude data" msgstr "" -#: superset/viz.py:1740 +#: superset/viz.py:1883 msgid "Latitude" msgstr "" -#: superset/viz.py:1741 +#: superset/viz.py:1884 msgid "Column containing latitude data" msgstr "" -#: superset/viz.py:1744 +#: superset/viz.py:1887 msgid "Cluster label aggregator" msgstr "" -#: superset/viz.py:1745 +#: superset/viz.py:1888 msgid "" "Aggregate function applied to the list of points in each cluster to " "produce the cluster label." msgstr "" -#: superset/viz.py:1750 +#: superset/viz.py:1893 msgid "Tooltip" msgstr "" -#: superset/viz.py:1751 +#: superset/viz.py:1894 msgid "Show a tooltip when hovering over points and clusters describing the label" msgstr "" -#: superset/viz.py:1756 +#: superset/viz.py:1899 msgid "" "One or many fields to group by. If grouping, latitude and longitude " "columns must be present." msgstr "" -#: superset/templates/appbuilder/navbar_right.html:36 +#: superset/templates/appbuilder/navbar_right.html:41 msgid "Profile" msgstr "" -#: superset/templates/appbuilder/navbar_right.html:37 +#: superset/templates/appbuilder/navbar_right.html:42 msgid "Logout" msgstr "" -#: superset/templates/appbuilder/navbar_right.html:42 +#: superset/templates/appbuilder/navbar_right.html:47 msgid "Login" msgstr "" -#: superset/templates/superset/explore.html:34 -#: superset/templates/superset/explore.html:241 -msgid "Query" +#: superset/templates/superset/request_access.html:2 +msgid "No Access!" msgstr "" -#: superset/templates/superset/explore.html:43 -#: superset/templates/superset/explore.html:306 -msgid "Save" +#: superset/templates/superset/request_access.html:7 +#, python-format +msgid "You do not have permissions to access the datasource(s): %(name)s." msgstr "" -#: superset/templates/superset/explore.html:72 -msgid "Force refresh" +#: superset/templates/superset/request_access.html:13 +msgid "Request Permissions" msgstr "" -#: superset/templates/superset/explore.html:77 -msgid "Short URL" +#: superset/templates/superset/request_access.html:16 +msgid "Cancel" msgstr "" -#: superset/templates/superset/explore.html:79 -msgid "Generate an embeddable iframe" +#: superset/templates/superset/models/database/macros.html:4 +msgid "Test Connection" msgstr "" -#: superset/templates/superset/explore.html:82 -msgid "Export to .json" -msgstr "" +#~ msgid "Databases" +#~ msgstr "" -#: superset/templates/superset/explore.html:86 -msgid "Export to .csv format" -msgstr "" +#~ msgid "Sources" +#~ msgstr "" -#: superset/templates/superset/explore.html:92 -msgid "Query timer" -msgstr "" +#~ msgid "Tables" +#~ msgstr "" -#: superset/templates/superset/explore.html:94 -msgid "0 sec" -msgstr "" +#~ msgid "Druid Clusters" +#~ msgstr "" -#: superset/templates/superset/explore.html:100 -msgid "View database query" -msgstr "" +#~ msgid "Action Log" +#~ msgstr "" -#: superset/templates/superset/explore.html:101 -msgid "query" -msgstr "" +#~ msgid "Security" +#~ msgstr "" -#: superset/templates/superset/explore.html:150 -msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" -msgstr "" +#~ msgid "Druid Datasources" +#~ msgstr "" -#: superset/templates/superset/explore.html:168 -msgid "Add filter" -msgstr "" +#~ msgid "CSS Templates" +#~ msgstr "" -#: superset/templates/superset/explore.html:247 -#: superset/templates/superset/explore.html:265 -msgid "Close" -msgstr "" +#~ msgid "Documentation" +#~ msgstr "" -#: superset/templates/superset/explore.html:259 -msgid "Datasource Description" -msgstr "" +#~ msgid "Standalone version, use to embed anywhere" +#~ msgstr "" -#: superset/templates/superset/explore.html:277 -msgid "Save a Slice" -msgstr "" +#~ msgid "Overwrite" +#~ msgstr "" -#: superset/templates/superset/explore.html:309 -msgid "Save & go to dashboard" -msgstr "" +#~ msgid "Save as" +#~ msgstr "" -#: superset/templates/superset/explore.html:312 -msgid "Cancel" -msgstr "" +#~ msgid "" +#~ "D3 format syntax for numbers https: //github.com/mbostock/\n" +#~ "d3/wiki/Formatting" +#~ msgstr "" -#: superset/templates/superset/sql.html:12 -msgid "Run!" -msgstr "" +#~ msgid "" +#~ "Defines the grouping of entities. Each" +#~ " serie is shown as a specific " +#~ "color on the chart and has a " +#~ "legend toggle" +#~ msgstr "" -#: superset/templates/superset/sql.html:13 -msgid "Create View" -msgstr "" +#~ msgid "" +#~ "D3 format syntax for y axis https: //github.com/mbostock/\n" +#~ "d3/wiki/Formatting" +#~ msgstr "" -#: superset/templates/superset/welcome.html:8 -#: superset/templates/superset/welcome.html:14 -msgid "Welcome!" -msgstr "" +#~ msgid "SQL link" +#~ msgstr "" -#: superset/templates/superset/models/database/macros.html:4 -msgid "Test Connection" -msgstr "" +#~ msgid "SQL Editor" +#~ msgstr "" -#~ msgid "Databases" +#~ msgid "This view requires the `all_datasource_access` permission" #~ msgstr "" -#~ msgid "Sources" +#~ msgid "Refresh Druid Metadata" #~ msgstr "" -#~ msgid "Tables" +#~ msgid "Query" #~ msgstr "" -#~ msgid "Druid Clusters" +#~ msgid "Save" #~ msgstr "" -#~ msgid "Action Log" +#~ msgid "Force refresh" #~ msgstr "" -#~ msgid "Security" +#~ msgid "Short URL" #~ msgstr "" -#~ msgid "Druid Datasources" +#~ msgid "Generate an embeddable iframe" #~ msgstr "" -#~ msgid "CSS Templates" +#~ msgid "Export to .json" #~ msgstr "" -#~ msgid "Documentation" +#~ msgid "Export to .csv format" #~ msgstr "" -#~ msgid "Standalone version, use to embed anywhere" +#~ msgid "Query timer" #~ msgstr "" -#~ msgid "Overwrite" +#~ msgid "0 sec" #~ msgstr "" -#~ msgid "Save as" +#~ msgid "View database query" +#~ msgstr "" + +#~ msgid "query" +#~ msgstr "" + +#~ msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" +#~ msgstr "" + +#~ msgid "Add filter" +#~ msgstr "" + +#~ msgid "Close" +#~ msgstr "" + +#~ msgid "Datasource Description" +#~ msgstr "" + +#~ msgid "Save a Slice" +#~ msgstr "" + +#~ msgid "Save & go to dashboard" +#~ msgstr "" + +#~ msgid "Run!" +#~ msgstr "" + +#~ msgid "Create View" +#~ msgstr "" + +#~ msgid "Welcome!" #~ msgstr "" diff --git a/superset/translations/zh/LC_MESSAGES/messages.mo b/superset/translations/zh/LC_MESSAGES/messages.mo index c0d8b095ba6aae0fcee7773df94df075ffa1d18e..88da85c2f1a09e3fd0d6097ebaf92009def10724 100644 GIT binary patch literal 35621 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 literal 5798 zcmd^>e{56N702&H*Os(fY0G|8Lgg}TlukG^p}*!fU6a@$VRquh1~jpbUi)3!H+g=~ zeLs>oQdKrqDBUQm70^Hs(3Ot9qrVA*q*sA7e+2vt zxEcIBI0h~T-vnviS@34C3eq|sgP#QFVR4e@gHX*Df@IGkEiVPh-e!>2X$A3P-C9n8 z*FfF?QhW@M;^t`iagf&822xy})!YM8Tn}pbkd|KsVH!IIlHL;_`E?4U_umIe-*2@1 zJCNdB1IdqzAlZ361hQu#NPc|*r13A~LH^tg(mGKsCqUBwEzPVR?+0l;SNE4evTGwq zdY=Hvk8L37`yoj4_kj4Z19yADhE(Eb8 zyB)-jEysiOwu0nW7f5y_LE7haAb!l$d<=wX>}inZ?*mEiARAxgY-NDlHH?P-VaioUj)golOWmkE=cyg2a-J>>hV8<16Y&wy~1eE^bw7r+wuXOQg6 zezv~f7PtiRFi3j#fHZ$U$l9`=vMmiBxAUxB<#~@^%t&WWlMgAcz|)Sj3{zQ>wcE~s zba>KsJhX>-(zMZVZ0d|zM#)yztlVY0X#1IrDS1ah;Ej${ivD?87E7k^q{}))wjg<0 z6{YQCT$or0s=B1`ilW5unw6IZZ!fbB(|0}C)?u4|(E@D8P?qrQISbG23|61p5!l>e z`6Y@latbR`e*q?*~H zsN*Yxlj}3SUDn~U*l@{_u1o0?8}=N*I+cl?A@_9CWvd+9F9kg_TiInhY6LC^nc%W+ zmvQrw}@ZbsQ2?G|fxNtpEKsiwt61JgoiX=O)EP9gn z3E>R*C19B0T}NeE0)w-2dqh#P9-EU+K7{>oBn+{n(ad^tIahkDcgRAj1y7eH1-tC1G3Cg)FW6*W_?F_kWGbT44y9F=UF{JA^1i7TN&R$(ba7Uo_wv6LoAIV z%epSlp<0w>C}gHDOawruz00%0;u*;W?Ie<^fah`^%tl7a#!Nm4eSC<2tuQ4xo-F)Sbsw!1RF#)i^_R~m!wlv z^%A19kL$Dx+9~NM_&v91FYS-xAlB7<=|EEA1ikT| zS}UE5?MfaL-CE@$@6<^B^b01flV;W~$|Y=FL1I4~N|2%$kk}k-qdri@pipM8E~-`V z^?_@v9AWvUpu%{V+reqLeCCA$=0OoMI@*?wrMnX`O6Hk%$W#N8t-}|DcbK+sP}4Mc z0)~In_PJqOcX&a%&Sq=G+!I* zOLh15H1$awZ(bo%1HR$`aC)~Lutgz#b?)cBD`}=JkERC z5S9lnS^B}IIBMD#c`P|nm=!{4DT>s?ABe{vGF7wfZiHKZfuQ89T&PgW} zv$8nst$c*vmr-8Rs+pn=wU;CKz-4eiw=}P8zN=~GZc{t>gUVBfYe$b&CU?%c(#&c8 zM{YOO!w0MT-oE;7Hd7~Gt{pr)z4y7`GIPbnrn>W3b=%R(#IwP${`gn7ZalwnD_*M} zcM^xSH=$O(I>V|PaduA+A?+W_|*83>gxxqV_R#_ zzf#@4W9rmi_TRt4)cvbY?6^AbFVmwZDNPAmCjO}lOnqbZ)p&WS9(iFlWh#dzE1R}ge)2jJ zy7J_K^P?~P@84M9U+u@6D|=7X>-rzuRP?q5-`oG=OG@?C=WB02eU)5MrpLZt-FK+^ a-NRGk+iII8Yp\n" "Language: zh\n" @@ -18,165 +18,258 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: superset/forms.py:140 +#: superset/db_engine_specs.py:79 superset/db_engine_specs.py:102 +#: superset/db_engine_specs.py:125 superset/db_engine_specs.py:160 +#: superset/db_engine_specs.py:268 superset/db_engine_specs.py:304 +#: superset/forms.py:436 +msgid "Time Column" +msgstr "时间字段" + +#: superset/db_engine_specs.py:80 superset/db_engine_specs.py:126 +#: superset/db_engine_specs.py:161 superset/db_engine_specs.py:269 +msgid "second" +msgstr "秒" + +#: superset/db_engine_specs.py:81 superset/db_engine_specs.py:129 +#: superset/db_engine_specs.py:163 superset/db_engine_specs.py:271 +#: superset/db_engine_specs.py:305 +msgid "minute" +msgstr "分" + +#: superset/db_engine_specs.py:82 superset/db_engine_specs.py:131 +#: superset/db_engine_specs.py:165 superset/db_engine_specs.py:277 +#: superset/db_engine_specs.py:307 superset/forms.py:380 superset/forms.py:394 +msgid "hour" +msgstr "小时" + +#: superset/db_engine_specs.py:83 superset/db_engine_specs.py:103 +#: superset/db_engine_specs.py:133 superset/db_engine_specs.py:167 +#: superset/db_engine_specs.py:279 superset/db_engine_specs.py:309 +#: superset/forms.py:381 superset/forms.py:395 +msgid "day" +msgstr "天" + +#: superset/db_engine_specs.py:84 superset/db_engine_specs.py:104 +#: superset/db_engine_specs.py:134 superset/db_engine_specs.py:169 +#: superset/db_engine_specs.py:281 superset/db_engine_specs.py:311 +#: superset/forms.py:366 superset/forms.py:382 superset/forms.py:396 +msgid "week" +msgstr "周" + +#: superset/db_engine_specs.py:85 superset/db_engine_specs.py:106 +#: superset/db_engine_specs.py:136 superset/db_engine_specs.py:171 +#: superset/db_engine_specs.py:283 superset/db_engine_specs.py:313 +#: superset/forms.py:369 superset/forms.py:383 superset/forms.py:397 +msgid "month" +msgstr "月" + +#: superset/db_engine_specs.py:86 superset/db_engine_specs.py:138 +#: superset/db_engine_specs.py:173 superset/db_engine_specs.py:285 +#: superset/db_engine_specs.py:315 +msgid "quarter" +msgstr "季度" + +#: superset/db_engine_specs.py:87 superset/db_engine_specs.py:140 +#: superset/db_engine_specs.py:287 superset/db_engine_specs.py:317 +#: superset/forms.py:384 +msgid "year" +msgstr "年" + +#: superset/db_engine_specs.py:175 superset/forms.py:368 +msgid "week_ending_saturday" +msgstr "周日为一周开始" + +#: superset/db_engine_specs.py:178 +msgid "week_start_sunday" +msgstr "周日为一周结束" + +#: superset/db_engine_specs.py:273 +msgid "5 minute" +msgstr "" + +#: superset/db_engine_specs.py:275 +msgid "half hour" +msgstr "" + +#: superset/forms.py:30 +msgid "D3 format syntax https://github.com/d3/d3-format" +msgstr "" + +#: superset/forms.py:143 msgid "Viz" msgstr "图表" -#: superset/forms.py:143 +#: superset/forms.py:146 msgid "The type of visualization to display" msgstr "显示图表类型" -#: superset/forms.py:146 +#: superset/forms.py:149 msgid "Metrics" msgstr "度量" -#: superset/forms.py:149 superset/forms.py:154 +#: superset/forms.py:152 superset/forms.py:157 msgid "One or many metrics to display" msgstr "显示一个或多个度量" -#: superset/forms.py:152 +#: superset/forms.py:155 msgid "Ordering" msgstr "排序" -#: superset/forms.py:157 superset/views.py:294 superset/views.py:334 +#: superset/forms.py:160 superset/views.py:455 superset/views.py:495 msgid "Metric" msgstr "度量" -#: superset/forms.py:160 +#: superset/forms.py:163 msgid "Choose the metric" msgstr "选择度量" -#: superset/forms.py:163 +#: superset/forms.py:166 msgid "Chart Style" msgstr "图表样式" -#: superset/forms.py:165 +#: superset/forms.py:168 msgid "stack" msgstr "堆积" -#: superset/forms.py:166 +#: superset/forms.py:169 msgid "stream" msgstr "流" -#: superset/forms.py:167 +#: superset/forms.py:170 msgid "expand" msgstr "展开" -#: superset/forms.py:173 +#: superset/forms.py:176 msgid "Color Scheme" msgstr "配色" -#: superset/forms.py:175 +#: superset/forms.py:178 msgid "fire" msgstr "火焰" -#: superset/forms.py:176 +#: superset/forms.py:179 msgid "blue_white_yellow" msgstr "蓝白黄" -#: superset/forms.py:177 +#: superset/forms.py:180 msgid "white_black" msgstr "白黑" -#: superset/forms.py:178 +#: superset/forms.py:181 msgid "black_white" msgstr "黑白" -#: superset/forms.py:184 +#: superset/forms.py:187 msgid "Normalize Across" msgstr "标准化" -#: superset/forms.py:186 +#: superset/forms.py:189 msgid "heatmap" msgstr "热力图" -#: superset/forms.py:187 +#: superset/forms.py:190 msgid "x" msgstr "" -#: superset/forms.py:188 +#: superset/forms.py:191 msgid "y" msgstr "" -#: superset/forms.py:191 +#: superset/forms.py:194 msgid "" "Color will be rendered based on a ratio of the cell against the sum of " "across this criteria" msgstr "颜色将根据比例进行渲染" -#: superset/forms.py:197 +#: superset/forms.py:200 msgid "Color Scale" msgstr "色阶" -#: superset/forms.py:199 +#: superset/forms.py:202 msgid "series" msgstr "项目" -#: superset/forms.py:200 +#: superset/forms.py:203 msgid "overall" msgstr "综合" -#: superset/forms.py:201 +#: superset/forms.py:204 msgid "change" msgstr "变化" -#: superset/forms.py:204 +#: superset/forms.py:207 msgid "Defines how the color are attributed." msgstr "定义颜色属性" -#: superset/forms.py:207 +#: superset/forms.py:210 msgid "Rendering" msgstr "渲染" -#: superset/forms.py:209 +#: superset/forms.py:212 msgid "pixelated (Sharp)" msgstr "像素化(锐利)" -#: superset/forms.py:210 +#: superset/forms.py:213 msgid "auto (Smooth)" msgstr "自动(平滑)" -#: superset/forms.py:213 +#: superset/forms.py:216 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "浏览器渲染图片的方式" -#: superset/forms.py:218 +#: superset/forms.py:221 msgid "XScale Interval" msgstr "X轴步长" -#: superset/forms.py:221 +#: superset/forms.py:224 msgid "Number of step to take between ticks when printing the x scale" msgstr "X轴每个刻度的单位长度" -#: superset/forms.py:226 +#: superset/forms.py:229 msgid "YScale Interval" msgstr "Y轴步长" -#: superset/forms.py:229 +#: superset/forms.py:232 msgid "Number of step to take between ticks when printing the y scale" msgstr "Y轴每个刻度的单位长度" -#: superset/forms.py:234 +#: superset/forms.py:237 msgid "Stacked Bars" msgstr "堆积" -#: superset/forms.py:239 +#: superset/forms.py:242 +msgid "Show Markers" +msgstr "" + +#: superset/forms.py:249 +msgid "Bar Values" +msgstr "" + +#: superset/forms.py:254 +msgid "Sort Bars" +msgstr "" + +#: superset/forms.py:256 +msgid "Sort bars by x labels." +msgstr "" + +#: superset/forms.py:259 msgid "Extra Controls" msgstr "扩展控件" -#: superset/forms.py:241 +#: superset/forms.py:261 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "是否显示扩展控件" -#: superset/forms.py:247 +#: superset/forms.py:267 msgid "Reduce X ticks" msgstr "X轴自适应" -#: superset/forms.py:249 +#: superset/forms.py:269 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 " @@ -184,874 +277,919 @@ msgid "" "scroll." msgstr "当X轴显示不下时,自动调整X轴步长" -#: superset/forms.py:257 +#: superset/forms.py:277 msgid "Include Series" msgstr "显示项目" -#: superset/forms.py:259 +#: superset/forms.py:279 msgid "Include series name as an axis" msgstr "坐标上显示项目名称" -#: superset/forms.py:262 +#: superset/forms.py:282 msgid "Color Metric" msgstr "颜色度量" -#: superset/forms.py:265 +#: superset/forms.py:285 msgid "A metric to use for color" msgstr "颜色度量项目" -#: superset/forms.py:268 +#: superset/forms.py:288 msgid "Country Field Type" msgstr "国家名称编码方式" -#: superset/forms.py:271 +#: superset/forms.py:291 msgid "Full name" msgstr "全名" -#: superset/forms.py:272 +#: superset/forms.py:292 msgid "code International Olympic Committee (cioc)" msgstr "国际奥委会编码(cioc)" -#: superset/forms.py:273 +#: superset/forms.py:293 msgid "code ISO 3166-1 alpha-2 (cca2)" msgstr "ISO 3166-1 alpha-2编码(cca2)" -#: superset/forms.py:274 +#: superset/forms.py:294 msgid "code ISO 3166-1 alpha-3 (cca3)" msgstr "ISO 3166-1 alpha-3编码(cca3)" -#: superset/forms.py:276 +#: superset/forms.py:296 msgid "" "The country code standard that Superset should expect to find in the " "[country] column" msgstr "数据库中国家名称类型" -#: superset/forms.py:281 +#: superset/forms.py:301 msgid "Group by" msgstr "分组" -#: superset/forms.py:283 +#: superset/forms.py:303 msgid "One or many fields to group by" msgstr "根据一个或多个字段分组" -#: superset/forms.py:286 superset/forms.py:291 +#: superset/forms.py:306 superset/forms.py:311 msgid "Columns" msgstr "列" -#: superset/forms.py:288 +#: superset/forms.py:308 msgid "One or many fields to pivot as columns" msgstr "将一个或多个字段做为列" -#: superset/forms.py:293 superset/forms.py:298 superset/forms.py:303 +#: superset/forms.py:313 superset/forms.py:319 superset/forms.py:325 msgid "Columns to display" msgstr "显示列" -#: superset/forms.py:296 +#: superset/forms.py:316 msgid "X" msgstr "" -#: superset/forms.py:301 +#: superset/forms.py:322 msgid "Y" msgstr "" -#: superset/forms.py:306 +#: superset/forms.py:328 msgid "Origin" msgstr "起点" -#: superset/forms.py:308 +#: superset/forms.py:330 msgid "default" msgstr "默认" -#: superset/forms.py:309 superset/forms.py:467 +#: superset/forms.py:331 superset/forms.py:500 msgid "now" msgstr "现在" -#: superset/forms.py:312 +#: superset/forms.py:334 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "'now', 'sunday' or '1970-01-01'" msgstr "定义时间起点,支持'now', 'sunday' or '1970-01-01'等" -#: superset/forms.py:317 +#: superset/forms.py:339 msgid "Bottom Margin" msgstr "底部留白" -#: superset/forms.py:320 +#: superset/forms.py:342 msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "底部留白的像素大小" -#: superset/forms.py:325 +#: superset/forms.py:347 +msgid "Page Length" +msgstr "" + +#: superset/forms.py:350 +msgid "Number of rows per page, 0 means no pagination" +msgstr "" + +#: superset/forms.py:354 msgid "Time Granularity" msgstr "时间粒度" -#: superset/forms.py:328 +#: superset/forms.py:357 msgid "all" msgstr "全部" -#: superset/forms.py:329 +#: superset/forms.py:358 msgid "5 seconds" msgstr "5秒" -#: superset/forms.py:330 +#: superset/forms.py:359 msgid "30 seconds" msgstr "30秒" -#: superset/forms.py:331 +#: superset/forms.py:360 msgid "1 minute" msgstr "1分钟" -#: superset/forms.py:332 +#: superset/forms.py:361 msgid "5 minutes" msgstr "5分钟" -#: superset/forms.py:333 +#: superset/forms.py:362 msgid "1 hour" msgstr "1小时" -#: superset/forms.py:334 +#: superset/forms.py:363 msgid "6 hour" msgstr "6小时" -#: superset/forms.py:335 +#: superset/forms.py:364 msgid "1 day" msgstr "1天" -#: superset/forms.py:336 +#: superset/forms.py:365 msgid "7 days" msgstr "1周" -#: superset/forms.py:338 +#: superset/forms.py:367 +msgid "week_starting_sunday" +msgstr "" + +#: superset/forms.py:371 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 "图表时间粒度。可以使用'10 seconds', '1 day', '56 weeks'等" -#: superset/forms.py:344 +#: superset/forms.py:377 msgid "Domain" msgstr "区域" -#: superset/forms.py:347 superset/forms.py:361 superset/models.py:417 -#: superset/models.py:435 -msgid "hour" -msgstr "小时" - -#: superset/forms.py:348 superset/forms.py:362 superset/models.py:419 -#: superset/models.py:427 superset/models.py:436 -msgid "day" -msgstr "天" - -#: superset/forms.py:349 superset/forms.py:363 superset/models.py:407 -#: superset/models.py:420 superset/models.py:428 superset/models.py:437 -msgid "week" -msgstr "周" - -#: superset/forms.py:350 superset/forms.py:364 superset/models.py:408 -#: superset/models.py:422 superset/models.py:429 superset/models.py:438 -msgid "month" -msgstr "月" - -#: superset/forms.py:351 superset/models.py:439 -msgid "year" -msgstr "年" - -#: superset/forms.py:353 +#: superset/forms.py:386 msgid "The time unit used for the grouping of blocks" msgstr "每个区域表示的时间段" -#: superset/forms.py:357 +#: superset/forms.py:390 msgid "Subdomain" msgstr "方块" -#: superset/forms.py:360 superset/forms.py:701 +#: superset/forms.py:393 superset/forms.py:744 msgid "min" msgstr "分钟" -#: superset/forms.py:366 +#: superset/forms.py:399 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/forms.py:371 +#: superset/forms.py:404 msgid "Link Length" msgstr "链接长度" -#: superset/forms.py:383 +#: superset/forms.py:416 msgid "Link length in the force layout" msgstr "有向图中的链接长度" -#: superset/forms.py:386 +#: superset/forms.py:419 msgid "Charge" msgstr "缩放" -#: superset/forms.py:400 +#: superset/forms.py:433 msgid "Charge in the force layout" msgstr "有向图缩放大小" -#: superset/forms.py:403 superset/models.py:406 superset/models.py:416 -#: superset/models.py:426 superset/models.py:432 -msgid "Time Column" -msgstr "时间字段" - -#: superset/forms.py:406 +#: superset/forms.py:439 msgid "" "The time column for the visualization. Note that you can define arbitrary" " expression that return a DATETIME column in the table editor. Also note " "that the filter below is applied against this column or expression" msgstr "图表中的时间字段。可以在表格编辑器中返回任意DATETIME列。" -#: superset/forms.py:414 +#: superset/forms.py:447 msgid "Resample Rule" msgstr "重采样尺度" -#: superset/forms.py:417 +#: superset/forms.py:450 msgid "1T" msgstr "" -#: superset/forms.py:418 +#: superset/forms.py:451 msgid "1H" msgstr "" -#: superset/forms.py:419 +#: superset/forms.py:452 msgid "1D" msgstr "" -#: superset/forms.py:420 +#: superset/forms.py:453 msgid "7D" msgstr "" -#: superset/forms.py:421 +#: superset/forms.py:454 msgid "1M" msgstr "" -#: superset/forms.py:422 +#: superset/forms.py:455 msgid "1AS" msgstr "" -#: superset/forms.py:424 +#: superset/forms.py:457 msgid "Pandas resample rule" msgstr "重采样尺度" -#: superset/forms.py:427 +#: superset/forms.py:460 msgid "Resample How" msgstr "重采样方式" -#: superset/forms.py:431 superset/forms.py:700 +#: superset/forms.py:464 superset/forms.py:743 msgid "mean" msgstr "平均值" -#: superset/forms.py:432 superset/forms.py:699 +#: superset/forms.py:465 superset/forms.py:742 msgid "sum" msgstr "求和" -#: superset/forms.py:433 superset/forms.py:703 +#: superset/forms.py:466 superset/forms.py:746 msgid "median" msgstr "中间值" -#: superset/forms.py:435 +#: superset/forms.py:468 msgid "Pandas resample how" msgstr "重采样方式" -#: superset/forms.py:438 +#: superset/forms.py:471 msgid "Resample Fill Method" msgstr "插值方式" -#: superset/forms.py:442 +#: superset/forms.py:475 msgid "ffill" msgstr "" -#: superset/forms.py:443 +#: superset/forms.py:476 msgid "bfill" msgstr "" -#: superset/forms.py:445 +#: superset/forms.py:478 msgid "Pandas resample fill method" msgstr "重采样插值方式" -#: superset/forms.py:448 +#: superset/forms.py:481 msgid "Since" msgstr "起始时间" -#: superset/forms.py:451 +#: superset/forms.py:484 msgid "1 hour ago" msgstr "1小时前" -#: superset/forms.py:452 +#: superset/forms.py:485 msgid "12 hours ago" msgstr "12小时前" -#: superset/forms.py:453 superset/forms.py:468 +#: superset/forms.py:486 superset/forms.py:501 msgid "1 day ago" msgstr "1天前" -#: superset/forms.py:454 superset/forms.py:469 +#: superset/forms.py:487 superset/forms.py:502 msgid "7 days ago" msgstr "7天前" -#: superset/forms.py:455 superset/forms.py:470 +#: superset/forms.py:488 superset/forms.py:503 msgid "28 days ago" msgstr "28天前" -#: superset/forms.py:456 superset/forms.py:471 +#: superset/forms.py:489 superset/forms.py:504 msgid "90 days ago" msgstr "90天前" -#: superset/forms.py:457 superset/forms.py:472 +#: superset/forms.py:490 superset/forms.py:505 msgid "1 year ago" msgstr "1年前" -#: superset/forms.py:459 +#: superset/forms.py:492 msgid "" "Timestamp from filter. This supports free form typing and natural " "language as in '1 day ago', '28 days' or '3 years'" msgstr "时间范围。支持自定义,可使用自然语言,如'1 day ago', '28 days' or '3 years'" -#: superset/forms.py:464 +#: superset/forms.py:497 msgid "Until" msgstr "结束时间" -#: superset/forms.py:476 +#: superset/forms.py:509 msgid "Max Bubble Size" msgstr "气泡最大尺寸" -#: superset/forms.py:489 +#: superset/forms.py:522 msgid "Whisker/outlier options" msgstr "非异常值选项" -#: superset/forms.py:491 +#: superset/forms.py:524 msgid "Determines how whiskers and outliers are calculated." msgstr "计算最大/最小非异常值的方法" -#: superset/forms.py:494 +#: superset/forms.py:527 msgid "Tukey" msgstr "图基法" -#: superset/forms.py:495 +#: superset/forms.py:528 msgid "Min/max (no outliers)" msgstr "最小/最大值(无异常值)" -#: superset/forms.py:496 +#: superset/forms.py:529 msgid "2/98 percentiles" msgstr "2/98百分比" -#: superset/forms.py:497 +#: superset/forms.py:530 msgid "9/91 percentiles" msgstr "9/91百分比" -#: superset/forms.py:501 +#: superset/forms.py:534 msgid "Ratio" msgstr "比例" -#: superset/forms.py:503 +#: superset/forms.py:536 msgid "Target aspect ratio for treemap tiles." msgstr "树状图中方块的比例" -#: superset/forms.py:506 superset/viz.py:856 superset/viz.py:905 +#: superset/forms.py:539 superset/viz.py:918 superset/viz.py:967 msgid "Number format" msgstr "数字格式" -#: superset/forms.py:516 -msgid "" -"D3 format syntax for numbers https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "自定义格式请参考 https://github.com/mbostock/d3/wiki/Formatting" - -#: superset/forms.py:521 +#: superset/forms.py:552 msgid "Row limit" msgstr "行数上限" -#: superset/forms.py:527 +#: superset/forms.py:558 msgid "Series limit" msgstr "项目上限" -#: superset/forms.py:530 +#: superset/forms.py:561 msgid "Limits the number of time series that get displayed" msgstr "设置显示项目的数量上限" -#: superset/forms.py:534 +#: superset/forms.py:565 +msgid "Sort By" +msgstr "" + +#: superset/forms.py:568 +msgid "Metric used to define the top series" +msgstr "" + +#: superset/forms.py:571 msgid "Rolling" msgstr "滚动" -#: superset/forms.py:537 +#: superset/forms.py:574 msgid "" "Defines a rolling window function to apply, works along with the " "[Periods] text box" msgstr "滚动窗口聚合函数,配合[周期]使用" -#: superset/forms.py:542 +#: superset/forms.py:579 msgid "Periods" msgstr "周期" -#: superset/forms.py:544 +#: superset/forms.py:581 msgid "" "Defines the size of the rolling window function, relative to the time " "granularity selected" msgstr "滚动窗口大小,取值和时间粒度相关" -#: superset/forms.py:549 superset/viz.py:1192 +#: superset/forms.py:586 superset/viz.py:1329 msgid "Series" msgstr "项目" -#: superset/forms.py:552 +#: superset/forms.py:589 msgid "" -"Defines the grouping of entities. Each serie is shown as a specific color" -" on the chart and has a legend toggle" -msgstr "定义分组实体。每个项目有特定的颜色和图例。" +"Defines the grouping of entities. Each series is shown as a specific " +"color on the chart and has a legend toggle" +msgstr "" -#: superset/forms.py:558 +#: superset/forms.py:595 msgid "Entity" msgstr "实体" -#: superset/forms.py:561 +#: superset/forms.py:598 msgid "This define the element to be plotted on the chart" msgstr "在图表上绘制的元素" -#: superset/forms.py:564 +#: superset/forms.py:601 msgid "X Axis" msgstr "X轴" -#: superset/forms.py:567 +#: superset/forms.py:604 msgid "Metric assigned to the [X] axis" msgstr "X轴对应的项目" -#: superset/forms.py:570 +#: superset/forms.py:607 msgid "Y Axis" msgstr "Y轴" -#: superset/forms.py:573 +#: superset/forms.py:610 msgid "Metric assigned to the [Y] axis" msgstr "Y轴对应的项目" -#: superset/forms.py:576 +#: superset/forms.py:613 msgid "Bubble Size" msgstr "气泡大小" -#: superset/forms.py:581 +#: superset/forms.py:618 msgid "URL" msgstr "" -#: superset/forms.py:582 +#: superset/forms.py:619 msgid "" "The URL, this field is templated, so you can integrate {{ width }} and/or" " {{ height }} in your URL string." msgstr "" -#: superset/forms.py:589 +#: superset/forms.py:626 msgid "X Axis Label" msgstr "X轴名称" -#: superset/forms.py:593 +#: superset/forms.py:630 msgid "Y Axis Label" msgstr "Y轴名称" -#: superset/forms.py:597 +#: superset/forms.py:634 msgid "Custom WHERE clause" msgstr "WHERE语句" -#: superset/forms.py:599 +#: superset/forms.py:636 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 "语句将包含到WHERE子句中,并用AND连接到其他条件。" -#: superset/forms.py:606 +#: superset/forms.py:643 msgid "Custom HAVING clause" msgstr "HAVING语句" -#: superset/forms.py:608 +#: superset/forms.py:645 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 "语句将包含到HAVE子句中,并用AND连接到其他条件" -#: superset/forms.py:615 +#: superset/forms.py:652 msgid "Comparison Period Lag" msgstr "滞后比较周期" -#: superset/forms.py:616 +#: superset/forms.py:653 msgid "Based on granularity, number of time periods to compare against" msgstr "比较的时间周期,基于时间粒度" -#: superset/forms.py:621 +#: superset/forms.py:658 msgid "Comparison suffix" msgstr "后缀文字" -#: superset/forms.py:622 +#: superset/forms.py:659 msgid "Suffix to apply after the percentage display" msgstr "百分比后面显示的文本" -#: superset/forms.py:625 +#: superset/forms.py:662 msgid "Table Timestamp Format" msgstr "时间格式" -#: superset/forms.py:628 +#: superset/forms.py:665 msgid "Timestamp Format" msgstr "时间格式" -#: superset/forms.py:631 +#: superset/forms.py:668 msgid "Series Height" msgstr "项目高度" -#: superset/forms.py:634 +#: superset/forms.py:671 msgid "Pixel height of each series" msgstr "每个项目的像素高度" -#: superset/forms.py:637 +#: superset/forms.py:674 msgid "X axis format" msgstr "X轴数值格式" -#: superset/forms.py:640 superset/forms.py:655 -msgid "" -"D3 format syntax for y axis https: //github.com/mbostock/\n" -"d3/wiki/Formatting" -msgstr "自定义格式请参考 https://github.com/mbostock/d3/wiki/Formatting" - -#: superset/forms.py:645 +#: superset/forms.py:680 msgid "Y axis format" msgstr "Y轴数值格式" -#: superset/forms.py:660 +#: superset/forms.py:693 msgid "Markup Type" msgstr "标记类型" -#: superset/forms.py:662 +#: superset/forms.py:695 msgid "markdown" msgstr "" -#: superset/forms.py:663 +#: superset/forms.py:696 msgid "html" msgstr "" -#: superset/forms.py:666 +#: superset/forms.py:699 msgid "Pick your favorite markup language" msgstr "选择标记语言" -#: superset/forms.py:669 +#: superset/forms.py:702 msgid "Rotation" msgstr "旋转" -#: superset/forms.py:671 +#: superset/forms.py:704 msgid "random" msgstr "随机" -#: superset/forms.py:672 +#: superset/forms.py:705 msgid "flat" msgstr "水平" -#: superset/forms.py:673 +#: superset/forms.py:706 msgid "square" msgstr "方格" -#: superset/forms.py:676 +#: superset/forms.py:709 msgid "Rotation to apply to words in the cloud" msgstr "词汇云中词语的旋转方式" -#: superset/forms.py:679 +#: superset/forms.py:712 msgid "Line Style" msgstr "线形" -#: superset/forms.py:681 +#: superset/forms.py:714 msgid "linear" msgstr "折线" -#: superset/forms.py:682 +#: superset/forms.py:715 msgid "basis" msgstr "B样条曲线" -#: superset/forms.py:683 +#: superset/forms.py:716 msgid "cardinal" msgstr "基本样条曲线" -#: superset/forms.py:684 +#: superset/forms.py:717 msgid "monotone" msgstr "三次插值曲线" -#: superset/forms.py:685 +#: superset/forms.py:718 msgid "step-before" msgstr "前阶梯线" -#: superset/forms.py:686 +#: superset/forms.py:719 msgid "step-after" msgstr "后阶梯线" -#: superset/forms.py:689 +#: superset/forms.py:722 msgid "Line interpolation as defined by d3.js" msgstr "定义线形" -#: superset/forms.py:692 +#: superset/forms.py:725 +msgid "Label Type" +msgstr "" + +#: superset/forms.py:728 +msgid "Category Name" +msgstr "" + +#: superset/forms.py:729 +msgid "Value" +msgstr "" + +#: superset/forms.py:730 +msgid "Percentage" +msgstr "" + +#: superset/forms.py:732 +msgid "What should be shown on the label?" +msgstr "" + +#: superset/forms.py:735 msgid "Code" msgstr "代码" -#: superset/forms.py:693 +#: superset/forms.py:736 msgid "Put your code here" msgstr "输入代码" -#: superset/forms.py:697 +#: superset/forms.py:740 msgid "Aggregation function" msgstr "聚合函数" -#: superset/forms.py:702 +#: superset/forms.py:745 msgid "max" msgstr "最大值" -#: superset/forms.py:704 +#: superset/forms.py:747 msgid "stdev" msgstr "标准差" -#: superset/forms.py:705 +#: superset/forms.py:748 msgid "var" msgstr "变量值" -#: superset/forms.py:708 +#: superset/forms.py:751 msgid "" "Aggregate function to apply when pivoting and computing the total rows " "and columns" msgstr "透视时计算行和列的聚合函数" -#: superset/forms.py:713 +#: superset/forms.py:756 msgid "Font Size From" msgstr "最小字体" -#: superset/forms.py:715 +#: superset/forms.py:758 msgid "Font size for the smallest value in the list" msgstr "列表中最小值的字体大小" -#: superset/forms.py:718 +#: superset/forms.py:761 msgid "Font Size To" msgstr "最大字体" -#: superset/forms.py:720 +#: superset/forms.py:763 msgid "Font size for the biggest value in the list" msgstr "列表中最大值的字体大小" -#: superset/forms.py:723 +#: superset/forms.py:766 msgid "Range Filter" msgstr "区间过滤" -#: superset/forms.py:725 +#: superset/forms.py:768 msgid "Whether to display the time range interactive selector" msgstr "是否显示时间区间选择控件" -#: superset/forms.py:729 +#: superset/forms.py:772 +msgid "Date Filter" +msgstr "" + +#: superset/forms.py:774 +msgid "Whether to include a time filter" +msgstr "" + +#: superset/forms.py:777 msgid "Data Table" msgstr "明细表" -#: superset/forms.py:731 +#: superset/forms.py:779 msgid "Whether to display the interactive data table" msgstr "是否显示明细表" -#: superset/forms.py:734 +#: superset/forms.py:782 msgid "Search Box" msgstr "搜索框" -#: superset/forms.py:736 +#: superset/forms.py:784 msgid "Whether to include a client side search box" msgstr "是否显示搜索框" -#: superset/forms.py:740 +#: superset/forms.py:788 +msgid "Table Filter" +msgstr "" + +#: superset/forms.py:790 +msgid "Whether to apply filter when table cell is clicked" +msgstr "" + +#: superset/forms.py:794 msgid "Show Bubbles" msgstr "显示气泡" -#: superset/forms.py:742 +#: superset/forms.py:796 msgid "Whether to display bubbles on top of countries" msgstr "是否在国家上显示气泡" -#: superset/forms.py:746 +#: superset/forms.py:800 msgid "Legend" msgstr "图例" -#: superset/forms.py:748 +#: superset/forms.py:802 msgid "Whether to display the legend (toggles)" msgstr "是否显示图例" -#: superset/forms.py:751 +#: superset/forms.py:805 msgid "X bounds" msgstr "X轴边界" -#: superset/forms.py:753 +#: superset/forms.py:807 msgid "Whether to display the min and max values of the X axis" msgstr "是否显示X轴的最大最小值" -#: superset/forms.py:757 +#: superset/forms.py:811 msgid "Rich Tooltip" msgstr "详细信息" -#: superset/forms.py:759 +#: superset/forms.py:813 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "显示特定时间点的所有项目" -#: superset/forms.py:764 +#: superset/forms.py:818 msgid "Y Axis Zero" msgstr "Y轴从0开始" -#: superset/forms.py:766 +#: superset/forms.py:820 msgid "Force the Y axis to start at 0 instead of the minimum value" msgstr "Y轴不是从最小值开始" -#: superset/forms.py:771 +#: superset/forms.py:825 msgid "Y Log" msgstr "Y轴对数刻度" -#: superset/forms.py:773 +#: superset/forms.py:827 msgid "Use a log scale for the Y axis" msgstr "Y轴刻度值按照对数分布显示" -#: superset/forms.py:776 +#: superset/forms.py:830 msgid "X Log" msgstr "X轴对数刻度" -#: superset/forms.py:778 +#: superset/forms.py:832 msgid "Use a log scale for the X axis" msgstr "X轴刻度值按照对数分布显示" -#: superset/forms.py:781 +#: superset/forms.py:835 msgid "Donut" msgstr "环形图" -#: superset/forms.py:783 +#: superset/forms.py:837 msgid "Do you want a donut or a pie?" msgstr "使用环形图替代饼图" -#: superset/forms.py:786 +#: superset/forms.py:840 +msgid "Put labels outside" +msgstr "" + +#: superset/forms.py:842 +msgid "Put the labels outside the pie?" +msgstr "" + +#: superset/forms.py:845 msgid "Contribution" msgstr "贡献值" -#: superset/forms.py:788 +#: superset/forms.py:847 msgid "Compute the contribution to the total" msgstr "在总和中的贡献值" -#: superset/forms.py:791 +#: superset/forms.py:850 msgid "Period Ratio" msgstr "周期比" -#: superset/forms.py:794 +#: superset/forms.py:853 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "[整数]要比较的周期数,和粒度有关" -#: superset/forms.py:799 +#: superset/forms.py:858 +msgid "Period Ratio Type" +msgstr "" + +#: superset/forms.py:861 +msgid "factor" +msgstr "" + +#: superset/forms.py:862 +msgid "growth" +msgstr "" + +#: superset/forms.py:863 +msgid "value" +msgstr "" + +#: superset/forms.py:865 +msgid "" +"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " +"is (new-previous)" +msgstr "" + +#: superset/forms.py:870 msgid "Time Shift" msgstr "时间飘移" -#: superset/forms.py:801 +#: superset/forms.py:872 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 "相关时间周期内的时间偏移。相对时间,如: 24 hours, 7 days, 56 weeks, 365 days" -#: superset/forms.py:808 +#: superset/forms.py:879 msgid "Subheader" msgstr "子标题" -#: superset/forms.py:809 +#: superset/forms.py:880 msgid "Description text that shows up below your Big Number" msgstr "在数字下显示的文本" -#: superset/forms.py:816 +#: superset/forms.py:887 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 "对分组使用COUNT(*)。" -#: superset/forms.py:832 +#: superset/forms.py:904 msgid "Base layer map style" msgstr "" -#: superset/forms.py:835 +#: superset/forms.py:907 msgid "Clustering Radius" msgstr "簇半径" -#: superset/forms.py:848 +#: superset/forms.py:920 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 "定义簇的半径大小(单位为像素)。0表示不显示簇。大量的点会导致显示缓慢。" -#: superset/forms.py:854 +#: superset/forms.py:926 msgid "Point Radius" msgstr "点半径" -#: superset/forms.py:857 +#: superset/forms.py:929 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 "不在簇中点的半径。选择'Auto'时根据最大的簇自动调整。" -#: superset/forms.py:863 +#: superset/forms.py:935 msgid "Point Radius Unit" msgstr "点半径单位" -#: superset/forms.py:870 +#: superset/forms.py:942 msgid "The unit of measure for the specified point radius" msgstr "点半径的测量单位" -#: superset/forms.py:873 +#: superset/forms.py:945 msgid "Opacity" msgstr "" -#: superset/forms.py:875 +#: superset/forms.py:947 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/forms.py:880 +#: superset/forms.py:952 msgid "Zoom" msgstr "" -#: superset/forms.py:883 +#: superset/forms.py:955 msgid "Zoom level of the map" msgstr "" -#: superset/forms.py:887 +#: superset/forms.py:959 msgid "Default latitude" msgstr "默认纬度" -#: superset/forms.py:889 +#: superset/forms.py:961 msgid "Latitude of default viewport" msgstr "视窗默认纬度" -#: superset/forms.py:893 +#: superset/forms.py:965 msgid "Default longitude" msgstr "默认经度" -#: superset/forms.py:895 +#: superset/forms.py:967 msgid "Longitude of default viewport" msgstr "视窗默认经度" -#: superset/forms.py:899 +#: superset/forms.py:971 msgid "Live render" msgstr "实时更新" -#: superset/forms.py:901 +#: superset/forms.py:973 msgid "Points and clusters will update as viewport is being changed" msgstr "视窗发生改变时,点和簇实时更新" -#: superset/forms.py:905 +#: superset/forms.py:978 msgid "RGB Color" msgstr "" -#: superset/forms.py:915 +#: superset/forms.py:988 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/forms.py:978 +#: superset/forms.py:1051 msgid "SQL" msgstr "" -#: superset/forms.py:980 +#: superset/forms.py:1053 msgid "This section exposes ways to include snippets of SQL in your query" msgstr "用于定制SQL语句" -#: superset/forms.py:991 +#: superset/forms.py:1064 msgid "Time Grain" msgstr "时间粒度" -#: superset/forms.py:994 +#: superset/forms.py:1067 msgid "" "The time granularity for the visualization. This applies a date " "transformation to alter your time column and defines a new time " @@ -1059,226 +1197,560 @@ msgid "" "in the Superset source code" msgstr "图表中的时间粒度。用于替换时间字段默认的时间粒度。" -#: superset/forms.py:1027 superset/forms.py:1031 +#: superset/forms.py:1102 superset/forms.py:1106 msgid "Filter 1" msgstr "" -#: superset/forms.py:1036 +#: superset/forms.py:1111 msgid "Super" msgstr "" -#: superset/forms.py:1040 +#: superset/forms.py:1115 msgid "Time" msgstr "时间" -#: superset/forms.py:1045 +#: superset/forms.py:1120 msgid "Time related form attributes" msgstr "时间相关的属性" -#: superset/models.py:409 -msgid "quarter" -msgstr "季度" +#: superset/models.py:1019 +msgid "" +"Datetime column not provided as part table configuration and is required " +"by this type of chart" +msgstr "缺少时间字段" -#: superset/models.py:410 -msgid "week_ending_saturday" -msgstr "周日为一周开始" +#: superset/models.py:2138 +msgid "No data was returned." +msgstr "没有数据" -#: superset/models.py:412 -msgid "week_start_sunday" -msgstr "周日为一周结束" - -#: superset/models.py:433 -msgid "second" -msgstr "秒" - -#: superset/models.py:434 -msgid "minute" -msgstr "分" - -#: superset/models.py:620 -msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" -msgstr "缺少时间字段" - -#: superset/models.py:1328 -msgid "No data was returned." -msgstr "没有数据" - -#: superset/views.py:203 +#: superset/views.py:342 msgid "" "Whether to make this column available as a [Time Granularity] option, " "column has to be DATETIME or DATETIME-like" msgstr "是否将此列作为[时间粒度]选项, 列中的数据类型必须是DATETIME" -#: superset/views.py:230 superset/views.py:259 +#: superset/views.py:369 superset/views.py:399 msgid "Column" msgstr "列" -#: superset/views.py:231 superset/views.py:296 superset/views.py:336 +#: superset/views.py:370 superset/views.py:457 superset/views.py:497 msgid "Verbose Name" msgstr "全称" -#: superset/views.py:232 superset/views.py:295 superset/views.py:335 -#: superset/views.py:537 superset/views.py:691 +#: superset/views.py:371 superset/views.py:456 superset/views.py:496 +#: superset/views.py:1042 superset/views.py:1266 msgid "Description" msgstr "描述" -#: superset/views.py:233 superset/views.py:262 +#: superset/views.py:372 superset/views.py:402 msgid "Groupable" msgstr "可分组" -#: superset/views.py:234 superset/views.py:263 +#: superset/views.py:373 superset/views.py:403 msgid "Filterable" msgstr "可筛选" -#: superset/views.py:235 superset/views.py:299 superset/views.py:433 -#: superset/views.py:543 +#: superset/views.py:374 superset/views.py:460 superset/views.py:891 +#: superset/views.py:1048 msgid "Table" msgstr "表" -#: superset/views.py:236 superset/views.py:264 +#: superset/views.py:375 superset/views.py:404 msgid "Count Distinct" msgstr "计数" -#: superset/views.py:237 superset/views.py:265 +#: superset/views.py:376 superset/views.py:405 msgid "Sum" msgstr "求和" -#: superset/views.py:238 superset/views.py:266 +#: superset/views.py:377 superset/views.py:406 msgid "Min" msgstr "最小值" -#: superset/views.py:239 superset/views.py:267 +#: superset/views.py:378 superset/views.py:407 msgid "Max" msgstr "最大值" -#: superset/views.py:240 +#: superset/views.py:379 msgid "Expression" msgstr "表达式" -#: superset/views.py:241 +#: superset/views.py:380 msgid "Is temporal" msgstr "表示时间" -#: superset/views.py:242 +#: superset/views.py:381 msgid "Datetime Format" msgstr "时间格式" -#: superset/views.py:243 +#: superset/views.py:382 msgid "Database Expression" msgstr "数据库表达式" -#: superset/views.py:260 superset/views.py:297 superset/views.py:337 -#: superset/views.py:568 +#: superset/views.py:400 superset/views.py:458 superset/views.py:498 msgid "Type" msgstr "类型" -#: superset/views.py:261 superset/views.py:536 +#: superset/views.py:401 superset/views.py:958 superset/views.py:1041 msgid "Datasource" msgstr "数据源" -#: superset/views.py:286 superset/views.py:328 +#: superset/views.py:440 superset/views.py:489 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 " "metric)' are allowed to access this metric" msgstr "是否访问受限。只有有权限的用户才能访问。" -#: superset/views.py:298 +#: superset/views.py:459 msgid "SQL Expression" msgstr "SQL表达式" -#: superset/views.py:338 superset/views.py:656 +#: superset/views.py:499 superset/views.py:1215 msgid "JSON" msgstr "" -#: superset/views.py:339 +#: superset/views.py:500 msgid "Druid Datasource" msgstr "Druid数据源" -#: superset/views.py:378 superset/views.py:435 +#: superset/views.py:545 +msgid "Expose this DB in SQL Lab" +msgstr "" + +#: superset/views.py:546 +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 " +"(<~1 minute)" +msgstr "" + +#: superset/views.py:550 +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." +msgstr "" + +#: superset/views.py:554 +msgid "Allow CREATE TABLE AS option in SQL Lab" +msgstr "" + +#: superset/views.py:555 +msgid "" +"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" +" SQL Lab" +msgstr "" + +#: superset/views.py:559 +msgid "" +"When allowing CREATE TABLE AS option in SQL Lab, this option forces the " +"table to be created in this schema" +msgstr "" + +#: superset/views.py:573 +msgid "Expose in SQL Lab" +msgstr "" + +#: superset/views.py:574 +msgid "Allow CREATE TABLE AS" +msgstr "" + +#: superset/views.py:575 +msgid "Allow DML" +msgstr "" + +#: superset/views.py:576 +msgid "CTAS Schema" +msgstr "" + +#: superset/views.py:577 superset/views.py:893 msgid "Database" msgstr "数据库" -#: superset/views.py:379 -msgid "SQL link" -msgstr "SQL查询" - -#: superset/views.py:380 superset/views.py:534 superset/views.py:610 +#: superset/views.py:578 superset/views.py:1039 superset/views.py:1143 msgid "Creator" msgstr "作者" -#: superset/views.py:381 superset/views.py:436 +#: superset/views.py:579 superset/views.py:894 msgid "Last Changed" msgstr "更新时间" -#: superset/views.py:382 +#: superset/views.py:580 msgid "SQLAlchemy URI" msgstr "" -#: superset/views.py:383 superset/views.py:442 superset/views.py:533 -#: superset/views.py:697 +#: superset/views.py:581 superset/views.py:899 superset/views.py:1038 +#: superset/views.py:1272 msgid "Cache Timeout" msgstr "缓存时间" -#: superset/views.py:384 +#: superset/views.py:582 msgid "Extra" msgstr "扩展" -#: superset/views.py:434 -msgid "Changed By" -msgstr "修改人" +#: superset/views.py:637 +msgid "CSV File" +msgstr "" -#: superset/views.py:437 -msgid "SQL Editor" -msgstr "SQL查询" +#: superset/views.py:637 +msgid "Select a CSV file to be uploaded to a database." +msgstr "" -#: superset/views.py:438 superset/views.py:693 -msgid "Is Featured" -msgstr "是否突出" +#: superset/views.py:638 +msgid "CSV Files Only!" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter" +msgstr "" + +#: superset/views.py:639 +msgid "Delimiter used by CSV file (for whitespace use \\s+)." +msgstr "" + +#: superset/views.py:641 +msgid "Header Row" +msgstr "" + +#: superset/views.py:641 +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/views.py:644 +msgid "Column Names" +msgstr "" + +#: superset/views.py:644 +msgid "" +"List of comma-separated column names to use if header row not specified " +"above. Leave empty if header field populated." +msgstr "" + +#: superset/views.py:647 +msgid "Index Column" +msgstr "" + +#: superset/views.py:647 +msgid "" +"Column to use as the row labels of the dataframe. Leave empty if no index" +" column." +msgstr "" + +#: superset/views.py:650 +msgid "Squeeze" +msgstr "" + +#: superset/views.py:650 +msgid "" +"Parse the data as a series (specify this option if the data contains only" +" one column." +msgstr "" + +#: superset/views.py:652 +msgid "Prefix" +msgstr "" + +#: superset/views.py:652 +msgid "" +"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " +"X1\")." +msgstr "" + +#: superset/views.py:655 +msgid "Mangle Duplicate Columns" +msgstr "" + +#: superset/views.py:655 +msgid "Specify duplicate columns as \"X.0, X.1\"." +msgstr "" + +#: superset/views.py:657 +msgid "Skip Initial Space" +msgstr "" + +#: superset/views.py:657 +msgid "Skip spaces after delimiter." +msgstr "" + +#: superset/views.py:658 +msgid "Skip Rows" +msgstr "" + +#: superset/views.py:658 +msgid "Number of rows to skip at start of file." +msgstr "" + +#: superset/views.py:660 +msgid "Rows to Read" +msgstr "" + +#: superset/views.py:660 +msgid "Number of rows of file to read." +msgstr "" + +#: superset/views.py:662 +msgid "Skip Blank Lines" +msgstr "" + +#: superset/views.py:662 +msgid "Skip blank lines rather than interpreting them as NaN values." +msgstr "" + +#: superset/views.py:664 +msgid "Parse Dates" +msgstr "" + +#: superset/views.py:664 +msgid "Parse date values." +msgstr "" + +#: superset/views.py:665 +msgid "Infer Datetime Format" +msgstr "" + +#: superset/views.py:665 +msgid "Use Pandas to interpret the datetime format automatically." +msgstr "" + +#: superset/views.py:667 +msgid "Day First" +msgstr "" + +#: superset/views.py:667 +msgid "Use DD/MM (European/International) date format." +msgstr "" + +#: superset/views.py:668 +msgid "Thousands Separator" +msgstr "" + +#: superset/views.py:668 +msgid "Separator for values in thousands." +msgstr "" + +#: superset/views.py:670 +msgid "Decimal Character" +msgstr "" + +#: superset/views.py:670 +msgid "Character to interpret as decimal point." +msgstr "" + +#: superset/views.py:672 +msgid "Quote Character" +msgstr "" + +#: superset/views.py:672 +msgid "Character used to denote the start and end of a quoted item." +msgstr "" + +#: superset/views.py:675 +msgid "Escape Character" +msgstr "" + +#: superset/views.py:675 +msgid "Character used to escape a quoted item." +msgstr "" + +#: superset/views.py:677 +msgid "Comment Character" +msgstr "" + +#: superset/views.py:677 +msgid "Character used to denote the start of a comment." +msgstr "" + +#: superset/views.py:679 +msgid "Encoding" +msgstr "" + +#: superset/views.py:679 +msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." +msgstr "" + +#: superset/views.py:681 +msgid "Error On Bad Lines" +msgstr "" + +#: superset/views.py:681 +msgid "" +"Error on bad lines (e.g. a line with too many commas). If false these bad" +" lines will instead be dropped from the resulting dataframe." +msgstr "" + +#: superset/views.py:687 +msgid "Table Name" +msgstr "" + +#: superset/views.py:687 +msgid "Name of table to be created from csv data." +msgstr "" + +#: superset/views.py:689 +msgid "Database URI" +msgstr "" + +#: superset/views.py:689 +msgid "URI of database in which to add above table." +msgstr "" -#: superset/views.py:439 +#: superset/views.py:691 superset/views.py:896 msgid "Schema" msgstr "模式" -#: superset/views.py:440 superset/views.py:695 +#: superset/views.py:691 +msgid "Specify a schema (if database flavour supports this)." +msgstr "" + +#: superset/views.py:693 +msgid "Table Exists" +msgstr "" + +#: superset/views.py:693 +msgid "" +"If table exists do one of the following: Fail (do nothing), Replace (drop" +" and recreate table) or Append (insert data)." +msgstr "" + +#: superset/views.py:696 +msgid "Fail" +msgstr "" + +#: superset/views.py:696 +msgid "Replace" +msgstr "" + +#: superset/views.py:696 +msgid "Append" +msgstr "" + +#: superset/views.py:698 +msgid "Dataframe Index" +msgstr "" + +#: superset/views.py:698 +msgid "Write dataframe index as a column." +msgstr "" + +#: superset/views.py:699 +msgid "Column Label(s)" +msgstr "" + +#: superset/views.py:699 +msgid "" +"Column label for index column(s). If None is given and Dataframe Index is" +" True, Index Names are used." +msgstr "" + +#: superset/views.py:702 +msgid "Chunksize" +msgstr "" + +#: superset/views.py:702 +msgid "" +"If not None, rows will be written in batches of this size at a time. If " +"None, all rows will be written at once." +msgstr "" + +#: superset/views.py:709 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views.py:792 +msgid "CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"" +msgstr "" + +#: superset/views.py:875 superset/views.py:1257 +msgid "Timezone offset (in hours) for this datasource" +msgstr "数据源的时差(单位:小时)" + +#: superset/views.py:876 +msgid "Name of the table that exists in the source database" +msgstr "" + +#: superset/views.py:878 +msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" +msgstr "" + +#: superset/views.py:884 +msgid "" +"This fields acts a Superset view, meaning that Superset will run a query " +"against this string as a subquery." +msgstr "" + +#: superset/views.py:892 +msgid "Changed By" +msgstr "修改人" + +#: superset/views.py:895 superset/views.py:1268 +msgid "Is Featured" +msgstr "是否突出" + +#: superset/views.py:897 superset/views.py:1270 msgid "Default Endpoint" msgstr "" -#: superset/views.py:441 +#: superset/views.py:898 msgid "Offset" msgstr "偏移" -#: superset/views.py:482 superset/views.py:690 +#: superset/views.py:927 +msgid "" +"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." +msgstr "" + +#: superset/views.py:955 superset/views.py:1212 +msgid "User" +msgstr "用户" + +#: superset/views.py:956 +msgid "User Roles" +msgstr "" + +#: superset/views.py:957 +msgid "Database URL" +msgstr "" + +#: superset/views.py:959 +msgid "Roles to grant" +msgstr "" + +#: superset/views.py:960 +msgid "Created On" +msgstr "" + +#: superset/views.py:982 superset/views.py:1265 msgid "Cluster" msgstr "集群" -#: superset/views.py:483 +#: superset/views.py:983 msgid "Coordinator Host" msgstr "" -#: superset/views.py:484 +#: superset/views.py:984 msgid "Coordinator Port" msgstr "" -#: superset/views.py:485 +#: superset/views.py:985 msgid "Coordinator Endpoint" msgstr "" -#: superset/views.py:486 +#: superset/views.py:986 msgid "Broker Host" msgstr "" -#: superset/views.py:487 +#: superset/views.py:987 msgid "Broker Port" msgstr "" -#: superset/views.py:488 +#: superset/views.py:988 msgid "Broker Endpoint" msgstr "" -#: superset/views.py:522 +#: superset/views.py:1027 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -1286,524 +1758,469 @@ msgid "" "parameters." msgstr "当单击“保存”或“覆盖”按钮时,这些参数会在视图中动态生成。高级用户可以在这里改变特定的参数。" -#: superset/views.py:527 +#: superset/views.py:1032 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "切片数据过期时间(秒)" -#: superset/templates/superset/welcome.html:26 superset/views.py:535 +#: superset/views.py:1040 msgid "Dashboards" msgstr "看板" -#: superset/views.py:538 +#: superset/views.py:1043 msgid "Last Modified" msgstr "最后修改" -#: superset/views.py:539 superset/views.py:609 +#: superset/views.py:1044 superset/views.py:1142 msgid "Owners" msgstr "所有者" -#: superset/views.py:540 +#: superset/views.py:1045 msgid "Parameters" msgstr "参数" -#: superset/views.py:541 superset/views.py:569 +#: superset/views.py:1046 superset/views.py:1091 msgid "Slice" msgstr "切片" -#: superset/views.py:542 +#: superset/views.py:1047 msgid "Name" msgstr "名字" -#: superset/views.py:544 superset/views.py:570 +#: superset/views.py:1049 msgid "Visualization Type" msgstr "图表类型" -#: superset/views.py:586 +#: superset/views.py:1070 +msgid "Click on a {} link to create a Slice" +msgstr "" + +#: superset/views.py:1115 msgid "" "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" msgstr "这个JSON对象描述了部件在看板中的位置。它是动态生成的,可以通过拖放,在看板中调整整部件的大小和位置。" -#: superset/views.py:591 +#: superset/views.py:1120 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "可以在这里或者在看板视图修改单个看板的CSS样式" -#: superset/views.py:595 +#: superset/views.py:1124 msgid "To get a readable URL for your dashboard" msgstr "为看板生成一个可读的URL" -#: superset/views.py:596 +#: superset/views.py:1125 msgid "" "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." msgstr "当在看板视图中单击“保存”或“覆盖”按钮时,这些参数会在视图中动态生成。高级用户可以在这里改变特定的参数。" -#: superset/views.py:601 +#: superset/views.py:1130 msgid "Owners is a list of users who can alter the dashboard." msgstr "“所有者”是一组可以修改看板的用户列表" -#: superset/views.py:605 +#: superset/views.py:1138 msgid "Dashboard" msgstr "看板" -#: superset/views.py:606 +#: superset/views.py:1139 msgid "Title" msgstr "标题" -#: superset/views.py:607 +#: superset/views.py:1140 msgid "Slug" msgstr "" -#: superset/views.py:608 +#: superset/views.py:1141 msgid "Slices" msgstr "切片" -#: superset/views.py:611 +#: superset/views.py:1144 msgid "Modified" msgstr "已修改" -#: superset/views.py:612 +#: superset/views.py:1145 msgid "Position JSON" msgstr "位置参数" -#: superset/views.py:613 +#: superset/views.py:1146 msgid "CSS" msgstr "" -#: superset/views.py:614 +#: superset/views.py:1147 msgid "JSON Metadata" msgstr "JSON模板" -#: superset/views.py:615 +#: superset/views.py:1148 msgid "Underlying Tables" msgstr "底层表" -#: superset/views.py:653 -msgid "User" -msgstr "用户" - -#: superset/views.py:654 +#: superset/views.py:1213 msgid "Action" msgstr "操作" -#: superset/views.py:655 +#: superset/views.py:1214 msgid "dttm" msgstr "DTTM" -#: superset/views.py:683 -msgid "Timezone offset (in hours) for this datasource" -msgstr "数据源的时差(单位:小时)" - -#: superset/views.py:689 +#: superset/views.py:1264 msgid "Data Source" msgstr "数据源" -#: superset/views.py:692 +#: superset/views.py:1267 msgid "Owner" msgstr "所有者" -#: superset/views.py:694 +#: superset/views.py:1269 msgid "Is Hidden" msgstr "隐藏" -#: superset/views.py:696 +#: superset/views.py:1271 msgid "Time Offset" msgstr "时间偏移" -#: superset/views.py:1176 -msgid "This view requires the `all_datasource_access` permission" -msgstr "本视图需要`访问所有数据`的权限" - -#: superset/views.py:1249 -msgid "Refresh Druid Metadata" -msgstr "刷新Druid元数据" - -#: superset/viz.py:367 +#: superset/viz.py:408 msgid "Table View" msgstr "表视图" -#: superset/viz.py:370 +#: superset/viz.py:411 msgid "GROUP BY" msgstr "分组" -#: superset/viz.py:371 +#: superset/viz.py:412 msgid "Use this section if you want a query that aggregates" msgstr "进行聚合查询" -#: superset/viz.py:374 +#: superset/viz.py:415 msgid "NOT GROUPED BY" msgstr "不分组" -#: superset/viz.py:375 +#: superset/viz.py:416 msgid "Use this section if you want to query atomic rows" msgstr "进行非聚合查询" -#: superset/viz.py:378 +#: superset/viz.py:419 msgid "Options" msgstr "选项" -#: superset/viz.py:429 +#: superset/viz.py:472 msgid "Pivot Table" msgstr "透视表" -#: superset/viz.py:491 +#: superset/viz.py:534 msgid "Markup" msgstr "标记" -#: superset/viz.py:519 +#: superset/viz.py:558 +msgid "Separator" +msgstr "" + +#: superset/viz.py:581 msgid "Word Cloud" msgstr "词汇云" -#: superset/viz.py:551 +#: superset/viz.py:613 msgid "Treemap" msgstr "树状图" -#: superset/viz.py:561 superset/viz.py:676 superset/viz.py:783 superset/viz.py:948 -#: superset/viz.py:1093 superset/viz.py:1122 superset/viz.py:1177 -#: superset/viz.py:1682 +#: superset/viz.py:623 superset/viz.py:738 superset/viz.py:845 +#: superset/viz.py:1011 superset/viz.py:1163 superset/viz.py:1192 +#: superset/viz.py:1314 superset/viz.py:1825 msgid "Chart Options" msgstr "图表选项" -#: superset/viz.py:595 +#: superset/viz.py:657 msgid "Calendar Heatmap" msgstr "时间热力图" -#: superset/viz.py:666 +#: superset/viz.py:728 msgid "Box Plot" msgstr "箱线图" -#: superset/viz.py:773 +#: superset/viz.py:835 msgid "Bubble Chart" msgstr "气泡图" -#: superset/viz.py:842 +#: superset/viz.py:904 msgid "Big Number with Trendline" msgstr "数字和趋势线" -#: superset/viz.py:892 +#: superset/viz.py:954 msgid "Big Number" msgstr "数字" -#: superset/viz.py:938 +#: superset/viz.py:1000 msgid "Time Series - Line Chart" msgstr "时间序列-折线图" -#: superset/viz.py:958 +#: superset/viz.py:1022 msgid "Advanced Analytics" msgstr "高级分析" -#: superset/viz.py:959 +#: superset/viz.py:1023 msgid "" "This section contains options that allow for advanced analytical post " "processing of query results" msgstr "使用高级分析选项" -#: superset/viz.py:1091 +#: superset/viz.py:1161 msgid "Time Series - Bar Chart" msgstr "时间序列-柱状图" -#: superset/viz.py:1111 +#: superset/viz.py:1181 msgid "Time Series - Percent Change" msgstr "时间序列-百分比变化" -#: superset/viz.py:1119 +#: superset/viz.py:1189 msgid "Time Series - Stacked" msgstr "时间序列-堆积图" -#: superset/viz.py:1138 +#: superset/viz.py:1208 msgid "Distribution - NVD3 - Pie Chart" msgstr "分布-饼图" -#: superset/viz.py:1174 +#: superset/viz.py:1246 +msgid "Histogram" +msgstr "" + +#: superset/viz.py:1255 +msgid "Histogram Options" +msgstr "" + +#: superset/viz.py:1263 +msgid "Numeric Column" +msgstr "" + +#: superset/viz.py:1264 +msgid "Select the numeric column to draw the histogram" +msgstr "" + +#: superset/viz.py:1267 +msgid "No of Bins" +msgstr "" + +#: superset/viz.py:1268 +msgid "Select number of bins for the histogram" +msgstr "" + +#: superset/viz.py:1311 msgid "Distribution - Bar Chart" msgstr "分布-柱状图" -#: superset/viz.py:1195 +#: superset/viz.py:1332 msgid "Breakdowns" msgstr "拆分" -#: superset/viz.py:1196 +#: superset/viz.py:1333 msgid "Defines how each series is broken down" msgstr "项目的拆分方式" -#: superset/viz.py:1261 +#: superset/viz.py:1398 msgid "Sunburst" msgstr "环状层次图" -#: superset/viz.py:1276 +#: superset/viz.py:1413 msgid "Primary Metric" msgstr "主指标" -#: superset/viz.py:1277 +#: superset/viz.py:1414 msgid "The primary metric is used to define the arc segment sizes" msgstr "主要指标用来定义的弧段尺寸" -#: superset/viz.py:1282 +#: superset/viz.py:1419 msgid "Secondary Metric" msgstr "次指标" -#: superset/viz.py:1283 +#: superset/viz.py:1420 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" msgstr "次指标用于定义相对主指标的颜色" -#: superset/viz.py:1289 +#: superset/viz.py:1426 msgid "Hierarchy" msgstr "层次" -#: superset/viz.py:1290 +#: superset/viz.py:1427 msgid "This defines the level of the hierarchy" msgstr "定义层次" -#: superset/viz.py:1327 +#: superset/viz.py:1463 msgid "Sankey" msgstr "蛇形图" -#: superset/viz.py:1340 superset/viz.py:1410 +#: superset/viz.py:1476 superset/viz.py:1546 msgid "Source / Target" msgstr "源/目标" -#: superset/viz.py:1341 superset/viz.py:1411 +#: superset/viz.py:1477 superset/viz.py:1547 msgid "Choose a source and a target" msgstr "选择源和目标" -#: superset/viz.py:1391 +#: superset/viz.py:1527 msgid "Directed Force Layout" msgstr "有向图" -#: superset/viz.py:1402 +#: superset/viz.py:1538 msgid "Force Layout" msgstr "有向图" -#: superset/viz.py:1433 +#: superset/viz.py:1569 msgid "World Map" msgstr "世界地图" -#: superset/viz.py:1444 +#: superset/viz.py:1580 msgid "Bubbles" msgstr "气泡" -#: superset/viz.py:1453 +#: superset/viz.py:1589 msgid "Country Field" msgstr "国家" -#: superset/viz.py:1454 +#: superset/viz.py:1590 msgid "3 letter code of the country" msgstr "3位国家码" -#: superset/viz.py:1457 +#: superset/viz.py:1593 msgid "Metric for color" msgstr "色彩度量项" -#: superset/viz.py:1458 +#: superset/viz.py:1594 msgid "Metric that defines the color of the country" msgstr "国家颜色表示的统计项" -#: superset/viz.py:1461 +#: superset/viz.py:1597 msgid "Bubble size" msgstr "气泡大小" -#: superset/viz.py:1462 +#: superset/viz.py:1598 msgid "Metric that defines the size of the bubble" msgstr "气泡大小表示的度量项" -#: superset/templates/superset/explore.html:147 superset/viz.py:1507 +#: superset/viz.py:1648 msgid "Filters" msgstr "筛选" -#: superset/viz.py:1519 +#: superset/viz.py:1661 msgid "Filter fields" msgstr "筛选条件" -#: superset/viz.py:1520 +#: superset/viz.py:1662 msgid "The fields you want to filter on" msgstr "筛选字段" -#: superset/viz.py:1555 +#: superset/viz.py:1698 msgid "iFrame" msgstr "" -#: superset/viz.py:1573 +#: superset/viz.py:1716 msgid "Parallel Coordinates" msgstr "平行坐标" -#: superset/viz.py:1609 +#: superset/viz.py:1752 msgid "Heatmap" msgstr "热力图" -#: superset/viz.py:1622 +#: superset/viz.py:1765 msgid "Heatmap Options" msgstr "热力图选项" -#: superset/viz.py:1677 +#: superset/viz.py:1820 msgid "Horizon Charts" msgstr "水平图" -#: superset/viz.py:1693 +#: superset/viz.py:1836 msgid "Mapbox" msgstr "箱图" -#: superset/viz.py:1707 +#: superset/viz.py:1850 msgid "Points" msgstr "点" -#: superset/viz.py:1713 +#: superset/viz.py:1856 msgid "Labelling" msgstr "标记" -#: superset/viz.py:1719 +#: superset/viz.py:1862 msgid "Visual Tweaks" msgstr "" -#: superset/viz.py:1726 +#: superset/viz.py:1869 msgid "Viewport" msgstr "" -#: superset/viz.py:1736 +#: superset/viz.py:1879 msgid "Longitude" msgstr "经度" -#: superset/viz.py:1737 +#: superset/viz.py:1880 msgid "Column containing longitude data" msgstr "表示经度的列" -#: superset/viz.py:1740 +#: superset/viz.py:1883 msgid "Latitude" msgstr "纬度" -#: superset/viz.py:1741 +#: superset/viz.py:1884 msgid "Column containing latitude data" msgstr "表示纬度的列" -#: superset/viz.py:1744 +#: superset/viz.py:1887 msgid "Cluster label aggregator" msgstr "" -#: superset/viz.py:1745 +#: superset/viz.py:1888 msgid "" "Aggregate function applied to the list of points in each cluster to " "produce the cluster label." msgstr "聚合函数用于集群标签" -#: superset/viz.py:1750 +#: superset/viz.py:1893 msgid "Tooltip" msgstr "提示" -#: superset/viz.py:1751 +#: superset/viz.py:1894 msgid "Show a tooltip when hovering over points and clusters describing the label" msgstr "鼠标放在集群上时显示的提示信息" -#: superset/viz.py:1756 +#: superset/viz.py:1899 msgid "" "One or many fields to group by. If grouping, latitude and longitude " "columns must be present." msgstr "按照一个或多个字段分组。必须指定经度和纬度。" -#: superset/templates/appbuilder/navbar_right.html:36 +#: superset/templates/appbuilder/navbar_right.html:41 msgid "Profile" msgstr "策略" -#: superset/templates/appbuilder/navbar_right.html:37 +#: superset/templates/appbuilder/navbar_right.html:42 msgid "Logout" msgstr "退出" -#: superset/templates/appbuilder/navbar_right.html:42 +#: superset/templates/appbuilder/navbar_right.html:47 msgid "Login" msgstr "登录" -#: superset/templates/superset/explore.html:34 -#: superset/templates/superset/explore.html:241 -msgid "Query" -msgstr "查询" - -#: superset/templates/superset/explore.html:43 -#: superset/templates/superset/explore.html:306 -msgid "Save" +#: superset/templates/superset/request_access.html:2 +msgid "No Access!" msgstr "" -#: superset/templates/superset/explore.html:72 -msgid "Force refresh" -msgstr "强制刷新" - -#: superset/templates/superset/explore.html:77 -msgid "Short URL" -msgstr "短链接" - -#: superset/templates/superset/explore.html:79 -msgid "Generate an embeddable iframe" -msgstr "生成内嵌iframe" - -#: superset/templates/superset/explore.html:82 -msgid "Export to .json" -msgstr "导出为JSON" - -#: superset/templates/superset/explore.html:86 -msgid "Export to .csv format" -msgstr "导出为CVS" - -#: superset/templates/superset/explore.html:92 -msgid "Query timer" -msgstr "查询时间" - -#: superset/templates/superset/explore.html:94 -msgid "0 sec" -msgstr "0秒" - -#: superset/templates/superset/explore.html:100 -msgid "View database query" -msgstr "查询语句" - -#: superset/templates/superset/explore.html:101 -msgid "query" -msgstr "查询" - -#: superset/templates/superset/explore.html:150 -msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" -msgstr "使用逗号分隔多个过滤条件,如'US,FR,Other'" - -#: superset/templates/superset/explore.html:168 -msgid "Add filter" -msgstr "增加过滤条件" - -#: superset/templates/superset/explore.html:247 -#: superset/templates/superset/explore.html:265 -msgid "Close" -msgstr "关闭" - -#: superset/templates/superset/explore.html:259 -msgid "Datasource Description" -msgstr "数据源描述" - -#: superset/templates/superset/explore.html:277 -msgid "Save a Slice" +#: superset/templates/superset/request_access.html:7 +#, python-format +msgid "You do not have permissions to access the datasource(s): %(name)s." msgstr "" -#: superset/templates/superset/explore.html:309 -msgid "Save & go to dashboard" +#: superset/templates/superset/request_access.html:13 +msgid "Request Permissions" msgstr "" -#: superset/templates/superset/explore.html:312 +#: superset/templates/superset/request_access.html:16 msgid "Cancel" msgstr "" -#: superset/templates/superset/sql.html:12 -msgid "Run!" -msgstr "执行" - -#: superset/templates/superset/sql.html:13 -msgid "Create View" -msgstr "创建视图" - -#: superset/templates/superset/welcome.html:8 -#: superset/templates/superset/welcome.html:14 -msgid "Welcome!" -msgstr "欢迎!" - #: superset/templates/superset/models/database/macros.html:4 msgid "Test Connection" msgstr "测试连接" @@ -1838,3 +2255,92 @@ msgstr "测试连接" #~ msgid "Standalone version, use to embed anywhere" #~ msgstr "" +#~ msgid "" +#~ "D3 format syntax for numbers https: //github.com/mbostock/\n" +#~ "d3/wiki/Formatting" +#~ msgstr "自定义格式请参考 https://github.com/mbostock/d3/wiki/Formatting" + +#~ msgid "" +#~ "Defines the grouping of entities. Each" +#~ " serie is shown as a specific " +#~ "color on the chart and has a " +#~ "legend toggle" +#~ msgstr "定义分组实体。每个项目有特定的颜色和图例。" + +#~ msgid "" +#~ "D3 format syntax for y axis https: //github.com/mbostock/\n" +#~ "d3/wiki/Formatting" +#~ msgstr "自定义格式请参考 https://github.com/mbostock/d3/wiki/Formatting" + +#~ msgid "SQL link" +#~ msgstr "SQL查询" + +#~ msgid "SQL Editor" +#~ msgstr "SQL查询" + +#~ msgid "This view requires the `all_datasource_access` permission" +#~ msgstr "本视图需要`访问所有数据`的权限" + +#~ msgid "Refresh Druid Metadata" +#~ msgstr "刷新Druid元数据" + +#~ msgid "Query" +#~ msgstr "查询" + +#~ msgid "Save" +#~ msgstr "" + +#~ msgid "Force refresh" +#~ msgstr "强制刷新" + +#~ msgid "Short URL" +#~ msgstr "短链接" + +#~ msgid "Generate an embeddable iframe" +#~ msgstr "生成内嵌iframe" + +#~ msgid "Export to .json" +#~ msgstr "导出为JSON" + +#~ msgid "Export to .csv format" +#~ msgstr "导出为CVS" + +#~ msgid "Query timer" +#~ msgstr "查询时间" + +#~ msgid "0 sec" +#~ msgstr "0秒" + +#~ msgid "View database query" +#~ msgstr "查询语句" + +#~ msgid "query" +#~ msgstr "查询" + +#~ msgid "Filters are defined using comma delimited strings as in 'US,FR,Other'" +#~ msgstr "使用逗号分隔多个过滤条件,如'US,FR,Other'" + +#~ msgid "Add filter" +#~ msgstr "增加过滤条件" + +#~ msgid "Close" +#~ msgstr "关闭" + +#~ msgid "Datasource Description" +#~ msgstr "数据源描述" + +#~ msgid "Save a Slice" +#~ msgstr "" + +#~ msgid "Save & go to dashboard" +#~ msgstr "" + +#~ msgid "Run!" +#~ msgstr "执行" + +#~ msgid "Create View" +#~ msgstr "创建视图" + +#~ msgid "Welcome!" +#~ msgstr "欢迎!" + diff --git a/superset/views.py b/superset/views.py index 226a18d8a89b..f741b7e22dbb 100755 --- a/superset/views.py +++ b/superset/views.py @@ -634,76 +634,79 @@ def uploaded_file(filename): class CsvToDatabaseForm(DynamicForm): # These are the fields exposed by Pandas read_csv() - csv_file = FileField('CSV File', description='Select a CSV file to be uploaded to a database.', - validators=[FileRequired(), FileAllowed(['csv'], 'CSV Files Only!')]) - sep = StringField('Delimiter', description='Delimiter used by CSV file (for whitespace use \s+).', + csv_file = FileField(_('CSV File'), description=_('Select a CSV file to be uploaded to a database.'), + validators=[FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) + sep = StringField(_('Delimiter'), description=_('Delimiter used by CSV file (for whitespace use \s+).'), validators=[DataRequired()], widget=BS3TextFieldWidget()) - header = IntegerField('Header Row', description='Row containing the headers to use as column names ' - '(0 is first line of data). Leave empty if there is no header row.', + header = IntegerField(_('Header Row'), description=_('Row containing the headers to use as column names (0 is ' + 'first line of data). Leave empty if there is no header row.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - names = StringField('Column Names', description='List of comma-separated column names to use if header ' - 'row not specified above. Leave empty if header field populated.', + names = StringField(_('Column Names'), description=_('List of comma-separated column names to use if header row ' + 'not specified above. Leave empty if header field populated.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - index_col = IntegerField('Index Column', description='Column to use as the row labels of the dataframe. Leave ' - 'empty if no index column.', + index_col = IntegerField(_('Index Column'), description=_('Column to use as the row labels of the dataframe. Leave ' + 'empty if no index column.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - squeeze = BooleanField('Squeeze', description='Parse the data as a series (specify this option if the data ' - 'contains only one column.') - prefix = StringField('Prefix', description='Prefix to add to column numbers when no header ' - '(e.g. "X" for "X0, X1").', + squeeze = BooleanField(_('Squeeze'), description=_('Parse the data as a series (specify this option if the data ' + 'contains only one column.')) + prefix = StringField(_('Prefix'), description=_('Prefix to add to column numbers when no header ' + '(e.g. "X" for "X0, X1").'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - mangle_dupe_cols = BooleanField('Mangle Duplicate Columns', description='Specify duplicate columns as "X.0, X.1".') - skipinitialspace = BooleanField('Skip Initial Space', description='Skip spaces after delimiter.') - skiprows = IntegerField('Skip Rows', description='Number of rows to skip at start of file.', + mangle_dupe_cols = BooleanField(_('Mangle Duplicate Columns'), description=_('Specify duplicate columns as ' + '"X.0, X.1".')) + skipinitialspace = BooleanField(_('Skip Initial Space'), description=_('Skip spaces after delimiter.')) + skiprows = IntegerField(_('Skip Rows'), description=_('Number of rows to skip at start of file.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - nrows = IntegerField('Rows to Read', description='Number of rows of file to read.', + nrows = IntegerField(_('Rows to Read'), description=_('Number of rows of file to read.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - skip_blank_lines = BooleanField('Skip Blank Lines', description='Skip blank lines rather than interpreting them ' - 'as NaN values.') - parse_dates = BooleanField('Parse Dates', description='Parse date values.') - infer_datetime_format = BooleanField('Infer Datetime Format', description='Use Pandas to interpret the ' - 'datetime format.') - dayfirst = BooleanField('Day First', description='Use DD/MM (European/International) date format.') - thousands = StringField('Thousands Separator', description='Separator for values in thousands.', + skip_blank_lines = BooleanField(_('Skip Blank Lines'), description=_('Skip blank lines rather than interpreting ' + 'them as NaN values.')) + parse_dates = BooleanField(_('Parse Dates'), description=_('Parse date values.')) + infer_datetime_format = BooleanField(_('Infer Datetime Format'), description=_('Use Pandas to interpret the ' + 'datetime format automatically.')) + dayfirst = BooleanField(_('Day First'), description=_('Use DD/MM (European/International) date format.')) + thousands = StringField(_('Thousands Separator'), description=_('Separator for values in thousands.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - decimal = StringField('Decimal Character', description='Character to interpret as decimal point.', + decimal = StringField(_('Decimal Character'), description=_('Character to interpret as decimal point.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or '.']) - quotechar = StringField('Quote Character', description='Character used to denote the start and end of a ' - 'quoted item.', + quotechar = StringField(_('Quote Character'), description=_('Character used to denote the start and end of a ' + 'quoted item.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or "'"]) - escapechar = StringField('Escape Character', description='Character used to escape a quoted item.', + escapechar = StringField(_('Escape Character'), description=_('Character used to escape a quoted item.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - comment = StringField('Comment Character', description='Character used to denote the start of a comment.', + comment = StringField(_('Comment Character'), description=_('Character used to denote the start of a comment.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - encoding = StringField('Encoding', description='Encoding to use for UTF when reading/writing (e.g. "utf-8").', + encoding = StringField(_('Encoding'), description=_('Encoding to use for UTF when reading/writing (e.g. "utf-8").'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - error_bad_lines = BooleanField('Error On Bad Lines', description='Error on bad lines (e.g. a line with too many ' - 'commas). If false these bad lines will instead ' - 'be dropped from the resulting dataframe.') + error_bad_lines = BooleanField(_('Error On Bad Lines'), description=_('Error on bad lines (e.g. a line with too ' + 'many commas). If false these bad lines will ' + 'instead be dropped from the resulting ' + 'dataframe.')) # These are the fields exposed by Pandas .to_sql() - name = StringField('Table Name', description='Name of table to be created from csv data.', + name = StringField(_('Table Name'), description=_('Name of table to be created from csv data.'), validators=[DataRequired()], widget=BS3TextFieldWidget()) - con = StringField('Database URI', description='URI of database in which to add above table.', + con = StringField(_('Database URI'), description=_('URI of database in which to add above table.'), validators=[DataRequired()], widget=BS3TextFieldWidget()) - schema = StringField('Schema', description='Specify a schema (if database flavour supports this).', + schema = StringField(_('Schema'), description=_('Specify a schema (if database flavour supports this).'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - if_exists = SelectField('Table Exists', description='If table exists do one of the following: Fail (do nothing), ' - 'Replace (drop and recreate table) or Append (insert data).', - choices=[('fail', 'Fail'), ('replace', 'Replace'), ('append', 'Append')], + if_exists = SelectField(_('Table Exists'), description=_('If table exists do one of the following: Fail (do ' + 'nothing), Replace (drop and recreate table) or Append ' + '(insert data).'), + choices=[('fail', _('Fail')), ('replace', _('Replace')), ('append', _('Append'))], validators=[DataRequired()]) - index = BooleanField('Dataframe Index', description='Write dataframe index as a column.') - index_label = StringField('Column Label(s)', description='Column label for index column(s). If None is given and ' - 'Dataframe Index is True, Index Names are used.', + index = BooleanField(_('Dataframe Index'), description=_('Write dataframe index as a column.')) + index_label = StringField(_('Column Label(s)'), description=_('Column label for index column(s). If None is given ' + 'and Dataframe Index is True, Index Names are used.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - chunksize = IntegerField('Chunksize', description='If not None, then rows will be written in batches of this size ' - 'at a time. If None, all rows will be written at once.', + chunksize = IntegerField(_('Chunksize'), description=_('If not None, rows will be written in batches of this size ' + 'at a time. If None, all rows will be written at once.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) class CsvToDatabaseView(SimpleFormView): form = CsvToDatabaseForm - form_title = 'CSV to Database configuration' + form_title = _('CSV to Database configuration') def form_get(self, form): # pre process form @@ -786,8 +789,8 @@ def form_post(self, form): chunksize=form.chunksize.data) # Go back to welcome page / splash screen - message = 'CSV file "{0}" uploaded to table "{1}" in database "{2}"'.format(filename, - form.name.data, form.con.data) + message = _('CSV file "{0}" uploaded to table "{1}" in database "{2}"'.format(filename, + form.name.data, form.con.data)) flash(message, 'info') redirect('/databaseview/list') From 7425b65a4c53fab416097aadb0ebc644d2ee6137 Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Fri, 9 Dec 2016 09:59:14 +0000 Subject: [PATCH 12/37] Moved Csv form from views.py to forms.py and removed unused imports --- superset/forms.py | 83 ++++++++++++++++++++++++++++++++++++++++++- superset/views.py | 90 +++-------------------------------------------- 2 files changed, 87 insertions(+), 86 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index aa9ac038d0e0..8c7e84e6a505 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -10,13 +10,21 @@ import math from flask_babel import lazy_gettext as _ + +from flask_appbuilder.fieldwidgets import BS3TextFieldWidget +from flask_appbuilder.forms import DynamicForm + +from flask_wtf.file import FileField, FileAllowed, FileRequired + from wtforms import ( Form, SelectMultipleField, SelectField, TextField, TextAreaField, - BooleanField, IntegerField, HiddenField, DecimalField) + BooleanField, IntegerField, HiddenField, DecimalField, StringField) from wtforms import validators, widgets +from wtforms.validators import DataRequired, Optional from superset import app + config = app.config TIMESTAMP_CHOICES = [ @@ -1120,3 +1128,76 @@ def add_to_form(attrs): 'description': _("Time related form attributes"), },) + tuple(QueryForm.fieldsets) return QueryForm + + +class CsvToDatabaseForm(DynamicForm): + # These are the fields exposed by Pandas read_csv() + csv_file = FileField(_('CSV File'), description=_('Select a CSV file to be uploaded to a database.'), + validators=[FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) + sep = StringField(_('Delimiter'), description=_('Delimiter used by CSV file (for whitespace use \s+).'), + validators=[DataRequired()], widget=BS3TextFieldWidget()) + header = IntegerField(_('Header Row'), description=_('Row containing the headers to use as column names (0 is ' + 'first line of data). Leave empty if there is no header row.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + names = StringField(_('Column Names'), description=_('List of comma-separated column names to use if header row ' + 'not specified above. Leave empty if header field populated.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + index_col = IntegerField(_('Index Column'), description=_('Column to use as the row labels of the dataframe. Leave ' + 'empty if no index column.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + squeeze = BooleanField(_('Squeeze'), description=_('Parse the data as a series (specify this option if the data ' + 'contains only one column.')) + prefix = StringField(_('Prefix'), description=_('Prefix to add to column numbers when no header ' + '(e.g. "X" for "X0, X1").'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + mangle_dupe_cols = BooleanField(_('Mangle Duplicate Columns'), description=_('Specify duplicate columns as ' + '"X.0, X.1".')) + skipinitialspace = BooleanField(_('Skip Initial Space'), description=_('Skip spaces after delimiter.')) + skiprows = IntegerField(_('Skip Rows'), description=_('Number of rows to skip at start of file.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + nrows = IntegerField(_('Rows to Read'), description=_('Number of rows of file to read.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + skip_blank_lines = BooleanField(_('Skip Blank Lines'), description=_('Skip blank lines rather than interpreting ' + 'them as NaN values.')) + parse_dates = BooleanField(_('Parse Dates'), description=_('Parse date values.')) + infer_datetime_format = BooleanField(_('Infer Datetime Format'), description=_('Use Pandas to interpret the ' + 'datetime format automatically.')) + dayfirst = BooleanField(_('Day First'), description=_('Use DD/MM (European/International) date format.')) + thousands = StringField(_('Thousands Separator'), description=_('Separator for values in thousands.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + decimal = StringField(_('Decimal Character'), description=_('Character to interpret as decimal point.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or '.']) + quotechar = StringField(_('Quote Character'), description=_('Character used to denote the start and end of a ' + 'quoted item.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or "'"]) + escapechar = StringField(_('Escape Character'), description=_('Character used to escape a quoted item.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + comment = StringField(_('Comment Character'), description=_('Character used to denote the start of a comment.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + encoding = StringField(_('Encoding'), description=_('Encoding to use for UTF when reading/writing (e.g. "utf-8").'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + error_bad_lines = BooleanField(_('Error On Bad Lines'), description=_('Error on bad lines (e.g. a line with too ' + 'many commas). If false these bad lines will ' + 'instead be dropped from the resulting ' + 'dataframe.')) + + # These are the fields exposed by Pandas .to_sql() + name = StringField(_('Table Name'), description=_('Name of table to be created from csv data.'), + validators=[DataRequired()], widget=BS3TextFieldWidget()) + # TODO: Should this be a drop down selection of existing databases? + con = StringField(_('Database URI'), description=_('URI of database in which to add above table.'), + validators=[DataRequired()], widget=BS3TextFieldWidget()) + schema = StringField(_('Schema'), description=_('Specify a schema (if database flavour supports this).'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + if_exists = SelectField(_('Table Exists'), description=_('If table exists do one of the following: Fail (do ' + 'nothing), Replace (drop and recreate table) or Append ' + '(insert data).'), + choices=[('fail', _('Fail')), ('replace', _('Replace')), ('append', _('Append'))], + validators=[DataRequired()]) + index = BooleanField(_('Dataframe Index'), description=_('Write dataframe index as a column.')) + index_label = StringField(_('Column Label(s)'), description=_('Column label for index column(s). If None is given ' + 'and Dataframe Index is True, Index Names are used.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + chunksize = IntegerField(_('Chunksize'), description=_('If not None, rows will be written in batches of this size ' + 'at a time. If None, all rows will be written at once.'), + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) \ No newline at end of file diff --git a/superset/views.py b/superset/views.py index f741b7e22dbb..2d8f125883cd 100755 --- a/superset/views.py +++ b/superset/views.py @@ -19,7 +19,7 @@ import sqlalchemy as sqla from flask import ( - g, request, redirect, flash, Response, render_template, Markup, url_for, send_from_directory, session) + g, request, redirect, flash, Response, render_template, Markup, url_for, send_from_directory) from flask_appbuilder import ModelView, CompactCRUDMixin, BaseView, expose, SimpleFormView from flask_appbuilder.actions import action from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -27,15 +27,11 @@ from flask_appbuilder.widgets import ListWidget from flask_appbuilder.models.sqla.filters import BaseFilter from flask_appbuilder.security.sqla import models as ab_models -from flask_appbuilder.fieldwidgets import BS3TextFieldWidget -from flask_appbuilder.forms import DynamicForm from flask_babel import gettext as __ from flask_babel import lazy_gettext as _ -from flask_wtf.file import FileField, FileAllowed, FileRequired -from wtforms import Form, StringField, IntegerField, FieldList, BooleanField, SelectField -from wtforms.validators import ValidationError, DataRequired, InputRequired, Optional +from wtforms.validators import ValidationError from sqlalchemy import create_engine from werkzeug.routing import BaseConverter @@ -44,11 +40,12 @@ import superset from superset import ( appbuilder, cache, db, models, viz, utils, app, - sm, sql_lab, results_backend, security, dataframe + sm, sql_lab, results_backend, security ) from superset.source_registry import SourceRegistry from superset.models import DatasourceAccessRequest as DAR from superset.widgets import CsvListWidget +from superset.forms import CsvToDatabaseForm config = app.config log_this = models.Log.log_this @@ -632,78 +629,6 @@ def uploaded_file(filename): filename) -class CsvToDatabaseForm(DynamicForm): - # These are the fields exposed by Pandas read_csv() - csv_file = FileField(_('CSV File'), description=_('Select a CSV file to be uploaded to a database.'), - validators=[FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) - sep = StringField(_('Delimiter'), description=_('Delimiter used by CSV file (for whitespace use \s+).'), - validators=[DataRequired()], widget=BS3TextFieldWidget()) - header = IntegerField(_('Header Row'), description=_('Row containing the headers to use as column names (0 is ' - 'first line of data). Leave empty if there is no header row.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - names = StringField(_('Column Names'), description=_('List of comma-separated column names to use if header row ' - 'not specified above. Leave empty if header field populated.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - index_col = IntegerField(_('Index Column'), description=_('Column to use as the row labels of the dataframe. Leave ' - 'empty if no index column.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - squeeze = BooleanField(_('Squeeze'), description=_('Parse the data as a series (specify this option if the data ' - 'contains only one column.')) - prefix = StringField(_('Prefix'), description=_('Prefix to add to column numbers when no header ' - '(e.g. "X" for "X0, X1").'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - mangle_dupe_cols = BooleanField(_('Mangle Duplicate Columns'), description=_('Specify duplicate columns as ' - '"X.0, X.1".')) - skipinitialspace = BooleanField(_('Skip Initial Space'), description=_('Skip spaces after delimiter.')) - skiprows = IntegerField(_('Skip Rows'), description=_('Number of rows to skip at start of file.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - nrows = IntegerField(_('Rows to Read'), description=_('Number of rows of file to read.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - skip_blank_lines = BooleanField(_('Skip Blank Lines'), description=_('Skip blank lines rather than interpreting ' - 'them as NaN values.')) - parse_dates = BooleanField(_('Parse Dates'), description=_('Parse date values.')) - infer_datetime_format = BooleanField(_('Infer Datetime Format'), description=_('Use Pandas to interpret the ' - 'datetime format automatically.')) - dayfirst = BooleanField(_('Day First'), description=_('Use DD/MM (European/International) date format.')) - thousands = StringField(_('Thousands Separator'), description=_('Separator for values in thousands.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - decimal = StringField(_('Decimal Character'), description=_('Character to interpret as decimal point.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or '.']) - quotechar = StringField(_('Quote Character'), description=_('Character used to denote the start and end of a ' - 'quoted item.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or "'"]) - escapechar = StringField(_('Escape Character'), description=_('Character used to escape a quoted item.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - comment = StringField(_('Comment Character'), description=_('Character used to denote the start of a comment.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - encoding = StringField(_('Encoding'), description=_('Encoding to use for UTF when reading/writing (e.g. "utf-8").'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - error_bad_lines = BooleanField(_('Error On Bad Lines'), description=_('Error on bad lines (e.g. a line with too ' - 'many commas). If false these bad lines will ' - 'instead be dropped from the resulting ' - 'dataframe.')) - - # These are the fields exposed by Pandas .to_sql() - name = StringField(_('Table Name'), description=_('Name of table to be created from csv data.'), - validators=[DataRequired()], widget=BS3TextFieldWidget()) - con = StringField(_('Database URI'), description=_('URI of database in which to add above table.'), - validators=[DataRequired()], widget=BS3TextFieldWidget()) - schema = StringField(_('Schema'), description=_('Specify a schema (if database flavour supports this).'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - if_exists = SelectField(_('Table Exists'), description=_('If table exists do one of the following: Fail (do ' - 'nothing), Replace (drop and recreate table) or Append ' - '(insert data).'), - choices=[('fail', _('Fail')), ('replace', _('Replace')), ('append', _('Append'))], - validators=[DataRequired()]) - index = BooleanField(_('Dataframe Index'), description=_('Write dataframe index as a column.')) - index_label = StringField(_('Column Label(s)'), description=_('Column label for index column(s). If None is given ' - 'and Dataframe Index is True, Index Names are used.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - chunksize = IntegerField(_('Chunksize'), description=_('If not None, rows will be written in batches of this size ' - 'at a time. If None, all rows will be written at once.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - - class CsvToDatabaseView(SimpleFormView): form = CsvToDatabaseForm form_title = _('CSV to Database configuration') @@ -825,17 +750,12 @@ def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix encoding=encoding, error_bad_lines=error_bad_lines, ) - # Convert to superset dataframe? - # sdf = dataframe.SupersetDataFrame(df) return df @staticmethod def df_to_db(df, name, con, schema, if_exists, index, index_label, chunksize): - # SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(DATA_DIR, 'superset.db') - # DATA_DIR = os.path.join(os.path.expanduser('~'), '.superset') - - engine = create_engine(con, echo=False) # Can only add to existing database - make dropdown? + engine = create_engine(con, echo=False) # Use Pandas to parse dataframe to database df.to_sql(name=name, con=engine, schema=schema, if_exists=if_exists, index=index, From 3781a60a61421baafecd29be5e12bac4dd073d0c Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Fri, 9 Dec 2016 11:43:30 +0000 Subject: [PATCH 13/37] Changed BooleanField to use BetterBooleanField --- superset/forms.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index 8c7e84e6a505..96404780fba8 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -1145,24 +1145,25 @@ class CsvToDatabaseForm(DynamicForm): index_col = IntegerField(_('Index Column'), description=_('Column to use as the row labels of the dataframe. Leave ' 'empty if no index column.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - squeeze = BooleanField(_('Squeeze'), description=_('Parse the data as a series (specify this option if the data ' - 'contains only one column.')) + squeeze = BetterBooleanField(_('Squeeze'), description=_('Parse the data as a series (specify this option if the ' + 'data contains only one column.')) prefix = StringField(_('Prefix'), description=_('Prefix to add to column numbers when no header ' '(e.g. "X" for "X0, X1").'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - mangle_dupe_cols = BooleanField(_('Mangle Duplicate Columns'), description=_('Specify duplicate columns as ' - '"X.0, X.1".')) - skipinitialspace = BooleanField(_('Skip Initial Space'), description=_('Skip spaces after delimiter.')) + mangle_dupe_cols = BetterBooleanField(_('Mangle Duplicate Columns'), description=_('Specify duplicate columns as ' + '"X.0, X.1".')) + skipinitialspace = BetterBooleanField(_('Skip Initial Space'), description=_('Skip spaces after delimiter.')) skiprows = IntegerField(_('Skip Rows'), description=_('Number of rows to skip at start of file.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) nrows = IntegerField(_('Rows to Read'), description=_('Number of rows of file to read.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - skip_blank_lines = BooleanField(_('Skip Blank Lines'), description=_('Skip blank lines rather than interpreting ' - 'them as NaN values.')) - parse_dates = BooleanField(_('Parse Dates'), description=_('Parse date values.')) - infer_datetime_format = BooleanField(_('Infer Datetime Format'), description=_('Use Pandas to interpret the ' - 'datetime format automatically.')) - dayfirst = BooleanField(_('Day First'), description=_('Use DD/MM (European/International) date format.')) + skip_blank_lines = BetterBooleanField(_('Skip Blank Lines'), description=_('Skip blank lines rather than ' + 'interpreting them as NaN values.')) + parse_dates = BetterBooleanField(_('Parse Dates'), description=_('Parse date values.')) + infer_datetime_format = BetterBooleanField(_('Infer Datetime Format'), description=_('Use Pandas to interpret the ' + 'datetime format ' + 'automatically.')) + dayfirst = BetterBooleanField(_('Day First'), description=_('Use DD/MM (European/International) date format.')) thousands = StringField(_('Thousands Separator'), description=_('Separator for values in thousands.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) decimal = StringField(_('Decimal Character'), description=_('Character to interpret as decimal point.'), @@ -1176,10 +1177,10 @@ class CsvToDatabaseForm(DynamicForm): validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) encoding = StringField(_('Encoding'), description=_('Encoding to use for UTF when reading/writing (e.g. "utf-8").'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - error_bad_lines = BooleanField(_('Error On Bad Lines'), description=_('Error on bad lines (e.g. a line with too ' - 'many commas). If false these bad lines will ' - 'instead be dropped from the resulting ' - 'dataframe.')) + error_bad_lines = BetterBooleanField(_('Error On Bad Lines'), description=_('Error on bad lines (e.g. a line with ' + 'too many commas). If false these bad ' + 'lines will instead be dropped from ' + 'the resulting dataframe.')) # These are the fields exposed by Pandas .to_sql() name = StringField(_('Table Name'), description=_('Name of table to be created from csv data.'), @@ -1194,7 +1195,7 @@ class CsvToDatabaseForm(DynamicForm): '(insert data).'), choices=[('fail', _('Fail')), ('replace', _('Replace')), ('append', _('Append'))], validators=[DataRequired()]) - index = BooleanField(_('Dataframe Index'), description=_('Write dataframe index as a column.')) + index = BetterBooleanField(_('Dataframe Index'), description=_('Write dataframe index as a column.')) index_label = StringField(_('Column Label(s)'), description=_('Column label for index column(s). If None is given ' 'and Dataframe Index is True, Index Names are used.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) From 1b4d62f5a225b7475bcbd992d46f26bc1b857709 Mon Sep 17 00:00:00 2001 From: Ryan Wood Date: Mon, 12 Dec 2016 10:02:08 +0000 Subject: [PATCH 14/37] Added FAQ entry on uploading csv --- docs/faq.rst | 9 +++++++++ superset/forms.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/faq.rst b/docs/faq.rst index 60d4e32f04b5..4512b9ebea75 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -45,6 +45,15 @@ visualizations. https://github.com/airbnb/superset/issues?q=label%3Aexample+is%3Aclosed +Can I upload and visualize csv data? +------------------------------------- + +Yes, using the ``Add CSV Table to Database`` button on the ``Sources -> Database`` +page. This brings up a wizard allowing you to configure the csv to dataframe +conversion, and to select which database to add the csv table to. The table can +then be loaded like any other on the ``Sources -> Tables`` page. + + Why are my queries timing out? ------------------------------ diff --git a/superset/forms.py b/superset/forms.py index 96404780fba8..8d584be9c0b8 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -1201,4 +1201,4 @@ class CsvToDatabaseForm(DynamicForm): validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) chunksize = IntegerField(_('Chunksize'), description=_('If not None, rows will be written in batches of this size ' 'at a time. If None, all rows will be written at once.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) \ No newline at end of file + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) From 2c7eed76e18c0912d28cb8be868f688e7a204882 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Mon, 23 Jan 2017 19:24:56 -0500 Subject: [PATCH 15/37] Fix merge conflict --- superset/views.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/superset/views.py b/superset/views.py index df29ab3812f2..67c97be68c87 100755 --- a/superset/views.py +++ b/superset/views.py @@ -1215,13 +1215,7 @@ def pre_add(self, datasource): def post_add(self, datasource): datasource.generate_metrics() -<<<<<<< HEAD - security.merge_perm(sm, 'datasource_access', datasource.get_perm()) - if datasource.schema: - security.merge_perm(sm, 'schema_access', datasource.schema_perm) -======= security.merge_perm(sm, 'datasource_access', datasource.perm) ->>>>>>> 38c54c32298f14baf510cb614848fa029a2e24de def post_update(self, datasource): self.post_add(datasource) From 3f8ecfba2e1e5bdd6833a80221c1decb64588eca Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Wed, 8 Mar 2017 14:54:23 -0500 Subject: [PATCH 16/37] Add tests to CSV-import --- superset/forms.py | 6 +++--- superset/views.py | 3 ++- tests/core_tests.py | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index 687fcf718085..d0b6febb30cd 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -1162,8 +1162,8 @@ def add_to_form(attrs): class CsvToDatabaseForm(DynamicForm): # These are the fields exposed by Pandas read_csv() - csv_file = FileField(_('CSV File'), description=_('Select a CSV file to be uploaded to a database.'), - validators=[FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) + csv_file = FileField(_('CSV File'), description=_('Select a CSV file to be uploaded to a database.'), + validators=[FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) sep = StringField(_('Delimiter'), description=_('Delimiter used by CSV file (for whitespace use \s+).'), validators=[DataRequired()], widget=BS3TextFieldWidget()) header = IntegerField(_('Header Row'), description=_('Row containing the headers to use as column names (0 is ' @@ -1176,7 +1176,7 @@ class CsvToDatabaseForm(DynamicForm): 'empty if no index column.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) squeeze = BetterBooleanField(_('Squeeze'), description=_('Parse the data as a series (specify this option if the ' - 'data contains only one column.')) + 'data contains only one column.)')) prefix = StringField(_('Prefix'), description=_('Prefix to add to column numbers when no header ' '(e.g. "X" for "X0, X1").'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) diff --git a/superset/views.py b/superset/views.py index 67c97be68c87..dbc936ef83f5 100755 --- a/superset/views.py +++ b/superset/views.py @@ -729,7 +729,8 @@ def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix skipinitialspace, skiprows, nrows, skip_blank_lines, parse_dates, infer_datetime_format, dayfirst, thousands, decimal, quotechar, escapechar, comment, encoding, error_bad_lines): # Use Pandas to parse csv file to a dataframe - upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + str(config['SUPERSET_WEBSERVER_PORT']) \ + # str(config['SUPERSET_WEBSERVER_PORT']) + upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + '8088' \ + url_for('uploaded_file', filename=filepath_or_buffer) # Expose this to api so can specify each field df = pandas.read_csv(filepath_or_buffer=upload_path, diff --git a/tests/core_tests.py b/tests/core_tests.py index 4964464e9172..56e03d580425 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -13,7 +13,7 @@ from flask import escape -from superset import db, models, utils, appbuilder, sm, jinja_context, sql_lab +from superset import db, models, utils, appbuilder, sm, jinja_context, sql_lab, app from superset.views import DatabaseView from .base_tests import SupersetTestCase @@ -531,6 +531,37 @@ def test_user_profile(self): data = self.get_json_resp('/superset/fave_dashboards/{}/'.format(userid)) self.assertNotIn('message', data) + def test_import_csv(self): + self.login(username='admin') + config = app.config + + test_file = open('testCSV1.csv', 'rb') + form_data = {'csv_file': test_file, + 'sep': ',', + 'name': 'TestName123', + 'con': config['SQLALCHEMY_DATABASE_URI'], + 'if_exists': 'append', + 'index_label': 'test_label'} + + url = '/databaseview/list/' + add_datasource_page = self.get_resp(url) + assert 'Add CSV Table to Database' in add_datasource_page + + url = '/csvtodatabaseview/form' + form_get = self.get_resp(url) + assert 'CSV to Database configuration' in form_get + + form_post = self.get_resp(url, data = form_data) + assert 'CSV file "testCSV1.csv" uploaded to table' in form_post + + # Validations + # headrow >= 0 + # nrows >= 0 + + # Features + # replace --> append + # Fixing port bug + # Allow for GB file csv if __name__ == '__main__': unittest.main() From e560c5c9fecd370e4398b318a6a3e167c6308d6b Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 9 Mar 2017 03:54:34 -0500 Subject: [PATCH 17/37] Change the default of replace to append --- superset/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/views.py b/superset/views.py index dbc936ef83f5..fb92fd08517e 100755 --- a/superset/views.py +++ b/superset/views.py @@ -666,7 +666,7 @@ def form_get(self, form): form.name.data = None form.con.data = config['SQLALCHEMY_DATABASE_URI'] form.schema.data = None - form.if_exists.data = 'replace' + form.if_exists.data = 'append' form.index.data = None form.index_label.data = None form.chunksize.data = None From 40707a03d9540dacbbe67d7240b4a78a0b963e65 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 9 Mar 2017 04:00:54 -0500 Subject: [PATCH 18/37] Add additional form validations --- superset/forms.py | 10 +++++----- tests/core_tests.py | 5 ----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index d0b6febb30cd..cfbea8986ec6 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -20,7 +20,7 @@ Form, SelectMultipleField, SelectField, TextField, TextAreaField, BooleanField, IntegerField, HiddenField, DecimalField, StringField) from wtforms import validators, widgets -from wtforms.validators import DataRequired, Optional +from wtforms.validators import DataRequired, Optional, NumberRange from superset import app @@ -1168,13 +1168,13 @@ class CsvToDatabaseForm(DynamicForm): validators=[DataRequired()], widget=BS3TextFieldWidget()) header = IntegerField(_('Header Row'), description=_('Row containing the headers to use as column names (0 is ' 'first line of data). Leave empty if there is no header row.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + validators=[Optional(), NumberRange(0, 1E+20)], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) names = StringField(_('Column Names'), description=_('List of comma-separated column names to use if header row ' 'not specified above. Leave empty if header field populated.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) index_col = IntegerField(_('Index Column'), description=_('Column to use as the row labels of the dataframe. Leave ' 'empty if no index column.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + validators=[Optional(), NumberRange(0, 1E+20)], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) squeeze = BetterBooleanField(_('Squeeze'), description=_('Parse the data as a series (specify this option if the ' 'data contains only one column.)')) prefix = StringField(_('Prefix'), description=_('Prefix to add to column numbers when no header ' @@ -1184,9 +1184,9 @@ class CsvToDatabaseForm(DynamicForm): '"X.0, X.1".')) skipinitialspace = BetterBooleanField(_('Skip Initial Space'), description=_('Skip spaces after delimiter.')) skiprows = IntegerField(_('Skip Rows'), description=_('Number of rows to skip at start of file.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + validators=[Optional(), NumberRange(0, 1E+20)], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) nrows = IntegerField(_('Rows to Read'), description=_('Number of rows of file to read.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + validators=[Optional(), NumberRange(0, 1E+20)], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) skip_blank_lines = BetterBooleanField(_('Skip Blank Lines'), description=_('Skip blank lines rather than ' 'interpreting them as NaN values.')) parse_dates = BetterBooleanField(_('Parse Dates'), description=_('Parse date values.')) diff --git a/tests/core_tests.py b/tests/core_tests.py index 56e03d580425..e8090165fc86 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -554,12 +554,7 @@ def test_import_csv(self): form_post = self.get_resp(url, data = form_data) assert 'CSV file "testCSV1.csv" uploaded to table' in form_post - # Validations - # headrow >= 0 - # nrows >= 0 - # Features - # replace --> append # Fixing port bug # Allow for GB file csv From fb184597556062ab8b26acdf533449ceba8cd5c2 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 9 Mar 2017 17:02:01 -0500 Subject: [PATCH 19/37] Allow for large csv files exceeding machine memory --- superset/forms.py | 4 ++-- superset/views.py | 14 +++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index cfbea8986ec6..62b0137664b4 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -1229,6 +1229,6 @@ class CsvToDatabaseForm(DynamicForm): index_label = StringField(_('Column Label(s)'), description=_('Column label for index column(s). If None is given ' 'and Dataframe Index is True, Index Names are used.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - chunksize = IntegerField(_('Chunksize'), description=_('If not None, rows will be written in batches of this size ' - 'at a time. If None, all rows will be written at once.'), + chunksize = IntegerField(_('Chunksize'), description=_('If empty, all rows will be written at once. Otherwise, ' + 'rows will be written in batches of this many rows at a time.'), validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) diff --git a/superset/views.py b/superset/views.py index fb92fd08517e..85b63d619d85 100755 --- a/superset/views.py +++ b/superset/views.py @@ -669,7 +669,7 @@ def form_get(self, form): form.if_exists.data = 'append' form.index.data = None form.index_label.data = None - form.chunksize.data = None + form.chunksize.data = 100000 def form_post(self, form): # post process form @@ -706,7 +706,8 @@ def form_post(self, form): escapechar=form.escapechar.data, comment=form.comment.data, encoding=form.encoding.data, - error_bad_lines=form.error_bad_lines.data) + error_bad_lines=form.error_bad_lines.data, + chunksize=form.chunksize.data) # Use Pandas to convert superset dataframe to database self.df_to_db(df=df, @@ -727,13 +728,13 @@ def form_post(self, form): @staticmethod def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix, mangle_dupe_cols, skipinitialspace, skiprows, nrows, skip_blank_lines, parse_dates, infer_datetime_format, - dayfirst, thousands, decimal, quotechar, escapechar, comment, encoding, error_bad_lines): + dayfirst, thousands, decimal, quotechar, escapechar, comment, encoding, error_bad_lines, chunksize): # Use Pandas to parse csv file to a dataframe # str(config['SUPERSET_WEBSERVER_PORT']) upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + '8088' \ + url_for('uploaded_file', filename=filepath_or_buffer) # Expose this to api so can specify each field - df = pandas.read_csv(filepath_or_buffer=upload_path, + chunks = pandas.read_csv(filepath_or_buffer=upload_path, sep=sep, header=header, names=names, @@ -755,7 +756,10 @@ def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix comment=comment, encoding=encoding, error_bad_lines=error_bad_lines, - ) + chunksize=chunksize) + + df = pandas.DataFrame() + df = pandas.concat(chunk for chunk in chunks) return df @staticmethod From 82c5281d7afee600784f0eb7b795cf341fdf9d2e Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 9 Mar 2017 18:40:12 -0500 Subject: [PATCH 20/37] Fix filepath bug --- tests/core_tests.py | 12 ++++++------ tests/testCSV.csv | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 tests/testCSV.csv diff --git a/tests/core_tests.py b/tests/core_tests.py index e8090165fc86..bae0975d95f6 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -535,13 +535,14 @@ def test_import_csv(self): self.login(username='admin') config = app.config - test_file = open('testCSV1.csv', 'rb') + test_file = open('tests/testCSV.csv', 'rb') form_data = {'csv_file': test_file, 'sep': ',', 'name': 'TestName123', 'con': config['SQLALCHEMY_DATABASE_URI'], 'if_exists': 'append', - 'index_label': 'test_label'} + 'index_label': 'test_label', + 'chunksize': 1} url = '/databaseview/list/' add_datasource_page = self.get_resp(url) @@ -551,12 +552,11 @@ def test_import_csv(self): form_get = self.get_resp(url) assert 'CSV to Database configuration' in form_get + self.login(username='admin') form_post = self.get_resp(url, data = form_data) - assert 'CSV file "testCSV1.csv" uploaded to table' in form_post + assert 'CSV file "tests_testCSV.csv" uploaded to table' in form_post - # Features - # Fixing port bug - # Allow for GB file csv + # Fix port bug if __name__ == '__main__': unittest.main() diff --git a/tests/testCSV.csv b/tests/testCSV.csv new file mode 100644 index 000000000000..2194e870ad2c --- /dev/null +++ b/tests/testCSV.csv @@ -0,0 +1,2 @@ +Name,TestField +Saleh,TestData \ No newline at end of file From bc08de0261caa0b00e3eedf1f47af72e55c15b07 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 9 Mar 2017 20:31:43 -0500 Subject: [PATCH 21/37] Fix linting errors --- superset/forms.py | 200 ++++++++++++++++++++++------------ superset/views.py | 59 +++++----- tests/core_tests.py | 15 ++- tests/superset_test_config.py | 2 +- 4 files changed, 170 insertions(+), 106 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index 62b0137664b4..afcbcfbd9bcc 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -1162,73 +1162,137 @@ def add_to_form(attrs): class CsvToDatabaseForm(DynamicForm): # These are the fields exposed by Pandas read_csv() - csv_file = FileField(_('CSV File'), description=_('Select a CSV file to be uploaded to a database.'), - validators=[FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) - sep = StringField(_('Delimiter'), description=_('Delimiter used by CSV file (for whitespace use \s+).'), - validators=[DataRequired()], widget=BS3TextFieldWidget()) - header = IntegerField(_('Header Row'), description=_('Row containing the headers to use as column names (0 is ' - 'first line of data). Leave empty if there is no header row.'), - validators=[Optional(), NumberRange(0, 1E+20)], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - names = StringField(_('Column Names'), description=_('List of comma-separated column names to use if header row ' - 'not specified above. Leave empty if header field populated.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - index_col = IntegerField(_('Index Column'), description=_('Column to use as the row labels of the dataframe. Leave ' - 'empty if no index column.'), - validators=[Optional(), NumberRange(0, 1E+20)], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - squeeze = BetterBooleanField(_('Squeeze'), description=_('Parse the data as a series (specify this option if the ' - 'data contains only one column.)')) - prefix = StringField(_('Prefix'), description=_('Prefix to add to column numbers when no header ' - '(e.g. "X" for "X0, X1").'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - mangle_dupe_cols = BetterBooleanField(_('Mangle Duplicate Columns'), description=_('Specify duplicate columns as ' - '"X.0, X.1".')) - skipinitialspace = BetterBooleanField(_('Skip Initial Space'), description=_('Skip spaces after delimiter.')) - skiprows = IntegerField(_('Skip Rows'), description=_('Number of rows to skip at start of file.'), - validators=[Optional(), NumberRange(0, 1E+20)], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - nrows = IntegerField(_('Rows to Read'), description=_('Number of rows of file to read.'), - validators=[Optional(), NumberRange(0, 1E+20)], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - skip_blank_lines = BetterBooleanField(_('Skip Blank Lines'), description=_('Skip blank lines rather than ' - 'interpreting them as NaN values.')) - parse_dates = BetterBooleanField(_('Parse Dates'), description=_('Parse date values.')) - infer_datetime_format = BetterBooleanField(_('Infer Datetime Format'), description=_('Use Pandas to interpret the ' - 'datetime format ' - 'automatically.')) - dayfirst = BetterBooleanField(_('Day First'), description=_('Use DD/MM (European/International) date format.')) - thousands = StringField(_('Thousands Separator'), description=_('Separator for values in thousands.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - decimal = StringField(_('Decimal Character'), description=_('Character to interpret as decimal point.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or '.']) - quotechar = StringField(_('Quote Character'), description=_('Character used to denote the start and end of a ' - 'quoted item.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or "'"]) - escapechar = StringField(_('Escape Character'), description=_('Character used to escape a quoted item.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - comment = StringField(_('Comment Character'), description=_('Character used to denote the start of a comment.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - encoding = StringField(_('Encoding'), description=_('Encoding to use for UTF when reading/writing (e.g. "utf-8").'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - error_bad_lines = BetterBooleanField(_('Error On Bad Lines'), description=_('Error on bad lines (e.g. a line with ' - 'too many commas). If false these bad ' - 'lines will instead be dropped from ' - 'the resulting dataframe.')) + csv_file = FileField(_('CSV File'), + description=_('Select a CSV file to be uploaded to a database.'), + validators=[FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) + sep = StringField(_('Delimiter'), + description=_('Delimiter used by CSV file (for whitespace use \s+).'), + validators=[DataRequired()], + widget=BS3TextFieldWidget()) + header = IntegerField(_('Header Row'), + description=_('Row containing the headers to use as column names (0 is ' + 'first line of data). Leave empty if there is no header row.'), + validators=[Optional(), NumberRange(0, 1E+20)], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + names = StringField(_('Column Names'), + description=_('List of comma-separated column names to use if header row ' + 'not specified above. Leave empty if header field populated.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + index_col = IntegerField(_('Index Column'), + description=_('Column to use as the row labels of the dataframe. ' + 'Leave empty if no index column.'), + validators=[Optional(), NumberRange(0, 1E+20)], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + squeeze = BetterBooleanField(_('Squeeze'), + description=_('Parse the data as a series (specify this option if the ' + 'data contains only one column.)')) + prefix = StringField(_('Prefix'), + description=_('Prefix to add to column numbers when no header ' + '(e.g. "X" for "X0, X1").'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + mangle_dupe_cols = BetterBooleanField(_('Mangle Duplicate Columns'), + description=_('Specify duplicate columns as ' + '"X.0, X.1".')) + skipinitialspace = BetterBooleanField(_('Skip Initial Space'), + description=_('Skip spaces after delimiter.')) + skiprows = IntegerField(_('Skip Rows'), + description=_('Number of rows to skip at start of file.'), + validators=[Optional(), NumberRange(0, 1E+20)], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + nrows = IntegerField(_('Rows to Read'), + description=_('Number of rows of file to read.'), + validators=[Optional(), NumberRange(0, 1E+20)], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + skip_blank_lines = BetterBooleanField(_('Skip Blank Lines'), + description=_('Skip blank lines rather than ' + 'interpreting them as NaN values.')) + parse_dates = BetterBooleanField(_('Parse Dates'), + description=_('Parse date values.')) + infer_datetime_format = BetterBooleanField(_('Infer Datetime Format'), + description=_('Use Pandas to interpret the ' + 'datetime format ' + 'automatically.')) + dayfirst = BetterBooleanField(_('Day First'), + description=_('Use DD/MM (European/International) date format.')) + thousands = StringField(_('Thousands Separator'), + description=_('Separator for values in thousands.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + decimal = StringField(_('Decimal Character'), + description=_('Character to interpret as decimal point.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or '.']) + quotechar = StringField(_('Quote Character'), + description=_('Character used to denote the start and end of a ' + 'quoted item.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or "'"]) + escapechar = StringField(_('Escape Character'), + description=_('Character used to escape a quoted item.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + comment = StringField(_('Comment Character'), + description=_('Character used to denote the start of a comment.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + encoding = StringField(_('Encoding'), + description=_('Encoding to use for UTF when reading/writing (e.g. "utf-8").'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + error_bad_lines = BetterBooleanField(_('Error On Bad Lines'), + description=_('Error on bad lines (e.g. a line with ' + 'too many commas). If false these bad ' + 'lines will instead be dropped from ' + 'the resulting dataframe.')) # These are the fields exposed by Pandas .to_sql() - name = StringField(_('Table Name'), description=_('Name of table to be created from csv data.'), - validators=[DataRequired()], widget=BS3TextFieldWidget()) - # TODO: Should this be a drop down selection of existing databases? - con = StringField(_('Database URI'), description=_('URI of database in which to add above table.'), - validators=[DataRequired()], widget=BS3TextFieldWidget()) - schema = StringField(_('Schema'), description=_('Specify a schema (if database flavour supports this).'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - if_exists = SelectField(_('Table Exists'), description=_('If table exists do one of the following: Fail (do ' - 'nothing), Replace (drop and recreate table) or Append ' - '(insert data).'), - choices=[('fail', _('Fail')), ('replace', _('Replace')), ('append', _('Append'))], - validators=[DataRequired()]) - index = BetterBooleanField(_('Dataframe Index'), description=_('Write dataframe index as a column.')) - index_label = StringField(_('Column Label(s)'), description=_('Column label for index column(s). If None is given ' - 'and Dataframe Index is True, Index Names are used.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - chunksize = IntegerField(_('Chunksize'), description=_('If empty, all rows will be written at once. Otherwise, ' - 'rows will be written in batches of this many rows at a time.'), - validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) + name = StringField(_('Table Name'), + description=_('Name of table to be created from csv data.'), + validators=[DataRequired()], + widget=BS3TextFieldWidget()) + con = StringField(_('Database URI'), + description=_('URI of database in which to add above table.'), + validators=[DataRequired()], + widget=BS3TextFieldWidget()) + schema = StringField(_('Schema'), + description=_('Specify a schema (if database flavour supports this).'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + if_exists = SelectField(_('Table Exists'), + description=_('If table exists do one of the following: Fail (do ' + 'nothing), Replace (drop and recreate table) or Append ' + '(insert data).'), + choices=[('fail', _('Fail')), + ('replace', _('Replace')), + ('append', _('Append'))], + validators=[DataRequired()]) + index = BetterBooleanField(_('Dataframe Index'), + description=_('Write dataframe index as a column.')) + index_label = StringField(_('Column Label(s)'), + description=_('Column label for index column(s). If None is given ' + 'and Dataframe Index is True, Index Names are used.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) + chunksize = IntegerField(_('Chunksize'), + description=_('If empty, all rows will be written at once. Otherwise, ' + 'rows will be written in batches of this ' + 'many rows at a time.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) diff --git a/superset/views.py b/superset/views.py index 85b63d619d85..18166668d38c 100755 --- a/superset/views.py +++ b/superset/views.py @@ -720,43 +720,44 @@ def form_post(self, form): chunksize=form.chunksize.data) # Go back to welcome page / splash screen - message = _('CSV file "{0}" uploaded to table "{1}" in database "{2}"'.format(filename, - form.name.data, form.con.data)) + message = _('CSV file "{0}" uploaded to table "{1}" in ' + + 'database "{2}"'.format(filename, form.name.data, form.con.data)) flash(message, 'info') redirect('/databaseview/list') @staticmethod - def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, prefix, mangle_dupe_cols, - skipinitialspace, skiprows, nrows, skip_blank_lines, parse_dates, infer_datetime_format, - dayfirst, thousands, decimal, quotechar, escapechar, comment, encoding, error_bad_lines, chunksize): + def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, + prefix, mangle_dupe_cols, skipinitialspace, skiprows, nrows, + skip_blank_lines, parse_dates, infer_datetime_format, + dayfirst, thousands, decimal, quotechar, escapechar, comment, + encoding, error_bad_lines, chunksize): # Use Pandas to parse csv file to a dataframe - # str(config['SUPERSET_WEBSERVER_PORT']) - upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + '8088' \ + upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + str(config['SUPERSET_WEBSERVER_PORT']) \ + url_for('uploaded_file', filename=filepath_or_buffer) # Expose this to api so can specify each field chunks = pandas.read_csv(filepath_or_buffer=upload_path, - sep=sep, - header=header, - names=names, - index_col=index_col, - squeeze=squeeze, - prefix=prefix, - mangle_dupe_cols=mangle_dupe_cols, - skipinitialspace=skipinitialspace, - skiprows=skiprows, - nrows=nrows, - skip_blank_lines=skip_blank_lines, - parse_dates=parse_dates, - infer_datetime_format=infer_datetime_format, - dayfirst=dayfirst, - thousands=thousands, - decimal=decimal, - quotechar=quotechar, - escapechar=escapechar, - comment=comment, - encoding=encoding, - error_bad_lines=error_bad_lines, - chunksize=chunksize) + sep=sep, + header=header, + names=names, + index_col=index_col, + squeeze=squeeze, + prefix=prefix, + mangle_dupe_cols=mangle_dupe_cols, + skipinitialspace=skipinitialspace, + skiprows=skiprows, + nrows=nrows, + skip_blank_lines=skip_blank_lines, + parse_dates=parse_dates, + infer_datetime_format=infer_datetime_format, + dayfirst=dayfirst, + thousands=thousands, + decimal=decimal, + quotechar=quotechar, + escapechar=escapechar, + comment=comment, + encoding=encoding, + error_bad_lines=error_bad_lines, + chunksize=chunksize) df = pandas.DataFrame() df = pandas.concat(chunk for chunk in chunks) diff --git a/tests/core_tests.py b/tests/core_tests.py index bae0975d95f6..94bc5bfca891 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -537,12 +537,12 @@ def test_import_csv(self): test_file = open('tests/testCSV.csv', 'rb') form_data = {'csv_file': test_file, - 'sep': ',', - 'name': 'TestName123', - 'con': config['SQLALCHEMY_DATABASE_URI'], - 'if_exists': 'append', - 'index_label': 'test_label', - 'chunksize': 1} + 'sep': ',', + 'name': 'TestName123', + 'con': config['SQLALCHEMY_DATABASE_URI'], + 'if_exists': 'append', + 'index_label': 'test_label', + 'chunksize': 1} url = '/databaseview/list/' add_datasource_page = self.get_resp(url) @@ -553,11 +553,10 @@ def test_import_csv(self): assert 'CSV to Database configuration' in form_get self.login(username='admin') - form_post = self.get_resp(url, data = form_data) + form_post = self.get_resp(url, data=form_data) assert 'CSV file "tests_testCSV.csv" uploaded to table' in form_post # Fix port bug if __name__ == '__main__': unittest.main() - diff --git a/tests/superset_test_config.py b/tests/superset_test_config.py index 1e65d2b0ca35..013f496ef987 100644 --- a/tests/superset_test_config.py +++ b/tests/superset_test_config.py @@ -3,7 +3,7 @@ AUTH_USER_REGISTRATION_ROLE = 'alpha' SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(DATA_DIR, 'unittests.db') DEBUG = True -SUPERSET_WEBSERVER_PORT = 8081 +SUPERSET_WEBSERVER_PORT = 8088 # Allowing SQLALCHEMY_DATABASE_URI to be defined as an env var for # continuous integration From e62ad5ea742b25632de51abcdb6eeaad34d5fd55 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 9 Mar 2017 20:32:36 -0500 Subject: [PATCH 22/37] fix linting errors --- superset/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/views.py b/superset/views.py index 18166668d38c..d460b2aca486 100755 --- a/superset/views.py +++ b/superset/views.py @@ -720,7 +720,7 @@ def form_post(self, form): chunksize=form.chunksize.data) # Go back to welcome page / splash screen - message = _('CSV file "{0}" uploaded to table "{1}" in ' + + message = _('CSV file "{0}" uploaded to table "{1}" in ' 'database "{2}"'.format(filename, form.name.data, form.con.data)) flash(message, 'info') redirect('/databaseview/list') From ea0fcfa5893c29fdd040cc7b6bbc43e5dc91524e Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Mon, 20 Mar 2017 22:22:28 -0400 Subject: [PATCH 23/37] Remove extraneous csv file after use --- tests/core_tests.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/core_tests.py b/tests/core_tests.py index 94bc5bfca891..db695551f474 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -10,6 +10,9 @@ import io import random import unittest +import os +import pdb +import unicodecsv from flask import escape @@ -535,10 +538,23 @@ def test_import_csv(self): self.login(username='admin') config = app.config - test_file = open('tests/testCSV.csv', 'rb') + test_file = open('tests/testCSV.csv', 'w+') + + # csv_writer = csv.writer(test_file) + # csv_writer.writerow(u'Column 1, Column 2 ') + # csv_writer.writerow(u'Column 1, Column 2 ') + # test_file.flush() + + writer = unicodecsv.writer(test_file, encoding='utf-8') + writer.writerow((u'Column 1', u'Column 2')) + writer.writerow((u'Column 3', u'Column 4')) + test_file.seek(0) + + pdb.set_trace() + form_data = {'csv_file': test_file, 'sep': ',', - 'name': 'TestName123', + 'name': 'TestName', 'con': config['SQLALCHEMY_DATABASE_URI'], 'if_exists': 'append', 'index_label': 'test_label', @@ -556,7 +572,7 @@ def test_import_csv(self): form_post = self.get_resp(url, data=form_data) assert 'CSV file "tests_testCSV.csv" uploaded to table' in form_post - # Fix port bug + os.remove('tests/testCSV.csv') if __name__ == '__main__': unittest.main() From 5a2c593117c7d2938ec8fe7045b219d0796bde9e Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Mon, 3 Apr 2017 00:34:55 -0400 Subject: [PATCH 24/37] Remove extraneous file at the end of test --- tests/core_tests.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/tests/core_tests.py b/tests/core_tests.py index db695551f474..def281b7e914 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -539,19 +539,12 @@ def test_import_csv(self): config = app.config test_file = open('tests/testCSV.csv', 'w+') - - # csv_writer = csv.writer(test_file) - # csv_writer.writerow(u'Column 1, Column 2 ') - # csv_writer.writerow(u'Column 1, Column 2 ') - # test_file.flush() writer = unicodecsv.writer(test_file, encoding='utf-8') writer.writerow((u'Column 1', u'Column 2')) writer.writerow((u'Column 3', u'Column 4')) test_file.seek(0) - pdb.set_trace() - form_data = {'csv_file': test_file, 'sep': ',', 'name': 'TestName', @@ -571,8 +564,8 @@ def test_import_csv(self): self.login(username='admin') form_post = self.get_resp(url, data=form_data) assert 'CSV file "tests_testCSV.csv" uploaded to table' in form_post - os.remove('tests/testCSV.csv') + if __name__ == '__main__': unittest.main() From d7da6e3f1e950aa5ba5cba5a2dbbc02b7077a4c6 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Mon, 3 Apr 2017 01:27:31 -0400 Subject: [PATCH 25/37] Fix more linting errors --- superset/forms.py | 69 +++++++++++++++++++++++++-------------------- superset/views.py | 39 ++++++++++++++++--------- superset/widgets.py | 2 +- tests/core_tests.py | 15 +++++----- 4 files changed, 73 insertions(+), 52 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index afcbcfbd9bcc..7e1633e132ca 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -24,7 +24,6 @@ from superset import app - config = app.config TIMESTAMP_CHOICES = [ @@ -1261,38 +1260,48 @@ class CsvToDatabaseForm(DynamicForm): # These are the fields exposed by Pandas .to_sql() name = StringField(_('Table Name'), - description=_('Name of table to be created from csv data.'), - validators=[DataRequired()], - widget=BS3TextFieldWidget()) + description=_('Name of table to be created' + 'from csv data.'), + validators=[DataRequired()], + widget=BS3TextFieldWidget()) con = StringField(_('Database URI'), - description=_('URI of database in which to add above table.'), - validators=[DataRequired()], - widget=BS3TextFieldWidget()) + description=_('URI of database in which to ' + 'add above table.'), + validators=[DataRequired()], + widget=BS3TextFieldWidget()) schema = StringField(_('Schema'), - description=_('Specify a schema (if database flavour supports this).'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Specify a schema (if database ' + 'flavour supports this).'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) if_exists = SelectField(_('Table Exists'), - description=_('If table exists do one of the following: Fail (do ' - 'nothing), Replace (drop and recreate table) or Append ' - '(insert data).'), - choices=[('fail', _('Fail')), - ('replace', _('Replace')), - ('append', _('Append'))], - validators=[DataRequired()]) + description=_('If table exists do one ' + 'of the following: ' + 'Fail (do nothing), ' + 'Replace (drop and ' + 'recreate table) ' + 'or Append (insert data).'), + choices=[('fail', _('Fail')), + ('replace', _('Replace')), + ('append', _('Append'))], + validators=[DataRequired()]) index = BetterBooleanField(_('Dataframe Index'), - description=_('Write dataframe index as a column.')) + description=_('Write dataframe ' + 'index as a column.')) index_label = StringField(_('Column Label(s)'), - description=_('Column label for index column(s). If None is given ' - 'and Dataframe Index is True, Index Names are used.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Column label for index ' + 'column(s). If None is given ' + 'and Dataframe Index is ' + 'True, Index Names are used.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) chunksize = IntegerField(_('Chunksize'), - description=_('If empty, all rows will be written at once. Otherwise, ' - 'rows will be written in batches of this ' - 'many rows at a time.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('If empty, all rows will be ' + 'written at once. Otherwise, ' + 'rows will be written in batches ' + 'of this many rows at a time.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) diff --git a/superset/views.py b/superset/views.py index d460b2aca486..f81f8960d3ef 100755 --- a/superset/views.py +++ b/superset/views.py @@ -19,8 +19,10 @@ import sqlalchemy as sqla from flask import ( - g, request, redirect, flash, Response, render_template, Markup, url_for, send_from_directory) -from flask_appbuilder import ModelView, CompactCRUDMixin, BaseView, expose, SimpleFormView + g, request, redirect, flash, Response, render_template, Markup, + url_for, send_from_directory) +from flask_appbuilder import ( + ModelView, CompactCRUDMixin, BaseView, expose, SimpleFormView) from flask_appbuilder.actions import action from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access, has_access_api @@ -293,6 +295,7 @@ def apply(self, query, func): # noqa ) return query + def validate_json(form, field): # noqa try: json.loads(field.data) @@ -721,18 +724,21 @@ def form_post(self, form): # Go back to welcome page / splash screen message = _('CSV file "{0}" uploaded to table "{1}" in ' - 'database "{2}"'.format(filename, form.name.data, form.con.data)) + 'database "{2}"'.format(filename, + form.name.data, + form.con.data)) flash(message, 'info') redirect('/databaseview/list') @staticmethod - def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, - prefix, mangle_dupe_cols, skipinitialspace, skiprows, nrows, - skip_blank_lines, parse_dates, infer_datetime_format, - dayfirst, thousands, decimal, quotechar, escapechar, comment, + def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, + prefix, mangle_dupe_cols, skipinitialspace, skiprows, nrows, + skip_blank_lines, parse_dates, infer_datetime_format, + dayfirst, thousands, decimal, quotechar, escapechar, comment, encoding, error_bad_lines, chunksize): # Use Pandas to parse csv file to a dataframe - upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' + str(config['SUPERSET_WEBSERVER_PORT']) \ + upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' \ + + str(config['SUPERSET_WEBSERVER_PORT']) \ + url_for('uploaded_file', filename=filepath_or_buffer) # Expose this to api so can specify each field chunks = pandas.read_csv(filepath_or_buffer=upload_path, @@ -764,13 +770,14 @@ def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, return df @staticmethod - def df_to_db(df, name, con, schema, if_exists, index, index_label, chunksize): + def df_to_db(df, name, con, schema, if_exists, index, + index_label, chunksize): engine = create_engine(con, echo=False) # Use Pandas to parse dataframe to database - df.to_sql(name=name, con=engine, schema=schema, if_exists=if_exists, index=index, - index_label=index_label, chunksize=chunksize) + df.to_sql(name=name, con=engine, schema=schema, if_exists=if_exists, + index=index, index_label=index_label, chunksize=chunksize) @staticmethod def allowed_file(filename): @@ -779,9 +786,11 @@ def allowed_file(filename): filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] def upload_file(self, form): - if form.csv_file.data and self.allowed_file(form.csv_file.data.filename): + if form.csv_file.data and \ + self.allowed_file(form.csv_file.data.filename): filename = secure_filename(form.csv_file.data.filename) - form.csv_file.data.save(os.path.join(config['UPLOAD_FOLDER'], filename)) + form.csv_file.data.save(os.path.join(config['UPLOAD_FOLDER'], + filename)) return filename appbuilder.add_view_no_menu(CsvToDatabaseView) @@ -2548,7 +2557,9 @@ def sql_json(self): if async: # Ignore the celery future object and the request may time out. sql_lab.get_sql_results.delay( - query_id, return_results=False, store_results=not query.select_as_cta) + query_id, + return_results=False, + store_results=not query.select_as_cta) return Response( json.dumps({'query': query.to_dict()}, default=utils.json_int_dttm_ser, diff --git a/superset/widgets.py b/superset/widgets.py index 83d8b64ca75f..2f989a7ba446 100644 --- a/superset/widgets.py +++ b/superset/widgets.py @@ -2,4 +2,4 @@ class CsvListWidget(ListWidget): - template = 'superset/widgets/list.html' \ No newline at end of file + template = 'superset/widgets/list.html' diff --git a/tests/core_tests.py b/tests/core_tests.py index def281b7e914..6b0decd55176 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -131,7 +131,8 @@ def test_filter_endpoint(self): slice_id = self.get_slice(slice_name, db.session).id db.session.commit() tbl_id = self.table_ids.get('energy_usage') - table = db.session.query(models.SqlaTable).filter(models.SqlaTable.id == tbl_id) + table = db.session.query(models.SqlaTable).filter( + models.SqlaTable.id == tbl_id) table.filter_select_enabled = True url = ( "/superset/filter/table/{}/target/?viz_type=sankey&groupby=source" @@ -546,12 +547,12 @@ def test_import_csv(self): test_file.seek(0) form_data = {'csv_file': test_file, - 'sep': ',', - 'name': 'TestName', - 'con': config['SQLALCHEMY_DATABASE_URI'], - 'if_exists': 'append', - 'index_label': 'test_label', - 'chunksize': 1} + 'sep': ',', + 'name': 'TestName', + 'con': config['SQLALCHEMY_DATABASE_URI'], + 'if_exists': 'append', + 'index_label': 'test_label', + 'chunksize': 1} url = '/databaseview/list/' add_datasource_page = self.get_resp(url) From 8aef7e2068bd985230167ce35b7bc519015f7edf Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Mon, 3 Apr 2017 01:31:59 -0400 Subject: [PATCH 26/37] Change port back to default --- tests/superset_test_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/superset_test_config.py b/tests/superset_test_config.py index 013f496ef987..1e65d2b0ca35 100644 --- a/tests/superset_test_config.py +++ b/tests/superset_test_config.py @@ -3,7 +3,7 @@ AUTH_USER_REGISTRATION_ROLE = 'alpha' SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(DATA_DIR, 'unittests.db') DEBUG = True -SUPERSET_WEBSERVER_PORT = 8088 +SUPERSET_WEBSERVER_PORT = 8081 # Allowing SQLALCHEMY_DATABASE_URI to be defined as an env var for # continuous integration From 0995cdf45d74c2242a8f404102d25ac9f494bbf4 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Mon, 3 Apr 2017 01:48:33 -0400 Subject: [PATCH 27/37] Fix linting errors --- superset/forms.py | 190 ++++++++++++++++++++++++++++------------------ 1 file changed, 116 insertions(+), 74 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index 7e1633e132ca..75d63406f430 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -1162,101 +1162,143 @@ def add_to_form(attrs): class CsvToDatabaseForm(DynamicForm): # These are the fields exposed by Pandas read_csv() csv_file = FileField(_('CSV File'), - description=_('Select a CSV file to be uploaded to a database.'), - validators=[FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) + description=_('Select a CSV file to be ' + 'uploaded to a database.'), + validators=[FileRequired(), + FileAllowed(['csv'], + _('CSV Files ' + 'Only!'))]) sep = StringField(_('Delimiter'), - description=_('Delimiter used by CSV file (for whitespace use \s+).'), - validators=[DataRequired()], - widget=BS3TextFieldWidget()) + description=_('Delimiter used by CSV ' + 'file (for whitespace ' + 'use \s+).'), + validators=[DataRequired()], + widget=BS3TextFieldWidget()) header = IntegerField(_('Header Row'), - description=_('Row containing the headers to use as column names (0 is ' - 'first line of data). Leave empty if there is no header row.'), - validators=[Optional(), NumberRange(0, 1E+20)], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Row containing the ' + 'headers to use as ' + 'column names (0 is ' + 'first line of data). ' + 'Leave empty if there is no ' + 'header row.'), + validators=[Optional(), + NumberRange(0, 1E+20)], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) names = StringField(_('Column Names'), - description=_('List of comma-separated column names to use if header row ' - 'not specified above. Leave empty if header field populated.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('List of comma-separated ' + 'column names to use if ' + 'header row not ' + 'specified above. ' + 'Leave empty if header ' + 'field populated.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) index_col = IntegerField(_('Index Column'), - description=_('Column to use as the row labels of the dataframe. ' - 'Leave empty if no index column.'), - validators=[Optional(), NumberRange(0, 1E+20)], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Column to use as the ' + 'row labels of the ' + 'dataframe. Leave empty ' + 'if no index column.'), + validators=[Optional(), + NumberRange(0, 1E+20)], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) squeeze = BetterBooleanField(_('Squeeze'), - description=_('Parse the data as a series (specify this option if the ' - 'data contains only one column.)')) + description=_('Parse the data as ' + 'a series (specify ' + 'this option if the ' + 'data contains only ' + 'one column.)')) prefix = StringField(_('Prefix'), - description=_('Prefix to add to column numbers when no header ' - '(e.g. "X" for "X0, X1").'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Prefix to add to column ' + 'numbers when no header ' + '(e.g. "X" for "X0, X1").'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) mangle_dupe_cols = BetterBooleanField(_('Mangle Duplicate Columns'), - description=_('Specify duplicate columns as ' - '"X.0, X.1".')) + description=_('Specify duplicate ' + 'columns as ' + '"X.0, X.1".')) skipinitialspace = BetterBooleanField(_('Skip Initial Space'), - description=_('Skip spaces after delimiter.')) + description=_('Skip spaces ' + 'after delimiter.')) skiprows = IntegerField(_('Skip Rows'), - description=_('Number of rows to skip at start of file.'), - validators=[Optional(), NumberRange(0, 1E+20)], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Number of rows to skip ' + 'at start of file.'), + validators=[Optional(), + NumberRange(0, 1E+20)], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) nrows = IntegerField(_('Rows to Read'), - description=_('Number of rows of file to read.'), - validators=[Optional(), NumberRange(0, 1E+20)], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Number of rows of file to read.'), + validators=[Optional(), NumberRange(0, 1E+20)], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) skip_blank_lines = BetterBooleanField(_('Skip Blank Lines'), - description=_('Skip blank lines rather than ' - 'interpreting them as NaN values.')) + description=_('Skip blank ' + 'lines rather than ' + 'interpreting them ' + 'as NaN values.')) parse_dates = BetterBooleanField(_('Parse Dates'), - description=_('Parse date values.')) + description=_('Parse ' + 'date values.')) infer_datetime_format = BetterBooleanField(_('Infer Datetime Format'), - description=_('Use Pandas to interpret the ' - 'datetime format ' - 'automatically.')) + description=_('Use Pandas to ' + 'interpret ' + 'the datetime ' + 'format ' + 'automatically.')) dayfirst = BetterBooleanField(_('Day First'), - description=_('Use DD/MM (European/International) date format.')) + description=_('Use DD/MM ' + '(European/International) ' + 'date format.')) thousands = StringField(_('Thousands Separator'), - description=_('Separator for values in thousands.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Separator for values in ' + 'thousands.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) decimal = StringField(_('Decimal Character'), - description=_('Character to interpret as decimal point.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or '.']) + description=_('Character to interpret as ' + 'decimal point.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or '.']) quotechar = StringField(_('Quote Character'), - description=_('Character used to denote the start and end of a ' - 'quoted item.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or "'"]) + description=_('Character used to denote the start ' + 'and end of a ' + 'quoted item.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or "'"]) escapechar = StringField(_('Escape Character'), - description=_('Character used to escape a quoted item.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Character used to ' + 'escape a quoted item.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) comment = StringField(_('Comment Character'), - description=_('Character used to denote the start of a comment.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Character used to denote the ' + 'start of a comment.'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) encoding = StringField(_('Encoding'), - description=_('Encoding to use for UTF when reading/writing (e.g. "utf-8").'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + description=_('Encoding to use for UTF when ' + 'reading/writing (e.g. "utf-8").'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) error_bad_lines = BetterBooleanField(_('Error On Bad Lines'), - description=_('Error on bad lines (e.g. a line with ' - 'too many commas). If false these bad ' - 'lines will instead be dropped from ' - 'the resulting dataframe.')) + description=_('Error on bad lines ' + '(e.g. a line with ' + 'too many commas). ' + 'If false these bad ' + 'lines will instead ' + 'be dropped from the ' + 'resulting dataframe.')) # These are the fields exposed by Pandas .to_sql() name = StringField(_('Table Name'), From 295f5f61322b1b71bff905176508b53964a9cce2 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Fri, 7 Apr 2017 19:13:47 -0400 Subject: [PATCH 28/37] Fix linting error --- superset/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/superset/views.py b/superset/views.py index f81f8960d3ef..c729c4ef977e 100755 --- a/superset/views.py +++ b/superset/views.py @@ -688,6 +688,7 @@ def form_post(self, form): filename = self.upload_file(form) # Use Pandas to convert csv to dataframe + datetime_flag = form.infer_datetime_format.data df = self.csv_to_df(filepath_or_buffer=filename, sep=form.sep.data, header=form.header.data, @@ -701,7 +702,7 @@ def form_post(self, form): nrows=form.nrows.data, skip_blank_lines=form.skip_blank_lines.data, parse_dates=form.parse_dates.data, - infer_datetime_format=form.infer_datetime_format.data, + infer_datetime_format=datetime_flag, dayfirst=form.dayfirst.data, thousands=form.thousands.data, decimal=form.decimal.data, From cb9b7077ed700c819290d11c000d3f32dc49ef12 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 1 Jun 2017 07:20:33 -0400 Subject: [PATCH 29/37] Add babel files to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6c7253373c54..402ff0388ceb 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ app.db *.bak .idea *.sqllite +babel/* # Node.js, webpack artifacts *.entry.js From 58e4db45eef7b8df7bef51d591006115ec19c70c Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 1 Jun 2017 07:23:50 -0400 Subject: [PATCH 30/37] remove babel files from gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 402ff0388ceb..6c7253373c54 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,6 @@ app.db *.bak .idea *.sqllite -babel/* # Node.js, webpack artifacts *.entry.js From edf024f38c7cf69b2dd1a68c708b0a9ce5f1413f Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 1 Jun 2017 09:41:26 -0400 Subject: [PATCH 31/37] Fix issue remaining from previous merge --- superset/views/core.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/superset/views/core.py b/superset/views/core.py index 31ad83de915e..ca126971a893 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -195,7 +195,6 @@ class DatabaseView(SupersetModelView, DeleteMixin): # noqa 'changed_by', 'changed_on', ] - list_widget = CsvListWidget add_template = "superset/models/database/add.html" edit_template = "superset/models/database/edit.html" base_order = ('changed_on', 'desc') @@ -280,7 +279,6 @@ def _delete(self, pk): class DatabaseAsync(DatabaseView): - base_filters = [['id', DatabaseFilter, lambda: []]] list_columns = [ 'id', 'database_name', 'expose_in_sqllab', 'allow_ctas', 'force_ctas_schema', From 36364296f6443402abdcaf2aa5d46bb8c7661ece Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Fri, 2 Jun 2017 03:17:59 -0400 Subject: [PATCH 32/37] Fix previous merge issues. --- superset/forms.py | 3 +- superset/views/base.py | 13 ++- superset/views/core.py | 177 ++++++++++++++++++++++++++++++++++++++++- tests/core_tests.py | 6 +- 4 files changed, 191 insertions(+), 8 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index 75d63406f430..732bc955d6aa 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -1181,8 +1181,7 @@ class CsvToDatabaseForm(DynamicForm): 'first line of data). ' 'Leave empty if there is no ' 'header row.'), - validators=[Optional(), - NumberRange(0, 1E+20)], + validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) names = StringField(_('Column Names'), diff --git a/superset/views/base.py b/superset/views/base.py index 893dddaf0c31..0385c193d294 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -283,7 +283,10 @@ class SupersetFilter(BaseFilter): """ def get_user_roles(self): - return get_user_roles() + attr = '__get_user_roles' + if not hasattr(self, attr): + setattr(self, attr, get_user_roles()) + return getattr(self, attr) def get_all_permissions(self): """Returns a set of tuples with the perm name and view menu name""" @@ -318,6 +321,14 @@ def has_all_datasource_access(self): self.has_role(['Admin', 'Alpha']) or self.has_perm('all_datasource_access', 'all_datasource_access')) +class DatabaseFilter(SupersetFilter): + def apply(self, query, func): # noqa + if ( + self.has_role('Admin') or + self.has_perm('all_database_access', 'all_database_access')): + return query + perms = self.get_view_menus('database_access') + return query.filter(self.model.perm.in_(perms)) class DatasourceFilter(SupersetFilter): def apply(self, query, func): # noqa diff --git a/superset/views/core.py b/superset/views/core.py index ca126971a893..c75dee00a788 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -12,13 +12,16 @@ import re import time import traceback +import os +import pandas import sqlalchemy as sqla from flask import ( g, request, redirect, flash, Response, render_template, Markup, - abort, url_for) -from flask_appbuilder import expose + abort, url_for, send_from_directory) +from flask_appbuilder import ( + ModelView, CompactCRUDMixin, BaseView, expose, SimpleFormView) from flask_appbuilder.actions import action from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access_api @@ -31,6 +34,7 @@ from sqlalchemy import create_engine from werkzeug.routing import BaseConverter +from werkzeug.utils import secure_filename from superset import ( appbuilder, cache, db, viz, utils, app, @@ -42,6 +46,9 @@ import superset.models.core as models from superset.models.sql_lab import Query from superset.sql_parse import SupersetQuery +from superset.widgets import CsvListWidget +from superset.forms import CsvToDatabaseForm +from superset.views.base import DatabaseFilter from .base import ( api, SupersetModelView, BaseSupersetView, DeleteMixin, @@ -195,6 +202,7 @@ class DatabaseView(SupersetModelView, DeleteMixin): # noqa 'changed_by', 'changed_on', ] + list_widget = CsvListWidget add_template = "superset/models/database/add.html" edit_template = "superset/models/database/edit.html" base_order = ('changed_on', 'desc') @@ -279,6 +287,7 @@ def _delete(self, pk): class DatabaseAsync(DatabaseView): + base_filters = [['id', DatabaseFilter, lambda: []]] list_columns = [ 'id', 'database_name', 'expose_in_sqllab', 'allow_ctas', 'force_ctas_schema', @@ -287,6 +296,170 @@ class DatabaseAsync(DatabaseView): appbuilder.add_view_no_menu(DatabaseAsync) +@app.route('/uploads/') +def uploaded_file(filename): + return send_from_directory(config['UPLOAD_FOLDER'], + filename) + + +class CsvToDatabaseView(SimpleFormView): + form = CsvToDatabaseForm + form_title = _('CSV to Database configuration') + + def form_get(self, form): + # pre process form + # default values + form.csv_file.data = None + form.sep.data = ',' + form.header.data = 0 + form.names.data = None + form.index_col.data = None + form.squeeze.data = False + form.prefix.data = None + form.mangle_dupe_cols.data = True + form.skipinitialspace.data = False + form.skiprows.data = None + form.nrows.data = None + form.skip_blank_lines.data = True + form.parse_dates.data = False + form.infer_datetime_format.data = False + form.dayfirst.data = False + form.thousands.data = None + form.decimal.data = '.' + form.quotechar.data = None + form.escapechar.data = None + form.comment.data = None + form.encoding.data = None + form.error_bad_lines.data = False + form.name.data = None + form.con.data = config['SQLALCHEMY_DATABASE_URI'] + form.schema.data = None + form.if_exists.data = 'append' + form.index.data = None + form.index_label.data = None + form.chunksize.data = 100000 + + def form_post(self, form): + # post process form + + # Turn into list of strings + if form.names.data is not None: + form.names.data = form.names.data.split(",") + else: + if form.header.data is None: + form.header.data = 0 + + # Attempt to upload csv file + filename = self.upload_file(form) + + # Use Pandas to convert csv to dataframe + datetime_flag = form.infer_datetime_format.data + df = self.csv_to_df(filepath_or_buffer=filename, + sep=form.sep.data, + header=form.header.data, + names=form.names.data, + index_col=form.index_col.data, + squeeze=form.squeeze.data, + prefix=form.prefix.data, + mangle_dupe_cols=form.mangle_dupe_cols.data, + skipinitialspace=form.skipinitialspace.data, + skiprows=form.skiprows.data, + nrows=form.nrows.data, + skip_blank_lines=form.skip_blank_lines.data, + parse_dates=form.parse_dates.data, + infer_datetime_format=datetime_flag, + dayfirst=form.dayfirst.data, + thousands=form.thousands.data, + decimal=form.decimal.data, + quotechar=form.quotechar.data, + escapechar=form.escapechar.data, + comment=form.comment.data, + encoding=form.encoding.data, + error_bad_lines=form.error_bad_lines.data, + chunksize=form.chunksize.data) + + # Use Pandas to convert superset dataframe to database + self.df_to_db(df=df, + name=form.name.data, + con=form.con.data, + schema=form.schema.data, + if_exists=form.if_exists.data, + index=form.index.data, + index_label=form.index_label.data, + chunksize=form.chunksize.data) + + # Go back to welcome page / splash screen + message = _('CSV file "{0}" uploaded to table "{1}" in ' + 'database "{2}"'.format(filename, + form.name.data, + form.con.data)) + flash(message, 'info') + redirect('/databaseview/list') + + @staticmethod + def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, + prefix, mangle_dupe_cols, skipinitialspace, skiprows, nrows, + skip_blank_lines, parse_dates, infer_datetime_format, + dayfirst, thousands, decimal, quotechar, escapechar, comment, + encoding, error_bad_lines, chunksize): + # Use Pandas to parse csv file to a dataframe + upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' \ + + str(config['SUPERSET_WEBSERVER_PORT']) \ + + url_for('uploaded_file', filename=filepath_or_buffer) + # Expose this to api so can specify each field + chunks = pandas.read_csv(filepath_or_buffer=upload_path, + sep=sep, + header=header, + names=names, + index_col=index_col, + squeeze=squeeze, + prefix=prefix, + mangle_dupe_cols=mangle_dupe_cols, + skipinitialspace=skipinitialspace, + skiprows=skiprows, + nrows=nrows, + skip_blank_lines=skip_blank_lines, + parse_dates=parse_dates, + infer_datetime_format=infer_datetime_format, + dayfirst=dayfirst, + thousands=thousands, + decimal=decimal, + quotechar=quotechar, + escapechar=escapechar, + comment=comment, + encoding=encoding, + error_bad_lines=error_bad_lines, + chunksize=chunksize) + + df = pandas.DataFrame() + df = pandas.concat(chunk for chunk in chunks) + return df + + @staticmethod + def df_to_db(df, name, con, schema, if_exists, index, + index_label, chunksize): + + engine = create_engine(con, echo=False) + + # Use Pandas to parse dataframe to database + df.to_sql(name=name, con=engine, schema=schema, if_exists=if_exists, + index=index, index_label=index_label, chunksize=chunksize) + + @staticmethod + def allowed_file(filename): + # Only allow specific file extensions as specified in the config + return '.' in filename and \ + filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] + + def upload_file(self, form): + if form.csv_file.data and \ + self.allowed_file(form.csv_file.data.filename): + filename = secure_filename(form.csv_file.data.filename) + form.csv_file.data.save(os.path.join(config['UPLOAD_FOLDER'], + filename)) + return filename + +appbuilder.add_view_no_menu(CsvToDatabaseView) class DatabaseTablesAsync(DatabaseView): list_columns = ['id', 'all_table_names', 'all_schema_names'] diff --git a/tests/core_tests.py b/tests/core_tests.py index 7a4654b78519..200655b60fc7 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -12,12 +12,11 @@ import random import unittest import os -import pdb import unicodecsv from flask import escape -from superset import db, utils, appbuilder, sm, jinja_context, sql_lab +from superset import app, db, utils, appbuilder, sm, jinja_context, sql_lab from superset.models import core as models from superset.models.sql_lab import Query from superset.views.core import DatabaseView @@ -664,7 +663,8 @@ def test_import_csv(self): 'con': config['SQLALCHEMY_DATABASE_URI'], 'if_exists': 'append', 'index_label': 'test_label', - 'chunksize': 1} + 'chunksize': 1, + 'mangle_dupe_cols': True} url = '/databaseview/list/' add_datasource_page = self.get_resp(url) From 49c4baadfabf467c3e517a1c28d93031f77403de Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Fri, 2 Jun 2017 03:22:37 -0400 Subject: [PATCH 33/37] Add missing file. --- superset/views/base.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/superset/views/base.py b/superset/views/base.py index 0385c193d294..8b3ecf599bad 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -283,10 +283,7 @@ class SupersetFilter(BaseFilter): """ def get_user_roles(self): - attr = '__get_user_roles' - if not hasattr(self, attr): - setattr(self, attr, get_user_roles()) - return getattr(self, attr) + return get_user_roles() def get_all_permissions(self): """Returns a set of tuples with the perm name and view menu name""" From 4e50ef967bb492c6a19f5c320bad32bcd8e3558c Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Fri, 2 Jun 2017 03:53:59 -0400 Subject: [PATCH 34/37] Add unicodecsv to setup.py --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 327c1615eff7..37690f1cc74a 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,7 @@ def get_git_sha(): 'boto3==1.4.4', 'celery==3.1.23', 'cryptography==1.7.2', + 'unicodecsv>=0.14.0', 'flask-appbuilder==1.8.1', 'flask-cache==0.13.1', 'flask-migrate==2.0.3', From 011a2fa558e6008a5add7938b1997c17cb73b96f Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Sat, 3 Jun 2017 09:34:49 -0400 Subject: [PATCH 35/37] test commit --- tests/core_tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/core_tests.py b/tests/core_tests.py index 200655b60fc7..06c2e615e82e 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -13,6 +13,7 @@ import unittest import os import unicodecsv +# from flask import escape From ed13c1e40902b643a1f1631868373b5c232ae785 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 8 Jun 2017 06:08:32 -0400 Subject: [PATCH 36/37] Fix codeclimate and travis issues --- .codeclimate.yml | 5 + .gitignore | 2 + .travis.yml | 5 - CHANGELOG.md | 115 + CONTRIBUTING.md | 37 +- INTHEWILD.md | 2 +- babel/messages.pot | 1580 +------------ docs/faq.rst | 13 + setup.py | 1 - .../addSlice/AddSliceContainer.jsx | 97 + .../assets/javascripts/addSlice/index.jsx | 14 + .../assets/javascripts/components/Timer.jsx | 42 +- .../components/controls/SelectControl.jsx | 2 +- superset/assets/javascripts/modules/dates.js | 1 - .../assets/javascripts/modules/superset.js | 38 +- superset/assets/package.json | 4 +- .../addSlice/AddSliceContainer_spec.jsx | 39 + .../spec/javascripts/modules/dates_spec.js | 85 + .../spec/javascripts/sqllab/Timer_spec.jsx | 44 +- superset/assets/stylesheets/superset.css | 4 + superset/assets/visualizations/filter_box.css | 2 +- superset/assets/webpack.config.js | 1 + superset/config.py | 1 + superset/connectors/druid/models.py | 8 + superset/connectors/sqla/models.py | 34 +- superset/forms.py | 81 +- superset/templates/superset/add_slice.html | 19 + .../translations/es/LC_MESSAGES/messages.mo | Bin 39485 -> 13413 bytes .../translations/es/LC_MESSAGES/messages.po | 1415 +++++------ .../translations/fr/LC_MESSAGES/messages.mo | Bin 39484 -> 13412 bytes .../translations/fr/LC_MESSAGES/messages.po | 1415 +++++------ .../translations/it/LC_MESSAGES/messages.mo | Bin 39485 -> 14215 bytes .../translations/it/LC_MESSAGES/messages.po | 2066 +++-------------- .../translations/zh/LC_MESSAGES/messages.mo | Bin 39478 -> 12815 bytes .../translations/zh/LC_MESSAGES/messages.po | 1075 ++++----- superset/views/base.py | 2 + superset/views/core.py | 22 +- tests/core_tests.py | 24 +- 38 files changed, 2745 insertions(+), 5550 deletions(-) create mode 100644 superset/assets/javascripts/addSlice/AddSliceContainer.jsx create mode 100644 superset/assets/javascripts/addSlice/index.jsx create mode 100644 superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx create mode 100644 superset/assets/spec/javascripts/modules/dates_spec.js create mode 100644 superset/templates/superset/add_slice.html diff --git a/.codeclimate.yml b/.codeclimate.yml index 4fe69490ce19..2da321387594 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -5,6 +5,11 @@ engines: enabled: false eslint: enabled: true + checks: + import/extensions: + enabled: false + import/no-extraneous-dependencies: + enabled: false config: config: superset/assets/.eslintrc pep8: diff --git a/.gitignore b/.gitignore index bac278990778..2ad30456bcad 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ app.db .idea *.sqllite .vscode +.python-version # Node.js, webpack artifacts *.entry.js @@ -33,3 +34,4 @@ node_modules npm-debug.log yarn.lock superset/assets/version_info.json + diff --git a/.travis.yml b/.travis.yml index 1c2690a7f39b..a0a1b03f313c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,11 +3,6 @@ language: python addons: code_climate: repo_token: 5f3a06c425eef7be4b43627d7d07a3e46c45bdc07155217825ff7c49cb6a470c - apt: - sources: - - deadsnakes - packages: - - python3.5 cache: directories: - $HOME/.wheelhouse/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c2ba54fe74c..23e083a5e373 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,120 @@ ## Change Log +## Change Log + +### 0.18.3 (2017/06/02 15:27 +00:00) +- [d90044c](https://github.com/airbnb/superset/commit/d90044cd523253aa01b5cdf6509b43abeef34079) 0.18.3 (@mistercrunch) +- [62bd4eb](https://github.com/airbnb/superset/commit/62bd4eb2118e4f1e771b58cd455b928be002a461) Converting filter argument to number if column is number (#2891) (@fabianmenges) +- [677c427](https://github.com/airbnb/superset/commit/677c427b1615a2a9b9054932b5e07868d7d63e42) delete DataPreviewModal, it doesn't get used anywhere (#2882) (@ascott) +- [52b0716](https://github.com/airbnb/superset/commit/52b0716571c5b68f65d08719e54343e0a6ec8c8e) [bugfix] allow database macro to work when CSRF is diabled (#2884) (@justinr1234) +- [04b662e](https://github.com/airbnb/superset/commit/04b662ea1154b75e2c362aed97e33946251d1bed) Fix a type error in rst' sub list. (#2881) (@xiaohanyu) +- [db052b1](https://github.com/airbnb/superset/commit/db052b17ea1782c472687095e1365d071e592dd0) Add visualize advise for long query (#2879) (@graceguo-supercat) +- [e300273](https://github.com/airbnb/superset/commit/e300273e71f0b6ca8b63ae974cc13534d94c56de) [explore] adding y_axis_bounds to force Y axis bounds (#2878) (@mistercrunch) +- [c5f2eaf](https://github.com/airbnb/superset/commit/c5f2eafc906bebf1d238e62ff5a8821cf549220c) [explore] 'Save as' -> 'Save' as it can be used to overwrite (#2875) (@mistercrunch) +- [90e4d64](https://github.com/airbnb/superset/commit/90e4d6469d3d420cf839a4c9f3a2408ab0ff0a42) [js-testing] more tests for SelectControl (#2877) (@ascott) +- [1e7773e](https://github.com/airbnb/superset/commit/1e7773eb169d29607991d0c4619ee930104e18de) Improve visualize modal test coverage (#2811) (@graceguo-supercat) +- [3c89c8c](https://github.com/airbnb/superset/commit/3c89c8cc4613d938e4e8726c30142fa32b1249f7) 0.18.3-alpha.3 (@mistercrunch) +- [74086da](https://github.com/airbnb/superset/commit/74086dae2ba66029917a7ed640cfcfc7555c0520) [bars] fix sort numeric bar on x axis (#2812) (@mistercrunch) +- [66403f1](https://github.com/airbnb/superset/commit/66403f1876bb7bcf31eb8187517c116a2d5b6b96) [explore] viz type selector as modal (#2787) (@mistercrunch) +- [3a4cd3a](https://github.com/airbnb/superset/commit/3a4cd3ae24c811e21fb76c5f9efecb2a6c4a6da2) Applying specified limit in bubble plot (#2815) (@mistercrunch) +- [4ffc1f6](https://github.com/airbnb/superset/commit/4ffc1f613e1d2bf012dc5eb66751fea8c698804e) Fix filter values populating for views (#2816) (@mistercrunch) +- [dfbba84](https://github.com/airbnb/superset/commit/dfbba84400986451f5068354a7626537e7b377a4) 0.18.3-alpha.2 (@mistercrunch) +- [77864e6](https://github.com/airbnb/superset/commit/77864e6cf4d5394a5080300097ae21cf9abfcc53) reduce clientside timeout limit (#2820) (@graceguo-supercat) +- [4d12251](https://github.com/airbnb/superset/commit/4d1225180618b4c4f05c67f6534bf273692a9243) [explore] include ControlHeader as part of Control interface (#2809) (@mistercrunch) +- [0c9f9b6](https://github.com/airbnb/superset/commit/0c9f9b695b921c7e17cec83e1d51e4aa3cae7cc9) [clarity/consistency] rename /explorev2/ -> /explore/ (#2802) (@ascott) +- [a4a2bf7](https://github.com/airbnb/superset/commit/a4a2bf7ae9cc1075a38cc980bb696d6512125f2b) filter_box: allow creatable entries (#2804) (@vavrusa) +- [d0a04cd](https://github.com/airbnb/superset/commit/d0a04cde49c86185b779b16f1da05450b1ccf571) apply redux for VisualizeModal (#2795) (@graceguo-supercat) +- [69685b9](https://github.com/airbnb/superset/commit/69685b9dcc0c26f819ff7edeedc10ee302e97f83) Fixing country maps (#2801) (@mistercrunch) +- [b308a3e](https://github.com/airbnb/superset/commit/b308a3eb4eb08de39edbff6490c06a6bef7b7ce1) Added Country Map : New Visualization tools (#2708) (@ymatagne) +- [bfa40bd](https://github.com/airbnb/superset/commit/bfa40bd360021874628477ee3eb2272033cd2d54) [hotfix] 'filter box from and to date filter #2649' (#2785) (@yamdraco) +- [b0e2904](https://github.com/airbnb/superset/commit/b0e2904c245e5569473f425af2806271e33a5176) Updating permission when refreshing druid datasource (#2655) (@ShengyaoQian) +- [ce506bd](https://github.com/airbnb/superset/commit/ce506bdf65b46f5bccee84ca8254417f63b124a5) Logging a few more actions (#2783) (@mistercrunch) +- [922cc03](https://github.com/airbnb/superset/commit/922cc037bf859c935cc5eacbcd96bf6fa004c5fe) 0.18.3-alpha.1 (@mistercrunch) +- [8252ada](https://github.com/airbnb/superset/commit/8252ada1f9ac94866b91eac55b77ed6d0ef7d02f) [docs] more details on how filters are applied (#2778) (@mistercrunch) +- [a2d2f8b](https://github.com/airbnb/superset/commit/a2d2f8bb8c006adcf80bb2ac18b82f3b486f366a) Enable filter value autocomplete in examples (#2781) (@mistercrunch) +- [7c5f61d](https://github.com/airbnb/superset/commit/7c5f61d6a61e1a3cb6d20d0918610abafa2cd326) Adding some STATSD logging (#2715) (@mistercrunch) +- [841e18a](https://github.com/airbnb/superset/commit/841e18a08c4b375fdff5b846f5d9f108903a3eb6) [sql lab] make database ordering alphabetical in left panel (#2769) (@mistercrunch) +- [dbc7fef](https://github.com/airbnb/superset/commit/dbc7fef7f501cd59ebd99524fa171d9e4dee0325) [sql lab] fix user timestamp is off (#2774) (@mistercrunch) + +### 0.18.2 (2017/05/17 06:08 +00:00) +- [cbfe3cb](https://github.com/airbnb/superset/commit/cbfe3cb2dcadedeedfcf55f2bb4883b76a484b36) 0.18.2 (@mistercrunch) +- [5fcd25d](https://github.com/airbnb/superset/commit/5fcd25def15b5990c10b5045cb89b88f94ba8716) 0.18.1-alpha.2 (@mistercrunch) +- [fe3f5f6](https://github.com/airbnb/superset/commit/fe3f5f69ae83eaf96415926661b272ebb460a4e0) [hotfix] 'No numeric types to aggregate' (@mistercrunch) +- [2395fbb](https://github.com/airbnb/superset/commit/2395fbbdaaa5c81c3559f17cedf2e998b8341cb9) Adding `end_result_backend_time` to Query model (#2766) (@mistercrunch) +- [960b26c](https://github.com/airbnb/superset/commit/960b26c7a2cad58b39c359f44c385980434dacb8) Show clear and actionable query timeout error message (#2763) (@graceguo-supercat) +- [28ac350](https://github.com/airbnb/superset/commit/28ac3504d67f76c31aac23435dd15d76e0ca75bf) 0.18.1-alpha.1 (@mistercrunch) +- [ecc00bd](https://github.com/airbnb/superset/commit/ecc00bdd26517a832a35529f0fdd7d17972e6f8f) [explore] a bit less margin in left panel (#2758) (@mistercrunch) +- [e794645](https://github.com/airbnb/superset/commit/e7946451d6aa84229d0c70b7a683b29b784ca1a1) fixed 500 error when export dashboard (#2760) (@eeve) +- [9b34600](https://github.com/airbnb/superset/commit/9b34600c8e8df72ecbdfaaf94bdf023c08e26701) Remove duplicate text (#2761) (@awbush) +- [8846108](https://github.com/airbnb/superset/commit/884610861b8d39da91e4c1bce7934172d2486da9) 0.18.0 (@mistercrunch) +- [d9bd3d6](https://github.com/airbnb/superset/commit/d9bd3d646006d9e6ddf2ccded21d7984935c98c8) fix percentage change viz (#2757) (@yileic) +- [38375be](https://github.com/airbnb/superset/commit/38375be5c3062caf9f6cd4d6ac62109e1940bd10) Fix issues around % signs and Presto (#2755) (@mistercrunch) +- [91d951a](https://github.com/airbnb/superset/commit/91d951ac422a6411e59b2ec195011ea4dc44b0b1) Change hardcoded references to 'User' security model to allow custom class override (#2728) (@RichRadics) + +### 0.18.0 (2017/05/12 03:36 +00:00) +- [d79a45f](https://github.com/airbnb/superset/commit/d79a45ff32ff8e2b5d601601507680dccf693bbc) add number format to pivot table (#2703) (@yileic) +- [818251f](https://github.com/airbnb/superset/commit/818251fc8519167be7e0730083c4a694972fb06b) make margin consistent (#2753) (@yileic) +- [75abd1f](https://github.com/airbnb/superset/commit/75abd1f44a12208fd54f28a1185d40ea8639396a) 0.18.0-alpha.4 (@mistercrunch) +- [f55df3b](https://github.com/airbnb/superset/commit/f55df3b18b67ff58d5ad3f6f12f7fe76e9697084) [sql lab] fix responsivity of grid (#2742) (@mistercrunch) +- [5dbfdef](https://github.com/airbnb/superset/commit/5dbfdefae82674d71ab1f1464622d199a6f72f30) [sql lab] fix partitionned table has no partitions (#2740) (@mistercrunch) +- [e558444](https://github.com/airbnb/superset/commit/e5584440cecdb0d9a79ba6c4ff1050e73e774035) Speed up all CRUD list views (#2747) (@mistercrunch) +- [d5e9d5d](https://github.com/airbnb/superset/commit/d5e9d5d045d342ef203c7d7cd480011626b6d7a1) fix auto select override pre-selected value bug (#2745) (@graceguo-supercat) +- [3208a01](https://github.com/airbnb/superset/commit/3208a014ffccfe44238fb5982f6e391a1764d4b3) fix dual line chart margin (#2737) (@yileic) +- [874c12a](https://github.com/airbnb/superset/commit/874c12ad2d99059b2f8f979bdd05e77d8768db03) 0.18.0-alpha.3 (@mistercrunch) +- [22d8075](https://github.com/airbnb/superset/commit/22d8075c536bdfc1790b23381e0017720cc921a5) Making the stop button instantaneous (#2738) (@mistercrunch) +- [baebba1](https://github.com/airbnb/superset/commit/baebba115930e95076e9252987fb4e107ddd23d5) 0.18.0-alpha.2 (@mistercrunch) +- [04748b4](https://github.com/airbnb/superset/commit/04748b4cdac7a4fd53f5d7716a36ceebea7bf7ca) [SQL Lab] fix gamma metadata access (#2702) (@mistercrunch) +- [a471afe](https://github.com/airbnb/superset/commit/a471afe206ca3357ea4c27c1accf94d44c8f5122) [sql lab] improvements to the left panel (#2709) (@mistercrunch) +- [5d0a01d](https://github.com/airbnb/superset/commit/5d0a01d0d099a9d73ba04fded7cad223a10e86f2) Decimal is a valid numeric type (#2720) (@hajdbo) +- [9e1272e](https://github.com/airbnb/superset/commit/9e1272e97c88a3ce2e8dfd15fa819de52e331342) 0.18.0-alpha.1 (@mistercrunch) +- [aeebd88](https://github.com/airbnb/superset/commit/aeebd8840d0551a7cd9a2d43039dcd07648d66ed) [table] fixing CSS glitches on table view (#2725) (@mistercrunch) +- [55d3b01](https://github.com/airbnb/superset/commit/55d3b012e504f788732488bf11a1ec7ef223a821) refactor: recentActions ajax call is redundant (#2722) (@S-YOU) +- [a6e1e18](https://github.com/airbnb/superset/commit/a6e1e18244951b5bf68ac76e897a16713c7d279b) [sql lab] fix CREATE TABLE AS (#2719) (@mistercrunch) +- [46d7a92](https://github.com/airbnb/superset/commit/46d7a925bb4be8891c89ac05d2f447e5ec750bf5) chore: remove unused methods with invalid models.Query usage (#2721) (@S-YOU) +- [5929ab7](https://github.com/airbnb/superset/commit/5929ab76890232068bef5412f23a54226dbed0ec) [dashboard] fix missing datasource issue (#2718) (@mistercrunch) +- [fffb7b5](https://github.com/airbnb/superset/commit/fffb7b500a313b9f9d76eecab18241bf0406c933) [sql lab]Add autoSelect (#2713) (@graceguo-supercat) +- [cb14640](https://github.com/airbnb/superset/commit/cb14640a823c3c6cc768169391779064c2469a68) Removing uneeded results_backends.py (#2717) (@mistercrunch) +- [d65054e](https://github.com/airbnb/superset/commit/d65054e01533f62e63e1c8788da4b97309f65cee) [sql lab] fix csv export where `%` in query (#2711) (@mistercrunch) +- [5d5060e](https://github.com/airbnb/superset/commit/5d5060eca61ad1a7f6baf7adced2985088c82d95) Remove unecessary handling of %% (#2714) (@mistercrunch) +- [9ff3515](https://github.com/airbnb/superset/commit/9ff351532ada993afc4da5060b9a942216e2a74b) Basic integration with ClickHouse (#1844) (@vavrusa) +- [59a6f44](https://github.com/airbnb/superset/commit/59a6f447ec1e92a0319a617ecdf4e22847bf5d95) Fix missing curUserId from SliderAdder.jsx (#2705) (@songyanho) + +### 0.17.6 (2017/05/01 20:13 +00:00) +- [1887b5e](https://github.com/airbnb/superset/commit/1887b5e934b17864850a46d6e88a606b594e0634) 0.17.6 (@mistercrunch) +- [33758bf](https://github.com/airbnb/superset/commit/33758bfff59b9cdc86b58973244ef0613942dc80) 0.17.6-alpha.2 (@mistercrunch) +- [2d5beb1](https://github.com/airbnb/superset/commit/2d5beb1f91c304df948e943100cbfb66345a00e9) improve csrf expiration error handling (#2695) (@ascott) +- [5fd0e7d](https://github.com/airbnb/superset/commit/5fd0e7d02828df4bb02b6a3b34779517fe637123) [vis] bar values should match y axis format (#2701) (@justinpark) +- [ef0c4be](https://github.com/airbnb/superset/commit/ef0c4be06743083da5c33ed9ffbda7ff77b43e74) Fix for referring specific svg (#2612) (@songyanho) +- [ac3aba7](https://github.com/airbnb/superset/commit/ac3aba7c7da905f0f4bfeb0f80efb87136812b90) [sql lab] visualization flow: fixing the groupby parameter (#2681) (@mistercrunch) +- [0fdb57a](https://github.com/airbnb/superset/commit/0fdb57a18153912c2675b54a2c4e5e00691c7cc0) fix (#2696) (@yileic) +- [3e7b5df](https://github.com/airbnb/superset/commit/3e7b5df2876d1014a8411a57cdd7bb18ce64e5d9) [explore] fix empty chart when changing viz type (#2698) (@mistercrunch) +- [3cd16cf](https://github.com/airbnb/superset/commit/3cd16cf3680169dd17a542d83c84f94ca8220805) Fix test's warnings (#2697) (@dennybiasiolli) +- [a58adc8](https://github.com/airbnb/superset/commit/a58adc862ec28842a3ac7f9f1f205fa1c173015e) Fix orm query in HiveEngineSpec.handle_cursor (#2699) (@xrmx) +- [7d88f80](https://github.com/airbnb/superset/commit/7d88f80a9b2003f4529560160aea41c444283a9e) hack to dynamically adjust y axis left margin (#2689) (@yileic) +- [09be02f](https://github.com/airbnb/superset/commit/09be02f70a716819332629144160360e21c8920b) fix x axis label (#2691) (@yileic) +- [50fcdd3](https://github.com/airbnb/superset/commit/50fcdd3a34f3efe58435760ba0bf321d6767a3a5) Adding tails.com to inthewild (#2685) (@alanmcruickshank) +- [dee3649](https://github.com/airbnb/superset/commit/dee36491c5e9394c19dfbc00def353675079aa83) Fix js warnings (#2693) (@dennybiasiolli) +- [903612a](https://github.com/airbnb/superset/commit/903612ac6c802dd042417c1fa8a742812a2094bb) fix (#2692) (@yileic) +- [ce70505](https://github.com/airbnb/superset/commit/ce705054fa2e738612d746c8f07b577f6941a6e3) fix a bug in 'getMaxLabelSize' and x axis label not shown problem (#2694) (@yileic) +- [c589616](https://github.com/airbnb/superset/commit/c5896168830c0901a6488817d970a92ce3fa8f9a) [sql lab] Update event handler name (#2680) (@graceguo-supercat) +- [58309f2](https://github.com/airbnb/superset/commit/58309f275f3b9d123f75e795fe3e42b918a66aab) Mark a few more string for translation (#2651) (@xrmx) +- [edf4e4f](https://github.com/airbnb/superset/commit/edf4e4f24e9eeceb44e2b9a98d2cb02d8cefa6dd) Update README.md (#2676) (@aioue) +- [b3e0b5b](https://github.com/airbnb/superset/commit/b3e0b5b586d530cdd1def10ef38550f680f1922b) Specifying cryptography version in install docs (@mistercrunch) +- [6880298](https://github.com/airbnb/superset/commit/68802989bc8a13f76988eed004dc07fa06208733) Pinning cryptography lib to 1.7.2 (@mistercrunch) +- [70887d7](https://github.com/airbnb/superset/commit/70887d72e2a54fdae2ba58ad8f408528bd694878) 0.17.6-alpha.1 (@ascott) +- [1922225](https://github.com/airbnb/superset/commit/192222504292aed3ffa7368f85ca6cdc7f92aab5) Alternate fix for #2665 (#2671) (@mistercrunch) +- [0bdc301](https://github.com/airbnb/superset/commit/0bdc3010d8da0789df99d588105d6e62cc6b3280) [vis] fix pivot table scrolling when using more than 1 groupy col (#2674) (@ascott) +- [1df37e6](https://github.com/airbnb/superset/commit/1df37e6e4d609f7c0751faf2360a98a896e30f46) add option for pulling favourited dashboards by username (#2661) (@robert-digit) +- [e9ed416](https://github.com/airbnb/superset/commit/e9ed4166549cb515f5c15357b2395c3858736df1) fix csrf error on import_dashboards (#2672) (@ascott) +- [03c42b5](https://github.com/airbnb/superset/commit/03c42b5b87429f2a29ce1b5ef8c13e9a004b907e) Showing slices on datasource edit form (#2645) (@mistercrunch) +- [e055e6d](https://github.com/airbnb/superset/commit/e055e6d2c22e6087bf7c906174c08d543617a514) Fixing PropTypes warning messages (#2670) (@mistercrunch) +- [2978082](https://github.com/airbnb/superset/commit/29780821e8797fee3fbcbcfacbe3e0871750d19b) [druid] fixing the having clause in the explore view (#2648) (@mistercrunch) +- [f10ee13](https://github.com/airbnb/superset/commit/f10ee139011767fd72e20ff0fb6a6411f6b06d6b) [druid] fix FilterBox viz gets timestamps as values if granularity != all (#2647) (@mistercrunch) +- [cdfc4a3](https://github.com/airbnb/superset/commit/cdfc4a35b22e8b07bf2b0503214074761143e7d9) Optimizing the standalone view (#2663) (@mistercrunch) +- [eb762c8](https://github.com/airbnb/superset/commit/eb762c8bfec56a0da664c4aa71baf2197f58042f) add the missing right bracket (#2662) (@yileic) +- [83abfef](https://github.com/airbnb/superset/commit/83abfef8304a8fe83248d959136e7421ba0e04a8) superset: fix argument swap for SqliteEngineSpec.get_table_names (#2664) (@xrmx) +- [54137ad](https://github.com/airbnb/superset/commit/54137ad023f046780bd0e2089ccc57620787f118) Updating CHANGELOG (@mistercrunch) + ### 0.17.5 (2017/04/21 20:56 +00:00) - [4be6bfa](https://github.com/airbnb/superset/commit/4be6bfafaa07695cf47a9a27977855ab30ff87e4) 0.17.5 (@mistercrunch) - [9ba6d48](https://github.com/airbnb/superset/commit/9ba6d489f31d2aba38594dac3cb7d75fbabcdc78) v0.17.5-alpha.10 (#2654) (@ascott) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c681f461eb5..645f926edcab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,7 @@ open to whoever wants to implement it. ### Implement Features Look through the GitHub issues for features. Anything tagged with -"feature" is open to whoever wants to implement it. +"feature" or "starter_task" is open to whoever wants to implement it. ### Documentation @@ -47,6 +47,24 @@ If you are proposing a feature: - Remember that this is a volunteer-driven project, and that contributions are welcome :) +## Pull Request Guidelines + +Before you submit a pull request from your forked repo, check that it +meets these guidelines: + +1. The pull request should include tests, either as doctests, + unit tests, or both. +2. If the pull request adds functionality, the docs should be updated + as part of the same PR. Doc string are often sufficient, make + sure to follow the sphinx compatible standards. +3. The pull request should work for Python 2.7, and ideally python 3.4+. + ``from __future__ import`` will be required in every `.py` file soon. +4. Code will be reviewed by re running the unittests, flake8 and syntax + should be as rigorous as the core Python project. +5. Please rebase and resolve all conflicts before submitting. +6. If you are asked to update your pull request with some changes there's + no need to create a new one. Push your changes to the same branch. + ## Documentation The latest documentation and tutorial are available [here](http://airbnb.io/superset). @@ -292,23 +310,6 @@ The `variables.less` and `bootswatch.less` files that ship with Superset are der [Bootswatch](https://bootswatch.com) and thus extend Bootstrap. Modify variables in these files directly, or swap them out entirely with the equivalent files from other Bootswatch (themes)[https://github.com/thomaspark/bootswatch.git] -## Pull Request Guidelines - -Before you submit a pull request from your forked repo, check that it -meets these guidelines: - -1. The pull request should include tests, either as doctests, - unit tests, or both. -2. If the pull request adds functionality, the docs should be updated - as part of the same PR. Doc string are often sufficient, make - sure to follow the sphinx compatible standards. -3. The pull request should work for Python 2.6, 2.7, and ideally python 3.3. - ``from __future__ import`` will be required in every `.py` file soon. -4. Code will be reviewed by re running the unittests, flake8 and syntax - should be as rigorous as the core Python project. -5. Please rebase and resolve all conflicts before submitting. - - ## Translations We use [Babel](http://babel.pocoo.org/en/latest/) to translate Superset. The diff --git a/INTHEWILD.md b/INTHEWILD.md index 6d38f0773d38..cda992a8f251 100644 --- a/INTHEWILD.md +++ b/INTHEWILD.md @@ -19,7 +19,7 @@ Organizations - [Tobii](http://www.tobii.com/) - [Endress+Hauser](http://www.endress.com/) - [Tails.com](https://tails.com) - + - [FBK - ICT center](http://ict.fbk.eu) Projects ---------- - None we know of yet diff --git a/babel/messages.pot b/babel/messages.pot index c26e8ad42abc..9988d7105418 100755 --- a/babel/messages.pot +++ b/babel/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-06-01 09:20-0400\n" +"POT-Creation-Date: 2017-06-04 20:38+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21,7 +21,7 @@ msgstr "" #: superset/db_engine_specs.py:269 superset/db_engine_specs.py:317 #: superset/db_engine_specs.py:362 superset/db_engine_specs.py:770 #: superset/db_engine_specs.py:806 superset/db_engine_specs.py:838 -#: superset/db_engine_specs.py:884 superset/forms.py:443 +#: superset/db_engine_specs.py:884 msgid "Time Column" msgstr "" @@ -42,7 +42,6 @@ msgstr "" #: superset/db_engine_specs.py:323 superset/db_engine_specs.py:367 #: superset/db_engine_specs.py:779 superset/db_engine_specs.py:809 #: superset/db_engine_specs.py:843 superset/db_engine_specs.py:891 -#: superset/forms.py:387 superset/forms.py:401 msgid "hour" msgstr "" @@ -50,7 +49,7 @@ msgstr "" #: superset/db_engine_specs.py:270 superset/db_engine_specs.py:325 #: superset/db_engine_specs.py:369 superset/db_engine_specs.py:781 #: superset/db_engine_specs.py:811 superset/db_engine_specs.py:845 -#: superset/db_engine_specs.py:893 superset/forms.py:388 superset/forms.py:402 +#: superset/db_engine_specs.py:893 msgid "day" msgstr "" @@ -58,7 +57,6 @@ msgstr "" #: superset/db_engine_specs.py:271 superset/db_engine_specs.py:326 #: superset/db_engine_specs.py:371 superset/db_engine_specs.py:783 #: superset/db_engine_specs.py:813 superset/db_engine_specs.py:847 -#: superset/forms.py:373 superset/forms.py:389 superset/forms.py:403 msgid "week" msgstr "" @@ -66,8 +64,7 @@ msgstr "" #: superset/db_engine_specs.py:273 superset/db_engine_specs.py:328 #: superset/db_engine_specs.py:373 superset/db_engine_specs.py:785 #: superset/db_engine_specs.py:815 superset/db_engine_specs.py:849 -#: superset/db_engine_specs.py:895 superset/forms.py:376 superset/forms.py:390 -#: superset/forms.py:404 +#: superset/db_engine_specs.py:895 msgid "month" msgstr "" @@ -81,7 +78,6 @@ msgstr "" #: superset/db_engine_specs.py:202 superset/db_engine_specs.py:252 #: superset/db_engine_specs.py:332 superset/db_engine_specs.py:789 #: superset/db_engine_specs.py:819 superset/db_engine_specs.py:899 -#: superset/forms.py:391 msgid "year" msgstr "" @@ -90,7 +86,6 @@ msgid "week_start_monday" msgstr "" #: superset/db_engine_specs.py:377 superset/db_engine_specs.py:853 -#: superset/forms.py:375 msgid "week_ending_saturday" msgstr "" @@ -110,1443 +105,6 @@ msgstr "" msgid "10 minute" msgstr "" -#: superset/forms.py:37 -msgid "D3 format syntax https://github.com/d3/d3-format" -msgstr "" - -#: superset/forms.py:150 -msgid "Viz" -msgstr "" - -#: superset/forms.py:153 -msgid "The type of visualization to display" -msgstr "" - -#: superset/forms.py:156 -msgid "Metrics" -msgstr "" - -#: superset/forms.py:159 superset/forms.py:164 -msgid "One or many metrics to display" -msgstr "" - -#: superset/forms.py:162 -msgid "Ordering" -msgstr "" - -#: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:117 -#: superset/forms.py:167 -msgid "Metric" -msgstr "" - -#: superset/forms.py:170 -msgid "Choose the metric" -msgstr "" - -#: superset/forms.py:173 -msgid "Chart Style" -msgstr "" - -#: superset/forms.py:175 -msgid "stack" -msgstr "" - -#: superset/forms.py:176 -msgid "stream" -msgstr "" - -#: superset/forms.py:177 -msgid "expand" -msgstr "" - -#: superset/forms.py:183 -msgid "Color Scheme" -msgstr "" - -#: superset/forms.py:185 -msgid "fire" -msgstr "" - -#: superset/forms.py:186 -msgid "blue_white_yellow" -msgstr "" - -#: superset/forms.py:187 -msgid "white_black" -msgstr "" - -#: superset/forms.py:188 -msgid "black_white" -msgstr "" - -#: superset/forms.py:194 -msgid "Normalize Across" -msgstr "" - -#: superset/forms.py:196 -msgid "heatmap" -msgstr "" - -#: superset/forms.py:197 -msgid "x" -msgstr "" - -#: superset/forms.py:198 -msgid "y" -msgstr "" - -#: superset/forms.py:201 -msgid "" -"Color will be rendered based on a ratio of the cell against the sum of " -"across this criteria" -msgstr "" - -#: superset/forms.py:207 -msgid "Color Scale" -msgstr "" - -#: superset/forms.py:209 -msgid "series" -msgstr "" - -#: superset/forms.py:210 -msgid "overall" -msgstr "" - -#: superset/forms.py:211 -msgid "change" -msgstr "" - -#: superset/forms.py:214 -msgid "Defines how the color are attributed." -msgstr "" - -#: superset/forms.py:217 -msgid "Rendering" -msgstr "" - -#: superset/forms.py:219 -msgid "pixelated (Sharp)" -msgstr "" - -#: superset/forms.py:220 -msgid "auto (Smooth)" -msgstr "" - -#: superset/forms.py:223 -msgid "" -"image-rendering CSS attribute of the canvas object that defines how the " -"browser scales up the image" -msgstr "" - -#: superset/forms.py:228 -msgid "XScale Interval" -msgstr "" - -#: superset/forms.py:231 -msgid "Number of step to take between ticks when printing the x scale" -msgstr "" - -#: superset/forms.py:236 -msgid "YScale Interval" -msgstr "" - -#: superset/forms.py:239 -msgid "Number of step to take between ticks when printing the y scale" -msgstr "" - -#: superset/forms.py:244 -msgid "Stacked Bars" -msgstr "" - -#: superset/forms.py:249 -msgid "Show Markers" -msgstr "" - -#: superset/forms.py:256 -msgid "Bar Values" -msgstr "" - -#: superset/forms.py:261 -msgid "Sort Bars" -msgstr "" - -#: superset/forms.py:263 -msgid "Sort bars by x labels." -msgstr "" - -#: superset/forms.py:266 -msgid "Extra Controls" -msgstr "" - -#: superset/forms.py:268 -msgid "" -"Whether to show extra controls or not. Extra controls include things like" -" making mulitBar charts stacked or side by side." -msgstr "" - -#: superset/forms.py:274 -msgid "Reduce X ticks" -msgstr "" - -#: superset/forms.py:276 -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 " -"be applied to columns and the width may overflow into an horizontal " -"scroll." -msgstr "" - -#: superset/forms.py:284 -msgid "Include Series" -msgstr "" - -#: superset/forms.py:286 -msgid "Include series name as an axis" -msgstr "" - -#: superset/forms.py:289 -msgid "Color Metric" -msgstr "" - -#: superset/forms.py:292 -msgid "A metric to use for color" -msgstr "" - -#: superset/forms.py:295 -msgid "Country Field Type" -msgstr "" - -#: superset/forms.py:298 -msgid "Full name" -msgstr "" - -#: superset/forms.py:299 -msgid "code International Olympic Committee (cioc)" -msgstr "" - -#: superset/forms.py:300 -msgid "code ISO 3166-1 alpha-2 (cca2)" -msgstr "" - -#: superset/forms.py:301 -msgid "code ISO 3166-1 alpha-3 (cca3)" -msgstr "" - -#: superset/forms.py:303 -msgid "" -"The country code standard that Superset should expect to find in the " -"[country] column" -msgstr "" - -#: superset/forms.py:308 -msgid "Group by" -msgstr "" - -#: superset/forms.py:310 -msgid "One or many fields to group by" -msgstr "" - -#: superset/forms.py:313 superset/forms.py:318 -msgid "Columns" -msgstr "" - -#: superset/forms.py:315 -msgid "One or many fields to pivot as columns" -msgstr "" - -#: superset/forms.py:320 superset/forms.py:326 superset/forms.py:332 -msgid "Columns to display" -msgstr "" - -#: superset/forms.py:323 -msgid "X" -msgstr "" - -#: superset/forms.py:329 -msgid "Y" -msgstr "" - -#: superset/forms.py:335 -msgid "Origin" -msgstr "" - -#: superset/forms.py:337 -msgid "default" -msgstr "" - -#: superset/forms.py:338 superset/forms.py:507 -msgid "now" -msgstr "" - -#: superset/forms.py:341 -msgid "" -"Defines the origin where time buckets start, accepts natural dates as in " -"'now', 'sunday' or '1970-01-01'" -msgstr "" - -#: superset/forms.py:346 -msgid "Bottom Margin" -msgstr "" - -#: superset/forms.py:349 -msgid "Bottom marging, in pixels, allowing for more room for axis labels" -msgstr "" - -#: superset/forms.py:354 -msgid "Page Length" -msgstr "" - -#: superset/forms.py:357 -msgid "Number of rows per page, 0 means no pagination" -msgstr "" - -#: superset/forms.py:361 -msgid "Time Granularity" -msgstr "" - -#: superset/forms.py:364 -msgid "all" -msgstr "" - -#: superset/forms.py:365 -msgid "5 seconds" -msgstr "" - -#: superset/forms.py:366 -msgid "30 seconds" -msgstr "" - -#: superset/forms.py:367 -msgid "1 minute" -msgstr "" - -#: superset/forms.py:368 -msgid "5 minutes" -msgstr "" - -#: superset/forms.py:369 -msgid "1 hour" -msgstr "" - -#: superset/forms.py:370 -msgid "6 hour" -msgstr "" - -#: superset/forms.py:371 -msgid "1 day" -msgstr "" - -#: superset/forms.py:372 -msgid "7 days" -msgstr "" - -#: superset/forms.py:374 -msgid "week_starting_sunday" -msgstr "" - -#: superset/forms.py:378 -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/forms.py:384 -msgid "Domain" -msgstr "" - -#: superset/forms.py:393 -msgid "The time unit used for the grouping of blocks" -msgstr "" - -#: superset/forms.py:397 -msgid "Subdomain" -msgstr "" - -#: superset/forms.py:400 superset/forms.py:751 -msgid "min" -msgstr "" - -#: superset/forms.py:406 -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/forms.py:411 -msgid "Link Length" -msgstr "" - -#: superset/forms.py:423 -msgid "Link length in the force layout" -msgstr "" - -#: superset/forms.py:426 -msgid "Charge" -msgstr "" - -#: superset/forms.py:440 -msgid "Charge in the force layout" -msgstr "" - -#: superset/forms.py:446 -msgid "" -"The time column for the visualization. Note that you can define arbitrary" -" expression that return a DATETIME column in the table editor. Also note " -"that the filter below is applied against this column or expression" -msgstr "" - -#: superset/forms.py:454 -msgid "Resample Rule" -msgstr "" - -#: superset/forms.py:457 -msgid "1T" -msgstr "" - -#: superset/forms.py:458 -msgid "1H" -msgstr "" - -#: superset/forms.py:459 -msgid "1D" -msgstr "" - -#: superset/forms.py:460 -msgid "7D" -msgstr "" - -#: superset/forms.py:461 -msgid "1M" -msgstr "" - -#: superset/forms.py:462 -msgid "1AS" -msgstr "" - -#: superset/forms.py:464 -msgid "Pandas resample rule" -msgstr "" - -#: superset/forms.py:467 -msgid "Resample How" -msgstr "" - -#: superset/forms.py:471 superset/forms.py:750 -msgid "mean" -msgstr "" - -#: superset/forms.py:472 superset/forms.py:749 -msgid "sum" -msgstr "" - -#: superset/forms.py:473 superset/forms.py:753 -msgid "median" -msgstr "" - -#: superset/forms.py:475 -msgid "Pandas resample how" -msgstr "" - -#: superset/forms.py:478 -msgid "Resample Fill Method" -msgstr "" - -#: superset/forms.py:482 -msgid "ffill" -msgstr "" - -#: superset/forms.py:483 -msgid "bfill" -msgstr "" - -#: superset/forms.py:485 -msgid "Pandas resample fill method" -msgstr "" - -#: superset/forms.py:488 -msgid "Since" -msgstr "" - -#: superset/forms.py:491 -msgid "1 hour ago" -msgstr "" - -#: superset/forms.py:492 -msgid "12 hours ago" -msgstr "" - -#: superset/forms.py:493 superset/forms.py:508 -msgid "1 day ago" -msgstr "" - -#: superset/forms.py:494 superset/forms.py:509 -msgid "7 days ago" -msgstr "" - -#: superset/forms.py:495 superset/forms.py:510 -msgid "28 days ago" -msgstr "" - -#: superset/forms.py:496 superset/forms.py:511 -msgid "90 days ago" -msgstr "" - -#: superset/forms.py:497 superset/forms.py:512 -msgid "1 year ago" -msgstr "" - -#: superset/forms.py:499 -msgid "" -"Timestamp from filter. This supports free form typing and natural " -"language as in '1 day ago', '28 days' or '3 years'" -msgstr "" - -#: superset/forms.py:504 -msgid "Until" -msgstr "" - -#: superset/forms.py:516 -msgid "Max Bubble Size" -msgstr "" - -#: superset/forms.py:529 -msgid "Whisker/outlier options" -msgstr "" - -#: superset/forms.py:531 -msgid "Determines how whiskers and outliers are calculated." -msgstr "" - -#: superset/forms.py:534 -msgid "Tukey" -msgstr "" - -#: superset/forms.py:535 -msgid "Min/max (no outliers)" -msgstr "" - -#: superset/forms.py:536 -msgid "2/98 percentiles" -msgstr "" - -#: superset/forms.py:537 -msgid "9/91 percentiles" -msgstr "" - -#: superset/forms.py:541 -msgid "Ratio" -msgstr "" - -#: superset/forms.py:543 -msgid "Target aspect ratio for treemap tiles." -msgstr "" - -#: superset/forms.py:546 -msgid "Number format" -msgstr "" - -#: superset/forms.py:559 -msgid "Row limit" -msgstr "" - -#: superset/forms.py:565 -msgid "Series limit" -msgstr "" - -#: superset/forms.py:568 -msgid "Limits the number of time series that get displayed" -msgstr "" - -#: superset/forms.py:572 -msgid "Sort By" -msgstr "" - -#: superset/forms.py:575 -msgid "Metric used to define the top series" -msgstr "" - -#: superset/forms.py:578 -msgid "Rolling" -msgstr "" - -#: superset/forms.py:581 -msgid "" -"Defines a rolling window function to apply, works along with the " -"[Periods] text box" -msgstr "" - -#: superset/forms.py:586 -msgid "Periods" -msgstr "" - -#: superset/forms.py:588 -msgid "" -"Defines the size of the rolling window function, relative to the time " -"granularity selected" -msgstr "" - -#: superset/forms.py:593 -msgid "Series" -msgstr "" - -#: superset/forms.py:596 -msgid "" -"Defines the grouping of entities. Each series is shown as a specific " -"color on the chart and has a legend toggle" -msgstr "" - -#: superset/forms.py:602 -msgid "Entity" -msgstr "" - -#: superset/forms.py:605 -msgid "This define the element to be plotted on the chart" -msgstr "" - -#: superset/forms.py:608 -msgid "X Axis" -msgstr "" - -#: superset/forms.py:611 -msgid "Metric assigned to the [X] axis" -msgstr "" - -#: superset/forms.py:614 -msgid "Y Axis" -msgstr "" - -#: superset/forms.py:617 -msgid "Metric assigned to the [Y] axis" -msgstr "" - -#: superset/forms.py:620 -msgid "Bubble Size" -msgstr "" - -#: superset/forms.py:625 -msgid "URL" -msgstr "" - -#: superset/forms.py:626 -msgid "" -"The URL, this field is templated, so you can integrate {{ width }} and/or" -" {{ height }} in your URL string." -msgstr "" - -#: superset/forms.py:633 -msgid "X Axis Label" -msgstr "" - -#: superset/forms.py:637 -msgid "Y Axis Label" -msgstr "" - -#: superset/forms.py:641 -msgid "Custom WHERE clause" -msgstr "" - -#: superset/forms.py:643 -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/forms.py:650 -msgid "Custom HAVING clause" -msgstr "" - -#: superset/forms.py:652 -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/forms.py:659 -msgid "Comparison Period Lag" -msgstr "" - -#: superset/forms.py:660 -msgid "Based on granularity, number of time periods to compare against" -msgstr "" - -#: superset/forms.py:665 -msgid "Comparison suffix" -msgstr "" - -#: superset/forms.py:666 -msgid "Suffix to apply after the percentage display" -msgstr "" - -#: superset/forms.py:669 -msgid "Table Timestamp Format" -msgstr "" - -#: superset/forms.py:672 -msgid "Timestamp Format" -msgstr "" - -#: superset/forms.py:675 -msgid "Series Height" -msgstr "" - -#: superset/forms.py:678 -msgid "Pixel height of each series" -msgstr "" - -#: superset/forms.py:681 -msgid "X axis format" -msgstr "" - -#: superset/forms.py:687 -msgid "Y axis format" -msgstr "" - -#: superset/forms.py:700 -msgid "Markup Type" -msgstr "" - -#: superset/forms.py:702 -msgid "markdown" -msgstr "" - -#: superset/forms.py:703 -msgid "html" -msgstr "" - -#: superset/forms.py:706 -msgid "Pick your favorite markup language" -msgstr "" - -#: superset/forms.py:709 -msgid "Rotation" -msgstr "" - -#: superset/forms.py:711 -msgid "random" -msgstr "" - -#: superset/forms.py:712 -msgid "flat" -msgstr "" - -#: superset/forms.py:713 -msgid "square" -msgstr "" - -#: superset/forms.py:716 -msgid "Rotation to apply to words in the cloud" -msgstr "" - -#: superset/forms.py:719 -msgid "Line Style" -msgstr "" - -#: superset/forms.py:721 -msgid "linear" -msgstr "" - -#: superset/forms.py:722 -msgid "basis" -msgstr "" - -#: superset/forms.py:723 -msgid "cardinal" -msgstr "" - -#: superset/forms.py:724 -msgid "monotone" -msgstr "" - -#: superset/forms.py:725 -msgid "step-before" -msgstr "" - -#: superset/forms.py:726 -msgid "step-after" -msgstr "" - -#: superset/forms.py:729 -msgid "Line interpolation as defined by d3.js" -msgstr "" - -#: superset/forms.py:732 -msgid "Label Type" -msgstr "" - -#: superset/forms.py:735 -msgid "Category Name" -msgstr "" - -#: superset/forms.py:736 -msgid "Value" -msgstr "" - -#: superset/forms.py:737 -msgid "Percentage" -msgstr "" - -#: superset/forms.py:739 -msgid "What should be shown on the label?" -msgstr "" - -#: superset/forms.py:742 -msgid "Code" -msgstr "" - -#: superset/forms.py:743 -msgid "Put your code here" -msgstr "" - -#: superset/forms.py:747 -msgid "Aggregation function" -msgstr "" - -#: superset/forms.py:752 -msgid "max" -msgstr "" - -#: superset/forms.py:754 -msgid "stdev" -msgstr "" - -#: superset/forms.py:755 -msgid "var" -msgstr "" - -#: superset/forms.py:758 -msgid "" -"Aggregate function to apply when pivoting and computing the total rows " -"and columns" -msgstr "" - -#: superset/forms.py:763 -msgid "Font Size From" -msgstr "" - -#: superset/forms.py:765 -msgid "Font size for the smallest value in the list" -msgstr "" - -#: superset/forms.py:768 -msgid "Font Size To" -msgstr "" - -#: superset/forms.py:770 -msgid "Font size for the biggest value in the list" -msgstr "" - -#: superset/forms.py:773 -msgid "Range Filter" -msgstr "" - -#: superset/forms.py:775 -msgid "Whether to display the time range interactive selector" -msgstr "" - -#: superset/forms.py:779 -msgid "Date Filter" -msgstr "" - -#: superset/forms.py:781 -msgid "Whether to include a time filter" -msgstr "" - -#: superset/forms.py:784 -msgid "Data Table" -msgstr "" - -#: superset/forms.py:786 -msgid "Whether to display the interactive data table" -msgstr "" - -#: superset/forms.py:789 -msgid "Search Box" -msgstr "" - -#: superset/forms.py:791 -msgid "Whether to include a client side search box" -msgstr "" - -#: superset/forms.py:795 -msgid "Table Filter" -msgstr "" - -#: superset/forms.py:797 -msgid "Whether to apply filter when table cell is clicked" -msgstr "" - -#: superset/forms.py:801 -msgid "Show Bubbles" -msgstr "" - -#: superset/forms.py:803 -msgid "Whether to display bubbles on top of countries" -msgstr "" - -#: superset/forms.py:807 -msgid "Legend" -msgstr "" - -#: superset/forms.py:809 -msgid "Whether to display the legend (toggles)" -msgstr "" - -#: superset/forms.py:812 -msgid "X bounds" -msgstr "" - -#: superset/forms.py:814 -msgid "Whether to display the min and max values of the X axis" -msgstr "" - -#: superset/forms.py:818 -msgid "Rich Tooltip" -msgstr "" - -#: superset/forms.py:820 -msgid "The rich tooltip shows a list of all series for that point in time" -msgstr "" - -#: superset/forms.py:825 -msgid "Y Axis Zero" -msgstr "" - -#: superset/forms.py:827 -msgid "Force the Y axis to start at 0 instead of the minimum value" -msgstr "" - -#: superset/forms.py:832 -msgid "Y Log" -msgstr "" - -#: superset/forms.py:834 -msgid "Use a log scale for the Y axis" -msgstr "" - -#: superset/forms.py:837 -msgid "X Log" -msgstr "" - -#: superset/forms.py:839 -msgid "Use a log scale for the X axis" -msgstr "" - -#: superset/forms.py:842 -msgid "Donut" -msgstr "" - -#: superset/forms.py:844 -msgid "Do you want a donut or a pie?" -msgstr "" - -#: superset/forms.py:847 -msgid "Put labels outside" -msgstr "" - -#: superset/forms.py:849 -msgid "Put the labels outside the pie?" -msgstr "" - -#: superset/forms.py:852 -msgid "Contribution" -msgstr "" - -#: superset/forms.py:854 -msgid "Compute the contribution to the total" -msgstr "" - -#: superset/forms.py:857 -msgid "Period Ratio" -msgstr "" - -#: superset/forms.py:860 -msgid "" -"[integer] Number of period to compare against, this is relative to the " -"granularity selected" -msgstr "" - -#: superset/forms.py:865 -msgid "Period Ratio Type" -msgstr "" - -#: superset/forms.py:868 -msgid "factor" -msgstr "" - -#: superset/forms.py:869 -msgid "growth" -msgstr "" - -#: superset/forms.py:870 -msgid "value" -msgstr "" - -#: superset/forms.py:872 -msgid "" -"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " -"is (new-previous)" -msgstr "" - -#: superset/forms.py:877 -msgid "Time Shift" -msgstr "" - -#: superset/forms.py:879 -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/forms.py:886 -msgid "Subheader" -msgstr "" - -#: superset/forms.py:887 -msgid "Description text that shows up below your Big Number" -msgstr "" - -#: superset/forms.py:894 -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/forms.py:911 -msgid "Base layer map style" -msgstr "" - -#: superset/forms.py:914 -msgid "Clustering Radius" -msgstr "" - -#: superset/forms.py:927 -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/forms.py:933 -msgid "Point Radius" -msgstr "" - -#: superset/forms.py:936 -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/forms.py:942 -msgid "Point Radius Unit" -msgstr "" - -#: superset/forms.py:949 -msgid "The unit of measure for the specified point radius" -msgstr "" - -#: superset/forms.py:952 -msgid "Opacity" -msgstr "" - -#: superset/forms.py:954 -msgid "Opacity of all clusters, points, and labels. Between 0 and 1." -msgstr "" - -#: superset/forms.py:959 -msgid "Zoom" -msgstr "" - -#: superset/forms.py:962 -msgid "Zoom level of the map" -msgstr "" - -#: superset/forms.py:966 -msgid "Default latitude" -msgstr "" - -#: superset/forms.py:968 -msgid "Latitude of default viewport" -msgstr "" - -#: superset/forms.py:972 -msgid "Default longitude" -msgstr "" - -#: superset/forms.py:974 -msgid "Longitude of default viewport" -msgstr "" - -#: superset/forms.py:978 -msgid "Live render" -msgstr "" - -#: superset/forms.py:980 -msgid "Points and clusters will update as viewport is being changed" -msgstr "" - -#: superset/forms.py:985 -msgid "RGB Color" -msgstr "" - -#: superset/forms.py:995 -msgid "The color for points and clusters in RGB" -msgstr "" - -#: superset/forms.py:998 -msgid "Ranges" -msgstr "" - -#: superset/forms.py:1000 -msgid "Ranges to highlight with shading" -msgstr "" - -#: superset/forms.py:1003 -msgid "Range labels" -msgstr "" - -#: superset/forms.py:1005 -msgid "Labels for the ranges" -msgstr "" - -#: superset/forms.py:1008 -msgid "Markers" -msgstr "" - -#: superset/forms.py:1010 -msgid "List of values to mark with triangles" -msgstr "" - -#: superset/forms.py:1013 -msgid "Marker labels" -msgstr "" - -#: superset/forms.py:1015 -msgid "Labels for the markers" -msgstr "" - -#: superset/forms.py:1018 -msgid "Marker lines" -msgstr "" - -#: superset/forms.py:1020 -msgid "List of values to mark with lines" -msgstr "" - -#: superset/forms.py:1023 -msgid "Marker line labels" -msgstr "" - -#: superset/forms.py:1025 -msgid "Labels for the marker lines" -msgstr "" - -#: superset/forms.py:1088 -msgid "SQL" -msgstr "" - -#: superset/forms.py:1090 -msgid "This section exposes ways to include snippets of SQL in your query" -msgstr "" - -#: superset/forms.py:1101 -msgid "Time Grain" -msgstr "" - -#: superset/forms.py:1104 -msgid "" -"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" -msgstr "" - -#: superset/forms.py:1139 superset/forms.py:1143 -msgid "Filter 1" -msgstr "" - -#: superset/forms.py:1148 -msgid "Super" -msgstr "" - -#: superset/forms.py:1152 -msgid "Time" -msgstr "" - -#: superset/forms.py:1157 -msgid "Time related form attributes" -msgstr "" - -#: superset/forms.py:1164 -msgid "CSV File" -msgstr "" - -#: superset/forms.py:1165 -msgid "Select a CSV file to be uploaded to a database." -msgstr "" - -#: superset/forms.py:1169 -msgid "CSV Files Only!" -msgstr "" - -#: superset/forms.py:1171 -msgid "Delimiter" -msgstr "" - -#: superset/forms.py:1172 -msgid "Delimiter used by CSV file (for whitespace use \\s+)." -msgstr "" - -#: superset/forms.py:1177 -msgid "Header Row" -msgstr "" - -#: superset/forms.py:1178 -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:1188 -msgid "Column Names" -msgstr "" - -#: superset/forms.py:1189 -msgid "" -"List of comma-separated column names to use if header row not specified " -"above. Leave empty if header field populated." -msgstr "" - -#: superset/forms.py:1198 -msgid "Index Column" -msgstr "" - -#: superset/forms.py:1199 -msgid "" -"Column to use as the row labels of the dataframe. Leave empty if no index" -" column." -msgstr "" - -#: superset/forms.py:1207 -msgid "Squeeze" -msgstr "" - -#: superset/forms.py:1208 -msgid "" -"Parse the data as a series (specify this option if the data contains only" -" one column.)" -msgstr "" - -#: superset/forms.py:1213 -msgid "Prefix" -msgstr "" - -#: superset/forms.py:1214 -msgid "" -"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " -"X1\")." -msgstr "" - -#: superset/forms.py:1220 -msgid "Mangle Duplicate Columns" -msgstr "" - -#: superset/forms.py:1221 -msgid "Specify duplicate columns as \"X.0, X.1\"." -msgstr "" - -#: superset/forms.py:1224 -msgid "Skip Initial Space" -msgstr "" - -#: superset/forms.py:1225 -msgid "Skip spaces after delimiter." -msgstr "" - -#: superset/forms.py:1227 -msgid "Skip Rows" -msgstr "" - -#: superset/forms.py:1228 -msgid "Number of rows to skip at start of file." -msgstr "" - -#: superset/forms.py:1234 -msgid "Rows to Read" -msgstr "" - -#: superset/forms.py:1235 -msgid "Number of rows of file to read." -msgstr "" - -#: superset/forms.py:1239 -msgid "Skip Blank Lines" -msgstr "" - -#: superset/forms.py:1240 -msgid "Skip blank lines rather than interpreting them as NaN values." -msgstr "" - -#: superset/forms.py:1244 -msgid "Parse Dates" -msgstr "" - -#: superset/forms.py:1245 -msgid "Parse date values." -msgstr "" - -#: superset/forms.py:1247 -msgid "Infer Datetime Format" -msgstr "" - -#: superset/forms.py:1248 -msgid "Use Pandas to interpret the datetime format automatically." -msgstr "" - -#: superset/forms.py:1253 -msgid "Day First" -msgstr "" - -#: superset/forms.py:1254 -msgid "Use DD/MM (European/International) date format." -msgstr "" - -#: superset/forms.py:1257 -msgid "Thousands Separator" -msgstr "" - -#: superset/forms.py:1258 -msgid "Separator for values in thousands." -msgstr "" - -#: superset/forms.py:1263 -msgid "Decimal Character" -msgstr "" - -#: superset/forms.py:1264 -msgid "Character to interpret as decimal point." -msgstr "" - -#: superset/forms.py:1269 -msgid "Quote Character" -msgstr "" - -#: superset/forms.py:1270 -msgid "Character used to denote the start and end of a quoted item." -msgstr "" - -#: superset/forms.py:1276 -msgid "Escape Character" -msgstr "" - -#: superset/forms.py:1277 -msgid "Character used to escape a quoted item." -msgstr "" - -#: superset/forms.py:1282 -msgid "Comment Character" -msgstr "" - -#: superset/forms.py:1283 -msgid "Character used to denote the start of a comment." -msgstr "" - -#: superset/forms.py:1288 -msgid "Encoding" -msgstr "" - -#: superset/forms.py:1289 -msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." -msgstr "" - -#: superset/forms.py:1294 -msgid "Error On Bad Lines" -msgstr "" - -#: superset/forms.py:1295 -msgid "" -"Error on bad lines (e.g. a line with too many commas). If false these bad" -" lines will instead be dropped from the resulting dataframe." -msgstr "" - -#: superset/forms.py:1304 -msgid "Table Name" -msgstr "" - -#: superset/forms.py:1305 -msgid "Name of table to be createdfrom csv data." -msgstr "" - -#: superset/forms.py:1309 -msgid "Database URI" -msgstr "" - -#: superset/forms.py:1310 -msgid "URI of database in which to add above table." -msgstr "" - -#: superset/connectors/sqla/views.py:199 superset/forms.py:1314 -msgid "Schema" -msgstr "" - -#: superset/forms.py:1315 -msgid "Specify a schema (if database flavour supports this)." -msgstr "" - -#: superset/forms.py:1320 -msgid "Table Exists" -msgstr "" - -#: superset/forms.py:1321 -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:1327 -msgid "Fail" -msgstr "" - -#: superset/forms.py:1328 -msgid "Replace" -msgstr "" - -#: superset/forms.py:1329 -msgid "Append" -msgstr "" - -#: superset/forms.py:1331 -msgid "Dataframe Index" -msgstr "" - -#: superset/forms.py:1332 -msgid "Write dataframe index as a column." -msgstr "" - -#: superset/forms.py:1334 -msgid "Column Label(s)" -msgstr "" - -#: superset/forms.py:1335 -msgid "" -"Column label for index column(s). If None is given and Dataframe Index is" -" True, Index Names are used." -msgstr "" - -#: superset/forms.py:1342 -msgid "Chunksize" -msgstr "" - -#: superset/forms.py:1343 -msgid "" -"If empty, all rows will be written at once. Otherwise, rows will be " -"written in batches of this many rows at a time." -msgstr "" - #: superset/viz.py:311 msgid "Table View" msgstr "" @@ -1684,8 +242,8 @@ msgstr "" msgid "Type" msgstr "" -#: superset/connectors/druid/views.py:39 superset/views/core.py:310 -#: superset/views/core.py:359 +#: superset/connectors/druid/views.py:39 superset/views/core.py:306 +#: superset/views/core.py:355 msgid "Datasource" msgstr "" @@ -1726,9 +284,13 @@ msgid "" "metric)' are allowed to access this metric" msgstr "" +#: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:117 +msgid "Metric" +msgstr "" + #: superset/connectors/druid/views.py:95 superset/connectors/druid/views.py:205 #: superset/connectors/sqla/views.py:76 superset/connectors/sqla/views.py:118 -#: superset/views/core.py:360 +#: superset/views/core.py:356 msgid "Description" msgstr "" @@ -1737,7 +299,7 @@ msgstr "" msgid "Verbose Name" msgstr "" -#: superset/connectors/druid/views.py:98 superset/views/core.py:533 +#: superset/connectors/druid/views.py:98 superset/views/core.py:529 msgid "JSON" msgstr "" @@ -1837,7 +399,7 @@ msgid "Time Offset" msgstr "" #: superset/connectors/druid/views.py:211 superset/connectors/sqla/views.py:204 -#: superset/views/core.py:245 superset/views/core.py:356 +#: superset/views/core.py:242 superset/views/core.py:352 msgid "Cache Timeout" msgstr "" @@ -1865,7 +427,7 @@ msgid "" msgstr "" #: superset/connectors/sqla/views.py:79 superset/connectors/sqla/views.py:122 -#: superset/connectors/sqla/views.py:194 superset/views/core.py:366 +#: superset/connectors/sqla/views.py:194 superset/views/core.py:362 msgid "Table" msgstr "" @@ -1918,14 +480,18 @@ msgstr "" msgid "Changed By" msgstr "" -#: superset/connectors/sqla/views.py:196 superset/views/core.py:241 +#: superset/connectors/sqla/views.py:196 superset/views/core.py:238 msgid "Database" msgstr "" -#: superset/connectors/sqla/views.py:197 superset/views/core.py:243 +#: superset/connectors/sqla/views.py:197 superset/views/core.py:240 msgid "Last Changed" msgstr "" +#: superset/connectors/sqla/views.py:199 +msgid "Schema" +msgstr "" + #: superset/connectors/sqla/views.py:203 msgid "Offset" msgstr "" @@ -1948,10 +514,6 @@ msgstr "" msgid "Login" msgstr "" -#: superset/templates/superset/import_dashboards.html:11 -msgid "Import" -msgstr "" - #: superset/templates/superset/request_access.html:2 msgid "No Access!" msgstr "" @@ -1969,101 +531,93 @@ msgstr "" msgid "Cancel" msgstr "" -#: superset/templates/superset/welcome.html:10 -msgid "Welcome!" -msgstr "" - -#: superset/templates/superset/welcome.html:20 superset/views/core.py:358 -msgid "Dashboards" -msgstr "" - #: superset/templates/superset/models/database/macros.html:4 msgid "Test Connection" msgstr "" -#: superset/views/core.py:209 +#: superset/views/core.py:206 msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/views/core.py:210 +#: superset/views/core.py:207 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 " "(<~1 minute)" msgstr "" -#: superset/views/core.py:214 +#: superset/views/core.py:211 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." msgstr "" -#: superset/views/core.py:218 +#: superset/views/core.py:215 msgid "Allow CREATE TABLE AS option in SQL Lab" msgstr "" -#: superset/views/core.py:219 +#: superset/views/core.py:216 msgid "" "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" " SQL Lab" msgstr "" -#: superset/views/core.py:223 +#: superset/views/core.py:220 msgid "" "When allowing CREATE TABLE AS option in SQL Lab, this option forces the " "table to be created in this schema" msgstr "" -#: superset/views/core.py:237 +#: superset/views/core.py:234 msgid "Expose in SQL Lab" msgstr "" -#: superset/views/core.py:238 +#: superset/views/core.py:235 msgid "Allow CREATE TABLE AS" msgstr "" -#: superset/views/core.py:239 +#: superset/views/core.py:236 msgid "Allow DML" msgstr "" -#: superset/views/core.py:240 +#: superset/views/core.py:237 msgid "CTAS Schema" msgstr "" -#: superset/views/core.py:242 superset/views/core.py:357 -#: superset/views/core.py:453 superset/views/core.py:517 +#: superset/views/core.py:239 superset/views/core.py:353 +#: superset/views/core.py:449 superset/views/core.py:513 msgid "Creator" msgstr "" -#: superset/views/core.py:244 +#: superset/views/core.py:241 msgid "SQLAlchemy URI" msgstr "" -#: superset/views/core.py:246 +#: superset/views/core.py:243 msgid "Extra" msgstr "" -#: superset/views/core.py:307 superset/views/core.py:530 +#: superset/views/core.py:303 superset/views/core.py:526 msgid "User" msgstr "" -#: superset/views/core.py:308 +#: superset/views/core.py:304 msgid "User Roles" msgstr "" -#: superset/views/core.py:309 +#: superset/views/core.py:305 msgid "Database URL" msgstr "" -#: superset/views/core.py:311 +#: superset/views/core.py:307 msgid "Roles to grant" msgstr "" -#: superset/views/core.py:312 +#: superset/views/core.py:308 msgid "Created On" msgstr "" -#: superset/views/core.py:345 +#: superset/views/core.py:341 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -2071,111 +625,115 @@ msgid "" "parameters." msgstr "" -#: superset/views/core.py:350 +#: superset/views/core.py:346 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/views/core.py:361 +#: superset/views/core.py:354 +msgid "Dashboards" +msgstr "" + +#: superset/views/core.py:357 msgid "Last Modified" msgstr "" -#: superset/views/core.py:362 superset/views/core.py:452 +#: superset/views/core.py:358 superset/views/core.py:448 msgid "Owners" msgstr "" -#: superset/views/core.py:363 +#: superset/views/core.py:359 msgid "Parameters" msgstr "" -#: superset/views/core.py:364 superset/views/core.py:400 +#: superset/views/core.py:360 superset/views/core.py:396 msgid "Slice" msgstr "" -#: superset/views/core.py:365 +#: superset/views/core.py:361 msgid "Name" msgstr "" -#: superset/views/core.py:367 +#: superset/views/core.py:363 msgid "Visualization Type" msgstr "" -#: superset/views/core.py:425 +#: superset/views/core.py:421 msgid "" "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" msgstr "" -#: superset/views/core.py:430 +#: superset/views/core.py:426 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: superset/views/core.py:434 +#: superset/views/core.py:430 msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/views/core.py:435 +#: superset/views/core.py:431 msgid "" "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." msgstr "" -#: superset/views/core.py:440 +#: superset/views/core.py:436 msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/views/core.py:448 superset/views/core.py:515 +#: superset/views/core.py:444 superset/views/core.py:511 msgid "Dashboard" msgstr "" -#: superset/views/core.py:449 superset/views/core.py:516 +#: superset/views/core.py:445 superset/views/core.py:512 msgid "Title" msgstr "" -#: superset/views/core.py:450 +#: superset/views/core.py:446 msgid "Slug" msgstr "" -#: superset/views/core.py:451 +#: superset/views/core.py:447 msgid "Slices" msgstr "" -#: superset/views/core.py:454 superset/views/core.py:518 +#: superset/views/core.py:450 superset/views/core.py:514 msgid "Modified" msgstr "" -#: superset/views/core.py:455 +#: superset/views/core.py:451 msgid "Position JSON" msgstr "" -#: superset/views/core.py:456 +#: superset/views/core.py:452 msgid "CSS" msgstr "" -#: superset/views/core.py:457 +#: superset/views/core.py:453 msgid "JSON Metadata" msgstr "" -#: superset/views/core.py:458 +#: superset/views/core.py:454 msgid "Underlying Tables" msgstr "" -#: superset/views/core.py:531 +#: superset/views/core.py:527 msgid "Action" msgstr "" -#: superset/views/core.py:532 +#: superset/views/core.py:528 msgid "dttm" msgstr "" -#: superset/views/core.py:2283 +#: superset/views/core.py:2279 msgid "SQL Editor" msgstr "" -#: superset/views/core.py:2292 +#: superset/views/core.py:2288 msgid "Query Search" msgstr "" diff --git a/docs/faq.rst b/docs/faq.rst index 58cfb3451640..0d7d424e75a0 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -133,3 +133,16 @@ __ https://www.sqlite.org/lockingv3.html One work around is to create a symlink from ~/.superset to a directory located on a non-NFS partition. Another work around is to change where superset stores the sqlite database by adding ``SQLALCHEMY_DATABASE_URI = 'sqlite:////new/localtion/superset.db'`` in superset_config.py (create the file if needed), then adding the directory where superset_config.py lives to PYTHONPATH environment variable (e.g. ``export PYTHONPATH=/opt/logs/sandbox/airbnb/``). + +How do I add new columns to an existing table +--------------------------------------------- + +Table schemas evolve, and Superset needs to reflect that. It's pretty common +in the life cycle of a dashboard to want to add a new dimension or metric. +To get Superset to discover your new columns, all you have to do is to +go to ``Menu -> Sources -> Tables``, click the ``edit`` icon next to the +table who's schema has changed, and hit ``Save`` from the ``Detail`` tab. +Behind the scene, the new columns will get merged it. Following this, +you may want to +re-edit the table afterwards to configure the ``Column`` tab, check the +appropriate boxes and save again. diff --git a/setup.py b/setup.py index 37690f1cc74a..327c1615eff7 100644 --- a/setup.py +++ b/setup.py @@ -45,7 +45,6 @@ def get_git_sha(): 'boto3==1.4.4', 'celery==3.1.23', 'cryptography==1.7.2', - 'unicodecsv>=0.14.0', 'flask-appbuilder==1.8.1', 'flask-cache==0.13.1', 'flask-migrate==2.0.3', diff --git a/superset/assets/javascripts/addSlice/AddSliceContainer.jsx b/superset/assets/javascripts/addSlice/AddSliceContainer.jsx new file mode 100644 index 000000000000..2263e20e8d06 --- /dev/null +++ b/superset/assets/javascripts/addSlice/AddSliceContainer.jsx @@ -0,0 +1,97 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Button, Panel, Grid, Row, Col } from 'react-bootstrap'; +import Select from 'react-virtualized-select'; +import visTypes from '../explore/stores/visTypes'; + +const propTypes = { + datasources: PropTypes.arrayOf(PropTypes.shape({ + label: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + })).isRequired, +}; + +export default class AddSliceContainer extends React.PureComponent { + constructor(props) { + super(props); + const visTypeKeys = Object.keys(visTypes); + this.vizTypeOptions = visTypeKeys.map(vt => ({ label: visTypes[vt].label, value: vt })); + this.state = { + datasourceValue: this.props.datasources[0].value, + datasourceId: this.props.datasources[0].value.split('__')[0], + datasourceType: this.props.datasources[0].value.split('__')[1], + visType: 'table', + }; + } + + 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}`; + } + + gotoSlice() { + window.location.href = this.exploreUrl(); + } + + changeDatasource(e) { + this.setState({ + datasourceValue: e.value, + datasourceId: e.value.split('__')[0], + datasourceType: e.value.split('__')[1], + }); + } + + changeSliceName(e) { + this.setState({ sliceName: e.target.value }); + } + + changeVisType(e) { + this.setState({ visType: e.value }); + } + + render() { + return ( +

+ ); + } +} + +AddSliceContainer.propTypes = propTypes; diff --git a/superset/assets/javascripts/addSlice/index.jsx b/superset/assets/javascripts/addSlice/index.jsx new file mode 100644 index 000000000000..f83c2d5272a4 --- /dev/null +++ b/superset/assets/javascripts/addSlice/index.jsx @@ -0,0 +1,14 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { appSetup } from '../common'; +import AddSliceContainer from './AddSliceContainer'; + +appSetup(); + +const addSliceContainer = document.getElementById('js-add-slice-container'); +const bootstrapData = JSON.parse(addSliceContainer.getAttribute('data-bootstrap')); + +ReactDOM.render( + , + addSliceContainer, +); diff --git a/superset/assets/javascripts/components/Timer.jsx b/superset/assets/javascripts/components/Timer.jsx index f108e4ce1b21..b221859d196e 100644 --- a/superset/assets/javascripts/components/Timer.jsx +++ b/superset/assets/javascripts/components/Timer.jsx @@ -2,12 +2,28 @@ import React from 'react'; import PropTypes from 'prop-types'; import { now, fDuration } from '../modules/dates'; -class Timer extends React.PureComponent { +const propTypes = { + endTime: PropTypes.number, + isRunning: PropTypes.bool.isRequired, + startTime: PropTypes.number, + status: PropTypes.string, + style: PropTypes.object, +}; + +const defaultProps = { + endTime: null, + startTime: null, + status: 'success', + style: null, +}; + +export default class Timer extends React.PureComponent { constructor(props) { super(props); this.state = { clockStr: '', }; + this.stopwatch = this.stopwatch.bind(this); } componentWillMount() { this.startTimer(); @@ -16,13 +32,12 @@ class Timer extends React.PureComponent { this.stopTimer(); } startTimer() { - if (!(this.timer)) { - this.timer = setInterval(this.stopwatch.bind(this), 30); + if (!this.timer) { + this.timer = setInterval(this.stopwatch, 30); } } stopTimer() { - clearInterval(this.timer); - this.timer = null; + this.timer = clearInterval(this.timer); } stopwatch() { if (this.props && this.props.startTime) { @@ -54,19 +69,6 @@ class Timer extends React.PureComponent { return timerSpan; } } -Timer.propTypes = { - startTime: PropTypes.number, - endTime: PropTypes.number, - isRunning: PropTypes.bool.isRequired, - status: PropTypes.string, - style: PropTypes.object, -}; - -Timer.defaultProps = { - startTime: null, - endTime: null, - status: 'success', - style: null, -}; -export default Timer; +Timer.propTypes = propTypes; +Timer.defaultProps = defaultProps; diff --git a/superset/assets/javascripts/explore/components/controls/SelectControl.jsx b/superset/assets/javascripts/explore/components/controls/SelectControl.jsx index 0b609696493e..2f8f678fa04c 100644 --- a/superset/assets/javascripts/explore/components/controls/SelectControl.jsx +++ b/superset/assets/javascripts/explore/components/controls/SelectControl.jsx @@ -98,7 +98,7 @@ export default class SelectControl extends React.PureComponent { clearable: this.props.clearable, isLoading: this.props.isLoading, onChange: this.onChange, - optionRenderer: () => opt.label, + optionRenderer: opt => opt.label, }; // Tab, comma or Enter will trigger a new option created for FreeFormSelect const selectWrap = this.props.freeForm ? diff --git a/superset/assets/javascripts/modules/dates.js b/superset/assets/javascripts/modules/dates.js index 81dd9177eb3d..449e1ba26c6d 100644 --- a/superset/assets/javascripts/modules/dates.js +++ b/superset/assets/javascripts/modules/dates.js @@ -105,4 +105,3 @@ export const epochTimeXYearsAgo = function (y) { .utc() .valueOf(); }; - diff --git a/superset/assets/javascripts/modules/superset.js b/superset/assets/javascripts/modules/superset.js index 8f234395a3c2..acdfaa986192 100644 --- a/superset/assets/javascripts/modules/superset.js +++ b/superset/assets/javascripts/modules/superset.js @@ -4,6 +4,7 @@ import Mustache from 'mustache'; import vizMap from '../../visualizations/main'; import { getExploreUrl } from '../explore/exploreUtils'; import { applyDefaultFormData } from '../explore/stores/store'; +import { QUERY_TIMEOUT_THRESHOLD } from '../constants'; const utils = require('./utils'); @@ -123,9 +124,6 @@ const px = function () { controller.done(this); }, getErrorMsg(xhr) { - if (xhr.statusText === 'timeout') { - return 'The request timed out'; - } let msg = ''; if (!xhr.responseText) { const status = xhr.status; @@ -158,9 +156,14 @@ const px = function () { errHtml += `
${errorMsg}
`; } if (xhr) { - const extendedMsg = this.getErrorMsg(xhr); - if (extendedMsg) { - errHtml += `
${extendedMsg}
`; + if (xhr.statusText === 'timeout') { + errHtml += '
' + + `Query timeout - visualization query are set to time out at ${QUERY_TIMEOUT_THRESHOLD / 1000} seconds.
`; + } else { + const extendedMsg = this.getErrorMsg(xhr); + if (extendedMsg) { + errHtml += `
${extendedMsg}
`; + } } } container.html(errHtml); @@ -205,15 +208,20 @@ const px = function () { token.find('img.loading').show(); container.fadeTo(0.5, 0.25); container.css('height', this.height()); - $.getJSON(this.jsonEndpoint(), (queryResponse) => { - try { - vizMap[formData.viz_type](this, queryResponse); - this.done(queryResponse); - } catch (e) { - this.error('An error occurred while rendering the visualization: ' + e); - } - }).fail((err) => { - this.error(err.responseText, err); + $.ajax({ + url: this.jsonEndpoint(), + timeout: QUERY_TIMEOUT_THRESHOLD, + success: (queryResponse) => { + try { + vizMap[formData.viz_type](this, queryResponse); + this.done(queryResponse); + } catch (e) { + this.error('An error occurred while rendering the visualization: ' + e); + } + }, + error: (err) => { + this.error(err.responseText, err); + }, }); }, resize() { diff --git a/superset/assets/package.json b/superset/assets/package.json index e9825234e9bc..8366d9d36d7e 100644 --- a/superset/assets/package.json +++ b/superset/assets/package.json @@ -1,6 +1,6 @@ { "name": "superset", - "version": "0.18.3-alpha.3", + "version": "0.18.5-alpha.2", "description": "Superset is a data exploration platform designed to be visual, intuitive, and interactive.", "license": "Apache-2.0", "directories": { @@ -70,7 +70,7 @@ "react-ace": "^4.1.5", "react-addons-css-transition-group": "^15.4.2", "react-addons-shallow-compare": "^15.4.2", - "react-alert": "^1.0.14", + "react-alert": "^2.0.1", "react-bootstrap": "^0.30.3", "react-bootstrap-table": "^3.1.7", "react-dom": "^15.5.1", diff --git a/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx b/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx new file mode 100644 index 000000000000..9096ba38194d --- /dev/null +++ b/superset/assets/spec/javascripts/addSlice/AddSliceContainer_spec.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { expect } from 'chai'; +import { describe, it, beforeEach } from 'mocha'; +import { shallow } from 'enzyme'; +import { Button } from 'react-bootstrap'; +import Select from 'react-virtualized-select'; +import AddSliceContainer from '../../../javascripts/addSlice/AddSliceContainer'; + +const defaultProps = { + datasources: [ + { label: 'my first table', value: '1__table' }, + { label: 'another great table', value: '2__table' }, + ], +}; + +describe('AddSliceContainer', () => { + let wrapper; + + beforeEach(() => { + wrapper = shallow(); + }); + + it('uses table as default visType', () => { + expect(wrapper.state().visType).to.equal('table'); + }); + + it('renders 2 selects', () => { + expect(wrapper.find(Select)).to.have.lengthOf(2); + }); + + it('renders a button', () => { + expect(wrapper.find(Button)).to.have.lengthOf(1); + }); + + it('formats explore url', () => { + const formattedUrl = '/superset/explore/table/1?form_data=%7B%22viz_type%22%3A%22table%22%7D'; + expect(wrapper.instance().exploreUrl()).to.equal(formattedUrl); + }); +}); diff --git a/superset/assets/spec/javascripts/modules/dates_spec.js b/superset/assets/spec/javascripts/modules/dates_spec.js new file mode 100644 index 000000000000..c16c7cb27691 --- /dev/null +++ b/superset/assets/spec/javascripts/modules/dates_spec.js @@ -0,0 +1,85 @@ +import { it, describe } from 'mocha'; +import { expect } from 'chai'; +import { + tickMultiFormat, + formatDate, + timeFormatFactory, + fDuration, + now, + epochTimeXHoursAgo, + epochTimeXDaysAgo, + epochTimeXYearsAgo, + } from '../../../javascripts/modules/dates'; + +describe('tickMultiFormat', () => { + it('is a function', () => { + assert.isFunction(tickMultiFormat); + }); +}); + +describe('formatDate', () => { + it('is a function', () => { + assert.isFunction(formatDate); + }); +}); + +describe('timeFormatFactory', () => { + it('is a function', () => { + assert.isFunction(timeFormatFactory); + }); +}); + +describe('fDuration', () => { + it('is a function', () => { + assert.isFunction(fDuration); + }); + + it('returns a string', () => { + expect(fDuration(new Date(), new Date())).to.be.a('string'); + }); + + it('returns the expected output', () => { + const output = fDuration('1496293608897', '1496293623406'); + expect(output).to.equal('00:00:14.50'); + }); +}); + +describe('now', () => { + it('is a function', () => { + assert.isFunction(now); + }); + + it('returns a number', () => { + expect(now()).to.be.a('number'); + }); +}); + +describe('epochTimeXHoursAgo', () => { + it('is a function', () => { + assert.isFunction(epochTimeXHoursAgo); + }); + + it('returns a number', () => { + expect(epochTimeXHoursAgo(1)).to.be.a('number'); + }); +}); + +describe('epochTimeXDaysAgo', () => { + it('is a function', () => { + assert.isFunction(epochTimeXDaysAgo); + }); + + it('returns a number', () => { + expect(epochTimeXDaysAgo(1)).to.be.a('number'); + }); +}); + +describe('epochTimeXYearsAgo', () => { + it('is a function', () => { + assert.isFunction(epochTimeXYearsAgo); + }); + + it('returns a number', () => { + expect(epochTimeXYearsAgo(1)).to.be.a('number'); + }); +}); diff --git a/superset/assets/spec/javascripts/sqllab/Timer_spec.jsx b/superset/assets/spec/javascripts/sqllab/Timer_spec.jsx index 9bad34c32ee7..21a8a4fb3d44 100644 --- a/superset/assets/spec/javascripts/sqllab/Timer_spec.jsx +++ b/superset/assets/spec/javascripts/sqllab/Timer_spec.jsx @@ -1,6 +1,6 @@ import React from 'react'; -import { shallow } from 'enzyme'; -import { describe, it } from 'mocha'; +import { mount } from 'enzyme'; +import { describe, it, beforeEach } from 'mocha'; import { expect } from 'chai'; import Timer from '../../../javascripts/components/Timer'; @@ -8,18 +8,44 @@ import { now } from '../../../javascripts/modules/dates'; describe('Timer', () => { + let wrapper; const mockedProps = { startTime: now(), endTime: null, isRunning: true, - state: 'warning', + status: 'warning', }; - it('is valid', () => { - expect(React.isValidElement()) - .to.equal(true); + + beforeEach(() => { + wrapper = mount(); + }); + + it('is a valid element', () => { + expect(React.isValidElement()).to.equal(true); + }); + + it('componentWillMount starts timer after 30ms and sets state.clockStr', () => { + expect(wrapper.state().clockStr).to.equal(''); + setTimeout(() => { + expect(wrapper.state().clockStr).not.equal(''); + }, 31); }); - it('renders a span', () => { - const wrapper = shallow(); - expect(wrapper.find('span')).to.have.length(1); + + it('calls startTimer on mount', () => { + const startTimerSpy = sinon.spy(Timer.prototype, 'startTimer'); + wrapper.mount(); + expect(Timer.prototype.startTimer.calledOnce); + startTimerSpy.restore(); + }); + + it('calls stopTimer on unmount', () => { + const stopTimerSpy = sinon.spy(Timer.prototype, 'stopTimer'); + wrapper.unmount(); + expect(Timer.prototype.stopTimer.calledOnce); + stopTimerSpy.restore(); + }); + + it('renders a span with the correct class', () => { + expect(wrapper.find('span').hasClass('label-warning')).to.equal(true); }); }); diff --git a/superset/assets/stylesheets/superset.css b/superset/assets/stylesheets/superset.css index 61a199040b37..4dafda4221d6 100644 --- a/superset/assets/stylesheets/superset.css +++ b/superset/assets/stylesheets/superset.css @@ -205,3 +205,7 @@ div.widget .slice_container { .table-condensed { font-size: 12px; } + +.table-condensed input[type="checkbox"] { + float: left; +} \ No newline at end of file diff --git a/superset/assets/visualizations/filter_box.css b/superset/assets/visualizations/filter_box.css index af2c3071b4fa..e1b72f3bd777 100644 --- a/superset/assets/visualizations/filter_box.css +++ b/superset/assets/visualizations/filter_box.css @@ -3,7 +3,7 @@ border: 1px superset black; } -.dashboard .filter_box .slice_container > div { +.dashboard .filter_box .slice_container > div:not(.alert) { padding-top: 0; } diff --git a/superset/assets/webpack.config.js b/superset/assets/webpack.config.js index 73bcb0ace5f6..2f51c8c5150e 100644 --- a/superset/assets/webpack.config.js +++ b/superset/assets/webpack.config.js @@ -14,6 +14,7 @@ const config = { entry: { 'css-theme': APP_DIR + '/javascripts/css-theme.js', common: APP_DIR + '/javascripts/common.js', + addSlice: ['babel-polyfill', APP_DIR + '/javascripts/addSlice/index.jsx'], dashboard: ['babel-polyfill', APP_DIR + '/javascripts/dashboard/Dashboard.jsx'], explore: ['babel-polyfill', APP_DIR + '/javascripts/explore/index.jsx'], sqllab: ['babel-polyfill', APP_DIR + '/javascripts/SqlLab/index.jsx'], diff --git a/superset/config.py b/superset/config.py index f9e2093323a7..7d00f2bd7387 100644 --- a/superset/config.py +++ b/superset/config.py @@ -141,6 +141,7 @@ # The allowed translation for you app LANGUAGES = { 'en': {'flag': 'us', 'name': 'English'}, + 'it': {'flag': 'it', 'name': 'Italian'}, # 'fr': {'flag': 'fr', 'name': 'French'}, # 'zh': {'flag': 'cn', 'name': 'Chinese'}, } diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index 951a58e57ccb..9add7b13d459 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -603,6 +603,9 @@ def sync_to_db(cls, name, cluster, merge): logging.error("Failed at fetching the latest segment") return for col in cols: + # Skip the time column + if col == "__time": + continue col_obj = ( session .query(DruidColumn) @@ -618,6 +621,11 @@ def sync_to_db(cls, name, cluster, merge): col_obj.filterable = True if datatype == "hyperUnique" or datatype == "thetaSketch": col_obj.count_distinct = True + # If long or double, allow sum/min/max + if datatype == "LONG" or datatype == "DOUBLE": + col_obj.sum = True + col_obj.min = True + col_obj.max = True if col_obj: col_obj.type = cols[col]['type'] session.flush() diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 2afcc4d085ca..300dd3572fb0 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -477,20 +477,23 @@ def get_sqla_query( # sqla if op == 'not in': cond = ~cond where_clause_and.append(cond) - elif op == '==': - where_clause_and.append(col_obj.sqla_col == eq) - elif op == '!=': - where_clause_and.append(col_obj.sqla_col != eq) - elif op == '>': - where_clause_and.append(col_obj.sqla_col > eq) - elif op == '<': - where_clause_and.append(col_obj.sqla_col < eq) - elif op == '>=': - where_clause_and.append(col_obj.sqla_col >= eq) - elif op == '<=': - where_clause_and.append(col_obj.sqla_col <= eq) - elif op == 'LIKE': - where_clause_and.append(col_obj.sqla_col.like(eq)) + else: + if col_obj.is_num: + eq = utils.string_to_num(flt['val']) + if op == '==': + where_clause_and.append(col_obj.sqla_col == eq) + elif op == '!=': + where_clause_and.append(col_obj.sqla_col != eq) + elif op == '>': + where_clause_and.append(col_obj.sqla_col > eq) + elif op == '<': + where_clause_and.append(col_obj.sqla_col < eq) + elif op == '>=': + where_clause_and.append(col_obj.sqla_col >= eq) + elif op == '<=': + where_clause_and.append(col_obj.sqla_col <= eq) + elif op == 'LIKE': + where_clause_and.append(col_obj.sqla_col.like(eq)) if extras: where = extras.get('where') if where: @@ -512,7 +515,8 @@ def get_sqla_query( # sqla direction = asc if ascending else desc qry = qry.order_by(direction(col)) - qry = qry.limit(row_limit) + if row_limit: + qry = qry.limit(row_limit) if is_timeseries and \ timeseries_limit and groupby and not time_groupby_inline: diff --git a/superset/forms.py b/superset/forms.py index 732bc955d6aa..47aadd8a7051 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -49,7 +49,8 @@ class BetterBooleanField(BooleanField): def __call__(self, **kwargs): html = super(BetterBooleanField, self).__call__(**kwargs) - html += u''.format(self.name) + html += u'' \ + .format(self.name) return widgets.HTMLString(html) @@ -60,7 +61,8 @@ class SelectMultipleSortableField(SelectMultipleField): def iter_choices(self): d = OrderedDict() for value, label in self.choices: - selected = self.data is not None and self.coerce(value) in self.data + selected = self.data is not None\ + and self.coerce(value) in self.data d[value] = (value, label, selected) if self.data: for value in self.data: @@ -340,7 +342,8 @@ def __init__(self, viz): "default": '', "description": _( "Defines the origin where time buckets start, " - "accepts natural dates as in 'now', 'sunday' or '1970-01-01'") + "accepts natural dates as in 'now', 'sunday' or " + "'1970-01-01'") }), 'bottom_margin': (FreeFormSelectField, { "label": _("Bottom Margin"), @@ -376,8 +379,10 @@ def __init__(self, viz): ('month', _('month')), ), "description": _( - "The time granularity for the visualization. Note that you " - "can type and use simple natural language as in '10 seconds', " + "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_granularity': (SelectField, { @@ -404,8 +409,10 @@ def __init__(self, viz): ('month', _('month')), ), "description": _( - "The time unit for each block. Should be a smaller unit than " - "domain_granularity. Should be larger or equal to Time Grain") + "The time unit for each block. Should be a " + "smaller unit than " + "domain_granularity. Should be larger or equal " + "to Time Grain") }), 'link_length': (FreeFormSelectField, { "label": _("Link Length"), @@ -497,8 +504,10 @@ def __init__(self, viz): ('1 year ago', _('1 year ago')), ), "description": _( - "Timestamp from filter. This supports free form typing and " - "natural language as in '1 day ago', '28 days' or '3 years'") + "Timestamp from filter. This supports " + "free form typing and " + "natural language as in '1 day ago', " + "'28 days' or '3 years'") }), 'until': (FreeFormSelectField, { "label": _("Until"), @@ -539,7 +548,8 @@ def __init__(self, viz): }), 'treemap_ratio': (DecimalField, { "label": _("Ratio"), - "default": 0.5 * (1 + math.sqrt(5)), # d3 default, golden ratio + # d3 default, golden ratio + "default": 0.5 * (1 + math.sqrt(5)), "description": _('Target aspect ratio for treemap tiles.'), }), 'number_format': (FreeFormSelectField, { @@ -577,7 +587,8 @@ def __init__(self, viz): 'rolling_type': (SelectField, { "label": _("Rolling"), "default": 'None', - "choices": [(s, s) for s in ['None', 'mean', 'sum', 'std', 'cumsum']], + "choices": [(s, s) for s in ['None', 'mean', + 'sum', 'std', 'cumsum']], "description": _( "Defines a rolling window function to apply, works along " "with the [Periods] text box") @@ -595,14 +606,16 @@ def __init__(self, viz): "default": default_groupby, "description": _( "Defines the grouping of entities. " - "Each series is shown as a specific color on the chart and " + "Each series is shown as a specific color " + "on the chart and " "has a legend toggle") }), 'entity': (SelectField, { "label": _("Entity"), "choices": group_by_choices, "default": default_groupby, - "description": _("This define the element to be plotted on the chart") + "description": _("This define the element to " + "be plotted on the chart") }), 'x': (SelectField, { "label": _("X Axis"), @@ -663,7 +676,8 @@ def __init__(self, viz): }), 'compare_suffix': (TextField, { "label": _("Comparison suffix"), - "description": _("Suffix to apply after the percentage display") + "description": _("Suffix to apply after " + "the percentage display") }), 'table_timestamp_format': (FreeFormSelectField, { "label": _("Table Timestamp Format"), @@ -762,7 +776,8 @@ def __init__(self, viz): 'size_from': (TextField, { "label": _("Font Size From"), "default": "20", - "description": _("Font size for the smallest value in the list") + "description": _("Font size for the " + "smallest value in the list") }), 'size_to': (TextField, { "label": _("Font Size To"), @@ -783,7 +798,8 @@ def __init__(self, viz): 'show_datatable': (BetterBooleanField, { "label": _("Data Table"), "default": False, - "description": _("Whether to display the interactive data table") + "description": _("Whether to display the " + "interactive data table") }), 'include_search': (BetterBooleanField, { "label": _("Search Box"), @@ -893,7 +909,8 @@ def __init__(self, viz): "choices": self.choicify(["count"] + datasource.column_names), "description": _( "'count' is COUNT(*) if a group by is used. " - "Numerical columns will be aggregated with the aggregator. " + "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."), }), @@ -903,7 +920,8 @@ def __init__(self, viz): ("mapbox://styles/mapbox/streets-v9", "Streets"), ("mapbox://styles/mapbox/dark-v9", "Dark"), ("mapbox://styles/mapbox/light-v9", "Light"), - ("mapbox://styles/mapbox/satellite-streets-v9", "Satellite Streets"), + ("mapbox://styles/mapbox/satellite-streets-v9", + "Satellite Streets"), ("mapbox://styles/mapbox/satellite-v9", "Satellite"), ("mapbox://styles/mapbox/outdoors-v9", "Outdoors"), ], @@ -925,7 +943,8 @@ def __init__(self, viz): '1000', ]), "description": _( - "The radius (in pixels) the algorithm uses to define a cluster. " + "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.") }), @@ -934,8 +953,10 @@ def __init__(self, viz): "default": "Auto", "choices": self.choicify(["Auto"] + datasource.column_names), "description": _( - "The radius of individual points (ones that are not in a cluster). " - "Either a numerical column or 'Auto', which scales the point based " + "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': (SelectField, { @@ -946,7 +967,8 @@ def __init__(self, viz): "Miles", "Kilometers", ]), - "description": _("The unit of measure for the specified point radius") + "description": _("The unit of measure for the specified" + " point radius") }), 'global_opacity': (DecimalField, { "label": _("Opacity"), @@ -1095,7 +1117,8 @@ def add_to_form(attrs): grains = viz.datasource.database.grains() if grains: - grains_choices = [(grain.name, grain.label) for grain in grains] + grains_choices = [(grain.name, grain.label) for + grain in grains] time_fields = ('granularity_sqla', 'time_grain_sqla') self.field_dict['time_grain_sqla'] = SelectField( _('Time Grain'), @@ -1108,16 +1131,20 @@ def add_to_form(attrs): "The options here are defined on a per database " "engine basis in the Superset source code")) add_to_form(time_fields) - field_css_classes['time_grain_sqla'] = ['form-control', 'select2'] - field_css_classes['granularity_sqla'] = ['form-control', 'select2'] + field_css_classes['time_grain_sqla'] = ['form-control', + 'select2'] + field_css_classes['granularity_sqla'] = ['form-control', + 'select2'] else: time_fields = 'granularity_sqla' add_to_form((time_fields, )) elif datasource_classname == 'DruidDatasource': time_fields = ('granularity', 'druid_time_origin') add_to_form(('granularity', 'druid_time_origin')) - field_css_classes['granularity'] = ['form-control', 'select2_freeform'] - field_css_classes['druid_time_origin'] = ['form-control', 'select2_freeform'] + field_css_classes['granularity'] = ['form-control', + 'select2_freeform'] + field_css_classes['druid_time_origin'] = ['form-control', + 'select2_freeform'] filter_choices = self.choicify(['in', 'not in', 'regex']) having_op_choices = self.choicify( ['==', '!=', '>', '<', '>=', '<=']) diff --git a/superset/templates/superset/add_slice.html b/superset/templates/superset/add_slice.html new file mode 100644 index 000000000000..c2e6978eb582 --- /dev/null +++ b/superset/templates/superset/add_slice.html @@ -0,0 +1,19 @@ +{% extends "superset/basic.html" %} + +{% block title %} + Add new slice +{% endblock %} + +{% block body %} +
+{% endblock %} + +{% block tail_js %} + {{ super() }} + {% with filename="addSlice" %} + {% include "superset/partials/_script_tag.html" %} + {% endwith %} +{% endblock %} diff --git a/superset/translations/es/LC_MESSAGES/messages.mo b/superset/translations/es/LC_MESSAGES/messages.mo index 3eca8ab3a9556739304c79a20646f6d804df6309..9ecae647e4b316323cba8c92af632b84c717f89c 100644 GIT binary patch delta 3755 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\n" "Language: es\n" "Language-Team: es \n" @@ -22,7 +22,7 @@ msgstr "" #: superset/db_engine_specs.py:269 superset/db_engine_specs.py:317 #: superset/db_engine_specs.py:362 superset/db_engine_specs.py:770 #: superset/db_engine_specs.py:806 superset/db_engine_specs.py:838 -#: superset/db_engine_specs.py:884 superset/forms.py:443 +#: superset/db_engine_specs.py:884 msgid "Time Column" msgstr "" @@ -43,7 +43,6 @@ msgstr "" #: superset/db_engine_specs.py:323 superset/db_engine_specs.py:367 #: superset/db_engine_specs.py:779 superset/db_engine_specs.py:809 #: superset/db_engine_specs.py:843 superset/db_engine_specs.py:891 -#: superset/forms.py:387 superset/forms.py:401 msgid "hour" msgstr "" @@ -51,7 +50,7 @@ msgstr "" #: superset/db_engine_specs.py:270 superset/db_engine_specs.py:325 #: superset/db_engine_specs.py:369 superset/db_engine_specs.py:781 #: superset/db_engine_specs.py:811 superset/db_engine_specs.py:845 -#: superset/db_engine_specs.py:893 superset/forms.py:388 superset/forms.py:402 +#: superset/db_engine_specs.py:893 msgid "day" msgstr "" @@ -59,7 +58,6 @@ msgstr "" #: superset/db_engine_specs.py:271 superset/db_engine_specs.py:326 #: superset/db_engine_specs.py:371 superset/db_engine_specs.py:783 #: superset/db_engine_specs.py:813 superset/db_engine_specs.py:847 -#: superset/forms.py:373 superset/forms.py:389 superset/forms.py:403 msgid "week" msgstr "" @@ -67,8 +65,7 @@ msgstr "" #: superset/db_engine_specs.py:273 superset/db_engine_specs.py:328 #: superset/db_engine_specs.py:373 superset/db_engine_specs.py:785 #: superset/db_engine_specs.py:815 superset/db_engine_specs.py:849 -#: superset/db_engine_specs.py:895 superset/forms.py:376 superset/forms.py:390 -#: superset/forms.py:404 +#: superset/db_engine_specs.py:895 msgid "month" msgstr "" @@ -82,7 +79,6 @@ msgstr "" #: superset/db_engine_specs.py:202 superset/db_engine_specs.py:252 #: superset/db_engine_specs.py:332 superset/db_engine_specs.py:789 #: superset/db_engine_specs.py:819 superset/db_engine_specs.py:899 -#: superset/forms.py:391 msgid "year" msgstr "" @@ -91,7 +87,6 @@ msgid "week_start_monday" msgstr "" #: superset/db_engine_specs.py:377 superset/db_engine_specs.py:853 -#: superset/forms.py:375 msgid "week_ending_saturday" msgstr "" @@ -111,186 +106,194 @@ msgstr "" msgid "10 minute" msgstr "" -#: superset/forms.py:37 -msgid "D3 format syntax https://github.com/d3/d3-format" +#: superset/viz.py:311 +msgid "Table View" msgstr "" -#: superset/forms.py:150 -msgid "Viz" +#: superset/viz.py:364 +msgid "Pivot Table" msgstr "" -#: superset/forms.py:153 -msgid "The type of visualization to display" +#: superset/viz.py:413 +msgid "Markup" msgstr "" -#: superset/forms.py:156 -msgid "Metrics" +#: superset/viz.py:432 +msgid "Separator" msgstr "" -#: superset/forms.py:159 superset/forms.py:164 -msgid "One or many metrics to display" +#: superset/viz.py:448 +msgid "Word Cloud" msgstr "" -#: superset/forms.py:162 -msgid "Ordering" +#: superset/viz.py:471 +msgid "Treemap" msgstr "" -#: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:117 -#: superset/forms.py:167 -msgid "Metric" +#: superset/viz.py:497 +msgid "Calendar Heatmap" msgstr "" -#: superset/forms.py:170 -msgid "Choose the metric" +#: superset/viz.py:555 +msgid "Box Plot" msgstr "" -#: superset/forms.py:173 -msgid "Chart Style" +#: superset/viz.py:644 +msgid "Bubble Chart" msgstr "" -#: superset/forms.py:175 -msgid "stack" +#: superset/viz.py:693 +msgid "Bullet Chart" msgstr "" -#: superset/forms.py:176 -msgid "stream" +#: superset/viz.py:742 +msgid "Big Number with Trendline" msgstr "" -#: superset/forms.py:177 -msgid "expand" +#: superset/viz.py:771 +msgid "Big Number" msgstr "" -#: superset/forms.py:183 -msgid "Color Scheme" +#: superset/viz.py:798 +msgid "Time Series - Line Chart" msgstr "" -#: superset/forms.py:185 -msgid "fire" +#: superset/viz.py:925 +msgid "Time Series - Dual Axis Line Chart" msgstr "" -#: superset/forms.py:186 -msgid "blue_white_yellow" +#: superset/viz.py:1000 +msgid "Time Series - Bar Chart" msgstr "" -#: superset/forms.py:187 -msgid "white_black" +#: superset/viz.py:1008 +msgid "Time Series - Percent Change" msgstr "" -#: superset/forms.py:188 -msgid "black_white" +#: superset/viz.py:1016 +msgid "Time Series - Stacked" msgstr "" -#: superset/forms.py:194 -msgid "Normalize Across" +#: superset/viz.py:1025 +msgid "Distribution - NVD3 - Pie Chart" msgstr "" -#: superset/forms.py:196 -msgid "heatmap" +#: superset/viz.py:1043 +msgid "Histogram" msgstr "" -#: superset/forms.py:197 -msgid "x" +#: superset/viz.py:1068 +msgid "Distribution - Bar Chart" msgstr "" -#: superset/forms.py:198 -msgid "y" +#: superset/viz.py:1135 +msgid "Sunburst" msgstr "" -#: superset/forms.py:201 -msgid "" -"Color will be rendered based on a ratio of the cell against the sum of " -"across this criteria" +#: superset/viz.py:1168 +msgid "Sankey" msgstr "" -#: superset/forms.py:207 -msgid "Color Scale" +#: superset/viz.py:1217 +msgid "Directed Force Layout" msgstr "" -#: superset/forms.py:209 -msgid "series" +#: superset/viz.py:1238 +msgid "Country Map" msgstr "" -#: superset/forms.py:210 -msgid "overall" +#: superset/viz.py:1267 +msgid "World Map" msgstr "" -#: superset/forms.py:211 -msgid "change" +#: superset/viz.py:1317 +msgid "Filters" msgstr "" -#: superset/forms.py:214 -msgid "Defines how the color are attributed." +#: superset/viz.py:1352 +msgid "iFrame" msgstr "" -#: superset/forms.py:217 -msgid "Rendering" +#: superset/viz.py:1369 +msgid "Parallel Coordinates" msgstr "" -#: superset/forms.py:219 -msgid "pixelated (Sharp)" +#: superset/viz.py:1394 +msgid "Heatmap" msgstr "" -#: superset/forms.py:220 -msgid "auto (Smooth)" +#: superset/viz.py:1445 +msgid "Horizon Charts" msgstr "" -#: superset/forms.py:223 +#: superset/viz.py:1456 +msgid "Mapbox" +msgstr "" + +#: superset/connectors/druid/models.py:934 +msgid "No data was returned." +msgstr "" + +#: superset/forms.py:225 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "" -#: superset/forms.py:228 +#: superset/forms.py:230 msgid "XScale Interval" msgstr "" -#: superset/forms.py:231 -msgid "Number of step to take between ticks when printing the x scale" +#: superset/connectors/druid/views.py:39 superset/views/core.py:306 +#: superset/views/core.py:355 +msgid "Datasource" msgstr "" -#: superset/forms.py:236 +#: superset/forms.py:238 msgid "YScale Interval" msgstr "" -#: superset/forms.py:239 +#: superset/forms.py:241 msgid "Number of step to take between ticks when printing the y scale" msgstr "" -#: superset/forms.py:244 +#: superset/forms.py:246 msgid "Stacked Bars" msgstr "" -#: superset/forms.py:249 +#: superset/forms.py:251 msgid "Show Markers" msgstr "" -#: superset/forms.py:256 +#: superset/forms.py:258 msgid "Bar Values" msgstr "" -#: superset/forms.py:261 +#: superset/forms.py:263 msgid "Sort Bars" msgstr "" -#: superset/forms.py:263 +#: superset/forms.py:265 msgid "Sort bars by x labels." msgstr "" -#: superset/forms.py:266 +#: superset/forms.py:268 msgid "Extra Controls" msgstr "" -#: superset/forms.py:268 +#: superset/forms.py:270 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" -#: superset/forms.py:274 -msgid "Reduce X ticks" +#: superset/connectors/druid/views.py:95 superset/connectors/druid/views.py:205 +#: superset/connectors/sqla/views.py:76 superset/connectors/sqla/views.py:118 +#: superset/views/core.py:356 +msgid "Description" msgstr "" -#: superset/forms.py:276 +#: superset/forms.py:278 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 " @@ -298,1251 +301,1169 @@ msgid "" "scroll." msgstr "" -#: superset/forms.py:284 -msgid "Include Series" +#: superset/connectors/druid/views.py:98 superset/views/core.py:529 +msgid "JSON" msgstr "" -#: superset/forms.py:286 +#: superset/forms.py:288 msgid "Include series name as an axis" msgstr "" -#: superset/forms.py:289 -msgid "Color Metric" +#: superset/connectors/druid/views.py:124 +#: superset/connectors/druid/views.py:204 +msgid "Cluster" +msgstr "" + +#: superset/connectors/druid/views.py:125 +msgid "Coordinator Host" msgstr "" -#: superset/forms.py:292 -msgid "A metric to use for color" +#: superset/connectors/druid/views.py:126 +msgid "Coordinator Port" msgstr "" -#: superset/forms.py:295 -msgid "Country Field Type" +#: superset/connectors/druid/views.py:127 +msgid "Coordinator Endpoint" msgstr "" -#: superset/forms.py:298 -msgid "Full name" +#: superset/connectors/druid/views.py:128 +msgid "Broker Host" msgstr "" -#: superset/forms.py:299 -msgid "code International Olympic Committee (cioc)" +#: superset/connectors/druid/views.py:129 +msgid "Broker Port" msgstr "" -#: superset/forms.py:300 -msgid "code ISO 3166-1 alpha-2 (cca2)" +#: superset/connectors/druid/views.py:130 +msgid "Broker Endpoint" +msgstr "" + +#: superset/connectors/druid/views.py:173 superset/connectors/sqla/views.py:156 +msgid "" +"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'" msgstr "" -#: superset/forms.py:301 -msgid "code ISO 3166-1 alpha-3 (cca3)" +#: superset/connectors/druid/views.py:181 superset/connectors/sqla/views.py:164 +msgid "Timezone offset (in hours) for this datasource" msgstr "" -#: superset/forms.py:303 +#: superset/connectors/druid/views.py:185 msgid "" -"The country code standard that Superset should expect to find in the " -"[country] column" +"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" msgstr "" -#: superset/forms.py:308 -msgid "Group by" +#: superset/connectors/druid/views.py:192 superset/connectors/sqla/views.py:186 +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 " +"fly" msgstr "" -#: superset/forms.py:310 -msgid "One or many fields to group by" +#: superset/connectors/druid/views.py:196 superset/connectors/sqla/views.py:200 +msgid "" +"Redirects to this endpoint when clicking on the datasource from the " +"datasource list" msgstr "" -#: superset/forms.py:313 superset/forms.py:318 -msgid "Columns" +#: superset/connectors/druid/views.py:202 superset/connectors/sqla/views.py:193 +msgid "Associated Slices" msgstr "" -#: superset/forms.py:315 -msgid "One or many fields to pivot as columns" +#: superset/connectors/druid/views.py:203 +msgid "Data Source" msgstr "" -#: superset/forms.py:320 superset/forms.py:326 superset/forms.py:332 -msgid "Columns to display" +#: superset/connectors/druid/views.py:206 +msgid "Owner" msgstr "" -#: superset/forms.py:323 -msgid "X" +#: superset/connectors/druid/views.py:207 +msgid "Is Hidden" msgstr "" -#: superset/forms.py:329 -msgid "Y" +#: superset/connectors/druid/views.py:208 superset/connectors/sqla/views.py:198 +msgid "Enable Filter Select" msgstr "" -#: superset/forms.py:335 -msgid "Origin" +#: superset/connectors/druid/views.py:209 +msgid "Default Endpoint" msgstr "" -#: superset/forms.py:337 -msgid "default" +#: superset/connectors/druid/views.py:210 +msgid "Time Offset" msgstr "" -#: superset/forms.py:338 superset/forms.py:507 -msgid "now" +#: superset/connectors/druid/views.py:211 superset/connectors/sqla/views.py:204 +#: superset/views/core.py:242 superset/views/core.py:352 +msgid "Cache Timeout" msgstr "" -#: superset/forms.py:341 +#: superset/connectors/sqla/models.py:388 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "'now', 'sunday' or '1970-01-01'" msgstr "" -#: superset/forms.py:346 -msgid "Bottom Margin" +#: superset/connectors/sqla/models.py:393 +msgid "Metric '{}' is not valid" msgstr "" -#: superset/forms.py:349 +#: superset/forms.py:352 msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/forms.py:354 +#: superset/forms.py:357 msgid "Page Length" msgstr "" -#: superset/forms.py:357 -msgid "Number of rows per page, 0 means no pagination" +#: superset/connectors/sqla/views.py:79 superset/connectors/sqla/views.py:122 +#: superset/connectors/sqla/views.py:194 superset/views/core.py:362 +msgid "Table" msgstr "" -#: superset/forms.py:361 +#: superset/forms.py:364 msgid "Time Granularity" msgstr "" -#: superset/forms.py:364 +#: superset/forms.py:367 msgid "all" msgstr "" -#: superset/forms.py:365 +#: superset/forms.py:368 msgid "5 seconds" msgstr "" -#: superset/forms.py:366 +#: superset/forms.py:369 msgid "30 seconds" msgstr "" -#: superset/forms.py:367 +#: superset/forms.py:370 msgid "1 minute" msgstr "" -#: superset/forms.py:368 -msgid "5 minutes" -msgstr "" - -#: superset/forms.py:369 -msgid "1 hour" +#: superset/connectors/sqla/views.py:165 +msgid "Name of the table that exists in the source database" msgstr "" -#: superset/forms.py:370 -msgid "6 hour" +#: superset/connectors/sqla/views.py:167 +msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" msgstr "" -#: superset/forms.py:371 -msgid "1 day" +#: superset/connectors/sqla/views.py:173 +msgid "" +"This fields acts a Superset view, meaning that Superset will run a query " +"against this string as a subquery." msgstr "" -#: superset/forms.py:372 -msgid "7 days" +#: superset/connectors/sqla/views.py:177 +msgid "" +"Predicate applied when fetching distinct value to populate the filter " +"control component. Supports jinja template syntax. Applies only when " +"`Enable Filter Select` is on." msgstr "" -#: superset/forms.py:374 -msgid "week_starting_sunday" +#: superset/connectors/sqla/views.py:183 +msgid "Redirects to this endpoint when clicking on the table from the table list" msgstr "" -#: superset/forms.py:378 -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'" +#: superset/connectors/sqla/views.py:195 +msgid "Changed By" msgstr "" -#: superset/forms.py:384 -msgid "Domain" +#: superset/connectors/sqla/views.py:196 superset/views/core.py:238 +msgid "Database" msgstr "" -#: superset/forms.py:393 -msgid "The time unit used for the grouping of blocks" +#: superset/connectors/sqla/views.py:197 superset/views/core.py:240 +msgid "Last Changed" msgstr "" -#: superset/forms.py:397 -msgid "Subdomain" +#: superset/connectors/sqla/views.py:199 +msgid "Schema" msgstr "" -#: superset/forms.py:400 superset/forms.py:751 -msgid "min" +#: superset/connectors/sqla/views.py:203 +msgid "Offset" msgstr "" -#: superset/forms.py:406 +#: superset/connectors/sqla/views.py:236 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/forms.py:411 +#: superset/forms.py:418 msgid "Link Length" msgstr "" -#: superset/forms.py:423 +#: superset/forms.py:430 msgid "Link length in the force layout" msgstr "" -#: superset/forms.py:426 +#: superset/forms.py:433 msgid "Charge" msgstr "" -#: superset/forms.py:440 -msgid "Charge in the force layout" -msgstr "" - -#: superset/forms.py:446 -msgid "" -"The time column for the visualization. Note that you can define arbitrary" -" expression that return a DATETIME column in the table editor. Also note " -"that the filter below is applied against this column or expression" +#: superset/templates/superset/request_access.html:2 +msgid "No Access!" msgstr "" -#: superset/forms.py:454 +#: superset/forms.py:461 msgid "Resample Rule" msgstr "" -#: superset/forms.py:457 +#: superset/forms.py:464 msgid "1T" msgstr "" -#: superset/forms.py:458 +#: superset/forms.py:465 msgid "1H" msgstr "" -#: superset/forms.py:459 -msgid "1D" -msgstr "" - -#: superset/forms.py:460 -msgid "7D" -msgstr "" - -#: superset/forms.py:461 -msgid "1M" -msgstr "" - -#: superset/forms.py:462 -msgid "1AS" +#: superset/templates/superset/models/database/macros.html:4 +msgid "Test Connection" msgstr "" -#: superset/forms.py:464 -msgid "Pandas resample rule" +#: superset/views/core.py:206 +msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/forms.py:467 -msgid "Resample How" +#: superset/views/core.py:207 +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 " +"(<~1 minute)" msgstr "" -#: superset/forms.py:471 superset/forms.py:750 -msgid "mean" +#: superset/views/core.py:211 +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." msgstr "" -#: superset/forms.py:472 superset/forms.py:749 -msgid "sum" +#: superset/views/core.py:215 +msgid "Allow CREATE TABLE AS option in SQL Lab" msgstr "" -#: superset/forms.py:473 superset/forms.py:753 -msgid "median" +#: superset/views/core.py:216 +msgid "" +"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" +" SQL Lab" msgstr "" -#: superset/forms.py:475 -msgid "Pandas resample how" +#: superset/views/core.py:220 +msgid "" +"When allowing CREATE TABLE AS option in SQL Lab, this option forces the " +"table to be created in this schema" msgstr "" -#: superset/forms.py:478 -msgid "Resample Fill Method" +#: superset/views/core.py:234 +msgid "Expose in SQL Lab" msgstr "" -#: superset/forms.py:482 -msgid "ffill" +#: superset/views/core.py:235 +msgid "Allow CREATE TABLE AS" msgstr "" -#: superset/forms.py:483 -msgid "bfill" +#: superset/views/core.py:236 +msgid "Allow DML" msgstr "" -#: superset/forms.py:485 -msgid "Pandas resample fill method" +#: superset/views/core.py:237 +msgid "CTAS Schema" msgstr "" -#: superset/forms.py:488 -msgid "Since" +#: superset/views/core.py:239 superset/views/core.py:353 +#: superset/views/core.py:449 superset/views/core.py:513 +msgid "Creator" msgstr "" -#: superset/forms.py:491 -msgid "1 hour ago" +#: superset/views/core.py:241 +msgid "SQLAlchemy URI" msgstr "" -#: superset/forms.py:492 -msgid "12 hours ago" +#: superset/views/core.py:243 +msgid "Extra" msgstr "" -#: superset/forms.py:493 superset/forms.py:508 -msgid "1 day ago" +#: superset/views/core.py:303 superset/views/core.py:526 +msgid "User" msgstr "" -#: superset/forms.py:494 superset/forms.py:509 -msgid "7 days ago" +#: superset/views/core.py:304 +msgid "User Roles" msgstr "" -#: superset/forms.py:495 superset/forms.py:510 -msgid "28 days ago" +#: superset/views/core.py:305 +msgid "Database URL" msgstr "" -#: superset/forms.py:496 superset/forms.py:511 -msgid "90 days ago" +#: superset/views/core.py:307 +msgid "Roles to grant" msgstr "" -#: superset/forms.py:497 superset/forms.py:512 -msgid "1 year ago" +#: superset/views/core.py:308 +msgid "Created On" msgstr "" -#: superset/forms.py:499 +#: superset/views/core.py:341 msgid "" "Timestamp from filter. This supports free form typing and natural " "language as in '1 day ago', '28 days' or '3 years'" msgstr "" -#: superset/forms.py:504 -msgid "Until" +#: superset/views/core.py:346 +msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/forms.py:516 -msgid "Max Bubble Size" +#: superset/views/core.py:354 +msgid "Dashboards" msgstr "" -#: superset/forms.py:529 -msgid "Whisker/outlier options" +#: superset/views/core.py:357 +msgid "Last Modified" msgstr "" -#: superset/forms.py:531 -msgid "Determines how whiskers and outliers are calculated." +#: superset/views/core.py:358 superset/views/core.py:448 +msgid "Owners" msgstr "" -#: superset/forms.py:534 -msgid "Tukey" +#: superset/views/core.py:359 +msgid "Parameters" msgstr "" -#: superset/forms.py:535 -msgid "Min/max (no outliers)" +#: superset/views/core.py:360 superset/views/core.py:396 +msgid "Slice" msgstr "" -#: superset/forms.py:536 -msgid "2/98 percentiles" +#: superset/views/core.py:361 +msgid "Name" msgstr "" -#: superset/forms.py:537 -msgid "9/91 percentiles" +#: superset/views/core.py:363 +msgid "Visualization Type" msgstr "" -#: superset/forms.py:541 -msgid "Ratio" +#: superset/views/core.py:421 +msgid "" +"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" msgstr "" -#: superset/forms.py:543 -msgid "Target aspect ratio for treemap tiles." +#: superset/views/core.py:426 +msgid "" +"The css for individual dashboards can be altered here, or in the " +"dashboard view where changes are immediately visible" msgstr "" -#: superset/forms.py:546 -msgid "Number format" +#: superset/views/core.py:430 +msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/forms.py:559 -msgid "Row limit" +#: superset/views/core.py:431 +msgid "" +"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." msgstr "" -#: superset/forms.py:565 -msgid "Series limit" +#: superset/views/core.py:436 +msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/forms.py:568 -msgid "Limits the number of time series that get displayed" +#: superset/views/core.py:444 superset/views/core.py:511 +msgid "Dashboard" msgstr "" -#: superset/forms.py:572 -msgid "Sort By" +#: superset/views/core.py:445 superset/views/core.py:512 +msgid "Title" msgstr "" -#: superset/forms.py:575 -msgid "Metric used to define the top series" +#: superset/views/core.py:446 +msgid "Slug" msgstr "" -#: superset/forms.py:578 -msgid "Rolling" +#: superset/views/core.py:447 +msgid "Slices" msgstr "" -#: superset/forms.py:581 -msgid "" -"Defines a rolling window function to apply, works along with the " -"[Periods] text box" +#: superset/views/core.py:450 superset/views/core.py:514 +msgid "Modified" msgstr "" -#: superset/forms.py:586 -msgid "Periods" +#: superset/views/core.py:451 +msgid "Position JSON" msgstr "" -#: superset/forms.py:588 -msgid "" -"Defines the size of the rolling window function, relative to the time " -"granularity selected" +#: superset/views/core.py:452 +msgid "CSS" msgstr "" -#: superset/forms.py:593 -msgid "Series" +#: superset/views/core.py:453 +msgid "JSON Metadata" msgstr "" -#: superset/forms.py:596 -msgid "" -"Defines the grouping of entities. Each series is shown as a specific " -"color on the chart and has a legend toggle" +#: superset/views/core.py:454 +msgid "Underlying Tables" +msgstr "" + +#: superset/views/core.py:527 +msgid "Action" msgstr "" -#: superset/forms.py:602 -msgid "Entity" +#: superset/views/core.py:528 +msgid "dttm" msgstr "" -#: superset/forms.py:605 -msgid "This define the element to be plotted on the chart" +#: superset/views/core.py:2279 +msgid "SQL Editor" msgstr "" -#: superset/forms.py:608 -msgid "X Axis" +#: superset/views/core.py:2288 +msgid "Query Search" msgstr "" -#: superset/forms.py:611 +#: superset/forms.py:624 msgid "Metric assigned to the [X] axis" msgstr "" -#: superset/forms.py:614 +#: superset/forms.py:627 msgid "Y Axis" msgstr "" -#: superset/forms.py:617 +#: superset/forms.py:630 msgid "Metric assigned to the [Y] axis" msgstr "" -#: superset/forms.py:620 +#: superset/forms.py:633 msgid "Bubble Size" msgstr "" -#: superset/forms.py:625 +#: superset/forms.py:638 msgid "URL" msgstr "" -#: superset/forms.py:626 +#: superset/forms.py:639 msgid "" "The URL, this field is templated, so you can integrate {{ width }} and/or" " {{ height }} in your URL string." msgstr "" -#: superset/forms.py:633 +#: superset/forms.py:646 msgid "X Axis Label" msgstr "" -#: superset/forms.py:637 +#: superset/forms.py:650 msgid "Y Axis Label" msgstr "" -#: superset/forms.py:641 +#: superset/forms.py:654 msgid "Custom WHERE clause" msgstr "" -#: superset/forms.py:643 +#: superset/forms.py:656 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/forms.py:650 +#: superset/forms.py:663 msgid "Custom HAVING clause" msgstr "" -#: superset/forms.py:652 +#: superset/forms.py:665 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/forms.py:659 +#: superset/forms.py:672 msgid "Comparison Period Lag" msgstr "" -#: superset/forms.py:660 +#: superset/forms.py:673 msgid "Based on granularity, number of time periods to compare against" msgstr "" -#: superset/forms.py:665 +#: superset/forms.py:678 msgid "Comparison suffix" msgstr "" -#: superset/forms.py:666 +#: superset/forms.py:679 msgid "Suffix to apply after the percentage display" msgstr "" -#: superset/forms.py:669 +#: superset/forms.py:683 msgid "Table Timestamp Format" msgstr "" -#: superset/forms.py:672 +#: superset/forms.py:686 msgid "Timestamp Format" msgstr "" -#: superset/forms.py:675 +#: superset/forms.py:689 msgid "Series Height" msgstr "" -#: superset/forms.py:678 +#: superset/forms.py:692 msgid "Pixel height of each series" msgstr "" -#: superset/forms.py:681 +#: superset/forms.py:695 msgid "X axis format" msgstr "" -#: superset/forms.py:687 +#: superset/forms.py:701 msgid "Y axis format" msgstr "" -#: superset/forms.py:700 +#: superset/forms.py:714 msgid "Markup Type" msgstr "" -#: superset/forms.py:702 +#: superset/forms.py:716 msgid "markdown" msgstr "" -#: superset/forms.py:703 +#: superset/forms.py:717 msgid "html" msgstr "" -#: superset/forms.py:706 +#: superset/forms.py:720 msgid "Pick your favorite markup language" msgstr "" -#: superset/forms.py:709 +#: superset/forms.py:723 msgid "Rotation" msgstr "" -#: superset/forms.py:711 +#: superset/forms.py:725 msgid "random" msgstr "" -#: superset/forms.py:712 +#: superset/forms.py:726 msgid "flat" msgstr "" -#: superset/forms.py:713 +#: superset/forms.py:727 msgid "square" msgstr "" -#: superset/forms.py:716 +#: superset/forms.py:730 msgid "Rotation to apply to words in the cloud" msgstr "" -#: superset/forms.py:719 -msgid "Line Style" -msgstr "" +#~ msgid "" +#~ msgstr "" -#: superset/forms.py:721 +#: superset/forms.py:735 msgid "linear" msgstr "" -#: superset/forms.py:722 +#: superset/forms.py:736 msgid "basis" msgstr "" -#: superset/forms.py:723 +#: superset/forms.py:737 msgid "cardinal" msgstr "" -#: superset/forms.py:724 +#: superset/forms.py:738 msgid "monotone" msgstr "" -#: superset/forms.py:725 +#: superset/forms.py:739 msgid "step-before" msgstr "" -#: superset/forms.py:726 +#: superset/forms.py:740 msgid "step-after" msgstr "" -#: superset/forms.py:729 +#: superset/forms.py:743 msgid "Line interpolation as defined by d3.js" msgstr "" -#: superset/forms.py:732 +#: superset/forms.py:746 msgid "Label Type" msgstr "" -#: superset/forms.py:735 -msgid "Category Name" -msgstr "" +#~ msgid "XScale Interval" +#~ msgstr "" -#: superset/forms.py:736 -msgid "Value" -msgstr "" - -#: superset/forms.py:737 +#: superset/forms.py:751 msgid "Percentage" msgstr "" -#: superset/forms.py:739 +#: superset/forms.py:753 msgid "What should be shown on the label?" msgstr "" -#: superset/forms.py:742 +#: superset/forms.py:756 msgid "Code" msgstr "" -#: superset/forms.py:743 +#: superset/forms.py:757 msgid "Put your code here" msgstr "" -#: superset/forms.py:747 +#: superset/forms.py:761 msgid "Aggregation function" msgstr "" -#: superset/forms.py:752 -msgid "max" -msgstr "" - -#: superset/forms.py:754 -msgid "stdev" -msgstr "" - -#: superset/forms.py:755 -msgid "var" -msgstr "" +#~ msgid "Reduce X ticks" +#~ msgstr "" -#: superset/forms.py:758 -msgid "" -"Aggregate function to apply when pivoting and computing the total rows " -"and columns" -msgstr "" +#~ msgid "Include Series" +#~ msgstr "" -#: superset/forms.py:763 +#: superset/forms.py:777 msgid "Font Size From" msgstr "" -#: superset/forms.py:765 +#: superset/forms.py:779 msgid "Font size for the smallest value in the list" msgstr "" -#: superset/forms.py:768 +#: superset/forms.py:783 msgid "Font Size To" msgstr "" -#: superset/forms.py:770 +#: superset/forms.py:785 msgid "Font size for the biggest value in the list" msgstr "" -#: superset/forms.py:773 +#: superset/forms.py:788 msgid "Range Filter" msgstr "" -#: superset/forms.py:775 +#: superset/forms.py:790 msgid "Whether to display the time range interactive selector" msgstr "" -#: superset/forms.py:779 +#: superset/forms.py:794 msgid "Date Filter" msgstr "" -#: superset/forms.py:781 +#: superset/forms.py:796 msgid "Whether to include a time filter" msgstr "" -#: superset/forms.py:784 -msgid "Data Table" -msgstr "" - -#: superset/forms.py:786 -msgid "Whether to display the interactive data table" -msgstr "" +#~ msgid "Group by" +#~ msgstr "" -#: superset/forms.py:789 +#: superset/forms.py:805 msgid "Search Box" msgstr "" -#: superset/forms.py:791 +#: superset/forms.py:807 msgid "Whether to include a client side search box" msgstr "" -#: superset/forms.py:795 +#: superset/forms.py:811 msgid "Table Filter" msgstr "" -#: superset/forms.py:797 +#: superset/forms.py:813 msgid "Whether to apply filter when table cell is clicked" msgstr "" -#: superset/forms.py:801 +#: superset/forms.py:817 msgid "Show Bubbles" msgstr "" -#: superset/forms.py:803 +#: superset/forms.py:819 msgid "Whether to display bubbles on top of countries" msgstr "" -#: superset/forms.py:807 +#: superset/forms.py:823 msgid "Legend" msgstr "" -#: superset/forms.py:809 +#: superset/forms.py:825 msgid "Whether to display the legend (toggles)" msgstr "" -#: superset/forms.py:812 +#: superset/forms.py:828 msgid "X bounds" msgstr "" -#: superset/forms.py:814 -msgid "Whether to display the min and max values of the X axis" -msgstr "" +#~ msgid "Bottom Margin" +#~ msgstr "" -#: superset/forms.py:818 -msgid "Rich Tooltip" -msgstr "" - -#: superset/forms.py:820 +#: superset/forms.py:836 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" -#: superset/forms.py:825 +#: superset/forms.py:841 msgid "Y Axis Zero" msgstr "" -#: superset/forms.py:827 +#: superset/forms.py:843 msgid "Force the Y axis to start at 0 instead of the minimum value" msgstr "" -#: superset/forms.py:832 +#: superset/forms.py:848 msgid "Y Log" msgstr "" -#: superset/forms.py:834 +#: superset/forms.py:850 msgid "Use a log scale for the Y axis" msgstr "" -#: superset/forms.py:837 +#: superset/forms.py:853 msgid "X Log" msgstr "" -#: superset/forms.py:839 +#: superset/forms.py:855 msgid "Use a log scale for the X axis" msgstr "" -#: superset/forms.py:842 +#: superset/forms.py:858 msgid "Donut" msgstr "" -#: superset/forms.py:844 +#: superset/forms.py:860 msgid "Do you want a donut or a pie?" msgstr "" -#: superset/forms.py:847 +#: superset/forms.py:863 msgid "Put labels outside" msgstr "" -#: superset/forms.py:849 +#: superset/forms.py:865 msgid "Put the labels outside the pie?" msgstr "" -#: superset/forms.py:852 -msgid "Contribution" -msgstr "" - -#: superset/forms.py:854 -msgid "Compute the contribution to the total" -msgstr "" +#~ msgid "Domain" +#~ msgstr "" -#: superset/forms.py:857 +#: superset/forms.py:873 msgid "Period Ratio" msgstr "" -#: superset/forms.py:860 +#: superset/forms.py:876 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "" -#: superset/forms.py:865 -msgid "Period Ratio Type" -msgstr "" - -#: superset/forms.py:868 -msgid "factor" +#: superset/forms.py:881 +msgid "Period Ratio Type" msgstr "" -#: superset/forms.py:869 -msgid "growth" -msgstr "" +#~ msgid "Link Length" +#~ msgstr "" -#: superset/forms.py:870 +#: superset/forms.py:886 msgid "value" msgstr "" -#: superset/forms.py:872 +#: superset/forms.py:888 msgid "" "`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " "is (new-previous)" msgstr "" -#: superset/forms.py:877 +#: superset/forms.py:893 msgid "Time Shift" msgstr "" -#: superset/forms.py:879 -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/forms.py:886 -msgid "Subheader" -msgstr "" +#~ msgid "Resample Rule" +#~ msgstr "" -#: superset/forms.py:887 +#: superset/forms.py:903 msgid "Description text that shows up below your Big Number" msgstr "" -#: superset/forms.py:894 +#: superset/forms.py:910 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/forms.py:911 +#: superset/forms.py:929 msgid "Base layer map style" msgstr "" -#: superset/forms.py:914 +#: superset/forms.py:932 msgid "Clustering Radius" msgstr "" -#: superset/forms.py:927 +#: superset/forms.py:945 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/forms.py:933 +#: superset/forms.py:952 msgid "Point Radius" msgstr "" -#: superset/forms.py:936 +#: superset/forms.py:955 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/forms.py:942 +#: superset/forms.py:963 msgid "Point Radius Unit" msgstr "" -#: superset/forms.py:949 +#: superset/forms.py:970 msgid "The unit of measure for the specified point radius" msgstr "" -#: superset/forms.py:952 +#: superset/forms.py:974 msgid "Opacity" msgstr "" -#: superset/forms.py:954 +#: superset/forms.py:976 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/forms.py:959 +#: superset/forms.py:981 msgid "Zoom" msgstr "" -#: superset/forms.py:962 +#: superset/forms.py:984 msgid "Zoom level of the map" msgstr "" -#: superset/forms.py:966 +#: superset/forms.py:988 msgid "Default latitude" msgstr "" -#: superset/forms.py:968 +#: superset/forms.py:990 msgid "Latitude of default viewport" msgstr "" -#: superset/forms.py:972 +#: superset/forms.py:994 msgid "Default longitude" msgstr "" -#: superset/forms.py:974 +#: superset/forms.py:996 msgid "Longitude of default viewport" msgstr "" -#: superset/forms.py:978 +#: superset/forms.py:1000 msgid "Live render" msgstr "" -#: superset/forms.py:980 +#: superset/forms.py:1002 msgid "Points and clusters will update as viewport is being changed" msgstr "" -#: superset/forms.py:985 +#: superset/forms.py:1007 msgid "RGB Color" msgstr "" -#: superset/forms.py:995 +#: superset/forms.py:1017 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/forms.py:998 +#: superset/forms.py:1020 msgid "Ranges" msgstr "" -#: superset/forms.py:1000 +#: superset/forms.py:1022 msgid "Ranges to highlight with shading" msgstr "" -#: superset/forms.py:1003 +#: superset/forms.py:1025 msgid "Range labels" msgstr "" -#: superset/forms.py:1005 -msgid "Labels for the ranges" -msgstr "" - -#: superset/forms.py:1008 -msgid "Markers" -msgstr "" +#~ msgid "Until" +#~ msgstr "" -#: superset/forms.py:1010 +#: superset/forms.py:1032 msgid "List of values to mark with triangles" msgstr "" -#: superset/forms.py:1013 +#: superset/forms.py:1035 msgid "Marker labels" msgstr "" -#: superset/forms.py:1015 +#: superset/forms.py:1037 msgid "Labels for the markers" msgstr "" -#: superset/forms.py:1018 +#: superset/forms.py:1040 msgid "Marker lines" msgstr "" -#: superset/forms.py:1020 +#: superset/forms.py:1042 msgid "List of values to mark with lines" msgstr "" -#: superset/forms.py:1023 +#: superset/forms.py:1045 msgid "Marker line labels" msgstr "" -#: superset/forms.py:1025 +#: superset/forms.py:1047 msgid "Labels for the marker lines" msgstr "" -#: superset/forms.py:1088 +#: superset/forms.py:1110 msgid "SQL" msgstr "" -#: superset/forms.py:1090 +#: superset/forms.py:1112 msgid "This section exposes ways to include snippets of SQL in your query" msgstr "" -#: superset/forms.py:1101 +#: superset/forms.py:1124 msgid "Time Grain" msgstr "" -#: superset/forms.py:1104 -msgid "" -"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" -msgstr "" - -#: superset/forms.py:1139 superset/forms.py:1143 -msgid "Filter 1" -msgstr "" +#~ msgid "Row limit" +#~ msgstr "" -#: superset/forms.py:1148 +#: superset/forms.py:1175 msgid "Super" msgstr "" -#: superset/forms.py:1152 +#: superset/forms.py:1179 msgid "Time" msgstr "" -#: superset/forms.py:1157 +#: superset/forms.py:1184 msgid "Time related form attributes" msgstr "" -#: superset/forms.py:1164 -msgid "CSV File" -msgstr "" - -#: superset/forms.py:1165 -msgid "Select a CSV file to be uploaded to a database." -msgstr "" - -#: superset/forms.py:1169 -msgid "CSV Files Only!" -msgstr "" - -#: superset/forms.py:1171 -msgid "Delimiter" -msgstr "" +#~ msgid "Periods" +#~ msgstr "" -#: superset/forms.py:1172 -msgid "Delimiter used by CSV file (for whitespace use \\s+)." -msgstr "" +#~ msgid "Series" +#~ msgstr "" -#: superset/forms.py:1177 -msgid "Header Row" -msgstr "" +#~ msgid "Entity" +#~ msgstr "" -#: superset/forms.py:1178 +#: superset/forms.py:1205 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:1188 +#: superset/forms.py:1214 msgid "Column Names" msgstr "" -#: superset/forms.py:1189 +#: superset/forms.py:1215 msgid "" "List of comma-separated column names to use if header row not specified " "above. Leave empty if header field populated." msgstr "" -#: superset/forms.py:1198 +#: superset/forms.py:1224 msgid "Index Column" msgstr "" -#: superset/forms.py:1199 +#: superset/forms.py:1225 msgid "" "Column to use as the row labels of the dataframe. Leave empty if no index" " column." msgstr "" -#: superset/forms.py:1207 +#: superset/forms.py:1233 msgid "Squeeze" msgstr "" -#: superset/forms.py:1208 +#: superset/forms.py:1234 msgid "" "Parse the data as a series (specify this option if the data contains only" " one column.)" msgstr "" -#: superset/forms.py:1213 -msgid "Prefix" -msgstr "" - -#: superset/forms.py:1214 -msgid "" -"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " -"X1\")." -msgstr "" +#~ msgid "X Axis Label" +#~ msgstr "" -#: superset/forms.py:1220 +#: superset/forms.py:1246 msgid "Mangle Duplicate Columns" msgstr "" -#: superset/forms.py:1221 +#: superset/forms.py:1247 msgid "Specify duplicate columns as \"X.0, X.1\"." msgstr "" -#: superset/forms.py:1224 -msgid "Skip Initial Space" -msgstr "" - -#: superset/forms.py:1225 -msgid "Skip spaces after delimiter." -msgstr "" - -#: superset/forms.py:1227 -msgid "Skip Rows" -msgstr "" +#~ msgid "Custom HAVING clause" +#~ msgstr "" -#: superset/forms.py:1228 -msgid "Number of rows to skip at start of file." -msgstr "" +#~ msgid "Comparison Period Lag" +#~ msgstr "" -#: superset/forms.py:1234 +#: superset/forms.py:1260 msgid "Rows to Read" msgstr "" -#: superset/forms.py:1235 +#: superset/forms.py:1261 msgid "Number of rows of file to read." msgstr "" -#: superset/forms.py:1239 +#: superset/forms.py:1265 msgid "Skip Blank Lines" msgstr "" -#: superset/forms.py:1240 +#: superset/forms.py:1266 msgid "Skip blank lines rather than interpreting them as NaN values." msgstr "" -#: superset/forms.py:1244 +#: superset/forms.py:1270 msgid "Parse Dates" msgstr "" -#: superset/forms.py:1245 +#: superset/forms.py:1271 msgid "Parse date values." msgstr "" -#: superset/forms.py:1247 +#: superset/forms.py:1273 msgid "Infer Datetime Format" msgstr "" -#: superset/forms.py:1248 +#: superset/forms.py:1274 msgid "Use Pandas to interpret the datetime format automatically." msgstr "" -#: superset/forms.py:1253 -msgid "Day First" -msgstr "" - -#: superset/forms.py:1254 -msgid "Use DD/MM (European/International) date format." -msgstr "" +#~ msgid "Y axis format" +#~ msgstr "" -#: superset/forms.py:1257 +#: superset/forms.py:1283 msgid "Thousands Separator" msgstr "" -#: superset/forms.py:1258 +#: superset/forms.py:1284 msgid "Separator for values in thousands." msgstr "" -#: superset/forms.py:1263 +#: superset/forms.py:1289 msgid "Decimal Character" msgstr "" -#: superset/forms.py:1264 +#: superset/forms.py:1290 msgid "Character to interpret as decimal point." msgstr "" -#: superset/forms.py:1269 +#: superset/forms.py:1295 msgid "Quote Character" msgstr "" -#: superset/forms.py:1270 +#: superset/forms.py:1296 msgid "Character used to denote the start and end of a quoted item." msgstr "" -#: superset/forms.py:1276 +#: superset/forms.py:1302 msgid "Escape Character" msgstr "" -#: superset/forms.py:1277 +#: superset/forms.py:1303 msgid "Character used to escape a quoted item." msgstr "" -#: superset/forms.py:1282 +#: superset/forms.py:1308 msgid "Comment Character" msgstr "" -#: superset/forms.py:1283 +#: superset/forms.py:1309 msgid "Character used to denote the start of a comment." msgstr "" -#: superset/forms.py:1288 +#: superset/forms.py:1314 msgid "Encoding" msgstr "" -#: superset/forms.py:1289 +#: superset/forms.py:1315 msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." msgstr "" -#: superset/forms.py:1294 +#: superset/forms.py:1320 msgid "Error On Bad Lines" msgstr "" -#: superset/forms.py:1295 +#: superset/forms.py:1321 msgid "" "Error on bad lines (e.g. a line with too many commas). If false these bad" " lines will instead be dropped from the resulting dataframe." msgstr "" -#: superset/forms.py:1304 +#: superset/forms.py:1330 msgid "Table Name" msgstr "" -#: superset/forms.py:1305 +#: superset/forms.py:1331 msgid "Name of table to be createdfrom csv data." msgstr "" -#: superset/forms.py:1309 +#: superset/forms.py:1335 msgid "Database URI" msgstr "" -#: superset/forms.py:1310 +#: superset/forms.py:1336 msgid "URI of database in which to add above table." msgstr "" -#: superset/connectors/sqla/views.py:199 superset/forms.py:1314 +#: superset/connectors/sqla/views.py:199 superset/forms.py:1340 msgid "Schema" msgstr "" -#: superset/forms.py:1315 +#: superset/forms.py:1341 msgid "Specify a schema (if database flavour supports this)." msgstr "" -#: superset/forms.py:1320 +#: superset/forms.py:1346 msgid "Table Exists" msgstr "" -#: superset/forms.py:1321 +#: superset/forms.py:1347 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:1327 +#: superset/forms.py:1353 msgid "Fail" msgstr "" -#: superset/forms.py:1328 -msgid "Replace" -msgstr "" - -#: superset/forms.py:1329 -msgid "Append" -msgstr "" +#~ msgid "Font Size From" +#~ msgstr "" -#: superset/forms.py:1331 +#: superset/forms.py:1357 msgid "Dataframe Index" msgstr "" -#: superset/forms.py:1332 +#: superset/forms.py:1358 msgid "Write dataframe index as a column." msgstr "" -#: superset/forms.py:1334 +#: superset/forms.py:1360 msgid "Column Label(s)" msgstr "" -#: superset/forms.py:1335 +#: superset/forms.py:1361 msgid "" "Column label for index column(s). If None is given and Dataframe Index is" " True, Index Names are used." msgstr "" -#: superset/forms.py:1342 +#: superset/forms.py:1368 msgid "Chunksize" msgstr "" -#: superset/forms.py:1343 +#: superset/forms.py:1369 msgid "" "If empty, all rows will be written at once. Otherwise, rows will be " "written in batches of this many rows at a time." @@ -1636,57 +1557,31 @@ msgstr "" msgid "Sankey" msgstr "" -#: superset/viz.py:1217 -msgid "Directed Force Layout" -msgstr "" - -#: superset/viz.py:1238 -msgid "Country Map" -msgstr "" - -#: superset/viz.py:1267 -msgid "World Map" -msgstr "" +#~ msgid "Time Shift" +#~ msgstr "" -#: superset/viz.py:1317 -msgid "Filters" -msgstr "" +#~ msgid "Subheader" +#~ msgstr "" #: superset/viz.py:1352 msgid "iFrame" msgstr "" -#: superset/viz.py:1369 -msgid "Parallel Coordinates" -msgstr "" - -#: superset/viz.py:1394 -msgid "Heatmap" -msgstr "" +#~ msgid "Base layer map style" +#~ msgstr "" #: superset/viz.py:1445 msgid "Horizon Charts" msgstr "" -#: superset/viz.py:1456 -msgid "Mapbox" -msgstr "" - -#: superset/connectors/druid/models.py:934 -msgid "No data was returned." -msgstr "" - -#: superset/connectors/druid/views.py:37 superset/connectors/sqla/views.py:74 -msgid "Column" -msgstr "" +#~ msgid "Point Radius" +#~ msgstr "" -#: superset/connectors/druid/views.py:38 superset/connectors/druid/views.py:97 -#: superset/connectors/sqla/views.py:120 -msgid "Type" -msgstr "" +#~ msgid "Point Radius Unit" +#~ msgstr "" -#: superset/connectors/druid/views.py:39 superset/views/core.py:310 -#: superset/views/core.py:359 +#: superset/connectors/druid/views.py:39 superset/views/core.py:481 +#: superset/views/core.py:530 msgid "Datasource" msgstr "" @@ -1729,7 +1624,7 @@ msgstr "" #: superset/connectors/druid/views.py:95 superset/connectors/druid/views.py:205 #: superset/connectors/sqla/views.py:76 superset/connectors/sqla/views.py:118 -#: superset/views/core.py:360 +#: superset/views/core.py:531 msgid "Description" msgstr "" @@ -1738,7 +1633,7 @@ msgstr "" msgid "Verbose Name" msgstr "" -#: superset/connectors/druid/views.py:98 superset/views/core.py:533 +#: superset/connectors/druid/views.py:98 superset/views/core.py:704 msgid "JSON" msgstr "" @@ -1767,124 +1662,8 @@ msgstr "" msgid "Broker Host" msgstr "" -#: superset/connectors/druid/views.py:129 -msgid "Broker Port" -msgstr "" - -#: superset/connectors/druid/views.py:130 -msgid "Broker Endpoint" -msgstr "" - -#: superset/connectors/druid/views.py:173 superset/connectors/sqla/views.py:156 -msgid "" -"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'" -msgstr "" - -#: superset/connectors/druid/views.py:181 superset/connectors/sqla/views.py:164 -msgid "Timezone offset (in hours) for this datasource" -msgstr "" - -#: superset/connectors/druid/views.py:185 -msgid "" -"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" -msgstr "" - -#: superset/connectors/druid/views.py:192 superset/connectors/sqla/views.py:186 -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 " -"fly" -msgstr "" - -#: superset/connectors/druid/views.py:196 superset/connectors/sqla/views.py:200 -msgid "" -"Redirects to this endpoint when clicking on the datasource from the " -"datasource list" -msgstr "" - -#: superset/connectors/druid/views.py:202 superset/connectors/sqla/views.py:193 -msgid "Associated Slices" -msgstr "" - -#: superset/connectors/druid/views.py:203 -msgid "Data Source" -msgstr "" - -#: superset/connectors/druid/views.py:206 -msgid "Owner" -msgstr "" - -#: superset/connectors/druid/views.py:207 -msgid "Is Hidden" -msgstr "" - -#: superset/connectors/druid/views.py:208 superset/connectors/sqla/views.py:198 -msgid "Enable Filter Select" -msgstr "" - -#: superset/connectors/druid/views.py:209 -msgid "Default Endpoint" -msgstr "" - -#: superset/connectors/druid/views.py:210 -msgid "Time Offset" -msgstr "" - -#: superset/connectors/druid/views.py:211 superset/connectors/sqla/views.py:204 -#: superset/views/core.py:245 superset/views/core.py:356 -msgid "Cache Timeout" -msgstr "" - -#: superset/connectors/sqla/models.py:388 -msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" -msgstr "" - -#: superset/connectors/sqla/models.py:393 -msgid "Metric '{}' is not valid" -msgstr "" - -#: superset/connectors/sqla/views.py:39 -msgid "" -"Whether to make this column available as a [Time Granularity] option, " -"column has to be DATETIME or DATETIME-like" -msgstr "" - -#: superset/connectors/sqla/views.py:46 -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 " -"most case users should not need to alter this." -msgstr "" - -#: superset/connectors/sqla/views.py:79 superset/connectors/sqla/views.py:122 -#: superset/connectors/sqla/views.py:194 superset/views/core.py:366 -msgid "Table" -msgstr "" - -#: superset/connectors/sqla/views.py:84 -msgid "Expression" -msgstr "" - -#: superset/connectors/sqla/views.py:85 -msgid "Is temporal" -msgstr "" - -#: superset/connectors/sqla/views.py:86 -msgid "Datetime Format" -msgstr "" - -#: superset/connectors/sqla/views.py:87 -msgid "Database Expression" -msgstr "" +#~ msgid "Filter 1" +#~ msgstr "" #: superset/connectors/sqla/views.py:121 msgid "SQL Expression" @@ -1919,11 +1698,11 @@ msgstr "" msgid "Changed By" msgstr "" -#: superset/connectors/sqla/views.py:196 superset/views/core.py:241 +#: superset/connectors/sqla/views.py:196 superset/views/core.py:248 msgid "Database" msgstr "" -#: superset/connectors/sqla/views.py:197 superset/views/core.py:243 +#: superset/connectors/sqla/views.py:197 superset/views/core.py:250 msgid "Last Changed" msgstr "" @@ -1949,13 +1728,8 @@ msgstr "" msgid "Login" msgstr "" -#: superset/templates/superset/import_dashboards.html:11 -msgid "Import" -msgstr "" - -#: superset/templates/superset/request_access.html:2 -msgid "No Access!" -msgstr "" +#~ msgid "Breakdowns" +#~ msgstr "" #: superset/templates/superset/request_access.html:7 #, python-format @@ -1974,97 +1748,100 @@ msgstr "" msgid "Welcome!" msgstr "" -#: superset/templates/superset/welcome.html:20 superset/views/core.py:358 -msgid "Dashboards" -msgstr "" - -#: superset/templates/superset/models/database/macros.html:4 -msgid "Test Connection" -msgstr "" +#~ msgid "Hierarchy" +#~ msgstr "" -#: superset/views/core.py:209 +#: superset/views/core.py:216 msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/views/core.py:210 +#: superset/views/core.py:217 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 " "(<~1 minute)" msgstr "" -#: superset/views/core.py:214 +#: superset/views/core.py:221 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." msgstr "" -#: superset/views/core.py:218 +#: superset/views/core.py:225 msgid "Allow CREATE TABLE AS option in SQL Lab" msgstr "" -#: superset/views/core.py:219 +#: superset/views/core.py:226 msgid "" "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" " SQL Lab" msgstr "" -#: superset/views/core.py:223 +#: superset/views/core.py:230 msgid "" "When allowing CREATE TABLE AS option in SQL Lab, this option forces the " "table to be created in this schema" msgstr "" -#: superset/views/core.py:237 +#: superset/views/core.py:244 msgid "Expose in SQL Lab" msgstr "" -#: superset/views/core.py:238 +#: superset/views/core.py:245 msgid "Allow CREATE TABLE AS" msgstr "" -#: superset/views/core.py:239 +#: superset/views/core.py:246 msgid "Allow DML" msgstr "" -#: superset/views/core.py:240 +#: superset/views/core.py:247 msgid "CTAS Schema" msgstr "" -#: superset/views/core.py:242 superset/views/core.py:357 -#: superset/views/core.py:453 superset/views/core.py:517 +#: superset/views/core.py:249 superset/views/core.py:528 +#: superset/views/core.py:624 superset/views/core.py:688 msgid "Creator" msgstr "" -#: superset/views/core.py:244 +#: superset/views/core.py:251 msgid "SQLAlchemy URI" msgstr "" -#: superset/views/core.py:246 +#: superset/views/core.py:253 msgid "Extra" msgstr "" -#: superset/views/core.py:307 superset/views/core.py:530 +#: superset/views/core.py:308 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views/core.py:394 +msgid "CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"" +msgstr "" + +#: superset/views/core.py:478 superset/views/core.py:701 msgid "User" msgstr "" -#: superset/views/core.py:308 +#: superset/views/core.py:479 msgid "User Roles" msgstr "" -#: superset/views/core.py:309 +#: superset/views/core.py:480 msgid "Database URL" msgstr "" -#: superset/views/core.py:311 +#: superset/views/core.py:482 msgid "Roles to grant" msgstr "" -#: superset/views/core.py:312 +#: superset/views/core.py:483 msgid "Created On" msgstr "" -#: superset/views/core.py:345 +#: superset/views/core.py:516 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -2072,111 +1849,103 @@ msgid "" "parameters." msgstr "" -#: superset/views/core.py:350 +#: superset/views/core.py:521 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/views/core.py:361 +#: superset/views/core.py:532 msgid "Last Modified" msgstr "" -#: superset/views/core.py:362 superset/views/core.py:452 -msgid "Owners" -msgstr "" - -#: superset/views/core.py:363 -msgid "Parameters" -msgstr "" - -#: superset/views/core.py:364 superset/views/core.py:400 -msgid "Slice" -msgstr "" - -#: superset/views/core.py:365 -msgid "Name" -msgstr "" +#~ msgid "Tooltip" +#~ msgstr "" -#: superset/views/core.py:367 -msgid "Visualization Type" -msgstr "" +#~ msgid "Query" +#~ msgstr "" -#: superset/views/core.py:425 +#: superset/views/core.py:596 msgid "" "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" msgstr "" -#: superset/views/core.py:430 +#: superset/views/core.py:601 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: superset/views/core.py:434 +#: superset/views/core.py:605 msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/views/core.py:435 +#: superset/views/core.py:606 msgid "" "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." msgstr "" -#: superset/views/core.py:440 +#: superset/views/core.py:611 msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/views/core.py:448 superset/views/core.py:515 +#: superset/views/core.py:619 superset/views/core.py:686 msgid "Dashboard" msgstr "" -#: superset/views/core.py:449 superset/views/core.py:516 +#: superset/views/core.py:620 superset/views/core.py:687 msgid "Title" msgstr "" -#: superset/views/core.py:450 +#: superset/views/core.py:621 msgid "Slug" msgstr "" -#: superset/views/core.py:451 +#: superset/views/core.py:622 msgid "Slices" msgstr "" -#: superset/views/core.py:454 superset/views/core.py:518 +#: superset/views/core.py:625 superset/views/core.py:689 msgid "Modified" msgstr "" -#: superset/views/core.py:455 +#: superset/views/core.py:626 msgid "Position JSON" msgstr "" -#: superset/views/core.py:456 +#: superset/views/core.py:627 msgid "CSS" msgstr "" -#: superset/views/core.py:457 +#: superset/views/core.py:628 msgid "JSON Metadata" msgstr "" -#: superset/views/core.py:458 +#: superset/views/core.py:629 msgid "Underlying Tables" msgstr "" -#: superset/views/core.py:531 +#: superset/views/core.py:702 msgid "Action" msgstr "" -#: superset/views/core.py:532 +#: superset/views/core.py:703 msgid "dttm" msgstr "" -#: superset/views/core.py:2283 +#: superset/views/core.py:2454 msgid "SQL Editor" msgstr "" -#: superset/views/core.py:2292 +#: superset/views/core.py:2463 msgid "Query Search" msgstr "" +#~ msgid "Import" +#~ msgstr "" + +#~ msgid "Welcome!" +#~ msgstr "" + diff --git a/superset/translations/fr/LC_MESSAGES/messages.mo b/superset/translations/fr/LC_MESSAGES/messages.mo index 663117a12a8329e7d4a14566008f750ac1833e2c..ae15668527f9952efda33d9ba1349e28fdba5c82 100644 GIT binary patch delta 3755 zcmeIy|8LdR9mnx=E2XtmXe-}D7#C`387|V zGsTTKHfgtdAg(GhW+pCbGFKOqO%m{jvG^q+nrvvqY%ts$+i(etpt$b&x}US`*Zl!D zz4vk6=X37oob&p8dHvO*KSc&Vs+w@v@b@gA*?h{2RsHYp#?8j?Z@%EG6idpCnTQoQ z4QF62HlW6B$8Fe+`|%YV#pRQXsl+o#mpPBO88c}9PNQ(*a$}}&paSVKL1#VkZ&o@t z;!V^YsBw4WE!cwwShXk6&sPEW+Q4`2Wn&A!22 z4P1$9a1(0fkD;P`8i~-njGE{)>gv7g>a(bYUqCJVlB=(}`U@Q7V@g<_22967^f-aK z9$AZNMD3`>)$OQ>cA%nuz&YSdpe|9))p^v$_PPF1RANV_kiRB+o{naG5w(*)pc1)+ znjk<7ny?gAPsZgq4V6ec>UUw(24bj%@5LAJF;o&uh)o+=ft|RalKeN(_z@ktcIQ!v z{0nu$;wrzcaLz?7V6k%vUcK#e{+)INrG|?}R&6*RK z!*}omwz8^w10=vUhpBfE%US#c-@-Sh8?zgSXBcx5KSL$(Yx0(-kuLKd&c{p0znRR9 zqsM))mWHC4w)AE7ZqN6{Sr1cy*j9>w+eGgNecLrwgtJAT#GGSc@9B1-IeX zaX-F@qZpd!C-o*Op%0Oe&7ZN9`AvWeqibJ=x@NPS3s6xuIa^Rkw7cV5QFr-$$PI3G zp^|tQHPN?G2@JXZ!>FA>I8D$0S{i!u zbs=L+I^?hL7_t^~982&FYDZ^LH{m%~Uq&T%1$D2CquzYwjsBZ&F6zzqeQd|IO@%j~ zc^pUd{NJFV6AUl)qa4Nc)X$-!`xrIxU)}M`uD*`CB>#36b0aC*a@2yWP{(JXem@VV z;sVqLzJ@hwY^I?B-Dny^!FV*0%X((ne;ez@e%^gDP?5Wueur(4+XH9Eor#;itJR=fL3@~tg-n7PYnXH#Kt;tv}ZtMED+KqKH?2Y~! z`*GbJD{>$?6pUi&M%54 z?7{R*d!Tvq#4Y{(882(^TydAZeb3yo=$>RY*i|^?x>dibO7=&YZd=Yv=YySIINcku z&*mHL!}*jww&vDbk})q6%qD{a>2M-z%fIz#TPmCmXOn4DNXY-rKyJWv=Hh%3J-Kuy zYYH>?-@&`1-b1F#%Mf8Qk??xi_*la}TVz}I50Ab2z2kwg;l~#S%A#?P0c4o4tA<9$ zp4>7gV2}Kuw zGuqS~YznPjx^hvdDHJN(x}~AR+Y`-jR literal 39484 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 diff --git a/superset/translations/fr/LC_MESSAGES/messages.po b/superset/translations/fr/LC_MESSAGES/messages.po index ab104260b5b5..742af686bd28 100644 --- a/superset/translations/fr/LC_MESSAGES/messages.po +++ b/superset/translations/fr/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-06-01 09:20-0400\n" -"PO-Revision-Date: 2017-06-01 09:21-0400\n" +"POT-Creation-Date: 2017-06-04 20:38+0200\n" +"PO-Revision-Date: 2016-05-01 23:07-0700\n" "Last-Translator: FULL NAME \n" "Language: fr\n" "Language-Team: fr \n" @@ -22,7 +22,7 @@ msgstr "" #: superset/db_engine_specs.py:269 superset/db_engine_specs.py:317 #: superset/db_engine_specs.py:362 superset/db_engine_specs.py:770 #: superset/db_engine_specs.py:806 superset/db_engine_specs.py:838 -#: superset/db_engine_specs.py:884 superset/forms.py:443 +#: superset/db_engine_specs.py:884 msgid "Time Column" msgstr "" @@ -43,7 +43,6 @@ msgstr "" #: superset/db_engine_specs.py:323 superset/db_engine_specs.py:367 #: superset/db_engine_specs.py:779 superset/db_engine_specs.py:809 #: superset/db_engine_specs.py:843 superset/db_engine_specs.py:891 -#: superset/forms.py:387 superset/forms.py:401 msgid "hour" msgstr "" @@ -51,7 +50,7 @@ msgstr "" #: superset/db_engine_specs.py:270 superset/db_engine_specs.py:325 #: superset/db_engine_specs.py:369 superset/db_engine_specs.py:781 #: superset/db_engine_specs.py:811 superset/db_engine_specs.py:845 -#: superset/db_engine_specs.py:893 superset/forms.py:388 superset/forms.py:402 +#: superset/db_engine_specs.py:893 msgid "day" msgstr "" @@ -59,7 +58,6 @@ msgstr "" #: superset/db_engine_specs.py:271 superset/db_engine_specs.py:326 #: superset/db_engine_specs.py:371 superset/db_engine_specs.py:783 #: superset/db_engine_specs.py:813 superset/db_engine_specs.py:847 -#: superset/forms.py:373 superset/forms.py:389 superset/forms.py:403 msgid "week" msgstr "" @@ -67,8 +65,7 @@ msgstr "" #: superset/db_engine_specs.py:273 superset/db_engine_specs.py:328 #: superset/db_engine_specs.py:373 superset/db_engine_specs.py:785 #: superset/db_engine_specs.py:815 superset/db_engine_specs.py:849 -#: superset/db_engine_specs.py:895 superset/forms.py:376 superset/forms.py:390 -#: superset/forms.py:404 +#: superset/db_engine_specs.py:895 msgid "month" msgstr "" @@ -82,7 +79,6 @@ msgstr "" #: superset/db_engine_specs.py:202 superset/db_engine_specs.py:252 #: superset/db_engine_specs.py:332 superset/db_engine_specs.py:789 #: superset/db_engine_specs.py:819 superset/db_engine_specs.py:899 -#: superset/forms.py:391 msgid "year" msgstr "" @@ -91,7 +87,6 @@ msgid "week_start_monday" msgstr "" #: superset/db_engine_specs.py:377 superset/db_engine_specs.py:853 -#: superset/forms.py:375 msgid "week_ending_saturday" msgstr "" @@ -111,186 +106,194 @@ msgstr "" msgid "10 minute" msgstr "" -#: superset/forms.py:37 -msgid "D3 format syntax https://github.com/d3/d3-format" +#: superset/viz.py:311 +msgid "Table View" msgstr "" -#: superset/forms.py:150 -msgid "Viz" +#: superset/viz.py:364 +msgid "Pivot Table" msgstr "" -#: superset/forms.py:153 -msgid "The type of visualization to display" +#: superset/viz.py:413 +msgid "Markup" msgstr "" -#: superset/forms.py:156 -msgid "Metrics" +#: superset/viz.py:432 +msgid "Separator" msgstr "" -#: superset/forms.py:159 superset/forms.py:164 -msgid "One or many metrics to display" +#: superset/viz.py:448 +msgid "Word Cloud" msgstr "" -#: superset/forms.py:162 -msgid "Ordering" +#: superset/viz.py:471 +msgid "Treemap" msgstr "" -#: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:117 -#: superset/forms.py:167 -msgid "Metric" +#: superset/viz.py:497 +msgid "Calendar Heatmap" msgstr "" -#: superset/forms.py:170 -msgid "Choose the metric" +#: superset/viz.py:555 +msgid "Box Plot" msgstr "" -#: superset/forms.py:173 -msgid "Chart Style" +#: superset/viz.py:644 +msgid "Bubble Chart" msgstr "" -#: superset/forms.py:175 -msgid "stack" +#: superset/viz.py:693 +msgid "Bullet Chart" msgstr "" -#: superset/forms.py:176 -msgid "stream" +#: superset/viz.py:742 +msgid "Big Number with Trendline" msgstr "" -#: superset/forms.py:177 -msgid "expand" +#: superset/viz.py:771 +msgid "Big Number" msgstr "" -#: superset/forms.py:183 -msgid "Color Scheme" +#: superset/viz.py:798 +msgid "Time Series - Line Chart" msgstr "" -#: superset/forms.py:185 -msgid "fire" +#: superset/viz.py:925 +msgid "Time Series - Dual Axis Line Chart" msgstr "" -#: superset/forms.py:186 -msgid "blue_white_yellow" +#: superset/viz.py:1000 +msgid "Time Series - Bar Chart" msgstr "" -#: superset/forms.py:187 -msgid "white_black" +#: superset/viz.py:1008 +msgid "Time Series - Percent Change" msgstr "" -#: superset/forms.py:188 -msgid "black_white" +#: superset/viz.py:1016 +msgid "Time Series - Stacked" msgstr "" -#: superset/forms.py:194 -msgid "Normalize Across" +#: superset/viz.py:1025 +msgid "Distribution - NVD3 - Pie Chart" msgstr "" -#: superset/forms.py:196 -msgid "heatmap" +#: superset/viz.py:1043 +msgid "Histogram" msgstr "" -#: superset/forms.py:197 -msgid "x" +#: superset/viz.py:1068 +msgid "Distribution - Bar Chart" msgstr "" -#: superset/forms.py:198 -msgid "y" +#: superset/viz.py:1135 +msgid "Sunburst" msgstr "" -#: superset/forms.py:201 -msgid "" -"Color will be rendered based on a ratio of the cell against the sum of " -"across this criteria" +#: superset/viz.py:1168 +msgid "Sankey" msgstr "" -#: superset/forms.py:207 -msgid "Color Scale" +#: superset/viz.py:1217 +msgid "Directed Force Layout" msgstr "" -#: superset/forms.py:209 -msgid "series" +#: superset/viz.py:1238 +msgid "Country Map" msgstr "" -#: superset/forms.py:210 -msgid "overall" +#: superset/viz.py:1267 +msgid "World Map" msgstr "" -#: superset/forms.py:211 -msgid "change" +#: superset/viz.py:1317 +msgid "Filters" msgstr "" -#: superset/forms.py:214 -msgid "Defines how the color are attributed." +#: superset/viz.py:1352 +msgid "iFrame" msgstr "" -#: superset/forms.py:217 -msgid "Rendering" +#: superset/viz.py:1369 +msgid "Parallel Coordinates" msgstr "" -#: superset/forms.py:219 -msgid "pixelated (Sharp)" +#: superset/viz.py:1394 +msgid "Heatmap" msgstr "" -#: superset/forms.py:220 -msgid "auto (Smooth)" +#: superset/viz.py:1445 +msgid "Horizon Charts" msgstr "" -#: superset/forms.py:223 +#: superset/viz.py:1456 +msgid "Mapbox" +msgstr "" + +#: superset/connectors/druid/models.py:934 +msgid "No data was returned." +msgstr "" + +#: superset/forms.py:225 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "" -#: superset/forms.py:228 +#: superset/forms.py:230 msgid "XScale Interval" msgstr "" -#: superset/forms.py:231 -msgid "Number of step to take between ticks when printing the x scale" +#: superset/connectors/druid/views.py:39 superset/views/core.py:306 +#: superset/views/core.py:355 +msgid "Datasource" msgstr "" -#: superset/forms.py:236 +#: superset/forms.py:238 msgid "YScale Interval" msgstr "" -#: superset/forms.py:239 +#: superset/forms.py:241 msgid "Number of step to take between ticks when printing the y scale" msgstr "" -#: superset/forms.py:244 +#: superset/forms.py:246 msgid "Stacked Bars" msgstr "" -#: superset/forms.py:249 +#: superset/forms.py:251 msgid "Show Markers" msgstr "" -#: superset/forms.py:256 +#: superset/forms.py:258 msgid "Bar Values" msgstr "" -#: superset/forms.py:261 +#: superset/forms.py:263 msgid "Sort Bars" msgstr "" -#: superset/forms.py:263 +#: superset/forms.py:265 msgid "Sort bars by x labels." msgstr "" -#: superset/forms.py:266 +#: superset/forms.py:268 msgid "Extra Controls" msgstr "" -#: superset/forms.py:268 +#: superset/forms.py:270 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" -#: superset/forms.py:274 -msgid "Reduce X ticks" +#: superset/connectors/druid/views.py:95 superset/connectors/druid/views.py:205 +#: superset/connectors/sqla/views.py:76 superset/connectors/sqla/views.py:118 +#: superset/views/core.py:356 +msgid "Description" msgstr "" -#: superset/forms.py:276 +#: superset/forms.py:278 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 " @@ -298,1251 +301,1169 @@ msgid "" "scroll." msgstr "" -#: superset/forms.py:284 -msgid "Include Series" +#: superset/connectors/druid/views.py:98 superset/views/core.py:529 +msgid "JSON" msgstr "" -#: superset/forms.py:286 +#: superset/forms.py:288 msgid "Include series name as an axis" msgstr "" -#: superset/forms.py:289 -msgid "Color Metric" +#: superset/connectors/druid/views.py:124 +#: superset/connectors/druid/views.py:204 +msgid "Cluster" +msgstr "" + +#: superset/connectors/druid/views.py:125 +msgid "Coordinator Host" msgstr "" -#: superset/forms.py:292 -msgid "A metric to use for color" +#: superset/connectors/druid/views.py:126 +msgid "Coordinator Port" msgstr "" -#: superset/forms.py:295 -msgid "Country Field Type" +#: superset/connectors/druid/views.py:127 +msgid "Coordinator Endpoint" msgstr "" -#: superset/forms.py:298 -msgid "Full name" +#: superset/connectors/druid/views.py:128 +msgid "Broker Host" msgstr "" -#: superset/forms.py:299 -msgid "code International Olympic Committee (cioc)" +#: superset/connectors/druid/views.py:129 +msgid "Broker Port" msgstr "" -#: superset/forms.py:300 -msgid "code ISO 3166-1 alpha-2 (cca2)" +#: superset/connectors/druid/views.py:130 +msgid "Broker Endpoint" +msgstr "" + +#: superset/connectors/druid/views.py:173 superset/connectors/sqla/views.py:156 +msgid "" +"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'" msgstr "" -#: superset/forms.py:301 -msgid "code ISO 3166-1 alpha-3 (cca3)" +#: superset/connectors/druid/views.py:181 superset/connectors/sqla/views.py:164 +msgid "Timezone offset (in hours) for this datasource" msgstr "" -#: superset/forms.py:303 +#: superset/connectors/druid/views.py:185 msgid "" -"The country code standard that Superset should expect to find in the " -"[country] column" +"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" msgstr "" -#: superset/forms.py:308 -msgid "Group by" +#: superset/connectors/druid/views.py:192 superset/connectors/sqla/views.py:186 +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 " +"fly" msgstr "" -#: superset/forms.py:310 -msgid "One or many fields to group by" +#: superset/connectors/druid/views.py:196 superset/connectors/sqla/views.py:200 +msgid "" +"Redirects to this endpoint when clicking on the datasource from the " +"datasource list" msgstr "" -#: superset/forms.py:313 superset/forms.py:318 -msgid "Columns" +#: superset/connectors/druid/views.py:202 superset/connectors/sqla/views.py:193 +msgid "Associated Slices" msgstr "" -#: superset/forms.py:315 -msgid "One or many fields to pivot as columns" +#: superset/connectors/druid/views.py:203 +msgid "Data Source" msgstr "" -#: superset/forms.py:320 superset/forms.py:326 superset/forms.py:332 -msgid "Columns to display" +#: superset/connectors/druid/views.py:206 +msgid "Owner" msgstr "" -#: superset/forms.py:323 -msgid "X" +#: superset/connectors/druid/views.py:207 +msgid "Is Hidden" msgstr "" -#: superset/forms.py:329 -msgid "Y" +#: superset/connectors/druid/views.py:208 superset/connectors/sqla/views.py:198 +msgid "Enable Filter Select" msgstr "" -#: superset/forms.py:335 -msgid "Origin" +#: superset/connectors/druid/views.py:209 +msgid "Default Endpoint" msgstr "" -#: superset/forms.py:337 -msgid "default" +#: superset/connectors/druid/views.py:210 +msgid "Time Offset" msgstr "" -#: superset/forms.py:338 superset/forms.py:507 -msgid "now" +#: superset/connectors/druid/views.py:211 superset/connectors/sqla/views.py:204 +#: superset/views/core.py:242 superset/views/core.py:352 +msgid "Cache Timeout" msgstr "" -#: superset/forms.py:341 +#: superset/connectors/sqla/models.py:388 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "'now', 'sunday' or '1970-01-01'" msgstr "" -#: superset/forms.py:346 -msgid "Bottom Margin" +#: superset/connectors/sqla/models.py:393 +msgid "Metric '{}' is not valid" msgstr "" -#: superset/forms.py:349 +#: superset/forms.py:352 msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/forms.py:354 +#: superset/forms.py:357 msgid "Page Length" msgstr "" -#: superset/forms.py:357 -msgid "Number of rows per page, 0 means no pagination" +#: superset/connectors/sqla/views.py:79 superset/connectors/sqla/views.py:122 +#: superset/connectors/sqla/views.py:194 superset/views/core.py:362 +msgid "Table" msgstr "" -#: superset/forms.py:361 +#: superset/forms.py:364 msgid "Time Granularity" msgstr "" -#: superset/forms.py:364 +#: superset/forms.py:367 msgid "all" msgstr "" -#: superset/forms.py:365 +#: superset/forms.py:368 msgid "5 seconds" msgstr "" -#: superset/forms.py:366 +#: superset/forms.py:369 msgid "30 seconds" msgstr "" -#: superset/forms.py:367 +#: superset/forms.py:370 msgid "1 minute" msgstr "" -#: superset/forms.py:368 -msgid "5 minutes" -msgstr "" - -#: superset/forms.py:369 -msgid "1 hour" +#: superset/connectors/sqla/views.py:165 +msgid "Name of the table that exists in the source database" msgstr "" -#: superset/forms.py:370 -msgid "6 hour" +#: superset/connectors/sqla/views.py:167 +msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" msgstr "" -#: superset/forms.py:371 -msgid "1 day" +#: superset/connectors/sqla/views.py:173 +msgid "" +"This fields acts a Superset view, meaning that Superset will run a query " +"against this string as a subquery." msgstr "" -#: superset/forms.py:372 -msgid "7 days" +#: superset/connectors/sqla/views.py:177 +msgid "" +"Predicate applied when fetching distinct value to populate the filter " +"control component. Supports jinja template syntax. Applies only when " +"`Enable Filter Select` is on." msgstr "" -#: superset/forms.py:374 -msgid "week_starting_sunday" +#: superset/connectors/sqla/views.py:183 +msgid "Redirects to this endpoint when clicking on the table from the table list" msgstr "" -#: superset/forms.py:378 -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'" +#: superset/connectors/sqla/views.py:195 +msgid "Changed By" msgstr "" -#: superset/forms.py:384 -msgid "Domain" +#: superset/connectors/sqla/views.py:196 superset/views/core.py:238 +msgid "Database" msgstr "" -#: superset/forms.py:393 -msgid "The time unit used for the grouping of blocks" +#: superset/connectors/sqla/views.py:197 superset/views/core.py:240 +msgid "Last Changed" msgstr "" -#: superset/forms.py:397 -msgid "Subdomain" +#: superset/connectors/sqla/views.py:199 +msgid "Schema" msgstr "" -#: superset/forms.py:400 superset/forms.py:751 -msgid "min" +#: superset/connectors/sqla/views.py:203 +msgid "Offset" msgstr "" -#: superset/forms.py:406 +#: superset/connectors/sqla/views.py:236 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/forms.py:411 +#: superset/forms.py:418 msgid "Link Length" msgstr "" -#: superset/forms.py:423 +#: superset/forms.py:430 msgid "Link length in the force layout" msgstr "" -#: superset/forms.py:426 +#: superset/forms.py:433 msgid "Charge" msgstr "" -#: superset/forms.py:440 -msgid "Charge in the force layout" -msgstr "" - -#: superset/forms.py:446 -msgid "" -"The time column for the visualization. Note that you can define arbitrary" -" expression that return a DATETIME column in the table editor. Also note " -"that the filter below is applied against this column or expression" +#: superset/templates/superset/request_access.html:2 +msgid "No Access!" msgstr "" -#: superset/forms.py:454 +#: superset/forms.py:461 msgid "Resample Rule" msgstr "" -#: superset/forms.py:457 +#: superset/forms.py:464 msgid "1T" msgstr "" -#: superset/forms.py:458 +#: superset/forms.py:465 msgid "1H" msgstr "" -#: superset/forms.py:459 -msgid "1D" -msgstr "" - -#: superset/forms.py:460 -msgid "7D" -msgstr "" - -#: superset/forms.py:461 -msgid "1M" -msgstr "" - -#: superset/forms.py:462 -msgid "1AS" +#: superset/templates/superset/models/database/macros.html:4 +msgid "Test Connection" msgstr "" -#: superset/forms.py:464 -msgid "Pandas resample rule" +#: superset/views/core.py:206 +msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/forms.py:467 -msgid "Resample How" +#: superset/views/core.py:207 +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 " +"(<~1 minute)" msgstr "" -#: superset/forms.py:471 superset/forms.py:750 -msgid "mean" +#: superset/views/core.py:211 +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." msgstr "" -#: superset/forms.py:472 superset/forms.py:749 -msgid "sum" +#: superset/views/core.py:215 +msgid "Allow CREATE TABLE AS option in SQL Lab" msgstr "" -#: superset/forms.py:473 superset/forms.py:753 -msgid "median" +#: superset/views/core.py:216 +msgid "" +"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" +" SQL Lab" msgstr "" -#: superset/forms.py:475 -msgid "Pandas resample how" +#: superset/views/core.py:220 +msgid "" +"When allowing CREATE TABLE AS option in SQL Lab, this option forces the " +"table to be created in this schema" msgstr "" -#: superset/forms.py:478 -msgid "Resample Fill Method" +#: superset/views/core.py:234 +msgid "Expose in SQL Lab" msgstr "" -#: superset/forms.py:482 -msgid "ffill" +#: superset/views/core.py:235 +msgid "Allow CREATE TABLE AS" msgstr "" -#: superset/forms.py:483 -msgid "bfill" +#: superset/views/core.py:236 +msgid "Allow DML" msgstr "" -#: superset/forms.py:485 -msgid "Pandas resample fill method" +#: superset/views/core.py:237 +msgid "CTAS Schema" msgstr "" -#: superset/forms.py:488 -msgid "Since" +#: superset/views/core.py:239 superset/views/core.py:353 +#: superset/views/core.py:449 superset/views/core.py:513 +msgid "Creator" msgstr "" -#: superset/forms.py:491 -msgid "1 hour ago" +#: superset/views/core.py:241 +msgid "SQLAlchemy URI" msgstr "" -#: superset/forms.py:492 -msgid "12 hours ago" +#: superset/views/core.py:243 +msgid "Extra" msgstr "" -#: superset/forms.py:493 superset/forms.py:508 -msgid "1 day ago" +#: superset/views/core.py:303 superset/views/core.py:526 +msgid "User" msgstr "" -#: superset/forms.py:494 superset/forms.py:509 -msgid "7 days ago" +#: superset/views/core.py:304 +msgid "User Roles" msgstr "" -#: superset/forms.py:495 superset/forms.py:510 -msgid "28 days ago" +#: superset/views/core.py:305 +msgid "Database URL" msgstr "" -#: superset/forms.py:496 superset/forms.py:511 -msgid "90 days ago" +#: superset/views/core.py:307 +msgid "Roles to grant" msgstr "" -#: superset/forms.py:497 superset/forms.py:512 -msgid "1 year ago" +#: superset/views/core.py:308 +msgid "Created On" msgstr "" -#: superset/forms.py:499 +#: superset/views/core.py:341 msgid "" "Timestamp from filter. This supports free form typing and natural " "language as in '1 day ago', '28 days' or '3 years'" msgstr "" -#: superset/forms.py:504 -msgid "Until" +#: superset/views/core.py:346 +msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/forms.py:516 -msgid "Max Bubble Size" +#: superset/views/core.py:354 +msgid "Dashboards" msgstr "" -#: superset/forms.py:529 -msgid "Whisker/outlier options" +#: superset/views/core.py:357 +msgid "Last Modified" msgstr "" -#: superset/forms.py:531 -msgid "Determines how whiskers and outliers are calculated." +#: superset/views/core.py:358 superset/views/core.py:448 +msgid "Owners" msgstr "" -#: superset/forms.py:534 -msgid "Tukey" +#: superset/views/core.py:359 +msgid "Parameters" msgstr "" -#: superset/forms.py:535 -msgid "Min/max (no outliers)" +#: superset/views/core.py:360 superset/views/core.py:396 +msgid "Slice" msgstr "" -#: superset/forms.py:536 -msgid "2/98 percentiles" +#: superset/views/core.py:361 +msgid "Name" msgstr "" -#: superset/forms.py:537 -msgid "9/91 percentiles" +#: superset/views/core.py:363 +msgid "Visualization Type" msgstr "" -#: superset/forms.py:541 -msgid "Ratio" +#: superset/views/core.py:421 +msgid "" +"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" msgstr "" -#: superset/forms.py:543 -msgid "Target aspect ratio for treemap tiles." +#: superset/views/core.py:426 +msgid "" +"The css for individual dashboards can be altered here, or in the " +"dashboard view where changes are immediately visible" msgstr "" -#: superset/forms.py:546 -msgid "Number format" +#: superset/views/core.py:430 +msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/forms.py:559 -msgid "Row limit" +#: superset/views/core.py:431 +msgid "" +"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." msgstr "" -#: superset/forms.py:565 -msgid "Series limit" +#: superset/views/core.py:436 +msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/forms.py:568 -msgid "Limits the number of time series that get displayed" +#: superset/views/core.py:444 superset/views/core.py:511 +msgid "Dashboard" msgstr "" -#: superset/forms.py:572 -msgid "Sort By" +#: superset/views/core.py:445 superset/views/core.py:512 +msgid "Title" msgstr "" -#: superset/forms.py:575 -msgid "Metric used to define the top series" +#: superset/views/core.py:446 +msgid "Slug" msgstr "" -#: superset/forms.py:578 -msgid "Rolling" +#: superset/views/core.py:447 +msgid "Slices" msgstr "" -#: superset/forms.py:581 -msgid "" -"Defines a rolling window function to apply, works along with the " -"[Periods] text box" +#: superset/views/core.py:450 superset/views/core.py:514 +msgid "Modified" msgstr "" -#: superset/forms.py:586 -msgid "Periods" +#: superset/views/core.py:451 +msgid "Position JSON" msgstr "" -#: superset/forms.py:588 -msgid "" -"Defines the size of the rolling window function, relative to the time " -"granularity selected" +#: superset/views/core.py:452 +msgid "CSS" msgstr "" -#: superset/forms.py:593 -msgid "Series" +#: superset/views/core.py:453 +msgid "JSON Metadata" msgstr "" -#: superset/forms.py:596 -msgid "" -"Defines the grouping of entities. Each series is shown as a specific " -"color on the chart and has a legend toggle" +#: superset/views/core.py:454 +msgid "Underlying Tables" +msgstr "" + +#: superset/views/core.py:527 +msgid "Action" msgstr "" -#: superset/forms.py:602 -msgid "Entity" +#: superset/views/core.py:528 +msgid "dttm" msgstr "" -#: superset/forms.py:605 -msgid "This define the element to be plotted on the chart" +#: superset/views/core.py:2279 +msgid "SQL Editor" msgstr "" -#: superset/forms.py:608 -msgid "X Axis" +#: superset/views/core.py:2288 +msgid "Query Search" msgstr "" -#: superset/forms.py:611 +#: superset/forms.py:624 msgid "Metric assigned to the [X] axis" msgstr "" -#: superset/forms.py:614 +#: superset/forms.py:627 msgid "Y Axis" msgstr "" -#: superset/forms.py:617 +#: superset/forms.py:630 msgid "Metric assigned to the [Y] axis" msgstr "" -#: superset/forms.py:620 +#: superset/forms.py:633 msgid "Bubble Size" msgstr "" -#: superset/forms.py:625 +#: superset/forms.py:638 msgid "URL" msgstr "" -#: superset/forms.py:626 +#: superset/forms.py:639 msgid "" "The URL, this field is templated, so you can integrate {{ width }} and/or" " {{ height }} in your URL string." msgstr "" -#: superset/forms.py:633 +#: superset/forms.py:646 msgid "X Axis Label" msgstr "" -#: superset/forms.py:637 +#: superset/forms.py:650 msgid "Y Axis Label" msgstr "" -#: superset/forms.py:641 +#: superset/forms.py:654 msgid "Custom WHERE clause" msgstr "" -#: superset/forms.py:643 +#: superset/forms.py:656 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/forms.py:650 +#: superset/forms.py:663 msgid "Custom HAVING clause" msgstr "" -#: superset/forms.py:652 +#: superset/forms.py:665 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/forms.py:659 +#: superset/forms.py:672 msgid "Comparison Period Lag" msgstr "" -#: superset/forms.py:660 +#: superset/forms.py:673 msgid "Based on granularity, number of time periods to compare against" msgstr "" -#: superset/forms.py:665 +#: superset/forms.py:678 msgid "Comparison suffix" msgstr "" -#: superset/forms.py:666 +#: superset/forms.py:679 msgid "Suffix to apply after the percentage display" msgstr "" -#: superset/forms.py:669 +#: superset/forms.py:683 msgid "Table Timestamp Format" msgstr "" -#: superset/forms.py:672 +#: superset/forms.py:686 msgid "Timestamp Format" msgstr "" -#: superset/forms.py:675 +#: superset/forms.py:689 msgid "Series Height" msgstr "" -#: superset/forms.py:678 +#: superset/forms.py:692 msgid "Pixel height of each series" msgstr "" -#: superset/forms.py:681 +#: superset/forms.py:695 msgid "X axis format" msgstr "" -#: superset/forms.py:687 +#: superset/forms.py:701 msgid "Y axis format" msgstr "" -#: superset/forms.py:700 +#: superset/forms.py:714 msgid "Markup Type" msgstr "" -#: superset/forms.py:702 +#: superset/forms.py:716 msgid "markdown" msgstr "" -#: superset/forms.py:703 +#: superset/forms.py:717 msgid "html" msgstr "" -#: superset/forms.py:706 +#: superset/forms.py:720 msgid "Pick your favorite markup language" msgstr "" -#: superset/forms.py:709 +#: superset/forms.py:723 msgid "Rotation" msgstr "" -#: superset/forms.py:711 +#: superset/forms.py:725 msgid "random" msgstr "" -#: superset/forms.py:712 +#: superset/forms.py:726 msgid "flat" msgstr "" -#: superset/forms.py:713 +#: superset/forms.py:727 msgid "square" msgstr "" -#: superset/forms.py:716 +#: superset/forms.py:730 msgid "Rotation to apply to words in the cloud" msgstr "" -#: superset/forms.py:719 -msgid "Line Style" -msgstr "" +#~ msgid "" +#~ msgstr "" -#: superset/forms.py:721 +#: superset/forms.py:735 msgid "linear" msgstr "" -#: superset/forms.py:722 +#: superset/forms.py:736 msgid "basis" msgstr "" -#: superset/forms.py:723 +#: superset/forms.py:737 msgid "cardinal" msgstr "" -#: superset/forms.py:724 +#: superset/forms.py:738 msgid "monotone" msgstr "" -#: superset/forms.py:725 +#: superset/forms.py:739 msgid "step-before" msgstr "" -#: superset/forms.py:726 +#: superset/forms.py:740 msgid "step-after" msgstr "" -#: superset/forms.py:729 +#: superset/forms.py:743 msgid "Line interpolation as defined by d3.js" msgstr "" -#: superset/forms.py:732 +#: superset/forms.py:746 msgid "Label Type" msgstr "" -#: superset/forms.py:735 -msgid "Category Name" -msgstr "" +#~ msgid "XScale Interval" +#~ msgstr "" -#: superset/forms.py:736 -msgid "Value" -msgstr "" - -#: superset/forms.py:737 +#: superset/forms.py:751 msgid "Percentage" msgstr "" -#: superset/forms.py:739 +#: superset/forms.py:753 msgid "What should be shown on the label?" msgstr "" -#: superset/forms.py:742 +#: superset/forms.py:756 msgid "Code" msgstr "" -#: superset/forms.py:743 +#: superset/forms.py:757 msgid "Put your code here" msgstr "" -#: superset/forms.py:747 +#: superset/forms.py:761 msgid "Aggregation function" msgstr "" -#: superset/forms.py:752 -msgid "max" -msgstr "" - -#: superset/forms.py:754 -msgid "stdev" -msgstr "" - -#: superset/forms.py:755 -msgid "var" -msgstr "" +#~ msgid "Reduce X ticks" +#~ msgstr "" -#: superset/forms.py:758 -msgid "" -"Aggregate function to apply when pivoting and computing the total rows " -"and columns" -msgstr "" +#~ msgid "Include Series" +#~ msgstr "" -#: superset/forms.py:763 +#: superset/forms.py:777 msgid "Font Size From" msgstr "" -#: superset/forms.py:765 +#: superset/forms.py:779 msgid "Font size for the smallest value in the list" msgstr "" -#: superset/forms.py:768 +#: superset/forms.py:783 msgid "Font Size To" msgstr "" -#: superset/forms.py:770 +#: superset/forms.py:785 msgid "Font size for the biggest value in the list" msgstr "" -#: superset/forms.py:773 +#: superset/forms.py:788 msgid "Range Filter" msgstr "" -#: superset/forms.py:775 +#: superset/forms.py:790 msgid "Whether to display the time range interactive selector" msgstr "" -#: superset/forms.py:779 +#: superset/forms.py:794 msgid "Date Filter" msgstr "" -#: superset/forms.py:781 +#: superset/forms.py:796 msgid "Whether to include a time filter" msgstr "" -#: superset/forms.py:784 -msgid "Data Table" -msgstr "" - -#: superset/forms.py:786 -msgid "Whether to display the interactive data table" -msgstr "" +#~ msgid "Group by" +#~ msgstr "" -#: superset/forms.py:789 +#: superset/forms.py:805 msgid "Search Box" msgstr "" -#: superset/forms.py:791 +#: superset/forms.py:807 msgid "Whether to include a client side search box" msgstr "" -#: superset/forms.py:795 +#: superset/forms.py:811 msgid "Table Filter" msgstr "" -#: superset/forms.py:797 +#: superset/forms.py:813 msgid "Whether to apply filter when table cell is clicked" msgstr "" -#: superset/forms.py:801 +#: superset/forms.py:817 msgid "Show Bubbles" msgstr "" -#: superset/forms.py:803 +#: superset/forms.py:819 msgid "Whether to display bubbles on top of countries" msgstr "" -#: superset/forms.py:807 +#: superset/forms.py:823 msgid "Legend" msgstr "" -#: superset/forms.py:809 +#: superset/forms.py:825 msgid "Whether to display the legend (toggles)" msgstr "" -#: superset/forms.py:812 +#: superset/forms.py:828 msgid "X bounds" msgstr "" -#: superset/forms.py:814 -msgid "Whether to display the min and max values of the X axis" -msgstr "" +#~ msgid "Bottom Margin" +#~ msgstr "" -#: superset/forms.py:818 -msgid "Rich Tooltip" -msgstr "" - -#: superset/forms.py:820 +#: superset/forms.py:836 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" -#: superset/forms.py:825 +#: superset/forms.py:841 msgid "Y Axis Zero" msgstr "" -#: superset/forms.py:827 +#: superset/forms.py:843 msgid "Force the Y axis to start at 0 instead of the minimum value" msgstr "" -#: superset/forms.py:832 +#: superset/forms.py:848 msgid "Y Log" msgstr "" -#: superset/forms.py:834 +#: superset/forms.py:850 msgid "Use a log scale for the Y axis" msgstr "" -#: superset/forms.py:837 +#: superset/forms.py:853 msgid "X Log" msgstr "" -#: superset/forms.py:839 +#: superset/forms.py:855 msgid "Use a log scale for the X axis" msgstr "" -#: superset/forms.py:842 +#: superset/forms.py:858 msgid "Donut" msgstr "" -#: superset/forms.py:844 +#: superset/forms.py:860 msgid "Do you want a donut or a pie?" msgstr "" -#: superset/forms.py:847 +#: superset/forms.py:863 msgid "Put labels outside" msgstr "" -#: superset/forms.py:849 +#: superset/forms.py:865 msgid "Put the labels outside the pie?" msgstr "" -#: superset/forms.py:852 -msgid "Contribution" -msgstr "" - -#: superset/forms.py:854 -msgid "Compute the contribution to the total" -msgstr "" +#~ msgid "Domain" +#~ msgstr "" -#: superset/forms.py:857 +#: superset/forms.py:873 msgid "Period Ratio" msgstr "" -#: superset/forms.py:860 +#: superset/forms.py:876 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "" -#: superset/forms.py:865 -msgid "Period Ratio Type" -msgstr "" - -#: superset/forms.py:868 -msgid "factor" +#: superset/forms.py:881 +msgid "Period Ratio Type" msgstr "" -#: superset/forms.py:869 -msgid "growth" -msgstr "" +#~ msgid "Link Length" +#~ msgstr "" -#: superset/forms.py:870 +#: superset/forms.py:886 msgid "value" msgstr "" -#: superset/forms.py:872 +#: superset/forms.py:888 msgid "" "`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " "is (new-previous)" msgstr "" -#: superset/forms.py:877 +#: superset/forms.py:893 msgid "Time Shift" msgstr "" -#: superset/forms.py:879 -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/forms.py:886 -msgid "Subheader" -msgstr "" +#~ msgid "Resample Rule" +#~ msgstr "" -#: superset/forms.py:887 +#: superset/forms.py:903 msgid "Description text that shows up below your Big Number" msgstr "" -#: superset/forms.py:894 +#: superset/forms.py:910 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/forms.py:911 +#: superset/forms.py:929 msgid "Base layer map style" msgstr "" -#: superset/forms.py:914 +#: superset/forms.py:932 msgid "Clustering Radius" msgstr "" -#: superset/forms.py:927 +#: superset/forms.py:945 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/forms.py:933 +#: superset/forms.py:952 msgid "Point Radius" msgstr "" -#: superset/forms.py:936 +#: superset/forms.py:955 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/forms.py:942 +#: superset/forms.py:963 msgid "Point Radius Unit" msgstr "" -#: superset/forms.py:949 +#: superset/forms.py:970 msgid "The unit of measure for the specified point radius" msgstr "" -#: superset/forms.py:952 +#: superset/forms.py:974 msgid "Opacity" msgstr "" -#: superset/forms.py:954 +#: superset/forms.py:976 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/forms.py:959 +#: superset/forms.py:981 msgid "Zoom" msgstr "" -#: superset/forms.py:962 +#: superset/forms.py:984 msgid "Zoom level of the map" msgstr "" -#: superset/forms.py:966 +#: superset/forms.py:988 msgid "Default latitude" msgstr "" -#: superset/forms.py:968 +#: superset/forms.py:990 msgid "Latitude of default viewport" msgstr "" -#: superset/forms.py:972 +#: superset/forms.py:994 msgid "Default longitude" msgstr "" -#: superset/forms.py:974 +#: superset/forms.py:996 msgid "Longitude of default viewport" msgstr "" -#: superset/forms.py:978 +#: superset/forms.py:1000 msgid "Live render" msgstr "" -#: superset/forms.py:980 +#: superset/forms.py:1002 msgid "Points and clusters will update as viewport is being changed" msgstr "" -#: superset/forms.py:985 +#: superset/forms.py:1007 msgid "RGB Color" msgstr "" -#: superset/forms.py:995 +#: superset/forms.py:1017 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/forms.py:998 +#: superset/forms.py:1020 msgid "Ranges" msgstr "" -#: superset/forms.py:1000 +#: superset/forms.py:1022 msgid "Ranges to highlight with shading" msgstr "" -#: superset/forms.py:1003 +#: superset/forms.py:1025 msgid "Range labels" msgstr "" -#: superset/forms.py:1005 -msgid "Labels for the ranges" -msgstr "" - -#: superset/forms.py:1008 -msgid "Markers" -msgstr "" +#~ msgid "Until" +#~ msgstr "" -#: superset/forms.py:1010 +#: superset/forms.py:1032 msgid "List of values to mark with triangles" msgstr "" -#: superset/forms.py:1013 +#: superset/forms.py:1035 msgid "Marker labels" msgstr "" -#: superset/forms.py:1015 +#: superset/forms.py:1037 msgid "Labels for the markers" msgstr "" -#: superset/forms.py:1018 +#: superset/forms.py:1040 msgid "Marker lines" msgstr "" -#: superset/forms.py:1020 +#: superset/forms.py:1042 msgid "List of values to mark with lines" msgstr "" -#: superset/forms.py:1023 +#: superset/forms.py:1045 msgid "Marker line labels" msgstr "" -#: superset/forms.py:1025 +#: superset/forms.py:1047 msgid "Labels for the marker lines" msgstr "" -#: superset/forms.py:1088 +#: superset/forms.py:1110 msgid "SQL" msgstr "" -#: superset/forms.py:1090 +#: superset/forms.py:1112 msgid "This section exposes ways to include snippets of SQL in your query" msgstr "" -#: superset/forms.py:1101 +#: superset/forms.py:1124 msgid "Time Grain" msgstr "" -#: superset/forms.py:1104 -msgid "" -"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" -msgstr "" - -#: superset/forms.py:1139 superset/forms.py:1143 -msgid "Filter 1" -msgstr "" +#~ msgid "Row limit" +#~ msgstr "" -#: superset/forms.py:1148 +#: superset/forms.py:1175 msgid "Super" msgstr "" -#: superset/forms.py:1152 +#: superset/forms.py:1179 msgid "Time" msgstr "" -#: superset/forms.py:1157 +#: superset/forms.py:1184 msgid "Time related form attributes" msgstr "" -#: superset/forms.py:1164 -msgid "CSV File" -msgstr "" - -#: superset/forms.py:1165 -msgid "Select a CSV file to be uploaded to a database." -msgstr "" - -#: superset/forms.py:1169 -msgid "CSV Files Only!" -msgstr "" - -#: superset/forms.py:1171 -msgid "Delimiter" -msgstr "" +#~ msgid "Periods" +#~ msgstr "" -#: superset/forms.py:1172 -msgid "Delimiter used by CSV file (for whitespace use \\s+)." -msgstr "" +#~ msgid "Series" +#~ msgstr "" -#: superset/forms.py:1177 -msgid "Header Row" -msgstr "" +#~ msgid "Entity" +#~ msgstr "" -#: superset/forms.py:1178 +#: superset/forms.py:1205 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:1188 +#: superset/forms.py:1214 msgid "Column Names" msgstr "" -#: superset/forms.py:1189 +#: superset/forms.py:1215 msgid "" "List of comma-separated column names to use if header row not specified " "above. Leave empty if header field populated." msgstr "" -#: superset/forms.py:1198 +#: superset/forms.py:1224 msgid "Index Column" msgstr "" -#: superset/forms.py:1199 +#: superset/forms.py:1225 msgid "" "Column to use as the row labels of the dataframe. Leave empty if no index" " column." msgstr "" -#: superset/forms.py:1207 +#: superset/forms.py:1233 msgid "Squeeze" msgstr "" -#: superset/forms.py:1208 +#: superset/forms.py:1234 msgid "" "Parse the data as a series (specify this option if the data contains only" " one column.)" msgstr "" -#: superset/forms.py:1213 -msgid "Prefix" -msgstr "" - -#: superset/forms.py:1214 -msgid "" -"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " -"X1\")." -msgstr "" +#~ msgid "X Axis Label" +#~ msgstr "" -#: superset/forms.py:1220 +#: superset/forms.py:1246 msgid "Mangle Duplicate Columns" msgstr "" -#: superset/forms.py:1221 +#: superset/forms.py:1247 msgid "Specify duplicate columns as \"X.0, X.1\"." msgstr "" -#: superset/forms.py:1224 -msgid "Skip Initial Space" -msgstr "" - -#: superset/forms.py:1225 -msgid "Skip spaces after delimiter." -msgstr "" - -#: superset/forms.py:1227 -msgid "Skip Rows" -msgstr "" +#~ msgid "Custom HAVING clause" +#~ msgstr "" -#: superset/forms.py:1228 -msgid "Number of rows to skip at start of file." -msgstr "" +#~ msgid "Comparison Period Lag" +#~ msgstr "" -#: superset/forms.py:1234 +#: superset/forms.py:1260 msgid "Rows to Read" msgstr "" -#: superset/forms.py:1235 +#: superset/forms.py:1261 msgid "Number of rows of file to read." msgstr "" -#: superset/forms.py:1239 +#: superset/forms.py:1265 msgid "Skip Blank Lines" msgstr "" -#: superset/forms.py:1240 +#: superset/forms.py:1266 msgid "Skip blank lines rather than interpreting them as NaN values." msgstr "" -#: superset/forms.py:1244 +#: superset/forms.py:1270 msgid "Parse Dates" msgstr "" -#: superset/forms.py:1245 +#: superset/forms.py:1271 msgid "Parse date values." msgstr "" -#: superset/forms.py:1247 +#: superset/forms.py:1273 msgid "Infer Datetime Format" msgstr "" -#: superset/forms.py:1248 +#: superset/forms.py:1274 msgid "Use Pandas to interpret the datetime format automatically." msgstr "" -#: superset/forms.py:1253 -msgid "Day First" -msgstr "" - -#: superset/forms.py:1254 -msgid "Use DD/MM (European/International) date format." -msgstr "" +#~ msgid "Y axis format" +#~ msgstr "" -#: superset/forms.py:1257 +#: superset/forms.py:1283 msgid "Thousands Separator" msgstr "" -#: superset/forms.py:1258 +#: superset/forms.py:1284 msgid "Separator for values in thousands." msgstr "" -#: superset/forms.py:1263 +#: superset/forms.py:1289 msgid "Decimal Character" msgstr "" -#: superset/forms.py:1264 +#: superset/forms.py:1290 msgid "Character to interpret as decimal point." msgstr "" -#: superset/forms.py:1269 +#: superset/forms.py:1295 msgid "Quote Character" msgstr "" -#: superset/forms.py:1270 +#: superset/forms.py:1296 msgid "Character used to denote the start and end of a quoted item." msgstr "" -#: superset/forms.py:1276 +#: superset/forms.py:1302 msgid "Escape Character" msgstr "" -#: superset/forms.py:1277 +#: superset/forms.py:1303 msgid "Character used to escape a quoted item." msgstr "" -#: superset/forms.py:1282 +#: superset/forms.py:1308 msgid "Comment Character" msgstr "" -#: superset/forms.py:1283 +#: superset/forms.py:1309 msgid "Character used to denote the start of a comment." msgstr "" -#: superset/forms.py:1288 +#: superset/forms.py:1314 msgid "Encoding" msgstr "" -#: superset/forms.py:1289 +#: superset/forms.py:1315 msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." msgstr "" -#: superset/forms.py:1294 +#: superset/forms.py:1320 msgid "Error On Bad Lines" msgstr "" -#: superset/forms.py:1295 +#: superset/forms.py:1321 msgid "" "Error on bad lines (e.g. a line with too many commas). If false these bad" " lines will instead be dropped from the resulting dataframe." msgstr "" -#: superset/forms.py:1304 +#: superset/forms.py:1330 msgid "Table Name" msgstr "" -#: superset/forms.py:1305 +#: superset/forms.py:1331 msgid "Name of table to be createdfrom csv data." msgstr "" -#: superset/forms.py:1309 +#: superset/forms.py:1335 msgid "Database URI" msgstr "" -#: superset/forms.py:1310 +#: superset/forms.py:1336 msgid "URI of database in which to add above table." msgstr "" -#: superset/connectors/sqla/views.py:199 superset/forms.py:1314 +#: superset/connectors/sqla/views.py:199 superset/forms.py:1340 msgid "Schema" msgstr "" -#: superset/forms.py:1315 +#: superset/forms.py:1341 msgid "Specify a schema (if database flavour supports this)." msgstr "" -#: superset/forms.py:1320 +#: superset/forms.py:1346 msgid "Table Exists" msgstr "" -#: superset/forms.py:1321 +#: superset/forms.py:1347 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:1327 +#: superset/forms.py:1353 msgid "Fail" msgstr "" -#: superset/forms.py:1328 -msgid "Replace" -msgstr "" - -#: superset/forms.py:1329 -msgid "Append" -msgstr "" +#~ msgid "Font Size From" +#~ msgstr "" -#: superset/forms.py:1331 +#: superset/forms.py:1357 msgid "Dataframe Index" msgstr "" -#: superset/forms.py:1332 +#: superset/forms.py:1358 msgid "Write dataframe index as a column." msgstr "" -#: superset/forms.py:1334 +#: superset/forms.py:1360 msgid "Column Label(s)" msgstr "" -#: superset/forms.py:1335 +#: superset/forms.py:1361 msgid "" "Column label for index column(s). If None is given and Dataframe Index is" " True, Index Names are used." msgstr "" -#: superset/forms.py:1342 +#: superset/forms.py:1368 msgid "Chunksize" msgstr "" -#: superset/forms.py:1343 +#: superset/forms.py:1369 msgid "" "If empty, all rows will be written at once. Otherwise, rows will be " "written in batches of this many rows at a time." @@ -1636,57 +1557,31 @@ msgstr "" msgid "Sankey" msgstr "" -#: superset/viz.py:1217 -msgid "Directed Force Layout" -msgstr "" - -#: superset/viz.py:1238 -msgid "Country Map" -msgstr "" - -#: superset/viz.py:1267 -msgid "World Map" -msgstr "" +#~ msgid "Time Shift" +#~ msgstr "" -#: superset/viz.py:1317 -msgid "Filters" -msgstr "" +#~ msgid "Subheader" +#~ msgstr "" #: superset/viz.py:1352 msgid "iFrame" msgstr "" -#: superset/viz.py:1369 -msgid "Parallel Coordinates" -msgstr "" - -#: superset/viz.py:1394 -msgid "Heatmap" -msgstr "" +#~ msgid "Base layer map style" +#~ msgstr "" #: superset/viz.py:1445 msgid "Horizon Charts" msgstr "" -#: superset/viz.py:1456 -msgid "Mapbox" -msgstr "" - -#: superset/connectors/druid/models.py:934 -msgid "No data was returned." -msgstr "" - -#: superset/connectors/druid/views.py:37 superset/connectors/sqla/views.py:74 -msgid "Column" -msgstr "" +#~ msgid "Point Radius" +#~ msgstr "" -#: superset/connectors/druid/views.py:38 superset/connectors/druid/views.py:97 -#: superset/connectors/sqla/views.py:120 -msgid "Type" -msgstr "" +#~ msgid "Point Radius Unit" +#~ msgstr "" -#: superset/connectors/druid/views.py:39 superset/views/core.py:310 -#: superset/views/core.py:359 +#: superset/connectors/druid/views.py:39 superset/views/core.py:481 +#: superset/views/core.py:530 msgid "Datasource" msgstr "" @@ -1729,7 +1624,7 @@ msgstr "" #: superset/connectors/druid/views.py:95 superset/connectors/druid/views.py:205 #: superset/connectors/sqla/views.py:76 superset/connectors/sqla/views.py:118 -#: superset/views/core.py:360 +#: superset/views/core.py:531 msgid "Description" msgstr "" @@ -1738,7 +1633,7 @@ msgstr "" msgid "Verbose Name" msgstr "" -#: superset/connectors/druid/views.py:98 superset/views/core.py:533 +#: superset/connectors/druid/views.py:98 superset/views/core.py:704 msgid "JSON" msgstr "" @@ -1767,124 +1662,8 @@ msgstr "" msgid "Broker Host" msgstr "" -#: superset/connectors/druid/views.py:129 -msgid "Broker Port" -msgstr "" - -#: superset/connectors/druid/views.py:130 -msgid "Broker Endpoint" -msgstr "" - -#: superset/connectors/druid/views.py:173 superset/connectors/sqla/views.py:156 -msgid "" -"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'" -msgstr "" - -#: superset/connectors/druid/views.py:181 superset/connectors/sqla/views.py:164 -msgid "Timezone offset (in hours) for this datasource" -msgstr "" - -#: superset/connectors/druid/views.py:185 -msgid "" -"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" -msgstr "" - -#: superset/connectors/druid/views.py:192 superset/connectors/sqla/views.py:186 -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 " -"fly" -msgstr "" - -#: superset/connectors/druid/views.py:196 superset/connectors/sqla/views.py:200 -msgid "" -"Redirects to this endpoint when clicking on the datasource from the " -"datasource list" -msgstr "" - -#: superset/connectors/druid/views.py:202 superset/connectors/sqla/views.py:193 -msgid "Associated Slices" -msgstr "" - -#: superset/connectors/druid/views.py:203 -msgid "Data Source" -msgstr "" - -#: superset/connectors/druid/views.py:206 -msgid "Owner" -msgstr "" - -#: superset/connectors/druid/views.py:207 -msgid "Is Hidden" -msgstr "" - -#: superset/connectors/druid/views.py:208 superset/connectors/sqla/views.py:198 -msgid "Enable Filter Select" -msgstr "" - -#: superset/connectors/druid/views.py:209 -msgid "Default Endpoint" -msgstr "" - -#: superset/connectors/druid/views.py:210 -msgid "Time Offset" -msgstr "" - -#: superset/connectors/druid/views.py:211 superset/connectors/sqla/views.py:204 -#: superset/views/core.py:245 superset/views/core.py:356 -msgid "Cache Timeout" -msgstr "" - -#: superset/connectors/sqla/models.py:388 -msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" -msgstr "" - -#: superset/connectors/sqla/models.py:393 -msgid "Metric '{}' is not valid" -msgstr "" - -#: superset/connectors/sqla/views.py:39 -msgid "" -"Whether to make this column available as a [Time Granularity] option, " -"column has to be DATETIME or DATETIME-like" -msgstr "" - -#: superset/connectors/sqla/views.py:46 -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 " -"most case users should not need to alter this." -msgstr "" - -#: superset/connectors/sqla/views.py:79 superset/connectors/sqla/views.py:122 -#: superset/connectors/sqla/views.py:194 superset/views/core.py:366 -msgid "Table" -msgstr "" - -#: superset/connectors/sqla/views.py:84 -msgid "Expression" -msgstr "" - -#: superset/connectors/sqla/views.py:85 -msgid "Is temporal" -msgstr "" - -#: superset/connectors/sqla/views.py:86 -msgid "Datetime Format" -msgstr "" - -#: superset/connectors/sqla/views.py:87 -msgid "Database Expression" -msgstr "" +#~ msgid "Filter 1" +#~ msgstr "" #: superset/connectors/sqla/views.py:121 msgid "SQL Expression" @@ -1919,11 +1698,11 @@ msgstr "" msgid "Changed By" msgstr "" -#: superset/connectors/sqla/views.py:196 superset/views/core.py:241 +#: superset/connectors/sqla/views.py:196 superset/views/core.py:248 msgid "Database" msgstr "" -#: superset/connectors/sqla/views.py:197 superset/views/core.py:243 +#: superset/connectors/sqla/views.py:197 superset/views/core.py:250 msgid "Last Changed" msgstr "" @@ -1949,13 +1728,8 @@ msgstr "" msgid "Login" msgstr "" -#: superset/templates/superset/import_dashboards.html:11 -msgid "Import" -msgstr "" - -#: superset/templates/superset/request_access.html:2 -msgid "No Access!" -msgstr "" +#~ msgid "Breakdowns" +#~ msgstr "" #: superset/templates/superset/request_access.html:7 #, python-format @@ -1974,97 +1748,100 @@ msgstr "" msgid "Welcome!" msgstr "" -#: superset/templates/superset/welcome.html:20 superset/views/core.py:358 -msgid "Dashboards" -msgstr "" - -#: superset/templates/superset/models/database/macros.html:4 -msgid "Test Connection" -msgstr "" +#~ msgid "Hierarchy" +#~ msgstr "" -#: superset/views/core.py:209 +#: superset/views/core.py:216 msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/views/core.py:210 +#: superset/views/core.py:217 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 " "(<~1 minute)" msgstr "" -#: superset/views/core.py:214 +#: superset/views/core.py:221 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." msgstr "" -#: superset/views/core.py:218 +#: superset/views/core.py:225 msgid "Allow CREATE TABLE AS option in SQL Lab" msgstr "" -#: superset/views/core.py:219 +#: superset/views/core.py:226 msgid "" "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" " SQL Lab" msgstr "" -#: superset/views/core.py:223 +#: superset/views/core.py:230 msgid "" "When allowing CREATE TABLE AS option in SQL Lab, this option forces the " "table to be created in this schema" msgstr "" -#: superset/views/core.py:237 +#: superset/views/core.py:244 msgid "Expose in SQL Lab" msgstr "" -#: superset/views/core.py:238 +#: superset/views/core.py:245 msgid "Allow CREATE TABLE AS" msgstr "" -#: superset/views/core.py:239 +#: superset/views/core.py:246 msgid "Allow DML" msgstr "" -#: superset/views/core.py:240 +#: superset/views/core.py:247 msgid "CTAS Schema" msgstr "" -#: superset/views/core.py:242 superset/views/core.py:357 -#: superset/views/core.py:453 superset/views/core.py:517 +#: superset/views/core.py:249 superset/views/core.py:528 +#: superset/views/core.py:624 superset/views/core.py:688 msgid "Creator" msgstr "" -#: superset/views/core.py:244 +#: superset/views/core.py:251 msgid "SQLAlchemy URI" msgstr "" -#: superset/views/core.py:246 +#: superset/views/core.py:253 msgid "Extra" msgstr "" -#: superset/views/core.py:307 superset/views/core.py:530 +#: superset/views/core.py:308 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views/core.py:394 +msgid "CSV file \"{0}\" uploaded to table \"{1}\" in database \"{2}\"" +msgstr "" + +#: superset/views/core.py:478 superset/views/core.py:701 msgid "User" msgstr "" -#: superset/views/core.py:308 +#: superset/views/core.py:479 msgid "User Roles" msgstr "" -#: superset/views/core.py:309 +#: superset/views/core.py:480 msgid "Database URL" msgstr "" -#: superset/views/core.py:311 +#: superset/views/core.py:482 msgid "Roles to grant" msgstr "" -#: superset/views/core.py:312 +#: superset/views/core.py:483 msgid "Created On" msgstr "" -#: superset/views/core.py:345 +#: superset/views/core.py:516 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -2072,111 +1849,103 @@ msgid "" "parameters." msgstr "" -#: superset/views/core.py:350 +#: superset/views/core.py:521 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/views/core.py:361 +#: superset/views/core.py:532 msgid "Last Modified" msgstr "" -#: superset/views/core.py:362 superset/views/core.py:452 -msgid "Owners" -msgstr "" - -#: superset/views/core.py:363 -msgid "Parameters" -msgstr "" - -#: superset/views/core.py:364 superset/views/core.py:400 -msgid "Slice" -msgstr "" - -#: superset/views/core.py:365 -msgid "Name" -msgstr "" +#~ msgid "Tooltip" +#~ msgstr "" -#: superset/views/core.py:367 -msgid "Visualization Type" -msgstr "" +#~ msgid "Query" +#~ msgstr "" -#: superset/views/core.py:425 +#: superset/views/core.py:596 msgid "" "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" msgstr "" -#: superset/views/core.py:430 +#: superset/views/core.py:601 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: superset/views/core.py:434 +#: superset/views/core.py:605 msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/views/core.py:435 +#: superset/views/core.py:606 msgid "" "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." msgstr "" -#: superset/views/core.py:440 +#: superset/views/core.py:611 msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/views/core.py:448 superset/views/core.py:515 +#: superset/views/core.py:619 superset/views/core.py:686 msgid "Dashboard" msgstr "" -#: superset/views/core.py:449 superset/views/core.py:516 +#: superset/views/core.py:620 superset/views/core.py:687 msgid "Title" msgstr "" -#: superset/views/core.py:450 +#: superset/views/core.py:621 msgid "Slug" msgstr "" -#: superset/views/core.py:451 +#: superset/views/core.py:622 msgid "Slices" msgstr "" -#: superset/views/core.py:454 superset/views/core.py:518 +#: superset/views/core.py:625 superset/views/core.py:689 msgid "Modified" msgstr "" -#: superset/views/core.py:455 +#: superset/views/core.py:626 msgid "Position JSON" msgstr "" -#: superset/views/core.py:456 +#: superset/views/core.py:627 msgid "CSS" msgstr "" -#: superset/views/core.py:457 +#: superset/views/core.py:628 msgid "JSON Metadata" msgstr "" -#: superset/views/core.py:458 +#: superset/views/core.py:629 msgid "Underlying Tables" msgstr "" -#: superset/views/core.py:531 +#: superset/views/core.py:702 msgid "Action" msgstr "" -#: superset/views/core.py:532 +#: superset/views/core.py:703 msgid "dttm" msgstr "" -#: superset/views/core.py:2283 +#: superset/views/core.py:2454 msgid "SQL Editor" msgstr "" -#: superset/views/core.py:2292 +#: superset/views/core.py:2463 msgid "Query Search" msgstr "" +#~ msgid "Import" +#~ msgstr "" + +#~ msgid "Welcome!" +#~ msgstr "" + diff --git a/superset/translations/it/LC_MESSAGES/messages.mo b/superset/translations/it/LC_MESSAGES/messages.mo index 3e2d0f0d1c5988d6488e75e4aa7428ac8669ef8c..010611687191462a492226d0c6fddcfea0340a1c 100644 GIT binary patch literal 14215 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 literal 39485 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 diff --git a/superset/translations/it/LC_MESSAGES/messages.po b/superset/translations/it/LC_MESSAGES/messages.po index 13216a6bcd95..193c9e26ca84 100644 --- a/superset/translations/it/LC_MESSAGES/messages.po +++ b/superset/translations/it/LC_MESSAGES/messages.po @@ -1,18 +1,19 @@ -# Italian translations for PROJECT. -# Copyright (C) 2017 ORGANIZATION -# This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR , 2017. +# Italian translations for Superset. +# Copyright (C) 2016 ORGANIZATION +# This file is distributed under the same license as the Superset project. +# Maxime Beauchemin , 2016. +# Maurizio Napolitano , 2017. # msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-06-01 09:20-0400\n" -"PO-Revision-Date: 2017-06-01 09:21-0400\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2017-06-04 20:38+0200\n" +"PO-Revision-Date: 2017-06-04 20:36+0200\n" +"Last-Translator: Maurizio Napolitano \n" "Language: it\n" -"Language-Team: it \n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"Language-Team: Italiano <>\n" +"Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -22,1758 +23,320 @@ msgstr "" #: superset/db_engine_specs.py:269 superset/db_engine_specs.py:317 #: superset/db_engine_specs.py:362 superset/db_engine_specs.py:770 #: superset/db_engine_specs.py:806 superset/db_engine_specs.py:838 -#: superset/db_engine_specs.py:884 superset/forms.py:443 +#: superset/db_engine_specs.py:884 msgid "Time Column" -msgstr "" - -#: superset/db_engine_specs.py:195 superset/db_engine_specs.py:226 -#: superset/db_engine_specs.py:318 superset/db_engine_specs.py:363 -#: superset/db_engine_specs.py:771 superset/db_engine_specs.py:839 -msgid "second" -msgstr "" - -#: superset/db_engine_specs.py:196 superset/db_engine_specs.py:229 -#: superset/db_engine_specs.py:321 superset/db_engine_specs.py:365 -#: superset/db_engine_specs.py:773 superset/db_engine_specs.py:807 -#: superset/db_engine_specs.py:841 superset/db_engine_specs.py:885 -msgid "minute" -msgstr "" - -#: superset/db_engine_specs.py:197 superset/db_engine_specs.py:233 -#: superset/db_engine_specs.py:323 superset/db_engine_specs.py:367 -#: superset/db_engine_specs.py:779 superset/db_engine_specs.py:809 -#: superset/db_engine_specs.py:843 superset/db_engine_specs.py:891 -#: superset/forms.py:387 superset/forms.py:401 -msgid "hour" -msgstr "" - -#: superset/db_engine_specs.py:198 superset/db_engine_specs.py:238 -#: superset/db_engine_specs.py:270 superset/db_engine_specs.py:325 -#: superset/db_engine_specs.py:369 superset/db_engine_specs.py:781 -#: superset/db_engine_specs.py:811 superset/db_engine_specs.py:845 -#: superset/db_engine_specs.py:893 superset/forms.py:388 superset/forms.py:402 -msgid "day" -msgstr "" - -#: superset/db_engine_specs.py:199 superset/db_engine_specs.py:244 -#: superset/db_engine_specs.py:271 superset/db_engine_specs.py:326 -#: superset/db_engine_specs.py:371 superset/db_engine_specs.py:783 -#: superset/db_engine_specs.py:813 superset/db_engine_specs.py:847 -#: superset/forms.py:373 superset/forms.py:389 superset/forms.py:403 -msgid "week" -msgstr "" - -#: superset/db_engine_specs.py:200 superset/db_engine_specs.py:246 -#: superset/db_engine_specs.py:273 superset/db_engine_specs.py:328 -#: superset/db_engine_specs.py:373 superset/db_engine_specs.py:785 -#: superset/db_engine_specs.py:815 superset/db_engine_specs.py:849 -#: superset/db_engine_specs.py:895 superset/forms.py:376 superset/forms.py:390 -#: superset/forms.py:404 -msgid "month" -msgstr "" - -#: superset/db_engine_specs.py:201 superset/db_engine_specs.py:248 -#: superset/db_engine_specs.py:330 superset/db_engine_specs.py:375 -#: superset/db_engine_specs.py:787 superset/db_engine_specs.py:817 -#: superset/db_engine_specs.py:851 superset/db_engine_specs.py:897 -msgid "quarter" -msgstr "" - -#: superset/db_engine_specs.py:202 superset/db_engine_specs.py:252 -#: superset/db_engine_specs.py:332 superset/db_engine_specs.py:789 -#: superset/db_engine_specs.py:819 superset/db_engine_specs.py:899 -#: superset/forms.py:391 -msgid "year" -msgstr "" - -#: superset/db_engine_specs.py:334 -msgid "week_start_monday" -msgstr "" - -#: superset/db_engine_specs.py:377 superset/db_engine_specs.py:853 -#: superset/forms.py:375 -msgid "week_ending_saturday" -msgstr "" - -#: superset/db_engine_specs.py:380 superset/db_engine_specs.py:856 -msgid "week_start_sunday" -msgstr "" - -#: superset/db_engine_specs.py:775 superset/db_engine_specs.py:887 -msgid "5 minute" -msgstr "" - -#: superset/db_engine_specs.py:777 -msgid "half hour" -msgstr "" - -#: superset/db_engine_specs.py:889 -msgid "10 minute" -msgstr "" - -#: superset/forms.py:37 -msgid "D3 format syntax https://github.com/d3/d3-format" -msgstr "" - -#: superset/forms.py:150 -msgid "Viz" -msgstr "" - -#: superset/forms.py:153 -msgid "The type of visualization to display" -msgstr "" - -#: superset/forms.py:156 -msgid "Metrics" -msgstr "" - -#: superset/forms.py:159 superset/forms.py:164 -msgid "One or many metrics to display" -msgstr "" - -#: superset/forms.py:162 -msgid "Ordering" -msgstr "" - -#: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:117 -#: superset/forms.py:167 -msgid "Metric" -msgstr "" - -#: superset/forms.py:170 -msgid "Choose the metric" -msgstr "" - -#: superset/forms.py:173 -msgid "Chart Style" -msgstr "" - -#: superset/forms.py:175 -msgid "stack" -msgstr "" - -#: superset/forms.py:176 -msgid "stream" -msgstr "" - -#: superset/forms.py:177 -msgid "expand" -msgstr "" - -#: superset/forms.py:183 -msgid "Color Scheme" -msgstr "" - -#: superset/forms.py:185 -msgid "fire" -msgstr "" - -#: superset/forms.py:186 -msgid "blue_white_yellow" -msgstr "" - -#: superset/forms.py:187 -msgid "white_black" -msgstr "" - -#: superset/forms.py:188 -msgid "black_white" -msgstr "" - -#: superset/forms.py:194 -msgid "Normalize Across" -msgstr "" - -#: superset/forms.py:196 -msgid "heatmap" -msgstr "" - -#: superset/forms.py:197 -msgid "x" -msgstr "" - -#: superset/forms.py:198 -msgid "y" -msgstr "" - -#: superset/forms.py:201 -msgid "" -"Color will be rendered based on a ratio of the cell against the sum of " -"across this criteria" -msgstr "" - -#: superset/forms.py:207 -msgid "Color Scale" -msgstr "" - -#: superset/forms.py:209 -msgid "series" -msgstr "" - -#: superset/forms.py:210 -msgid "overall" -msgstr "" - -#: superset/forms.py:211 -msgid "change" -msgstr "" - -#: superset/forms.py:214 -msgid "Defines how the color are attributed." -msgstr "" - -#: superset/forms.py:217 -msgid "Rendering" -msgstr "" - -#: superset/forms.py:219 -msgid "pixelated (Sharp)" -msgstr "" - -#: superset/forms.py:220 -msgid "auto (Smooth)" -msgstr "" - -#: superset/forms.py:223 -msgid "" -"image-rendering CSS attribute of the canvas object that defines how the " -"browser scales up the image" -msgstr "" - -#: superset/forms.py:228 -msgid "XScale Interval" -msgstr "" - -#: superset/forms.py:231 -msgid "Number of step to take between ticks when printing the x scale" -msgstr "" - -#: superset/forms.py:236 -msgid "YScale Interval" -msgstr "" - -#: superset/forms.py:239 -msgid "Number of step to take between ticks when printing the y scale" -msgstr "" - -#: superset/forms.py:244 -msgid "Stacked Bars" -msgstr "" - -#: superset/forms.py:249 -msgid "Show Markers" -msgstr "" - -#: superset/forms.py:256 -msgid "Bar Values" -msgstr "" - -#: superset/forms.py:261 -msgid "Sort Bars" -msgstr "" - -#: superset/forms.py:263 -msgid "Sort bars by x labels." -msgstr "" - -#: superset/forms.py:266 -msgid "Extra Controls" -msgstr "" - -#: superset/forms.py:268 -msgid "" -"Whether to show extra controls or not. Extra controls include things like" -" making mulitBar charts stacked or side by side." -msgstr "" - -#: superset/forms.py:274 -msgid "Reduce X ticks" -msgstr "" - -#: superset/forms.py:276 -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 " -"be applied to columns and the width may overflow into an horizontal " -"scroll." -msgstr "" - -#: superset/forms.py:284 -msgid "Include Series" -msgstr "" - -#: superset/forms.py:286 -msgid "Include series name as an axis" -msgstr "" - -#: superset/forms.py:289 -msgid "Color Metric" -msgstr "" - -#: superset/forms.py:292 -msgid "A metric to use for color" -msgstr "" - -#: superset/forms.py:295 -msgid "Country Field Type" -msgstr "" - -#: superset/forms.py:298 -msgid "Full name" -msgstr "" - -#: superset/forms.py:299 -msgid "code International Olympic Committee (cioc)" -msgstr "" - -#: superset/forms.py:300 -msgid "code ISO 3166-1 alpha-2 (cca2)" -msgstr "" - -#: superset/forms.py:301 -msgid "code ISO 3166-1 alpha-3 (cca3)" -msgstr "" - -#: superset/forms.py:303 -msgid "" -"The country code standard that Superset should expect to find in the " -"[country] column" -msgstr "" - -#: superset/forms.py:308 -msgid "Group by" -msgstr "" - -#: superset/forms.py:310 -msgid "One or many fields to group by" -msgstr "" - -#: superset/forms.py:313 superset/forms.py:318 -msgid "Columns" -msgstr "" - -#: superset/forms.py:315 -msgid "One or many fields to pivot as columns" -msgstr "" - -#: superset/forms.py:320 superset/forms.py:326 superset/forms.py:332 -msgid "Columns to display" -msgstr "" - -#: superset/forms.py:323 -msgid "X" -msgstr "" - -#: superset/forms.py:329 -msgid "Y" -msgstr "" - -#: superset/forms.py:335 -msgid "Origin" -msgstr "" - -#: superset/forms.py:337 -msgid "default" -msgstr "" - -#: superset/forms.py:338 superset/forms.py:507 -msgid "now" -msgstr "" - -#: superset/forms.py:341 -msgid "" -"Defines the origin where time buckets start, accepts natural dates as in " -"'now', 'sunday' or '1970-01-01'" -msgstr "" - -#: superset/forms.py:346 -msgid "Bottom Margin" -msgstr "" - -#: superset/forms.py:349 -msgid "Bottom marging, in pixels, allowing for more room for axis labels" -msgstr "" - -#: superset/forms.py:354 -msgid "Page Length" -msgstr "" - -#: superset/forms.py:357 -msgid "Number of rows per page, 0 means no pagination" -msgstr "" - -#: superset/forms.py:361 -msgid "Time Granularity" -msgstr "" - -#: superset/forms.py:364 -msgid "all" -msgstr "" - -#: superset/forms.py:365 -msgid "5 seconds" -msgstr "" - -#: superset/forms.py:366 -msgid "30 seconds" -msgstr "" - -#: superset/forms.py:367 -msgid "1 minute" -msgstr "" - -#: superset/forms.py:368 -msgid "5 minutes" -msgstr "" - -#: superset/forms.py:369 -msgid "1 hour" -msgstr "" - -#: superset/forms.py:370 -msgid "6 hour" -msgstr "" - -#: superset/forms.py:371 -msgid "1 day" -msgstr "" - -#: superset/forms.py:372 -msgid "7 days" -msgstr "" - -#: superset/forms.py:374 -msgid "week_starting_sunday" -msgstr "" - -#: superset/forms.py:378 -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/forms.py:384 -msgid "Domain" -msgstr "" - -#: superset/forms.py:393 -msgid "The time unit used for the grouping of blocks" -msgstr "" - -#: superset/forms.py:397 -msgid "Subdomain" -msgstr "" - -#: superset/forms.py:400 superset/forms.py:751 -msgid "min" -msgstr "" - -#: superset/forms.py:406 -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/forms.py:411 -msgid "Link Length" -msgstr "" - -#: superset/forms.py:423 -msgid "Link length in the force layout" -msgstr "" - -#: superset/forms.py:426 -msgid "Charge" -msgstr "" - -#: superset/forms.py:440 -msgid "Charge in the force layout" -msgstr "" - -#: superset/forms.py:446 -msgid "" -"The time column for the visualization. Note that you can define arbitrary" -" expression that return a DATETIME column in the table editor. Also note " -"that the filter below is applied against this column or expression" -msgstr "" - -#: superset/forms.py:454 -msgid "Resample Rule" -msgstr "" - -#: superset/forms.py:457 -msgid "1T" -msgstr "" - -#: superset/forms.py:458 -msgid "1H" -msgstr "" - -#: superset/forms.py:459 -msgid "1D" -msgstr "" - -#: superset/forms.py:460 -msgid "7D" -msgstr "" - -#: superset/forms.py:461 -msgid "1M" -msgstr "" - -#: superset/forms.py:462 -msgid "1AS" -msgstr "" - -#: superset/forms.py:464 -msgid "Pandas resample rule" -msgstr "" - -#: superset/forms.py:467 -msgid "Resample How" -msgstr "" - -#: superset/forms.py:471 superset/forms.py:750 -msgid "mean" -msgstr "" - -#: superset/forms.py:472 superset/forms.py:749 -msgid "sum" -msgstr "" - -#: superset/forms.py:473 superset/forms.py:753 -msgid "median" -msgstr "" - -#: superset/forms.py:475 -msgid "Pandas resample how" -msgstr "" - -#: superset/forms.py:478 -msgid "Resample Fill Method" -msgstr "" - -#: superset/forms.py:482 -msgid "ffill" -msgstr "" - -#: superset/forms.py:483 -msgid "bfill" -msgstr "" - -#: superset/forms.py:485 -msgid "Pandas resample fill method" -msgstr "" - -#: superset/forms.py:488 -msgid "Since" -msgstr "" - -#: superset/forms.py:491 -msgid "1 hour ago" -msgstr "" - -#: superset/forms.py:492 -msgid "12 hours ago" -msgstr "" - -#: superset/forms.py:493 superset/forms.py:508 -msgid "1 day ago" -msgstr "" - -#: superset/forms.py:494 superset/forms.py:509 -msgid "7 days ago" -msgstr "" - -#: superset/forms.py:495 superset/forms.py:510 -msgid "28 days ago" -msgstr "" - -#: superset/forms.py:496 superset/forms.py:511 -msgid "90 days ago" -msgstr "" - -#: superset/forms.py:497 superset/forms.py:512 -msgid "1 year ago" -msgstr "" - -#: superset/forms.py:499 -msgid "" -"Timestamp from filter. This supports free form typing and natural " -"language as in '1 day ago', '28 days' or '3 years'" -msgstr "" - -#: superset/forms.py:504 -msgid "Until" -msgstr "" - -#: superset/forms.py:516 -msgid "Max Bubble Size" -msgstr "" - -#: superset/forms.py:529 -msgid "Whisker/outlier options" -msgstr "" - -#: superset/forms.py:531 -msgid "Determines how whiskers and outliers are calculated." -msgstr "" - -#: superset/forms.py:534 -msgid "Tukey" -msgstr "" - -#: superset/forms.py:535 -msgid "Min/max (no outliers)" -msgstr "" - -#: superset/forms.py:536 -msgid "2/98 percentiles" -msgstr "" - -#: superset/forms.py:537 -msgid "9/91 percentiles" -msgstr "" - -#: superset/forms.py:541 -msgid "Ratio" -msgstr "" - -#: superset/forms.py:543 -msgid "Target aspect ratio for treemap tiles." -msgstr "" - -#: superset/forms.py:546 -msgid "Number format" -msgstr "" - -#: superset/forms.py:559 -msgid "Row limit" -msgstr "" - -#: superset/forms.py:565 -msgid "Series limit" -msgstr "" - -#: superset/forms.py:568 -msgid "Limits the number of time series that get displayed" -msgstr "" - -#: superset/forms.py:572 -msgid "Sort By" -msgstr "" - -#: superset/forms.py:575 -msgid "Metric used to define the top series" -msgstr "" - -#: superset/forms.py:578 -msgid "Rolling" -msgstr "" - -#: superset/forms.py:581 -msgid "" -"Defines a rolling window function to apply, works along with the " -"[Periods] text box" -msgstr "" - -#: superset/forms.py:586 -msgid "Periods" -msgstr "" - -#: superset/forms.py:588 -msgid "" -"Defines the size of the rolling window function, relative to the time " -"granularity selected" -msgstr "" - -#: superset/forms.py:593 -msgid "Series" -msgstr "" - -#: superset/forms.py:596 -msgid "" -"Defines the grouping of entities. Each series is shown as a specific " -"color on the chart and has a legend toggle" -msgstr "" - -#: superset/forms.py:602 -msgid "Entity" -msgstr "" - -#: superset/forms.py:605 -msgid "This define the element to be plotted on the chart" -msgstr "" - -#: superset/forms.py:608 -msgid "X Axis" -msgstr "" - -#: superset/forms.py:611 -msgid "Metric assigned to the [X] axis" -msgstr "" - -#: superset/forms.py:614 -msgid "Y Axis" -msgstr "" - -#: superset/forms.py:617 -msgid "Metric assigned to the [Y] axis" -msgstr "" - -#: superset/forms.py:620 -msgid "Bubble Size" -msgstr "" - -#: superset/forms.py:625 -msgid "URL" -msgstr "" - -#: superset/forms.py:626 -msgid "" -"The URL, this field is templated, so you can integrate {{ width }} and/or" -" {{ height }} in your URL string." -msgstr "" - -#: superset/forms.py:633 -msgid "X Axis Label" -msgstr "" - -#: superset/forms.py:637 -msgid "Y Axis Label" -msgstr "" - -#: superset/forms.py:641 -msgid "Custom WHERE clause" -msgstr "" - -#: superset/forms.py:643 -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/forms.py:650 -msgid "Custom HAVING clause" -msgstr "" - -#: superset/forms.py:652 -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/forms.py:659 -msgid "Comparison Period Lag" -msgstr "" - -#: superset/forms.py:660 -msgid "Based on granularity, number of time periods to compare against" -msgstr "" - -#: superset/forms.py:665 -msgid "Comparison suffix" -msgstr "" - -#: superset/forms.py:666 -msgid "Suffix to apply after the percentage display" -msgstr "" - -#: superset/forms.py:669 -msgid "Table Timestamp Format" -msgstr "" - -#: superset/forms.py:672 -msgid "Timestamp Format" -msgstr "" - -#: superset/forms.py:675 -msgid "Series Height" -msgstr "" - -#: superset/forms.py:678 -msgid "Pixel height of each series" -msgstr "" - -#: superset/forms.py:681 -msgid "X axis format" -msgstr "" - -#: superset/forms.py:687 -msgid "Y axis format" -msgstr "" - -#: superset/forms.py:700 -msgid "Markup Type" -msgstr "" - -#: superset/forms.py:702 -msgid "markdown" -msgstr "" - -#: superset/forms.py:703 -msgid "html" -msgstr "" - -#: superset/forms.py:706 -msgid "Pick your favorite markup language" -msgstr "" - -#: superset/forms.py:709 -msgid "Rotation" -msgstr "" - -#: superset/forms.py:711 -msgid "random" -msgstr "" - -#: superset/forms.py:712 -msgid "flat" -msgstr "" - -#: superset/forms.py:713 -msgid "square" -msgstr "" - -#: superset/forms.py:716 -msgid "Rotation to apply to words in the cloud" -msgstr "" - -#: superset/forms.py:719 -msgid "Line Style" -msgstr "" - -#: superset/forms.py:721 -msgid "linear" -msgstr "" - -#: superset/forms.py:722 -msgid "basis" -msgstr "" - -#: superset/forms.py:723 -msgid "cardinal" -msgstr "" - -#: superset/forms.py:724 -msgid "monotone" -msgstr "" - -#: superset/forms.py:725 -msgid "step-before" -msgstr "" - -#: superset/forms.py:726 -msgid "step-after" -msgstr "" - -#: superset/forms.py:729 -msgid "Line interpolation as defined by d3.js" -msgstr "" - -#: superset/forms.py:732 -msgid "Label Type" -msgstr "" - -#: superset/forms.py:735 -msgid "Category Name" -msgstr "" - -#: superset/forms.py:736 -msgid "Value" -msgstr "" - -#: superset/forms.py:737 -msgid "Percentage" -msgstr "" - -#: superset/forms.py:739 -msgid "What should be shown on the label?" -msgstr "" - -#: superset/forms.py:742 -msgid "Code" -msgstr "" - -#: superset/forms.py:743 -msgid "Put your code here" -msgstr "" - -#: superset/forms.py:747 -msgid "Aggregation function" -msgstr "" - -#: superset/forms.py:752 -msgid "max" -msgstr "" - -#: superset/forms.py:754 -msgid "stdev" -msgstr "" - -#: superset/forms.py:755 -msgid "var" -msgstr "" - -#: superset/forms.py:758 -msgid "" -"Aggregate function to apply when pivoting and computing the total rows " -"and columns" -msgstr "" - -#: superset/forms.py:763 -msgid "Font Size From" -msgstr "" - -#: superset/forms.py:765 -msgid "Font size for the smallest value in the list" -msgstr "" - -#: superset/forms.py:768 -msgid "Font Size To" -msgstr "" - -#: superset/forms.py:770 -msgid "Font size for the biggest value in the list" -msgstr "" - -#: superset/forms.py:773 -msgid "Range Filter" -msgstr "" - -#: superset/forms.py:775 -msgid "Whether to display the time range interactive selector" -msgstr "" - -#: superset/forms.py:779 -msgid "Date Filter" -msgstr "" - -#: superset/forms.py:781 -msgid "Whether to include a time filter" -msgstr "" - -#: superset/forms.py:784 -msgid "Data Table" -msgstr "" - -#: superset/forms.py:786 -msgid "Whether to display the interactive data table" -msgstr "" - -#: superset/forms.py:789 -msgid "Search Box" -msgstr "" - -#: superset/forms.py:791 -msgid "Whether to include a client side search box" -msgstr "" - -#: superset/forms.py:795 -msgid "Table Filter" -msgstr "" - -#: superset/forms.py:797 -msgid "Whether to apply filter when table cell is clicked" -msgstr "" - -#: superset/forms.py:801 -msgid "Show Bubbles" -msgstr "" - -#: superset/forms.py:803 -msgid "Whether to display bubbles on top of countries" -msgstr "" - -#: superset/forms.py:807 -msgid "Legend" -msgstr "" - -#: superset/forms.py:809 -msgid "Whether to display the legend (toggles)" -msgstr "" - -#: superset/forms.py:812 -msgid "X bounds" -msgstr "" - -#: superset/forms.py:814 -msgid "Whether to display the min and max values of the X axis" -msgstr "" - -#: superset/forms.py:818 -msgid "Rich Tooltip" -msgstr "" - -#: superset/forms.py:820 -msgid "The rich tooltip shows a list of all series for that point in time" -msgstr "" - -#: superset/forms.py:825 -msgid "Y Axis Zero" -msgstr "" - -#: superset/forms.py:827 -msgid "Force the Y axis to start at 0 instead of the minimum value" -msgstr "" - -#: superset/forms.py:832 -msgid "Y Log" -msgstr "" - -#: superset/forms.py:834 -msgid "Use a log scale for the Y axis" -msgstr "" - -#: superset/forms.py:837 -msgid "X Log" -msgstr "" - -#: superset/forms.py:839 -msgid "Use a log scale for the X axis" -msgstr "" - -#: superset/forms.py:842 -msgid "Donut" -msgstr "" - -#: superset/forms.py:844 -msgid "Do you want a donut or a pie?" -msgstr "" - -#: superset/forms.py:847 -msgid "Put labels outside" -msgstr "" - -#: superset/forms.py:849 -msgid "Put the labels outside the pie?" -msgstr "" - -#: superset/forms.py:852 -msgid "Contribution" -msgstr "" - -#: superset/forms.py:854 -msgid "Compute the contribution to the total" -msgstr "" - -#: superset/forms.py:857 -msgid "Period Ratio" -msgstr "" - -#: superset/forms.py:860 -msgid "" -"[integer] Number of period to compare against, this is relative to the " -"granularity selected" -msgstr "" - -#: superset/forms.py:865 -msgid "Period Ratio Type" -msgstr "" - -#: superset/forms.py:868 -msgid "factor" -msgstr "" - -#: superset/forms.py:869 -msgid "growth" -msgstr "" - -#: superset/forms.py:870 -msgid "value" -msgstr "" - -#: superset/forms.py:872 -msgid "" -"`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " -"is (new-previous)" -msgstr "" - -#: superset/forms.py:877 -msgid "Time Shift" -msgstr "" - -#: superset/forms.py:879 -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/forms.py:886 -msgid "Subheader" -msgstr "" - -#: superset/forms.py:887 -msgid "Description text that shows up below your Big Number" -msgstr "" - -#: superset/forms.py:894 -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/forms.py:911 -msgid "Base layer map style" -msgstr "" - -#: superset/forms.py:914 -msgid "Clustering Radius" -msgstr "" - -#: superset/forms.py:927 -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/forms.py:933 -msgid "Point Radius" -msgstr "" - -#: superset/forms.py:936 -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/forms.py:942 -msgid "Point Radius Unit" -msgstr "" - -#: superset/forms.py:949 -msgid "The unit of measure for the specified point radius" -msgstr "" - -#: superset/forms.py:952 -msgid "Opacity" -msgstr "" - -#: superset/forms.py:954 -msgid "Opacity of all clusters, points, and labels. Between 0 and 1." -msgstr "" - -#: superset/forms.py:959 -msgid "Zoom" -msgstr "" - -#: superset/forms.py:962 -msgid "Zoom level of the map" -msgstr "" - -#: superset/forms.py:966 -msgid "Default latitude" -msgstr "" - -#: superset/forms.py:968 -msgid "Latitude of default viewport" -msgstr "" - -#: superset/forms.py:972 -msgid "Default longitude" -msgstr "" - -#: superset/forms.py:974 -msgid "Longitude of default viewport" -msgstr "" - -#: superset/forms.py:978 -msgid "Live render" -msgstr "" - -#: superset/forms.py:980 -msgid "Points and clusters will update as viewport is being changed" -msgstr "" - -#: superset/forms.py:985 -msgid "RGB Color" -msgstr "" - -#: superset/forms.py:995 -msgid "The color for points and clusters in RGB" -msgstr "" - -#: superset/forms.py:998 -msgid "Ranges" -msgstr "" - -#: superset/forms.py:1000 -msgid "Ranges to highlight with shading" -msgstr "" - -#: superset/forms.py:1003 -msgid "Range labels" -msgstr "" - -#: superset/forms.py:1005 -msgid "Labels for the ranges" -msgstr "" - -#: superset/forms.py:1008 -msgid "Markers" -msgstr "" - -#: superset/forms.py:1010 -msgid "List of values to mark with triangles" -msgstr "" - -#: superset/forms.py:1013 -msgid "Marker labels" -msgstr "" - -#: superset/forms.py:1015 -msgid "Labels for the markers" -msgstr "" - -#: superset/forms.py:1018 -msgid "Marker lines" -msgstr "" - -#: superset/forms.py:1020 -msgid "List of values to mark with lines" -msgstr "" - -#: superset/forms.py:1023 -msgid "Marker line labels" -msgstr "" - -#: superset/forms.py:1025 -msgid "Labels for the marker lines" -msgstr "" - -#: superset/forms.py:1088 -msgid "SQL" -msgstr "" - -#: superset/forms.py:1090 -msgid "This section exposes ways to include snippets of SQL in your query" -msgstr "" - -#: superset/forms.py:1101 -msgid "Time Grain" -msgstr "" - -#: superset/forms.py:1104 -msgid "" -"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" -msgstr "" - -#: superset/forms.py:1139 superset/forms.py:1143 -msgid "Filter 1" -msgstr "" - -#: superset/forms.py:1148 -msgid "Super" -msgstr "" - -#: superset/forms.py:1152 -msgid "Time" -msgstr "" - -#: superset/forms.py:1157 -msgid "Time related form attributes" -msgstr "" - -#: superset/forms.py:1164 -msgid "CSV File" -msgstr "" - -#: superset/forms.py:1165 -msgid "Select a CSV file to be uploaded to a database." -msgstr "" - -#: superset/forms.py:1169 -msgid "CSV Files Only!" -msgstr "" - -#: superset/forms.py:1171 -msgid "Delimiter" -msgstr "" - -#: superset/forms.py:1172 -msgid "Delimiter used by CSV file (for whitespace use \\s+)." -msgstr "" - -#: superset/forms.py:1177 -msgid "Header Row" -msgstr "" - -#: superset/forms.py:1178 -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:1188 -msgid "Column Names" -msgstr "" - -#: superset/forms.py:1189 -msgid "" -"List of comma-separated column names to use if header row not specified " -"above. Leave empty if header field populated." -msgstr "" - -#: superset/forms.py:1198 -msgid "Index Column" -msgstr "" - -#: superset/forms.py:1199 -msgid "" -"Column to use as the row labels of the dataframe. Leave empty if no index" -" column." -msgstr "" - -#: superset/forms.py:1207 -msgid "Squeeze" -msgstr "" - -#: superset/forms.py:1208 -msgid "" -"Parse the data as a series (specify this option if the data contains only" -" one column.)" -msgstr "" - -#: superset/forms.py:1213 -msgid "Prefix" -msgstr "" - -#: superset/forms.py:1214 -msgid "" -"Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " -"X1\")." -msgstr "" - -#: superset/forms.py:1220 -msgid "Mangle Duplicate Columns" -msgstr "" - -#: superset/forms.py:1221 -msgid "Specify duplicate columns as \"X.0, X.1\"." -msgstr "" - -#: superset/forms.py:1224 -msgid "Skip Initial Space" -msgstr "" - -#: superset/forms.py:1225 -msgid "Skip spaces after delimiter." -msgstr "" - -#: superset/forms.py:1227 -msgid "Skip Rows" -msgstr "" - -#: superset/forms.py:1228 -msgid "Number of rows to skip at start of file." -msgstr "" - -#: superset/forms.py:1234 -msgid "Rows to Read" -msgstr "" - -#: superset/forms.py:1235 -msgid "Number of rows of file to read." -msgstr "" - -#: superset/forms.py:1239 -msgid "Skip Blank Lines" -msgstr "" - -#: superset/forms.py:1240 -msgid "Skip blank lines rather than interpreting them as NaN values." -msgstr "" - -#: superset/forms.py:1244 -msgid "Parse Dates" -msgstr "" - -#: superset/forms.py:1245 -msgid "Parse date values." -msgstr "" - -#: superset/forms.py:1247 -msgid "Infer Datetime Format" -msgstr "" - -#: superset/forms.py:1248 -msgid "Use Pandas to interpret the datetime format automatically." -msgstr "" - -#: superset/forms.py:1253 -msgid "Day First" -msgstr "" - -#: superset/forms.py:1254 -msgid "Use DD/MM (European/International) date format." -msgstr "" - -#: superset/forms.py:1257 -msgid "Thousands Separator" -msgstr "" - -#: superset/forms.py:1258 -msgid "Separator for values in thousands." -msgstr "" - -#: superset/forms.py:1263 -msgid "Decimal Character" -msgstr "" - -#: superset/forms.py:1264 -msgid "Character to interpret as decimal point." -msgstr "" - -#: superset/forms.py:1269 -msgid "Quote Character" -msgstr "" - -#: superset/forms.py:1270 -msgid "Character used to denote the start and end of a quoted item." -msgstr "" - -#: superset/forms.py:1276 -msgid "Escape Character" -msgstr "" - -#: superset/forms.py:1277 -msgid "Character used to escape a quoted item." -msgstr "" - -#: superset/forms.py:1282 -msgid "Comment Character" -msgstr "" - -#: superset/forms.py:1283 -msgid "Character used to denote the start of a comment." -msgstr "" - -#: superset/forms.py:1288 -msgid "Encoding" -msgstr "" - -#: superset/forms.py:1289 -msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." -msgstr "" - -#: superset/forms.py:1294 -msgid "Error On Bad Lines" -msgstr "" - -#: superset/forms.py:1295 -msgid "" -"Error on bad lines (e.g. a line with too many commas). If false these bad" -" lines will instead be dropped from the resulting dataframe." -msgstr "" - -#: superset/forms.py:1304 -msgid "Table Name" -msgstr "" - -#: superset/forms.py:1305 -msgid "Name of table to be createdfrom csv data." -msgstr "" +msgstr "Colonna del Tempo" -#: superset/forms.py:1309 -msgid "Database URI" -msgstr "" - -#: superset/forms.py:1310 -msgid "URI of database in which to add above table." -msgstr "" +#: superset/db_engine_specs.py:195 superset/db_engine_specs.py:226 +#: superset/db_engine_specs.py:318 superset/db_engine_specs.py:363 +#: superset/db_engine_specs.py:771 superset/db_engine_specs.py:839 +msgid "second" +msgstr "secondo" -#: superset/connectors/sqla/views.py:199 superset/forms.py:1314 -msgid "Schema" -msgstr "" +#: superset/db_engine_specs.py:196 superset/db_engine_specs.py:229 +#: superset/db_engine_specs.py:321 superset/db_engine_specs.py:365 +#: superset/db_engine_specs.py:773 superset/db_engine_specs.py:807 +#: superset/db_engine_specs.py:841 superset/db_engine_specs.py:885 +msgid "minute" +msgstr "minuto" -#: superset/forms.py:1315 -msgid "Specify a schema (if database flavour supports this)." -msgstr "" +#: superset/db_engine_specs.py:197 superset/db_engine_specs.py:233 +#: superset/db_engine_specs.py:323 superset/db_engine_specs.py:367 +#: superset/db_engine_specs.py:779 superset/db_engine_specs.py:809 +#: superset/db_engine_specs.py:843 superset/db_engine_specs.py:891 +msgid "hour" +msgstr "ora" -#: superset/forms.py:1320 -msgid "Table Exists" -msgstr "" +#: superset/db_engine_specs.py:198 superset/db_engine_specs.py:238 +#: superset/db_engine_specs.py:270 superset/db_engine_specs.py:325 +#: superset/db_engine_specs.py:369 superset/db_engine_specs.py:781 +#: superset/db_engine_specs.py:811 superset/db_engine_specs.py:845 +#: superset/db_engine_specs.py:893 +msgid "day" +msgstr "giorno" -#: superset/forms.py:1321 -msgid "" -"If table exists do one of the following: Fail (do nothing), Replace (drop" -" and recreate table) or Append (insert data)." -msgstr "" +#: superset/db_engine_specs.py:199 superset/db_engine_specs.py:244 +#: superset/db_engine_specs.py:271 superset/db_engine_specs.py:326 +#: superset/db_engine_specs.py:371 superset/db_engine_specs.py:783 +#: superset/db_engine_specs.py:813 superset/db_engine_specs.py:847 +msgid "week" +msgstr "settimana" -#: superset/forms.py:1327 -msgid "Fail" -msgstr "" +#: superset/db_engine_specs.py:200 superset/db_engine_specs.py:246 +#: superset/db_engine_specs.py:273 superset/db_engine_specs.py:328 +#: superset/db_engine_specs.py:373 superset/db_engine_specs.py:785 +#: superset/db_engine_specs.py:815 superset/db_engine_specs.py:849 +#: superset/db_engine_specs.py:895 +msgid "month" +msgstr "mese" -#: superset/forms.py:1328 -msgid "Replace" -msgstr "" +#: superset/db_engine_specs.py:201 superset/db_engine_specs.py:248 +#: superset/db_engine_specs.py:330 superset/db_engine_specs.py:375 +#: superset/db_engine_specs.py:787 superset/db_engine_specs.py:817 +#: superset/db_engine_specs.py:851 superset/db_engine_specs.py:897 +msgid "quarter" +msgstr "quartile" -#: superset/forms.py:1329 -msgid "Append" -msgstr "" +#: superset/db_engine_specs.py:202 superset/db_engine_specs.py:252 +#: superset/db_engine_specs.py:332 superset/db_engine_specs.py:789 +#: superset/db_engine_specs.py:819 superset/db_engine_specs.py:899 +msgid "year" +msgstr "anno" -#: superset/forms.py:1331 -msgid "Dataframe Index" -msgstr "" +#: superset/db_engine_specs.py:334 +msgid "week_start_monday" +msgstr "settimana_inizio_lunedì" -#: superset/forms.py:1332 -msgid "Write dataframe index as a column." -msgstr "" +#: superset/db_engine_specs.py:377 superset/db_engine_specs.py:853 +msgid "week_ending_saturday" +msgstr "settimana_fine_domenica" -#: superset/forms.py:1334 -msgid "Column Label(s)" -msgstr "" +#: superset/db_engine_specs.py:380 superset/db_engine_specs.py:856 +msgid "week_start_sunday" +msgstr "settimana_inizio_domenica" -#: superset/forms.py:1335 -msgid "" -"Column label for index column(s). If None is given and Dataframe Index is" -" True, Index Names are used." -msgstr "" +#: superset/db_engine_specs.py:775 superset/db_engine_specs.py:887 +msgid "5 minute" +msgstr "5 minuti" -#: superset/forms.py:1342 -msgid "Chunksize" -msgstr "" +#: superset/db_engine_specs.py:777 +msgid "half hour" +msgstr "mezz'ora" -#: superset/forms.py:1343 -msgid "" -"If empty, all rows will be written at once. Otherwise, rows will be " -"written in batches of this many rows at a time." -msgstr "" +#: superset/db_engine_specs.py:889 +msgid "10 minute" +msgstr "10 minuti" #: superset/viz.py:311 msgid "Table View" -msgstr "" +msgstr "Vista Tabella" #: superset/viz.py:364 msgid "Pivot Table" -msgstr "" +msgstr "Vista Pivot" #: superset/viz.py:413 msgid "Markup" -msgstr "" +msgstr "Marcatore" #: superset/viz.py:432 msgid "Separator" -msgstr "" +msgstr "Separatore" #: superset/viz.py:448 msgid "Word Cloud" -msgstr "" +msgstr "Cloud di Parole" #: superset/viz.py:471 msgid "Treemap" -msgstr "" +msgstr "Treemap" #: superset/viz.py:497 msgid "Calendar Heatmap" -msgstr "" +msgstr "Calendario di Intensità" #: superset/viz.py:555 msgid "Box Plot" -msgstr "" +msgstr "Box Plot" #: superset/viz.py:644 msgid "Bubble Chart" -msgstr "" +msgstr "Grafico a Bolle" #: superset/viz.py:693 msgid "Bullet Chart" -msgstr "" +msgstr "Grafico a Proiettile" #: superset/viz.py:742 msgid "Big Number with Trendline" -msgstr "" +msgstr "Numero Grande con Linea del Trend" #: superset/viz.py:771 msgid "Big Number" -msgstr "" +msgstr "Numero Grande" #: superset/viz.py:798 msgid "Time Series - Line Chart" -msgstr "" +msgstr "Serie Temporali - Grafico Lineare" #: superset/viz.py:925 msgid "Time Series - Dual Axis Line Chart" -msgstr "" +msgstr "Serie Temporali - Grafico Lineare ad Assi Duali" #: superset/viz.py:1000 msgid "Time Series - Bar Chart" -msgstr "" +msgstr "Serie Temporali - Grafico Barre" #: superset/viz.py:1008 msgid "Time Series - Percent Change" -msgstr "" +msgstr "Serie Temporali - Cambiamento Percentuale" #: superset/viz.py:1016 msgid "Time Series - Stacked" -msgstr "" +msgstr "Serie Temporali - Stacked" #: superset/viz.py:1025 msgid "Distribution - NVD3 - Pie Chart" -msgstr "" +msgstr "Distribuzione - NVD3 - Grafico Torta" #: superset/viz.py:1043 msgid "Histogram" -msgstr "" +msgstr "Istogramma" #: superset/viz.py:1068 msgid "Distribution - Bar Chart" -msgstr "" +msgstr "Distribuzione - Grafico Barre" #: superset/viz.py:1135 msgid "Sunburst" -msgstr "" +msgstr "Sunburst" #: superset/viz.py:1168 msgid "Sankey" -msgstr "" +msgstr "Sankey" #: superset/viz.py:1217 msgid "Directed Force Layout" -msgstr "" +msgstr "Disposizione a Forza Diretta" #: superset/viz.py:1238 msgid "Country Map" -msgstr "" +msgstr "Mappa della Nazione" #: superset/viz.py:1267 msgid "World Map" -msgstr "" +msgstr "Mappa del Mondo" #: superset/viz.py:1317 msgid "Filters" -msgstr "" +msgstr "Filtri" #: superset/viz.py:1352 msgid "iFrame" -msgstr "" +msgstr "iFrame" #: superset/viz.py:1369 msgid "Parallel Coordinates" -msgstr "" +msgstr "Coordinate Parallele" #: superset/viz.py:1394 msgid "Heatmap" -msgstr "" +msgstr "Mappa di Intensità" #: superset/viz.py:1445 msgid "Horizon Charts" -msgstr "" +msgstr "Grafici d'orizzonte" #: superset/viz.py:1456 msgid "Mapbox" -msgstr "" +msgstr "Mapbox" #: superset/connectors/druid/models.py:934 msgid "No data was returned." -msgstr "" +msgstr "Nessun dato restituito." #: superset/connectors/druid/views.py:37 superset/connectors/sqla/views.py:74 msgid "Column" -msgstr "" +msgstr "Colonna" #: superset/connectors/druid/views.py:38 superset/connectors/druid/views.py:97 #: superset/connectors/sqla/views.py:120 msgid "Type" -msgstr "" +msgstr "Tipo" -#: superset/connectors/druid/views.py:39 superset/views/core.py:310 -#: superset/views/core.py:359 +#: superset/connectors/druid/views.py:39 superset/views/core.py:306 +#: superset/views/core.py:355 msgid "Datasource" -msgstr "" +msgstr "Sorgente Dati" #: superset/connectors/druid/views.py:40 superset/connectors/sqla/views.py:77 msgid "Groupable" -msgstr "" +msgstr "Raggruppabile" #: superset/connectors/druid/views.py:41 superset/connectors/sqla/views.py:78 msgid "Filterable" -msgstr "" +msgstr "Filtrabile" #: superset/connectors/druid/views.py:42 superset/connectors/sqla/views.py:80 msgid "Count Distinct" -msgstr "" +msgstr "Count Distinct" #: superset/connectors/druid/views.py:43 superset/connectors/sqla/views.py:81 msgid "Sum" -msgstr "" +msgstr "Sum" #: superset/connectors/druid/views.py:44 superset/connectors/sqla/views.py:82 msgid "Min" -msgstr "" +msgstr "Min" #: superset/connectors/druid/views.py:45 superset/connectors/sqla/views.py:83 msgid "Max" -msgstr "" +msgstr "Max" -#: superset/connectors/druid/views.py:48 superset/connectors/sqla/views.py:43 -msgid "" -"Whether this column is exposed in the `Filters` section of the explore " -"view." +#: superset/forms.py:265 +msgid "Sort bars by x labels." msgstr "" +"Se questa colonna è esposta nella sezione `Filtri` della vista " +"esplorazione." -#: superset/connectors/druid/views.py:88 superset/connectors/sqla/views.py:102 -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 " -"metric)' are allowed to access this metric" +#: superset/forms.py:268 +msgid "Extra Controls" msgstr "" +"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" + +#: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:117 +msgid "Metric" +msgstr "Metrica" #: superset/connectors/druid/views.py:95 superset/connectors/druid/views.py:205 #: superset/connectors/sqla/views.py:76 superset/connectors/sqla/views.py:118 -#: superset/views/core.py:360 +#: superset/views/core.py:356 msgid "Description" -msgstr "" +msgstr "Descrizione" #: superset/connectors/druid/views.py:96 superset/connectors/sqla/views.py:75 #: superset/connectors/sqla/views.py:119 msgid "Verbose Name" -msgstr "" +msgstr "Nome Completo" -#: superset/connectors/druid/views.py:98 superset/views/core.py:533 +#: superset/connectors/druid/views.py:98 superset/views/core.py:529 msgid "JSON" -msgstr "" +msgstr "JSON" #: superset/connectors/druid/views.py:99 msgid "Druid Datasource" -msgstr "" +msgstr "Sorgente Dati Druid" #: superset/connectors/druid/views.py:124 #: superset/connectors/druid/views.py:204 msgid "Cluster" -msgstr "" +msgstr "Cluster" #: superset/connectors/druid/views.py:125 msgid "Coordinator Host" -msgstr "" +msgstr "Host Coordinatore" #: superset/connectors/druid/views.py:126 msgid "Coordinator Port" -msgstr "" +msgstr "Porta Coordinatore" #: superset/connectors/druid/views.py:127 msgid "Coordinator Endpoint" -msgstr "" +msgstr "Endpoint Coordinatore" #: superset/connectors/druid/views.py:128 msgid "Broker Host" -msgstr "" +msgstr "Host Broker" #: superset/connectors/druid/views.py:129 msgid "Broker Port" -msgstr "" +msgstr "Porta Broker" #: superset/connectors/druid/views.py:130 msgid "Broker Endpoint" -msgstr "" +msgstr "Endpoint Broker" #: superset/connectors/druid/views.py:173 superset/connectors/sqla/views.py:156 msgid "" @@ -1783,10 +346,16 @@ msgid "" "saving if removing slices from a datasource. If you want to change the " "datasource for a slice, overwrite the slice from the 'explore view'" msgstr "" +"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'" #: superset/connectors/druid/views.py:181 superset/connectors/sqla/views.py:164 msgid "Timezone offset (in hours) for this datasource" -msgstr "" +msgstr "Timezone offset (in ore) per questa sorgente dati" #: superset/connectors/druid/views.py:185 msgid "" @@ -1795,6 +364,11 @@ msgid "" "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" msgstr "" +"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" #: superset/connectors/druid/views.py:192 superset/connectors/sqla/views.py:186 msgid "" @@ -1802,107 +376,118 @@ msgid "" "section with a list of distinct values fetched from the backend on the " "fly" 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:196 superset/connectors/sqla/views.py:200 msgid "" "Redirects to this endpoint when clicking on the datasource from the " "datasource list" msgstr "" +"Rinvia a questo endpoint al clic sulla sorgente dati dall'elenco delle " +"sorgenti dati" #: superset/connectors/druid/views.py:202 superset/connectors/sqla/views.py:193 msgid "Associated Slices" -msgstr "" +msgstr "Slice associate" #: superset/connectors/druid/views.py:203 msgid "Data Source" -msgstr "" +msgstr "Sorgente Dati" #: superset/connectors/druid/views.py:206 msgid "Owner" -msgstr "" +msgstr "Proprietario" #: superset/connectors/druid/views.py:207 msgid "Is Hidden" -msgstr "" +msgstr "è nascosto" #: superset/connectors/druid/views.py:208 superset/connectors/sqla/views.py:198 msgid "Enable Filter Select" -msgstr "" +msgstr "Abilita il filtro di Select" #: superset/connectors/druid/views.py:209 msgid "Default Endpoint" -msgstr "" +msgstr "Endpoint predefinito" #: superset/connectors/druid/views.py:210 msgid "Time Offset" -msgstr "" +msgstr "Offset temporale" #: superset/connectors/druid/views.py:211 superset/connectors/sqla/views.py:204 -#: superset/views/core.py:245 superset/views/core.py:356 +#: superset/views/core.py:242 superset/views/core.py:352 msgid "Cache Timeout" -msgstr "" +msgstr "Cache Timeout" #: superset/connectors/sqla/models.py:388 msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" +"Defines the origin where time buckets start, accepts natural dates as in " +"'now', 'sunday' or '1970-01-01'" msgstr "" +"la colonna Datetime è necessaria per questo tipo di grafico. Nella " +"configurazione della tabella però non è stata definita" #: superset/connectors/sqla/models.py:393 msgid "Metric '{}' is not valid" -msgstr "" +msgstr "Metrica '{}' non valida" -#: superset/connectors/sqla/views.py:39 -msgid "" -"Whether to make this column available as a [Time Granularity] option, " -"column has to be DATETIME or DATETIME-like" +#: superset/forms.py:352 +msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "" +"Se rendere disponibile questa colonna come opzione [Time Granularity], la" +" colonna deve essere di tipo DATETIME o simile" -#: superset/connectors/sqla/views.py:46 -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 " -"most case users should not need to alter this." +#: superset/forms.py:357 +msgid "Page Length" msgstr "" +"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." #: superset/connectors/sqla/views.py:79 superset/connectors/sqla/views.py:122 -#: superset/connectors/sqla/views.py:194 superset/views/core.py:366 +#: superset/connectors/sqla/views.py:194 superset/views/core.py:362 msgid "Table" -msgstr "" +msgstr "Tabella" #: superset/connectors/sqla/views.py:84 msgid "Expression" -msgstr "" +msgstr "Espressione" #: superset/connectors/sqla/views.py:85 msgid "Is temporal" -msgstr "" +msgstr "è temporale" #: superset/connectors/sqla/views.py:86 msgid "Datetime Format" -msgstr "" +msgstr "Formato Datetime" #: superset/connectors/sqla/views.py:87 msgid "Database Expression" -msgstr "" +msgstr "Espressione del Database" #: superset/connectors/sqla/views.py:121 msgid "SQL Expression" -msgstr "" +msgstr "Espressione SQL" #: superset/connectors/sqla/views.py:165 msgid "Name of the table that exists in the source database" -msgstr "" +msgstr "Nome delle tabella esistente nella sorgente del database" #: superset/connectors/sqla/views.py:167 msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" msgstr "" +"Schema, va utilizzato soltanto in alcuni database come Postgres, Redshift" +" e DB2" #: superset/connectors/sqla/views.py:173 msgid "" "This fields acts a Superset view, meaning that Superset will run a query " "against this string as a subquery." msgstr "" +"Questo campo agisce come una vista Superset, il che vuol dire che " +"Superset eseguirà una query su questa stringa come sotto-query." #: superset/connectors/sqla/views.py:177 msgid "" @@ -1910,273 +495,298 @@ msgid "" "control component. Supports jinja template syntax. Applies only when " "`Enable Filter Select` is on." msgstr "" +"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\"." #: superset/connectors/sqla/views.py:183 msgid "Redirects to this endpoint when clicking on the table from the table list" -msgstr "" +msgstr "Reinvia a questo endpoint al clic sulla tabella dall'elenco delle tabelle" #: superset/connectors/sqla/views.py:195 msgid "Changed By" -msgstr "" +msgstr "Modificato da" -#: superset/connectors/sqla/views.py:196 superset/views/core.py:241 +#: superset/connectors/sqla/views.py:196 superset/views/core.py:238 msgid "Database" -msgstr "" +msgstr "Database" -#: superset/connectors/sqla/views.py:197 superset/views/core.py:243 +#: superset/connectors/sqla/views.py:197 superset/views/core.py:240 msgid "Last Changed" -msgstr "" +msgstr "Ultima Modifica" + +#: superset/connectors/sqla/views.py:199 +msgid "Schema" +msgstr "Schema" #: superset/connectors/sqla/views.py:203 msgid "Offset" -msgstr "" +msgstr "Offset" #: superset/connectors/sqla/views.py:236 msgid "" -"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." +"The time unit for each block. Should be a smaller unit than " +"domain_granularity. Should be larger or equal to Time Grain" msgstr "" +"Tabella creata. Come parte di questo processo di configurazione in due " +"fasi, è necessario andare sul pulsante di modifica della nuova tabella " +"per configurarla." #: superset/templates/appbuilder/navbar_right.html:41 msgid "Profile" -msgstr "" +msgstr "Profilo" #: superset/templates/appbuilder/navbar_right.html:42 msgid "Logout" -msgstr "" +msgstr "Logout" #: superset/templates/appbuilder/navbar_right.html:47 msgid "Login" -msgstr "" - -#: superset/templates/superset/import_dashboards.html:11 -msgid "Import" -msgstr "" +msgstr "Login" #: superset/templates/superset/request_access.html:2 msgid "No Access!" -msgstr "" +msgstr "Nessun Accesso!" #: superset/templates/superset/request_access.html:7 #, python-format msgid "You do not have permissions to access the datasource(s): %(name)s." -msgstr "" +msgstr "Non hai i permessi per accedere alla/e sorgente/i dati: %(name)s." #: superset/templates/superset/request_access.html:13 msgid "Request Permissions" -msgstr "" +msgstr "Richiesta di Permessi" #: superset/templates/superset/request_access.html:16 msgid "Cancel" -msgstr "" - -#: superset/templates/superset/welcome.html:10 -msgid "Welcome!" -msgstr "" - -#: superset/templates/superset/welcome.html:20 superset/views/core.py:358 -msgid "Dashboards" -msgstr "" +msgstr "Annulla" #: superset/templates/superset/models/database/macros.html:4 msgid "Test Connection" -msgstr "" +msgstr "Testa la Connessione" -#: superset/views/core.py:209 +#: superset/views/core.py:206 msgid "Expose this DB in SQL Lab" -msgstr "" +msgstr "Esponi questo DB in SQL Lab" -#: superset/views/core.py:210 +#: superset/views/core.py:207 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 " "(<~1 minute)" msgstr "" +"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)" -#: superset/views/core.py:214 +#: superset/views/core.py:211 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." msgstr "" +"Permetti agli utenti di eseguire query, contro un back-office asincrono. " +"Questo presuppone che si abbia una installazione funzionante di Celery " +"nel backend." -#: superset/views/core.py:218 +#: superset/views/core.py:215 msgid "Allow CREATE TABLE AS option in SQL Lab" -msgstr "" +msgstr "Permetti l'opzione CREATE TABLE AS in SQL Lab" -#: superset/views/core.py:219 +#: superset/views/core.py:216 msgid "" "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" " SQL Lab" msgstr "" +"Permetti agli utenti di eseguire dichiarazioni diverse da SELECT (UPDATE," +" DELETE, CREATE, ...) nel SQL Lab" -#: superset/views/core.py:223 +#: superset/views/core.py:220 msgid "" "When allowing CREATE TABLE AS option in SQL Lab, this option forces the " "table to be created in this schema" 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:237 +#: superset/views/core.py:234 msgid "Expose in SQL Lab" -msgstr "" +msgstr "Esponi in SQL Lab" -#: superset/views/core.py:238 +#: superset/views/core.py:235 msgid "Allow CREATE TABLE AS" -msgstr "" +msgstr "Permetti CREATE TABLE AS" -#: superset/views/core.py:239 +#: superset/views/core.py:236 msgid "Allow DML" -msgstr "" +msgstr "Permetti DML" -#: superset/views/core.py:240 +#: superset/views/core.py:237 msgid "CTAS Schema" -msgstr "" +msgstr "Schema CTAS" -#: superset/views/core.py:242 superset/views/core.py:357 -#: superset/views/core.py:453 superset/views/core.py:517 +#: superset/views/core.py:239 superset/views/core.py:353 +#: superset/views/core.py:449 superset/views/core.py:513 msgid "Creator" -msgstr "" +msgstr "Creatore" -#: superset/views/core.py:244 +#: superset/views/core.py:241 msgid "SQLAlchemy URI" -msgstr "" +msgstr "URI SQLAlchemy" -#: superset/views/core.py:246 +#: superset/views/core.py:243 msgid "Extra" -msgstr "" +msgstr "Extra" -#: superset/views/core.py:307 superset/views/core.py:530 +#: superset/views/core.py:303 superset/views/core.py:526 msgid "User" -msgstr "" +msgstr "Utente" -#: superset/views/core.py:308 +#: superset/views/core.py:304 msgid "User Roles" -msgstr "" +msgstr "Ruoli Utente" -#: superset/views/core.py:309 +#: superset/views/core.py:305 msgid "Database URL" -msgstr "" +msgstr "URL del Database" -#: superset/views/core.py:311 +#: superset/views/core.py:307 msgid "Roles to grant" -msgstr "" +msgstr "Ruoli per l'accesso" -#: superset/views/core.py:312 +#: superset/views/core.py:308 msgid "Created On" -msgstr "" +msgstr "Creato il" -#: superset/views/core.py:345 +#: superset/views/core.py:341 msgid "" -"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." +"Timestamp from filter. This supports free form typing and natural " +"language as in '1 day ago', '28 days' or '3 years'" msgstr "" +"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." -#: superset/views/core.py:350 +#: superset/views/core.py:346 msgid "Duration (in seconds) of the caching timeout for this slice." -msgstr "" +msgstr "Durata (in secondi) per il timeout della cache per questa slice." -#: superset/views/core.py:361 +#: superset/views/core.py:354 +msgid "Dashboards" +msgstr "Elenco Dashboard" + +#: superset/views/core.py:357 msgid "Last Modified" -msgstr "" +msgstr "Ultima Modifica" -#: superset/views/core.py:362 superset/views/core.py:452 +#: superset/views/core.py:358 superset/views/core.py:448 msgid "Owners" -msgstr "" +msgstr "Proprietari" -#: superset/views/core.py:363 +#: superset/views/core.py:359 msgid "Parameters" -msgstr "" +msgstr "Parametri" -#: superset/views/core.py:364 superset/views/core.py:400 +#: superset/views/core.py:360 superset/views/core.py:396 msgid "Slice" -msgstr "" +msgstr "Slice" -#: superset/views/core.py:365 +#: superset/views/core.py:361 msgid "Name" -msgstr "" +msgstr "Nome" -#: superset/views/core.py:367 +#: superset/views/core.py:363 msgid "Visualization Type" -msgstr "" +msgstr "Tipo di Visualizzazione" -#: superset/views/core.py:425 +#: superset/views/core.py:421 msgid "" "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" msgstr "" +"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. " -#: superset/views/core.py:430 +#: superset/views/core.py:426 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" 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:434 +#: superset/views/core.py:430 msgid "To get a readable URL for your dashboard" -msgstr "" +msgstr "ottenere una URL leggibile per la tua dashboard" -#: superset/views/core.py:435 +#: superset/views/core.py:431 msgid "" "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." msgstr "" +"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." -#: superset/views/core.py:440 +#: superset/views/core.py:436 msgid "Owners is a list of users who can alter the dashboard." -msgstr "" +msgstr "Proprietari è una lista di utenti che può alterare la dashboard." -#: superset/views/core.py:448 superset/views/core.py:515 +#: superset/views/core.py:444 superset/views/core.py:511 msgid "Dashboard" -msgstr "" +msgstr "Dashboard" -#: superset/views/core.py:449 superset/views/core.py:516 +#: superset/views/core.py:445 superset/views/core.py:512 msgid "Title" -msgstr "" +msgstr "Titolo" -#: superset/views/core.py:450 +#: superset/views/core.py:446 msgid "Slug" -msgstr "" +msgstr "Slug" -#: superset/views/core.py:451 +#: superset/views/core.py:447 msgid "Slices" -msgstr "" +msgstr "Slice" -#: superset/views/core.py:454 superset/views/core.py:518 +#: superset/views/core.py:450 superset/views/core.py:514 msgid "Modified" -msgstr "" +msgstr "Modificato" -#: superset/views/core.py:455 +#: superset/views/core.py:451 msgid "Position JSON" -msgstr "" +msgstr "Posizione del JSON" -#: superset/views/core.py:456 +#: superset/views/core.py:452 msgid "CSS" -msgstr "" +msgstr "CSS" -#: superset/views/core.py:457 +#: superset/views/core.py:453 msgid "JSON Metadata" -msgstr "" +msgstr "Metadati JSON" -#: superset/views/core.py:458 +#: superset/views/core.py:454 msgid "Underlying Tables" -msgstr "" +msgstr "Tabelle sottostanti" -#: superset/views/core.py:531 +#: superset/views/core.py:527 msgid "Action" -msgstr "" +msgstr "Azione" -#: superset/views/core.py:532 +#: superset/views/core.py:528 msgid "dttm" -msgstr "" +msgstr "dttm" -#: superset/views/core.py:2283 +#: superset/views/core.py:2279 msgid "SQL Editor" -msgstr "" +msgstr "Editor SQL" -#: superset/views/core.py:2292 +#: superset/views/core.py:2288 msgid "Query Search" -msgstr "" +msgstr "Ricerca Query" diff --git a/superset/translations/zh/LC_MESSAGES/messages.mo b/superset/translations/zh/LC_MESSAGES/messages.mo index 66fdeb630e37c85496c8c063ea1fc38ac3587815..534b45a86773cd22f019fb20f2cc57b971f3ce6f 100644 GIT binary patch literal 12815 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 diff --git a/superset/translations/zh/LC_MESSAGES/messages.po b/superset/translations/zh/LC_MESSAGES/messages.po index b2de87ca3778..b281f42c4814 100644 --- a/superset/translations/zh/LC_MESSAGES/messages.po +++ b/superset/translations/zh/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-06-01 09:20-0400\n" -"PO-Revision-Date: 2017-06-01 09:21-0400\n" +"POT-Creation-Date: 2017-06-04 20:38+0200\n" +"PO-Revision-Date: 2016-05-01 23:07-0700\n" "Last-Translator: FULL NAME \n" "Language: zh\n" "Language-Team: zh \n" @@ -22,7 +22,7 @@ msgstr "" #: superset/db_engine_specs.py:269 superset/db_engine_specs.py:317 #: superset/db_engine_specs.py:362 superset/db_engine_specs.py:770 #: superset/db_engine_specs.py:806 superset/db_engine_specs.py:838 -#: superset/db_engine_specs.py:884 superset/forms.py:443 +#: superset/db_engine_specs.py:884 msgid "Time Column" msgstr "" @@ -43,7 +43,7 @@ msgstr "" #: superset/db_engine_specs.py:323 superset/db_engine_specs.py:367 #: superset/db_engine_specs.py:779 superset/db_engine_specs.py:809 #: superset/db_engine_specs.py:843 superset/db_engine_specs.py:891 -#: superset/forms.py:387 superset/forms.py:401 +#: superset/forms.py:392 superset/forms.py:406 msgid "hour" msgstr "" @@ -51,7 +51,7 @@ msgstr "" #: superset/db_engine_specs.py:270 superset/db_engine_specs.py:325 #: superset/db_engine_specs.py:369 superset/db_engine_specs.py:781 #: superset/db_engine_specs.py:811 superset/db_engine_specs.py:845 -#: superset/db_engine_specs.py:893 superset/forms.py:388 superset/forms.py:402 +#: superset/db_engine_specs.py:893 superset/forms.py:393 superset/forms.py:407 msgid "day" msgstr "" @@ -59,7 +59,7 @@ msgstr "" #: superset/db_engine_specs.py:271 superset/db_engine_specs.py:326 #: superset/db_engine_specs.py:371 superset/db_engine_specs.py:783 #: superset/db_engine_specs.py:813 superset/db_engine_specs.py:847 -#: superset/forms.py:373 superset/forms.py:389 superset/forms.py:403 +#: superset/forms.py:376 superset/forms.py:394 superset/forms.py:408 msgid "week" msgstr "" @@ -67,8 +67,8 @@ msgstr "" #: superset/db_engine_specs.py:273 superset/db_engine_specs.py:328 #: superset/db_engine_specs.py:373 superset/db_engine_specs.py:785 #: superset/db_engine_specs.py:815 superset/db_engine_specs.py:849 -#: superset/db_engine_specs.py:895 superset/forms.py:376 superset/forms.py:390 -#: superset/forms.py:404 +#: superset/db_engine_specs.py:895 superset/forms.py:379 superset/forms.py:395 +#: superset/forms.py:409 msgid "month" msgstr "" @@ -82,7 +82,7 @@ msgstr "" #: superset/db_engine_specs.py:202 superset/db_engine_specs.py:252 #: superset/db_engine_specs.py:332 superset/db_engine_specs.py:789 #: superset/db_engine_specs.py:819 superset/db_engine_specs.py:899 -#: superset/forms.py:391 +#: superset/forms.py:396 msgid "year" msgstr "" @@ -91,7 +91,7 @@ msgid "week_start_monday" msgstr "" #: superset/db_engine_specs.py:377 superset/db_engine_specs.py:853 -#: superset/forms.py:375 +#: superset/forms.py:378 msgid "week_ending_saturday" msgstr "" @@ -115,182 +115,182 @@ msgstr "" msgid "D3 format syntax https://github.com/d3/d3-format" msgstr "" -#: superset/forms.py:150 +#: superset/forms.py:152 msgid "Viz" msgstr "" -#: superset/forms.py:153 +#: superset/forms.py:155 msgid "The type of visualization to display" msgstr "" -#: superset/forms.py:156 +#: superset/forms.py:158 msgid "Metrics" msgstr "" -#: superset/forms.py:159 superset/forms.py:164 +#: superset/forms.py:161 superset/forms.py:166 msgid "One or many metrics to display" msgstr "" -#: superset/forms.py:162 +#: superset/forms.py:164 msgid "Ordering" msgstr "" #: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:117 -#: superset/forms.py:167 +#: superset/forms.py:169 msgid "Metric" msgstr "" -#: superset/forms.py:170 +#: superset/forms.py:172 msgid "Choose the metric" msgstr "" -#: superset/forms.py:173 +#: superset/forms.py:175 msgid "Chart Style" msgstr "" -#: superset/forms.py:175 +#: superset/forms.py:177 msgid "stack" msgstr "" -#: superset/forms.py:176 +#: superset/forms.py:178 msgid "stream" msgstr "" -#: superset/forms.py:177 +#: superset/forms.py:179 msgid "expand" msgstr "" -#: superset/forms.py:183 +#: superset/forms.py:185 msgid "Color Scheme" msgstr "" -#: superset/forms.py:185 +#: superset/forms.py:187 msgid "fire" msgstr "" -#: superset/forms.py:186 +#: superset/forms.py:188 msgid "blue_white_yellow" msgstr "" -#: superset/forms.py:187 +#: superset/forms.py:189 msgid "white_black" msgstr "" -#: superset/forms.py:188 +#: superset/forms.py:190 msgid "black_white" msgstr "" -#: superset/forms.py:194 +#: superset/forms.py:196 msgid "Normalize Across" msgstr "" -#: superset/forms.py:196 +#: superset/forms.py:198 msgid "heatmap" msgstr "" -#: superset/forms.py:197 +#: superset/forms.py:199 msgid "x" msgstr "" -#: superset/forms.py:198 +#: superset/forms.py:200 msgid "y" msgstr "" -#: superset/forms.py:201 +#: superset/forms.py:203 msgid "" "Color will be rendered based on a ratio of the cell against the sum of " "across this criteria" msgstr "" -#: superset/forms.py:207 +#: superset/forms.py:209 msgid "Color Scale" msgstr "" -#: superset/forms.py:209 +#: superset/forms.py:211 msgid "series" msgstr "" -#: superset/forms.py:210 +#: superset/forms.py:212 msgid "overall" msgstr "" -#: superset/forms.py:211 +#: superset/forms.py:213 msgid "change" msgstr "" -#: superset/forms.py:214 +#: superset/forms.py:216 msgid "Defines how the color are attributed." msgstr "" -#: superset/forms.py:217 +#: superset/forms.py:219 msgid "Rendering" msgstr "" -#: superset/forms.py:219 +#: superset/forms.py:221 msgid "pixelated (Sharp)" msgstr "" -#: superset/forms.py:220 +#: superset/forms.py:222 msgid "auto (Smooth)" msgstr "" -#: superset/forms.py:223 +#: superset/forms.py:225 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" msgstr "" -#: superset/forms.py:228 +#: superset/forms.py:230 msgid "XScale Interval" msgstr "" -#: superset/forms.py:231 +#: superset/forms.py:233 msgid "Number of step to take between ticks when printing the x scale" msgstr "" -#: superset/forms.py:236 +#: superset/forms.py:238 msgid "YScale Interval" msgstr "" -#: superset/forms.py:239 +#: superset/forms.py:241 msgid "Number of step to take between ticks when printing the y scale" msgstr "" -#: superset/forms.py:244 +#: superset/forms.py:246 msgid "Stacked Bars" msgstr "" -#: superset/forms.py:249 +#: superset/forms.py:251 msgid "Show Markers" msgstr "" -#: superset/forms.py:256 +#: superset/forms.py:258 msgid "Bar Values" msgstr "" -#: superset/forms.py:261 +#: superset/forms.py:263 msgid "Sort Bars" msgstr "" -#: superset/forms.py:263 +#: superset/forms.py:265 msgid "Sort bars by x labels." msgstr "" -#: superset/forms.py:266 +#: superset/forms.py:268 msgid "Extra Controls" msgstr "" -#: superset/forms.py:268 +#: superset/forms.py:270 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" -#: superset/forms.py:274 +#: superset/forms.py:276 msgid "Reduce X ticks" msgstr "" -#: superset/forms.py:276 +#: superset/forms.py:278 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 " @@ -298,967 +298,967 @@ msgid "" "scroll." msgstr "" -#: superset/forms.py:284 +#: superset/forms.py:286 msgid "Include Series" msgstr "" -#: superset/forms.py:286 +#: superset/forms.py:288 msgid "Include series name as an axis" msgstr "" -#: superset/forms.py:289 +#: superset/forms.py:291 msgid "Color Metric" msgstr "" -#: superset/forms.py:292 +#: superset/forms.py:294 msgid "A metric to use for color" msgstr "" -#: superset/forms.py:295 +#: superset/forms.py:297 msgid "Country Field Type" msgstr "" -#: superset/forms.py:298 +#: superset/forms.py:300 msgid "Full name" msgstr "" -#: superset/forms.py:299 +#: superset/forms.py:301 msgid "code International Olympic Committee (cioc)" msgstr "" -#: superset/forms.py:300 +#: superset/forms.py:302 msgid "code ISO 3166-1 alpha-2 (cca2)" msgstr "" -#: superset/forms.py:301 +#: superset/forms.py:303 msgid "code ISO 3166-1 alpha-3 (cca3)" msgstr "" -#: superset/forms.py:303 +#: superset/forms.py:305 msgid "" "The country code standard that Superset should expect to find in the " "[country] column" msgstr "" -#: superset/forms.py:308 +#: superset/forms.py:310 msgid "Group by" msgstr "" -#: superset/forms.py:310 +#: superset/forms.py:312 msgid "One or many fields to group by" msgstr "" -#: superset/forms.py:313 superset/forms.py:318 +#: superset/forms.py:315 superset/forms.py:320 msgid "Columns" msgstr "" -#: superset/forms.py:315 +#: superset/forms.py:317 msgid "One or many fields to pivot as columns" msgstr "" -#: superset/forms.py:320 superset/forms.py:326 superset/forms.py:332 +#: superset/forms.py:322 superset/forms.py:328 superset/forms.py:334 msgid "Columns to display" msgstr "" -#: superset/forms.py:323 +#: superset/forms.py:325 msgid "X" msgstr "" -#: superset/forms.py:329 +#: superset/forms.py:331 msgid "Y" msgstr "" -#: superset/forms.py:335 +#: superset/forms.py:337 msgid "Origin" msgstr "" -#: superset/forms.py:337 +#: superset/forms.py:339 msgid "default" msgstr "" -#: superset/forms.py:338 superset/forms.py:507 +#: superset/forms.py:340 superset/forms.py:516 msgid "now" msgstr "" -#: superset/forms.py:341 +#: superset/forms.py:343 msgid "" "Defines the origin where time buckets start, accepts natural dates as in " "'now', 'sunday' or '1970-01-01'" msgstr "" -#: superset/forms.py:346 +#: superset/forms.py:349 msgid "Bottom Margin" msgstr "" -#: superset/forms.py:349 +#: superset/forms.py:352 msgid "Bottom marging, in pixels, allowing for more room for axis labels" msgstr "" -#: superset/forms.py:354 +#: superset/forms.py:357 msgid "Page Length" msgstr "" -#: superset/forms.py:357 +#: superset/forms.py:360 msgid "Number of rows per page, 0 means no pagination" msgstr "" -#: superset/forms.py:361 +#: superset/forms.py:364 msgid "Time Granularity" msgstr "" -#: superset/forms.py:364 +#: superset/forms.py:367 msgid "all" msgstr "" -#: superset/forms.py:365 +#: superset/forms.py:368 msgid "5 seconds" msgstr "" -#: superset/forms.py:366 +#: superset/forms.py:369 msgid "30 seconds" msgstr "" -#: superset/forms.py:367 +#: superset/forms.py:370 msgid "1 minute" msgstr "" -#: superset/forms.py:368 +#: superset/forms.py:371 msgid "5 minutes" msgstr "" -#: superset/forms.py:369 +#: superset/forms.py:372 msgid "1 hour" msgstr "" -#: superset/forms.py:370 +#: superset/forms.py:373 msgid "6 hour" msgstr "" -#: superset/forms.py:371 +#: superset/forms.py:374 msgid "1 day" msgstr "" -#: superset/forms.py:372 +#: superset/forms.py:375 msgid "7 days" msgstr "" -#: superset/forms.py:374 +#: superset/forms.py:377 msgid "week_starting_sunday" msgstr "" -#: superset/forms.py:378 +#: superset/forms.py:381 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/forms.py:384 +#: superset/forms.py:389 msgid "Domain" msgstr "" -#: superset/forms.py:393 +#: superset/forms.py:398 msgid "The time unit used for the grouping of blocks" msgstr "" -#: superset/forms.py:397 +#: superset/forms.py:402 msgid "Subdomain" msgstr "" -#: superset/forms.py:400 superset/forms.py:751 +#: superset/forms.py:405 superset/forms.py:765 msgid "min" msgstr "" -#: superset/forms.py:406 +#: superset/forms.py:411 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/forms.py:411 +#: superset/forms.py:418 msgid "Link Length" msgstr "" -#: superset/forms.py:423 +#: superset/forms.py:430 msgid "Link length in the force layout" msgstr "" -#: superset/forms.py:426 +#: superset/forms.py:433 msgid "Charge" msgstr "" -#: superset/forms.py:440 +#: superset/forms.py:447 msgid "Charge in the force layout" msgstr "" -#: superset/forms.py:446 +#: superset/forms.py:453 msgid "" "The time column for the visualization. Note that you can define arbitrary" " expression that return a DATETIME column in the table editor. Also note " "that the filter below is applied against this column or expression" msgstr "" -#: superset/forms.py:454 +#: superset/forms.py:461 msgid "Resample Rule" msgstr "" -#: superset/forms.py:457 +#: superset/forms.py:464 msgid "1T" msgstr "" -#: superset/forms.py:458 +#: superset/forms.py:465 msgid "1H" msgstr "" -#: superset/forms.py:459 +#: superset/forms.py:466 msgid "1D" msgstr "" -#: superset/forms.py:460 +#: superset/forms.py:467 msgid "7D" msgstr "" -#: superset/forms.py:461 +#: superset/forms.py:468 msgid "1M" msgstr "" -#: superset/forms.py:462 +#: superset/forms.py:469 msgid "1AS" msgstr "" -#: superset/forms.py:464 +#: superset/forms.py:471 msgid "Pandas resample rule" msgstr "" -#: superset/forms.py:467 +#: superset/forms.py:474 msgid "Resample How" msgstr "" -#: superset/forms.py:471 superset/forms.py:750 +#: superset/forms.py:478 superset/forms.py:764 msgid "mean" msgstr "" -#: superset/forms.py:472 superset/forms.py:749 +#: superset/forms.py:479 superset/forms.py:763 msgid "sum" msgstr "" -#: superset/forms.py:473 superset/forms.py:753 +#: superset/forms.py:480 superset/forms.py:767 msgid "median" msgstr "" -#: superset/forms.py:475 +#: superset/forms.py:482 msgid "Pandas resample how" msgstr "" -#: superset/forms.py:478 +#: superset/forms.py:485 msgid "Resample Fill Method" msgstr "" -#: superset/forms.py:482 +#: superset/forms.py:489 msgid "ffill" msgstr "" -#: superset/forms.py:483 +#: superset/forms.py:490 msgid "bfill" msgstr "" -#: superset/forms.py:485 +#: superset/forms.py:492 msgid "Pandas resample fill method" msgstr "" -#: superset/forms.py:488 +#: superset/forms.py:495 msgid "Since" msgstr "" -#: superset/forms.py:491 +#: superset/forms.py:498 msgid "1 hour ago" msgstr "" -#: superset/forms.py:492 +#: superset/forms.py:499 msgid "12 hours ago" msgstr "" -#: superset/forms.py:493 superset/forms.py:508 +#: superset/forms.py:500 superset/forms.py:517 msgid "1 day ago" msgstr "" -#: superset/forms.py:494 superset/forms.py:509 +#: superset/forms.py:501 superset/forms.py:518 msgid "7 days ago" msgstr "" -#: superset/forms.py:495 superset/forms.py:510 +#: superset/forms.py:502 superset/forms.py:519 msgid "28 days ago" msgstr "" -#: superset/forms.py:496 superset/forms.py:511 +#: superset/forms.py:503 superset/forms.py:520 msgid "90 days ago" msgstr "" -#: superset/forms.py:497 superset/forms.py:512 +#: superset/forms.py:504 superset/forms.py:521 msgid "1 year ago" msgstr "" -#: superset/forms.py:499 +#: superset/forms.py:506 msgid "" "Timestamp from filter. This supports free form typing and natural " "language as in '1 day ago', '28 days' or '3 years'" msgstr "" -#: superset/forms.py:504 +#: superset/forms.py:513 msgid "Until" msgstr "" -#: superset/forms.py:516 +#: superset/forms.py:525 msgid "Max Bubble Size" msgstr "" -#: superset/forms.py:529 +#: superset/forms.py:538 msgid "Whisker/outlier options" msgstr "" -#: superset/forms.py:531 +#: superset/forms.py:540 msgid "Determines how whiskers and outliers are calculated." msgstr "" -#: superset/forms.py:534 +#: superset/forms.py:543 msgid "Tukey" msgstr "" -#: superset/forms.py:535 +#: superset/forms.py:544 msgid "Min/max (no outliers)" msgstr "" -#: superset/forms.py:536 +#: superset/forms.py:545 msgid "2/98 percentiles" msgstr "" -#: superset/forms.py:537 +#: superset/forms.py:546 msgid "9/91 percentiles" msgstr "" -#: superset/forms.py:541 +#: superset/forms.py:550 msgid "Ratio" msgstr "" -#: superset/forms.py:543 +#: superset/forms.py:553 msgid "Target aspect ratio for treemap tiles." msgstr "" -#: superset/forms.py:546 +#: superset/forms.py:556 msgid "Number format" msgstr "" -#: superset/forms.py:559 +#: superset/forms.py:569 msgid "Row limit" msgstr "" -#: superset/forms.py:565 +#: superset/forms.py:575 msgid "Series limit" msgstr "" -#: superset/forms.py:568 +#: superset/forms.py:578 msgid "Limits the number of time series that get displayed" msgstr "" -#: superset/forms.py:572 +#: superset/forms.py:582 msgid "Sort By" msgstr "" -#: superset/forms.py:575 +#: superset/forms.py:585 msgid "Metric used to define the top series" msgstr "" -#: superset/forms.py:578 +#: superset/forms.py:588 msgid "Rolling" msgstr "" -#: superset/forms.py:581 +#: superset/forms.py:592 msgid "" "Defines a rolling window function to apply, works along with the " "[Periods] text box" msgstr "" -#: superset/forms.py:586 +#: superset/forms.py:597 msgid "Periods" msgstr "" -#: superset/forms.py:588 +#: superset/forms.py:599 msgid "" "Defines the size of the rolling window function, relative to the time " "granularity selected" msgstr "" -#: superset/forms.py:593 +#: superset/forms.py:604 msgid "Series" msgstr "" -#: superset/forms.py:596 +#: superset/forms.py:607 msgid "" "Defines the grouping of entities. Each series is shown as a specific " "color on the chart and has a legend toggle" msgstr "" -#: superset/forms.py:602 +#: superset/forms.py:614 msgid "Entity" msgstr "" -#: superset/forms.py:605 +#: superset/forms.py:617 msgid "This define the element to be plotted on the chart" msgstr "" -#: superset/forms.py:608 +#: superset/forms.py:621 msgid "X Axis" msgstr "" -#: superset/forms.py:611 +#: superset/forms.py:624 msgid "Metric assigned to the [X] axis" msgstr "" -#: superset/forms.py:614 +#: superset/forms.py:627 msgid "Y Axis" msgstr "" -#: superset/forms.py:617 +#: superset/forms.py:630 msgid "Metric assigned to the [Y] axis" msgstr "" -#: superset/forms.py:620 +#: superset/forms.py:633 msgid "Bubble Size" msgstr "" -#: superset/forms.py:625 +#: superset/forms.py:638 msgid "URL" msgstr "" -#: superset/forms.py:626 +#: superset/forms.py:639 msgid "" "The URL, this field is templated, so you can integrate {{ width }} and/or" " {{ height }} in your URL string." msgstr "" -#: superset/forms.py:633 +#: superset/forms.py:646 msgid "X Axis Label" msgstr "" -#: superset/forms.py:637 +#: superset/forms.py:650 msgid "Y Axis Label" msgstr "" -#: superset/forms.py:641 +#: superset/forms.py:654 msgid "Custom WHERE clause" msgstr "" -#: superset/forms.py:643 +#: superset/forms.py:656 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/forms.py:650 +#: superset/forms.py:663 msgid "Custom HAVING clause" msgstr "" -#: superset/forms.py:652 +#: superset/forms.py:665 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/forms.py:659 +#: superset/forms.py:672 msgid "Comparison Period Lag" msgstr "" -#: superset/forms.py:660 +#: superset/forms.py:673 msgid "Based on granularity, number of time periods to compare against" msgstr "" -#: superset/forms.py:665 +#: superset/forms.py:678 msgid "Comparison suffix" msgstr "" -#: superset/forms.py:666 +#: superset/forms.py:679 msgid "Suffix to apply after the percentage display" msgstr "" -#: superset/forms.py:669 +#: superset/forms.py:683 msgid "Table Timestamp Format" msgstr "" -#: superset/forms.py:672 +#: superset/forms.py:686 msgid "Timestamp Format" msgstr "" -#: superset/forms.py:675 +#: superset/forms.py:689 msgid "Series Height" msgstr "" -#: superset/forms.py:678 +#: superset/forms.py:692 msgid "Pixel height of each series" msgstr "" -#: superset/forms.py:681 +#: superset/forms.py:695 msgid "X axis format" msgstr "" -#: superset/forms.py:687 +#: superset/forms.py:701 msgid "Y axis format" msgstr "" -#: superset/forms.py:700 +#: superset/forms.py:714 msgid "Markup Type" msgstr "" -#: superset/forms.py:702 +#: superset/forms.py:716 msgid "markdown" msgstr "" -#: superset/forms.py:703 +#: superset/forms.py:717 msgid "html" msgstr "" -#: superset/forms.py:706 +#: superset/forms.py:720 msgid "Pick your favorite markup language" msgstr "" -#: superset/forms.py:709 +#: superset/forms.py:723 msgid "Rotation" msgstr "" -#: superset/forms.py:711 +#: superset/forms.py:725 msgid "random" msgstr "" -#: superset/forms.py:712 +#: superset/forms.py:726 msgid "flat" msgstr "" -#: superset/forms.py:713 +#: superset/forms.py:727 msgid "square" msgstr "" -#: superset/forms.py:716 +#: superset/forms.py:730 msgid "Rotation to apply to words in the cloud" msgstr "" -#: superset/forms.py:719 +#: superset/forms.py:733 msgid "Line Style" msgstr "" -#: superset/forms.py:721 +#: superset/forms.py:735 msgid "linear" msgstr "" -#: superset/forms.py:722 +#: superset/forms.py:736 msgid "basis" msgstr "" -#: superset/forms.py:723 +#: superset/forms.py:737 msgid "cardinal" msgstr "" -#: superset/forms.py:724 +#: superset/forms.py:738 msgid "monotone" msgstr "" -#: superset/forms.py:725 +#: superset/forms.py:739 msgid "step-before" msgstr "" -#: superset/forms.py:726 +#: superset/forms.py:740 msgid "step-after" msgstr "" -#: superset/forms.py:729 +#: superset/forms.py:743 msgid "Line interpolation as defined by d3.js" msgstr "" -#: superset/forms.py:732 +#: superset/forms.py:746 msgid "Label Type" msgstr "" -#: superset/forms.py:735 +#: superset/forms.py:749 msgid "Category Name" msgstr "" -#: superset/forms.py:736 +#: superset/forms.py:750 msgid "Value" msgstr "" -#: superset/forms.py:737 +#: superset/forms.py:751 msgid "Percentage" msgstr "" -#: superset/forms.py:739 +#: superset/forms.py:753 msgid "What should be shown on the label?" msgstr "" -#: superset/forms.py:742 +#: superset/forms.py:756 msgid "Code" msgstr "" -#: superset/forms.py:743 +#: superset/forms.py:757 msgid "Put your code here" msgstr "" -#: superset/forms.py:747 +#: superset/forms.py:761 msgid "Aggregation function" msgstr "" -#: superset/forms.py:752 +#: superset/forms.py:766 msgid "max" msgstr "" -#: superset/forms.py:754 +#: superset/forms.py:768 msgid "stdev" msgstr "" -#: superset/forms.py:755 +#: superset/forms.py:769 msgid "var" msgstr "" -#: superset/forms.py:758 +#: superset/forms.py:772 msgid "" "Aggregate function to apply when pivoting and computing the total rows " "and columns" msgstr "" -#: superset/forms.py:763 +#: superset/forms.py:777 msgid "Font Size From" msgstr "" -#: superset/forms.py:765 +#: superset/forms.py:779 msgid "Font size for the smallest value in the list" msgstr "" -#: superset/forms.py:768 +#: superset/forms.py:783 msgid "Font Size To" msgstr "" -#: superset/forms.py:770 +#: superset/forms.py:785 msgid "Font size for the biggest value in the list" msgstr "" -#: superset/forms.py:773 +#: superset/forms.py:788 msgid "Range Filter" msgstr "" -#: superset/forms.py:775 +#: superset/forms.py:790 msgid "Whether to display the time range interactive selector" msgstr "" -#: superset/forms.py:779 +#: superset/forms.py:794 msgid "Date Filter" msgstr "" -#: superset/forms.py:781 +#: superset/forms.py:796 msgid "Whether to include a time filter" msgstr "" -#: superset/forms.py:784 +#: superset/forms.py:799 msgid "Data Table" msgstr "" -#: superset/forms.py:786 +#: superset/forms.py:801 msgid "Whether to display the interactive data table" msgstr "" -#: superset/forms.py:789 +#: superset/forms.py:805 msgid "Search Box" msgstr "" -#: superset/forms.py:791 +#: superset/forms.py:807 msgid "Whether to include a client side search box" msgstr "" -#: superset/forms.py:795 +#: superset/forms.py:811 msgid "Table Filter" msgstr "" -#: superset/forms.py:797 +#: superset/forms.py:813 msgid "Whether to apply filter when table cell is clicked" msgstr "" -#: superset/forms.py:801 +#: superset/forms.py:817 msgid "Show Bubbles" msgstr "" -#: superset/forms.py:803 +#: superset/forms.py:819 msgid "Whether to display bubbles on top of countries" msgstr "" -#: superset/forms.py:807 +#: superset/forms.py:823 msgid "Legend" msgstr "" -#: superset/forms.py:809 +#: superset/forms.py:825 msgid "Whether to display the legend (toggles)" msgstr "" -#: superset/forms.py:812 +#: superset/forms.py:828 msgid "X bounds" msgstr "" -#: superset/forms.py:814 +#: superset/forms.py:830 msgid "Whether to display the min and max values of the X axis" msgstr "" -#: superset/forms.py:818 +#: superset/forms.py:834 msgid "Rich Tooltip" msgstr "" -#: superset/forms.py:820 +#: superset/forms.py:836 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" -#: superset/forms.py:825 +#: superset/forms.py:841 msgid "Y Axis Zero" msgstr "" -#: superset/forms.py:827 +#: superset/forms.py:843 msgid "Force the Y axis to start at 0 instead of the minimum value" msgstr "" -#: superset/forms.py:832 +#: superset/forms.py:848 msgid "Y Log" msgstr "" -#: superset/forms.py:834 +#: superset/forms.py:850 msgid "Use a log scale for the Y axis" msgstr "" -#: superset/forms.py:837 +#: superset/forms.py:853 msgid "X Log" msgstr "" -#: superset/forms.py:839 +#: superset/forms.py:855 msgid "Use a log scale for the X axis" msgstr "" -#: superset/forms.py:842 +#: superset/forms.py:858 msgid "Donut" msgstr "" -#: superset/forms.py:844 +#: superset/forms.py:860 msgid "Do you want a donut or a pie?" msgstr "" -#: superset/forms.py:847 +#: superset/forms.py:863 msgid "Put labels outside" msgstr "" -#: superset/forms.py:849 +#: superset/forms.py:865 msgid "Put the labels outside the pie?" msgstr "" -#: superset/forms.py:852 +#: superset/forms.py:868 msgid "Contribution" msgstr "" -#: superset/forms.py:854 +#: superset/forms.py:870 msgid "Compute the contribution to the total" msgstr "" -#: superset/forms.py:857 +#: superset/forms.py:873 msgid "Period Ratio" msgstr "" -#: superset/forms.py:860 +#: superset/forms.py:876 msgid "" "[integer] Number of period to compare against, this is relative to the " "granularity selected" msgstr "" -#: superset/forms.py:865 +#: superset/forms.py:881 msgid "Period Ratio Type" msgstr "" -#: superset/forms.py:868 +#: superset/forms.py:884 msgid "factor" msgstr "" -#: superset/forms.py:869 +#: superset/forms.py:885 msgid "growth" msgstr "" -#: superset/forms.py:870 +#: superset/forms.py:886 msgid "value" msgstr "" -#: superset/forms.py:872 +#: superset/forms.py:888 msgid "" "`factor` means (new/previous), `growth` is ((new/previous) - 1), `value` " "is (new-previous)" msgstr "" -#: superset/forms.py:877 +#: superset/forms.py:893 msgid "Time Shift" msgstr "" -#: superset/forms.py:879 +#: superset/forms.py:895 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/forms.py:886 +#: superset/forms.py:902 msgid "Subheader" msgstr "" -#: superset/forms.py:887 +#: superset/forms.py:903 msgid "Description text that shows up below your Big Number" msgstr "" -#: superset/forms.py:894 +#: superset/forms.py:910 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/forms.py:911 +#: superset/forms.py:929 msgid "Base layer map style" msgstr "" -#: superset/forms.py:914 +#: superset/forms.py:932 msgid "Clustering Radius" msgstr "" -#: superset/forms.py:927 +#: superset/forms.py:945 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/forms.py:933 +#: superset/forms.py:952 msgid "Point Radius" msgstr "" -#: superset/forms.py:936 +#: superset/forms.py:955 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/forms.py:942 +#: superset/forms.py:963 msgid "Point Radius Unit" msgstr "" -#: superset/forms.py:949 +#: superset/forms.py:970 msgid "The unit of measure for the specified point radius" msgstr "" -#: superset/forms.py:952 +#: superset/forms.py:974 msgid "Opacity" msgstr "" -#: superset/forms.py:954 +#: superset/forms.py:976 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." msgstr "" -#: superset/forms.py:959 +#: superset/forms.py:981 msgid "Zoom" msgstr "" -#: superset/forms.py:962 +#: superset/forms.py:984 msgid "Zoom level of the map" msgstr "" -#: superset/forms.py:966 +#: superset/forms.py:988 msgid "Default latitude" msgstr "" -#: superset/forms.py:968 +#: superset/forms.py:990 msgid "Latitude of default viewport" msgstr "" -#: superset/forms.py:972 +#: superset/forms.py:994 msgid "Default longitude" msgstr "" -#: superset/forms.py:974 +#: superset/forms.py:996 msgid "Longitude of default viewport" msgstr "" -#: superset/forms.py:978 +#: superset/forms.py:1000 msgid "Live render" msgstr "" -#: superset/forms.py:980 +#: superset/forms.py:1002 msgid "Points and clusters will update as viewport is being changed" msgstr "" -#: superset/forms.py:985 +#: superset/forms.py:1007 msgid "RGB Color" msgstr "" -#: superset/forms.py:995 +#: superset/forms.py:1017 msgid "The color for points and clusters in RGB" msgstr "" -#: superset/forms.py:998 +#: superset/forms.py:1020 msgid "Ranges" msgstr "" -#: superset/forms.py:1000 +#: superset/forms.py:1022 msgid "Ranges to highlight with shading" msgstr "" -#: superset/forms.py:1003 +#: superset/forms.py:1025 msgid "Range labels" msgstr "" -#: superset/forms.py:1005 +#: superset/forms.py:1027 msgid "Labels for the ranges" msgstr "" -#: superset/forms.py:1008 +#: superset/forms.py:1030 msgid "Markers" msgstr "" -#: superset/forms.py:1010 +#: superset/forms.py:1032 msgid "List of values to mark with triangles" msgstr "" -#: superset/forms.py:1013 +#: superset/forms.py:1035 msgid "Marker labels" msgstr "" -#: superset/forms.py:1015 +#: superset/forms.py:1037 msgid "Labels for the markers" msgstr "" -#: superset/forms.py:1018 +#: superset/forms.py:1040 msgid "Marker lines" msgstr "" -#: superset/forms.py:1020 +#: superset/forms.py:1042 msgid "List of values to mark with lines" msgstr "" -#: superset/forms.py:1023 +#: superset/forms.py:1045 msgid "Marker line labels" msgstr "" -#: superset/forms.py:1025 +#: superset/forms.py:1047 msgid "Labels for the marker lines" msgstr "" -#: superset/forms.py:1088 +#: superset/forms.py:1110 msgid "SQL" msgstr "" -#: superset/forms.py:1090 +#: superset/forms.py:1112 msgid "This section exposes ways to include snippets of SQL in your query" msgstr "" -#: superset/forms.py:1101 +#: superset/forms.py:1124 msgid "Time Grain" msgstr "" -#: superset/forms.py:1104 +#: superset/forms.py:1127 msgid "" "The time granularity for the visualization. This applies a date " "transformation to alter your time column and defines a new time " @@ -1266,286 +1266,194 @@ msgid "" "in the Superset source code" msgstr "" -#: superset/forms.py:1139 superset/forms.py:1143 +#: superset/forms.py:1166 superset/forms.py:1170 msgid "Filter 1" msgstr "" -#: superset/forms.py:1148 +#: superset/forms.py:1175 msgid "Super" msgstr "" -#: superset/forms.py:1152 +#: superset/forms.py:1179 msgid "Time" msgstr "" -#: superset/forms.py:1157 +#: superset/forms.py:1184 msgid "Time related form attributes" msgstr "" -#: superset/forms.py:1164 +#: superset/forms.py:1191 msgid "CSV File" msgstr "" -#: superset/forms.py:1165 +#: superset/forms.py:1192 msgid "Select a CSV file to be uploaded to a database." msgstr "" -#: superset/forms.py:1169 +#: superset/forms.py:1196 msgid "CSV Files Only!" msgstr "" -#: superset/forms.py:1171 +#: superset/forms.py:1198 msgid "Delimiter" msgstr "" -#: superset/forms.py:1172 +#: superset/forms.py:1199 msgid "Delimiter used by CSV file (for whitespace use \\s+)." msgstr "" -#: superset/forms.py:1177 +#: superset/forms.py:1204 msgid "Header Row" msgstr "" -#: superset/forms.py:1178 +#: superset/forms.py:1205 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:1188 +#: superset/forms.py:1214 msgid "Column Names" msgstr "" -#: superset/forms.py:1189 +#: superset/forms.py:1215 msgid "" "List of comma-separated column names to use if header row not specified " "above. Leave empty if header field populated." msgstr "" -#: superset/forms.py:1198 +#: superset/forms.py:1224 msgid "Index Column" msgstr "" -#: superset/forms.py:1199 +#: superset/forms.py:1225 msgid "" "Column to use as the row labels of the dataframe. Leave empty if no index" " column." msgstr "" -#: superset/forms.py:1207 +#: superset/forms.py:1233 msgid "Squeeze" msgstr "" -#: superset/forms.py:1208 +#: superset/forms.py:1234 msgid "" "Parse the data as a series (specify this option if the data contains only" " one column.)" msgstr "" -#: superset/forms.py:1213 +#: superset/forms.py:1239 msgid "Prefix" msgstr "" -#: superset/forms.py:1214 +#: superset/forms.py:1240 msgid "" "Prefix to add to column numbers when no header (e.g. \"X\" for \"X0, " "X1\")." msgstr "" -#: superset/forms.py:1220 +#: superset/forms.py:1246 msgid "Mangle Duplicate Columns" msgstr "" -#: superset/forms.py:1221 +#: superset/forms.py:1247 msgid "Specify duplicate columns as \"X.0, X.1\"." msgstr "" -#: superset/forms.py:1224 +#: superset/forms.py:1250 msgid "Skip Initial Space" msgstr "" -#: superset/forms.py:1225 +#: superset/forms.py:1251 msgid "Skip spaces after delimiter." msgstr "" -#: superset/forms.py:1227 -msgid "Skip Rows" -msgstr "" - -#: superset/forms.py:1228 -msgid "Number of rows to skip at start of file." -msgstr "" - -#: superset/forms.py:1234 -msgid "Rows to Read" -msgstr "" - -#: superset/forms.py:1235 -msgid "Number of rows of file to read." -msgstr "" - -#: superset/forms.py:1239 -msgid "Skip Blank Lines" -msgstr "" - -#: superset/forms.py:1240 -msgid "Skip blank lines rather than interpreting them as NaN values." -msgstr "" - -#: superset/forms.py:1244 -msgid "Parse Dates" -msgstr "" - -#: superset/forms.py:1245 -msgid "Parse date values." -msgstr "" - -#: superset/forms.py:1247 -msgid "Infer Datetime Format" -msgstr "" - -#: superset/forms.py:1248 -msgid "Use Pandas to interpret the datetime format automatically." -msgstr "" - #: superset/forms.py:1253 -msgid "Day First" +msgid "Skip Rows" msgstr "" #: superset/forms.py:1254 -msgid "Use DD/MM (European/International) date format." -msgstr "" - -#: superset/forms.py:1257 -msgid "Thousands Separator" -msgstr "" - -#: superset/forms.py:1258 -msgid "Separator for values in thousands." -msgstr "" - -#: superset/forms.py:1263 -msgid "Decimal Character" -msgstr "" - -#: superset/forms.py:1264 -msgid "Character to interpret as decimal point." -msgstr "" - -#: superset/forms.py:1269 -msgid "Quote Character" -msgstr "" - -#: superset/forms.py:1270 -msgid "Character used to denote the start and end of a quoted item." -msgstr "" - -#: superset/forms.py:1276 -msgid "Escape Character" -msgstr "" - -#: superset/forms.py:1277 -msgid "Character used to escape a quoted item." -msgstr "" - -#: superset/forms.py:1282 -msgid "Comment Character" -msgstr "" - -#: superset/forms.py:1283 -msgid "Character used to denote the start of a comment." -msgstr "" - -#: superset/forms.py:1288 -msgid "Encoding" -msgstr "" - -#: superset/forms.py:1289 -msgid "Encoding to use for UTF when reading/writing (e.g. \"utf-8\")." -msgstr "" - -#: superset/forms.py:1294 -msgid "Error On Bad Lines" -msgstr "" - -#: superset/forms.py:1295 -msgid "" -"Error on bad lines (e.g. a line with too many commas). If false these bad" -" lines will instead be dropped from the resulting dataframe." -msgstr "" - -#: superset/forms.py:1304 -msgid "Table Name" -msgstr "" - -#: superset/forms.py:1305 -msgid "Name of table to be createdfrom csv data." -msgstr "" - -#: superset/forms.py:1309 -msgid "Database URI" +msgid "Number of rows to skip at start of file." msgstr "" -#: superset/forms.py:1310 -msgid "URI of database in which to add above table." -msgstr "" +#: superset/db_engine_specs.py:195 superset/db_engine_specs.py:226 +#: superset/db_engine_specs.py:318 superset/db_engine_specs.py:363 +#: superset/db_engine_specs.py:771 superset/db_engine_specs.py:839 +msgid "second" +msgstr "秒" -#: superset/connectors/sqla/views.py:199 superset/forms.py:1314 -msgid "Schema" -msgstr "" +#: superset/db_engine_specs.py:196 superset/db_engine_specs.py:229 +#: superset/db_engine_specs.py:321 superset/db_engine_specs.py:365 +#: superset/db_engine_specs.py:773 superset/db_engine_specs.py:807 +#: superset/db_engine_specs.py:841 superset/db_engine_specs.py:885 +msgid "minute" +msgstr "分" -#: superset/forms.py:1315 -msgid "Specify a schema (if database flavour supports this)." -msgstr "" +#: superset/db_engine_specs.py:197 superset/db_engine_specs.py:233 +#: superset/db_engine_specs.py:323 superset/db_engine_specs.py:367 +#: superset/db_engine_specs.py:779 superset/db_engine_specs.py:809 +#: superset/db_engine_specs.py:843 superset/db_engine_specs.py:891 +msgid "hour" +msgstr "小时" -#: superset/forms.py:1320 -msgid "Table Exists" -msgstr "" +#: superset/db_engine_specs.py:198 superset/db_engine_specs.py:238 +#: superset/db_engine_specs.py:270 superset/db_engine_specs.py:325 +#: superset/db_engine_specs.py:369 superset/db_engine_specs.py:781 +#: superset/db_engine_specs.py:811 superset/db_engine_specs.py:845 +#: superset/db_engine_specs.py:893 +msgid "day" +msgstr "天" -#: superset/forms.py:1321 -msgid "" -"If table exists do one of the following: Fail (do nothing), Replace (drop" -" and recreate table) or Append (insert data)." -msgstr "" +#: superset/db_engine_specs.py:199 superset/db_engine_specs.py:244 +#: superset/db_engine_specs.py:271 superset/db_engine_specs.py:326 +#: superset/db_engine_specs.py:371 superset/db_engine_specs.py:783 +#: superset/db_engine_specs.py:813 superset/db_engine_specs.py:847 +msgid "week" +msgstr "周" -#: superset/forms.py:1327 -msgid "Fail" -msgstr "" +#: superset/db_engine_specs.py:200 superset/db_engine_specs.py:246 +#: superset/db_engine_specs.py:273 superset/db_engine_specs.py:328 +#: superset/db_engine_specs.py:373 superset/db_engine_specs.py:785 +#: superset/db_engine_specs.py:815 superset/db_engine_specs.py:849 +#: superset/db_engine_specs.py:895 +msgid "month" +msgstr "月" -#: superset/forms.py:1328 -msgid "Replace" -msgstr "" +#: superset/db_engine_specs.py:201 superset/db_engine_specs.py:248 +#: superset/db_engine_specs.py:330 superset/db_engine_specs.py:375 +#: superset/db_engine_specs.py:787 superset/db_engine_specs.py:817 +#: superset/db_engine_specs.py:851 superset/db_engine_specs.py:897 +msgid "quarter" +msgstr "季度" -#: superset/forms.py:1329 -msgid "Append" -msgstr "" +#: superset/db_engine_specs.py:202 superset/db_engine_specs.py:252 +#: superset/db_engine_specs.py:332 superset/db_engine_specs.py:789 +#: superset/db_engine_specs.py:819 superset/db_engine_specs.py:899 +msgid "year" +msgstr "年" -#: superset/forms.py:1331 -msgid "Dataframe Index" -msgstr "" +#: superset/db_engine_specs.py:334 +msgid "week_start_monday" +msgstr "周一为一周开始" -#: superset/forms.py:1332 -msgid "Write dataframe index as a column." -msgstr "" +#: superset/db_engine_specs.py:377 superset/db_engine_specs.py:853 +msgid "week_ending_saturday" +msgstr "周日为一周开始" -#: superset/forms.py:1334 -msgid "Column Label(s)" -msgstr "" +#: superset/db_engine_specs.py:380 superset/db_engine_specs.py:856 +msgid "week_start_sunday" +msgstr "周日为一周结束" -#: superset/forms.py:1335 -msgid "" -"Column label for index column(s). If None is given and Dataframe Index is" -" True, Index Names are used." -msgstr "" +#: superset/db_engine_specs.py:775 superset/db_engine_specs.py:887 +msgid "5 minute" +msgstr "5 分钟" -#: superset/forms.py:1342 -msgid "Chunksize" -msgstr "" +#: superset/db_engine_specs.py:777 +msgid "half hour" +msgstr "半小时" -#: superset/forms.py:1343 -msgid "" -"If empty, all rows will be written at once. Otherwise, rows will be " -"written in batches of this many rows at a time." +#: superset/db_engine_specs.py:889 +msgid "10 minute" msgstr "" #: superset/viz.py:311 @@ -1644,6 +1552,10 @@ msgstr "" msgid "Country Map" msgstr "" +#: superset/viz.py:1238 +msgid "Country Map" +msgstr "" + #: superset/viz.py:1267 msgid "World Map" msgstr "" @@ -1685,8 +1597,8 @@ msgstr "" msgid "Type" msgstr "" -#: superset/connectors/druid/views.py:39 superset/views/core.py:310 -#: superset/views/core.py:359 +#: superset/connectors/druid/views.py:39 superset/views/core.py:306 +#: superset/views/core.py:355 msgid "Datasource" msgstr "" @@ -1729,7 +1641,7 @@ msgstr "" #: superset/connectors/druid/views.py:95 superset/connectors/druid/views.py:205 #: superset/connectors/sqla/views.py:76 superset/connectors/sqla/views.py:118 -#: superset/views/core.py:360 +#: superset/views/core.py:356 msgid "Description" msgstr "" @@ -1738,7 +1650,7 @@ msgstr "" msgid "Verbose Name" msgstr "" -#: superset/connectors/druid/views.py:98 superset/views/core.py:533 +#: superset/connectors/druid/views.py:98 superset/views/core.py:529 msgid "JSON" msgstr "" @@ -1838,7 +1750,7 @@ msgid "Time Offset" msgstr "" #: superset/connectors/druid/views.py:211 superset/connectors/sqla/views.py:204 -#: superset/views/core.py:245 superset/views/core.py:356 +#: superset/views/core.py:242 superset/views/core.py:352 msgid "Cache Timeout" msgstr "" @@ -1866,7 +1778,7 @@ msgid "" msgstr "" #: superset/connectors/sqla/views.py:79 superset/connectors/sqla/views.py:122 -#: superset/connectors/sqla/views.py:194 superset/views/core.py:366 +#: superset/connectors/sqla/views.py:194 superset/views/core.py:362 msgid "Table" msgstr "" @@ -1919,13 +1831,17 @@ msgstr "" msgid "Changed By" msgstr "" -#: superset/connectors/sqla/views.py:196 superset/views/core.py:241 +#: superset/connectors/sqla/views.py:196 superset/views/core.py:238 msgid "Database" msgstr "" -#: superset/connectors/sqla/views.py:197 superset/views/core.py:243 +#: superset/connectors/sqla/views.py:197 superset/views/core.py:240 msgid "Last Changed" -msgstr "" +msgstr "更新时间" + +#: superset/connectors/sqla/views.py:199 +msgid "Schema" +msgstr "模式" #: superset/connectors/sqla/views.py:203 msgid "Offset" @@ -1949,10 +1865,6 @@ msgstr "" msgid "Login" msgstr "" -#: superset/templates/superset/import_dashboards.html:11 -msgid "Import" -msgstr "" - #: superset/templates/superset/request_access.html:2 msgid "No Access!" msgstr "" @@ -1970,101 +1882,97 @@ msgstr "" msgid "Cancel" msgstr "" -#: superset/templates/superset/welcome.html:10 -msgid "Welcome!" -msgstr "" - -#: superset/templates/superset/welcome.html:20 superset/views/core.py:358 -msgid "Dashboards" -msgstr "" - #: superset/templates/superset/models/database/macros.html:4 msgid "Test Connection" msgstr "" -#: superset/views/core.py:209 +#: superset/views/core.py:206 msgid "Expose this DB in SQL Lab" msgstr "" -#: superset/views/core.py:210 +#: superset/views/core.py:207 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 " "(<~1 minute)" msgstr "" -#: superset/views/core.py:214 +#: superset/views/core.py:211 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." msgstr "" -#: superset/views/core.py:218 +#: superset/views/core.py:215 msgid "Allow CREATE TABLE AS option in SQL Lab" msgstr "" -#: superset/views/core.py:219 +#: superset/views/core.py:216 msgid "" "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" " SQL Lab" msgstr "" -#: superset/views/core.py:223 +#: superset/views/core.py:220 msgid "" "When allowing CREATE TABLE AS option in SQL Lab, this option forces the " "table to be created in this schema" msgstr "" -#: superset/views/core.py:237 +#: superset/views/core.py:234 msgid "Expose in SQL Lab" msgstr "" -#: superset/views/core.py:238 +#: superset/views/core.py:235 msgid "Allow CREATE TABLE AS" msgstr "" -#: superset/views/core.py:239 +#: superset/views/core.py:236 msgid "Allow DML" msgstr "" -#: superset/views/core.py:240 +#: superset/views/core.py:237 msgid "CTAS Schema" msgstr "" -#: superset/views/core.py:242 superset/views/core.py:357 -#: superset/views/core.py:453 superset/views/core.py:517 +#: superset/views/core.py:239 superset/views/core.py:353 +#: superset/views/core.py:449 superset/views/core.py:513 msgid "Creator" msgstr "" -#: superset/views/core.py:244 +#: superset/views/core.py:241 msgid "SQLAlchemy URI" msgstr "" -#: superset/views/core.py:246 +#: superset/views/core.py:243 msgid "Extra" msgstr "" -#: superset/views/core.py:307 superset/views/core.py:530 +#: superset/views/core.py:308 +msgid "CSV to Database configuration" +msgstr "" + +#: superset/views/core.py:303 superset/views/core.py:526 msgid "User" msgstr "" -#: superset/views/core.py:308 +#: superset/views/core.py:304 msgid "User Roles" msgstr "" -#: superset/views/core.py:309 +#: superset/views/core.py:305 msgid "Database URL" msgstr "" -#: superset/views/core.py:311 +#: superset/views/core.py:307 msgid "Roles to grant" msgstr "" -#: superset/views/core.py:312 +#: superset/views/core.py:308 msgid "Created On" msgstr "" -#: superset/views/core.py:345 +#: superset/views/core.py:341 msgid "" "These parameters are generated dynamically when clicking the save or " "overwrite button in the explore view. This JSON object is exposed here " @@ -2072,111 +1980,214 @@ msgid "" "parameters." msgstr "" -#: superset/views/core.py:350 +#: superset/views/core.py:346 msgid "Duration (in seconds) of the caching timeout for this slice." msgstr "" -#: superset/views/core.py:361 +#: superset/views/core.py:354 +msgid "Dashboards" +msgstr "看板" + +#: superset/views/core.py:357 msgid "Last Modified" msgstr "" -#: superset/views/core.py:362 superset/views/core.py:452 +#: superset/views/core.py:358 superset/views/core.py:448 msgid "Owners" msgstr "" -#: superset/views/core.py:363 +#: superset/views/core.py:359 msgid "Parameters" msgstr "" -#: superset/views/core.py:364 superset/views/core.py:400 +#: superset/views/core.py:360 superset/views/core.py:396 msgid "Slice" msgstr "" -#: superset/views/core.py:365 +#: superset/views/core.py:361 msgid "Name" msgstr "" -#: superset/views/core.py:367 +#: superset/views/core.py:363 msgid "Visualization Type" msgstr "" -#: superset/views/core.py:425 +#: superset/views/core.py:421 msgid "" "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" msgstr "" -#: superset/views/core.py:430 +#: superset/views/core.py:426 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: superset/views/core.py:434 +#: superset/views/core.py:430 msgid "To get a readable URL for your dashboard" msgstr "" -#: superset/views/core.py:435 +#: superset/views/core.py:431 msgid "" "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." msgstr "" -#: superset/views/core.py:440 +#: superset/views/core.py:436 msgid "Owners is a list of users who can alter the dashboard." msgstr "" -#: superset/views/core.py:448 superset/views/core.py:515 +#: superset/views/core.py:444 superset/views/core.py:511 msgid "Dashboard" msgstr "" -#: superset/views/core.py:449 superset/views/core.py:516 +#: superset/views/core.py:445 superset/views/core.py:512 msgid "Title" msgstr "" -#: superset/views/core.py:450 +#: superset/views/core.py:446 msgid "Slug" msgstr "" -#: superset/views/core.py:451 +#: superset/views/core.py:447 msgid "Slices" msgstr "" -#: superset/views/core.py:454 superset/views/core.py:518 +#: superset/views/core.py:450 superset/views/core.py:514 msgid "Modified" msgstr "" -#: superset/views/core.py:455 +#: superset/views/core.py:451 msgid "Position JSON" msgstr "" -#: superset/views/core.py:456 +#: superset/views/core.py:452 msgid "CSS" msgstr "" -#: superset/views/core.py:457 +#: superset/views/core.py:453 msgid "JSON Metadata" msgstr "" -#: superset/views/core.py:458 +#: superset/views/core.py:454 msgid "Underlying Tables" msgstr "" -#: superset/views/core.py:531 +#: superset/views/core.py:527 msgid "Action" msgstr "" -#: superset/views/core.py:532 +#: superset/views/core.py:528 msgid "dttm" msgstr "" -#: superset/views/core.py:2283 +#: superset/views/core.py:2279 msgid "SQL Editor" msgstr "" -#: superset/views/core.py:2292 +#: superset/views/core.py:2288 msgid "Query Search" -msgstr "" +msgstr "查询搜索" + +#~ msgid "[Superset] Access to the datasource %(name)s was granted" +#~ msgstr "" + +#~ msgid "Druid Clusters" +#~ msgstr "Druid集群" + +#~ msgid "Sources" +#~ msgstr "数据源" + +#~ msgid "Druid Datasources" +#~ msgstr "Druid数据源" + +#~ msgid "Refresh Druid Metadata" +#~ msgstr "刷新Druid元数据" + +#~ msgid "Tables" +#~ msgstr "数据表" + +#~ msgid "Datasource %(name)s already exists" +#~ msgstr "" + +#~ msgid "This endpoint requires the `all_datasource_access` permission" +#~ msgstr "" + +#~ msgid "The datasource seems to have been deleted" +#~ msgstr "" + +#~ msgid "The access requests seem to have been deleted" +#~ msgstr "" + +#~ msgid "The user seems to have been deleted" +#~ msgstr "" + +#~ msgid "You don't have access to this datasource" +#~ msgstr "" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "Import Dashboards" +#~ msgstr "导入仪表盘" + +#~ msgid "Manage" +#~ msgstr "管理" + +#~ msgid "Databases" +#~ msgstr "数据库" + +#~ msgid "Access requests" +#~ msgstr "访问请求" + +#~ msgid "Security" +#~ msgstr "安全" + +#~ msgid "Click on a {} link to create a Slice" +#~ msgstr "" + +#~ msgid "Action Log" +#~ msgstr "操作日志" + +#~ msgid "Access was requested" +#~ msgstr "" + +#~ msgid "Role %(r)s was extended to provide the access to the datasource %(ds)s" +#~ msgstr "" + +#~ msgid "You have no permission to approve this request" +#~ msgstr "" + +#~ msgid "Slice %(id)s not found" +#~ msgstr "" + +#~ msgid "Table %(t)s wasn't found in the database %(d)s" +#~ msgstr "" + +#~ msgid "Can't find User '%(name)s', please ask your admin to create one." +#~ msgstr "" + +#~ msgid "Can't find DruidCluster with cluster_name = '%(name)s'" +#~ msgstr "" + +#~ msgid "CSS Templates" +#~ msgstr "CSS模板" + +#~ msgid "SQL Lab" +#~ msgstr "SQL工具箱" + +#~ msgid "Queries" +#~ msgstr "查询" + +#~ msgid "Saved Queries" +#~ msgstr "已保存查询" + +#~ msgid "Import" +#~ msgstr "导入" + +#~ msgid "Welcome!" +#~ msgstr "欢迎!" diff --git a/superset/views/base.py b/superset/views/base.py index 8b3ecf599bad..638b2f7a169a 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -318,6 +318,7 @@ def has_all_datasource_access(self): self.has_role(['Admin', 'Alpha']) or self.has_perm('all_datasource_access', 'all_datasource_access')) + class DatabaseFilter(SupersetFilter): def apply(self, query, func): # noqa if ( @@ -327,6 +328,7 @@ def apply(self, query, func): # noqa perms = self.get_view_menus('database_access') return query.filter(self.model.perm.in_(perms)) + class DatasourceFilter(SupersetFilter): def apply(self, query, func): # noqa if self.has_all_datasource_access(): diff --git a/superset/views/core.py b/superset/views/core.py index c75dee00a788..0c80e625d8d3 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -296,6 +296,7 @@ class DatabaseAsync(DatabaseView): appbuilder.add_view_no_menu(DatabaseAsync) + @app.route('/uploads/') def uploaded_file(filename): return send_from_directory(config['UPLOAD_FOLDER'], @@ -403,9 +404,7 @@ def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, dayfirst, thousands, decimal, quotechar, escapechar, comment, encoding, error_bad_lines, chunksize): # Use Pandas to parse csv file to a dataframe - upload_path = 'http://' + config['SUPERSET_WEBSERVER_ADDRESS'] + ':' \ - + str(config['SUPERSET_WEBSERVER_PORT']) \ - + url_for('uploaded_file', filename=filepath_or_buffer) + upload_path = config['UPLOAD_FOLDER'] + filepath_or_buffer # Expose this to api so can specify each field chunks = pandas.read_csv(filepath_or_buffer=upload_path, sep=sep, @@ -461,6 +460,7 @@ def upload_file(self, form): appbuilder.add_view_no_menu(CsvToDatabaseView) + class DatabaseTablesAsync(DatabaseView): list_columns = ['id', 'all_table_names', 'all_schema_names'] @@ -547,11 +547,17 @@ def pre_delete(self, obj): @expose('/add', methods=['GET', 'POST']) @has_access def add(self): - flash(__( - "To create a new slice, you can open a data source " - "through the `Sources` menu, or alter an existing slice " - "from the `Slices` menu"), "info") - return redirect('/superset/welcome') + datasources = ConnectorRegistry.get_all_datasources(db.session) + datasources = [ + {'value': str(d.id) + '__' + d.type, 'label': repr(d)} + for d in datasources + ] + return self.render_template( + "superset/add_slice.html", + bootstrap_data=json.dumps({ + 'datasources': datasources, + }), + ) appbuilder.add_view( SliceModelView, diff --git a/tests/core_tests.py b/tests/core_tests.py index 06c2e615e82e..28b53d53ba3c 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -12,8 +12,8 @@ import random import unittest import os -import unicodecsv -# +import csv +import sys from flask import escape @@ -649,19 +649,25 @@ def test_user_profile(self, username='admin'): def test_import_csv(self): self.login(username='admin') - config = app.config - - test_file = open('tests/testCSV.csv', 'w+') - writer = unicodecsv.writer(test_file, encoding='utf-8') - writer.writerow((u'Column 1', u'Column 2')) - writer.writerow((u'Column 3', u'Column 4')) + os.environ['SUPERSET_CONFIG'] = 'tests.superset_test_config' + con = app.config.get('SQLALCHEMY_DATABASE_URI') + + if sys.version_info[0] == 2: + test_file = open('tests/testCSV.csv', 'w+b') + csv_writer = csv.writer(test_file) + csv_writer.writerow(['Column 1', 'Column 2']) + csv_writer.writerow(['Test 1', 'Test 2']) + elif sys.version_info[0] == 3: + test_file = open('tests/testCSV.csv' , 'ab+') + test_file.write(b'Column 1, Column 2\n') + test_file.write(b'Column 3, Column 4') test_file.seek(0) form_data = {'csv_file': test_file, 'sep': ',', 'name': 'TestName', - 'con': config['SQLALCHEMY_DATABASE_URI'], + 'con': con, 'if_exists': 'append', 'index_label': 'test_label', 'chunksize': 1, From ab43c7728df24a52a14d6f9eb0560bdd9927cc63 Mon Sep 17 00:00:00 2001 From: Saleh Hindi Date: Thu, 24 Aug 2017 20:25:38 +0000 Subject: [PATCH 37/37] Add newly imported csv table to the list of table models. --- superset/forms.py | 74 ++++++++----------- superset/templates/superset/widgets/list.html | 2 +- superset/views/core.py | 66 ++++++++++++----- 3 files changed, 78 insertions(+), 64 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index 47aadd8a7051..9007c8f1c8c3 100755 --- a/superset/forms.py +++ b/superset/forms.py @@ -1188,6 +1188,13 @@ def add_to_form(attrs): class CsvToDatabaseForm(DynamicForm): # These are the fields exposed by Pandas read_csv() + + # TODO: Add a must be alphanumeric, not numeric validator. + name = StringField(_('Table Name'), + description=_('Name of table to be created ' + 'from csv data.'), + validators=[DataRequired()], + widget=BS3TextFieldWidget()) csv_file = FileField(_('CSV File'), description=_('Select a CSV file to be ' 'uploaded to a database.'), @@ -1195,6 +1202,29 @@ class CsvToDatabaseForm(DynamicForm): FileAllowed(['csv'], _('CSV Files ' 'Only!'))]) + con = StringField(_('Database URI'), + description=_('URI of database in which to ' + 'add above table.'), + validators=[DataRequired()], + widget=BS3TextFieldWidget()) + if_exists = SelectField(_('Table Exists'), + description=_('If table exists do one ' + 'of the following: ' + 'Fail (do nothing), ' + 'Replace (drop and ' + 'recreate table) ' + 'or Append (insert data).'), + choices=[('fail', _('Fail')), + ('replace', _('Replace')), + ('append', _('Append'))], + validators=[DataRequired()]) + # These are the fields exposed by Pandas .to_sql() + schema = StringField(_('Schema'), + description=_('Specify a schema (if database ' + 'flavour supports this).'), + validators=[Optional()], + widget=BS3TextFieldWidget(), + filters=[lambda x: x or None]) sep = StringField(_('Delimiter'), description=_('Delimiter used by CSV ' 'file (for whitespace ' @@ -1311,12 +1341,6 @@ class CsvToDatabaseForm(DynamicForm): validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - encoding = StringField(_('Encoding'), - description=_('Encoding to use for UTF when ' - 'reading/writing (e.g. "utf-8").'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) error_bad_lines = BetterBooleanField(_('Error On Bad Lines'), description=_('Error on bad lines ' '(e.g. a line with ' @@ -1325,35 +1349,6 @@ class CsvToDatabaseForm(DynamicForm): 'lines will instead ' 'be dropped from the ' 'resulting dataframe.')) - - # These are the fields exposed by Pandas .to_sql() - name = StringField(_('Table Name'), - description=_('Name of table to be created' - 'from csv data.'), - validators=[DataRequired()], - widget=BS3TextFieldWidget()) - con = StringField(_('Database URI'), - description=_('URI of database in which to ' - 'add above table.'), - validators=[DataRequired()], - widget=BS3TextFieldWidget()) - schema = StringField(_('Schema'), - description=_('Specify a schema (if database ' - 'flavour supports this).'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) - if_exists = SelectField(_('Table Exists'), - description=_('If table exists do one ' - 'of the following: ' - 'Fail (do nothing), ' - 'Replace (drop and ' - 'recreate table) ' - 'or Append (insert data).'), - choices=[('fail', _('Fail')), - ('replace', _('Replace')), - ('append', _('Append'))], - validators=[DataRequired()]) index = BetterBooleanField(_('Dataframe Index'), description=_('Write dataframe ' 'index as a column.')) @@ -1365,11 +1360,4 @@ class CsvToDatabaseForm(DynamicForm): validators=[Optional()], widget=BS3TextFieldWidget(), filters=[lambda x: x or None]) - chunksize = IntegerField(_('Chunksize'), - description=_('If empty, all rows will be ' - 'written at once. Otherwise, ' - 'rows will be written in batches ' - 'of this many rows at a time.'), - validators=[Optional()], - widget=BS3TextFieldWidget(), - filters=[lambda x: x or None]) + diff --git a/superset/templates/superset/widgets/list.html b/superset/templates/superset/widgets/list.html index d5053176e7ab..68d745e069de 100644 --- a/superset/templates/superset/widgets/list.html +++ b/superset/templates/superset/widgets/list.html @@ -5,6 +5,6 @@ {{ super() }}
- Add CSV Table to Database + Import CSV {% endblock %} diff --git a/superset/views/core.py b/superset/views/core.py index 0fe626776b82..98459029550d 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -14,7 +14,7 @@ import traceback import os import pandas - +import pdb import sqlalchemy as sqla from flask import ( @@ -43,6 +43,7 @@ from superset.legacy import cast_form_data from superset.utils import has_access, QueryStatus from superset.connectors.connector_registry import ConnectorRegistry +from superset.connectors.sqla.models import SqlaTable import superset.models.core as models from superset.models.sql_lab import Query from superset.sql_parse import SupersetQuery @@ -305,9 +306,16 @@ class DatabaseAsync(DatabaseView): @app.route('/uploads/') def uploaded_file(filename): - return send_from_directory(config['UPLOAD_FOLDER'], - filename) + with open("flask-stream-demo", "bw") as f: + chunk_size = 4096 + while True: + chunk = flask.request.stream.read(chunk_size).decode('utf-8') + if len(chunk) == 0: + return + f.write(chunk) + #return send_from_directory(config['UPLOAD_FOLDER'], + # filename) class CsvToDatabaseView(SimpleFormView): form = CsvToDatabaseForm @@ -316,10 +324,10 @@ class CsvToDatabaseView(SimpleFormView): def form_get(self, form): # pre process form # default values + form.name.data = None form.csv_file.data = None form.sep.data = ',' form.header.data = 0 - form.names.data = None form.index_col.data = None form.squeeze.data = False form.prefix.data = None @@ -328,23 +336,21 @@ def form_get(self, form): form.skiprows.data = None form.nrows.data = None form.skip_blank_lines.data = True - form.parse_dates.data = False - form.infer_datetime_format.data = False + form.parse_dates.data = True + form.infer_datetime_format.data = True form.dayfirst.data = False form.thousands.data = None form.decimal.data = '.' form.quotechar.data = None form.escapechar.data = None form.comment.data = None - form.encoding.data = None form.error_bad_lines.data = False - form.name.data = None + form.names.data = None form.con.data = config['SQLALCHEMY_DATABASE_URI'] form.schema.data = None form.if_exists.data = 'append' form.index.data = None form.index_label.data = None - form.chunksize.data = 100000 def form_post(self, form): # post process form @@ -361,10 +367,10 @@ def form_post(self, form): # Use Pandas to convert csv to dataframe datetime_flag = form.infer_datetime_format.data - df = self.csv_to_df(filepath_or_buffer=filename, + df = self.csv_to_df(names=form.names.data, + filepath_or_buffer=filename, sep=form.sep.data, header=form.header.data, - names=form.names.data, index_col=form.index_col.data, squeeze=form.squeeze.data, prefix=form.prefix.data, @@ -381,9 +387,8 @@ def form_post(self, form): quotechar=form.quotechar.data, escapechar=form.escapechar.data, comment=form.comment.data, - encoding=form.encoding.data, error_bad_lines=form.error_bad_lines.data, - chunksize=form.chunksize.data) + chunksize=10000) # Use Pandas to convert superset dataframe to database self.df_to_db(df=df, @@ -393,7 +398,7 @@ def form_post(self, form): if_exists=form.if_exists.data, index=form.index.data, index_label=form.index_label.data, - chunksize=form.chunksize.data) + chunksize=10000) # Go back to welcome page / splash screen message = _('CSV file "{0}" uploaded to table "{1}" in ' @@ -401,14 +406,14 @@ def form_post(self, form): form.name.data, form.con.data)) flash(message, 'info') - redirect('/databaseview/list') + return redirect('/tablemodelview/list/') @staticmethod - def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, + def csv_to_df(names, filepath_or_buffer, sep, header, index_col, squeeze, prefix, mangle_dupe_cols, skipinitialspace, skiprows, nrows, skip_blank_lines, parse_dates, infer_datetime_format, dayfirst, thousands, decimal, quotechar, escapechar, comment, - encoding, error_bad_lines, chunksize): + error_bad_lines, chunksize): # Use Pandas to parse csv file to a dataframe upload_path = config['UPLOAD_FOLDER'] + filepath_or_buffer # Expose this to api so can specify each field @@ -432,10 +437,10 @@ def csv_to_df(filepath_or_buffer, sep, header, names, index_col, squeeze, quotechar=quotechar, escapechar=escapechar, comment=comment, - encoding=encoding, + encoding='utf-8', error_bad_lines=error_bad_lines, - chunksize=chunksize) - + chunksize=chunksize, + iterator=True) df = pandas.DataFrame() df = pandas.concat(chunk for chunk in chunks) return df @@ -450,12 +455,32 @@ def df_to_db(df, name, con, schema, if_exists, index, df.to_sql(name=name, con=engine, schema=schema, if_exists=if_exists, index=index, index_label=index_label, chunksize=chunksize) + + table = SqlaTable(table_name=name) + database = ( + db.session + .query(models.Database) + .filter_by(sqlalchemy_uri=con) + .first() + ) + table.database_id = database.id + table.user_id = g.user.id + table.database = database + table.schema = schema + db.session.add(table) + db.session.commit() + # Should I set this to g.user? The other tables don't have an owner. + # table.owner = g.user.id + # Do I need to set table.sql? None of the default tables have it set. + # table.sql = + @staticmethod def allowed_file(filename): # Only allow specific file extensions as specified in the config return '.' in filename and \ filename.rsplit('.', 1)[1] in config['ALLOWED_EXTENSIONS'] + def upload_file(self, form): if form.csv_file.data and \ self.allowed_file(form.csv_file.data.filename): @@ -464,6 +489,7 @@ def upload_file(self, form): filename)) return filename + appbuilder.add_view_no_menu(CsvToDatabaseView)