1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-12 13:24:52 +00:00

Fixed bug in getting shared repos using api2, and refactor some code.

This commit is contained in:
zhengxie
2012-12-19 10:58:14 +08:00
parent cad653726b
commit 8347e84fee
6 changed files with 68 additions and 70 deletions

View File

@@ -26,9 +26,10 @@ from seahub.utils import gen_file_get_url, gen_token, gen_file_upload_url, \
get_ccnet_server_addr_port get_ccnet_server_addr_port
from pysearpc import SearpcError from pysearpc import SearpcError
from seaserv import seafserv_rpc, seafserv_threaded_rpc, \ from seaserv import seafserv_rpc, seafserv_threaded_rpc, server_repo_size, \
get_personal_groups_by_user, get_session_info, get_repo_token_nonnull, \ get_personal_groups_by_user, get_session_info, get_repo_token_nonnull, \
get_group_repos, get_repo, check_permission, get_commits get_group_repos, get_repo, check_permission, get_commits, is_passwd_set,\
list_personal_repos_by_owner, list_personal_shared_repos
json_content_type = 'application/json; charset=utf-8' json_content_type = 'application/json; charset=utf-8'
@@ -98,6 +99,7 @@ HTTP_ERRORS = {
'419':'Failed to move', '419':'Failed to move',
'420':'Failed to rename', '420':'Failed to rename',
'421':'Failed to mkdir', '421':'Failed to mkdir',
'422':'Failed to get current commit',
'499':'Unknow Error', '499':'Unknow Error',
@@ -132,28 +134,13 @@ def calculate_repo_info(repo_list, username):
""" """
for repo in repo_list: for repo in repo_list:
try:
commit = get_commits(repo.id, 0, 1)[0] commit = get_commits(repo.id, 0, 1)[0]
if not commit:
continue
repo.latest_modify = commit.ctime repo.latest_modify = commit.ctime
repo.root = commit.root_id repo.root = commit.root_id
repo.size = seafserv_threaded_rpc.server_repo_size(repo.id) repo.size = server_repo_size(repo.id)
if not repo.size : repo.password_need = is_passwd_set(repo.id, username)
repo.size = 0;
password_need = False
if repo.encrypted:
try:
ret = seafserv_rpc.is_passwd_set(repo.id, username)
if ret != 1:
password_need = True
except SearpcErroe, e:
pass
repo.password_need = password_need
except Exception,e:
repo.latest_modify = 0
repo.commit = None
repo.size = -1
repo.password_need = None
class Repos(APIView): class Repos(APIView):
authentication_classes = (TokenAuthentication, ) authentication_classes = (TokenAuthentication, )
@@ -161,17 +148,11 @@ class Repos(APIView):
def get(self, request, format=None): def get(self, request, format=None):
email = request.user.username email = request.user.username
repos_json = []
owned_repos = seafserv_threaded_rpc.list_owned_repos(email) owned_repos = list_personal_repos_by_owner(email)
calculate_repo_info(owned_repos, email) calculate_repo_info(owned_repos, email)
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
n_repos = seafserv_threaded_rpc.list_share_repos(email,
'to_email', -1, -1)
calculate_repo_info (n_repos, email)
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
repos_json = []
for r in owned_repos: for r in owned_repos:
repo = { repo = {
"type":"repo", "type":"repo",
@@ -187,13 +168,21 @@ class Repos(APIView):
} }
repos_json.append(repo) repos_json.append(repo)
for r in n_repos: shared_repos = list_personal_shared_repos(email, 'to_email', -1, -1)
for r in shared_repos:
commit = get_commits(r.repo_id, 0, 1)[0]
if not commit:
continue
r.latest_modify = commit.ctime
r.root = commit.root_id
r.size = server_repo_size(r.repo_id)
r.password_need = is_passwd_set(r.repo_id, email)
repo = { repo = {
"type":"srepo", "type":"srepo",
"id":r.id, "id":r.repo_id,
"owner":r.shared_email, "owner":r.user,
"name":r.name, "name":r.repo_name,
"desc":r.desc, "desc":r.repo_desc,
"mtime":r.latest_modify, "mtime":r.latest_modify,
"root":r.root, "root":r.root,
"size":r.size, "size":r.size,
@@ -206,7 +195,7 @@ class Repos(APIView):
for group in groups: for group in groups:
g_repos = get_group_repos(group.id, email) g_repos = get_group_repos(group.id, email)
calculate_repo_info (g_repos, email) calculate_repo_info (g_repos, email)
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) g_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
for r in g_repos: for r in g_repos:
repo = { repo = {
"type":"grepo", "type":"grepo",
@@ -252,14 +241,13 @@ class Repo(APIView):
else: else:
owner = "share" owner = "share"
try: last_commit = get_commits(repo.id, 0, 1)[0].ctime
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime repo.latest_modify = last_commit.ctime if last_commit else None
except:
repo.latest_modify = None
# 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]
root_id = current_commit.root_id if current_commit else None
# generate download url for client # generate download url for client
ccnet_applet_root = get_ccnetapplet_root() ccnet_applet_root = get_ccnetapplet_root()
@@ -284,7 +272,7 @@ class Repo(APIView):
"mtime":repo.lastest_modify, "mtime":repo.lastest_modify,
"size":repo.size, "size":repo.size,
"encrypted":repo.encrypted, "encrypted":repo.encrypted,
"root":current_commit.root_id, "root":root_id,
"password_need":repo.password_need, "password_need":repo.password_need,
"download_url": url, "download_url": url,
} }
@@ -374,6 +362,9 @@ class RepoDirents(APIView):
return resp return resp
current_commit = get_commits(repo_id, 0, 1)[0] current_commit = get_commits(repo_id, 0, 1)[0]
if not current_commit:
return api_error('422')
path = request.GET.get('p', '/') path = request.GET.get('p', '/')
if path[-1] != '/': if path[-1] != '/':
path = path + '/' path = path + '/'
@@ -536,6 +527,9 @@ def reloaddir_if_neccessary (request, repo_id, parent_dir):
return Response('success') return Response('success')
current_commit = get_commits(repo_id, 0, 1)[0] current_commit = get_commits(repo_id, 0, 1)[0]
if not current_commit:
return api_error('422')
try: try:
dir_id = seafserv_threaded_rpc.get_dirid_by_path(current_commit.id, dir_id = seafserv_threaded_rpc.get_dirid_by_path(current_commit.id,
parent_dir.encode('utf-8')) parent_dir.encode('utf-8'))

View File

@@ -130,10 +130,8 @@ def org_personal(request, url_prefix):
r.repo_id = r.id r.repo_id = r.id
r.repo_name = r.name r.repo_name = r.name
r.repo_desc = r.desc r.repo_desc = r.desc
try: last_commit = get_commits(r_id, 0, 1)[0]
r.last_modified = get_commits(r_id, 0, 1)[0].ctime r.last_modified = last_commit.ctime if last_commit else 0
except:
r.last_modified = 0
r.share_type = 'group' r.share_type = 'group'
r.user = get_org_repo_owner(r_id) r.user = get_org_repo_owner(r_id)
r.user_perm = check_permission(r_id, user) r.user_perm = check_permission(r_id, user)

View File

@@ -15,7 +15,8 @@ from service import get_repos, get_repo, get_commits, get_branches, remove_repo,
list_org_inner_pub_repos, get_org_id_by_repo_id, list_org_shared_repos, \ list_org_inner_pub_repos, get_org_id_by_repo_id, list_org_shared_repos, \
list_personal_shared_repos, is_personal_repo, list_inner_pub_repos, \ list_personal_shared_repos, is_personal_repo, list_inner_pub_repos, \
is_org_repo_owner, get_org_repo_owner, is_org_repo, get_file_size,\ is_org_repo_owner, get_org_repo_owner, is_org_repo, get_file_size,\
list_personal_repos_by_owner, get_repo_token_nonnull, get_repo_owner list_personal_repos_by_owner, get_repo_token_nonnull, get_repo_owner, \
server_repo_size
from service import get_binding_peerids, is_valid_filename, check_permission,\ from service import get_binding_peerids, is_valid_filename, check_permission,\
is_passwd_set is_passwd_set

View File

@@ -335,6 +335,13 @@ def is_repo_owner(user, repo_id):
ret = 0 ret = 0
return ret return ret
def server_repo_size(repo_id):
try:
size = seafserv_threaded_rpc.server_repo_size(repo_id)
except SearpcError:
size = 0
return size
# org repo # org repo
def create_org_repo(repo_name, repo_desc, user, passwd, org_id): def create_org_repo(repo_name, repo_desc, user, passwd, org_id):
""" """
@@ -408,7 +415,11 @@ def get_org_repo_owner(repo_id):
# commit # commit
def get_commits(repo_id, offset, limit): def get_commits(repo_id, offset, limit):
"""Get commit lists.""" """Get commit lists."""
return seafserv_threaded_rpc.get_commit_list(repo_id, offset, limit) try:
ret = seafserv_threaded_rpc.get_commit_list(repo_id, offset, limit)
except SearpcError:
ret = None
return ret
# branch # branch
def get_branches(repo_id): def get_branches(repo_id):
@@ -471,10 +482,8 @@ def get_group_repos(group_id, user):
repo.owner = seafserv_threaded_rpc.get_group_repo_owner(repo_id) repo.owner = seafserv_threaded_rpc.get_group_repo_owner(repo_id)
repo.share_from_me = True if user == repo.owner else False repo.share_from_me = True if user == repo.owner else False
try: last_commit = get_commits(repo.id, 0, 1)[0]
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime repo.latest_modify = last_commit.ctime if last_commit else None
except:
repo.latest_modify = None
repos.append(repo) repos.append(repo)
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
@@ -512,10 +521,8 @@ def get_org_group_repos(org_id, group_id, user):
repo_id) repo_id)
repo.sharecd_from_me = True if user == repo.owner else False repo.sharecd_from_me = True if user == repo.owner else False
try: last_commit = get_commits(repo.id, 0, 1)[0]
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime repo.latest_modify = last_commit.ctime if last_commit else None
except:
repo.latest_modify = None
repos.append(repo) repos.append(repo)
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))

