Эх сурвалжийг харах

[doc2] Refactor filter and pagination, and check paths after a move directory operation

Jenny Kim 9 жил өмнө
parent
commit
e233167baa

+ 22 - 21
desktop/core/src/desktop/api2.py

@@ -85,21 +85,21 @@ def get_documents(request):
   response = {
   response = {
     'document': document.to_dict(),
     'document': document.to_dict(),
     'parent': document.parent_directory.to_dict() if document.parent_directory else None,
     'parent': document.parent_directory.to_dict() if document.parent_directory else None,
-    'children': [],
+    'children': []
   }
   }
 
 
   # Get children documents if this is a directory
   # Get children documents if this is a directory
   if document.is_directory:
   if document.is_directory:
     directory = Directory.objects.get(id=document.id)
     directory = Directory.objects.get(id=document.id)
     children = directory.get_children_documents()
     children = directory.get_children_documents()
-    # Refine results
-    response.update(_refine_documents(request, queryset=children, key="children"))
-
-  # Paginate
-  response.update(_paginate(request, queryset=response['children'], key="children"))
-
-  # Serialize Results
-  if response['children']:
+    # Filter and order results
+    response.update(_filter_documents(request, queryset=children))
+
+  # Paginate and serialize Results
+  if 'documents' in response:
+    response.update(_paginate(request, queryset=response['documents']))
+    # Rename documents to children
+    response['children'] = response.pop('documents')
     response['children'] = [doc.to_dict() for doc in response['children']]
     response['children'] = [doc.to_dict() for doc in response['children']]
 
 
   return JsonResponse(response)
   return JsonResponse(response)
@@ -127,7 +127,7 @@ def get_shared_documents(request):
   documents = Document2.objects.get_shared_documents(request.user, flatten=False)
   documents = Document2.objects.get_shared_documents(request.user, flatten=False)
 
 
   # Refine results
   # Refine results
-  response.update(_refine_documents(request, queryset=documents))
+  response.update(_filter_documents(request, queryset=documents))
 
 
   # Paginate
   # Paginate
   response.update(_paginate(request, queryset=response['documents']))
   response.update(_paginate(request, queryset=response['documents']))
@@ -354,7 +354,7 @@ def import_documents(request):
     return JsonResponse({'message': stdout.getvalue()})
     return JsonResponse({'message': stdout.getvalue()})
 
 
 
 
-def _refine_documents(request, queryset, key="documents"):
+def _filter_documents(request, queryset):
   """
   """
   Given optional querystring params extracted from the request, filter the given queryset of documents and return a
   Given optional querystring params extracted from the request, filter the given queryset of documents and return a
     dictionary with the refined queryset and filter params
     dictionary with the refined queryset and filter params
@@ -362,19 +362,20 @@ def _refine_documents(request, queryset, key="documents"):
   :param queryset: Document2 queryset
   :param queryset: Document2 queryset
   :param key: name for key of refined document set
   :param key: name for key of refined document set
   """
   """
-  documents = []
-  count = 0
   type_filters = request.GET.getlist('type', None)
   type_filters = request.GET.getlist('type', None)
   sort = request.GET.get('sort', '-last_modified')
   sort = request.GET.get('sort', '-last_modified')
   search_text = request.GET.get('text', None)
   search_text = request.GET.get('text', None)
 
 
-  if queryset:
-    documents = Document2.objects.refine_documents(documents=queryset, types=type_filters, search_text=search_text,
-                                                   order_by=sort)
-    count = documents.count()
+  documents = Document2.objects.refine_documents(
+    documents=queryset,
+    types=type_filters,
+    search_text=search_text,
+    order_by=sort)
+
+  count = documents.count()
 
 
   return {
   return {
-    key: documents,
+    'documents': documents,
     'count': count,
     'count': count,
     'types': type_filters,
     'types': type_filters,
     'text': search_text,
     'text': search_text,
@@ -382,7 +383,7 @@ def _refine_documents(request, queryset, key="documents"):
   }
   }
 
 
 
 
