瀏覽代碼

HUE-3797 [notebook] Move some dependencies out of the views module

Romain 6 年之前
父節點
當前提交
54e5322c4d

+ 1 - 1
desktop/core/src/desktop/api2.py

@@ -41,7 +41,6 @@ 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.connectors.altus import SdxApi, AnalyticDbApi, DataEngApi, DataWarehouse2Api
 from notebook.connectors.base import Notebook, get_interpreter
-from notebook.views import upgrade_session_properties
 
 from desktop.lib.django_util import JsonResponse
 from desktop.conf import get_clusters, IS_K8S_ONLY
@@ -372,6 +371,7 @@ def _get_document_helper(request, uuid, with_data, with_dependencies, path):
     data = json.loads(document.data)
     # Upgrade session properties for Hive and Impala
     if document.type.startswith('query'):
+      from notebook.models import upgrade_session_properties
       notebook = Notebook(document=document)
       notebook = upgrade_session_properties(request, notebook)
       data = json.loads(notebook.data)

+ 3 - 2
desktop/libs/notebook/src/notebook/api.py

@@ -30,6 +30,7 @@ from django.utils.translation import ugettext as _
 from django.views.decorators.http import require_GET, require_POST
 import opentracing.tracer
 
+from azure.abfs.__init__ import abfspath
 from desktop.api2 import __paginate
 from desktop.conf import TASK_SERVER
 from desktop.lib.i18n import smart_str
@@ -43,9 +44,8 @@ from notebook.connectors.dataeng import DataEngApi
 from notebook.connectors.hiveserver2 import HS2Api
 from notebook.connectors.oozie_batch import OozieApi
 from notebook.decorators import api_error_handler, check_document_access_permission, check_document_modify_permission
-from notebook.models import escape_rows, make_notebook
+from notebook.models import escape_rows, make_notebook, upgrade_session_properties, get_api
 from notebook.views import upgrade_session_properties, get_api
-from azure.abfs.__init__ import abfspath
 
 if sys.version_info[0] > 2:
   import urllib.request, urllib.error
@@ -53,6 +53,7 @@ if sys.version_info[0] > 2:
 else:
   from urllib import unquote as urllib_unquote
 
+
 LOG = logging.getLogger(__name__)
 
 DEFAULT_HISTORY_NAME = ''

+ 34 - 1
desktop/libs/notebook/src/notebook/models.py

@@ -41,7 +41,7 @@ from desktop.lib.paths import SAFE_CHARACTERS_URI
 from desktop.models import Document2
 from useradmin.models import User
 
-from notebook.connectors.base import Notebook, get_interpreter
+from notebook.connectors.base import Notebook, get_api as _get_api, get_interpreter
 
 if sys.version_info[0] > 2:
   import urllib.request, urllib.error
@@ -491,6 +491,39 @@ def _get_editor_type(editor_id):
   return document.type.rsplit('-', 1)[-1]
 
 
+class ApiWrapper(object):
+  def __init__(self, request, snippet):
+    self.request = request
+    self.api = _get_api(request, snippet)
+  def __getattr__(self, name):
+    from notebook import tasks as ntasks
+    if TASK_SERVER.ENABLED.get() and hasattr(ntasks, name):
+      attr = object.__getattribute__(ntasks, name)
+      def _method(*args, **kwargs):
+        return attr(*args, **dict(kwargs, postdict=self.request.POST, user_id=self.request.user.id))
+      return _method
+    else:
+      return object.__getattribute__(self.api, name)
+
+
+def get_api(request, snippet):
+  return ApiWrapper(request, snippet)
+
+
+def upgrade_session_properties(request, notebook):
+  # Upgrade session data if using old format
+  data = notebook.get_data()
+
+  for session in data.get('sessions', []):
+    api = get_api(request, session)
+    if 'type' in session and hasattr(api, 'upgrade_properties'):
+      properties = session.get('properties', None)
+      session['properties'] = api.upgrade_properties(session['type'], properties)
+
+  notebook.data = json.dumps(data)
+  return notebook
+
+
 class Analytics(object):
 
   @classmethod

+ 16 - 19
desktop/libs/notebook/src/notebook/tasks.py

@@ -29,9 +29,9 @@ import time
 
 from celery.utils.log import get_task_logger
 from celery import states
-
 from django.core.cache import caches
 from django.core.files.storage import get_storage_class
+from django.contrib.auth.models import User
 from django.db import transaction
 from django.http import FileResponse, HttpRequest
 
@@ -39,12 +39,14 @@ from beeswax import data_export
 from desktop.auth.backend import rewrite_user
 from desktop.celery import app
 from desktop.conf import TASK_SERVER
-from desktop.lib import export_csvxls
-from desktop.lib import fsmanager
+from desktop.lib import export_csvxls, fsmanager
+from desktop.models import Document2
 from desktop.settings import CACHES_CELERY_KEY, CACHES_CELERY_QUERY_RESULT_KEY
 from useradmin.models import User
 
