From commits-return-810-archive-asf-public=cust-asf.ponee.io@superset.incubator.apache.org Fri Mar 23 22:16:08 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 411DC18064D for ; Fri, 23 Mar 2018 22:16:08 +0100 (CET) Received: (qmail 2757 invoked by uid 500); 23 Mar 2018 21:16:07 -0000 Mailing-List: contact commits-help@superset.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@superset.incubator.apache.org Delivered-To: mailing list commits@superset.incubator.apache.org Received: (qmail 2748 invoked by uid 99); 23 Mar 2018 21:16:07 -0000 Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 23 Mar 2018 21:16:07 +0000 Received: by gitbox.apache.org (ASF Mail Server at gitbox.apache.org, from userid 33) id AD67F80AE9; Fri, 23 Mar 2018 21:16:06 +0000 (UTC) Date: Fri, 23 Mar 2018 21:16:06 +0000 To: "commits@superset.apache.org" Subject: [incubator-superset] branch master updated: forms: make csv import parse dates accepts a list of columns (#4639) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Message-ID: <152183976654.26024.14349991771683378297@gitbox.apache.org> From: graceguo@apache.org X-Git-Host: gitbox.apache.org X-Git-Repo: incubator-superset X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: f11cde9eb8b6e8918533f2d14007bb9976f9a77d X-Git-Newrev: 76394d3f8f711c2754dbfdd0c6cf7deb6d3ef122 X-Git-Rev: 76394d3f8f711c2754dbfdd0c6cf7deb6d3ef122 X-Git-NotificationType: ref_changed_plus_diff X-Git-Multimail-Version: 1.5.dev Auto-Submitted: auto-generated This is an automated email from the ASF dual-hosted git repository. graceguo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-superset.git The following commit(s) were added to refs/heads/master by this push: new 76394d3 forms: make csv import parse dates accepts a list of columns (#4639) 76394d3 is described below commit 76394d3f8f711c2754dbfdd0c6cf7deb6d3ef122 Author: Riccardo Magliocchetti AuthorDate: Fri Mar 23 22:16:02 2018 +0100 forms: make csv import parse dates accepts a list of columns (#4639) Instead of a boolean which has way less chances to work. While at it add a proper label for the "con" field. Fixes #4637 --- superset/forms.py | 36 +++++++++++++++++++++++++++++++++--- superset/views/core.py | 1 - tests/form_tests.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/superset/forms.py b/superset/forms.py index eb8aba8..e846d57 100644 --- a/superset/forms.py +++ b/superset/forms.py @@ -10,7 +10,7 @@ from flask_appbuilder.forms import DynamicForm from flask_babel import lazy_gettext as _ from flask_wtf.file import FileAllowed, FileField, FileRequired from wtforms import ( - BooleanField, IntegerField, SelectField, StringField) + BooleanField, Field, IntegerField, SelectField, StringField) from wtforms.ext.sqlalchemy.fields import QuerySelectField from wtforms.validators import DataRequired, NumberRange, Optional @@ -20,6 +20,32 @@ from superset.models import core as models config = app.config +class CommaSeparatedListField(Field): + widget = BS3TextFieldWidget() + + def _value(self): + if self.data: + return u', '.join(self.data) + else: + return u'' + + def process_formdata(self, valuelist): + if valuelist: + self.data = [x.strip() for x in valuelist[0].split(',')] + else: + self.data = [] + + +def filter_not_empty_values(value): + """Returns a list of non empty values or None""" + if not value: + return None + data = [x for x in value if x] + if not data: + return None + return data + + class CsvToDatabaseForm(DynamicForm): # pylint: disable=E0211 def all_db_items(): @@ -36,6 +62,7 @@ class CsvToDatabaseForm(DynamicForm): validators=[ FileRequired(), FileAllowed(['csv'], _('CSV Files Only!'))]) con = QuerySelectField( + _('Database'), query_factory=all_db_items, get_pk=lambda a: a.id, get_label=lambda a: a.database_name) sep = StringField( @@ -99,9 +126,12 @@ class CsvToDatabaseForm(DynamicForm): description=_( 'Skip blank lines rather than interpreting them ' 'as NaN values.')) - parse_dates = BooleanField( + parse_dates = CommaSeparatedListField( _('Parse Dates'), - description=_('Parse date values.')) + description=_( + 'A comma separated list of columns that should be ' + 'parsed as dates.'), + filters=[filter_not_empty_values]) infer_datetime_format = BooleanField( _('Infer Datetime Format'), description=_( diff --git a/superset/views/core.py b/superset/views/core.py index 723e8cc..a080a4b 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -339,7 +339,6 @@ class CsvToDatabaseView(SimpleFormView): form.mangle_dupe_cols.data = True form.skipinitialspace.data = False form.skip_blank_lines.data = True - form.parse_dates.data = True form.infer_datetime_format.data = True form.decimal.data = '.' form.if_exists.data = 'append' diff --git a/tests/form_tests.py b/tests/form_tests.py new file mode 100644 index 0000000..82178a2 --- /dev/null +++ b/tests/form_tests.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from tests.base_tests import SupersetTestCase +from wtforms.form import Form + +from superset.forms import ( + CommaSeparatedListField, filter_not_empty_values) + + +class FormTestCase(SupersetTestCase): + + def test_comma_separated_list_field(self): + field = CommaSeparatedListField().bind(Form(), 'foo') + field.process_formdata([u'']) + self.assertEqual(field.data, [u'']) + + field.process_formdata(['a,comma,separated,list']) + self.assertEqual(field.data, [u'a', u'comma', u'separated', u'list']) + + def test_filter_not_empty_values(self): + self.assertEqual(filter_not_empty_values(None), None) + self.assertEqual(filter_not_empty_values([]), None) + self.assertEqual(filter_not_empty_values(['']), None) + self.assertEqual(filter_not_empty_values(['hi']), ['hi']) -- To stop receiving notification emails like this one, please contact graceguo@apache.org.