Selaa lähdekoodia

HUE-8530 [connectors] Unify the API for listing types and instances

Romain 5 vuotta sitten
vanhempi
commit
5cea20d062

+ 53 - 41
desktop/core/src/desktop/lib/connectors/api.py

@@ -24,88 +24,100 @@ from useradmin.models import update_app_permissions
 
 from desktop.lib.django_util import JsonResponse, render
 from desktop.lib.exceptions_renderable import PopupException
-from desktop.lib.connectors import models
-from desktop.lib.connectors.models import AVAILABLE_CONNECTORS, _get_connector_by_id, _get_installed_connectors, _group_category_connectors
-from desktop.lib.connectors.types import CONNECTOR_TYPES, CATEGORIES
+from desktop.lib.connectors.models import _get_installed_connectors, get_connectors_types, Connector
+from desktop.lib.connectors.types import get_connectors_types, get_connector_categories, get_connector_by_type
 
 
 LOG = logging.getLogger(__name__)
 
 
 def get_connector_types(request):
-  global AVAILABLE_CONNECTORS
-  global CATEGORIES
-
   return JsonResponse({
-    'connectors': AVAILABLE_CONNECTORS,
-    'categories': CATEGORIES
+    'connectors': _group_by_category(
+      get_connectors_types()
+    ),
+    'categories': get_connector_categories()
   })
 
 
-def get_installed_connectors(request):
+def get_connectors_instances(request):
   return JsonResponse({
-    'connectors': _group_category_connectors(
+    'connectors': _group_by_category(
       _get_installed_connectors()
-    ),
+    )
   })
 
 
 def new_connector(request, dialect):
-  instance = _get_connector_by_type(dialect)
+  instance = get_connector_by_type(dialect)
 
   instance['nice_name'] = dialect.title()
   instance['id'] = None
 
-  update_app_permissions()
-
   return JsonResponse({'connector': instance})
 
 
 def get_connector(request, id):
-  instance = _get_connector_by_id(id)
+  instance = Connector.objects.get(id=id)
 
-  return JsonResponse(instance)
+  return JsonResponse({
+    'id': instance.id,
+    'name': instance.name,
+    'description': instance.description,
+    'dialect': instance.dialect,
+    'settings': json.loads(instance.settings)
+  })
 
 
+# TODO: check if has perm
 def update_connector(request):
   connector = json.loads(request.POST.get('connector', '{}'))
   saved_as = False
 
   if connector.get('id'):
-    instance = _get_connector_by_id(connector['id'])
-    instance.update(connector)
+    instance = Connector.objects.get(id=connector['id'])
+    instance.name = connector['nice_name']
+    instance.description = connector['description']
+    instance.settings = json.dumps(connector['settings'])
+    instance.save()
   else:
     saved_as = True
-    instance = connector
-    instance['id'] = models.CONNECTOR_IDS
-    instance['nice_name'] = instance['nice_name']
-    instance['name'] = '%s-%s' % (instance['dialect'], models.CONNECTOR_IDS)
-    models.CONNECTOR_IDS += 1
-    models.CONNECTOR_INSTANCES.append(instance)
+    instance = Connector.objects.create(
+      name=instance['nice_name'],
+      description='',
+      dialect=instance['dialect'],
+      settings=json.dumps(instance['settings'])
+    )
+    connector['id'] = instance.id
+    connector['name'] = instance.id
 
   update_app_permissions()
 
-  return JsonResponse({'connector': instance, 'saved_as': saved_as})
+  return JsonResponse({'connector': connector, 'saved_as': saved_as})
 
 
-def _get_connector_by_type(dialect):
-  instance = [connector for connector in CONNECTOR_TYPES if connector['dialect'] == dialect]
+# TODO: check if has perm
+def delete_connector(request):
+  connector = json.loads(request.POST.get('connector'), '{}')
 
-  if instance:
-    return instance[0]
-  else:
-    raise PopupException(_('No connector with the type %s found.') % type)
+  try:
+    Connector.objects.get(id=connector['id']).delete()
+  except Exception as e:
+    raise PopupException(_('Error deleting connector %s: %s') % (connector['name'], e))
 
+  update_app_permissions()
 
-def delete_connector(request):
-  connector = json.loads(request.POST.get('connector'), '{}')
+  return JsonResponse({})
 
-  size_before = len(models.CONNECTOR_INSTANCES)
-  models.CONNECTOR_INSTANCES = [_connector for _connector in models.CONNECTOR_INSTANCES if _connector['name'] != connector['name']]
-  size_after = len(models.CONNECTOR_INSTANCES)
 
-  if size_before == size_after + 1:
-    update_app_permissions()
-    return JsonResponse({})
-  else:
-    raise PopupException(_('No connector with the name %(name)s found.') % connector)
+def _group_by_category(conns):
+  return [{
+      'category': category['type'],
+      'category_name': category['name'],
+      'description': category['description'],
+      'values': [
+        _connector
+        for _connector in conns if _connector['category'] == category['type']
+      ],
+    } for category in get_connector_categories()
+  ]

+ 2 - 25
desktop/core/src/desktop/lib/connectors/models.py

@@ -23,7 +23,7 @@ from django.db.models.query import QuerySet
 from django.utils.translation import ugettext as _, ugettext_lazy as _t
 
 from desktop.conf import CONNECTORS
-from desktop.lib.connectors.types import CONNECTOR_TYPES, CATEGORIES
+from desktop.lib.connectors.types import get_connectors_types
 from desktop.lib.exceptions_renderable import PopupException
 
 
