Jelajahi Sumber

[oozie] Prettify dataset in oozie app

abec 13 tahun lalu
induk
melakukan
089ea70d6d

+ 1 - 5
apps/oozie/src/oozie/forms.py

@@ -177,9 +177,6 @@ class DataInputForm(forms.ModelForm):
   class Meta:
     model = DataInput
     exclude = ('coordinator')
-    widgets = {
-      'dataset': forms.Select(attrs={'data-bind': 'value: dataset, uniqueName: false'})
-    }
 
   def __init__(self, *args, **kwargs):
     coordinator = kwargs['coordinator']
@@ -187,8 +184,7 @@ class DataInputForm(forms.ModelForm):
     super(DataInputForm, self).__init__(*args, **kwargs)
     self.fields['dataset'].queryset = Dataset.objects.filter(coordinator=coordinator)
     if coordinator.workflow:
-      attrs = {'data-bind': 'value: name, uniqueName: false'}
-      self.fields['name'].widget = forms.Select(choices=((param, param) for param in set(coordinator.workflow.find_parameters())), attrs=attrs)
+      self.fields['name'].widget = forms.Select(choices=((param, param) for param in set(coordinator.workflow.find_parameters())))
 
 
 class DataOutputSetForm(forms.ModelForm):

+ 57 - 60
apps/oozie/src/oozie/templates/editor/create_coordinator_data.mako

@@ -18,65 +18,46 @@
 import re
 
 from django.utils.translation import ugettext as _
+from django.utils.safestring import mark_safe
+
 %>
 
 <%namespace name="utils" file="../../utils.inc.mako" />
 
 
-<%def name="print_datasets(label, element, formset, direction)">
-  <table id="${element}" class="table-condensed designTable">
-    <thead>
-      <tr>
-        <th>${ _('Name') }</th>
-        <th>${ _('Dataset') }</th>
-        <th></th>
-      </tr>
-    </thead>
-    <tbody data-bind="foreach: ${ element }">
-      % if 'forms' in formset.__dict__:
-        % for form in formset.forms:
-          <tr>
-            <td>${ form['name'] }</td>
-            <td>${ form['dataset'] }</td>
-            <td><a class="btn btn-small" href="#" data-bind="click: $root.remove_${ element }">${ _('Delete') }</a></td>
-          </tr>
-        % endfor
+<%def name="print_datasets(label, element, formset, direction, show_headers=True)">
+  <div id="${element}">
+    <table class="table-condensed dataTable">
+      % if show_headers:
+      <thead
+        % if not formset.forms:
+          data-bind="visible: ${element}().length > 0"
+        % endif
+        >
         <tr>
-          <td>${ formset.empty_form['name'] }</td>
-          <td>${ formset.empty_form['dataset'] }</td>
-          <td><a class="btn btn-small" href="#" data-bind="click: $root.remove_${ element }">${ _('Delete') }</a></td>
+          <th>${ _('Name') }</th>
+          <th>${ _('Dataset') }</th>
+          <th></th>
+          <th></th>
         </tr>
-      % else:
+      </thead>
+      % endif
+      <tbody data-bind="foreach: ${ element }">
         <tr>
-          <td>${ formset['name'] }</td>
-          <td>${ formset['dataset'] }</td>
-          <td><a class="btn btn-small" href="#" data-bind="click: $root.remove_${ element }">${ _('Delete') }</a></td>
+          <td width="10%" data-bind="html: name"></td>
+          <td width="10%" data-bind="html: dataset"></td>
+          <td data-bind="html: error_message"></td>
+          <td width="1%"><a class="btn btn-small" href="#" data-bind="click: $root.remove_${ element }">${ _('Delete') }</a></td>
         </tr>
