1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-06-28 16:08:25 +00:00
seahub/group/views.py

492 lines
18 KiB
Python
Raw Normal View History

2012-05-15 02:59:16 +00:00
# encoding: utf-8
import simplejson as json
from django.core.urlresolvers import reverse
2012-08-08 12:16:00 +00:00
from django.http import HttpResponse, HttpResponseRedirect, Http404, \
HttpResponseBadRequest
2012-05-15 02:59:16 +00:00
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.template.loader import render_to_string
2012-02-11 03:12:54 +00:00
from auth.decorators import login_required
2012-08-08 12:16:00 +00:00
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \
get_repo, get_group_repoids, check_group_staff, get_commits, \
get_personal_groups, get_group, get_group_members
2012-05-15 02:59:16 +00:00
from pysearpc import SearpcError
from models import GroupMessage, MessageReply
from forms import MessageForm, MessageReplyForm
2012-06-27 08:39:49 +00:00
from signals import grpmsg_added, grpmsg_reply_added
from seahub.contacts.models import Contact
from seahub.contacts.signals import mail_sended
2012-06-25 13:40:18 +00:00
from seahub.notifications.models import UserNotification
from seahub.profile.models import Profile
2012-08-03 03:32:11 +00:00
from seahub.settings import SITE_ROOT
from seahub.utils import render_error, render_permission_error, \
validate_group_name, emails2list
from seahub.views import is_registered_user
2012-05-15 02:59:16 +00:00
@login_required
def group_list(request):
error_msg = None
if request.method == 'POST':
2012-05-22 13:42:29 +00:00
"""
Add new group.
"""
2012-05-15 02:59:16 +00:00
group_name = request.POST.get('group_name')
if not validate_group_name(group_name):
2012-07-30 12:44:32 +00:00
return render_error(request, u'小组名称只能包含中英文字符,数字及下划线')
2012-05-15 02:59:16 +00:00
try:
2012-06-25 12:42:19 +00:00
group_id = ccnet_threaded_rpc.create_group(group_name.encode('utf-8'),
2012-05-26 12:52:53 +00:00
request.user.username)
2012-05-15 02:59:16 +00:00
except SearpcError, e:
error_msg = e.msg
2012-07-30 12:44:32 +00:00
return render_error(request, error_msg)
2012-05-22 13:42:29 +00:00
2012-07-27 03:39:55 +00:00
groups = get_personal_groups(request.user.username);
2012-05-22 13:42:29 +00:00
return render_to_response("group/groups.html", {
"groups": groups,
}, context_instance=RequestContext(request))
2012-05-15 02:59:16 +00:00
2012-05-22 13:42:29 +00:00
@login_required
def group_remove(request, group_id):
2012-08-03 03:32:11 +00:00
"""
2012-08-04 03:00:04 +00:00
Remove group from groupadmin page. Only system admin can perform this
operation.
2012-08-03 03:32:11 +00:00
"""
2012-08-04 03:00:04 +00:00
# Check whether user is system admin.
if not request.user.is_staff:
return render_permission_error(request, u'只有管理员有权删除小组')
2012-08-03 03:32:11 +00:00
# Request header may missing HTTP_REFERER, we need to handle that case.
next = request.META.get('HTTP_REFERER', None)
if not next:
next = SITE_ROOT
2012-05-15 02:59:16 +00:00
try:
group_id_int = int(group_id)
except ValueError:
2012-08-03 03:32:11 +00:00
return HttpResponseRedirect(next)
2012-05-15 02:59:16 +00:00
try:
2012-06-25 12:42:19 +00:00
ccnet_threaded_rpc.remove_group(group_id_int, request.user.username)
2012-05-15 02:59:16 +00:00
seafserv_threaded_rpc.remove_repo_group(group_id_int, None)
2012-08-03 03:32:11 +00:00
except SearpcError, e:
return render_error(request, e.msg)
return HttpResponseRedirect(next)
@login_required
def group_dismiss(request, group_id):
"""
Dismiss a group, only group staff can perform this operation.
"""
next = request.META.get('HTTP_REFERER', None)
if not next:
next = SITE_ROOT
try:
group_id_int = int(group_id)
except ValueError:
return HttpResponseRedirect(next)
# Check whether user is group staff
user = request.user.username
if not ccnet_threaded_rpc.check_group_staff(group_id_int, user):
return render_permission_error(request, u'只有小组管理员有权解散小组')
try:
ccnet_threaded_rpc.remove_group(group_id_int, user)
seafserv_threaded_rpc.remove_repo_group(group_id_int, None)
2012-06-20 11:39:21 +00:00
if request.user.org:
2012-07-26 09:08:31 +00:00
org_id = request.user.org['org_id']
url_prefix = request.user.org['url_prefix']
ccnet_threaded_rpc.remove_org_group(org_id, group_id_int)
return HttpResponseRedirect(reverse('org_groups',
args=[url_prefix]))
2012-08-03 03:32:11 +00:00
2012-05-15 02:59:16 +00:00
except SearpcError, e:
2012-07-30 12:44:32 +00:00
return render_error(request, e.msg)
2012-08-03 03:32:11 +00:00
return HttpResponseRedirect(reverse('group_list'))
2012-05-15 02:59:16 +00:00
2012-05-22 13:42:29 +00:00
@login_required
def group_quit(request, group_id):
try:
group_id_int = int(group_id)
except ValueError:
2012-07-30 12:44:32 +00:00
return render_error(request, u'group id 不是有效参数')
2012-05-22 13:42:29 +00:00
try:
2012-06-25 12:42:19 +00:00
ccnet_threaded_rpc.quit_group(group_id_int, request.user.username)
2012-05-26 12:52:53 +00:00
seafserv_threaded_rpc.remove_repo_group(group_id_int,
request.user.username)
2012-05-22 13:42:29 +00:00
except SearpcError, e:
2012-07-30 12:44:32 +00:00
return render_error(request, e.msg)
2012-05-22 13:42:29 +00:00
return HttpResponseRedirect(reverse('group_list', args=[]))
2012-06-25 06:57:14 +00:00
def render_group_info(request, group_id, form):
2012-05-15 02:59:16 +00:00
try:
group_id_int = int(group_id)
except ValueError:
return HttpResponseRedirect(reverse('group_list', args=[]))
2012-05-26 12:52:53 +00:00
# Check whether user belong to the group or admin
joined = False
2012-06-25 12:42:19 +00:00
groups = ccnet_threaded_rpc.get_groups(request.user.username)
for group in groups:
if group.id == group_id_int:
joined = True
2012-07-09 06:23:46 +00:00
if not joined and not request.user.is_staff:
2012-07-30 12:44:32 +00:00
return render_error(request, u'未加入该小组')
2012-07-09 06:23:46 +00:00
# if request.user.org and not request.user.org.is_staff:
2012-07-30 12:44:32 +00:00
# return render_error(request, u'未加入该小组')
2012-07-09 06:23:46 +00:00
2012-08-01 14:45:58 +00:00
group = get_group(group_id)
2012-05-15 02:59:16 +00:00
if not group:
return HttpResponseRedirect(reverse('group_list', args=[]))
2012-05-15 06:43:52 +00:00
if check_group_staff(group.id, request.user):
2012-05-15 06:43:52 +00:00
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
2012-08-08 12:16:00 +00:00
members = get_group_members(group_id_int)
managers = []
common_members = []
for member in members:
2012-06-21 12:53:13 +00:00
# member.short_username = member.user_name.split('@')[0]
if member.is_staff == 1:
2012-05-17 06:11:22 +00:00
managers.append(member)
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-06-28 12:02:17 +00:00
2012-05-15 02:59:16 +00:00
repo.share_from = seafserv_threaded_rpc.get_group_repo_share_from(repo_id)
2012-06-28 12:07:39 +00:00
repo.share_from_me = True if request.user.username == repo.share_from else False
2012-06-28 12:02:17 +00:00
2012-06-28 08:58:09 +00:00
try:
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
except:
repo.latest_modify = None
2012-05-15 02:59:16 +00:00
repos.append(repo)
2012-06-28 12:02:17 +00:00
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
2012-05-15 02:59:16 +00:00
2012-06-25 13:40:18 +00:00
# remove user notifications
2012-06-26 06:20:37 +00:00
UserNotification.objects.filter(to_user=request.user.username,
msg_type='group_msg',
2012-06-25 13:40:18 +00:00
detail=str(group_id)).delete()
2012-06-25 06:57:14 +00:00
"""group messages"""
# Make sure page request is an int. If not, deliver first page.
try:
current_page = int(request.GET.get('page', '1'))
per_page= int(request.GET.get('per_page', '15'))
except ValueError:
current_page = 1
per_page = 15
msgs_plus_one = GroupMessage.objects.filter(group_id=group_id).order_by('-timestamp')[per_page*(current_page-1) : per_page*current_page+1]
if len(msgs_plus_one) == per_page + 1:
page_next = True
else:
page_next = False
group_msgs = msgs_plus_one[:per_page]
for msg in group_msgs:
2012-07-24 05:59:18 +00:00
msg.reply_cnt = len(MessageReply.objects.filter(reply_to=msg))
2012-06-25 06:57:14 +00:00
2012-05-15 02:59:16 +00:00
return render_to_response("group/group_info.html", {
"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-26 12:52:53 +00:00
"is_join": joined,
2012-06-25 06:57:14 +00:00
"group_msgs": group_msgs,
"form": form,
'current_page': current_page,
'prev_page': current_page-1,
'next_page': current_page+1,
'per_page': per_page,
'page_next': page_next,
2012-05-15 02:59:16 +00:00
}, context_instance=RequestContext(request));
2012-06-25 06:57:14 +00:00
@login_required
def msg_reply(request, msg_id):
"""Show group message replies, and process message reply in ajax"""
2012-08-08 12:16:00 +00:00
content_type = 'application/json; charset=utf-8'
2012-06-25 06:57:14 +00:00
if request.is_ajax():
if request.method == 'POST':
2012-06-27 03:27:00 +00:00
form = MessageReplyForm(request.POST)
2012-06-25 06:57:14 +00:00
# TODO: invalid form
if form.is_valid():
msg = form.cleaned_data['message']
try:
group_msg = GroupMessage.objects.get(id=msg_id)
except GroupMessage.DoesNotExist:
2012-08-08 12:16:00 +00:00
return HttpResponseBadRequest(content_type=content_type)
2012-06-25 06:57:14 +00:00
msg_reply = MessageReply()
msg_reply.reply_to = group_msg
msg_reply.from_email = request.user.username
msg_reply.message = msg
msg_reply.save()
2012-06-27 08:39:49 +00:00
# send signal if reply other's message
if group_msg.from_email != request.user.username:
grpmsg_reply_added.send(sender=MessageReply,
msg_id=msg_id,
from_email=request.user.username)
2012-06-25 06:57:14 +00:00
try:
msg = GroupMessage.objects.get(id=msg_id)
except GroupMessage.DoesNotExist:
raise HttpResponse(status=400)
ctx = {}
replies = MessageReply.objects.filter(reply_to=msg)
for e in replies:
try:
p = Profile.objects.get(user=e.from_email)
e.nickname = p.nickname
except Profile.DoesNotExist:
e.nickname = e.from_email.split('@')[0]
ctx['replies'] = replies
ctx['msg'] = msg
html = render_to_string("group/group_reply_list.html", ctx)
serialized_data = json.dumps({"html": html,
"reply_cnt": len(replies)})
return HttpResponse(serialized_data, content_type=content_type)
2012-06-25 06:57:14 +00:00
else:
return HttpResponseBadRequest(content_type=content_type)
2012-06-25 06:57:14 +00:00
2012-06-27 08:39:49 +00:00
@login_required
def msg_reply_new(request):
grpmsg_reply_list = []
notes = UserNotification.objects.filter(to_user=request.user.username)
for n in notes:
if n.msg_type == 'grpmsg_reply':
grpmsg_reply_list.append(n.detail)
group_msgs = []
for msg_id in grpmsg_reply_list:
try:
m = GroupMessage.objects.get(id=msg_id)
2012-06-27 11:56:11 +00:00
# get group name
2012-08-01 14:45:58 +00:00
group = get_group(m.group_id)
if not group:
continue
2012-06-27 11:56:11 +00:00
m.group_name = group.group_name
2012-06-27 08:39:49 +00:00
# get message replies
reply_list = MessageReply.objects.filter(reply_to=m)
# get nickname
for reply in reply_list:
try:
p = Profile.objects.get(user=reply.from_email)
reply.nickname = p.nickname
except Profile.DoesNotExist:
reply.nickname = reply.from_email
m.reply_list = reply_list
group_msgs.append(m)
except GroupMessage.DoesNotExist:
continue
# remove new group msg reply notification
UserNotification.objects.filter(to_user=request.user.username,
msg_type='grpmsg_reply').delete()
return render_to_response("group/new_msg_reply.html", {
'group_msgs': group_msgs,
}, context_instance=RequestContext(request))
2012-06-25 06:57:14 +00:00
@login_required
def group_info(request, group_id):
if request.method == 'POST':
form = MessageForm(request.POST)
if form.is_valid():
msg = form.cleaned_data['message']
message = GroupMessage()
message.group_id = group_id
message.from_email = request.user.username
message.message = msg
message.save()
2012-06-25 13:40:18 +00:00
2012-06-25 06:57:14 +00:00
# clear form data
form = MessageForm()
2012-06-26 06:20:37 +00:00
# send signal
grpmsg_added.send(sender=GroupMessage, group_id=group_id,
from_email=request.user.username)
2012-06-25 06:57:14 +00:00
else:
form = MessageForm()
op = request.GET.get('op', '')
if op == 'delete':
return group_remove(request, group_id)
2012-08-03 03:32:11 +00:00
elif op == 'dismiss':
return group_dismiss(request, group_id)
2012-06-25 06:57:14 +00:00
elif op == 'quit':
return group_quit(request, group_id)
return render_group_info(request, group_id, form)
2012-05-15 02:59:16 +00:00
@login_required
2012-05-22 13:42:29 +00:00
def group_members(request, group_id):
try:
group_id_int = int(group_id)
except ValueError:
2012-07-30 12:44:32 +00:00
return render_error(request, u'group id 不是有效参数')
if not check_group_staff(group_id_int, request.user):
2012-07-30 12:44:32 +00:00
return render_permission_error(request, u'只有小组管理员有权管理小组')
2012-08-01 14:45:58 +00:00
group = get_group(group_id)
2012-05-17 15:50:04 +00:00
if not group:
return HttpResponseRedirect(reverse('group_list', args=[]))
2012-05-22 13:42:29 +00:00
if request.method == 'POST':
"""
Add group members.
"""
member_name_str = request.POST.get('user_name', '')
member_list = emails2list(member_name_str)
2012-06-20 11:39:21 +00:00
if request.user.org:
for member_name in member_list:
# Add email to contacts
mail_sended.send(sender=None, user=request.user.username,
email=member_name)
2012-08-03 03:32:11 +00:00
if not ccnet_threaded_rpc.org_user_exists(request.user.org['org_id'],
2012-06-20 11:39:21 +00:00
member_name):
err_msg = u'无法添加成员,当前企业不存在 %s 用户' % member_name
2012-07-30 12:44:32 +00:00
return render_error(request, err_msg)
2012-06-20 11:39:21 +00:00
else:
try:
2012-06-25 12:42:19 +00:00
ccnet_threaded_rpc.group_add_member(group_id_int,
2012-06-20 11:39:21 +00:00
request.user.username,
member_name)
except SearpcError, e:
2012-07-30 12:44:32 +00:00
return render_error(request, e.msg)
2012-06-20 11:39:21 +00:00
else:
for member_name in member_list:
# Add email to contacts
mail_sended.send(sender=None, user=request.user.username,
email=member_name)
if not is_registered_user(member_name):
err_msg = u'无法添加成员,用户 %s 不存在' % member_name
2012-07-30 12:44:32 +00:00
return render_error(request, err_msg)
2012-06-20 11:39:21 +00:00
else:
try:
2012-06-25 12:42:19 +00:00
ccnet_threaded_rpc.group_add_member(group_id_int,
2012-06-20 11:39:21 +00:00
request.user.username,
member_name)
except SearpcError, e:
2012-07-30 12:44:32 +00:00
return render_error(request, e.msg)
2012-05-22 13:42:29 +00:00
2012-06-25 12:42:19 +00:00
members = ccnet_threaded_rpc.get_group_members(group_id_int)
contacts = Contact.objects.filter(user_email=request.user.username)
return render_to_response('group/group_manage.html', {
2012-05-17 15:50:04 +00:00
'group' : group,
'members': members,
'contacts': contacts,
}, context_instance=RequestContext(request))
2012-05-22 13:42:29 +00:00
@login_required
def group_member_operations(request, group_id, user_name):
if request.GET.get('op','') == 'delete':
return group_remove_member(request, group_id, user_name)
else:
return HttpResponseRedirect(reverse('group_members', args=[group_id]))
@login_required
def group_remove_member(request, group_id, user_name):
try:
group_id_int = int(group_id)
except ValueError:
2012-07-30 12:44:32 +00:00
return render_error(request, u'group id 不是有效参数')
2012-05-22 13:42:29 +00:00
if not check_group_staff(group_id_int, request.user):
2012-07-30 12:44:32 +00:00
return render_permission_error(request, u'只有小组管理员有权删除成员')
2012-05-22 13:42:29 +00:00
try:
ccnet_threaded_rpc.group_remove_member(group_id_int,
request.user.username,
user_name)
seafserv_threaded_rpc.remove_repo_group(group_id_int, user_name)
except SearpcError, e:
2012-07-30 12:44:32 +00:00
return render_error(request, e.msg)
2012-05-22 13:42:29 +00:00
return HttpResponseRedirect(reverse('group_members', args=[group_id]))
2012-05-15 06:29:37 +00:00
def group_share_repo(request, repo_id, group_id, from_email):
"""
2012-05-22 13:42:29 +00:00
Share a repo to a group.
2012-05-15 06:29:37 +00:00
"""
2012-05-22 13:42:29 +00:00
# Check whether group exists
2012-08-01 14:45:58 +00:00
group = get_group(group_id)
2012-05-15 06:29:37 +00:00
if not group:
2012-07-30 12:44:32 +00:00
return render_error(request, u'共享失败:小组不存在')
2012-05-15 06:29:37 +00:00
2012-05-22 13:42:29 +00:00
# Check whether user belong to the group
2012-05-15 06:29:37 +00:00
joined = False
2012-06-25 12:42:19 +00:00
groups = ccnet_threaded_rpc.get_groups(request.user.username)
2012-05-15 06:29:37 +00:00
for group in groups:
if group.props.id == group_id:
joined = True
if not joined:
2012-07-30 12:44:32 +00:00
return render_error(request, u'共享失败:未加入该小组')
2012-05-15 06:29:37 +00:00
if seafserv_threaded_rpc.group_share_repo(repo_id, group_id, from_email, 'rw') != 0:
2012-07-30 12:44:32 +00:00
return render_error(request, u'共享失败:内部错误')
2012-05-15 06:29:37 +00:00
def group_unshare_repo(request, repo_id, group_id, from_email):
"""
unshare a repo to a group
"""
2012-05-22 13:42:29 +00:00
# Check whether group exists
2012-08-01 14:45:58 +00:00
group = get_group(group_id)
2012-05-15 06:29:37 +00:00
if not group:
2012-07-30 12:44:32 +00:00
return render_error(request, u'共享失败:小组不存在')
2012-05-15 06:29:37 +00:00
2012-05-22 13:42:29 +00:00
# Check whether user belong to the group
2012-05-15 06:29:37 +00:00
joined = False
2012-06-25 12:42:19 +00:00
groups = ccnet_threaded_rpc.get_groups(from_email)
2012-05-15 06:29:37 +00:00
for group in groups:
if group.props.id == group_id:
joined = True
if not joined:
2012-07-30 12:44:32 +00:00
return render_error(request, u'共享失败:未加入该小组')
2012-05-15 06:29:37 +00:00
2012-05-22 13:42:29 +00:00
# Check whether user is group staff or the one share the repo
if not check_group_staff(group_id, from_email) and \
2012-05-15 06:29:37 +00:00
seafserv_threaded_rpc.get_group_repo_share_from(repo_id) != from_email:
2012-07-30 12:44:32 +00:00
return render_permission_error(request, u'取消共享失败:只有小组管理员或共享目录发布者有权取消共享')
2012-05-15 06:29:37 +00:00
if seafserv_threaded_rpc.group_unshare_repo(repo_id, group_id, from_email) != 0:
2012-07-30 12:44:32 +00:00
return render_error(request, u'共享失败:内部错误')