1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-07 18:03:48 +00:00

Fixed bug in org repo share, and clean code

This commit is contained in:
xiez
2012-09-03 16:14:15 +08:00
parent 29c9ff11df
commit d138bee164
8 changed files with 195 additions and 166 deletions

View File

@@ -471,7 +471,6 @@ def group_remove_member(request, group_id, user_name):
return HttpResponseRedirect(reverse('group_members', args=[group_id]))
@login_required
def group_share_repo(request, repo_id, group_id, from_email):
"""
Share a repo to a group.
@@ -494,7 +493,6 @@ def group_share_repo(request, repo_id, group_id, from_email):
if seafserv_threaded_rpc.group_share_repo(repo_id, group_id, from_email, 'rw') != 0:
return render_error(request, u'共享失败:内部错误')
@login_required
def group_unshare_repo(request, repo_id, group_id, from_email):
"""
Unshare a repo in group.
@@ -516,7 +514,7 @@ def group_unshare_repo(request, repo_id, group_id, from_email):
# Check whether user is group staff or the one share the repo
if not check_group_staff(group_id, from_email) and \
seafserv_threaded_rpc.get_group_repo_share_from(repo_id) != from_email:
seafserv_threaded_rpc.get_group_repo_owner(repo_id) != from_email:
return render_permission_error(request, u'取消共享失败:只有小组管理员或共享目录发布者有权取消共享')
if seafserv_threaded_rpc.group_unshare_repo(repo_id, group_id, from_email) != 0:

View File

