mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-06 17:33:18 +00:00
@@ -1312,7 +1312,34 @@ class UpdateBlksLinkView(APIView):
|
|||||||
url = gen_file_upload_url(token, 'update-blks-api')
|
url = gen_file_upload_url(token, 'update-blks-api')
|
||||||
return Response(url)
|
return Response(url)
|
||||||
|
|
||||||
def get_dir_entrys_by_id(request, repo, path, dir_id):
|
def get_dir_recursively(username, repo_id, path, all_dirs):
|
||||||
|
path_id = seafile_api.get_dir_id_by_path(repo_id, path)
|
||||||
|
dirs = seafserv_threaded_rpc.list_dir_with_perm(repo_id, path,
|
||||||
|
path_id, username, -1, -1)
|
||||||
|
|
||||||
|
for dirent in dirs:
|
||||||
|
if stat.S_ISDIR(dirent.mode):
|
||||||
|
entry = {}
|
||||||
|
entry["type"] = 'dir'
|
||||||
|
entry["parent_dir"] = path
|
||||||
|
entry["id"] = dirent.obj_id
|
||||||
|
entry["name"] = dirent.obj_name
|
||||||
|
entry["mtime"] = dirent.mtime
|
||||||
|
entry["permission"] = dirent.permission
|
||||||
|
all_dirs.append(entry)
|
||||||
|
|
||||||
|
sub_path = posixpath.join(path, dirent.obj_name)
|
||||||
|
get_dir_recursively(username, repo_id, sub_path, all_dirs)
|
||||||
|
|
||||||
|
return all_dirs
|
||||||
|
|
||||||
|
def get_dir_entrys_by_id(request, repo, path, dir_id, request_type=None):
|
||||||
|
""" Get dirents in a dir
|
||||||
|
|
||||||
|
if request_type is 'f', only return file list,
|
||||||
|
if request_type is 'd', only return dir list,
|
||||||
|
else, return both.
|
||||||
|
"""
|
||||||
username = request.user.username
|
username = request.user.username
|
||||||
try:
|
try:
|
||||||
dirs = seafserv_threaded_rpc.list_dir_with_perm(repo.id, path, dir_id,
|
dirs = seafserv_threaded_rpc.list_dir_with_perm(repo.id, path, dir_id,
|
||||||
@@ -1357,7 +1384,13 @@ def get_dir_entrys_by_id(request, repo, path, dir_id):
|
|||||||
|
|
||||||
dir_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower()))
|
dir_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower()))
|
||||||
file_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower()))
|
file_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower()))
|
||||||
dentrys = dir_list + file_list
|
|
||||||
|
if request_type == 'f':
|
||||||
|
dentrys = file_list
|
||||||
|
elif request_type == 'd':
|
||||||
|
dentrys = dir_list
|
||||||
|
else:
|
||||||
|
dentrys = dir_list + file_list
|
||||||
|
|
||||||
response = HttpResponse(json.dumps(dentrys), status=200,
|
response = HttpResponse(json.dumps(dentrys), status=200,
|
||||||
content_type=json_content_type)
|
content_type=json_content_type)
|
||||||
@@ -2240,7 +2273,28 @@ class DirView(APIView):
|
|||||||
response["oid"] = dir_id
|
response["oid"] = dir_id
|
||||||
return response
|
return response
|
||||||
else:
|
else:
|
||||||
return get_dir_entrys_by_id(request, repo, path, dir_id)
|
request_type = request.GET.get('t', None)
|
||||||
|
if request_type and request_type not in ('f', 'd'):
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST,
|
||||||
|
"'t'(type) should be 'f' or 'd'.")
|
||||||
|
|
||||||
|
if request_type == 'd':
|
||||||
|
recursive = request.GET.get('recursive', '0')
|
||||||
|
if recursive not in ('1', '0'):
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST,
|
||||||
|
"If you want to get recursive dir entries, you should set 'recursive' argument as '1'.")
|
||||||
|
|
||||||
|
if recursive == '1':
|
||||||
|
username = request.user.username
|
||||||
|
dir_list = get_dir_recursively(username, repo_id, path, [])
|
||||||
|
dir_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower()))
|
||||||
|
response = HttpResponse(json.dumps(dir_list), status=200,
|
||||||
|
content_type=json_content_type)
|
||||||
|
response["oid"] = dir_id
|
||||||
|
response["dir_perm"] = seafile_api.check_permission_by_path(repo_id, path, username)
|
||||||
|
return response
|
||||||
|
|
||||||
|
return get_dir_entrys_by_id(request, repo, path, dir_id, request_type)
|
||||||
|
|
||||||
def post(self, request, repo_id, format=None):
|
def post(self, request, repo_id, format=None):
|
||||||
# new dir
|
# new dir
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
Test file/dir operations.
|
Test file/dir operations.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import posixpath
|
||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
import pytest
|
import pytest
|
||||||
@@ -212,7 +213,30 @@ class FilesApiTest(ApiTestBase):
|
|||||||
res = self.get(update_blks_url)
|
res = self.get(update_blks_url)
|
||||||
self.assertRegexpMatches(res.text, r'"http(.*)/update-blks-api/[^/]+"')
|
self.assertRegexpMatches(res.text, r'"http(.*)/update-blks-api/[^/]+"')
|
||||||
|
|
||||||
def test_list_dir(self):
|
def test_only_list_dir(self):
|
||||||
|
with self.get_tmp_repo() as repo:
|
||||||
|
self.create_file(repo)
|
||||||
|
self.create_dir(repo)
|
||||||
|
dirents = self.get(repo.dir_url + '?t=d').json()
|
||||||
|
self.assertHasLen(dirents, 1)
|
||||||
|
for dirent in dirents:
|
||||||
|
self.assertIsNotNone(dirent['id'])
|
||||||
|
self.assertIsNotNone(dirent['name'])
|
||||||
|
self.assertEqual(dirent['type'], 'dir')
|
||||||
|
|
||||||
|
def test_only_list_file(self):
|
||||||
|
with self.get_tmp_repo() as repo:
|
||||||
|
self.create_file(repo)
|
||||||
|
self.create_dir(repo)
|
||||||
|
dirents = self.get(repo.dir_url + '?t=f').json()
|
||||||
|
self.assertHasLen(dirents, 1)
|
||||||
|
for dirent in dirents:
|
||||||
|
self.assertIsNotNone(dirent['id'])
|
||||||
|
self.assertIsNotNone(dirent['name'])
|
||||||
|
self.assertIsNotNone(dirent['size'])
|
||||||
|
self.assertEqual(dirent['type'], 'file')
|
||||||
|
|
||||||
|
def test_list_dir_and_file(self):
|
||||||
with self.get_tmp_repo() as repo:
|
with self.get_tmp_repo() as repo:
|
||||||
self.create_file(repo)
|
self.create_file(repo)
|
||||||
self.create_dir(repo)
|
self.create_dir(repo)
|
||||||
@@ -225,6 +249,25 @@ class FilesApiTest(ApiTestBase):
|
|||||||
if dirent['type'] == 'file':
|
if dirent['type'] == 'file':
|
||||||
self.assertIsNotNone(dirent['size'])
|
self.assertIsNotNone(dirent['size'])
|
||||||
|
|
||||||
|
def test_list_recursive_dir(self):
|
||||||
|
with self.get_tmp_repo() as repo:
|
||||||
|
|
||||||
|
# create test dir
|
||||||
|
data = {'operation': 'mkdir'}
|
||||||
|
dir_list = ['/1/', '/1/2/', '/1/2/3/', '/4/', '/4/5/', '/6/']
|
||||||
|
for dpath in dir_list:
|
||||||
|
durl = repo.get_dirpath_url(dpath)
|
||||||
|
self.post(durl, data=data, expected=201)
|
||||||
|
|
||||||
|
# get recursive dir
|
||||||
|
dirents = self.get(repo.dir_url + '?t=d&recursive=1').json()
|
||||||
|
self.assertHasLen(dirents, len(dir_list))
|
||||||
|
for dirent in dirents:
|
||||||
|
self.assertIsNotNone(dirent['id'])
|
||||||
|
self.assertEqual(dirent['type'], 'dir')
|
||||||
|
full_path = posixpath.join(dirent['parent_dir'], dirent['name']) + '/'
|
||||||
|
self.assertIn(full_path, dir_list)
|
||||||
|
|
||||||
def test_remove_dir(self):
|
def test_remove_dir(self):
|
||||||
with self.get_tmp_repo() as repo:
|
with self.get_tmp_repo() as repo:
|
||||||
_, durl = self.create_dir(repo)
|
_, durl = self.create_dir(repo)
|
||||||
|
Reference in New Issue
Block a user