-def _paginate(request, queryset, key="documents"):
+def _paginate(request, queryset):
   """
   """
   Given optional querystring params extracted from the request, slice the given queryset of documents for the given page
   Given optional querystring params extracted from the request, slice the given queryset of documents for the given page
     and limit, and return the updated queryset along with pagination params used.
     and limit, and return the updated queryset along with pagination params used.
@@ -393,13 +394,13 @@ def _paginate(request, queryset, key="documents"):
   page = int(request.GET.get('page', 1))
   page = int(request.GET.get('page', 1))
   limit = int(request.GET.get('limit', 0))
   limit = int(request.GET.get('limit', 0))
 
 
-  if queryset and limit > 0:
+  if limit > 0:
     offset = (page - 1) * limit
     offset = (page - 1) * limit
     last = offset + limit
     last = offset + limit
     queryset = queryset.all()[offset:last]
     queryset = queryset.all()[offset:last]
 
 
   return {
   return {
-    key: queryset,
+    'documents': queryset,
     'page': page,
     'page': page,
     'limit': limit
     'limit': limit
   }
   }

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

@@ -110,22 +110,34 @@ class TestDocument2(object):
 
 
 
 
   def test_directory_move(self):
   def test_directory_move(self):
-    response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(self.home_dir.uuid), 'name': json.dumps('test_mv')})
+    source_dir = Directory.objects.create(name='test_mv', owner=self.user, parent_directory=self.home_dir)
+    target_dir = Directory.objects.create(name='test_mv_dst', owner=self.user, parent_directory=self.home_dir)
+    doc = Document2.objects.create(name='query1.sql', type='query-hive', owner=self.user, data={}, parent_directory=source_dir)
+
+    # Verify original paths before move operation
+    response = self.client.get('/desktop/api2/doc/get', {'uuid': source_dir.uuid})
     data = json.loads(response.content)
     data = json.loads(response.content)
-    assert_equal(0, data['status'], data)
+    assert_equal('/test_mv', data['path'])
 
 
-    response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(self.home_dir.uuid), 'name': json.dumps('test_mv_dst')})
+    response = self.client.get('/desktop/api2/doc/get', {'uuid': doc.uuid})
     data = json.loads(response.content)
     data = json.loads(response.content)
-    assert_equal(0, data['status'], data)
+    assert_equal('/test_mv/query1.sql', data['path'])
 
 
     response = self.client.post('/desktop/api2/doc/move', {
     response = self.client.post('/desktop/api2/doc/move', {
         'source_doc_uuid': json.dumps(Directory.objects.get(owner=self.user, name='test_mv').uuid),
         'source_doc_uuid': json.dumps(Directory.objects.get(owner=self.user, name='test_mv').uuid),
         'destination_doc_uuid': json.dumps(Directory.objects.get(owner=self.user, name='test_mv_dst').uuid)
         'destination_doc_uuid': json.dumps(Directory.objects.get(owner=self.user, name='test_mv_dst').uuid)
     })
     })
     data = json.loads(response.content)
     data = json.loads(response.content)
-
     assert_equal(0, data['status'], data)
     assert_equal(0, data['status'], data)
-    assert_equal(Directory.objects.get(name='test_mv', owner=self.user).path, '/test_mv_dst/test_mv')
+
+    # Verify that the paths are updated
+    response = self.client.get('/desktop/api2/doc/get', {'uuid': source_dir.uuid})
+    data = json.loads(response.content)
+    assert_equal('/test_mv_dst/test_mv', data['path'])
+
+    response = self.client.get('/desktop/api2/doc/get', {'uuid': doc.uuid})
+    data = json.loads(response.content)
+    assert_equal('/test_mv_dst/test_mv/query1.sql', data['path'])
 
 
 
 
   def test_directory_children(self):
   def test_directory_children(self):