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:
@@ -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:
|
||||
|
@@ -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'),
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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):
|
||||
|
@@ -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, \
|
||||
|
@@ -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
|
||||
|
||||
|
2
utils.py
2
utils.py
@@ -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)
|
||||
|
||||
|
17
views.py
17
views.py
@@ -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)
|
||||
|
||||
|
Reference in New Issue
Block a user