mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-22 03:47:09 +00:00
update cp/mv file/dir
This commit is contained in:
@@ -527,278 +527,6 @@ def delete_dirents(request, repo_id):
|
||||
return HttpResponse(json.dumps({'deleted': deleted, 'undeleted': undeleted}),
|
||||
content_type=content_type)
|
||||
|
||||
def copy_move_common():
|
||||
"""Decorator for common logic in copying/moving dir/file.
|
||||
"""
|
||||
def _method_wrapper(view_method):
|
||||
def _arguments_wrapper(request, repo_id, *args, **kwargs):
|
||||
if request.method != 'POST':
|
||||
raise Http404
|
||||
|
||||
result = {}
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
|
||||
# arguments check for src
|
||||
path = request.GET.get('path')
|
||||
obj_name = request.GET.get('obj_name')
|
||||
if not (path and obj_name):
|
||||
result['error'] = _('Argument missing')
|
||||
return HttpResponse(json.dumps(result), status=400,
|
||||
content_type=content_type)
|
||||
|
||||
# resource check for src
|
||||
repo = get_repo(repo_id)
|
||||
if not repo:
|
||||
result['error'] = _(u'Library does not exist.')
|
||||
return HttpResponse(json.dumps(result), status=404,
|
||||
content_type=content_type)
|
||||
|
||||
full_obj_path = posixpath.join(path, obj_name)
|
||||
file_obj_id = seafile_api.get_file_id_by_path(repo_id, full_obj_path)
|
||||
dir_obj_id = seafile_api.get_dir_id_by_path(repo_id, full_obj_path)
|
||||
|
||||
if not file_obj_id and not dir_obj_id:
|
||||
result['error'] = _(u'"%s" does not exist.') % full_obj_path
|
||||
return HttpResponse(json.dumps(result), status=404,
|
||||
content_type=content_type)
|
||||
|
||||
# arguments chech for dst
|
||||
dst_repo_id = request.POST.get('dst_repo')
|
||||
dst_path = request.POST.get('dst_path')
|
||||
if not (dst_repo_id and dst_path):
|
||||
result['error'] = _('Argument missing')
|
||||
return HttpResponse(json.dumps(result), status=400,
|
||||
content_type=content_type)
|
||||
|
||||
# resource check for dst
|
||||
dst_repo = seafile_api.get_repo(dst_repo_id)
|
||||
if not dst_repo:
|
||||
result['error'] = _(u'Library does not exist.')
|
||||
return HttpResponse(json.dumps(result), status=404,
|
||||
content_type=content_type)
|
||||
|
||||
# resource check for dst
|
||||
# check file path
|
||||
if len(dst_path + obj_name) > settings.MAX_PATH:
|
||||
result['error'] = _('Destination path is too long.')
|
||||
return HttpResponse(json.dumps(result), status=400,
|
||||
content_type=content_type)
|
||||
|
||||
# resource check for dst
|
||||
# return error when dst is the same as src
|
||||
if repo_id == dst_repo_id and path == dst_path:
|
||||
result['error'] = _('Invalid destination path')
|
||||
return HttpResponse(json.dumps(result), status=400,
|
||||
content_type=content_type)
|
||||
|
||||
# permission check for dst
|
||||
# check whether user has write permission to dest repo
|
||||
# Leave src folder/file permission checking to corresponding views.
|
||||
# For 'move', check has read-write perm to src folder;
|
||||
# For 'cp', check has read perm to src folder.
|
||||
if check_folder_permission(request, dst_repo_id, dst_path) != 'rw':
|
||||
result['error'] = _('Permission denied')
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
# check quota for dst
|
||||
if file_obj_id:
|
||||
obj_size = seafile_api.get_file_size(repo.store_id,
|
||||
repo.version, file_obj_id)
|
||||
|
||||
if dir_obj_id:
|
||||
obj_size = seafile_api.get_dir_size(repo.store_id,
|
||||
repo.version, dir_obj_id)
|
||||
|
||||
# check quota
|
||||
out_of_quota = False
|
||||
try:
|
||||
if seafile_api.is_repo_owner(request.user.username, dst_repo_id):
|
||||
# if dst repo is my own repo, only check quota when copy.
|
||||
if view_method.__name__ in ('cp_file', 'cp_dir'):
|
||||
out_of_quota = seafile_api.check_quota(dst_repo_id, delta=obj_size)
|
||||
else:
|
||||
# if dst repo is NOT my own repo,
|
||||
# check quota when copy AND move.
|
||||
out_of_quota = seafile_api.check_quota(dst_repo_id, delta=obj_size)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
result['error'] = _(u'Internal server error')
|
||||
return HttpResponse(json.dumps(result), status=500,
|
||||
content_type=content_type)
|
||||
|
||||
if out_of_quota:
|
||||
result['error'] = _('Out of quota.')
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
return view_method(request, repo_id, path,
|
||||
dst_repo_id, dst_path, obj_name)
|
||||
|
||||
return _arguments_wrapper
|
||||
|
||||
return _method_wrapper
|
||||
|
||||
@login_required_ajax
|
||||
@copy_move_common()
|
||||
def mv_file(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_name):
|
||||
result = {}
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
username = request.user.username
|
||||
|
||||
# check parent dir perm
|
||||
if check_folder_permission(request, src_repo_id, src_path) != 'rw':
|
||||
result['error'] = _('Permission denied')
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name)
|
||||
try:
|
||||
res = seafile_api.move_file(src_repo_id, src_path, obj_name,
|
||||
dst_repo_id, dst_path, new_obj_name,
|
||||
replace=False, username=username, need_progress=1)
|
||||
except SearpcError as e:
|
||||
logger.error(e)
|
||||
res = None
|
||||
|
||||
# res can be None or an object
|
||||
if not res:
|
||||
result['error'] = _(u'Internal server error')
|
||||
return HttpResponse(json.dumps(result), status=500,
|
||||
content_type=content_type)
|
||||
|
||||
result['success'] = True
|
||||
msg = _(u'Successfully moved %(name)s') % {"name": escape(obj_name)}
|
||||
result['msg'] = msg
|
||||
if res.background:
|
||||
result['task_id'] = res.task_id
|
||||
|
||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||
|
||||
@login_required_ajax
|
||||
@copy_move_common()
|
||||
def cp_file(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_name):
|
||||
result = {}
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
username = request.user.username
|
||||
|
||||
# check parent dir perm
|
||||
if not check_folder_permission(request, src_repo_id, src_path):
|
||||
result['error'] = _('Permission denied')
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name)
|
||||
try:
|
||||
res = seafile_api.copy_file(src_repo_id, src_path, obj_name,
|
||||
dst_repo_id, dst_path, new_obj_name,
|
||||
username, need_progress=1)
|
||||
except SearpcError as e:
|
||||
logger.error(e)
|
||||
res = None
|
||||
|
||||
if not res:
|
||||
result['error'] = _(u'Internal server error')
|
||||
return HttpResponse(json.dumps(result), status=500,
|
||||
content_type=content_type)
|
||||
|
||||
result['success'] = True
|
||||
msg = _(u'Successfully copied %(name)s') % {"name": escape(obj_name)}
|
||||
result['msg'] = msg
|
||||
|
||||
if res.background:
|
||||
result['task_id'] = res.task_id
|
||||
|
||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||
|
||||
@login_required_ajax
|
||||
@copy_move_common()
|
||||
def mv_dir(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_name):
|
||||
result = {}
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
username = request.user.username
|
||||
|
||||
src_dir = posixpath.join(src_path, obj_name)
|
||||
if dst_path.startswith(src_dir + '/'):
|
||||
error_msg = _(u'Can not move directory %(src)s to its subdirectory %(des)s') \
|
||||
% {'src': escape(src_dir), 'des': escape(dst_path)}
|
||||
result['error'] = error_msg
|
||||
return HttpResponse(json.dumps(result), status=400, content_type=content_type)
|
||||
|
||||
# check dir perm
|
||||
if check_folder_permission(request, src_repo_id, src_dir) != 'rw':
|
||||
result['error'] = _('Permission denied')
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name)
|
||||
try:
|
||||
res = seafile_api.move_file(src_repo_id, src_path, obj_name,
|
||||
dst_repo_id, dst_path, new_obj_name,
|
||||
replace=False, username=username, need_progress=1)
|
||||
except SearpcError as e:
|
||||
logger.error(e)
|
||||
res = None
|
||||
|
||||
# res can be None or an object
|
||||
if not res:
|
||||
result['error'] = _(u'Internal server error')
|
||||
return HttpResponse(json.dumps(result), status=500,
|
||||
content_type=content_type)
|
||||
|
||||
result['success'] = True
|
||||
msg = _(u'Successfully moved %(name)s') % {"name": escape(obj_name)}
|
||||
result['msg'] = msg
|
||||
if res.background:
|
||||
result['task_id'] = res.task_id
|
||||
|
||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||
|
||||
@login_required_ajax
|
||||
@copy_move_common()
|
||||
def cp_dir(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_name):
|
||||
result = {}
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
username = request.user.username
|
||||
|
||||
# check src dir perm
|
||||
if not check_folder_permission(request, src_repo_id, src_path):
|
||||
result['error'] = _('Permission denied')
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
src_dir = posixpath.join(src_path, obj_name)
|
||||
if dst_path.startswith(src_dir):
|
||||
error_msg = _(u'Can not copy directory %(src)s to its subdirectory %(des)s') \
|
||||
% {'src': escape(src_dir), 'des': escape(dst_path)}
|
||||
result['error'] = error_msg
|
||||
return HttpResponse(json.dumps(result), status=400, content_type=content_type)
|
||||
|
||||
new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name)
|
||||
|
||||
try:
|
||||
res = seafile_api.copy_file(src_repo_id, src_path, obj_name,
|
||||
dst_repo_id, dst_path, new_obj_name,
|
||||
username, need_progress=1)
|
||||
except SearpcError, e:
|
||||
logger.error(e)
|
||||
res = None
|
||||
|
||||
# res can be None or an object
|
||||
if not res:
|
||||
result['error'] = _(u'Internal server error')
|
||||
return HttpResponse(json.dumps(result), status=500,
|
||||
content_type=content_type)
|
||||
|
||||
result['success'] = True
|
||||
msg = _(u'Successfully copied %(name)s') % {"name": escape(obj_name)}
|
||||
result['msg'] = msg
|
||||
if res.background:
|
||||
result['task_id'] = res.task_id
|
||||
|
||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||
|
||||
|
||||
def dirents_copy_move_common():
|
||||
"""
|
||||
Decorator for common logic in copying/moving dirs/files in batch.
|
||||
|
Reference in New Issue
Block a user