Explorar o código

[core] Various UX improvements

Better ok buttons for FileBrowser operations
Add icons to Oozie editor
Fix filechooser of Job XML field
Fix about smoke test
Correct param example tooltip in Hive action
Create table metastore: popup exception when bad delimiter picked
Impala example refresh does not 500 with 1.1
Romain Rigaux %!s(int64=12) %!d(string=hai) anos
pai
achega
c994659

+ 4 - 6
apps/about/src/about/tests.py

@@ -58,21 +58,19 @@ class TestAboutWithNoCluster(TestAboutBase):
     self.client_admin.get(reverse('about:index'), HTTP_ACCEPT_LANGUAGE='fr-fr')
 
   def test_collect_usage(self):
-    collect_usage = Settings.get_settings().collect_usage
     tours_and_tutorials = Settings.get_settings().tours_and_tutorials
 
     try:
-      response = self.client.post(reverse('about:update_preferences'), {'collect_usage': False})
+      response = self.client.post(reverse('about:update_preferences'), {'tours_and_tutorials': False})
       data = json.loads(response.content)
       assert_equal(data['status'], 0)
-      assert_false(data['collect_usage'] == True) # Weird but works
+      assert_false(data['tours_and_tutorials'] == True) # Weird but works
 
-      response = self.client.post(reverse('about:update_preferences'), {'collect_usage': True})
+      response = self.client.post(reverse('about:update_preferences'), {'tours_and_tutorials': True})
       data = json.loads(response.content)
       assert_equal(data['status'], 0)
-      assert_true(data['collect_usage'])
+      assert_true(data['tours_and_tutorials'])
     finally:
       settings = Settings.get_settings()
-      settings.collect_usage = collect_usage
       settings.tours_and_tutorials = tours_and_tutorials
       settings.save()

+ 5 - 0
apps/beeswax/src/beeswax/create_table.py

@@ -192,6 +192,11 @@ def import_wizard(request, database='default'):
                 column_name='col_%s' % (i,),
                 column_type='string',
             ))
