Эх сурвалжийг харах

HUE-3728 [editor] Create new query without a page refresh

Romain Rigaux 9 жил өмнө
parent
commit
7bc2d84

+ 24 - 0
desktop/libs/notebook/src/notebook/api.py

@@ -40,6 +40,30 @@ LOG = logging.getLogger(__name__)
 DEFAULT_HISTORY_NAME = ''
 
 
+@require_POST
+@api_error_handler
+def create_notebook(request):
+  response = {'status': -1}
+
+  editor_type = request.POST.get('type', 'notebook')
+  directory_uuid = request.POST.get('directory_uuid')
+
+  editor = Notebook()
+  data = editor.get_data()
+
+  if editor_type != 'notebook':
+    data['name'] = ''
+    data['type'] = 'query-%s' % editor_type  # TODO: Add handling for non-SQL types
+
+  data['directoryUuid'] = directory_uuid
+  editor.data = json.dumps(data)
+
+  response['notebook'] = editor.get_data()
+  response['status'] = 0
+
+  return JsonResponse(response)
+
+
 @require_POST
 @check_document_access_permission()
 @api_error_handler

+ 15 - 8
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -695,7 +695,6 @@
       self.ace().setValue('', 1);
       self.result.clear();
       self.status('ready');
-      hueUtils.changeURL('/notebook/editor');
     };
 
     self.explain = function () {
@@ -1611,10 +1610,9 @@
         self.openNotebook(editor_id);
       }
       else if (notebooks.length > 0) {
-        self.loadNotebook(notebooks[0]);
-        if (self.selectedNotebook().snippets().length === 0 && self.editorMode) { // Add snippet in new Editor
-          self.selectedNotebook().newSnippet();
-        }
+        self.loadNotebook(notebooks[0]); // Old way of loading json for /browse
+      } else {
+        self.newNotebook();
       }
     };
 
@@ -1646,9 +1644,18 @@
     };
 
     self.newNotebook = function () {
-      var notebook = new Notebook(self, {});
-      self.selectedNotebook(notebook);
-      return notebook;
+      $.post("/notebook/api/create_notebook", {
+        type: options.editor_type,
+        directory_uuid: window.location.getParameter('directory_uuid')
+      }, function (data) {
+        self.loadNotebook(data.notebook);
+        self.selectedNotebook().newSnippet();
+        if (self.editorMode) {
+          hueUtils.changeURL('/notebook/editor');
+        } else {
+          hueUtils.changeURL('/notebook/notebook');
+        }
+      });
     };
 
     self.saveNotebook = function () {

+ 7 - 2
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -266,11 +266,11 @@ ${ hueIcons.symbols() }
            
 
         % if mode == 'editor':
-        <a class="btn" href="${ url('notebook:editor') }?type=${ editor_type }&new=true" title="${ _('New %s Query') % editor_type.title() }" rel="tooltip" data-placement="bottom">
+        <a class="btn" href="javascript:void(0)" data-bind="click: function() { newNotebook(true); }" title="${ _('New %s Query') % editor_type.title() }" rel="tooltip" data-placement="bottom">
           <i class="fa fa-file-o"></i>
         </a>
         % else:
-        <a class="btn" href="${ url('notebook:new') }" title="${ _('New Notebook') }" rel="tooltip" data-placement="bottom">
+        <a class="btn" href="javascript:void(0)" data-bind="click: newNotebook" title="${ _('New Notebook') }" rel="tooltip" data-placement="bottom">
           <i class="fa fa-file-o"></i>
         </a>
         % endif
@@ -1671,6 +1671,11 @@ ${ hueIcons.symbols() }
             <i class="fa fa-fw fa-eraser"></i> ${_('Clear')}
           </a>
         </li>
+        <li>
+          <a href="javascript:void(0)" data-bind="click: $root.newNotebook" title="${ _('Open a new query') }">
+            <i class="fa fa-fw fa-file-o"></i> ${_('New query')}
+          </a>
+        </li>
         <li>
           <a href="javascript:void(0)" data-bind="click: queryCompatibility, visible: $root.isOptimizerEnabled" title="${ _('Get Impala compatibility hints') }">
             <i class="fa fa-fw fa-random"></i> ${_('Check Impala compatibility')}

+ 1 - 0
desktop/libs/notebook/src/notebook/urls.py

@@ -47,6 +47,7 @@ urlpatterns = patterns('notebook.views',
 
 # APIs
 urlpatterns += patterns('notebook.api',
+  url(r'^api/create_notebook/?$', 'create_notebook', name='create_notebook'),
   url(r'^api/create_session/?$', 'create_session', name='create_session'),
   url(r'^api/close_session/?$', 'close_session', name='close_session'),
   url(r'^api/execute/?$', 'execute', name='execute'),

+ 6 - 25
desktop/libs/notebook/src/notebook/views.py

@@ -56,15 +56,6 @@ def notebooks(request):
 @check_document_access_permission()
 def notebook(request):
   notebook_id = request.GET.get('notebook')
-  directory_uuid = request.GET.get('directory_uuid')
-
-  if notebook_id:
-    notebook = Notebook(document=Document2.objects.get(id=notebook_id))
-  else:
-    notebook = Notebook()
-    data = notebook.get_data()
-    data['directoryUuid'] = directory_uuid
-    notebook.data = json.dumps(data)    
 
   is_yarn_mode = False
   try:
@@ -74,7 +65,8 @@ def notebook(request):
     LOG.exception('Spark is not enabled')
 
   return render('notebook.mako', request, {
-      'notebooks_json': json.dumps([notebook.get_data()]),
+      'editor_id': notebook_id or None,
+      'notebooks_json': '{}',
       'options_json': json.dumps({
           'languages': get_interpreters(request.user),
           'session_properties': SparkApi.get_properties(),
@@ -88,30 +80,19 @@ def notebook(request):
 def editor(request):
   editor_id = request.GET.get('editor')
   editor_type = request.GET.get('type', 'hive')
-  directory_uuid = request.GET.get('directory_uuid')
-
-  notebooks_json = '{}'
 
   if editor_id:  # Open existing saved editor document
-    editor = Notebook(document=Document2.objects.get(id=editor_id))
-    editor_type = editor.get_data()['type'].rsplit('-', 1)[-1]
-  else:  # Create new editor
-    editor = Notebook()
-    data = editor.get_data()
-
-    data['name'] = ''
-    data['type'] = 'query-%s' % editor_type  # TODO: Add handling for non-SQL types
-    data['directoryUuid'] = directory_uuid
-    editor.data = json.dumps(data)
-    notebooks_json = json.dumps([editor.get_data()])
+    document = Document2.objects.get(id=editor_id)
+    editor_type = document.type.rsplit('-', 1)[-1]
 
   return render('editor.mako', request, {
       'editor_id': editor_id or None,
-      'notebooks_json': notebooks_json,
+      'notebooks_json': '{}',
       'options_json': json.dumps({
           'languages': [{"name": "%s SQL" % editor_type.title(), "type": editor_type}],
           'mode': 'editor',
           'is_optimizer_enabled': has_optimizer(),
+          'editor_type': editor_type
       }),
       'editor_type': editor_type,
   })