2012-05-15 02:59:16 +00:00
|
|
|
# encoding: utf-8
|
2012-08-13 13:26:58 +00:00
|
|
|
import os
|
2012-06-26 14:01:36 +00:00
|
|
|
import simplejson as json
|
2012-05-20 12:32:21 +00:00
|
|
|
from django.core.urlresolvers import reverse
|
2012-08-10 13:16:55 +00:00
|
|
|
from django.contrib import messages
|
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
|
2012-08-09 08:36:11 +00:00
|
|
|
from django.template.loader import render_to_string
|
2012-02-11 03:12:54 +00:00
|
|
|
|
2012-05-20 12:32:21 +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, \
|
2012-08-30 12:15:17 +00:00
|
|
|
get_repo, get_group_repos, check_group_staff, get_commits, \
|
|
|
|
get_personal_groups, get_group, get_group_members, create_org_repo, \
|
|
|
|
get_org_group_repos
|
2012-05-15 02:59:16 +00:00
|
|
|
from pysearpc import SearpcError
|
|
|
|
|
2012-08-10 13:16:55 +00:00
|
|
|
from models import GroupMessage, MessageReply, MessageAttachment
|
2012-08-13 07:58:54 +00:00
|
|
|
from forms import MessageForm, MessageReplyForm, GroupRecommendForm
|
2012-06-27 08:39:49 +00:00
|
|
|
from signals import grpmsg_added, grpmsg_reply_added
|
2012-08-31 09:28:50 +00:00
|
|
|
from base.decorators import ctx_switch_required
|
2012-05-18 13:32:16 +00:00
|
|
|
from seahub.contacts.models import Contact
|
2012-07-31 06:58:47 +00:00
|
|
|
from seahub.contacts.signals import mail_sended
|
2012-06-25 13:40:18 +00:00
|
|
|
from seahub.notifications.models import UserNotification
|
2012-06-26 12:48:46 +00:00
|
|
|
from seahub.profile.models import Profile
|
2012-08-03 03:32:11 +00:00
|
|
|
from seahub.settings import SITE_ROOT
|
2012-08-10 13:16:55 +00:00
|
|
|
from seahub.shortcuts import get_first_object_or_none
|
2012-07-31 06:58:47 +00:00
|
|
|
from seahub.utils import render_error, render_permission_error, \
|
2012-08-30 12:15:17 +00:00
|
|
|
validate_group_name, string2list, check_and_get_org_by_group
|
2012-08-07 08:48:26 +00:00
|
|
|
from seahub.views import is_registered_user
|
2012-08-18 09:25:08 +00:00
|
|
|
from seahub.forms import RepoCreateForm
|
2012-05-18 13:32:16 +00:00
|
|
|
|
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')
|
2012-05-16 06:10:54 +00:00
|
|
|
if not validate_group_name(group_name):
|
2012-07-30 12:44:32 +00:00
|
|
|
return render_error(request, u'小组名称只能包含中英文字符,数字及下划线')
|
2012-05-16 06:10:54 +00:00
|
|
|
|
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-16 06:10:54 +00:00
|
|
|
|
2012-05-26 12:52:53 +00:00
|
|
|
# Check whether user belong to the group or admin
|
2012-05-16 06:10:54 +00:00
|
|
|
joined = False
|
2012-06-25 12:42:19 +00:00
|
|
|
groups = ccnet_threaded_rpc.get_groups(request.user.username)
|
2012-05-16 06:10:54 +00:00
|
|
|
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-08-31 11:37:22 +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
|
|
|
|
2012-05-26 07:31:35 +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)
|
2012-05-16 13:33:35 +00:00
|
|
|
managers = []
|
|
|
|
common_members = []
|
2012-05-16 06:10:54 +00:00
|
|
|
for member in members:
|
2012-06-21 12:53:13 +00:00
|
|
|
# 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-08-31 09:28:50 +00:00
|
|
|
|
|
|
|
org = request.user.org
|
2012-08-30 12:15:17 +00:00
|
|
|
if org:
|
|
|
|
repos = get_org_group_repos(org.org_id, group_id_int,
|
|
|
|
request.user.username)
|
|
|
|
else:
|
|
|
|
repos = get_group_repos(group_id_int, request.user.username)
|
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,
|
2012-06-26 10:09:36 +00:00
|
|
|
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
|
|
|
|
|
2012-08-14 09:53:58 +00:00
|
|
|
msgs_plus_one = GroupMessage.objects.filter(\
|
|
|
|
group_id=group_id).order_by(\
|
|
|
|
'-timestamp')[per_page*(current_page-1) : per_page*current_page+1]
|
2012-06-25 06:57:14 +00:00
|
|
|
|
2012-08-26 09:29:29 +00:00
|
|
|
if len(msgs_plus_one) == per_page + 1:
|
2012-06-25 06:57:14 +00:00
|
|
|
page_next = True
|
|
|
|
else:
|
|
|
|
page_next = False
|
|
|
|
|
|
|
|
group_msgs = msgs_plus_one[:per_page]
|
2012-08-15 09:39:59 +00:00
|
|
|
attachments = MessageAttachment.objects.filter(group_message__in=group_msgs)
|
|
|
|
|
|
|
|
reply_to_list = []
|
|
|
|
msg_replies = MessageReply.objects.filter(reply_to__in=group_msgs)
|
|
|
|
for r in msg_replies:
|
|
|
|
reply_to_list.append(r.reply_to_id)
|
|
|
|
|
2012-06-25 06:57:14 +00:00
|
|
|
for msg in group_msgs:
|
2012-08-15 09:39:59 +00:00
|
|
|
msg.reply_cnt = reply_to_list.count(msg.id)
|
|
|
|
|
2012-08-15 09:24:47 +00:00
|
|
|
for att in attachments:
|
|
|
|
if msg.id == att.group_message_id:
|
|
|
|
# Attachment name is file name or directory name.
|
|
|
|
# If is top directory, use repo name instead.
|
|
|
|
path = att.path
|
|
|
|
if path == '/':
|
|
|
|
repo = get_repo(att.repo_id)
|
|
|
|
if not repo:
|
|
|
|
# TODO: what should we do here, tell user the repo
|
|
|
|
# is no longer exists?
|
|
|
|
continue
|
|
|
|
att.name = repo.name
|
|
|
|
else:
|
|
|
|
# cut out last '/'
|
|
|
|
if path[-1] == '/':
|
|
|
|
path = path[:-1]
|
|
|
|
att.name = os.path.basename(path)
|
|
|
|
msg.attachment = att
|
|
|
|
|
2012-05-15 02:59:16 +00:00
|
|
|
return render_to_response("group/group_info.html", {
|
2012-05-16 13:33:35 +00:00
|
|
|
"managers": managers,
|
|
|
|
"common_members": common_members,
|
2012-08-19 05:36:32 +00:00
|
|
|
"members": 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-08-18 10:00:21 +00:00
|
|
|
'url': reverse('create_group_repo', args=[group_id]),
|
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():
|
2012-08-16 12:20:41 +00:00
|
|
|
ctx = {}
|
2012-06-25 06:57:14 +00:00
|
|
|
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-26 12:48:46 +00:00
|
|
|
|
2012-08-16 12:20:41 +00:00
|
|
|
ctx['reply'] = msg_reply
|
|
|
|
html = render_to_string("group/group_reply_new.html", ctx)
|
|
|
|
|
2012-08-14 08:33:16 +00:00
|
|
|
else:
|
2012-08-16 12:20:41 +00:00
|
|
|
try:
|
|
|
|
msg = GroupMessage.objects.get(id=msg_id)
|
|
|
|
except GroupMessage.DoesNotExist:
|
|
|
|
raise HttpResponse(status=400)
|
|
|
|
|
2012-08-14 08:33:16 +00:00
|
|
|
replies = MessageReply.objects.filter(reply_to=msg)
|
|
|
|
ctx['replies'] = replies
|
2012-08-16 12:20:41 +00:00
|
|
|
html = render_to_string("group/group_reply_list.html", ctx)
|
2012-08-14 08:33:16 +00:00
|
|
|
|
|
|
|
serialized_data = json.dumps({"html": html})
|
2012-08-09 08:36:11 +00:00
|
|
|
return HttpResponse(serialized_data, content_type=content_type)
|
2012-06-25 06:57:14 +00:00
|
|
|
else:
|
2012-08-09 08:36:11 +00:00
|
|
|
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-08-16 09:54:21 +00:00
|
|
|
except GroupMessage.DoesNotExist:
|
|
|
|
continue
|
|
|
|
else:
|
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-08-16 09:13:03 +00:00
|
|
|
# get attachement
|
|
|
|
attachment = get_first_object_or_none(m.messageattachment_set.all())
|
|
|
|
if attachment:
|
|
|
|
path = attachment.path
|
|
|
|
if path == '/':
|
|
|
|
repo = get_repo(attachment.repo_id)
|
|
|
|
if not repo:
|
|
|
|
continue
|
|
|
|
attachment.name = repo.name
|
|
|
|
else:
|
|
|
|
attachment.name = os.path.basename(path)
|
|
|
|
m.attachment = attachment
|
|
|
|
|
2012-06-27 08:39:49 +00:00
|
|
|
# get message replies
|
|
|
|
reply_list = MessageReply.objects.filter(reply_to=m)
|
|
|
|
|
|
|
|
m.reply_list = reply_list
|
2012-08-16 09:54:21 +00:00
|
|
|
m.reply_cnt = reply_list.count()
|
2012-06-27 08:39:49 +00:00
|
|
|
group_msgs.append(m)
|
|
|
|
|
|
|
|
# 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
|
2012-08-31 09:28:50 +00:00
|
|
|
@ctx_switch_required
|
2012-06-25 06:57:14 +00:00
|
|
|
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-26 06:20:37 +00:00
|
|
|
# send signal
|
|
|
|
grpmsg_added.send(sender=GroupMessage, group_id=group_id,
|
|
|
|
from_email=request.user.username)
|
2012-08-16 11:11:28 +00:00
|
|
|
# Always return an HttpResponseRedirect after successfully dealing
|
|
|
|
# with POST data.
|
|
|
|
return HttpResponseRedirect(reverse('group_info', args=[group_id]))
|
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-08-31 09:28:50 +00:00
|
|
|
@ctx_switch_required
|
2012-05-22 13:42:29 +00:00
|
|
|
def group_members(request, group_id):
|
2012-05-16 06:10:54 +00:00
|
|
|
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-16 06:10:54 +00:00
|
|
|
|
2012-05-26 07:31:35 +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-16 06:10:54 +00:00
|
|
|
|
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', '')
|
2012-07-31 06:58:47 +00:00
|
|
|
|
2012-08-10 13:16:55 +00:00
|
|
|
member_list = string2list(member_name_str)
|
2012-05-18 13:32:16 +00:00
|
|
|
|
2012-06-20 11:39:21 +00:00
|
|
|
if request.user.org:
|
2012-07-31 06:58:47 +00:00
|
|
|
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):
|
2012-08-03 06:00:43 +00:00
|
|
|
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:
|
2012-07-31 06:58:47 +00:00
|
|
|
for member_name in member_list:
|
|
|
|
# Add email to contacts
|
|
|
|
mail_sended.send(sender=None, user=request.user.username,
|
|
|
|
email=member_name)
|
|
|
|
|
2012-08-07 08:48:26 +00:00
|
|
|
if not is_registered_user(member_name):
|
2012-08-03 06:00:43 +00:00
|
|
|
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)
|
2012-05-18 13:32:16 +00:00
|
|
|
contacts = Contact.objects.filter(user_email=request.user.username)
|
2012-08-30 12:15:17 +00:00
|
|
|
|
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-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
|
|
|
|
2012-05-26 07:31:35 +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
|
|
|
|
2012-07-09 02:37:42 +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
|
|
|
|
2012-05-16 06:10:54 +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
|
2012-05-26 07:31:35 +00:00
|
|
|
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'共享失败:内部错误')
|
2012-08-10 13:16:55 +00:00
|
|
|
|
|
|
|
@login_required
|
|
|
|
def group_recommend(request):
|
|
|
|
"""
|
2012-08-13 07:58:54 +00:00
|
|
|
Recommend a file or directory to a group.
|
2012-08-10 13:16:55 +00:00
|
|
|
"""
|
|
|
|
if request.method != 'POST':
|
|
|
|
raise Http404
|
|
|
|
|
|
|
|
next = request.META.get('HTTP_REFERER', None)
|
|
|
|
if not next:
|
|
|
|
next = SITE_ROOT
|
|
|
|
|
2012-08-13 07:58:54 +00:00
|
|
|
form = GroupRecommendForm(request.POST)
|
2012-08-10 13:16:55 +00:00
|
|
|
if form.is_valid():
|
|
|
|
groups = form.cleaned_data['groups']
|
|
|
|
repo_id = form.cleaned_data['repo_id']
|
2012-08-13 07:58:54 +00:00
|
|
|
attach_type = form.cleaned_data['attach_type']
|
|
|
|
path = form.cleaned_data['path']
|
2012-08-10 13:16:55 +00:00
|
|
|
message = form.cleaned_data['message']
|
|
|
|
|
|
|
|
group_list = string2list(groups)
|
|
|
|
for e in group_list:
|
|
|
|
group_name = e.split(' ')[0]
|
|
|
|
try:
|
|
|
|
group_creator = e.split(' ')[1]
|
|
|
|
except IndexError:
|
|
|
|
messages.add_message(request, messages.ERROR,
|
2012-08-10 16:03:59 +00:00
|
|
|
u'推荐到 %s 失败,请检查小组名称。' % \
|
2012-08-10 13:16:55 +00:00
|
|
|
group_name)
|
|
|
|
continue
|
|
|
|
|
|
|
|
# get all the groups the user joined
|
|
|
|
groups = get_personal_groups(request.user.username)
|
|
|
|
find = False
|
|
|
|
for group in groups:
|
|
|
|
# for every group that user joined, if group name and
|
|
|
|
# group creator matchs, then has find the group
|
|
|
|
if group.group_name == group_name and \
|
|
|
|
group_creator.find(group.creator_name) >= 0:
|
|
|
|
find = True
|
|
|
|
# save message to group
|
|
|
|
gm = GroupMessage(group_id=int(group.id),
|
|
|
|
from_email=request.user.username,
|
|
|
|
message=message)
|
|
|
|
gm.save()
|
|
|
|
|
2012-08-16 09:54:21 +00:00
|
|
|
# send signal
|
|
|
|
grpmsg_added.send(sender=GroupMessage, group_id=group.id,
|
|
|
|
from_email=request.user.username)
|
|
|
|
|
2012-08-10 13:16:55 +00:00
|
|
|
# save attachment
|
|
|
|
ma = MessageAttachment(group_message=gm, repo_id=repo_id,
|
2012-08-26 03:48:43 +00:00
|
|
|
attach_type=attach_type, path=path,
|
|
|
|
src='recommend')
|
2012-08-10 13:16:55 +00:00
|
|
|
ma.save()
|
2012-08-13 08:26:22 +00:00
|
|
|
|
2012-08-14 05:27:27 +00:00
|
|
|
group_url = reverse('group_info', args=[group.id])
|
|
|
|
msg = u'推荐到 <a href="%s" target="_blank">%s</a> 成功。' %\
|
|
|
|
(group_url, group_name)
|
2012-08-13 07:58:54 +00:00
|
|
|
messages.add_message(request, messages.INFO, msg)
|
2012-08-10 13:16:55 +00:00
|
|
|
break
|
|
|
|
if not find:
|
|
|
|
messages.add_message(request, messages.ERROR,
|
|
|
|
u'推荐到 %s 失败,请检查是否参加了该小组。' % \
|
|
|
|
group_name)
|
|
|
|
else:
|
|
|
|
# TODO: need more clear error message
|
|
|
|
messages.add_message(request, messages.ERROR, '推荐失败')
|
2012-08-30 12:15:17 +00:00
|
|
|
return HttpResponseRedirect(next)
|
2012-08-18 09:25:08 +00:00
|
|
|
|
|
|
|
@login_required
|
|
|
|
def create_group_repo(request, group_id):
|
|
|
|
"""Create a repo and share it to current group"""
|
|
|
|
|
|
|
|
content_type = 'application/json; charset=utf-8'
|
|
|
|
|
|
|
|
def json_error(err_msg):
|
|
|
|
result = {'error': [err_msg]}
|
|
|
|
return HttpResponseBadRequest(json.dumps(result),
|
|
|
|
content_type=content_type)
|
|
|
|
group_id = int(group_id)
|
|
|
|
if not get_group(group_id):
|
2012-08-30 12:15:17 +00:00
|
|
|
return json_error(u'创建失败:小组不存在')
|
2012-08-18 09:25:08 +00:00
|
|
|
|
|
|
|
# Check whether user belong to the group
|
|
|
|
groups = ccnet_threaded_rpc.get_groups(request.user.username)
|
|
|
|
for group in groups:
|
|
|
|
if group.props.id == group_id:
|
|
|
|
break
|
|
|
|
else:
|
2012-08-30 12:15:17 +00:00
|
|
|
return json_error(u"创建失败:未加入该小组")
|
2012-08-18 09:25:08 +00:00
|
|
|
|
|
|
|
form = RepoCreateForm(request.POST)
|
|
|
|
if not form.is_valid():
|
|
|
|
return json_error(form.errors)
|
|
|
|
else:
|
|
|
|
repo_name = form.cleaned_data['repo_name']
|
|
|
|
repo_desc = form.cleaned_data['repo_desc']
|
|
|
|
encrypted = form.cleaned_data['encryption']
|
|
|
|
passwd = form.cleaned_data['passwd']
|
|
|
|
user = request.user.username
|
|
|
|
|
2012-09-01 03:54:59 +00:00
|
|
|
org, base_template = check_and_get_org_by_group(group_id, user)
|
2012-08-30 12:15:17 +00:00
|
|
|
if org:
|
|
|
|
# create group repo in org context
|
|
|
|
try:
|
|
|
|
repo_id = create_org_repo(repo_name, repo_desc, user, passwd,
|
|
|
|
org.org_id)
|
|
|
|
except:
|
|
|
|
repo_id = None
|
|
|
|
if not repo_id:
|
|
|
|
return json_error(u"创建目录失败")
|
2012-08-18 09:25:08 +00:00
|
|
|
|
2012-08-30 12:15:17 +00:00
|
|
|
try:
|
|
|
|
status = seafserv_threaded_rpc.add_org_group_repo(repo_id,
|
|
|
|
org.org_id,
|
|
|
|
group_id,
|
|
|
|
user, 'rw')
|
|
|
|
except SearpcError, e:
|
|
|
|
status = -1
|
|
|
|
|
|
|
|
# if share failed, remove the newly created repo
|
|
|
|
if status != 0:
|
|
|
|
seafserv_threaded_rpc.remove_repo(repo_id)
|
|
|
|
return json_error(u'创建目录失败:内部错误')
|
|
|
|
else:
|
|
|
|
result = {'success': True}
|
|
|
|
return HttpResponse(json.dumps(result),
|
|
|
|
content_type=content_type)
|
2012-08-18 09:25:08 +00:00
|
|
|
else:
|
2012-08-30 12:15:17 +00:00
|
|
|
# create group repo in user context
|
|
|
|
try:
|
|
|
|
repo_id = seafserv_threaded_rpc.create_repo(repo_name,
|
|
|
|
repo_desc,
|
|
|
|
user, passwd)
|
|
|
|
except:
|
|
|
|
repo_id = None
|
|
|
|
if not repo_id:
|
|
|
|
return json_error(u"创建目录失败")
|
|
|
|
|
|
|
|
try:
|
|
|
|
status = seafserv_threaded_rpc.group_share_repo(repo_id,
|
|
|
|
group_id,
|
|
|
|
user, 'rw')
|
|
|
|
except SearpcError, e:
|
|
|
|
status = -1
|
|
|
|
|
|
|
|
# if share failed, remove the newly created repo
|
2012-08-18 09:25:08 +00:00
|
|
|
if status != 0:
|
|
|
|
seafserv_threaded_rpc.remove_repo(repo_id)
|
2012-08-30 12:15:17 +00:00
|
|
|
return json_error(u'创建目录失败:内部错误')
|
2012-08-18 09:25:08 +00:00
|
|
|
else:
|
|
|
|
result = {'success': True}
|
|
|
|
return HttpResponse(json.dumps(result),
|
|
|
|
content_type=content_type)
|