Bladeren bron

HUE-2318 [desktop] Documents shared with write group permissions are not editable

Romain Rigaux 11 jaren geleden
bovenliggende
commit
cdbfe8c

+ 0 - 1
apps/oozie/src/oozie/models.py

@@ -223,7 +223,6 @@ class Job(models.Model):
       raise e
 
   def is_editable(self, user):
-    """Only owners or admins can modify a job."""
     return user.is_superuser or self.owner == user or self.doc.get().can_write(user)
 
   @property

+ 45 - 0
desktop/core/src/desktop/api_tests.py

@@ -197,6 +197,11 @@ class TestDocModelPermissions():
     response = self.client_not_me.get('/home')
     assert_false(doc_id in json.loads(response.context['json_documents']))
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_false(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
     # Share by user
     response = self.client.post("/desktop/api/doc/update_permissions", {
       'doc_id': doc.id,
@@ -217,6 +222,11 @@ class TestDocModelPermissions():
 
     assert_equal(0, json.loads(response.content)['status'], response.content)
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_true(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
     response = self.client.get('/home')
     assert_true(doc_id in json.loads(response.context['json_documents']))
     response = self.client_not_me.get('/home')
@@ -241,6 +251,11 @@ class TestDocModelPermissions():
 
     assert_equal(0, json.loads(response.content)['status'], response.content)
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_false(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
     response = self.client.get('/home')
     assert_true(doc_id in json.loads(response.context['json_documents']))
     response = self.client_not_me.get('/home')
@@ -269,6 +284,11 @@ class TestDocModelPermissions():
 
     assert_equal(0, json.loads(response.content)['status'], response.content)
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_true(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
     response = self.client.get('/home')
     assert_true(doc_id in json.loads(response.context['json_documents']))
     response = self.client_not_me.get('/home')
@@ -293,6 +313,11 @@ class TestDocModelPermissions():
 
     assert_equal(0, json.loads(response.content)['status'], response.content)
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_false(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
     response = self.client.get('/home')
     assert_true(doc_id in json.loads(response.context['json_documents']))
     response = self.client_not_me.get('/home')
@@ -319,6 +344,11 @@ class TestDocModelPermissions():
 
     assert_equal(0, json.loads(response.content)['status'], response.content)
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_true(doc.can_read(self.user_not_me))
+    assert_true(doc.can_write(self.user_not_me))
+
     response = self.client.get('/home')
     assert_true(doc_id in json.loads(response.context['json_documents']))
     response = self.client_not_me.get('/home')
@@ -343,6 +373,11 @@ class TestDocModelPermissions():
 
     assert_equal(0, json.loads(response.content)['status'], response.content)
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_false(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
     response = self.client.get('/home')
     assert_true(doc_id in json.loads(response.context['json_documents']))
     response = self.client_not_me.get('/home')
@@ -369,6 +404,11 @@ class TestDocModelPermissions():
 
     assert_equal(0, json.loads(response.content)['status'], response.content)
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_true(doc.can_read(self.user_not_me))
+    assert_true(doc.can_write(self.user_not_me))
+
     response = self.client.get('/home')
     assert_true(doc_id in json.loads(response.context['json_documents']))
     response = self.client_not_me.get('/home')
@@ -393,6 +433,11 @@ class TestDocModelPermissions():
 
     assert_equal(0, json.loads(response.content)['status'], response.content)
 
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_false(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
     response = self.client.get('/home')
     assert_true(doc_id in json.loads(response.context['json_documents']))
     response = self.client_not_me.get('/home')

+ 2 - 1
desktop/core/src/desktop/models.py

@@ -397,7 +397,8 @@ class Document(models.Model):
     return user.is_superuser or self.owner == user or Document.objects.get_docs(user).filter(id=self.id).exists()
 
   def can_write(self, user):
-    return user.is_superuser or self.owner == user or user in self.list_permissions('write').users.all()
+    perm = self.list_permissions('write')
+    return user.is_superuser or self.owner == user or perm.groups.filter(id__in=user.groups.all()).exists() or user in perm.users.all()
 
   def can_read_or_exception(self, user, exception_class=PopupException):
     if self.can_read(user):

+ 2 - 2
desktop/core/src/desktop/templates/home.mako

@@ -67,7 +67,7 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
     margin-bottom: 6px;
   }
 
-  .trash-share {
+  .trash-share, .share-link {
     cursor: pointer;
   }
 
@@ -264,7 +264,7 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
       </a>
     </td>
     <td style="width: 40px; text-align: center">
-      <a rel="tooltip" data-placement="left" style="padding-left:10px; padding-right: 10px" data-bind="click: shareDoc, attr: {'data-original-title': '${ _("Share") } '+name}, visible: isMine , css:{'baseShared': true, 'isShared': perms.read.users.length + perms.read.groups.length > 0}">
+      <a class="share-link" rel="tooltip" data-placement="left" style="padding-left:10px; padding-right: 10px" data-bind="click: shareDoc, attr: {'data-original-title': '${ _("Share") } '+name}, visible: isMine , css: {'baseShared': true, 'isShared': perms.read.users.length + perms.read.groups.length > 0}">
         <i class="fa fa-users"></i>
       </a>
       <i class="fa fa-ban" style="padding-left:8px; padding-right: 8px" data-bind="visible: !isMine"></i>