-      % endif
-    </tbody>
-  </table>
-  % if 'forms' in formset.__dict__:
-    % for form in formset.forms:
-      % if form.errors:
-        <div class="row">
-          <div class="alert alert-error">
-            ${ unicode(form.errors) | n }
-          </div>
-        </div>
-      % endif
-    % endfor
-  % else:
-    % if formset.errors:
-      <div class="row">
-        <div class="alert alert-error">
-          ${ unicode(formset.errors) | n }
-        </div>
-      </div>
-    % endif
-  % endif
+      </tbody>
+    </table>
 
   <button type="button" class="btn" data-bind="click: add_${ element }">${ _('Add') }</button>
 
+  ${ formset.management_form }
+
+  </div>
+
   <style>
     .designTable th {
       text-align:left;
@@ -85,28 +66,44 @@ from django.utils.translation import ugettext as _
 
   <script type="text/javascript">
     $(document).ready(function(){
-      window.viewModel.${element} = ko.observableArray([]);
+      var initial = ${ [{'name': str(form['name']), 'dataset': str(form['dataset']), 'error_message': str(form.errors) } for form in formset.forms] };
+      var nameHTML = '${ str(formset.empty_form["name"]).replace("\r", "").replace("\n", "").replace("\s", "") }';
+      var datasetHTML = '${ str(formset.empty_form["dataset"]).replace("\r", "").replace("\n", "").replace("\s", "") }';
+      var count = initial.length;
+      var root = $('#${element}');
+      var totalFormsEl = root.find('input[type=hidden]').filter(function() {
+        return this.name.indexOf('TOTAL_FORMS') != -1;
+      });
+      totalFormsEl.val(initial.length);
+
+      window.viewModel.${element} = ko.observableArray(initial);
 
       window.viewModel.add_${element} = function() {
-        window.viewModel.${element}.push({name: "", dataset: ""});
+        var newNameHTML = nameHTML.replace(new RegExp("__prefix__", 'g'), count);
+        var newDatasetHTML = datasetHTML.replace(new RegExp("__prefix__", 'g'), count++);
+        window.viewModel.${element}.push({name: newNameHTML, dataset: newDatasetHTML, error_message: ""});
+        totalFormsEl.val(window.viewModel.${element}().length);
       };
 
       window.viewModel.remove_${element} = function(val) {
         window.viewModel.${element}.remove(val);
-      };
 
-      var previousSubmit = window.viewModel.submit;
-      window.viewModel.submit = function(form) {
-        $.post("${ url('oozie:create_coordinator_data', coordinator=coordinator.id, data_type='%s' % direction) }",
-          $("#${element} :input").serialize(), function(response) {
-            if (response['status'] != 0) {
-              $.jHueNotify.error("${ _('Problem: ') }" + response['data']);
-            } else {
-              window.location.replace(response['data']);
-            }
+        var els = root.find(':input').filter(function() {
+          return !!$(this).attr('name') && $(this).attr('name').search(/\-\d+\-/) != -1;
         });
+        var count = 0;
+        for (var i = 0; i < els.length; i++) {
+          var el = $(els[i]);
+          var name = el.attr('name').replace(/\-\d+\-/g, '-' + count + '-');
+          var id = el.attr('id').replace(/\-\d+\-/g, '-' + count + '-');
+          el.attr('name', name);
+          el.attr('id', id);
+          if (i % 2 == 1) {
+            count++;
+          }
+        }
 
-        previousSubmit(form);
+        totalFormsEl.val(window.viewModel.${element}().length);
       };
     });
   </script>

+ 13 - 11
apps/oozie/src/oozie/templates/editor/edit_coordinator.mako

@@ -112,11 +112,11 @@ ${ layout.menubar(section='coordinators') }
                 <table class="table table-striped table-condensed" cellpadding="0" cellspacing="0">
                   <thead>
                     <tr>
-                      <th>${ _('Name') }</th>
-                      <th>${ _('Dataset') }</th>
+                      <th width="10%">${ _('Name') }</th>
+                      <th width="10%">${ _('Dataset') }</th>
                       <th>${ _('Path') }</th>
                       % if can_edit_coordinator:
-                        <td>${ _('Delete') }</td>
+                        <th width="1%">${ _('Delete') }</th>
                       % endif
                     </tr>
                   </thead>
@@ -142,10 +142,12 @@ ${ layout.menubar(section='coordinators') }
               % endif
 
               % if can_edit_coordinator:
-                ${ coordinator_data.print_datasets(_('Datasets'), 'dataset_input', data_input_form, 'input') }
+                ${ coordinator_data.print_datasets(_('Datasets'), 'dataset_input', new_data_input_formset, 'input', not len(data_input_formset.forms)) }
               % endif
             </div>
 
+            <br/>
+            <br/>
             <br/>
 
             <div class="row-fluid">
@@ -154,11 +156,11 @@ ${ layout.menubar(section='coordinators') }
               <table class="table table-striped table-condensed" cellpadding="0" cellspacing="0">
                 <thead>
                   <tr>
-                    <th>${ _('Name') }</th>
-                    <th>${ _('Dataset') }</th>
+                    <th width="10%">${ _('Name') }</th>
+                    <th width="10%">${ _('Dataset') }</th>
                     <th>${ _('Path') }</th>
                     % if can_edit_coordinator:
-                      <td>${ _('Delete') }</td>
+                      <th width="1%">${ _('Delete') }</th>
                     % endif
                   </tr>
                 </thead>
@@ -184,7 +186,7 @@ ${ layout.menubar(section='coordinators') }
               % endif
 
               % if can_edit_coordinator:
-                ${ coordinator_data.print_datasets(_('Datasets'), 'dataset_output', data_output_form, 'output') }
+                ${ coordinator_data.print_datasets(_('Datasets'), 'dataset_output', new_data_output_formset, 'output', not len(data_output_formset.forms)) }
               % endif
             </div>
           % endif
@@ -383,11 +385,11 @@ ${ layout.menubar(section='coordinators') }
           }
         }
       );
