1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-11 11:51:27 +00:00

Allow share repo to unjoined group

This commit is contained in:
xiez
2012-09-22 17:46:56 +08:00
parent 393b43f157
commit b16b7ece18
11 changed files with 101 additions and 129 deletions

View File

@@ -32,7 +32,7 @@ from pysearpc import SearpcError
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, \ from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, \
get_repo, get_commits, get_branches, \ get_repo, get_commits, get_branches, \
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, \ seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, \
check_group_staff, check_permission, get_personal_groups, get_group_repos check_group_staff, check_permission, get_personal_groups_by_user, get_group_repos
from seahub.utils import list_to_string, \ from seahub.utils import list_to_string, \
get_httpserver_root, gen_token, \ get_httpserver_root, gen_token, \
@@ -290,7 +290,7 @@ class ReposView(ResponseMixin, View):
} }
repos_json.append(repo) repos_json.append(repo)
groups = get_personal_groups(email) groups = get_personal_groups_by_user(email)
for group in groups: for group in groups:
g_repos = get_group_repos(group.id, email) g_repos = get_group_repos(group.id, email)
calculate_repo_info (g_repos, email) calculate_repo_info (g_repos, email)

View File

@@ -20,11 +20,11 @@ msgstr ""
#: error_msg.py:7 #: error_msg.py:7
msgid "The group has already created" msgid "The group has already created"
msgstr "该小组已经存在。" msgstr "名称重复,请重新输入。"
#: error_msg.py:8 #: error_msg.py:8
msgid "Failed to create group" msgid "Failed to create group"
msgstr "创建小组失败。" msgstr "创建失败。"
#: error_msg.py:11 #: error_msg.py:11
msgid "The group has already created in this org." msgid "The group has already created in this org."

View File

