Переглянути джерело

HUE-5218 [search] Validate dashboard sharing works

Jenny Kim 9 роки тому
батько
коміт
1ad4b85

+ 9 - 2
apps/search/src/search/decorators.py

@@ -21,6 +21,7 @@ import json
 from django.utils.functional import wraps
 from django.utils.translation import ugettext as _
 
+from desktop.conf import USE_NEW_EDITOR
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.models import Document2
 
@@ -36,7 +37,10 @@ def allow_viewer_only(view_func):
     if collection_json['id']:
       try:
         doc2 = Document2.objects.get(id=collection_json['id'])
-        doc2.doc.get().can_read_or_exception(request.user)
+        if USE_NEW_EDITOR.get():
+          doc2.can_read_or_exception(request.user)
+        else:
+          doc2.doc.get().can_read_or_exception(request.user)
       except Document2.DoesNotExist:
         message = _("Dashboard does not exist or you don't have the permission to access it.")
         raise PopupException(message)
@@ -53,7 +57,10 @@ def allow_owner_only(view_func):
     if collection_json['id']:
       try:
         doc2 = Document2.objects.get(id=collection_json['id'])
-        doc2.doc.get().can_write_or_exception(request.user)
+        if USE_NEW_EDITOR.get():
+          doc2.can_write_or_exception(request.user)
+        else:
+          doc2.doc.get().can_write_or_exception(request.user)
       except Document2.DoesNotExist:
         message = _("Dashboard does not exist or you don't have the permission to access it.")
         raise PopupException(message)

+ 64 - 1
apps/search/src/search/tests.py

@@ -26,6 +26,7 @@ from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal
 from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.test_utils import grant_access
 from desktop.lib.rest import resource
+from desktop.models import Document2
 
 from search.api import _round_number_range
 from search.models import Collection2
@@ -79,8 +80,17 @@ class TestSearchBase(object):
 
   def setUp(self):
     self.c = make_logged_in_client(username='test_search', is_superuser=False)
-    grant_access('test_search', 'test_search', 'search')
+    self.client_not_me = make_logged_in_client(username="not_perm_user", groupname="default", recreate=True, is_superuser=False)
+
     self.user = User.objects.get(username='test_search')
+    self.user_not_me = User.objects.get(username="not_perm_user")
+
+    grant_access('test_search', 'test_search', 'search')
+    grant_access(self.user.username, self.user.username, "desktop")
+    grant_access('not_perm_user', 'not_perm_user', 'search')
+    grant_access(self.user_not_me.username, self.user_not_me.username, "desktop")
+
+    self.home_dir = Document2.objects.get_home_directory(user=self.user)
 
     self.prev_resource = resource.Resource
     resource.Resource = MockResource
@@ -102,6 +112,59 @@ class TestWithMockedSolr(TestSearchBase):
     response = self.c.get(reverse('search:index'))
     assert_true('search' in response.content, response.content)
 
+  def test_share_dashboard(self):
+      doc = Document2.objects.create(name='test_dashboard', type='search-dashboard', owner=self.user,
+                                     data=self.collection.data, parent_directory=self.home_dir)
+
+      # owner can view document
+      response = self.c.get('/desktop/api2/doc/', {'uuid': doc.uuid})
+      data = json.loads(response.content)
+      assert_equal(doc.uuid, data['document']['uuid'], data)
+
+      # other user cannot view document
+      response = self.client_not_me.get('/desktop/api2/doc/', {'uuid': doc.uuid})
+      data = json.loads(response.content)
+      assert_equal(-1, data['status'])
+
+      # Share read perm by users
+      response = self.c.post("/desktop/api2/doc/share", {
+          'uuid': json.dumps(doc.uuid),
+          'data': json.dumps({
+              'read': {
+                  'user_ids': [
+                      self.user.id,
+                      self.user_not_me.id
+                  ],
+                  'group_ids': [],
+              },
+              'write': {
+                  'user_ids': [],
+                  'group_ids': [],
+              }
+          })
+      })
+
+      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))
+
+      # other user can view document
+      response = self.client_not_me.get('/desktop/api2/doc/', {'uuid': doc.uuid})
+      data = json.loads(response.content)
+      assert_equal(doc.uuid, data['document']['uuid'], data)
+
+      # other user can open dashboard
+      response = self.c.post(reverse('search:search'), {
+          'collection': json.dumps(self._get_collection_param(self.collection)),
+          'query': json.dumps(QUERY)
+      })
+
+      data = json.loads(response.content)
+      assert_true('response' in data, data)
+      assert_true('docs' in data['response'], data)
+
   def test_update_document(self):
     # Regular user
     response = self.c.post(reverse('search:update_document'), {

+ 5 - 1
apps/search/src/search/views.py

@@ -22,6 +22,7 @@ from django.utils.encoding import force_unicode
 from django.utils.html import escape
 from django.utils.translation import ugettext as _
 
+from desktop.conf import USE_NEW_EDITOR
 from desktop.lib.django_util import JsonResponse, render
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.rest.http_client import RestException
@@ -54,7 +55,10 @@ def index(request, is_mobile=False):
 
   try:
     collection_doc = Document2.objects.get(id=collection_id)
-    collection_doc.doc.get().can_read_or_exception(request.user)
+    if USE_NEW_EDITOR.get():
+      collection_doc.can_read_or_exception(request.user)
+    else:
+      collection_doc.doc.get().can_read_or_exception(request.user)
     collection = Collection2(request.user, document=collection_doc)
   except Exception, e:
     raise PopupException(e, title=_("Dashboard does not exist or you don't have the permission to access it."))