浏览代码

HUE-8750 [dashboard] Avoid missing collection in a saved dashboard

Romain 6 年之前
父节点
当前提交
9e919798be

+ 16 - 16
desktop/libs/dashboard/src/dashboard/api.py

@@ -69,7 +69,7 @@ def search(request):
         response = get_engine(request.user, collection, facet, cluster=cluster).query(collection, query, facet)
     except RestException, e:
       response.update(extract_solr_exception_message(e))
-    except Exception, e:
+    except Exception as e:
       raise PopupException(e, title=_('Error while accessing Solr'))
 
       response['error'] = force_unicode(e)
@@ -99,7 +99,7 @@ def query_suggest(request):
     response = SolrApi(SOLR_URL.get(), request.user).suggest(collection['name'], solr_query)
     result['response'] = response
     result['status'] = 0
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
 
   return JsonResponse(result)
@@ -125,14 +125,14 @@ def index_fields_dynamic(request):
         for name, properties in dynamic_fields['fields'].iteritems() if 'dynamicBase' in properties
     ]
     result['status'] = 0
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
 
   return JsonResponse(result)
 
 
 def nested_documents(request):
-  result = {'status': -1, 'message': 'Error'}
+  result = {'status': -1, 'message': 'Ok'}
 
   response = {}
 
@@ -143,7 +143,7 @@ def nested_documents(request):
     response = get_engine(request.user, collection).query(collection, query)
     result['has_nested_documents'] = response['response']['numFound'] > 0
     result['status'] = 0
-  except Exception, e:
+  except Exception as e:
     LOG.exception('Failed to list nested documents')
     result['message'] = force_unicode(e)
     result['has_nested_documents'] = False
@@ -171,7 +171,7 @@ def get_document(request):
       result['message'] = _('This document does not have any index id.')
       result['status'] = 1
 
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
 
   return JsonResponse(result)
@@ -208,13 +208,13 @@ def update_document(request):
     else:
       result['status'] = 0
       result['message'] = _('Document has no modifications to change.')
-  except RestException, e:
+  except RestException as e:
     try:
       result['message'] = json.loads(e.message)['error']['msg']
     except:
       LOG.exception('Failed to parse json response')
       result['message'] = force_unicode(e)
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
 
   return JsonResponse(result)
@@ -236,7 +236,7 @@ def get_stats(request):
     result['status'] = 0
     result['message'] = ''
 
-  except Exception, e:
+  except Exception as e:
     LOG.exception('Failed to get stats for field')
     result['message'] = force_unicode(e)
     if 'not currently supported' in result['message']:
@@ -275,7 +275,7 @@ def get_terms(request):
     result['status'] = 0
     result['message'] = ''
 
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
     if 'not currently supported' in result['message']:
       result['status'] = 1
@@ -311,7 +311,7 @@ def download(request):
       return resp
     else:
       return export_download(response, file_format, collection, user_agent=request.META.get('HTTP_USER_AGENT'))
-  except Exception, e:
+  except Exception as e:
     raise PopupException(_("Could not download search results: %s") % e)
 
 
@@ -356,7 +356,7 @@ def get_timeline(request):
     result['series'] = {'label': label, 'counts': response['normalized_facets'][0]['counts']}
     result['status'] = 0
     result['message'] = ''
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
 
   return JsonResponse(result)
@@ -379,7 +379,7 @@ def new_facet(request):
     result['message'] = ''
     result['facet'] = _create_facet(collection, request.user, facet_id, facet_label, facet_field, widget_type, window_size)
     result['status'] = 0
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
 
   return JsonResponse(result)
@@ -564,7 +564,7 @@ def get_range_facet(request):
     result['properties'] = properties
     result['status'] = 0
 
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
 
   return JsonResponse(result)
@@ -584,7 +584,7 @@ def get_collection(request):
     result['collection'] = json.loads(collection_json)
     result['status'] = 0
 
-  except Exception, e:
+  except Exception as e:
     result['message'] = force_unicode(e)
 
   return JsonResponse(result)
@@ -600,7 +600,7 @@ def get_collections(request):
     result['collection'] = get_engine(request.user, collection).datasets(show_all=show_all)
     result['status'] = 0
 
