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

[home2] Import RDBMS doc1 as doc2 and set type accordingly

Jenny Kim 9 жил өмнө
parent
commit
616bf14

+ 3 - 3
apps/beeswax/src/beeswax/design.py

@@ -106,15 +106,15 @@ class HQLdesign(object):
 
   @property
   def settings(self):
-    return list(self._data_dict['settings'])
+    return list(self._data_dict.get('settings', []))
 
   @property
   def file_resources(self):
-    return list(self._data_dict['file_resources'])
+    return list(self._data_dict.get('file_resources', []))
 
   @property
   def functions(self):
-    return list(self._data_dict['functions'])
+    return list(self._data_dict.get('functions', []))
 
   @property
   def statement_count(self):

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

@@ -24,6 +24,7 @@ import zipfile
 
 from django.contrib.auth.models import Group, User
 from django.core import management
+from django.db import transaction
 from django.http import HttpResponse
 from django.shortcuts import redirect
 from django.utils import html
@@ -63,8 +64,6 @@ def api_error_handler(func):
 def get_documents2(request):
   path = request.GET.get('path', '/') # Expects path to be a Directory for now
 
-  _import_documents1(request.user)
-
   try:
     directory = Directory.objects.get(owner=request.user, name=path) # TODO perms
   except Directory.DoesNotExist, e:
@@ -74,7 +73,6 @@ def get_documents2(request):
     else:
       raise e
 
-
   parent_path = path.rsplit('/', 1)[0] or '/'
   parent = directory.dependencies.get(name=parent_path) if path != '/' else None
 
@@ -88,35 +86,37 @@ def get_documents2(request):
 
 def _import_documents1(user):
   from beeswax.models import HQL, IMPALA, RDBMS
-  docs = Document.objects.get_docs(user, SavedQuery).filter(owner=user).filter(extra__in=[HQL, IMPALA]) # TODO RDBMS
-
-  imported_tag = DocumentTag.objects.get_imported2_tag(user=user)
-
-  docs = docs.exclude(tags__in=[
-      DocumentTag.objects.get_trash_tag(user=user), # No trashed docs
-      DocumentTag.objects.get_history_tag(user=user), # No history yet
-      DocumentTag.objects.get_example_tag(user=user), # No examples
-      imported_tag # No already imported docs
-  ])
-
-  root_doc, created = Directory.objects.get_or_create(name='/', owner=user)
-  imported_docs = []
-
-  for doc in docs:
-    if doc.content_object:
-      try:
-        notebook = import_saved_beeswax_query(doc.content_object)
-        data = notebook.get_data()
-        notebook_doc = Document2.objects.create(name=data['name'], type='query-%s' % data['type'], owner=user, data=notebook.get_json())
-
-        doc.add_tag(imported_tag)
-        doc.save()
-        imported_docs.append(notebook_doc)
-      except Exception, e:
-        raise e
-
-  if imported_docs:
-    root_doc.dependencies.add(*imported_docs)
+
+  with transaction.atomic():
+    docs = Document.objects.get_docs(user, SavedQuery).filter(owner=user).filter(extra__in=[HQL, IMPALA, RDBMS])
+
+    imported_tag = DocumentTag.objects.get_imported2_tag(user=user)
+
+    docs = docs.exclude(tags__in=[
+        DocumentTag.objects.get_trash_tag(user=user), # No trashed docs
+        DocumentTag.objects.get_history_tag(user=user), # No history yet
+        DocumentTag.objects.get_example_tag(user=user), # No examples
+        imported_tag # No already imported docs
+    ])
+
+    root_doc, created = Directory.objects.get_or_create(name='/', owner=user)
+    imported_docs = []
+
+    for doc in docs:
+      if doc.content_object:
+        try:
+          notebook = import_saved_beeswax_query(doc.content_object)
+          data = notebook.get_data()
+          notebook_doc = Document2.objects.create(name=data['name'], type=data['type'], owner=user, data=notebook.get_json())
+
+          doc.add_tag(imported_tag)
+          doc.save()
+          imported_docs.append(notebook_doc)
+        except Exception, e:
+          raise e
+
+    if imported_docs:
+      root_doc.dependencies.add(*imported_docs)
 
 
 @api_error_handler

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

@@ -1021,7 +1021,7 @@ def import_saved_beeswax_query(bquery):
   return make_notebook(
       name=bquery.name,
       description=bquery.desc,
-      editor_type=_convert_type(bquery.type),
+      editor_type=_convert_type(bquery.type, bquery.data),
       statement=design.hql_query,
       status='ready',
       files=design.file_resources,
@@ -1029,15 +1029,16 @@ def import_saved_beeswax_query(bquery):
       settings=design.settings
   )
 
-def _convert_type(btype):
+def _convert_type(btype, bdata):
   from beeswax.models import HQL, IMPALA, RDBMS, SPARK
 
   if btype == HQL:
     return 'hive'
   elif btype == IMPALA:
     return 'impala'
-  elif btype == RDBMS: # We should instead get the 'type' (https://github.com/cloudera/hue/blob/master/desktop/libs/librdbms/src/librdbms/design.py#L47
-    return 'mysql' # postgres, sqlite, oracle
+  elif btype == RDBMS:
+    data = json.loads(bdata)
+    return data['query']['server']
   elif btype == SPARK: # We should not import
     return 'spark'
   else:

+ 3 - 0
desktop/core/src/desktop/views.py

@@ -40,6 +40,7 @@ import desktop.conf
 import desktop.log.log_buffer
 
 from desktop.api import massaged_tags_for_json, massaged_documents_for_json, _get_docs
+from desktop.api2 import _import_documents1
 from desktop.lib import django_mako
 from desktop.lib.conf import GLOBAL_CONFIG, BoundConfig
 from desktop.lib.django_util import JsonResponse, login_notrequired, render_json, render
@@ -73,6 +74,8 @@ def home(request):
 
 
 def home2(request):
+  _import_documents1(request.user)
+
   apps = appmanager.get_apps_dict(request.user)
 
   return render('home2.mako', request, {