Переглянути джерело

HUE-9066 [notebook] Load gist id as new editor with default values

Romain 6 роки тому
батько
коміт
d1f38e8b16

+ 5 - 16
desktop/core/src/desktop/api2.py

@@ -39,7 +39,6 @@ from django.views.decorators.http import require_POST
 
 from metadata.conf import has_catalog
 from metadata.catalog_api import search_entities as metadata_search_entities, _highlight, search_entities_interactive as metadata_search_entities_interactive
-from notebook.api import _create_notebook
 from notebook.connectors.altus import SdxApi, AnalyticDbApi, DataEngApi, DataWarehouse2Api
 from notebook.connectors.base import Notebook, get_interpreter
 
@@ -49,7 +48,7 @@ from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.export_csvxls import make_response
 from desktop.lib.i18n import smart_str, force_unicode
 from desktop.models import Document2, Document, Directory, FilesystemException, uuid_default, \
-  UserPreferences, get_user_preferences, set_user_preferences, get_cluster_config, __paginate
+  UserPreferences, get_user_preferences, set_user_preferences, get_cluster_config, __paginate, _get_gist_document
 
 if sys.version_info[0] > 2:
   from io import StringIO as string_io
@@ -822,7 +821,7 @@ def user_preferences(request, key=None):
   return JsonResponse(response)
 
 
-@api_error_handler()
+@api_error_handler
 def gist_create(request):
   response = {'status': 0}
 
@@ -843,22 +842,12 @@ def gist_create(request):
   return JsonResponse(response)
 
 
-@api_error_handler()
 def gist_get(request):
-  response = {'status': 0}
+  gist_uuid = request.GET.get('uuid')
 
-  gist_uuid = request.POST.get('uuid', '')
-  # if get, manage unfurling
+  gist_doc = _get_gist_document(uuid=gist_uuid)
 
-  gist_doc = Document2.objects.get(uuid=uuid) # Workaround until there is a share to all permission
-
-  # check type
-  # return new notebook but with default text
-  return _create_notebook(
-    editor_type='query-impala',
-    #default_content=json.dumps({'statement'})
-  )
-  # return JsonResponse(response)
+  return redirect('/hue/editor?gist=fdbe0862-cd1f-40b5-9801-a5abfb7c2f77&type=impala')
 
 
 def search_entities(request):

+ 1 - 1
desktop/core/src/desktop/js/api/apiHelper.js

