diff --git a/group/views.py b/group/views.py
index ac086928d0..3c5b1a56d0 100644
--- a/group/views.py
+++ b/group/views.py
@@ -32,7 +32,6 @@ from seahub.views import is_registered_user
from seahub.forms import RepoCreateForm
@login_required
-@ctx_switch_required
def group_list(request):
error_msg = None
if request.method == 'POST':
@@ -471,7 +470,8 @@ def group_remove_member(request, group_id, user_name):
return render_error(request, e.msg)
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,15 +494,16 @@ 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 to a group
+ Unshare a repo in group.
"""
# Check whether group exists
group = get_group(group_id)
if not group:
- return render_error(request, u'共享失败:小组不存在')
+ return render_error(request, u'取消共享失败:小组不存在')
# Check whether user belong to the group
joined = False
@@ -511,7 +512,7 @@ def group_unshare_repo(request, repo_id, group_id, from_email):
if group.props.id == group_id:
joined = True
if not joined:
- return render_error(request, u'共享失败:未加入该小组')
+ return render_error(request, u'取消共享失败:未加入该小组')
# Check whether user is group staff or the one share the repo
if not check_group_staff(group_id, from_email) and \
@@ -519,7 +520,7 @@ def group_unshare_repo(request, repo_id, group_id, from_email):
return render_permission_error(request, u'取消共享失败:只有小组管理员或共享目录发布者有权取消共享')
if seafserv_threaded_rpc.group_unshare_repo(repo_id, group_id, from_email) != 0:
- return render_error(request, u'共享失败:内部错误')
+ return render_error(request, u'取消共享失败:内部错误')
@login_required
def group_recommend(request):
diff --git a/organizations/templates/organizations/personal.html b/organizations/templates/organizations/personal.html
index 89925f9bb5..4d869c05dc 100644
--- a/organizations/templates/organizations/personal.html
+++ b/organizations/templates/organizations/personal.html
@@ -62,6 +62,38 @@
{% endif %}
+
共享给我的同步目录
+{% if in_repos %}
+
+
+ 名字 |
+ 共享来源 |
+ 描述 |
+ 更新时间 |
+ 操作 |
+
+
+ {% for repo in in_repos %}
+
+ {{ repo.props.name }} |
+ {{ repo.props.shared_email }} |
+ {{ repo.props.desc }} |
+ {% if repo.latest_modify %}
+ {{ repo.latest_modify|translate_commit_time }} |
+ {% else %}
+ -- |
+ {% endif %}
+
+
+
+ |
+
+ {% endfor %}
+
+{% else %}
+暂无
+{% endif %}
+
{% url 'org_repo_share' org.url_prefix as repo_share_url %}
{% with post_url=repo_share_url %}
{% include "snippets/repo_share_form.html" %}
diff --git a/organizations/templates/organizations/share_admin.html b/organizations/templates/organizations/share_admin.html
new file mode 100644
index 0000000000..e0d510fc23
--- /dev/null
+++ b/organizations/templates/organizations/share_admin.html
@@ -0,0 +1,99 @@
+{% extends "org_base.html" %}
+{% load seahub_tags %}
+
+{% block nav_shareadmin_class %}class="cur"{% endblock %}
+
+{% block right_panel %}
+{% if messages %}
+{% autoescape off %}
+
+ {% for message in messages %}
+ - {{ message }}
+ {% endfor %}
+
+{% endautoescape %}
+{% endif %}
+
+我共享的同步目录
+{% if out_repos %}
+
+
+ 名字 |
+ 共享给 |
+ 描述 |
+ 操作 |
+
+ {% for repo in out_repos %}
+
+ {{ repo.props.name }} |
+ {{ repo.props.shared_email }} |
+ {{ repo.props.desc }} |
+
+ {% if repo.gid %}
+
+ {% else %}
+
+ {% endif %}
+ |
+
+ {% endfor %}
+
+{% else %}
+暂无
+{% endif %}
+
+我管理的文件外链
+{% if fileshares %}
+
+{% else %}
+暂无
+{% endif %}
+
+
+
+
+{% endblock %}
+
+{% block extra_script %}
+
+{% endblock %}
diff --git a/organizations/urls.py b/organizations/urls.py
index d13d983ff0..464c8ce1eb 100644
--- a/organizations/urls.py
+++ b/organizations/urls.py
@@ -13,7 +13,11 @@ urlpatterns = patterns('',
url(r'^(?P[^/]+)/groups/$', org_groups, name='org_groups'),
url(r'^([^/]+)/repo/create/$', org_repo_create, name='org_repo_create'),
url(r'^([^/]+)/repo/history/(?P[^/]+)/$', repo_history, name='org_repo_history'),
+
+ # repo share
+ url(r'^(?P[^/]+)/shareadmin/$', org_shareadmin, name='org_shareadmin'),
url(r'^(?P[^/]+)/repo/share/$', org_repo_share, name='org_repo_share'),
+ url(r'^(?P[^/]+)/repo/unshare/$', org_repo_unshare, name='org_repo_unshare'),
url(r'^([^/]+)/repo/(?P[^/]+)/$', repo, name='repo'),
diff --git a/organizations/views.py b/organizations/views.py
index 02d6eb0ed8..58acbc8a5d 100644
--- a/organizations/views.py
+++ b/organizations/views.py
@@ -1,4 +1,5 @@
# encoding: utf-8
+import os
import simplejson as json
import sys
from django.core.urlresolvers import reverse
@@ -12,18 +13,19 @@ from django.template import Context, loader, RequestContext
from auth.decorators import login_required
from pysearpc import SearpcError
-from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, \
+from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, get_repo, \
get_orgs_by_user, get_org_repos, list_org_inner_pub_repos, \
get_org_by_url_prefix, create_org, get_user_current_org, add_org_user, \
remove_org_user, get_org_groups, is_valid_filename, org_user_exists, \
create_org_repo, get_org_id_by_group, get_org_groups_by_user, \
- get_org_users_by_url_prefix
+ get_org_users_by_url_prefix, list_org_shared_repos, is_personal_repo
from decorators import org_staff_required
from forms import OrgCreateForm
from signals import org_user_added
from utils import validate_org_repo_owner
from notifications.models import UserNotification
+from share.models import FileShare
from share.forms import RepoShareForm
from registration.models import RegistrationProfile
from seahub.base.accounts import User
@@ -98,17 +100,27 @@ def org_personal(request, url_prefix):
calculate_repo_last_modify(owned_repos)
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
- # org groups user created
+ # Org repos others shared to me
+ in_repos = list_org_shared_repos(user,'to_email', -1, -1)
+
+ # Org groups user created
groups = get_org_groups_by_user(org.org_id, user)
- # org members used in auto complete
+ # Org members used in auto complete
+ contacts = []
org_members = get_org_users_by_url_prefix(org.url_prefix, 0, MAX_INT)
+ for m in org_members:
+ if m.email == user: # shouldn' show my'email in auto complete
+ continue
+ m.contact_email = m.email
+ contacts.append(m)
return render_to_response('organizations/personal.html', {
'owned_repos': owned_repos,
+ "in_repos": in_repos,
'org': org,
'groups': groups,
- 'org_members': org_members,
+ 'contacts': contacts,
}, context_instance=RequestContext(request))
@login_required
@@ -476,30 +488,97 @@ def org_repo_share(request, url_prefix):
'base_template': 'org_base.html',
})
- to_email_list = string2list(email_or_group)
- for to_email in to_email_list:
- # if to_email is user name, the format is: 'example@mail.com';
- # if to_email is group, the format is 'group_name '
- if (to_email.split(' ')[0].find('@') == -1):
- pass
+ share_to_list = string2list(email_or_group)
+ for share_to in share_to_list:
+ # if share_to is user name, the format is: 'example@mail.com';
+ # if share_to is group, the format is 'group_name '
+ if (share_to.split(' ')[0].find('@') == -1):
+ ''' Share repo to group '''
+ # TODO: if we know group id, then we can simplly call group_share_repo
+ if len(share_to.split(' ')) < 2:
+ msg = u'共享给 %s 失败。' % share_to
+ messages.add_message(request, messages.ERROR, msg)
+ continue
+
+ group_name = share_to.split(' ')[0]
+ group_creator = share_to.split(' ')[1]
+ # get org groups the user joined
+ groups = get_org_groups_by_user(org.org_id, from_email)
+ find = False
+ for group in groups:
+ # for every group that user joined, if group name and
+ # group creator matchs, then has finded the group
+ if group.props.group_name == group_name and \
+ group_creator.find(group.props.creator_name) >= 0:
+ seafserv_threaded_rpc.add_org_group_repo(repo_id,
+ org.org_id,
+ group.id,
+ from_email,
+ 'rw')
+ find = True
+ msg = u'共享到 %s 成功,请前往共享管理查看。' % \
+ (group_name, reverse('org_shareadmin', args=[org.url_prefix]))
+
+ messages.add_message(request, messages.INFO, msg)
+ break
+ if not find:
+ msg = u'共享到 %s 失败。' % group_name
+ messages.add_message(request, messages.ERROR, msg)
else:
''' Share repo to user '''
- # Test whether to_email is in this org
- if not org_user_exists(org.org_id, to_email):
- msg = u'共享给 %s 失败:团体中不存在该用户。' % to_email
+ # Test whether share_to is in this org
+ if not org_user_exists(org.org_id, share_to):
+ msg = u'共享给 %s 失败:团体中不存在该用户。' % share_to
messages.add_message(request, messages.ERROR, msg)
continue
# Record share info to db.
try:
- seafserv_threaded_rpc.add_share(repo_id, from_email, to_email,
+ seafserv_threaded_rpc.add_share(repo_id, from_email, share_to,
'rw')
msg = u'共享给 %s 成功,请前往共享管理查看。' % \
- (to_email, reverse('share_admin'))
+ (share_to, reverse('org_shareadmin', args=[org.url_prefix]))
messages.add_message(request, messages.INFO, msg)
except SearpcError, e:
- msg = u'共享给 %s 失败。' % to_email
+ msg = u'共享给 %s 失败。' % share_to
messages.add_message(request, messages.ERROR, msg)
continue
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):
+ """
+ List personal repos I share to others, include groups and users.
+ """
+ username = request.user.username
+
+ org = get_user_current_org(request.user.username, url_prefix)
+ if not org:
+ return HttpResponseRedirect(reverse(myhome))
+
+ # org repos that are shared to others
+ out_repos = list_org_shared_repos(username, 'from_email', -1, -1)
+
+ # File shared links
+ fileshares = FileShare.objects.filter(username=request.user.username)
+ o_fileshares = [] # shared files in org repos
+ for fs in fileshares:
+ if not is_personal_repo(fs.repo_id):
+ # only list files in org repos
+ fs.filename = os.path.basename(fs.path)
+ fs.repo = get_repo(fs.repo_id)
+ o_fileshares.append(fs)
+
+ return render_to_response('organizations/share_admin.html', {
+ "org": org,
+ "out_repos": out_repos,
+ "fileshares": o_fileshares,
+ "protocol": request.is_secure() and 'https' or 'http',
+ "domain": RequestSite(request).domain,
+ }, context_instance=RequestContext(request))
+
diff --git a/share/templates/repo/share_admin.html b/share/templates/repo/share_admin.html
index e5e3880469..15a876d583 100644
--- a/share/templates/repo/share_admin.html
+++ b/share/templates/repo/share_admin.html
@@ -4,6 +4,16 @@
{% block nav_shareadmin_class %}class="cur"{% endblock %}
{% block right_panel %}
+{% if messages %}
+{% autoescape off %}
+
+ {% for message in messages %}
+ - {{ message }}
+ {% endfor %}
+
+{% endautoescape %}
+{% endif %}
+
我共享的同步目录
{% if out_repos %}
diff --git a/share/views.py b/share/views.py
index 6256516846..f48144faef 100644
--- a/share/views.py
+++ b/share/views.py
@@ -11,7 +11,8 @@ from django.contrib import messages
from django.contrib.sites.models import Site, RequestSite
from pysearpc import SearpcError
from seaserv import seafserv_threaded_rpc, get_repo, ccnet_rpc, \
- ccnet_threaded_rpc, get_personal_groups
+ ccnet_threaded_rpc, get_personal_groups, list_personal_shared_repos, \
+ is_personal_repo
from forms import RepoShareForm
from models import AnonymousShare
@@ -109,14 +110,12 @@ def share_repo(request):
@login_required
def share_admin(request):
"""
- List repos I share to others, include groups and users. And also list
- file shared links I generated.
+ List personal repos I share to others, include groups and users.
"""
username = request.user.username
- # repos that are share to user
- out_repos = seafserv_threaded_rpc.list_share_repos(username, 'from_email',
- -1, -1)
+ # personal repos that are share to user
+ 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)
@@ -145,14 +144,18 @@ def share_admin(request):
# File shared links
fileshares = FileShare.objects.filter(username=request.user.username)
+ p_fileshares = [] # personal file share
for fs in fileshares:
- fs.filename = os.path.basename(fs.path)
- fs.repo = get_repo(fs.repo_id)
+ if is_personal_repo(fs.repo_id):
+ # only list files in personal repos
+ fs.filename = os.path.basename(fs.path)
+ fs.repo = get_repo(fs.repo_id)
+ p_fileshares.append(fs)
return render_to_response('repo/share_admin.html', {
"out_repos": out_repos,
# "out_links": out_links,
- "fileshares": fileshares,
+ "fileshares": p_fileshares,
"protocol": request.is_secure() and 'https' or 'http',
"domain": RequestSite(request).domain,
}, context_instance=RequestContext(request))
@@ -221,7 +224,13 @@ def anonymous_share_confirm(request, token=None):
return res
def remove_anonymous_share(request, token):
- AnonymousShare.objects.filter(token=token).delete()
+ AnonymousShare.objects.filter(token=token).delete()
- return HttpResponseRedirect(reverse('share_admin'))
+ next = request.META.get('HTTP_REFERER', None)
+ if not next:
+ next = reverse('share_admin')
+
+ messages.add_message(request, messages.INFO, u'删除成功')
+
+ return HttpResponseRedirect(next)
diff --git a/templates/org_base.html b/templates/org_base.html
index fa75b4ae63..1b568af164 100644
--- a/templates/org_base.html
+++ b/templates/org_base.html
@@ -13,5 +13,8 @@
个人页面
+
+ 共享管理
+
{% endblock %}
diff --git a/thirdpart/seaserv/__init__.py b/thirdpart/seaserv/__init__.py
index 30fe4e176d..a72e24db89 100644
--- a/thirdpart/seaserv/__init__.py
+++ b/thirdpart/seaserv/__init__.py
@@ -10,7 +10,9 @@ from service import get_org_groups, get_personal_groups, get_group_repoids, \
get_org_group_repos, get_group_repos, get_org_groups_by_user
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_inner_pub_repos, get_org_id_by_repo_id, list_org_shared_repos, \
+ list_personal_shared_repos, is_personal_repo
+
from service import get_binding_peerids, is_valid_filename, check_permission
from service import create_org, get_orgs_by_user, get_org_by_url_prefix, \
get_user_current_org, add_org_user, remove_org_user, get_org_by_id, \
diff --git a/thirdpart/seaserv/service.py b/thirdpart/seaserv/service.py
index d8a091dcd1..42040c2f00 100644
--- a/thirdpart/seaserv/service.py
+++ b/thirdpart/seaserv/service.py
@@ -336,7 +336,7 @@ def get_org_id_by_repo_id(repo_id):
try:
org_id = seafserv_threaded_rpc.get_org_id_by_repo_id(repo_id)
except SearpcError:
- org_id = ''
+ org_id = -1
return org_id
def list_org_repos_by_owner(org_id, user):
@@ -522,3 +522,62 @@ def get_org_id_by_repo(repo_id):
org_id = -1
return org_id
+def is_personal_repo(repo_id):
+ """
+ Check whether repo is personal repo.
+ """
+ try:
+ owner = seafserv_threaded_rpc.get_repo_owner(repo_id)
+ except SearpcError:
+ owner = ''
+ return True if owner else False
+
+def list_personal_shared_repos(user, user_type, start, limit):
+ """
+ List personal repos that user share with others.
+ If `user_type` is 'from_email', list repos user shares to others;
+ If `user_type` is 'to_email', list repos others sahre to user.
+ """
+ try:
+ repos = seafserv_threaded_rpc.list_share_repos(user, user_type,
+ start, limit)
+ except SearpcError:
+ repos = []
+
+ p_repos = []
+ if repos:
+ for r in repos:
+ if is_personal_repo(r.id):
+ try:
+ r.latest_modify = get_commits(r.id, 0, 1)[0].ctime
+ except:
+ r.latest_modify = None
+ p_repos.append(r)
+
+ p_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
+ return p_repos
+
+def list_org_shared_repos(user, user_type, start, limit):
+ """
+ List org repos that user share with others.
+ If `user_type` is 'from_email', list repos user shares to others;
+ If `user_type` is 'to_email', list repos others sahre to user.
+ """
+ try:
+ repos = seafserv_threaded_rpc.list_share_repos(user, user_type,
+ start, limit)
+ except SearpcError:
+ repos = []
+
+ o_repos = []
+ if repos:
+ for r in repos:
+ if not is_personal_repo(r.id):
+ try:
+ r.latest_modify = get_commits(r.id, 0, 1)[0].ctime
+ except:
+ r.latest_modify = None
+ o_repos.append(r)
+
+ o_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
+ return o_repos
diff --git a/views.py b/views.py
index 7a5fe0ab62..33fd778365 100644
--- a/views.py
+++ b/views.py
@@ -32,7 +32,8 @@ 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, \
- 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
from pysearpc import SearpcError
from base.accounts import User
@@ -43,7 +44,6 @@ from seahub.contacts.signals import mail_sended
from group.models import GroupMessage, MessageAttachment
from group.signals import grpmsg_added
from seahub.notifications.models import UserNotification
-from seahub.organizations.utils import access_org_repo
from forms import AddUserForm, FileLinkShareForm, RepoCreateForm, \
RepoNewDirForm, RepoNewFileForm, FileCommentForm
from utils import render_permission_error, render_error, list_to_string, \
@@ -610,17 +610,14 @@ def myhome(request):
email = request.user.username
quota_usage = seafserv_threaded_rpc.get_user_quota_usage(email)
- # Repos that I own
+ # Personal repos that I own
owned_repos = seafserv_threaded_rpc.list_owned_repos(email)
calculate_repo_last_modify(owned_repos)
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
- # Repos shared with me
- in_repos = seafserv_threaded_rpc.list_share_repos(email,
- 'to_email', -1, -1)
- calculate_repo_last_modify(in_repos)
- in_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
-
+ # Personal repos others shared to me
+ in_repos = list_personal_shared_repos(email,'to_email', -1, -1)
+
# my contacts
contacts = Contact.objects.filter(user_email=email)
@@ -1260,17 +1257,14 @@ def repo_remove_share(request):
from seahub.group.views import group_unshare_repo
group_unshare_repo(request, repo_id, group_id_int, from_email)
- referer = request.META.get('HTTP_REFERER', None)
- if not referer:
- referer = 'share_admin'
- return HttpResponseRedirect(reverse(referer))
- else:
- return HttpResponseRedirect(referer)
-
-# @login_required
-# def mypeers(request):
-# cid = get_user_cid(request.user)
+ messages.add_message(request, messages.INFO, '操作成功')
+
+ next = request.META.get('HTTP_REFERER', None)
+ if not next:
+ next = reverse(referer)
+ return HttpResponseRedirect(next)
+
@login_required
@sys_staff_required
def sys_seafadmin(request):
@@ -1962,7 +1956,13 @@ def remove_shared_link(request):
if not request.is_ajax():
FileShare.objects.filter(token=token).delete()
- return HttpResponseRedirect(reverse('share_admin'))
+ next = request.META.get('HTTP_REFERER', None)
+ if not next:
+ next = reverse('share_admin')
+
+ messages.add_message(request, messages.INFO, u'删除成功')
+
+ return HttpResponseRedirect(next)
content_type = 'application/json; charset=utf-8'