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

HUE-5756 [doc2] Set is_tashed for all children recursively when trashed or restored

krish 8 жил өмнө
parent
commit
9b2b3ce37d

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

@@ -1234,6 +1234,10 @@ class Document2(models.Model):
       self.move(trash_dir, self.owner)
       self.is_trashed = True
       self.save()
+
+      if self.is_directory:
+        children_ids = self._get_child_ids_recursively(self.id)
+        Document2.objects.filter(id__in=children_ids).update(is_trashed=True)
     except Document2.MultipleObjectsReturned:
       LOG.error('Multiple Trash directories detected. Merging all into one.')
 
@@ -1252,6 +1256,21 @@ class Document2(models.Model):
     self.is_trashed = False
     self.save()
 
+    if self.is_directory:
+      children_ids = self._get_child_ids_recursively(self.id)
+      Document2.objects.filter(id__in=children_ids).update(is_trashed=False)
+
+  def _get_child_ids_recursively(self, directory_id):
+    """
+    Returns the list of all children ids for a given directory id recursively, excluding history documents
+    """
+    directory = Directory.objects.get(id=directory_id)
+    children_ids = []
+    for child in directory.children.filter(is_history=False).filter(is_managed=False):
+      children_ids.append(child.id)
+      if child.is_directory:
+        children_ids.extend(self._get_child_ids_recursively(child.id))
+    return children_ids
 
   def can_read(self, user):
     perm = self.get_permission('read')

+ 53 - 15
desktop/core/src/desktop/tests.py

@@ -895,28 +895,66 @@ class TestDocument(object):
     assert_equal(Document2.objects.get(name='Test Document2').id, self.document2.id)
     assert_equal(Document.objects.get(name='Test Document').id, self.document.id)
 
-  def test_document_trashed(self):
+  def test_document_trashed_and_restore(self):
     home_dir = Directory.objects.get_home_directory(self.user)
     test_dir, created = Directory.objects.get_or_create(
-          parent_directory=home_dir,
-          owner=self.user,
-          name='test_dir'
-        )
-    test_doc = Document2.objects.create(name='Test Document2',
-                                              type='search-dashboard',
-                                              owner=self.user,
-                                              description='Test Document2',
-                                              parent_directory=test_dir)
+        parent_directory=home_dir,
+        owner=self.user,
+        name='test_dir'
+    )
+    test_doc = Document2.objects.create(
+        name='Test Document2',
+        type='search-dashboard',
+        owner=self.user,
+        description='Test Document2',
+        parent_directory=test_dir
+    )
+
+    child_dir, created = Directory.objects.get_or_create(
+        parent_directory=test_dir,
+        owner=self.user,
+        name='child_dir'
+    )
+    test_doc1 = Document2.objects.create(
+        name='Test Document2',
+        type='search-dashboard',
+        owner=self.user,
+        description='Test Document2',
+        parent_directory=child_dir
+    )
 
     assert_false(test_dir.is_trashed)
     assert_false(test_doc.is_trashed)
+    assert_false(child_dir.is_trashed)
+    assert_false(test_doc1.is_trashed)
 
-    test_dir.trash()
-    assert_true(test_doc.is_trashed)
-    assert_true(test_dir.is_trashed)
+    try:
+      test_dir.trash()
+      test_dir = Document2.objects.get(id=test_dir.id)
+      test_doc = Document2.objects.get(id=test_doc.id)
+      child_dir = Document2.objects.get(id=child_dir.id)
+      test_doc1 = Document2.objects.get(id=test_doc1.id)
+      assert_true(test_doc.is_trashed)
+      assert_true(test_dir.is_trashed)
+      assert_true(child_dir.is_trashed)
+      assert_true(test_doc1.is_trashed)
+
+      # Test restore
+      test_dir.restore()
+      test_dir = Document2.objects.get(id=test_dir.id)
+      test_doc = Document2.objects.get(id=test_doc.id)
+      child_dir = Document2.objects.get(id=child_dir.id)
+      test_doc1 = Document2.objects.get(id=test_doc1.id)
+      assert_false(test_doc.is_trashed)
+      assert_false(test_dir.is_trashed)
+      assert_false(child_dir.is_trashed)
+      assert_false(test_doc1.is_trashed)
+    finally:
+      test_doc.delete()
+      test_dir.delete()
+      test_doc1.delete()
+      child_dir.delete()
 
-    test_doc.delete()
-    test_dir.delete()
 
   def test_multiple_home_directories(self):
     home_dir = Directory.objects.get_home_directory(self.user)