View File

@@ -140,13 +140,12 @@ def calculate_repo_last_modify(repo_list):
""" """
for repo in repo_list: for repo in repo_list:
try:
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
except:
repo.latest_modify = None
def check_filename_with_rename(repo_id, parent_dir, filename): def check_filename_with_rename(repo_id, parent_dir, filename):
latest_commit = get_commits(repo_id, 0, 1)[0] latest_commit = get_commits(repo_id, 0, 1)[0]
if not latest_commit:
return ''
dirents = seafserv_threaded_rpc.list_dir_by_path(latest_commit.id, dirents = seafserv_threaded_rpc.list_dir_by_path(latest_commit.id,
parent_dir.encode('utf-8')) parent_dir.encode('utf-8'))
@@ -210,6 +209,8 @@ def get_accessible_repos(request, repo):
""" """
def check_has_subdir(repo): def check_has_subdir(repo):
latest_commit = get_commits(repo.id, 0, 1)[0] latest_commit = get_commits(repo.id, 0, 1)[0]
if not latest_commit:
return False
if latest_commit.root_id == EMPTY_SHA1: if latest_commit.root_id == EMPTY_SHA1:
return False return False

View File

@@ -215,8 +215,7 @@ class RepoMixin(object):
def get_current_commit(self): def get_current_commit(self):
# Get newest commit by default, subclasses can override this method. # Get newest commit by default, subclasses can override this method.
current_commit = get_commits(self.repo.id, 0, 1)[0] return get_commits(self.repo.id, 0, 1)[0]
return current_commit
def get_success_url(self): def get_success_url(self):
next = self.request.GET.get('next', '') next = self.request.GET.get('next', '')
@@ -863,10 +862,8 @@ def myhome(request):
r.repo_id = r.id r.repo_id = r.id
r.repo_name = r.name r.repo_name = r.name
r.repo_desc = r.desc r.repo_desc = r.desc
try: last_commit = get_commits(r_id, 0, 1)[0]
r.last_modified = get_commits(r_id, 0, 1)[0].ctime r.last_modified = last_commit.ctime if last_commit else 0
except:
r.last_modified = 0
r.share_type = 'group' r.share_type = 'group'
r.user = get_repo_owner(r_id) r.user = get_repo_owner(r_id)
r.user_perm = check_permission(r_id, email) r.user_perm = check_permission(r_id, email)