@@ -37,7 +37,6 @@ class Connector(models.Model):
   name = models.CharField(default='', max_length=255)
   description = models.TextField(default='')
   dialect = models.CharField(max_length=32, db_index=True, help_text=_t('Type of connector, e.g. hive, mysql... '))
-
   settings = models.TextField(default='{}')
   last_modified = models.DateTimeField(auto_now=True, db_index=True, verbose_name=_t('Time last modified'))
 
@@ -49,19 +48,6 @@ class Connector(models.Model):
     unique_together = ('name', 'organization',)
 
 
-def _group_category_connectors(connectors):
-  return [{
-      'category': category['type'],
-      'category_name': category['name'],
-      'description': category['description'],
-      'values': [_connector for _connector in connectors if _connector['category'] == category['type']],
-    } for category in CATEGORIES
-  ]
-
-
-AVAILABLE_CONNECTORS = _group_category_connectors(CONNECTOR_TYPES)
-
-
 def _get_installed_connectors(category=None, categories=None, dialect=None, interface=None, user=None):
   connectors = []
   connector_instances = [
@@ -91,7 +77,7 @@ def _get_installed_connectors(category=None, categories=None, dialect=None, inte
   for connector in connector_instances:
     connector_types = []
 
-    for connector_type in CONNECTOR_TYPES:
+    for connector_type in get_connectors_types():
       if connector_type['dialect'] == connector['dialect']:
         connector_types.insert(0, connector_type)
       elif connector_type.get('interface') == connector['interface']:
@@ -129,12 +115,3 @@ def _get_installed_connectors(category=None, categories=None, dialect=None, inte
     connectors = [connector for connector in connectors if connector['name'] in allowed_connectors]
 
   return connectors
-
-
-def _get_connector_by_id(id):
-  instance = [connector for connector in _get_installed_connectors() if connector['id'] == id]
-
-  if instance:
-    return instance[0]
-  else:
-    raise PopupException(_('No connector with the id %s found.') % id)

+ 16 - 0
desktop/core/src/desktop/lib/connectors/types.py

@@ -21,6 +21,7 @@ import logging
 from django.utils.translation import ugettext as _
 
 from desktop.conf import CONNECTORS_BLACKLIST, CONNECTORS_WHITELIST
+from desktop.lib.exceptions_renderable import PopupException
 
 
 LOG = logging.getLogger(__name__)
@@ -521,3 +522,18 @@ CATEGORIES = [
   {"name": "Schedulers", 'type': 'schedulers', 'description': ''},
   {"name": "Plugins", 'type': 'plugins', 'description': ''},
 ]
+
+
+def get_connectors_types():
+  return CONNECTOR_TYPES
+
+def get_connector_categories():
+  return CATEGORIES
+
+def get_connector_by_type(dialect):
+  instance = [connector for connector in get_connectors_types() if connector['dialect'] == dialect]
+
+  if instance:
+    return instance[0]
+  else:
+    raise PopupException(_('No connector with the type %s found.') % type)

+ 1 - 1
desktop/core/src/desktop/lib/connectors/urls.py

@@ -24,7 +24,7 @@ urlpatterns = [
   url(r'^$', views.index, name='desktop.lib.connectors.views.index'),
 
   url(r'^api/types/?$', api.get_connector_types, name='connectors.api.get_connector_types'),
-  url(r'^api/instances/?$', api.get_installed_connectors, name='connectors.api.get_installed_connectors'),
+  url(r'^api/instances/?$', api.get_connectors_instances, name='connectors.api.get_connectors_instances'),
 
   url(r'^api/instance/new/(?P<dialect>[\w\-]+)$', api.new_connector, name='connectors.api.new_connector'),
   url(r'^api/instance/get/(?P<id>\d+)$', api.get_connector, name='connectors.api.get_connector'),

+ 4 - 4
desktop/core/src/desktop/templates/connectors/connectors.mako

@@ -16,13 +16,13 @@
 <%!
 from django.utils.translation import ugettext as _
 
-from desktop import conf
+from desktop.conf import CUSTOM
 from desktop.views import commonheader, commonfooter
 %>
 
 <%
 MAIN_SCROLLABLE = "'.page-content'"
-if conf.CUSTOM.BANNER_TOP_HTML.get():
+if CUSTOM.BANNER_TOP_HTML.get():
   TOP_SNAP = "78px"
 else:
   TOP_SNAP = "50px"
@@ -70,7 +70,7 @@ else:
                 "values": []
             };
             _connector.values = connector.values.filter(function (subMetricKey) {
-              return subMetricKey.name.toLowerCase().indexOf(lowerQuery) !== -1;
+              return self.connectorsFilter() || subMetricKey.name.toLowerCase().indexOf(lowerQuery) !== -1;
             });
             if (_connector.values.length > 0) {
               filteredConnectors.push(_connector);
@@ -225,7 +225,7 @@ ${ layout.menubar(section='connectors') }
       <div class="span10">
         <div data-bind="dockable: { scrollable: ${ MAIN_SCROLLABLE }, jumpCorrection: 0, topSnap: '${ TOP_SNAP }', triggerAdjust: 0 }">
           <span class="pull-right">
-            <a href="http://gethue.com" target="_blank">
+            <a href="https://gethue.com" target="_blank">
               <i class="fa fa-question-circle"></i> ${ _('Help') }
             </a>
           </span>