+          col_length = map(len, fields_list)
+          if col_length != [n_cols] * len(fields_list):
+            raise PopupException(_('Some rows do not have %s columns. Delimiter "%s" is probably not escaped properly.') %
+                                 (n_cols, DELIMITER_READABLE.get(s2_delim_form['delimiter'].data[0], s2_delim_form['delimiter'].data[1])),
+                                 detail='Number of columns by row: %s' % col_length)
           s3_col_formset = ColumnTypeFormSet(prefix='cols', initial=columns)
         return render('define_columns.mako', request, {
           'action': reverse(app_name + ':import_wizard', kwargs={'database': database}),

+ 1 - 1
apps/beeswax/src/beeswax/templates/define_columns.mako

@@ -80,7 +80,7 @@ ${ commonheader(_('Create table from file'), 'metastore', user) | n,unicode }
                                           ${unicode(form["_exists"]) | n}
                                         </td>
                                         % for row in fields_list[:n_rows]:
-                                          ${ comps.getEllipsifiedCell(row[col], "bottom", "dataSample")}
+                                          ${ comps.getEllipsifiedCell(row[col], "bottom", "dataSample") }
                                         % endfor
                                       </tr>
                                       %endfor

+ 6 - 6
apps/filebrowser/src/filebrowser/templates/listdir_components.mako

@@ -246,7 +246,7 @@ from django.utils.translation import ugettext as _
 
             <input id="renameSrcPath" type="hidden" name="src_path" type="text">
             <a class="btn" data-dismiss="modal">${_('Cancel')}</a>
-            <input type="submit" value="${_('Submit')}" class="btn btn-primary" />
+            <input type="submit" value="${_('Rename')}" class="btn btn-primary" />
         </div>
         </form>
     </div>
@@ -369,7 +369,7 @@ from django.utils.translation import ugettext as _
                     <span class="label label-important">${_('Name is required.')}</span>
                 </div>
                 <a class="btn" onclick="$('#moveModal').modal('hide');">${_('Cancel')}</a>
-                <input class="btn btn-primary" type="submit" value="${_('Submit')}"/>
+                <input class="btn btn-primary" type="submit" value="${_('Move')}"/>
             </div>
         </form>
     </div>
@@ -395,7 +395,7 @@ from django.utils.translation import ugettext as _
                     <span class="label label-important">${_('Name is required.')}</span>
                 </div>
                 <a class="btn" onclick="$('#copyModal').modal('hide');">${_('Cancel')}</a>
-                <input class="btn btn-primary" type="submit" value="${_('Submit')}"/>
+                <input class="btn btn-primary" type="submit" value="${_('Copy')}"/>
             </div>
         </form>
     </div>
@@ -452,12 +452,12 @@ from django.utils.translation import ugettext as _
                 <span class="label label-important"><span class="newName"></span> ${_('already exists.')}</span>
             </div>
             <a class="btn" href="#" data-dismiss="modal">${_('Cancel')}</a>
-            <input class="btn btn-primary" type="submit" value="${_('Submit')}" />
+            <input class="btn btn-primary" type="submit" value="${_('Create')}" />
         </div>
         </form>
     </div>
 
-    <!-- new directory modal -->
+    <!-- new file modal -->
     <div id="createFileModal" class="modal hide fade">
         <form id="createFileForm" data-bind="submit: createFile" method="POST" enctype="multipart/form-data" class="form-inline form-padding-fix">
         <div class="modal-header">
@@ -476,7 +476,7 @@ from django.utils.translation import ugettext as _
                 <span class="label label-important"><span class="newName"></span> ${_('already exists.')}</span>
             </div>
             <a class="btn" href="#" data-dismiss="modal">${_('Cancel')}</a>
-            <input class="btn btn-primary" type="submit" value="${_('Submit')}" />
+            <input class="btn btn-primary" type="submit" value="${_('Create')}" />
         </div>
         </form>
     </div>

+ 1 - 1
apps/impala/src/impala/views.py

@@ -48,6 +48,6 @@ def install_examples(request):
   response = beeswax_install_examples(request)
   catalog_response = json.loads(refresh_catalog(request).content)
 
-  if catalog_response['status'] != 0: # Simpler than aggregating the errors
+  if 'status' in catalog_response and catalog_response['status'] != 0: # Simpler than aggregating the errors
     request.error(catalog_response['message'])
   return response

+ 8 - 8
apps/oozie/src/oozie/forms.py

@@ -118,7 +118,7 @@ class JavaForm(forms.ModelForm):
       'main_class': forms.TextInput(attrs={'class': 'span5'}),
       'args': forms.TextInput(attrs={'class': 'span5'}),
       'java_opts': forms.TextInput(attrs={'class': 'span5'}),
-      'job_xml': forms.TextInput(attrs={'class': 'span5'}),
+      'job_xml': forms.TextInput(attrs={'class': 'pathChooser span5'}),
     }
 
 
@@ -134,7 +134,7 @@ class MapreduceForm(forms.ModelForm):
       'archives': forms.HiddenInput(),
       'jar_path': forms.TextInput(attrs={'class': 'pathChooser span5'}),
       'description': forms.TextInput(attrs={'class': 'span5'}),
-      'job_xml': forms.TextInput(attrs={'class': 'span5'}),
+      'job_xml': forms.TextInput(attrs={'class': 'pathChooser span5'}),
     }
 
 
@@ -148,7 +148,7 @@ class StreamingForm(forms.ModelForm):
       'files': forms.widgets.HiddenInput(),
       'archives': forms.widgets.HiddenInput(),
       'description': forms.TextInput(attrs={'class': 'span5'}),
-      'job_xml': forms.TextInput(attrs={'class': 'span5'}),
+      'job_xml': forms.TextInput(attrs={'class': 'pathChooser span5'}),
       'mapper': forms.TextInput(attrs={'class': 'span5'}),
       'reducer': forms.TextInput(attrs={'class': 'span5'}),
     }
@@ -166,7 +166,7 @@ class PigForm(forms.ModelForm):
       'files': forms.widgets.HiddenInput(),
       'archives': forms.widgets.HiddenInput(),
       'description': forms.TextInput(attrs={'class': 'span5'}),
-      'job_xml': forms.TextInput(attrs={'class': 'span5'}),
+      'job_xml': forms.TextInput(attrs={'class': 'pathChooser span5'}),
     }
 
 
@@ -182,7 +182,7 @@ class HiveForm(forms.ModelForm):
       'files': forms.widgets.HiddenInput(),
       'archives': forms.widgets.HiddenInput(),
       'description': forms.TextInput(attrs={'class': 'span5'}),
-      'job_xml': forms.TextInput(attrs={'class': 'span5'}),
+      'job_xml': forms.TextInput(attrs={'class': 'pathChooser span5'}),
     }
 
 
@@ -198,7 +198,7 @@ class SqoopForm(forms.ModelForm):
       'files': forms.widgets.HiddenInput(),
       'archives': forms.widgets.HiddenInput(),
       'description': forms.TextInput(attrs={'class': 'span5'}),
