mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-03 07:55:36 +00:00
[api] If the user send a oid when getting SeafDir ,check whether the dir
has been modified fix a bug when getting file size and code optimization
This commit is contained in:
@@ -10,7 +10,6 @@ urlpatterns = patterns('',
|
|||||||
url(r'^repo/list/$', ReposView.as_view(), name='repos'),
|
url(r'^repo/list/$', ReposView.as_view(), name='repos'),
|
||||||
url(r'^repo/(?P<repo_id>[^/]+)/$', RepoView.as_view(), name='repo'),
|
url(r'^repo/(?P<repo_id>[^/]+)/$', RepoView.as_view(), name='repo'),
|
||||||
|
|
||||||
url(r'^dir/(?P<repo_id>[^/]+)/root/$', RepoDirPathView.as_view()),
|
|
||||||
url(r'^dir/(?P<repo_id>[^/]+)/$', RepoDirPathView.as_view(), name='repo-dir-path'),
|
url(r'^dir/(?P<repo_id>[^/]+)/$', RepoDirPathView.as_view(), name='repo-dir-path'),
|
||||||
url(r'^dir/(?P<repo_id>[^/]+)/(?P<dir_id>[^/]+)/$', RepoDirIdView.as_view(), name='repo-dir-id'),
|
url(r'^dir/(?P<repo_id>[^/]+)/(?P<dir_id>[^/]+)/$', RepoDirIdView.as_view(), name='repo-dir-id'),
|
||||||
url(r'^file/(?P<repo_id>[^/]+)/$', RepoFilePathView.as_view(), name='repo-file-path'),
|
url(r'^file/(?P<repo_id>[^/]+)/$', RepoFilePathView.as_view(), name='repo-file-path'),
|
||||||
|
186
api/views.py
186
api/views.py
@@ -55,7 +55,7 @@ def calculate_repo_info(repo_list, username):
|
|||||||
if not repo.size :
|
if not repo.size :
|
||||||
repo.size = 0;
|
repo.size = 0;
|
||||||
password_need = False
|
password_need = False
|
||||||
if repo.props.encrypted:
|
if repo.encrypted:
|
||||||
try:
|
try:
|
||||||
ret = seafserv_rpc.is_passwd_set(repo.id, username)
|
ret = seafserv_rpc.is_passwd_set(repo.id, username)
|
||||||
if ret != 1:
|
if ret != 1:
|
||||||
@@ -83,7 +83,7 @@ def can_access_repo(request, repo_id):
|
|||||||
return access_to_repo(request, repo_id, repo_ap)
|
return access_to_repo(request, repo_id, repo_ap)
|
||||||
|
|
||||||
def get_file_size (id):
|
def get_file_size (id):
|
||||||
size = seafserv_threaded_rpc.get_file_size(dirent.obj_id)
|
size = seafserv_threaded_rpc.get_file_size(id)
|
||||||
if size:
|
if size:
|
||||||
return size
|
return size
|
||||||
else:
|
else:
|
||||||
@@ -98,7 +98,7 @@ def get_dir_entrys_by_id(request, dir_id):
|
|||||||
for dirent in dirs:
|
for dirent in dirs:
|
||||||
dtype = "file"
|
dtype = "file"
|
||||||
entry={}
|
entry={}
|
||||||
if stat.S_ISDIR(dirent.props.mode):
|
if stat.S_ISDIR(dirent.mode):
|
||||||
dtype = "dir"
|
dtype = "dir"
|
||||||
else:
|
else:
|
||||||
mime = get_file_mime (dirent.obj_name)
|
mime = get_file_mime (dirent.obj_name)
|
||||||
@@ -107,7 +107,9 @@ def get_dir_entrys_by_id(request, dir_id):
|
|||||||
try:
|
try:
|
||||||
entry["size"] = get_file_size(dirent.obj_id)
|
entry["size"] = get_file_size(dirent.obj_id)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
|
print e
|
||||||
entry["size"]=0
|
entry["size"]=0
|
||||||
|
|
||||||
entry["type"]=dtype
|
entry["type"]=dtype
|
||||||
entry["name"]=dirent.obj_name
|
entry["name"]=dirent.obj_name
|
||||||
entry["id"]=dirent.obj_id
|
entry["id"]=dirent.obj_id
|
||||||
@@ -117,19 +119,25 @@ def get_dir_entrys_by_id(request, dir_id):
|
|||||||
response["oid"] = dir_id
|
response["oid"] = dir_id
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def get_dir_entrys_by_path(request, commit, path):
|
|
||||||
dentrys = []
|
|
||||||
if path[-1] != '/':
|
|
||||||
path = path + '/'
|
|
||||||
|
|
||||||
dir_id = None
|
def check_repo_access_permission(request, repo):
|
||||||
try:
|
if not repo:
|
||||||
dir_id = seafserv_threaded_rpc.get_dirid_by_path(commit.id,
|
return api_error(request, '404', "repo not found")
|
||||||
path.encode('utf-8'))
|
|
||||||
except SearpcError, e:
|
|
||||||
return api_error(request, "404", e.msg)
|
|
||||||
|
|
||||||
return get_dir_entrys_by_id(request, dir_id)
|
if not can_access_repo(request, repo.id):
|
||||||
|
return api_error(request, '403', "can not access repo")
|
||||||
|
|
||||||
|
password_set = False
|
||||||
|
if repo.encrypted:
|
||||||
|
try:
|
||||||
|
ret = seafserv_rpc.is_passwd_set(repo.id, request.user.username)
|
||||||
|
if ret == 1:
|
||||||
|
password_set = True
|
||||||
|
except SearpcError, e:
|
||||||
|
return api_error(request, '403', e.msg)
|
||||||
|
|
||||||
|
if repo.encrypted and not password_set:
|
||||||
|
return api_error(request, '403', "password needed")
|
||||||
|
|
||||||
|
|
||||||
@csrf_exempt
|
@csrf_exempt
|
||||||
@@ -177,10 +185,10 @@ class ReposView(ResponseMixin, View):
|
|||||||
for r in owned_repos:
|
for r in owned_repos:
|
||||||
repo = {
|
repo = {
|
||||||
"type":"repo",
|
"type":"repo",
|
||||||
"id":r.props.id,
|
"id":r.id,
|
||||||
"owner":email,
|
"owner":email,
|
||||||
"name":r.props.name,
|
"name":r.name,
|
||||||
"desc":r.props.desc,
|
"desc":r.desc,
|
||||||
"mtime":r.lastest_modify,
|
"mtime":r.lastest_modify,
|
||||||
"root":r.root,
|
"root":r.root,
|
||||||
"size":r.size,
|
"size":r.size,
|
||||||
@@ -191,10 +199,10 @@ class ReposView(ResponseMixin, View):
|
|||||||
for r in n_repos:
|
for r in n_repos:
|
||||||
repo = {
|
repo = {
|
||||||
"type":"repo",
|
"type":"repo",
|
||||||
"id":r.props.id,
|
"id":r.id,
|
||||||
"owner":r.props.shared_email,
|
"owner":r.shared_email,
|
||||||
"name":r.props.name,
|
"name":r.name,
|
||||||
"desc":r.props.desc,
|
"desc":r.desc,
|
||||||
"mtime":r.lastest_modify,
|
"mtime":r.lastest_modify,
|
||||||
"root":r.root,
|
"root":r.root,
|
||||||
"size":r.size,
|
"size":r.size,
|
||||||
@@ -212,8 +220,10 @@ class RepoView(ResponseMixin, View):
|
|||||||
@api_login_required
|
@api_login_required
|
||||||
def get_repo_info(request, repo_id):
|
def get_repo_info(request, repo_id):
|
||||||
# check whether user can view repo
|
# check whether user can view repo
|
||||||
if not can_access_repo(request, repo_id):
|
repo = get_repo(repo_id)
|
||||||
return api_error(request, '403', "can not access repo")
|
resp = check_repo_access_permission(request, repo)
|
||||||
|
if resp:
|
||||||
|
return resp
|
||||||
|
|
||||||
# check whether use is repo owner
|
# check whether use is repo owner
|
||||||
if validate_owner(request, repo_id):
|
if validate_owner(request, repo_id):
|
||||||
@@ -221,34 +231,20 @@ class RepoView(ResponseMixin, View):
|
|||||||
else:
|
else:
|
||||||
owner = "share"
|
owner = "share"
|
||||||
|
|
||||||
repo = get_repo(repo_id)
|
|
||||||
if not repo:
|
|
||||||
return api_error(request, '404', "repo not found")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
|
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
|
||||||
except:
|
except:
|
||||||
repo.latest_modify = None
|
repo.latest_modify = None
|
||||||
|
|
||||||
# query whether set password if repo is encrypted
|
|
||||||
password_need = False
|
|
||||||
if repo.props.encrypted:
|
|
||||||
try:
|
|
||||||
ret = seafserv_rpc.is_passwd_set(repo_id, request.user.username)
|
|
||||||
if ret != 1:
|
|
||||||
password_need = True
|
|
||||||
except SearpcError, e:
|
|
||||||
return api_error(request, '403', e.msg)
|
|
||||||
|
|
||||||
# query repo infomation
|
# query repo infomation
|
||||||
repo_size = seafserv_threaded_rpc.server_repo_size(repo_id)
|
repo_size = seafserv_threaded_rpc.server_repo_size(repo_id)
|
||||||
current_commit = get_commits(repo_id, 0, 1)[0]
|
current_commit = get_commits(repo_id, 0, 1)[0]
|
||||||
repo_json = {
|
repo_json = {
|
||||||
"type":"repo",
|
"type":"repo",
|
||||||
"id":repo.props.id,
|
"id":repo.id,
|
||||||
"owner":owner,
|
"owner":owner,
|
||||||
"name":repo.props.name,
|
"name":repo.name,
|
||||||
"desc":repo.props.desc,
|
"desc":repo.desc,
|
||||||
"mtime":repo.lastest_modify,
|
"mtime":repo.lastest_modify,
|
||||||
"password_need":password_need,
|
"password_need":password_need,
|
||||||
"size":repo_size,
|
"size":repo_size,
|
||||||
@@ -264,28 +260,29 @@ class RepoDirPathView(ResponseMixin, View):
|
|||||||
|
|
||||||
@api_login_required
|
@api_login_required
|
||||||
def get(self, request, repo_id):
|
def get(self, request, repo_id):
|
||||||
if not can_access_repo(request, repo_id):
|
|
||||||
return api_error(request, '403', "can not access repo")
|
|
||||||
current_commit = get_commits(repo_id, 0, 1)[0]
|
|
||||||
|
|
||||||
repo = get_repo(repo_id)
|
repo = get_repo(repo_id)
|
||||||
if not repo:
|
resp = check_repo_access_permission(request, repo)
|
||||||
return api_error(request, '404', "repo not found")
|
if resp:
|
||||||
|
return resp
|
||||||
password_set = False
|
|
||||||
if repo.props.encrypted:
|
|
||||||
try:
|
|
||||||
ret = seafserv_rpc.is_passwd_set(repo_id, request.user.username)
|
|
||||||
if ret == 1:
|
|
||||||
password_set = True
|
|
||||||
except SearpcError, e:
|
|
||||||
return api_error(request, '403', e.msg)
|
|
||||||
|
|
||||||
if repo.props.encrypted and not password_set:
|
|
||||||
return api_error(request, '403', "password needed")
|
|
||||||
|
|
||||||
|
current_commit = get_commits(repo_id, 0, 1)[0]
|
||||||
path = request.GET.get('p', '/')
|
path = request.GET.get('p', '/')
|
||||||
return get_dir_entrys_by_path(request, current_commit, path)
|
if path[-1] != '/':
|
||||||
|
path = path + '/'
|
||||||
|
|
||||||
|
dir_id = None
|
||||||
|
try:
|
||||||
|
dir_id = seafserv_threaded_rpc.get_dirid_by_path(current_commit.id,
|
||||||
|
path.encode('utf-8'))
|
||||||
|
except SearpcError, e:
|
||||||
|
return api_error(request, "404", e.msg)
|
||||||
|
|
||||||
|
old_oid = request.GET.get('oid', None)
|
||||||
|
if old_oid and old_oid == dir_id :
|
||||||
|
return HttpResponse(json.dumps("uptodate"), status=304,
|
||||||
|
content_type=json_content_type)
|
||||||
|
else:
|
||||||
|
return get_dir_entrys_by_id(request, dir_id)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -294,24 +291,10 @@ class RepoDirIdView(ResponseMixin, View):
|
|||||||
|
|
||||||
@api_login_required
|
@api_login_required
|
||||||
def get(self, request, repo_id, dir_id):
|
def get(self, request, repo_id, dir_id):
|
||||||
if not can_access_repo(request, repo_id):
|
|
||||||
return api_error(request, '403', "can not access repo")
|
|
||||||
|
|
||||||
repo = get_repo(repo_id)
|
repo = get_repo(repo_id)
|
||||||
if not repo:
|
resp = check_repo_access_permission(request, repo)
|
||||||
return api_error(request, '404', "repo not found")
|
if resp:
|
||||||
|
return resp
|
||||||
password_set = False
|
|
||||||
if repo.props.encrypted:
|
|
||||||
try:
|
|
||||||
ret = seafserv_rpc.is_passwd_set(repo_id, request.user.username)
|
|
||||||
if ret == 1:
|
|
||||||
password_set = True
|
|
||||||
except SearpcError, e:
|
|
||||||
return api_error(request, '403', e.msg)
|
|
||||||
|
|
||||||
if repo.props.encrypted and not password_set:
|
|
||||||
return api_error(request, '403', "password needed")
|
|
||||||
|
|
||||||
return get_dir_entrys_by_id(request, dir_id)
|
return get_dir_entrys_by_id(request, dir_id)
|
||||||
|
|
||||||
@@ -334,23 +317,9 @@ class RepoFileIdView(ResponseMixin, View):
|
|||||||
@api_login_required
|
@api_login_required
|
||||||
def get(self, request, repo_id, file_id):
|
def get(self, request, repo_id, file_id):
|
||||||
repo = get_repo(repo_id)
|
repo = get_repo(repo_id)
|
||||||
if not repo:
|
resp = check_repo_access_permission(request, repo)
|
||||||
return api_error(request, '404', "repo not found")
|
if resp:
|
||||||
|
return resp
|
||||||
if not can_access_repo(request, repo_id):
|
|
||||||
return api_error(request, '403', "can not access repo")
|
|
||||||
|
|
||||||
password_set = False
|
|
||||||
if repo.props.encrypted:
|
|
||||||
try:
|
|
||||||
ret = seafserv_rpc.is_passwd_set(repo_id, request.user.username)
|
|
||||||
if ret == 1:
|
|
||||||
password_set = True
|
|
||||||
except SearpcError, e:
|
|
||||||
return api_error(request, '403', e.msg)
|
|
||||||
|
|
||||||
if repo.props.encrypted and not password_set:
|
|
||||||
return api_error(request, '403', "password needed")
|
|
||||||
|
|
||||||
file_name = request.GET.get('file_name', file_id)
|
file_name = request.GET.get('file_name', file_id)
|
||||||
return get_repo_file (request, repo_id, file_id, file_name)
|
return get_repo_file (request, repo_id, file_id, file_name)
|
||||||
@@ -360,29 +329,15 @@ class RepoFilePathView(ResponseMixin, View):
|
|||||||
|
|
||||||
@api_login_required
|
@api_login_required
|
||||||
def get(self, request, repo_id):
|
def get(self, request, repo_id):
|
||||||
path = request.GET.get('p', '/')
|
repo = get_repo(repo_id)
|
||||||
|
resp = check_repo_access_permission(request, repo)
|
||||||
|
if resp:
|
||||||
|
return resp
|
||||||
|
|
||||||
|
path = request.GET.get('p', None)
|
||||||
if not path:
|
if not path:
|
||||||
return api_error(request, '404', "Path invalid")
|
return api_error(request, '404', "Path invalid")
|
||||||
|
|
||||||
repo = get_repo(repo_id)
|
|
||||||
if not repo:
|
|
||||||
return api_error(request, '404', "repo not found")
|
|
||||||
|
|
||||||
if not can_access_repo(request, repo_id):
|
|
||||||
return api_error(request, '403', "can not access repo")
|
|
||||||
|
|
||||||
password_set = False
|
|
||||||
if repo.props.encrypted:
|
|
||||||
try:
|
|
||||||
ret = seafserv_rpc.is_passwd_set(repo_id, request.user.username)
|
|
||||||
if ret == 1:
|
|
||||||
password_set = True
|
|
||||||
except SearpcError, e:
|
|
||||||
return api_error(request, '403', e.msg)
|
|
||||||
|
|
||||||
if repo.props.encrypted and not password_set:
|
|
||||||
return api_error(request, '403', "password needed")
|
|
||||||
|
|
||||||
file_id = None
|
file_id = None
|
||||||
try:
|
try:
|
||||||
file_id = seafserv_threaded_rpc.get_file_by_path(commit.id,
|
file_id = seafserv_threaded_rpc.get_file_by_path(commit.id,
|
||||||
@@ -394,5 +349,8 @@ class RepoFilePathView(ResponseMixin, View):
|
|||||||
return api_error(request, '400', "Path invalid")
|
return api_error(request, '400', "Path invalid")
|
||||||
|
|
||||||
file_name = request.GET.get('file_name', file_id)
|
file_name = request.GET.get('file_name', file_id)
|
||||||
return get_repo_file(request, repo_id, file_id)
|
return get_repo_file(request, repo_id, file_name)
|
||||||
|
|
||||||
|
@api_login_required
|
||||||
|
def post(self, request, repo_id):
|
||||||
|
pass
|
||||||
|
Reference in New Issue
Block a user