-   });
+    });
 
-   $("a[data-row-selector='true']").jHueRowSelector();
+    $("a[data-row-selector='true']").jHueRowSelector();
 
-   ko.applyBindings(window.viewModel);
+    ko.applyBindings(window.viewModel);
  });
 </script>
 

+ 19 - 17
apps/oozie/src/oozie/views/editor.py

@@ -29,7 +29,7 @@ from django.forms.formsets import formset_factory
 from django.forms.models import inlineformset_factory, modelformset_factory
 from django.http import HttpResponse
 from django.shortcuts import redirect
-from django.utils.functional import wraps
+from django.utils.functional import curry, wraps
 from django.utils.safestring import mark_safe
 from django.utils.translation import ugettext as _
 
@@ -630,29 +630,37 @@ def edit_coordinator(request, coordinator):
 
   dataset = Dataset(coordinator=coordinator)
   dataset_form = DatasetForm(instance=dataset, prefix='create')
-  data_input = DataInput(coordinator=coordinator)
-  data_input_form = DataInputForm(instance=data_input, coordinator=coordinator)
-  data_output = DataOutput(coordinator=coordinator)
-  data_output_form = DataOutputForm(instance=data_output, coordinator=coordinator)
+
+  NewDataInputFormSet = inlineformset_factory(Coordinator, DataInput, form=DataInputForm, extra=0, can_order=False, can_delete=False)
+  NewDataInputFormSet.form = staticmethod(curry(DataInputForm, coordinator=coordinator))
+  NewDataOutputFormSet = inlineformset_factory(Coordinator, DataOutput, form=DataOutputForm, extra=0, can_order=False, can_delete=False)
+  NewDataOutputFormSet.form = staticmethod(curry(DataOutputForm, coordinator=coordinator))
 
   if request.method == 'POST':
     coordinator_form = CoordinatorForm(request.POST, instance=coordinator)
     dataset_formset = DatasetFormSet(request.POST, request.FILES, instance=coordinator)
     data_input_formset = DataInputFormSet(request.POST, request.FILES, instance=coordinator)
     data_output_formset = DataOutputFormSet(request.POST, request.FILES, instance=coordinator)