@@ -2958,7 +2958,7 @@ class ApiHelper {
     const deferred = $.Deferred();
 
     const request = self.simplePost(
-      GIST_API,
+      GIST_API + 'create',
       {
         text: options.text,
         name: options.name,

+ 4 - 1
desktop/core/src/desktop/js/apps/notebook/editorViewModel.js

@@ -419,6 +419,8 @@ class EditorViewModel {
         self.loadNotebook(notebooks[0]); // Old way of loading json for /browse
       } else if (window.location.getParameter('type') !== '') {
         self.newNotebook(window.location.getParameter('type'));
+      } else if (window.location.getParameter('gist') !== '') {
+        self.newNotebook();
       } else {
         self.newNotebook();
       }
@@ -591,7 +593,8 @@ class EditorViewModel {
         '/notebook/api/create_notebook',
         {
           type: editorType || options.editor_type,
-          directory_uuid: window.location.getParameter('directory_uuid')
+          directory_uuid: window.location.getParameter('directory_uuid'),
+          gist: window.location.getParameter('gist')
         },
         data => {
           self.loadNotebook(data.notebook);

+ 7 - 0
desktop/core/src/desktop/js/onePageViewModel.js

@@ -490,6 +490,13 @@ class OnePageViewModel {
           });
         }
       },
+      {
+        url: '/gist',
+        app: function() {
+          const uuid = getUrlParameter('uuid');
+          location.href = '/desktop/api2/gist/open?uuid=' + uuid;
+        }
+      },
       {
         url: '/desktop/metrics',
         app: function() {

+ 4 - 1
desktop/core/src/desktop/models.py

@@ -2059,8 +2059,11 @@ def get_data_link(meta):
   return link
 
 
-def __paginate(page, limit, queryset):
+def _get_gist_document(uuid):
+  return Document2.objects.get(uuid=uuid) # Workaround until there is a share to all permission
+
 
+def __paginate(page, limit, queryset):
   if limit > 0:
     offset = (page - 1) * limit
     last = offset + limit

+ 2 - 1
desktop/core/src/desktop/urls.py

@@ -167,7 +167,8 @@ dynamic_patterns += [
   url(r'^desktop/api2/doc/export/?$', desktop_api2.export_documents),
   url(r'^desktop/api2/doc/import/?$', desktop_api2.import_documents),
 
-  url(r'^/desktop/api2/gist/?$', desktop_api2.create_gist),
+  url(r'^desktop/api2/gist/create/?$', desktop_api2.gist_create),
+  url(r'^desktop/api2/gist/open/?$', desktop_api2.gist_get),
 
   url(r'^desktop/api/search/entities/?$', desktop_api2.search_entities),
   url(r'^desktop/api/search/entities_interactive/?$', desktop_api2.search_entities_interactive),

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

@@ -59,18 +59,26 @@ def create_notebook(request):
   response = {'status': -1}
 
   editor_type = request.POST.get('type', 'notebook')
+  gist_id = request.POST.get('gist')
   directory_uuid = request.POST.get('directory_uuid')
 
-  editor = _create_notebook(editor_type=editor_type, directory_uuid=directory_uuid)
+  if gist_id:
+    editor_type = 'impala'
+    editor = make_notebook(
+      name='name',
+      description='desc',
+      editor_type=editor_type,
+      statement='SELECT ...',
+    )
+  else:
+    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
 
-  if default_content is not None:
-    data.update(default_content)
-
   data['directoryUuid'] = directory_uuid
   editor.data = json.dumps(data)
 
@@ -80,26 +88,6 @@ def create_notebook(request):
   return JsonResponse(response)
 
 
-def _create_notebook(editor_type, directory_uuid=None, default_content=None):
-  notebook = Notebook()
-  data = notebook.get_data()
-
-  if editor_type != 'notebook':
-    data['name'] = ''
-    data['type'] = 'query-%s' % editor_type  # TODO: Add handling for non-SQL types
-
-  if default_content is not None:
-    data.update(default_content)
-
-  data['directoryUuid'] = directory_uuid
-  notebook.data = json.dumps(data)
-
-  response['notebook'] = editor.get_data()
-  response['status'] = 0
-
-  return JsonResponse(response)
-
-
 @require_POST
 @check_document_access_permission
 @api_error_handler

+ 9 - 4
desktop/libs/notebook/src/notebook/decorators.py

@@ -47,12 +47,17 @@ def check_editor_access_permission():
     def decorate(request, *args, **kwargs):
       editor_id = request.GET.get('editor')
       editor_type = request.GET.get('type', 'hive')
+      gist_id = request.POST.get('gist')
 
-      if editor_id:  # Open existing saved editor document
-        editor_type = _get_editor_type(editor_id)
+      if editor_type == 'gist' or gist_id: # Gist don't have permissions currently
+        pass
+      else:
+        if editor_id:  # Open existing saved editor document
+          editor_type = _get_editor_type(editor_id)
+
+        if check_permissions(request.user, editor_type):
+          raise PopupException(_('Missing permission to access the %s Editor' % editor_type), error_code=401)
 
-      if check_permissions(request.user, editor_type):
-        raise PopupException(_('Missing permission to access the %s Editor' % editor_type), error_code=401)
       return view_func(request, *args, **kwargs)
     return wraps(view_func)(decorate)
   return inner

+ 8 - 2
desktop/libs/notebook/src/notebook/views.py

@@ -31,7 +31,7 @@ from desktop.lib import export_csvxls
 from desktop.lib.django_util import render, JsonResponse
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.json_utils import JSONEncoderForHTML
-from desktop.models import Document2, Document, FilesystemException
+from desktop.models import Document2, Document, FilesystemException, _get_gist_document
 from desktop.views import serve_403_error
 from metadata.conf import has_optimizer, has_catalog, has_workload_analytics
 
@@ -106,11 +106,17 @@ def notebook_embeddable(request):
 def editor(request, is_mobile=False, is_embeddable=False):
   editor_id = request.GET.get('editor')
   editor_type = request.GET.get('type', 'hive')
+  gist_id = request.GET.get('gist')
 
   if editor_type == 'notebook' or request.GET.get('notebook'):
     return notebook(request)
 
-  if editor_id:  # Open existing saved editor document
+  if editor_type == 'gist':
+    _get_gist_document(uuid=gist_id)
+    editor_type = 'query-impala'
+  #   manage unfurling
+
+  if editor_id and not gist_id:  # Open existing saved editor document
     editor_type = _get_editor_type(editor_id)
 
   template = 'editor.mako'