@@ -17,7 +17,6 @@ urlpatterns = patterns('',
# repo share
url(r'^(?P<url_prefix>[^/]+)/shareadmin/$', org_shareadmin, name='org_shareadmin'),
url(r'^(?P<url_prefix>[^/]+)/repo/share/$', org_repo_share, name='org_repo_share'),
url(r'^(?P<url_prefix>[^/]+)/repo/unshare/$', org_repo_unshare, name='org_repo_unshare'),
url(r'^([^/]+)/repo/(?P<repo_id>[^/]+)/$', repo, name='repo'),

View File

@@ -546,9 +546,6 @@ def org_repo_share(request, url_prefix):
return HttpResponseRedirect(reverse(org_personal, args=[org.url_prefix]))
@login_required
def org_repo_unshare(request, url_prefix):
pass
@login_required
def org_shareadmin(request, url_prefix):
@@ -561,9 +558,28 @@ def org_shareadmin(request, url_prefix):
if not org:
return HttpResponseRedirect(reverse(myhome))
# org repos that are shared to others
# Org repos that are shared to others.
out_repos = list_org_shared_repos(username, 'from_email', -1, -1)
# Org repos that are shared to groups.
group_repos = seafserv_threaded_rpc.get_org_group_repos_by_owner(org.org_id,
username)
for group_repo in group_repos:
repo_id = group_repo.props.repo_id
if not repo_id:
continue
repo = get_repo(repo_id)
if not repo:
continue
group_id = group_repo.props.group_id
group = ccnet_threaded_rpc.get_group(int(group_id))
if not group:
continue
repo.props.shared_email = group.props.group_name
repo.gid = group_id
out_repos.append(repo)
# File shared links
fileshares = FileShare.objects.filter(username=request.user.username)
o_fileshares = [] # shared files in org repos

View File

@@ -118,7 +118,7 @@ def share_admin(request):
out_repos = list_personal_shared_repos(username, 'from_email', -1, -1)
# repos that are share to groups
group_repos = seafserv_threaded_rpc.get_group_my_share_repos(request.user.username)
group_repos = seafserv_threaded_rpc.get_group_repos_by_owner(username)
for group_repo in group_repos:
repo_id = group_repo.props.repo_id
if not repo_id:
@@ -143,7 +143,7 @@ def share_admin(request):
# link.remain_time = anon_share_token_generator.get_remain_time(link.token)
# File shared links
fileshares = FileShare.objects.filter(username=request.user.username)
fileshares = FileShare.objects.filter(username=username)
p_fileshares = [] # personal file share
for fs in fileshares:
if is_personal_repo(fs.repo_id):

View File

@@ -7,7 +7,8 @@ from service import get_emailusers
from service import get_org_groups, get_personal_groups, get_group_repoids, \
check_group_staff, remove_group_user, get_group, get_org_id_by_group, \
get_group_members, get_shared_groups_by_repo, is_group_user, \
get_org_group_repos, get_group_repos, get_org_groups_by_user
get_org_group_repos, get_group_repos, get_org_groups_by_user, is_org_group,\
del_org_group_repo
from service import get_repos, get_repo, get_commits, get_branches, \
get_org_repos, is_repo_owner, create_org_repo, is_inner_pub_repo, \
list_org_inner_pub_repos, get_org_id_by_repo_id, list_org_shared_repos, \

View File

@@ -97,6 +97,7 @@ def get_emailusers(start, limit):
users = []
return users
# group
def get_group(group_id):
group_id_int = int(group_id)
try:
@@ -105,6 +106,7 @@ def get_group(group_id):
group = None
return group
# group user
def is_group_user(group_id, user):
try:
ret = ccnet_threaded_rpc.is_group_user(group_id, user)
@@ -126,6 +128,29 @@ def remove_group_user(user):
"""
return ccnet_threaded_rpc.remove_group_user(user)
def get_group_members(group_id):
group_id_int = int(group_id)
try:
members = ccnet_threaded_rpc.get_group_members(group_id_int)
except SearpcError:
members = []
return members
# org group
def is_org_group(group_id):
try:
ret = ccnet_threaded_rpc.is_org_group(group_id)
except SearpcError:
ret = -1
return True if ret == 1 else False
def get_org_id_by_group(group_id):
try:
org_id = ccnet_threaded_rpc.get_org_id_by_group(group_id)
except SearpcError:
org_id = -1
return org_id
def get_org_groups(org_id, start, limit):
try:
groups = ccnet_threaded_rpc.get_org_groups(org_id, 0, MAX_INT)
@@ -157,43 +182,11 @@ def get_personal_groups(email):
personal_groups = []
for group in groups_all:
if not ccnet_threaded_rpc.is_org_group(group.id):
if not is_org_group(group.id):
personal_groups.append(group)
return personal_groups
def get_group_members(group_id):
group_id_int = int(group_id)
try:
members = ccnet_threaded_rpc.get_group_members(group_id_int)
except SearpcError:
members = []
return members
def get_shared_groups_by_repo(repo_id):
try:
group_ids = seafserv_threaded_rpc.get_shared_groups_by_repo(repo_id)
if not group_ids:
return []
except SearpcError:
return []
groups = []
for group_id in group_ids.split('\n'):
if not group_id:
continue
group = get_group(group_id)
if group:
groups.append(group)
return groups
def get_org_id_by_group(group_id):
try:
org_id = ccnet_threaded_rpc.get_org_id_by_group(group_id)
except SearpcError:
org_id = -1
return org_id
# org
def create_org(org_name, url_prefix, username):
ccnet_threaded_rpc.create_org(org_name, url_prefix, username)
@@ -276,98 +269,6 @@ def send_command(command):
pool.return_client(client)
return ret
######## seafserv API ####
def get_repos():
"""
Return repository list.
"""
return seafserv_threaded_rpc.get_repo_list("", 100)
# org repo
def create_org_repo(repo_name, repo_desc, user, passwd, org_id):
"""
Create org repo, return valid repo id if success.
"""
try:
repo_id = seafserv_threaded_rpc.create_org_repo(repo_name, repo_desc,
user, passwd, org_id)
except SearpcError:
repo_id = None
return repo_id
def get_org_repos(org_id, start, limit):
"""
List repos created in org.
"""
try:
repos = seafserv_threaded_rpc.get_org_repo_list(org_id, start, limit)
except SearpcError:
repos = []
return repos
def list_org_inner_pub_repos(org_id, start=None, limit=None):
"""
List org inner pub repos, which can be access by all org members.
"""
try:
repos = seafserv_threaded_rpc.list_org_inner_pub_repos(org_id)
except SearpcError:
repos = []
# calculate repo's lastest modify time
for repo in repos:
try:
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
except:
repo.latest_modify = None
# sort repos by latest modify time
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return repos
def get_org_id_by_repo_id(repo_id):
"""
Get org id according repo id.
"""
try:
org_id = seafserv_threaded_rpc.get_org_id_by_repo_id(repo_id)
except SearpcError:
org_id = -1
return org_id
def list_org_repos_by_owner(org_id, user):
try:
repos = seafserv_threaded_rpc.list_org_repos_by_owner(org_id, user)
except SearpcError:
repos = []
return repos
# repo
def get_repo(repo_id):
return seafserv_threaded_rpc.get_repo(repo_id)
def is_repo_owner(user, repo_id):
"""
Check whether user is repo owner.
"""
try:
ret = seafserv_threaded_rpc.is_repo_owner(user, repo_id)
except SearpcError:
ret = 0
return ret
def get_commits(repo_id, offset, limit):
"""Get commit lists."""
return seafserv_threaded_rpc.get_commit_list(repo_id, offset, limit)
def get_branches(repo_id):
"""Get branches of a given repo"""
return seafserv_threaded_rpc.branch_gets(repo_id)
def get_binding_peerids(email):
"""Get peer ids of a given email"""
try:
@@ -385,6 +286,98 @@ def get_binding_peerids(email):
peerid_list.append(peer_id)
return peerid_list
######## seafserv API ####
# repo
def get_repos():
"""
Return repository list.
"""
return seafserv_threaded_rpc.get_repo_list("", 100)
def get_repo(repo_id):
return seafserv_threaded_rpc.get_repo(repo_id)
def is_repo_owner(user, repo_id):
"""
Check whether user is repo owner.
"""
try:
ret = seafserv_threaded_rpc.is_repo_owner(user, repo_id)
except SearpcError:
ret = 0
return ret
# org repo
def create_org_repo(repo_name, repo_desc, user, passwd, org_id):
"""
Create org repo, return valid repo id if success.
"""
try:
repo_id = seafserv_threaded_rpc.create_org_repo(repo_name, repo_desc,
user, passwd, org_id)
except SearpcError:
repo_id = None
return repo_id
def list_org_repos_by_owner(org_id, user):
try:
repos = seafserv_threaded_rpc.list_org_repos_by_owner(org_id, user)
except SearpcError:
repos = []
return repos
def get_org_repos(org_id, start, limit):
"""
List repos created in org.
"""
try:
repos = seafserv_threaded_rpc.get_org_repo_list(org_id, start, limit)
except SearpcError:
repos = []
return repos
def get_org_id_by_repo_id(repo_id):
"""
Get org id according repo id.
"""
try:
org_id = seafserv_threaded_rpc.get_org_id_by_repo_id(repo_id)
except SearpcError:
org_id = -1
return org_id
# commit
def get_commits(repo_id, offset, limit):
"""Get commit lists."""
return seafserv_threaded_rpc.get_commit_list(repo_id, offset, limit)
# branch
def get_branches(repo_id):
"""Get branches of a given repo"""
return seafserv_threaded_rpc.branch_gets(repo_id)
# group repo
def get_shared_groups_by_repo(repo_id):
try:
group_ids = seafserv_threaded_rpc.get_shared_groups_by_repo(repo_id)
if not group_ids:
return []
except SearpcError:
return []
groups = []
for group_id in group_ids.split('\n'):
if not group_id:
continue
group = get_group(group_id)
if group:
groups.append(group)
return groups
def get_group_repoids(group_id):
"""Get repo ids of a given group id."""
try:
@@ -426,7 +419,7 @@ def get_group_repos(group_id, user):
if not repo:
continue
repo.owner = seafserv_threaded_rpc.get_group_repo_share_from(repo_id)
repo.owner = seafserv_threaded_rpc.get_group_repo_owner(repo_id)
repo.share_from_me = True if user == repo.owner else False
try:
@@ -438,7 +431,11 @@ def get_group_repos(group_id, user):
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return repos
# org group repo
def del_org_group_repo(repo_id, org_id, group_id):
seafserv_threaded_rpc.del_org_group_repo(repo_id, org_id, group_id)
def get_org_group_repos(org_id, group_id, user):
"""Get org repos of a given group id."""
try:
@@ -478,17 +475,7 @@ def get_org_group_repos(org_id, group_id, user):
return repos
def is_valid_filename(file_or_dir):
"""
Check whether file name or directory name is valid.
"""
try:
ret = seafserv_threaded_rpc.is_valid_filename('', file_or_dir)
except SearpcError:
ret = 0
return ret
# inner pub repo
def is_inner_pub_repo(repo_id):
"""
Check whether a repo is public.
@@ -501,6 +488,27 @@ def is_inner_pub_repo(repo_id):
return ret
# org inner pub repo
def list_org_inner_pub_repos(org_id, start=None, limit=None):
"""
List org inner pub repos, which can be access by all org members.
"""
try:
repos = seafserv_threaded_rpc.list_org_inner_pub_repos(org_id)
except SearpcError:
repos = []
# calculate repo's lastest modify time
for repo in repos:
try:
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
except:
repo.latest_modify = None
# sort repos by latest modify time
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return repos
# repo permissoin
def check_permission(repo_id, user):
"""
Check whether user has permission to access repo.
@@ -512,16 +520,6 @@ def check_permission(repo_id, user):
ret = -1
return True if ret == 0 else False
def get_org_id_by_repo(repo_id):
"""
Check whether repo is org repo.
"""
try:
org_id = seafserv_threaded_rpc.get_org_id_by_repo_id(repo_id)
except SearpcError:
org_id = -1
return org_id
def is_personal_repo(repo_id):
"""
Check whether repo is personal repo.
@@ -581,3 +579,15 @@ def list_org_shared_repos(user, user_type, start, limit):
o_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return o_repos
def is_valid_filename(file_or_dir):
"""
Check whether file name or directory name is valid.
"""
try:
ret = seafserv_threaded_rpc.is_valid_filename('', file_or_dir)
except SearpcError:
ret = 0
return ret

View File

@@ -254,7 +254,7 @@ def get_accessible_repos(request, repo):
group_repo = get_repo(repo_id)
if not group_repo:
continue
group_repo.share_from = seafserv_threaded_rpc.get_group_repo_share_from(repo_id)
group_repo.share_from = seafserv_threaded_rpc.get_group_repo_owner(repo_id)
if email != group_repo.share_from:
groups_repos.append(group_repo)

View File

@@ -31,9 +31,9 @@ from share.models import FileShare
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, get_emailusers, \
get_repo, get_commits, get_branches, is_valid_filename, remove_group_user,\
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, is_inner_pub_repo, \
check_group_staff, get_personal_groups, is_repo_owner, \
check_group_staff, get_personal_groups, is_repo_owner, del_org_group_repo,\
get_group, get_shared_groups_by_repo, is_group_user, check_permission, \
list_personal_shared_repos
list_personal_shared_repos, is_org_group, get_org_id_by_group
from pysearpc import SearpcError
from base.accounts import User
@@ -1253,15 +1253,20 @@ def repo_remove_share(request):
if not check_group_staff(group_id_int, request.user) \
and request.user.username != from_email:
return render_permission_error(request, u'取消共享失败')
from seahub.group.views import group_unshare_repo
group_unshare_repo(request, repo_id, group_id_int, from_email)
return render_permission_error(request, u'取消共享失败')
if is_org_group(group_id_int):
org_id = get_org_id_by_group(group_id_int)
del_org_group_repo(repo_id, org_id, group_id_int)
else:
from group.views import group_unshare_repo
group_unshare_repo(request, repo_id, group_id_int, from_email)
messages.add_message(request, messages.INFO, '操作成功')
next = request.META.get('HTTP_REFERER', None)
if not next:
next = reverse(referer)
next = settings.SITE_ROOT
return HttpResponseRedirect(next)