浏览代码

HUE-3445 [doc2] Check parent perms on saving a document and apply as needed

Jenny Kim 9 年之前
父节点
当前提交
ce92258
共有 2 个文件被更改,包括 29 次插入0 次删除
  1. 11 0
      desktop/core/src/desktop/models.py
  2. 18 0
      desktop/core/src/desktop/tests_doc2.py

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

@@ -1047,6 +1047,9 @@ class Document2(models.Model):
 
     super(Document2, self).save(*args, **kwargs)
 
+    # Inherit shared permissions from parent directory, must be done after save b/c new doc needs ID
+    self.inherit_permissions()
+
   def validate(self):
     # Validate document name
     invalid_chars = re.compile(r"[<>/{}[\]~`]");
@@ -1063,6 +1066,14 @@ class Document2(models.Model):
       raise FilesystemException(_('Cannot save document %s under parent directory %s due to circular dependency') %
                                 (self.name, self.parent_directory.uuid))
 
+
+  def inherit_permissions(self):
+    if self.parent_directory is not None:
+      parent_perms = Document2Permission.objects.filter(doc=self.parent_directory)
+      for perm in parent_perms:
+        self.share(self.owner, name=perm.perms, users=perm.users.all(), groups=perm.groups.all())
+
+
   def move(self, directory, user):
     if not directory.is_directory:
       raise FilesystemException(_('Target with UUID %s is not a directory') % directory.uuid)

+ 18 - 0
desktop/core/src/desktop/tests_doc2.py

@@ -718,6 +718,24 @@ class TestDocument2Permissions(object):
     assert_equal(doc2.uuid, data['document']['uuid'], data)
 
 
+  def test_inherit_parent_permissions(self):
+    # Tests that when saving a document to a shared directory, the doc/dir inherits same permissions
+
+    dir1 = Directory.objects.create(name='dir1', owner=self.user, parent_directory=self.home_dir)
+
+    dir1.share(user=self.user, name='read', users=[], groups=[self.default_group])
+    dir1.share(user=self.user, name='write', users=[self.user_not_me], groups=[])
+
+    doc1 = Document2.objects.create(name='doc1', owner=self.user, parent_directory=dir1)
+
+    response = self.client.get('/desktop/api2/doc/', {'uuid': doc1.uuid})
+    data = json.loads(response.content)
+    assert_equal([{'id': self.default_group.id, 'name': self.default_group.name}],
+                 data['document']['perms']['read']['groups'], data)
+    assert_equal([{'id': self.user_not_me.id, 'username': self.user_not_me.username}],
+                 data['document']['perms']['write']['users'], data)
+
+
   def test_search_documents(self):
     owned_dir = Directory.objects.create(name='test_dir', owner=self.user, parent_directory=self.home_dir)
     owned_query = Document2.objects.create(name='query1.sql', type='query-hive', owner=self.user, data={}, parent_directory=owned_dir)