+from notebook.api import _get_statement
 from notebook.connectors.base import get_api, QueryExpired, ExecutionWrapper
+from notebook.models import make_notebook, MockedDjangoRequest
 from notebook.sql_utils import get_current_statement
 
 if sys.version_info[0] > 2:
@@ -146,28 +148,23 @@ def close_statement_async(notebook, snippet, **kwargs):
 
 @app.task(ignore_result=True)
 def run_sync_query(doc_id, user):
-  '''Independently run a query as a user and insert the result into another table.'''
-  # get SQL
-  # Add INSERT INTO table
-  # Add variables?
-  # execute query
-  # return when done. send email notification. get taskid.
-  # see in Flower API for listing runs?
-  from django.contrib.auth.models import User
-  from notebook.models import make_notebook, MockedDjangoRequest
-
-  from desktop.auth.backend import rewrite_user
-
-  editor_type = 'impala'
-  sql = 'INSERT into customer_scheduled SELECT * FROM default.customers LIMIT 100;'
-  request = MockedDjangoRequest(user=rewrite_user(User.objects.get(username='romain')))
+  '''Independently run a query as a user.'''
+  # Add INSERT INTO table if persit result
+  # Add variables
+  # Return when done. send email notification. get taskid.
+  query_document = Document2.objects.document(user=user, doc_id=doc_id)
+  notebook = Notebook(document=query_document).get_data()
+  snippet = notebook['snippets'][0]
+
+  editor_type = snippet['type']
+  sql = _get_statement(notebook)
+  request = MockedDjangoRequest(user=user)
 
   notebook = make_notebook(
       name='Scheduler query N',
       editor_type=editor_type,
       statement=sql,
       status='ready',
-      #on_success_url=on_success_url,
       last_executed=time.mktime(datetime.datetime.now().timetuple()) * 1000,
       is_task=True
   )

+ 3 - 36
desktop/libs/notebook/src/notebook/views.py

@@ -26,7 +26,7 @@ from django.utils.translation import ugettext as _
 from django.views.decorators.clickjacking import xframe_options_exempt
 
 from beeswax.data_export import DOWNLOAD_COOKIE_AGE
-from desktop.conf import ENABLE_DOWNLOAD, USE_NEW_EDITOR, TASK_SERVER
+from desktop.conf import ENABLE_DOWNLOAD, USE_NEW_EDITOR
 from desktop.lib import export_csvxls
 from desktop.lib.django_util import render, JsonResponse
 from desktop.lib.exceptions_renderable import PopupException
@@ -35,36 +35,17 @@ from desktop.models import Document2, Document, FilesystemException
 from desktop.views import serve_403_error
 from metadata.conf import has_optimizer, has_catalog, has_workload_analytics
 
-from notebook import tasks as ntasks
 from notebook.conf import get_ordered_interpreters, SHOW_NOTEBOOKS
-from notebook.connectors.base import Notebook, get_api as _get_api, _get_snippet_name
+from notebook.connectors.base import Notebook, _get_snippet_name
 from notebook.connectors.spark_shell import SparkApi
 from notebook.decorators import check_editor_access_permission, check_document_access_permission, check_document_modify_permission
 from notebook.management.commands.notebook_setup import Command
-from notebook.models import make_notebook, _get_editor_type
+from notebook.models import make_notebook, _get_editor_type, get_api
 
 
 LOG = logging.getLogger(__name__)
 
 
-class ApiWrapper(object):
-  def __init__(self, request, snippet):
-    self.request = request
-    self.api = _get_api(request, snippet)
-  def __getattr__(self, name):
-    if TASK_SERVER.ENABLED.get() and hasattr(ntasks, name):
-      attr = object.__getattribute__(ntasks, name)
-      def _method(*args, **kwargs):
-        return attr(*args, **dict(kwargs, postdict=self.request.POST, user_id=self.request.user.id))
-      return _method
-    else:
-      return object.__getattribute__(self.api, name)
-
-
-def get_api(request, snippet):
-  return ApiWrapper(request, snippet)
-
-
 def notebooks(request):
   editor_type = request.GET.get('type', 'notebook')
 
@@ -379,17 +360,3 @@ def install_examples(request):
     response['message'] = _('A POST request is required.')
 
   return JsonResponse(response)
-
-
-def upgrade_session_properties(request, notebook):
-  # Upgrade session data if using old format
-  data = notebook.get_data()
-
-  for session in data.get('sessions', []):
-    api = get_api(request, session)
-    if 'type' in session and hasattr(api, 'upgrade_properties'):
-      properties = session.get('properties', None)
-      session['properties'] = api.upgrade_properties(session['type'], properties)
-
-  notebook.data = json.dumps(data)
-  return notebook