Pārlūkot izejas kodu

HUE-771 [beeswax] Can't create a table with another delimiter

Can no go back and forth between common and custom separators
Fix js and form creations
Added a test
Romain Rigaux 13 gadi atpakaļ
vecāks
revīzija
ef4294b178

+ 11 - 4
apps/beeswax/src/beeswax/create_table.py

@@ -183,7 +183,7 @@ def import_wizard(request):
       if do_s2_auto_delim or do_s2_user_delim or cancel_s3_column_def:
         return render('choose_delimiter.mako', request, dict(
           action=urlresolvers.reverse(import_wizard),
-          delim_readable=DELIMITER_READABLE[s2_delim_form['delimiter'].data[0]],
+          delim_readable=DELIMITER_READABLE.get(s2_delim_form['delimiter'].data[0], s2_delim_form['delimiter'].data[1]),
           initial=delim_is_auto,
           file_form=s1_file_form,
           delim_form=s2_delim_form,
@@ -283,12 +283,19 @@ def _delim_preview(fs, file_form, encoding, file_types, delimiters):
 
   n_cols = max([ len(row) for row in fields_list ])
   # ``delimiter`` is a MultiValueField. delimiter_0 and delimiter_1 are the sub-fields.
-  delim_form = beeswax.forms.CreateByImportDelimForm(dict(delimiter_0=delim,
-                                                          delimiter_1='',
+  delimiter_0 = delim
+  delimiter_1 = ''
+  # If custom delimiter
+  if not filter(lambda val: val[0] == delim, beeswax.forms.TERMINATOR_CHOICES):
+    delimiter_0 = '__other__'
+    delimiter_1 = delim
+
+  delim_form = beeswax.forms.CreateByImportDelimForm(dict(delimiter_0=delimiter_0,
+                                                          delimiter_1=delimiter_1,
                                                           file_type=file_type,
                                                           n_cols=n_cols))
   if not delim_form.is_valid():
-    assert False, _('Internal error when constructing the delimiter form')
+    assert False, _('Internal error when constructing the delimiter form: %(error)s' % {'error': delim_form.errors})
   return fields_list, n_cols, delim_form
 
 

+ 4 - 1
apps/beeswax/src/beeswax/templates/choose_delimiter.mako

@@ -58,7 +58,7 @@ ${layout.menubar(section='tables')}
                             ${comps.field(delim_form["delimiter"], render_default=True)}
                             <input id="submit_preview" class="btn btn-info" type="submit" value="${_('Preview')}" name="submit_preview"/>
                             <span class="help-block">
-                            ${_('Enter the column delimiter.  Must be a single character.  Use syntax like "\001" or "\t" for special characters.')}
+                            ${_('Enter the column delimiter. Must be a single character. Use syntax like "\\001" or "\\t" for special characters.')}
                             </span>
                         </div>
                     </div>
@@ -116,9 +116,12 @@ ${layout.menubar(section='tables')}
             }
             else {
                 $("#id_delimiter_1").hide();
+                $("#id_delimiter_1").val('');
             }
         });
 
+        $("#id_delimiter_0").change();
+
         $("#step1").click(function(e){
             e.preventDefault();
             $("input[name='cancel_delim']").click();

+ 3 - 1
apps/beeswax/src/beeswax/templates/create_table_manually.mako

@@ -182,6 +182,7 @@ ${layout.menubar(section='tables')}
 	        </div>
 	    </fieldset>
 	</div>
+
 	<div id="step4" class="stepDetails hide">
 	    <fieldset>
 	        <div class="alert alert-info"><h3>${_('Choose a File Format')}</h3>
@@ -231,11 +232,11 @@ ${layout.menubar(section='tables')}
 	        </div>
 	    </fieldset>
 	</div>
+
 	<div id="step5" class="stepDetails hide">
 	    <fieldset>
 	        <div class="alert alert-info"><h3>${_("Choose Where Your Table's Data is Stored")}</h3>
 	        </div>
-	
 	        <div class="control-group">
 	            <label class="control-label">${_('Location')}</label>
 	            <div class="controls">
@@ -268,6 +269,7 @@ ${layout.menubar(section='tables')}
 	        </div>
 	    </fieldset>
 	</div>
+
 	<div id="step6" class="stepDetails hide">
 	    <fieldset>
 	        <div class="alert alert-info"><h3>${_('Configure Table Columns')}</h3>

+ 12 - 0
apps/beeswax/src/beeswax/tests.py

@@ -965,6 +965,7 @@ for x in sys.stdin:
     write_file('/tmp/spacé.dat'.decode('utf-8'), RAW_FIELDS, ' ')
     write_file('/tmp/tab.dat', RAW_FIELDS, '\t')
     write_file('/tmp/comma.dat', RAW_FIELDS, ',')
+    write_file('/tmp/pipes.dat', RAW_FIELDS, '|')
     write_file('/tmp/comma.dat.gz', RAW_FIELDS, ',', do_gzip=True)
 
     # Test auto delim selection
@@ -994,6 +995,17 @@ for x in sys.stdin:
     })
     assert_equal(len(resp.context['fields_list'][0]), 4)
 
+    # Make sure custom delimiters work
+    resp = self.client.post('/beeswax/create/import_wizard', {
+      'submit_preview': 'on',
+      'path': '/tmp/pipes.dat',
+      'name': 'test_create_import',
+      'delimiter_0': '__other__',
+      'delimiter_1': '|',
+      'file_type': 'text',
+    })
+    assert_equal(len(resp.context['fields_list'][0]), 3)
+
     # Test column definition
     resp = self.client.post('/beeswax/create/import_wizard', {
       'submit_delim': 'on',

+ 2 - 2
desktop/core/src/desktop/lib/django_forms.py

@@ -486,10 +486,10 @@ def simple_formset_factory(form, add_label="+", formset=BaseSimpleFormSet, initi
 
 class DependencyAwareForm(forms.Form):
   """
-  Inherit from this class and add 
+  Inherit from this class and add
   (condition name, condition value, child name) tuples
   to self.dependencies to describe dependencies between
-  certain form feilds.  
+  certain form feilds.
 
   The semantic meaning is that the field named "child name"
   is required if and only if the field "condition name"