Explorar o código

HUE-6176 [frontend] Integrate dynamic config to the mainQuickCreateAction

Romain Rigaux %!s(int64=8) %!d(string=hai) anos
pai
achega
9f7f872

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

@@ -41,7 +41,7 @@ from desktop.lib.django_util import JsonResponse
 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
+from desktop.models import Document2, Document, Directory, FilesystemException, uuid_default, ClusterConfig
 
 
 LOG = logging.getLogger(__name__)
@@ -64,6 +64,17 @@ def api_error_handler(func):
   return decorator
 
 
+@api_error_handler
+def get_config(request):
+  app_config = ClusterConfig(request.user).get_apps()
+  
+  return JsonResponse({
+    'status': 0,
+    'app_config': app_config,
+    'main_button_action': app_config['editor']['interpreters'][1]
+  })
+
+
 @api_error_handler
 def search_documents(request):
   """

+ 160 - 0
desktop/core/src/desktop/models.py

@@ -21,6 +21,12 @@ import logging
 import os
 import urllib
 import uuid
+from notebook.conf import get_ordered_interpreters
+
+try:
+  from collections import OrderedDict
+except ImportError:
+  from ordereddict import OrderedDict # Python 2.6
 
 from itertools import chain
 
@@ -36,6 +42,9 @@ from django.utils.translation import ugettext as _, ugettext_lazy as _t
 
 from settings import HUE_DESKTOP_VERSION
 
+from dashboard.conf import IS_ENABLED as IS_DASHBOARD_ENABLED
+from notebook.conf import SHOW_NOTEBOOKS
+
 from desktop import appmanager
 from desktop.lib.i18n import force_unicode
 from desktop.lib.exceptions_renderable import PopupException
@@ -1491,6 +1500,157 @@ class Document2Permission(models.Model):
     return self.groups.filter(id__in=user.groups.all()).exists() or user in self.users.all()
 
 
+
+
+class ClusterConfig():
+  
+  def __init__(self, user, apps=None):
+    self.user = user
+    self.apps = appmanager.get_apps_dict(self.user) if apps is None else apps
+  
+  def setConfig(self):
+    # dataeng Execute  in Hive by default
+    #         JB: hide yarn, show dataeng
+    # Nav, NavOpt?
+    # reload "some ini sections"
+    pass
+  
+  @property
+  def main_quick_action(self):
+    return self._get_editor()['interpreters'][1]
+  
+  
+  def _get_editor(self):
+    interpreters = []
+    
+    if SHOW_NOTEBOOKS.get():
+      interpreters.append({
+        'name': 'notebook',
+        'type': 'notebook',
+        'displayName': 'Notebook',
+        'tooltip': _('Notebook'),
+        'page': '/notebook'
+      })    
+    
+    for interpreter in get_ordered_interpreters(self.user):
+      interpreters.append({
+        'name': interpreter['name'],
+        'type': interpreter['type'],
+        'displayName': interpreter['type'].title(),
+        'tooltip': _('%s Query') % interpreter['type'].title(),
+        'page': '/editor/?type=%(type)s' % interpreter,
+      })
+
+    return {
+        'name': 'editor',
+        'displayName': _('Editor'),
+        'interpreters': interpreters 
+      }
+
+  def _get_dashboard(self):
+    interpreters = [] # TODO Integrate SQL Dashboards and Solr 6 configs
+#     'interpreters': [
+#           {'solr': {}},
+#           {'impala': {}}
+#         ]    
+    
+    if IS_DASHBOARD_ENABLED.get():    
+      return {
+          'name': 'dashboard',
+          'displayName': _('Dashboard'),
+          'interpreters': interpreters,
+          'page': '/dashboard/new_search'
+        }
+    else:
+      return {}
+  
+  def _get_scheduler(self):
+    interpreters = [{
+        'type': 'oozie-workflow',
+        'displayName': _('Workflow'),
+        'tooltip': _('Workflow'),
+        'page': '/oozie/editor/workflow/new/'
+      }, {
+        'type': 'oozie-coordinator',
+        'displayName': _('Schedule'),
+        'tooltip': _('Schedule'),
+        'page': '/oozie/editor/coordinator/new/'
+      }, {
+        'type': 'oozie-bundle',
+        'displayName': _('Bundle'),
+        'tooltip': _('Bundle'),
+        'page': '/oozie/editor/bundle/new/'
+      }
+    ]
+
+    if 'oozie' in self.apps and not self.user.has_hue_permission(action="disable_editor_access", app="oozie") or self.user.is_superuser:
+      return {
+          'name': 'oozie',
+          'displayName': _('Scheduler'),
+          'interpreters': interpreters,
+        }
+    else:
+      return {}  
+  
+  def get_apps(self):
+    apps = OrderedDict([      
+      ('editor', self._get_editor()),
+      ('dashboard', self._get_dashboard()),
+      ('browser', {
+          'name': 'browser',
+          'displayName': _('Browsers'),
+        'interpreters': [{
+            'type': 'hdfs',
+            'displayName': _('Jobs'),
+            'page': '/jobbrowser/',
+          }, {
+            'type': 'metastore',
+            'displayName': _('Jobs'),
+            'page': '/jobbrowser/',
+          }, {
+            'type': 's3',
+            'displayName': _('Jobs'),
+            'page': '/jobbrowser/',
+          }, {
+            'type': 'jobbrowser',
+            'displayName': _('Jobs'),
+            'page': '/jobbrowser/',
+            'interpreters': [
+              'yarn',
+              'oozie',
+              'dataeng'
+            ]
+          }
+        ]
+      }),
+      ('scheduler', self._get_scheduler())
+    ])
+    
+    # Default action
+    # If not in user setting, first interpreter in apps
+#     default_app = None    
+#     if apps['editor'] and apps['editor']['interpreters']:
+#       if 'impala' in apps['editor']['interpreters']:
+#         default_app = apps['editor']['interpreters']['impala']
+#       elif 'hive' in apps['editor']['interpreters']:
+#         default_app = apps['editor']['interpreters']['hive']
+#       elif 'notebook' in apps['editor']['interpreters']:
+#         default_app = apps['editor']['interpreters']['notebook']
+#     elif apps['dashboard'] and apps['dashboard']['interpreters']:
+#       default_app = apps['dashboard']['interpreters'][0]
+#     elif apps['browser'] and apps['browser']['interpreters']:
+#       default_app = apps['browser']['interpreters'][0]
+#     elif apps['scheduler'] and apps['scheduler']['interpreters']:
+#       default_app = apps['scheduler']['interpreters'][0]
+#     
+#     
+#     
+#     default_app['isDefault'] = True
+    
+    return apps
+
+
+
 def get_data_link(meta):
   link = None
 

+ 30 - 21
desktop/core/src/desktop/templates/hue.mako

@@ -112,9 +112,11 @@ ${ hueIcons.symbols() }
 
 
         <div class="btn-group" data-bind="visible: true" style="display:none;">
+          <!-- ko if: mainQuickCreateAction -->
           <!-- ko with: mainQuickCreateAction -->
           <button class="btn btn-primary disable-feedback" href="javascript: void(0);" data-bind="click: click"><span data-bind="text: displayName"></span></button>
           <!-- /ko -->
+          <!-- /ko -->
           <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="javascript: void(0);"><!-- ko ifnot: mainQuickCreateAction -->${ _('More') } <!-- /ko --><span class="caret"></span></button>
           <ul class="dropdown-menu hue-main-create-dropdown" data-bind="foreach: { data: quickCreateActions, as: 'item' }">
             <!-- ko template: 'quick-create-item-template' --><!-- /ko -->
@@ -195,7 +197,6 @@ ${ hueIcons.symbols() }
 
   <div class="content-wrapper">
 
-
     <script type="text/html" id="tmpl-sidebar-link">
       <a role="button" class="sidebar-item" data-bind="click: item.click, attr: { title: item.displayName }">
         <!-- ko if: item.icon --><i class="fa" data-bind="css: item.icon"></i><!-- /ko -->
@@ -947,31 +948,39 @@ ${ smart_unicode(login_modal(request).content) | n,unicode }
 
         self.quickCreateActions = [];
 
-        % if cluster_config.main_quick_action:
-          self.mainQuickCreateAction = {
-            displayName: '${ cluster_config.main_quick_action['displayName'] }',
-            // Tooltip
-            icon: '${ cluster_config.main_quick_action['type'] }',
-            click: function(){
-              page('${ cluster_config.main_quick_action['page'] }');
-            }
-          };
-        % endif
+        
+        self.config = ko.observableArray();
+        
+        $.post("/desktop/api2/get_config/", {
+          cluster: ko.mapping.toJSON('default'),
+        }, function (data) {
+          if (data.status == 0) {
+            self.config(ko.mapping.fromJS(data));
+          } else {
+            $(document).trigger("error", data.message);
+          }
+        });
+
+
+        self.mainQuickCreateAction = ko.computed(function() {
+          var topApp = self.config()['main_button_action'];
+          if (topApp) {
+            return {
+              displayName: topApp.displayName,
+              icon: topApp.type,
+              click: function(){
+                page(topApp.page());
+              }
+            };
+          } else {
+            return null;
+          }
+        });
 
         
         % for name, app in cluster_config.get_apps().iteritems():
           var interpreters = []; 
           
-          % if name == 'editor' and SHOW_NOTEBOOKS.get():
-           interpreters.push({
-             displayName: '${ _('Notebook') }',
-             icon: 'notebook',
-             click: function(){
-               page('/notebook');
-            }
-          });
-          % endif
-          
           % for interpreter in app['interpreters']:
             interpreters.push({
               displayName: '${ interpreter['displayName'] }',

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

@@ -136,6 +136,8 @@ dynamic_patterns += patterns('desktop.api2',
   (r'^desktop/api2/doc/restore/?$', 'restore_document'),
   (r'^desktop/api2/doc/share/?$', 'share_document'),
 
+  (r'^desktop/api2/get_config/?$', 'get_config'),
+
   (r'^desktop/api2/doc/export/?$', 'export_documents'),
   (r'^desktop/api2/doc/import/?$', 'import_documents'),
 

+ 1 - 155
desktop/core/src/desktop/views.py

@@ -27,11 +27,6 @@ import time
 import traceback
 import zipfile
 
-try:
-  from collections import OrderedDict
-except ImportError:
-  from ordereddict import OrderedDict # Python 2.6
-
 from django.conf import settings
 from django.shortcuts import render_to_response
 from django.http import HttpResponse
@@ -44,7 +39,6 @@ from django.views.decorators.http import require_http_methods, require_POST
 import django.views.debug
 
 from aws.conf import is_enabled as is_s3_enabled, has_s3_access
-from dashboard.conf import IS_ENABLED as IS_DASHBOARD_ENABLED
 from notebook.conf import get_ordered_interpreters
 
 import desktop.conf
@@ -61,7 +55,7 @@ from desktop.lib.paths import get_desktop_root
 from desktop.lib.thread_util import dump_traceback
 from desktop.log.access import access_log_level, access_warn
 from desktop.log import set_all_debug as _set_all_debug, reset_all_debug as _reset_all_debug, get_all_debug as _get_all_debug
-from desktop.models import UserPreferences, Settings, hue_version
+from desktop.models import UserPreferences, Settings, hue_version, ClusterConfig
 from desktop import appmanager
 
 
@@ -73,154 +67,6 @@ def is_alive(request):
   return HttpResponse('')
 
 
-class ClusterConfig():
-  
-  def __init__(self, user, apps=None):
-    self.user = user
-    self.apps = appmanager.get_apps_dict(self.user) if apps is None else apps
-  
-  def setConfig(self):
-    # dataeng Execute  in Hive by default
-    #         JB: hide yarn, show dataeng
-    # Nav, NavOpt?
-    # reload "some ini sections"
-    pass
-  
-  @property
-  def main_quick_action(self):
-    return self._get_editor()['interpreters'][0]
-  
-  
-  def _get_editor(self):
-    interpreters = []
-    
-    for interpreter in get_ordered_interpreters(self.user):
-      interpreters.append({
-        'name': interpreter['name'],
-        'type': interpreter['type'],
-        'displayName': interpreter['type'].title(),
-        'tooltip': _('%s Query') % interpreter['type'].title(),
-        'page': '/editor/?type=%(type)s' % interpreter,
-      })
-
-    return {
-        'name': 'editor',
-        'displayName': _('Editor'),
-        'interpreters': interpreters 
-      }
-
-  def _get_dashboard(self):
-    interpreters = [] # TODO Integrate SQL Dashboards and Solr 6 configs
-#     'interpreters': [
-#           {'solr': {}},
-#           {'impala': {}}
-#         ]    
-    
-    if IS_DASHBOARD_ENABLED.get():    
-      return {
-          'name': 'dashboard',
-          'displayName': _('Dashboard'),
-          'interpreters': interpreters,
-          'page': '/dashboard/new_search'
-        }
-    else:
-      return {}
-  
-  def _get_scheduler(self):
-    interpreters = [{
-        'type': 'oozie-workflow',
-        'displayName': _('Workflow'),
-        'tooltip': _('Workflow'),
-        'page': '/oozie/editor/workflow/new/'
-      }, {
-        'type': 'oozie-coordinator',
-        'displayName': _('Schedule'),
-        'tooltip': _('Schedule'),
-        'page': '/oozie/editor/coordinator/new/'
-      }, {
-        'type': 'oozie-bundle',
-        'displayName': _('Bundle'),
-        'tooltip': _('Bundle'),
-        'page': '/oozie/editor/bundle/new/'
-      }
-    ]
-
-    if 'oozie' in self.apps and not self.user.has_hue_permission(action="disable_editor_access", app="oozie") or self.user.is_superuser:
-      return {
-          'name': 'oozie',
-          'displayName': _('Scheduler'),
-          'interpreters': interpreters,
-        }
-    else:
-      return {}  
-  
-  def get_apps(self):
-    apps = OrderedDict([      
-      ('editor', self._get_editor()
-#        'interpreters': get_ordered_interpreters(self.user)
-#         [
-#           {'hive': {}},
-#           {'impala': {}, 'isDefault': True},
-#           {'pig': {}},
-#           {'notebook': {}}
-#         ]
-      ),
-      ('dashboard', self._get_dashboard()
-      ),
-      ('browser', {
-          'name': 'browser',
-          'displayName': _('Browsers'),
-        'interpreters': [{
-            'type': 'hdfs',
-            'displayName': _('Jobs'),
-            'page': '/jobbrowser/',
-          }, {
-            'type': 'metastore',
-            'displayName': _('Jobs'),
-            'page': '/jobbrowser/',
-          }, {
-            'type': 's3',
-            'displayName': _('Jobs'),
-            'page': '/jobbrowser/',
-          }, {
-            'type': 'jobbrowser',
-            'displayName': _('Jobs'),
-            'page': '/jobbrowser/',
-            'interpreters': [
-              'yarn',
-              'oozie',
-              'dataeng'
-            ]
-          }
-        ]
-      }),
-      ('scheduler', self._get_scheduler())
-    ])
-    
-    # Default action
-    # If not in user setting, first interpreter in apps
-#     default_app = None    
-#     if apps['editor'] and apps['editor']['interpreters']:
-#       if 'impala' in apps['editor']['interpreters']:
-#         default_app = apps['editor']['interpreters']['impala']
-#       elif 'hive' in apps['editor']['interpreters']:
-#         default_app = apps['editor']['interpreters']['hive']
-#       elif 'notebook' in apps['editor']['interpreters']:
-#         default_app = apps['editor']['interpreters']['notebook']
-#     elif apps['dashboard'] and apps['dashboard']['interpreters']:
-#       default_app = apps['dashboard']['interpreters'][0]
-#     elif apps['browser'] and apps['browser']['interpreters']:
-#       default_app = apps['browser']['interpreters'][0]
-#     elif apps['scheduler'] and apps['scheduler']['interpreters']:
-#       default_app = apps['scheduler']['interpreters'][0]
-#     
-#     
-#     
-#     default_app['isDefault'] = True
-    
-    return apps
-
-
 def hue(request):
   apps = appmanager.get_apps_dict(request.user)