+    new_data_input_formset = NewDataInputFormSet(request.POST, request.FILES, instance=coordinator, prefix='input')
+    new_data_output_formset = NewDataOutputFormSet(request.POST, request.FILES, instance=coordinator, prefix='output')
 
-    if coordinator_form.is_valid() and dataset_formset.is_valid() and data_input_formset.is_valid() and data_output_formset.is_valid():
+    if coordinator_form.is_valid() and dataset_formset.is_valid() and data_input_formset.is_valid() and data_output_formset.is_valid() and new_data_input_formset.is_valid() and new_data_output_formset.is_valid():
       coordinator = coordinator_form.save()
       dataset_formset.save()
       data_input_formset.save()
       data_output_formset.save()
+      new_data_input_formset.save()
+      new_data_output_formset.save()
 
-      return redirect(reverse('oozie:list_coordinator'))
+      request.info(_("Coordinator saved!"))
+      return redirect(reverse('oozie:edit_coordinator', kwargs={'coordinator': coordinator.id}))
   else:
     coordinator_form = CoordinatorForm(instance=coordinator)
     dataset_formset = DatasetFormSet(instance=coordinator)
     data_input_formset = DataInputFormSet(instance=coordinator)
     data_output_formset = DataOutputFormSet(instance=coordinator)
+    new_data_input_formset = NewDataInputFormSet(queryset=DataInput.objects.none(), instance=coordinator, prefix='input')
+    new_data_output_formset = NewDataOutputFormSet(queryset=DataOutput.objects.none(), instance=coordinator, prefix='output')
 
   return render('editor/edit_coordinator.mako', request, {
     'coordinator': coordinator,
@@ -661,8 +669,8 @@ def edit_coordinator(request, coordinator):
     'data_input_formset': data_input_formset,
     'data_output_formset': data_output_formset,
     'dataset_form': dataset_form,
-    'data_input_form': data_input_form,
-    'data_output_form': data_output_form,
+    'new_data_input_formset': new_data_input_formset,
+    'new_data_output_formset': new_data_output_formset,
     'history': history,
     'can_edit_coordinator': can_edit_job(request.user, coordinator.workflow),
     'parameters': extract_field_data(coordinator_form['parameters'])
@@ -739,7 +747,7 @@ def create_coordinator_data(request, coordinator, data_type):
   response = {'status': -1, 'data': 'None'}
 
   if request.method == 'POST':
-    data_form = DataForm(request.POST, instance=data_instance, coordinator=coordinator)
+    data_form = DataForm(request.POST, instance=data_instance, coordinator=coordinator, prefix=data_type)
 
     if data_form.is_valid():
       data_form.save()
@@ -748,16 +756,10 @@ def create_coordinator_data(request, coordinator, data_type):
       request.info(_('Coordinator data created'));
     else:
       data_form = DataForm(request.POST, instance=data_instance, coordinator=coordinator)
+      response['data'] = data_form.errors
   else:
-    ## Bad
     response['data'] = _('A POST request is required.')
 
-  if response['status'] != 0:
-    response['data'] = render('editor/create_coordinator_data.mako', request, {
-                              'coordinator': coordinator,
-                              'form': data_form, },
-                              force_template=True).content
-
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 

+ 1 - 1
desktop/core/ext-py/Django-1.2.3/django/utils/autoreload.py

@@ -51,7 +51,7 @@ _win = (sys.platform == "win32")
 def code_changed():
     global _mtimes, _win
     for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())):
-        if filename.endswith(".pyc") or filename.endswith(".pyo"):
+        if filename.endswith(".pyc") or filename.endswith(".pyo") or filename.endswith(".mako"):
             filename = filename[:-1]
         if not os.path.exists(filename):
             continue # File might be in an egg, so it can't be reloaded.