@@ -18,8 +18,9 @@ from django.views.generic.edit import BaseFormView, FormMixin
from auth.decorators import login_required from auth.decorators import login_required
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \ from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \
get_repo, get_group_repos, check_group_staff, get_commits, is_group_user, \ get_repo, get_group_repos, check_group_staff, get_commits, is_group_user, \
get_personal_groups, get_group, get_group_members, create_org_repo, \ get_personal_groups_by_user, get_group, get_group_members, \
get_org_group_repos, get_org_groups_by_user get_personal_groups, create_org_repo, get_org_group_repos, \
get_org_groups_by_user
from pysearpc import SearpcError from pysearpc import SearpcError
from models import GroupMessage, MessageReply, MessageAttachment, BusinessGroup from models import GroupMessage, MessageReply, MessageAttachment, BusinessGroup
@@ -98,68 +99,68 @@ class GroupListView(LoginRequiredMixin, GroupMixin, TemplateResponseMixin,
return FormMixin.form_invalid(self, form) return FormMixin.form_invalid(self, form)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs['groups'] = get_personal_groups(self.get_username()) kwargs['groups'] = get_personal_groups(-1, -1)
return kwargs return kwargs
class DeptGroupListView(GroupListView): # class DeptGroupListView(GroupListView):
template_name = 'group/dept_groups.html' # template_name = 'group/dept_groups.html'
def form_valid(self, form): # def form_valid(self, form):
group_name = form.cleaned_data['group_name'] # group_name = form.cleaned_data['group_name']
username = self.get_username() # username = self.get_username()
try: # try:
group_id = ccnet_threaded_rpc.create_group( # group_id = ccnet_threaded_rpc.create_group(
group_name.encode('utf-8'), username) # group_name.encode('utf-8'), username)
bg = BusinessGroup() # bg = BusinessGroup()
bg.group_id = group_id # bg.group_id = group_id
bg.group_type = 'dept' # bg.group_type = 'dept'
bg.save() # bg.save()
except SearpcError, e: # except SearpcError, e:
result = {} # result = {}
result['error'] = _(e.msg) # result['error'] = _(e.msg)
return HttpResponse(json.dumps(result), # return HttpResponse(json.dumps(result),
content_type='application/json; charset=utf-8') # content_type='application/json; charset=utf-8')
if self.request.is_ajax(): # if self.request.is_ajax():
return self.ajax_form_valid() # return self.ajax_form_valid()
else: # else:
return FormMixin.form_valid(self, form) # return FormMixin.form_valid(self, form)
def get_context_data(self, **kwargs): # def get_context_data(self, **kwargs):
groups = [ g for g in get_personal_groups(self.get_username()) \ # groups = [ g for g in get_personal_groups_by_user(self.get_username()) \
if self.is_dept_group(g.id)] # if self.is_dept_group(g.id)]
kwargs['groups'] = groups # kwargs['groups'] = groups
return kwargs # return kwargs
class ProjGroupListView(GroupListView): # class ProjGroupListView(GroupListView):
template_name = 'group/proj_groups.html' # template_name = 'group/proj_groups.html'
def form_valid(self, form): # def form_valid(self, form):
group_name = form.cleaned_data['group_name'] # group_name = form.cleaned_data['group_name']
username = self.get_username() # username = self.get_username()
try: # try:
group_id = ccnet_threaded_rpc.create_group( # group_id = ccnet_threaded_rpc.create_group(
group_name.encode('utf-8'), username) # group_name.encode('utf-8'), username)
bg = BusinessGroup() # bg = BusinessGroup()
bg.group_id = group_id # bg.group_id = group_id
bg.group_type = 'proj' # bg.group_type = 'proj'
bg.save() # bg.save()
except SearpcError, e: # except SearpcError, e:
result = {} # result = {}
result['error'] = _(e.msg) # result['error'] = _(e.msg)
return HttpResponse(json.dumps(result), # return HttpResponse(json.dumps(result),
content_type='application/json; charset=utf-8') # content_type='application/json; charset=utf-8')
if self.request.is_ajax(): # if self.request.is_ajax():
return self.ajax_form_valid() # return self.ajax_form_valid()
else: # else:
return FormMixin.form_valid(self, form) # return FormMixin.form_valid(self, form)
def get_context_data(self, **kwargs): # def get_context_data(self, **kwargs):
groups = [ g for g in get_personal_groups(self.get_username()) \ # groups = [ g for g in get_personal_groups_by_user(self.get_username()) \
if self.is_proj_group(g.id)] # if self.is_proj_group(g.id)]
kwargs['groups'] = groups # kwargs['groups'] = groups
return kwargs # return kwargs
@login_required @login_required
def group_remove(request, group_id): def group_remove(request, group_id):
@@ -611,12 +612,6 @@ def group_share_repo(request, repo_id, group_id, from_email, permission):
if not group: if not group:
return render_error(request, u'共享失败:小组不存在') return render_error(request, u'共享失败:小组不存在')
# Check whether user belongs to the group.
joined = is_group_user(int(group.id), request.user.username)
if not joined:
return render_error(request, u'共享失败:未加入该小组')
if seafserv_threaded_rpc.group_share_repo(repo_id, group_id, from_email, permission) != 0: if seafserv_threaded_rpc.group_share_repo(repo_id, group_id, from_email, permission) != 0:
return render_error(request, u'共享失败:内部错误') return render_error(request, u'共享失败:内部错误')
@@ -629,12 +624,6 @@ def group_unshare_repo(request, repo_id, group_id, from_email):
group = get_group(group_id) group = get_group(group_id)
if not group: if not group:
return render_error(request, u'取消共享失败:小组不存在') return render_error(request, u'取消共享失败:小组不存在')
# Check whether user belongs to the group.
joined = is_group_user(group_id, request.user.username)
if not joined:
return render_error(request, u'取消共享失败:未加入该小组')
# Check whether user is group staff or the one share the repo # Check whether user is group staff or the one share the repo
if not check_group_staff(group_id, from_email) and \ if not check_group_staff(group_id, from_email) and \
@@ -683,7 +672,7 @@ def group_recommend(request):
groups = get_org_groups_by_user(org_id, username) groups = get_org_groups_by_user(org_id, username)
else: else:
groups = get_personal_groups(request.user.username) groups = get_personal_groups_by_user(request.user.username)
find = False find = False
for group in groups: for group in groups:

View File

@@ -53,26 +53,18 @@ def share_repo(request):
to_email_list = string2list(email_or_group) to_email_list = string2list(email_or_group)
for to_email in to_email_list: for to_email in to_email_list:
# if to_email is user name, the format is: 'example@mail.com'; if to_email.find('@') == -1:
# if to_email is group, the format is 'group_name <creator@mail.com>'
if (to_email.split(' ')[0].find('@') == -1):
''' Share repo to group ''' ''' Share repo to group '''
# TODO: if we know group id, then we can simplly call group_share_repo # TODO: if we know group id, then we can simplly call group_share_repo
if len(to_email.split(' ')) < 2: group_name = to_email
msg = u'共享给 %s 失败。' % to_email
messages.add_message(request, messages.ERROR, msg) # get all personal groups
continue groups = get_personal_groups(-1, -1)
group_name = to_email.split(' ')[0]
group_creator = to_email.split(' ')[1]
# get all the groups the user joined
groups = get_personal_groups(request.user.username)
find = False find = False
for group in groups: for group in groups:
# for every group that user joined, if group name and # for every group that user joined, if group name matchs,
# group creator matchs, then has find the group # then has find the group
if group.props.group_name == group_name and \ if group.props.group_name == group_name:
group_creator.find(group.props.creator_name) >= 0:
from seahub.group.views import group_share_repo from seahub.group.views import group_share_repo
group_share_repo(request, repo_id, int(group.props.id), group_share_repo(request, repo_id, int(group.props.id),
from_email, permission) from_email, permission)
@@ -83,7 +75,7 @@ def share_repo(request):
messages.add_message(request, messages.INFO, msg) messages.add_message(request, messages.INFO, msg)
break break
if not find: if not find:
msg = u'共享到 %s 失败。' % group_name msg = u'共享到 %s 失败,小组不存在' % group_name
messages.add_message(request, messages.ERROR, msg) messages.add_message(request, messages.ERROR, msg)
else: else:
''' Share repo to user ''' ''' Share repo to user '''

View File

@@ -30,12 +30,6 @@
{% if grpmsg_reply_list %} {% if grpmsg_reply_list %}
<li><a href="{{ SITE_ROOT }}group/reply/new/" class="no-bold">{{ grpmsg_reply_list|length }}条小组留言有新回复</a></li> <li><a href="{{ SITE_ROOT }}group/reply/new/" class="no-bold">{{ grpmsg_reply_list|length }}条小组留言有新回复</a></li>
{% endif %} {% endif %}
{% if new_innerpub_msg %}
<li><a href="{% url 'public_home' %}" class="no-bold">公共页面有新留言</a></li>
{% endif %}
{% if innerpubmsg_reply_list %}
<li><a href="{% url 'innerpub_msg_reply_new' %}" class="no-bold">{{ innerpubmsg_reply_list|length }}条公共留言有新回复</a></li>
{% endif %}
{% if orgmsg_list %} {% if orgmsg_list %}
<li><a href="{% url 'org_msg' %}" class="no-bold">{{ orgmsg_list|length }}条团体消息</a></li> <li><a href="{% url 'org_msg' %}" class="no-bold">{{ orgmsg_list|length }}条团体消息</a></li>
{% endif %} {% endif %}

View File

@@ -6,7 +6,7 @@ $(function() {
{% endfor %} {% endfor %}
{% for group in groups %} {% for group in groups %}
share_list.push('{{ group.props.group_name }} <{{ group.props.creator_name }}>'); share_list.push('{{ group.props.group_name }}');
{% endfor %} {% endfor %}
$(".repo-share-btn").click(function() { $(".repo-share-btn").click(function() {

View File

@@ -4,7 +4,8 @@ from service import ccnet_rpc, monitor_rpc, seafserv_rpc, \
seafserv_threaded_rpc, ccnet_threaded_rpc seafserv_threaded_rpc, ccnet_threaded_rpc
from service import send_command from service import send_command
from service import get_emailusers from service import get_emailusers
from service import get_org_groups, get_personal_groups, get_group_repoids, \ from service import get_org_groups, get_personal_groups_by_user, \
get_group_repoids, get_personal_groups, \
check_group_staff, remove_group_user, get_group, get_org_id_by_group, \ 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_group_members, get_shared_groups_by_repo, is_group_user, \
get_org_group_repos, get_group_repos, get_org_groups_by_user, is_org_group,\ get_org_group_repos, get_group_repos, get_org_groups_by_user, is_org_group,\

View File

@@ -106,6 +106,26 @@ def get_group(group_id):
group = None group = None
return group return group
def get_personal_groups(start, limit):
try:
groups_all = ccnet_threaded_rpc.get_all_groups(start, limit)
except SearpcError:
return []
return [ x for x in groups_all if not is_org_group(x.id) ]
def get_personal_groups_by_user(email):
try:
groups_all = ccnet_threaded_rpc.get_groups(email)
except SearpcError:
return []
personal_groups = []
for group in groups_all:
if not is_org_group(group.id):
personal_groups.append(group)
return personal_groups
# group user # group user
def is_group_user(group_id, user): def is_group_user(group_id, user):
try: try:
@@ -174,19 +194,6 @@ def get_org_groups_by_user(org_id, user):
return org_groups return org_groups
def get_personal_groups(email):
try:
groups_all = ccnet_threaded_rpc.get_groups(email)
except SearpcError:
return []
personal_groups = []
for group in groups_all:
if not is_org_group(group.id):
personal_groups.append(group)
return personal_groups
# org # org
def create_org(org_name, url_prefix, username): def create_org(org_name, url_prefix, username):
ccnet_threaded_rpc.create_org(org_name, url_prefix, username) ccnet_threaded_rpc.create_org(org_name, url_prefix, username)

View File

@@ -5,7 +5,7 @@ from django.views.generic.simple import direct_to_template
from seahub.views import * from seahub.views import *
from notifications.views import notification_list from notifications.views import notification_list
from share.views import share_admin from share.views import share_admin
from group.views import GroupListView, DeptGroupListView, ProjGroupListView from group.views import GroupListView
# Uncomment the next two lines to enable the admin: # Uncomment the next two lines to enable the admin:
#from django.contrib import admin #from django.contrib import admin
@@ -90,8 +90,8 @@ urlpatterns = patterns('',
(r'^contacts/', include('contacts.urls')), (r'^contacts/', include('contacts.urls')),
(r'^group/', include('seahub.group.urls')), (r'^group/', include('seahub.group.urls')),
url(r'^groups/', GroupListView.as_view(), name='group_list'), url(r'^groups/', GroupListView.as_view(), name='group_list'),
url(r'^deptgroups/', DeptGroupListView.as_view(), name='dept_group_list'), # url(r'^deptgroups/', DeptGroupListView.as_view(), name='dept_group_list'),
url(r'^projgroups/', ProjGroupListView.as_view(), name='proj_group_list'), # url(r'^projgroups/', ProjGroupListView.as_view(), name='proj_group_list'),
(r'^profile/', include('seahub.profile.urls')), (r'^profile/', include('seahub.profile.urls')),
### SeaHub admin ### ### SeaHub admin ###

View File

@@ -33,8 +33,9 @@ from auth.tokens import default_token_generator
from share.models import FileShare from share.models import FileShare
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, get_emailusers, \ from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, get_emailusers, \
get_repo, get_commits, get_branches, is_valid_filename, remove_group_user,\ get_repo, get_commits, get_branches, is_valid_filename, remove_group_user,\
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, is_inner_pub_repo, \ seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, is_repo_owner, \
check_group_staff, get_personal_groups, is_repo_owner, del_org_group_repo,\ check_group_staff, get_personal_groups_by_user, is_inner_pub_repo, \
del_org_group_repo, get_personal_groups, \
get_group, get_shared_groups_by_repo, is_group_user, check_permission, \ get_group, get_shared_groups_by_repo, is_group_user, check_permission, \
list_personal_shared_repos, is_org_group, get_org_id_by_group, is_org_repo,\ list_personal_shared_repos, is_org_group, get_org_id_by_group, is_org_repo,\
list_inner_pub_repos, get_org_groups_by_repo, is_org_repo_owner, \ list_inner_pub_repos, get_org_groups_by_repo, is_org_repo_owner, \
@@ -758,8 +759,6 @@ def myhome(request):
grpmsg_reply_list = [] grpmsg_reply_list = []
orgmsg_list = [] orgmsg_list = []
notes = UserNotification.objects.filter(to_user=request.user.username) notes = UserNotification.objects.filter(to_user=request.user.username)
new_innerpub_msg = False
innerpubmsg_reply_list = []
for n in notes: for n in notes:
if n.msg_type == 'group_msg': if n.msg_type == 'group_msg':
grp = get_group(n.detail) grp = get_group(n.detail)
@@ -770,13 +769,9 @@ def myhome(request):
grpmsg_reply_list.append(n.detail) grpmsg_reply_list.append(n.detail)
elif n.msg_type == 'org_join_msg': elif n.msg_type == 'org_join_msg':
orgmsg_list.append(n.detail) orgmsg_list.append(n.detail)
elif n.msg_type == 'innerpub_msg':
new_innerpub_msg = True
elif n.msg_type == 'innerpubmsg_reply':
innerpubmsg_reply_list.append(n.detail)
# my groups # Get all personal groups used in autocomplete.
groups = get_personal_groups(email) groups = get_personal_groups(-1, -1)
# get nickname # get nickname
if not Profile.objects.filter(user=request.user.username): if not Profile.objects.filter(user=request.user.username):
@@ -785,10 +780,6 @@ def myhome(request):
profile = Profile.objects.filter(user=request.user.username)[0] profile = Profile.objects.filter(user=request.user.username)[0]
nickname = profile.nickname nickname = profile.nickname
# ctx_dict = {'base_template': 'myhome_base.html',
# 'org_dict': None}
# set_cur_ctx(request, ctx_dict)
return render_to_response('myhome.html', { return render_to_response('myhome.html', {
"myname": email, "myname": email,
"nickname": nickname, "nickname": nickname,
@@ -801,8 +792,6 @@ def myhome(request):
"grpmsg_list": grpmsg_list, "grpmsg_list": grpmsg_list,
"grpmsg_reply_list": grpmsg_reply_list, "grpmsg_reply_list": grpmsg_reply_list,
"orgmsg_list": orgmsg_list, "orgmsg_list": orgmsg_list,
"new_innerpub_msg": new_innerpub_msg,
"innerpubmsg_reply_list": innerpubmsg_reply_list,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required