-      'job_xml': forms.TextInput(attrs={'class': 'span5'}),
+      'job_xml': forms.TextInput(attrs={'class': 'pathChooser span5'}),
     }
 
 
@@ -225,7 +225,7 @@ class ShellForm(forms.ModelForm):
       'files': forms.widgets.HiddenInput(),
       'archives': forms.widgets.HiddenInput(),
       'description': forms.TextInput(attrs={'class': 'span5'}),
-      'job_xml': forms.TextInput(attrs={'class': 'span5'}),
+      'job_xml': forms.TextInput(attrs={'class': 'pathChooser span5'}),
     }
 
 
@@ -239,7 +239,7 @@ class DistCpForm(forms.ModelForm):
       'params': forms.widgets.HiddenInput(),
       'command': forms.TextInput(attrs={'class': 'pathChooser span5'}),
       'description': forms.TextInput(attrs={'class': 'span5'}),
-      'job_xml': forms.TextInput(attrs={'class': 'span5'}),
+      'job_xml': forms.TextInput(attrs={'class': 'pathChooser span5'}),
     }
 
 

+ 1 - 1
apps/oozie/src/oozie/models.py

@@ -835,7 +835,7 @@ class Hive(Action):
   script_path = models.CharField(max_length=256, blank=False, verbose_name=_t('Script name'),
                                  help_text=_t('Script name or path to the %(type)s script. E.g. my_script.sql.') % {'type': node_type.title()})
   params = models.TextField(default="[]", verbose_name=_t('Parameters'),
-                            help_text=_t('The %(type)s parameters of the script. E.g. "-param", "INPUT=${inputDir}"')  % {'type': node_type.title()})
+                            help_text=_t('The %(type)s parameters of the script. E.g. N=5, INPUT=${inputDir}')  % {'type': node_type.title()})
   files = models.TextField(default="[]", verbose_name=_t('Files'),
       help_text=_t('List of names or paths of files to be added to the distributed cache and the task running directory.'))
   archives = models.TextField(default="[]", verbose_name=_t('Archives'),

+ 1 - 1
apps/oozie/src/oozie/templates/editor/action_utils.mako

@@ -222,7 +222,7 @@
           % endif
 
           % if 'job_xml' in action_form.fields:
-            ${ utils.render_field_with_error_js(action_form['job_xml'], action_form['job_xml'].name, extra_attrs={'data-bind': 'disable: $root.context().read_only, value: %s' % action_form['job_xml'].name}) }
+            ${ utils.render_field_with_error_js(action_form['job_xml'], action_form['job_xml'].name, extra_attrs={'data-bind': 'disable: $root.context().read_only, fileChooser: $data, value: %s' % action_form['job_xml'].name}) }
           % endif
 
           % if 'deletes' in action_form.fields:

+ 4 - 4
apps/oozie/src/oozie/templates/editor/edit_bundle.mako

@@ -58,17 +58,17 @@ ${ layout.menubar(section='bundles') }
       <div class="well sidebar-nav">
         <ul class="nav nav-list">
           <li class="nav-header">${ _('Properties') }</li>
-          <li class="active"><a href="#properties">${ _('Edit properties') }</a></li>
+          <li class="active"><a href="#properties"><i class="icon-reorder"></i> ${ _('Edit properties') }</a></li>
 
           <li class="nav-header">${ _('Coordinators') }</li>
           % if bundle.is_editable(user):
-          <li><a href="#addBundledCoordinator">${ _('Add') }</a></li>
+          <li><a href="#addBundledCoordinator"><i class="icon-plus"></i>${ _('Add') }</a></li>
           % endif
-          <li><a href="#listCoordinators">${ _('Show selected') }</a></li>
+          <li><a href="#listCoordinators"><i class="icon-cloud"></i> ${ _('Show selected') }</a></li>
 
           % if bundle.is_editable(user):
               <li class="nav-header">${ _('History') }</li>
-              <li><a href="#listHistory">${ _('Show history') }</a></li>
+              <li><a href="#listHistory"><i class="icon-archive"></i> ${ _('Show history') }</a></li>
           % endif
 
           % if bundle:

+ 5 - 5
apps/oozie/src/oozie/templates/editor/edit_coordinator.mako

@@ -58,22 +58,22 @@ ${ layout.menubar(section='coordinators') }
       <div class="well sidebar-nav">
         <ul class="nav nav-list">
           <li class="nav-header">${ _('Properties') }</li>
-          <li class="active"><a href="#properties">${ _('Edit properties') }</a></li>
+          <li class="active"><a href="#properties"><i class="icon-reorder"></i> ${ _('Edit properties') }</a></li>
 
           % if coordinator.workflow:
             <li class="nav-header">${ _('Workflow') }</li>
-            <li id="workflowName"><a href="${ coordinator.workflow.get_absolute_url() }" target="_blank"><i class="icon-share-alt"></i> ${ coordinator.workflow }</a></li>
+            <li id="workflowName"><a href="${ coordinator.workflow.get_absolute_url() }" target="_blank"><i class="icon-code-fork"></i> ${ coordinator.workflow }</a></li>
           % endif
 
           <li class="nav-header">${ _('Datasets') }</li>
           % if coordinator.is_editable(user):
-          <li><a href="#createDataset">${ _('Create new') }</a></li>
+          <li><a href="#createDataset"><i class="icon-plus"></i> ${ _('Create new') }</a></li>
           % endif
-          <li><a href="#listDataset">${ _('Show existing') }</a></li>
+          <li><a href="#listDataset"><i class="icon-cloud"></i> ${ _('Show existing') }</a></li>
 
           % if coordinator.is_editable(user):
               <li class="nav-header">${ _('History') }</li>
-              <li><a href="#listHistory">${ _('Show history') }</a></li>
+              <li><a href="#listHistory"><i class="icon-archive"></i> ${ _('Show history') }</a></li>
           % endif
 
           % if coordinator:

+ 5 - 5
apps/oozie/src/oozie/templates/editor/edit_workflow.mako

@@ -42,20 +42,20 @@ ${ layout.menubar(section='workflows') }
     <div id="workflowControls" class="well sidebar-nav">
       <ul class="nav nav-list">
         <li class="nav-header">${ _('Properties') }</li>
-        <li><a href="#properties">${ _('Edit properties') }</a></li>
+        <li><a href="#properties"><i class="icon-reorder"></i> ${ _('Edit properties') }</a></li>
 
         <li class="nav-header">${ _('Editor') }</li>
-        <li><a href="#editWorkflow">${ _('Edit workflow') }</a></li>
-        <li><a href="#importAction" title="${ _('Click to import an Oozie workflow action or Job Designer action') }" rel="tooltip" data-placement="right">${ _('Import action') }</a></li>
+        <li><a href="#editWorkflow"><i class="icon-code-fork"></i> ${ _('Edit workflow') }</a></li>
+        <li><a href="#importAction" title="${ _('Click to import an Oozie workflow action or Job Designer action') }" rel="tooltip" data-placement="right"><i class="icon-download-alt"></i> ${ _('Import action') }</a></li>
         % if user_can_edit_job:
           <li>
-            <a data-bind="attr: {href: '/filebrowser/view' + deployment_dir() }" target="_blank" title="${ _('Upload additional files and libraries to the deployment directory') }" rel="tooltip" data-placement="right"><i class="icon-share-alt"></i> ${ _('Upload') }</a>
+            <a data-bind="attr: {href: '/filebrowser/view' + deployment_dir() }" target="_blank" title="${ _('Go upload additional files and libraries to the deployment directory on HDFS') }" rel="tooltip" data-placement="right"><i class="icon-folder-open"></i> ${ _('Workspace') }</a>
           </li>
         % endif
 
         % if user_can_edit_job:
           <li class="nav-header">${ _('History') }</li>
-          <li><a href="#listHistory">${ _('Show history') }</a></li>
+          <li><a href="#listHistory"><i class="icon-archive"></i> ${ _('Show history') }</a></li>
         % endif
 
         <li class="nav-header">${ _('Actions') }</li>

+ 1 - 1
apps/oozie/src/oozie/templates/editor/list_workflows.mako

@@ -61,7 +61,7 @@ ${ layout.menubar(section='workflows') }
       <a href="${ url('oozie:list_trashed_workflows') }" class="btn"><i class="icon-trash"></i> ${ _('View trash') }</a>
       &nbsp;&nbsp;
       <a href="${ url('oozie:create_workflow') }" class="btn"><i class="icon-plus-sign"></i> ${ _('Create') }</a>
-      <a href="${ url('oozie:import_workflow') }" class="btn"><i class="icon-plus-sign"></i> ${ _('Import') }</a>
+      <a href="${ url('oozie:import_workflow') }" class="btn"><i class="icon-download-alt"></i> ${ _('Import') }</a>
     </%def>
   </%actionbar:render>