瀏覽代碼

HUE-3555 [doc2] Exporting directories also exports any children directories and docs

Jenny Kim 9 年之前
父節點
當前提交
08fd395
共有 2 個文件被更改,包括 41 次插入4 次删除
  1. 10 3
      desktop/core/src/desktop/api2.py
  2. 31 1
      desktop/core/src/desktop/tests_doc2.py

+ 10 - 3
desktop/core/src/desktop/api2.py

@@ -327,6 +327,9 @@ def export_documents(request):
   # Add any dependencies to the set of exported documents
   export_doc_set = _get_dependencies(docs)
 
+  # For directories, add any children docs to the set of exported documents
+  export_doc_set.update(_get_dependencies(docs, deps_mode=False))
+
   # Get PKs of documents to export
   doc_ids = [doc.pk for doc in export_doc_set]
 
@@ -424,11 +427,12 @@ def import_documents(request):
     return JsonResponse({'message': stdout.getvalue()})
 
 
-def _get_dependencies(documents):
+def _get_dependencies(documents, deps_mode=True):
   """
   Given a list of Document2 objects, perform a depth-first search and return a set of documents with all
    dependencies included
-  :param doc_set:
+  :param doc_set: set of Document2 objects to include
+  :param deps_mode: traverse dependencies relationship, otherwise traverse children relationship
   """
   doc_set = set()
 
@@ -438,7 +442,10 @@ def _get_dependencies(documents):
       curr_doc = stack.pop()
       if curr_doc not in doc_set:
         doc_set.add(curr_doc)
-        deps_set = set(curr_doc.dependencies.all())
+        if deps_mode:
+          deps_set = set(curr_doc.dependencies.all())
+        else:
+          deps_set = set(curr_doc.children.all())
         stack.extend(deps_set - doc_set)
 
   return doc_set

+ 31 - 1
desktop/core/src/desktop/tests_doc2.py

@@ -791,7 +791,7 @@ class TestDocument2ImportExport(object):
     self.home_dir = Document2.objects.get_home_directory(user=self.user)
     self.not_me_home_dir = Document2.objects.get_home_directory(user=self.user_not_me)
 
-  def test_export_documents(self):
+  def test_export_documents_with_dependencies(self):
     query1 = Document2.objects.create(name='query1.sql', type='query-hive', owner=self.user, data={}, parent_directory=self.home_dir)
     query2 = Document2.objects.create(name='query2.sql', type='query-hive', owner=self.user, data={}, parent_directory=self.home_dir)
     workflow = Document2.objects.create(name='test.wf', type='oozie-workflow2', owner=self.user, data={}, parent_directory=self.home_dir)
@@ -823,6 +823,36 @@ class TestDocument2ImportExport(object):
     assert_true('query2.sql' in [doc['fields']['name'] for doc in documents])
 
 
+  def test_export_directories_with_children(self):
+    # Test that exporting a directory exports children docs
+    # /
+    #   dir1/
+    #     query1.sql
+    #   dir2/
+    #     dir3/
+    #       query2.sql
+    #   query3.sql
+
+    dir1 = Directory.objects.create(name='dir1', owner=self.user, parent_directory=self.home_dir)
+    doc1 = Document2.objects.create(name='query1.sql', type='query-hive', owner=self.user, data={}, parent_directory=dir1)
+    dir2 = Directory.objects.create(name='dir2', owner=self.user, parent_directory=self.home_dir)
+    dir3 = Directory.objects.create(name='dir3', owner=self.user, parent_directory=dir2)
+    doc2 = Document2.objects.create(name='query2.sql', type='query-hive', owner=self.user, data={}, parent_directory=dir3)
+    doc3 = Document2.objects.create(name='query3.sql', type='query-hive', owner=self.user, data={}, parent_directory=self.home_dir)
+
+    response = self.client.get('/desktop/api2/doc/export/', {'documents': json.dumps([dir1.id, dir2.id, doc3.id]), 'format': 'json'})
+    documents = json.loads(response.content)
+    documents = json.loads(documents)
+
+    assert_equal(6, len(documents))
+    assert_true('dir1' in [doc['fields']['name'] for doc in documents])
+    assert_true('query1.sql' in [doc['fields']['name'] for doc in documents])
+    assert_true('dir2' in [doc['fields']['name'] for doc in documents])
+    assert_true('dir3' in [doc['fields']['name'] for doc in documents])
+    assert_true('query2.sql' in [doc['fields']['name'] for doc in documents])
+    assert_true('query3.sql' in [doc['fields']['name'] for doc in documents])
+
+
   def test_import_owned_document(self):
     owned_query = Document2.objects.create(
       name='query.sql',