2012-05-15 02:59:16 +00:00
|
|
|
# encoding: utf-8
|
2012-05-20 12:32:21 +00:00
|
|
|
from django.core.urlresolvers import reverse
|
2012-05-15 02:59:16 +00:00
|
|
|
from django.http import HttpResponse, HttpResponseRedirect, Http404
|
|
|
|
from django.shortcuts import render_to_response, redirect
|
|
|
|
from django.template import RequestContext
|
2012-02-11 03:12:54 +00:00
|
|
|
|
2012-05-20 12:32:21 +00:00
|
|
|
from auth.decorators import login_required
|
2012-05-15 02:59:16 +00:00
|
|
|
from seaserv import ccnet_rpc, seafserv_threaded_rpc, get_repo, \
|
|
|
|
get_group_repoids
|
|
|
|
from pysearpc import SearpcError
|
|
|
|
|
2012-05-18 13:32:16 +00:00
|
|
|
from seahub.contacts.models import Contact
|
2012-05-20 12:32:21 +00:00
|
|
|
from seahub.utils import go_error, go_permission_error, validate_group_name
|
|
|
|
from seahub.views import validate_emailuser
|
2012-05-18 13:32:16 +00:00
|
|
|
|
2012-05-15 02:59:16 +00:00
|
|
|
@login_required
|
|
|
|
def group_list(request):
|
|
|
|
groups = ccnet_rpc.get_groups(request.user.username);
|
|
|
|
|
|
|
|
return render_to_response("group/groups.html", {
|
|
|
|
"groups": groups,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def group_add(request):
|
|
|
|
error_msg = None
|
|
|
|
if request.method == 'POST':
|
|
|
|
group_name = request.POST.get('group_name')
|
2012-05-16 06:10:54 +00:00
|
|
|
if not validate_group_name(group_name):
|
|
|
|
return go_error(request, u'小组名称只能包含中英文字符,数字及下划线')
|
|
|
|
|
2012-05-15 02:59:16 +00:00
|
|
|
try:
|
|
|
|
ccnet_rpc.create_group(group_name.encode('utf-8'), request.user.username)
|
|
|
|
except SearpcError, e:
|
|
|
|
error_msg = e.msg
|
|
|
|
return go_error(request, error_msg)
|
|
|
|
|
|
|
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def group_remove(request):
|
|
|
|
group_id = request.GET.get('gid')
|
|
|
|
|
|
|
|
try:
|
|
|
|
group_id_int = int(group_id)
|
|
|
|
except ValueError:
|
2012-05-15 06:29:37 +00:00
|
|
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
2012-05-15 02:59:16 +00:00
|
|
|
|
2012-05-16 06:10:54 +00:00
|
|
|
# check whether use is the group staff
|
|
|
|
if not ccnet_rpc.check_group_staff(group_id_int, request.user.username):
|
|
|
|
return go_permission_error(request, u'只有小组管理员有权解散小组')
|
|
|
|
|
2012-05-15 02:59:16 +00:00
|
|
|
try:
|
|
|
|
ccnet_rpc.remove_group(group_id_int, request.user.username)
|
|
|
|
seafserv_threaded_rpc.remove_repo_group(group_id_int, None)
|
|
|
|
except SearpcError, e:
|
|
|
|
return go_error(request, e.msg)
|
|
|
|
|
|
|
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def group_info(request, group_id):
|
|
|
|
try:
|
|
|
|
group_id_int = int(group_id)
|
|
|
|
except ValueError:
|
|
|
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
2012-05-16 06:10:54 +00:00
|
|
|
|
|
|
|
# check whether user belong to the group
|
|
|
|
joined = False
|
|
|
|
groups = ccnet_rpc.get_groups(request.user.username)
|
|
|
|
for group in groups:
|
|
|
|
if group.id == group_id_int:
|
|
|
|
joined = True
|
|
|
|
if not joined:
|
|
|
|
return go_error(request, u'未加入该小组')
|
2012-05-15 02:59:16 +00:00
|
|
|
|
|
|
|
group = ccnet_rpc.get_group(group_id_int)
|
|
|
|
if not group:
|
|
|
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
2012-05-15 06:43:52 +00:00
|
|
|
|
|
|
|
if ccnet_rpc.check_group_staff(group.props.id, request.user.username):
|
|
|
|
is_staff = True
|
2012-05-15 02:59:16 +00:00
|
|
|
else:
|
2012-05-15 06:43:52 +00:00
|
|
|
is_staff = False
|
2012-05-15 02:59:16 +00:00
|
|
|
|
|
|
|
members = ccnet_rpc.get_group_members(group_id_int)
|
2012-05-16 13:33:35 +00:00
|
|
|
managers = []
|
|
|
|
common_members = []
|
2012-05-16 06:10:54 +00:00
|
|
|
for member in members:
|
|
|
|
member.short_username = member.user_name.split('@')[0]
|
2012-05-16 13:33:35 +00:00
|
|
|
if member.is_staff == 1:
|
2012-05-17 06:11:22 +00:00
|
|
|
managers.append(member)
|
2012-05-16 13:33:35 +00:00
|
|
|
else:
|
2012-05-17 06:11:22 +00:00
|
|
|
common_members.append(member)
|
2012-05-15 02:59:16 +00:00
|
|
|
|
|
|
|
repos = []
|
|
|
|
repo_ids = get_group_repoids(group_id=group_id_int)
|
|
|
|
for repo_id in repo_ids:
|
|
|
|
if not repo_id:
|
|
|
|
continue
|
|
|
|
repo = get_repo(repo_id)
|
2012-05-15 03:23:28 +00:00
|
|
|
if not repo:
|
|
|
|
continue
|
2012-05-15 02:59:16 +00:00
|
|
|
repo.share_from = seafserv_threaded_rpc.get_group_repo_share_from(repo_id)
|
|
|
|
if request.user.username == repo.share_from:
|
|
|
|
repo.share_from_me = True
|
|
|
|
else:
|
|
|
|
repo.share_from_me = False
|
|
|
|
repos.append(repo)
|
|
|
|
|
|
|
|
return render_to_response("group/group_info.html", {
|
2012-05-16 13:33:35 +00:00
|
|
|
"managers": managers,
|
|
|
|
"common_members": common_members,
|
2012-05-15 02:59:16 +00:00
|
|
|
"repos": repos,
|
|
|
|
"group_id": group_id,
|
2012-05-17 15:50:04 +00:00
|
|
|
"group" : group,
|
2012-05-15 06:43:52 +00:00
|
|
|
"is_staff": is_staff,
|
2012-05-15 02:59:16 +00:00
|
|
|
}, context_instance=RequestContext(request));
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def group_add_member(request):
|
|
|
|
if request.method == 'POST':
|
|
|
|
group_id = request.POST.get('group_id')
|
2012-05-21 03:47:53 +00:00
|
|
|
member_names = request.POST.get('user_name').split(',')
|
|
|
|
|
|
|
|
try:
|
|
|
|
group_id_int = int(group_id)
|
|
|
|
except ValueError:
|
|
|
|
return go_error(request, u'group id 不是有效参数')
|
|
|
|
|
|
|
|
for member_name in member_names:
|
|
|
|
member_name = member_name.strip(' ')
|
|
|
|
if not member_name:
|
|
|
|
continue
|
|
|
|
|
|
|
|
if not validate_emailuser(member_name):
|
|
|
|
err_msg = u'用户不存在'
|
|
|
|
return go_error(request, err_msg)
|
|
|
|
|
2012-05-15 02:59:16 +00:00
|
|
|
try:
|
|
|
|
ccnet_rpc.group_add_member(group_id_int, request.user.username,
|
|
|
|
member_name)
|
|
|
|
except SearpcError, e:
|
|
|
|
return go_error(request, e.msg)
|
|
|
|
|
2012-05-18 05:52:25 +00:00
|
|
|
return HttpResponseRedirect(reverse('group_manage', args=[group_id]))
|
2012-05-15 02:59:16 +00:00
|
|
|
|
|
|
|
@login_required
|
|
|
|
def group_remove_member(request):
|
|
|
|
if request.method == 'POST':
|
|
|
|
group_id = request.POST.get('group_id')
|
|
|
|
member_name = request.POST.get('user_name')
|
|
|
|
if not validate_emailuser(member_name):
|
|
|
|
err_msg = u'用户不存在'
|
|
|
|
return go_error(request, err_msg)
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
group_id_int = int(group_id)
|
|
|
|
except ValueError:
|
2012-05-15 06:29:37 +00:00
|
|
|
return go_error(request, u'group id 不是有效参数')
|
2012-05-15 02:59:16 +00:00
|
|
|
try:
|
|
|
|
ccnet_rpc.group_remove_member(group_id_int, request.user.username,
|
|
|
|
member_name)
|
|
|
|
seafserv_threaded_rpc.remove_repo_group(group_id_int, member_name)
|
|
|
|
except SearpcError, e:
|
|
|
|
return go_error(request, e.msg)
|
|
|
|
|
2012-05-16 06:10:54 +00:00
|
|
|
return HttpResponseRedirect(reverse('group_manage', args=[group_id]))
|
2012-05-15 02:59:16 +00:00
|
|
|
|
|
|
|
@login_required
|
|
|
|
def group_quit(request):
|
|
|
|
group_id = request.GET.get('gid')
|
|
|
|
try:
|
|
|
|
group_id_int = int(group_id)
|
|
|
|
except ValueError:
|
2012-05-15 06:29:37 +00:00
|
|
|
return go_error(request, u'group id 不是有效参数')
|
|
|
|
|
2012-05-15 02:59:16 +00:00
|
|
|
try:
|
|
|
|
ccnet_rpc.quit_group(group_id_int, request.user.username)
|
|
|
|
seafserv_threaded_rpc.remove_repo_group(group_id_int, request.user.username)
|
|
|
|
except SearpcError, e:
|
|
|
|
return go_error(request, e.msg)
|
|
|
|
|
|
|
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
2012-05-15 06:29:37 +00:00
|
|
|
|
2012-05-16 06:10:54 +00:00
|
|
|
@login_required
|
|
|
|
def group_manage(request, group_id):
|
|
|
|
try:
|
|
|
|
group_id_int = int(group_id)
|
|
|
|
except ValueError:
|
|
|
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
|
|
|
|
|
|
|
# check whether user is the group staff
|
|
|
|
if not ccnet_rpc.check_group_staff(group_id_int, request.user.username):
|
|
|
|
return go_permission_error(request, u'只有小组管理员有权管理小组')
|
|
|
|
|
2012-05-17 15:50:04 +00:00
|
|
|
group = ccnet_rpc.get_group(group_id_int)
|
|
|
|
if not group:
|
|
|
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
|
|
|
|
2012-05-16 06:10:54 +00:00
|
|
|
members = ccnet_rpc.get_group_members(group_id_int)
|
2012-05-18 13:32:16 +00:00
|
|
|
|
|
|
|
contacts = Contact.objects.filter(user_email=request.user.username)
|
2012-05-16 06:10:54 +00:00
|
|
|
|
|
|
|
return render_to_response('group/group_manage.html', {
|
2012-05-17 15:50:04 +00:00
|
|
|
'group' : group,
|
2012-05-16 06:10:54 +00:00
|
|
|
'members': members,
|
2012-05-18 13:32:16 +00:00
|
|
|
'contacts': contacts,
|
2012-05-16 06:10:54 +00:00
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
2012-05-15 06:29:37 +00:00
|
|
|
def group_share_repo(request, repo_id, group_id, from_email):
|
|
|
|
"""
|
|
|
|
share a repo to a group
|
|
|
|
|
|
|
|
"""
|
|
|
|
# check whether group exists
|
|
|
|
group = ccnet_rpc.get_group(group_id)
|
|
|
|
if not group:
|
|
|
|
return go_error(request, u'共享失败:小组不存在')
|
|
|
|
|
|
|
|
# check whether user belong to the group
|
|
|
|
joined = False
|
|
|
|
groups = ccnet_rpc.get_groups(request.user.username)
|
|
|
|
for group in groups:
|
|
|
|
if group.props.id == group_id:
|
|
|
|
joined = True
|
|
|
|
if not joined:
|
|
|
|
return go_error(request, u'共享失败:未加入该小组')
|
|
|
|
|
2012-05-16 06:10:54 +00:00
|
|
|
if seafserv_threaded_rpc.group_share_repo(repo_id, group_id, from_email, 'rw') != 0:
|
2012-05-15 06:29:37 +00:00
|
|
|
return go_error(request, u'共享失败:内部错误')
|
|
|
|
|
|
|
|
def group_unshare_repo(request, repo_id, group_id, from_email):
|
|
|
|
"""
|
|
|
|
unshare a repo to a group
|
|
|
|
|
|
|
|
"""
|
|
|
|
# check whether group exists
|
|
|
|
group = ccnet_rpc.get_group(group_id)
|
|
|
|
if not group:
|
|
|
|
return go_error(request, u'共享失败:小组不存在')
|
|
|
|
|
|
|
|
# check whether user belong to the group
|
|
|
|
joined = False
|
|
|
|
groups = ccnet_rpc.get_groups(from_email)
|
|
|
|
for group in groups:
|
|
|
|
if group.props.id == group_id:
|
|
|
|
joined = True
|
|
|
|
if not joined:
|
|
|
|
return go_error(request, u'共享失败:未加入该小组')
|
|
|
|
|
|
|
|
# check whether user is group staff or the one share the repo
|
|
|
|
if not ccnet_rpc.check_group_staff(group_id, from_email) and \
|
|
|
|
seafserv_threaded_rpc.get_group_repo_share_from(repo_id) != from_email:
|
|
|
|
return go_permission_error(request, u'取消共享失败:只有小组管理员或共享目录发布者有权取消共享')
|
|
|
|
|
|
|
|
if seafserv_threaded_rpc.group_unshare_repo(repo_id, group_id, from_email) != 0:
|
|
|
|
return go_error(request, u'共享失败:内部错误')
|