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 %} + + + + + {% if repo.latest_modify %} + + {% else %} + + {% endif %} + + + {% endfor %} +
名字共享来源描述更新时间操作
{{ repo.props.name }}{{ repo.props.shared_email }}{{ repo.props.desc }}{{ repo.latest_modify|translate_commit_time }}-- + 同步 + 取消共享 +
+{% 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 %} + +{% endautoescape %} +{% endif %} + +

我共享的同步目录

+{% if out_repos %} + + + + + + + + {% for repo in out_repos %} + + + + + + + {% endfor %} +
名字共享给描述操作
{{ repo.props.name }}{{ repo.props.shared_email }}{{ repo.props.desc }} + {% if repo.gid %} + + {% else %} + + {% endif %} +
+{% else %} +

暂无

+{% endif %} + +

我管理的文件外链

+{% if fileshares %} + + + + + + + + {% for fs in fileshares %} + + + + + + + {% endfor %} + + +{% 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'