-  except Exception, e:
+  except Exception as e:
     if 'does not have privileges' in str(e):
       result['status'] = 0
       result['collection'] = [json.loads(request.POST.get('collection'))['name']]

+ 10 - 2
desktop/libs/dashboard/src/dashboard/tests.py

@@ -73,6 +73,8 @@ class MockResource():
         return SOLR_LUKE_SCHEMA
       else:
         return SOLR_LUKE_
+    elif 'admin/collections' in args[0]:
+      return {'collections': ['collection_1'], 'aliases': []}
     else:
       return MockResource.RESPONSE
 
@@ -508,8 +510,14 @@ class TestWithMockedSolr(TestSearchBase):
     assert_equal('attachment; filename="query_result.xlsx"', xls_response['Content-Disposition'])
 
   def test_index_xss(self):
-    doc = Document2.objects.create(name='test_dashboard', type='search-dashboard', owner=self.user,
-                                   data=json.dumps(self.collection.data), parent_directory=self.home_dir)
+    doc = Document2.objects.create(
+      name='test_dashboard',
+      type='search-dashboard',
+      owner=self.user,
+      data=json.dumps(self.collection.data),
+      parent_directory=self.home_dir
+    )
+
     try:
       response = self.c.get(reverse('dashboard:index') + ('?collection=%s' % doc.id) + '&q=</script><script>alert(%27XSS%27)</script>')
       assert_equal('{"fqs": [], "qs": [{"q": "alert(\'XSS\')"}], "start": 0}', response.context[0]['query'])

+ 11 - 4
desktop/libs/dashboard/src/dashboard/views.py

@@ -82,11 +82,17 @@ TEXT_SEARCH_LAYOUT = [
 
 
 def index(request, is_mobile=False):
-  hue_collections = DashboardController(request.user).get_search_collections()
+  engine = request.GET.get('engine', 'solr')
+  cluster = request.POST.get('cluster','""')
   collection_id = request.GET.get('collection')
 
-  if not hue_collections or not collection_id:
-    return admin_collections(request, True, is_mobile)
+  collections = get_engine(request.user, engine, cluster=cluster).datasets() if engine != 'report' else ['default']
+
+  if not collections:
+    if engine == 'solr':
+      return no_collections(request)
+    else:
+      return importer(request)
 
   try:
     collection_doc = Document2.objects.get(id=collection_id)
@@ -110,11 +116,12 @@ def index(request, is_mobile=False):
   if is_mobile:
     template = 'search_m.mako'
   engine = collection.data['collection']['engine']
+
   return render(template, request, {
     'collection': collection,
     'query': json.dumps(query),
     'initial': json.dumps({
-        'collections': [],
+        'collections': collections,
         'layout': DEFAULT_LAYOUT,
         'qb_layout': QUERY_BUILDER_LAYOUT,
         'text_search_layout': TEXT_SEARCH_LAYOUT,

+ 2 - 1
desktop/libs/indexer/src/indexer/solr_client.py

@@ -343,7 +343,8 @@ class SolrClient(object):
     return field
 
 
-  def _reset_properties(self):
+  @staticmethod
+  def _reset_properties():
     global _IS_SOLR_CLOUD
     global _IS_SOLR_6_OR_MORE
     global _IS_SOLR_WITH_HDFS

+ 4 - 3
desktop/libs/indexer/src/indexer/solr_client_tests.py

@@ -40,6 +40,8 @@ class TestSolrClient:
     global _IS_SOLR_WITH_HDFS
     global _ZOOKEEPER_HOST
 
+    SolrClient._reset_properties()
+
 
   def test_get_ensemble_cdh_solr(self):
     try:
@@ -50,7 +52,7 @@ class TestSolrClient:
       assert_true(client.is_solr_with_hdfs())
       assert_equal('hue.com:2181/solr', client.get_zookeeper_host())
     finally:
-      client._reset_properties()
+      SolrClient._reset_properties()
 
 
   def test_get_ensemble_upstream_solr(self):
@@ -62,8 +64,7 @@ class TestSolrClient:
       assert_false(client.is_solr_with_hdfs())
       assert_equal('localhost:9983', client.get_zookeeper_host())
     finally:
-      client._reset_properties()
-
+      SolrClient._reset_properties()
 
 
 class MockSolrCdhCloudHdfsApi():