瀏覽代碼

[desktop] Fixed issue where a user could not copy documents owned by different user.

Jenny Kim 10 年之前
父節點
當前提交
dfa9386

+ 2 - 1
apps/beeswax/src/beeswax/views.py

@@ -188,7 +188,8 @@ def clone_design(request, design_id):
   copy = design.clone(request.user)
   copy.save()
 
-  design.doc.get().copy(content_object=copy)
+  name = copy.name + '-copy'
+  design.doc.get().copy(content_object=copy, name=name, owner=request.user)
 
   messages.info(request, _('Copied design: %(name)s') % {'name': design.name})
 

+ 3 - 3
apps/oozie/src/oozie/views/editor2.py

@@ -155,7 +155,7 @@ def copy_workflow(request):
     name = doc2.name + '-copy'
     doc2 = doc2.copy(name=name, owner=request.user)
 
-    doc.copy(content_object=doc2, name=name)
+    doc.copy(content_object=doc2, name=name, owner=request.user)
 
     workflow = Workflow(document=doc2)
     workflow.update_name(name)
@@ -457,7 +457,7 @@ def copy_coordinator(request):
     name = doc2.name + '-copy'
     doc2 = doc2.copy(name=name, owner=request.user)
 
-    doc.copy(content_object=doc2, name=name)
+    doc.copy(content_object=doc2, name=name, owner=request.user)
 
     coordinator_data = Coordinator(document=doc2).get_data_for_json()
     coordinator_data['name'] = name
@@ -670,7 +670,7 @@ def copy_bundle(request):
     name = doc2.name + '-copy'
     doc2 = doc2.copy(name=name, owner=request.user)
 
-    doc.copy(content_object=doc2, name=name)
+    doc.copy(content_object=doc2, name=name, owner=request.user)
 
     bundle_data = Bundle(document=doc2).get_data_for_json()
     bundle_data['name'] = name

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

@@ -149,7 +149,11 @@ def copy(request):
 
   pig_script = PigScript.objects.get(id=request.POST.get('id'))
   doc = pig_script.doc.get()
-  doc.can_edit_or_exception(request.user)
+
+  try:
+    doc.can_read_or_exception(request.user)
+  except Exception, e:
+    raise PopupException(e)
 
   existing_script_data = pig_script.dict
 

+ 1 - 1
apps/spark/src/spark/views.py

@@ -139,7 +139,7 @@ def copy(request):
     name = doc2.name + '-copy'
     doc2 = doc2.copy(name=name, owner=request.user)
 
-    doc.copy(content_object=doc2, name=name)
+    doc.copy(content_object=doc2, name=name, owner=request.user)
 
   return JsonResponse({})
 

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

@@ -521,16 +521,16 @@ class Document(models.Model):
     else:
       raise exception_class(_("Document does not exist or you don't have the permission to access it."))
 
-  def copy(self, content_object, **kwargs):
+  def copy(self, content_object, name, owner, description=None):
     if content_object:
       copy_doc = self
 
-      for k, v in kwargs.iteritems():
-        if hasattr(copy_doc, k):
-          setattr(copy_doc, k, v)
-
       copy_doc.pk = None
       copy_doc.id = None
+      copy_doc.name = name
+      copy_doc.owner = owner
+      if description:
+        copy_doc.description = description
 
       copy_doc = Document.objects.link(content_object,
                                        owner=copy_doc.owner,
@@ -756,16 +756,16 @@ class Document2(models.Model):
 
     return data_python
 
-  def copy(self, **kwargs):
+  def copy(self, name, owner, description=None):
     copy_doc = self
 
-    for k, v in kwargs.iteritems():
-      if hasattr(copy_doc, k):
-        setattr(copy_doc, k, v)
-
     copy_doc.pk = None
     copy_doc.id = None
-    copy_doc.uuid = str(uuid.uuid4())
+    copy_doc.uuid = uuid_default()
+    copy_doc.name = name
+    copy_doc.owner = owner
+    if description:
+      copy_doc.description = description
     copy_doc.save()
 
     return copy_doc

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

@@ -859,8 +859,11 @@ class TestSMTPPasswordConfig(BaseTestPasswordConfig):
 class TestDocument(object):
 
   def setUp(self):
-    make_logged_in_client(username="test_doc", groupname="test_doc", recreate=True, is_superuser=False)
-    user = User.objects.get(username="test_doc")
+    make_logged_in_client(username="original_owner", groupname="test_doc", recreate=True, is_superuser=False)
+    self.user = User.objects.get(username="original_owner")
+
+    make_logged_in_client(username="copy_owner", groupname="test_doc", recreate=True, is_superuser=False)
+    self.copy_user = User.objects.get(username="copy_owner")
 
     # Get count of existing Document objects
     self.doc2_count = Document2.objects.count()
@@ -868,10 +871,10 @@ class TestDocument(object):
 
     self.document2 = Document2.objects.create(name='Test Document2',
                                               type='search-dashboard',
-                                              owner=user,
+                                              owner=self.user,
                                               description='Test Document2')
     self.document = Document.objects.link(content_object=self.document2,
-                                          owner=user,
+                                          owner=self.user,
                                           name='Test Document',
                                           description='Test Document',
                                           extra='test')
@@ -891,7 +894,7 @@ class TestDocument(object):
 
   def test_document_copy(self):
     name = 'Test Document2 Copy'
-    doc2 = self.document2.copy(name=name)
+    doc2 = self.document2.copy(name=name, owner=self.copy_user, description=self.document2.description)
 
     # Test that copying a Document2 object creates another object
     assert_equal(Document2.objects.count(), self.doc2_count + 2)
@@ -900,11 +903,14 @@ class TestDocument(object):
     # Test that the content object is not pointing to the same object
     assert_not_equal(self.document2.doc, doc2.doc)
 
+    # Test that the owner is attributed to the new user
+    assert_equal(doc2.owner, self.copy_user)
+
     # Test that copying enables attribute overrides
     assert_equal(Document2.objects.filter(name=name).count(), 1)
     assert_equal(doc2.description, self.document2.description)
 
-    doc = self.document.copy(doc2, name=name)
+    doc = self.document.copy(doc2, name=name, owner=self.copy_user, description=self.document2.description)
 
     # Test that copying a Document object creates another Document2 and Document object
     assert_equal(Document2.objects.count(), self.doc2_count + 2)
@@ -913,6 +919,9 @@ class TestDocument(object):
     # Test that the content object is not pointing to the same object
     assert_not_equal(self.document.content_object, doc.content_object)
 
+    # Test that the owner is attributed to the new user
+    assert_equal(doc.owner, self.copy_user)
+
     # Test that copying enables attribute overrides
     assert_equal(Document.objects.filter(name=name).count(), 1)
     assert_equal(doc.description, self.document.description)