Procházet zdrojové kódy

[doc2] Auto-rename documents and directories with same name at same path

Jenny Kim před 9 roky
rodič
revize
6b6741e371

+ 23 - 12
desktop/core/src/desktop/models.py

@@ -22,6 +22,7 @@ import os
 import re
 import re
 import uuid
 import uuid
 
 
+from datetime import datetime
 from itertools import chain
 from itertools import chain
 
 
 from django.contrib.auth import models as auth_models
 from django.contrib.auth import models as auth_models
@@ -1029,18 +1030,28 @@ class Document2(models.Model):
     if invalid_chars.search(self.name):
     if invalid_chars.search(self.name):
       raise FilesystemException(_('Document %s contains an invalid character.') % self.name)
       raise FilesystemException(_('Document %s contains an invalid character.') % self.name)
 
 
-    # Validate that directories cannot have same name and parent
-    if self.is_directory:
-      try:
-        dir = Directory.objects.get(name=self.name, owner=self.owner, parent_directory=self.parent_directory)
-        if dir.pk != self.pk:
-          raise FilesystemException(_('Directory for owner %s at path %s already exists') % (self.owner, self.path))
-      except Directory.DoesNotExist:
-        pass  # no conflicts
-      except Directory.MultipleObjectsReturned:
-        dir_ids = [doc.id for doc in Directory.objects.filter(name=self.name, owner=self.owner, parent_directory=self.parent_directory)]
-        raise FilesystemException(_('Found multiple documents for owner %s at path %s with IDs: [%s]') %
-                                    (self.owner, self.path, ', '.join(dir_ids)))
+    # If different document with same name and same path (parent) exists, rename current document with datetime
+    try:
+      doc = Document2.objects.get(
+        owner=self.owner,
+        name=self.name,
+        type=self.type,
+        parent_directory=self.parent_directory
+      )
+      if doc.pk != self.pk:
+        timestamp = str(datetime.now()).split('.', 1)[0]
+        self.name = '%s %s' % (self.name, timestamp)
+    except Document2.DoesNotExist:
+      pass  # no conflicts
+    except Document2.MultipleObjectsReturned:
+      doc_ids = Document2.objects.filter(
+        owner=self.owner,
+        name=self.name,
+        type=self.type,
+        parent_directory=self.parent_directory
+      ).values_list('id', flat=True)
+      raise FilesystemException(_('Found multiple documents with type %s at path %s with IDs: [%s]') %
+                                    (self.type, self.path, ', '.join(map(str, doc_ids))))
 
 
     # Validate home and Trash directories are only created once per user and cannot be created or modified after
     # Validate home and Trash directories are only created once per user and cannot be created or modified after
     if self.name in ['', Document2.TRASH_DIR] and \
     if self.name in ['', Document2.TRASH_DIR] and \

+ 8 - 4
desktop/core/src/desktop/tests_doc2.py

@@ -17,6 +17,7 @@
 # limitations under the License.
 # limitations under the License.
 
 
 import json
 import json
+import re
 
 
 from nose.tools import assert_equal, assert_false, assert_true
 from nose.tools import assert_equal, assert_false, assert_true
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
@@ -224,18 +225,21 @@ class TestDocument2(object):
     assert_true('invalid character' in data['message'])
     assert_true('invalid character' in data['message'])
 
 
 
 
-  def test_validate_same_directory(self):
-    # Test error on creating directories with same name and location
+  def test_validate_same_name_and_path(self):
+    # Test that creating a document with the same name at the same path will auto-rename the document
     test_dir = Directory.objects.create(name='test_dir', owner=self.user, parent_directory=self.home_dir)
     test_dir = Directory.objects.create(name='test_dir', owner=self.user, parent_directory=self.home_dir)
     response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(self.home_dir.uuid), 'name': json.dumps('test_dir')})
     response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(self.home_dir.uuid), 'name': json.dumps('test_dir')})
     data = json.loads(response.content)
     data = json.loads(response.content)
-    assert_equal(-1, data['status'], data)
-    assert_true('/test_dir already exists' in data['message'])
+    assert_equal(0, data['status'], data)
+
+    pattern = re.compile("test_dir \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}")
+    assert_true(pattern.match(data['directory']['name']), data)
 
 
     # But can create same name in different location
     # But can create same name in different location
     response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(test_dir.uuid), 'name': json.dumps('test_dir')})
     response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(test_dir.uuid), 'name': json.dumps('test_dir')})
     data = json.loads(response.content)
     data = json.loads(response.content)
     assert_equal(0, data['status'], data)
     assert_equal(0, data['status'], data)
+    assert_equal('test_dir', data['directory']['name'])
 
 
 
 
   def test_validate_immutable_user_directories(self):
   def test_validate_immutable_user_directories(self):