1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-11 11:52:08 +00:00

Clean up shared repo listing code and add permission for public repos.

This commit is contained in:
killing 2012-09-26 10:49:00 +08:00
parent 58efc80107
commit d30f7c4bbb
16 changed files with 263 additions and 156 deletions

View File

@ -170,3 +170,12 @@ cc.spliter = ''
def char2pinyin(value): def char2pinyin(value):
"""Convert Chinese character to pinyin.""" """Convert Chinese character to pinyin."""
return cc.convert(value) return cc.convert(value)
@register.filter(name='translate_permission')
def translate_permission(value):
if value == 'rw':
return u'可读写'
elif value == 'r':
return u'只可浏览'
else:
return ''

View File

@ -111,6 +111,11 @@ class RepoCreateForm(forms.Form):
raise forms.ValidationError("两次输入的密码不一致") raise forms.ValidationError("两次输入的密码不一致")
return self.cleaned_data return self.cleaned_data
class SharedRepoCreateForm(RepoCreateForm):
"""
Used for creating group repo and public repo
"""
permission = forms.ChoiceField(choices=(('rw', 'read-write'), ('r', 'read-only')))
class RepoNewFileForm(forms.Form): class RepoNewFileForm(forms.Form):
""" """

View File

@ -68,7 +68,9 @@
</td> </td>
<td>{{ repo.owner|email2nickname }}</td> <td>{{ repo.owner|email2nickname }}</td>
<td> <td>
{% if repo.user_perm == 'rw' %}
<img src="{{ MEDIA_URL }}img/download-20.png" class="download op-icon vh" data="{{ SITE_ROOT }}seafile_access_check/?repo_id={{ repo.props.id }}" alt="下载" title="下载到本地" /> <img src="{{ MEDIA_URL }}img/download-20.png" class="download op-icon vh" data="{{ SITE_ROOT }}seafile_access_check/?repo_id={{ repo.props.id }}" alt="下载" title="下载到本地" />
{% endif %}
{% if is_staff or repo.share_from_me %} {% if is_staff or repo.share_from_me %}
<img src="{{ MEDIA_URL }}img/delete-20.png" class="cancel-share op-icon vh" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&from={{ repo.owner }}&gid={{ group.id }}" title="取消共享" alt="取消共享" /> <img src="{{ MEDIA_URL }}img/delete-20.png" class="cancel-share op-icon vh" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&from={{ repo.owner }}&gid={{ group.id }}" title="取消共享" alt="取消共享" />
{% endif %} {% endif %}

View File

@ -20,7 +20,7 @@ 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_by_user, get_group, get_group_members, \ get_personal_groups_by_user, get_group, get_group_members, \
get_personal_groups, create_org_repo, get_org_group_repos, \ get_personal_groups, create_org_repo, get_org_group_repos, \
get_org_groups_by_user get_org_groups_by_user, check_permission
from pysearpc import SearpcError from pysearpc import SearpcError
from models import GroupMessage, MessageReply, MessageAttachment, BusinessGroup from models import GroupMessage, MessageReply, MessageAttachment, BusinessGroup
@ -39,7 +39,7 @@ from seahub.utils import render_error, render_permission_error, \
validate_group_name, string2list, check_and_get_org_by_group, \ validate_group_name, string2list, check_and_get_org_by_group, \
check_and_get_org_by_repo check_and_get_org_by_repo
from seahub.views import is_registered_user from seahub.views import is_registered_user
from seahub.forms import RepoCreateForm from seahub.forms import RepoCreateForm, SharedRepoCreateForm
class GroupMixin(object): class GroupMixin(object):
def get_username(self): def get_username(self):
@ -287,6 +287,9 @@ def render_group_info(request, group_id, form):
else: else:
repos = get_group_repos(group_id_int, request.user.username) repos = get_group_repos(group_id_int, request.user.username)
for repo in repos:
repo.user_perm = check_permission(repo.props.id, request.user.username)
"""group messages""" """group messages"""
# Make sure page request is an int. If not, deliver first page. # Make sure page request is an int. If not, deliver first page.
try: try:
@ -349,6 +352,7 @@ def render_group_info(request, group_id, form):
'next_page': current_page+1, 'next_page': current_page+1,
'per_page': per_page, 'per_page': per_page,
'page_next': page_next, 'page_next': page_next,
'create_shared_repo': True,
}, context_instance=RequestContext(request)); }, context_instance=RequestContext(request));
@login_required @login_required
@ -732,12 +736,13 @@ def create_group_repo(request, group_id):
if not is_group_user(group_id, request.user.username): if not is_group_user(group_id, request.user.username):
return json_error(u"创建失败:未加入该群组") return json_error(u"创建失败:未加入该群组")
form = RepoCreateForm(request.POST) form = SharedRepoCreateForm(request.POST)
if not form.is_valid(): if not form.is_valid():
return json_error(form.errors) return json_error(form.errors)
else: else:
repo_name = form.cleaned_data['repo_name'] repo_name = form.cleaned_data['repo_name']
repo_desc = form.cleaned_data['repo_desc'] repo_desc = form.cleaned_data['repo_desc']
permission = form.cleaned_data['permission']
encrypted = form.cleaned_data['encryption'] encrypted = form.cleaned_data['encryption']
passwd = form.cleaned_data['passwd'] passwd = form.cleaned_data['passwd']
user = request.user.username user = request.user.username
@ -757,7 +762,8 @@ def create_group_repo(request, group_id):
status = seafserv_threaded_rpc.add_org_group_repo(repo_id, status = seafserv_threaded_rpc.add_org_group_repo(repo_id,
org.org_id, org.org_id,
group_id, group_id,
user, 'rw') user,
permission)
except SearpcError, e: except SearpcError, e:
status = -1 status = -1
@ -783,7 +789,8 @@ def create_group_repo(request, group_id):
try: try:
status = seafserv_threaded_rpc.group_share_repo(repo_id, status = seafserv_threaded_rpc.group_share_repo(repo_id,
group_id, group_id,
user, 'rw') user,
permission)
except SearpcError, e: except SearpcError, e:
status = -1 status = -1

View File

@ -605,6 +605,11 @@ ul.with-bg li {
#repo-desc { #repo-desc {
height:70px; height:70px;
} }
#repo-create-form select[name="permission"] {
display:block;
width:262px;
margin-bottom:10px;
}
/* avatar */ /* avatar */
.avatar-op .avatar, .avatar-op .avatar,
.home-profile .avatar, .home-profile .avatar,
@ -875,8 +880,10 @@ ul.with-bg li {
width:260px; width:260px;
height:80px; height:80px;
} }
#share-permission { #repo-share-form select[name="permission"] {
width:260px; display:block;
width:262px;
margin:5px 0;
} }
#recommend-msg, #recommend-msg,
#recommend-groups { #recommend-groups {

View File

@ -33,17 +33,18 @@
{% for repo in repos %} {% for repo in repos %}
<tr> <tr>
<td><img src="{{MEDIA_URL}}img/sync-folder-20.png" alt="目录icon" /></td> <td><img src="{{MEDIA_URL}}img/sync-folder-20.png" alt="目录icon" /></td>
<td><a href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/">{{ repo.props.name }}</a></td> <td><a href="{{ SITE_ROOT }}repo/{{ repo.props.repo_id }}/">{{ repo.props.repo_name }}</a></td>
<td>{{ repo.props.desc }}</td> <td>{{ repo.props.repo_desc }}</td>
{% if repo.latest_modify %} {% if repo.last_modified %}
<td>{{ repo.latest_modify|translate_commit_time }}</td> <td>{{ repo.last_modified|translate_commit_time }}</td>
{% else %} {% else %}
<td>--</td> <td>--</td>
{% endif %} {% endif %}
<td>{{ repo.owner|email2nickname }}</td> <td>{{ repo.props.user|email2nickname }}</td>
<td> <td>
<img src="{{ MEDIA_URL }}img/download-20.png" data="{{ repo.props.id }}" class="download-btn op-icon vh" title="下载到本地" alt="下载" /> {% if repo.user_perm == 'rw' %}
<img src="{{ MEDIA_URL }}img/delete-20.png" data="{% url 'unset_org_inner_pub_repo' org.url_prefix repo.id %}" class="unshare-btn op-icon vh" title="取消共享" alt="取消共享" /> <img src="{{ MEDIA_URL }}img/download-20.png" data="{{ repo.props.repo_id }}" class="download-btn op-icon vh" title="下载到本地" alt="下载" />
{% endif %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -31,7 +31,7 @@ from share.forms import RepoShareForm
from registration.models import RegistrationProfile from registration.models import RegistrationProfile
from seahub.base.accounts import User from seahub.base.accounts import User
from seahub.contacts import Contact from seahub.contacts import Contact
from seahub.forms import RepoCreateForm from seahub.forms import RepoCreateForm, SharedRepoCreateForm
import seahub.settings as seahub_settings import seahub.settings as seahub_settings
from seahub.utils import render_error, render_permission_error, gen_token, \ from seahub.utils import render_error, render_permission_error, gen_token, \
validate_group_name, string2list, calculate_repo_last_modify, MAX_INT validate_group_name, string2list, calculate_repo_last_modify, MAX_INT
@ -76,12 +76,13 @@ def org_info(request, url_prefix):
return HttpResponseRedirect(reverse(myhome)) return HttpResponseRedirect(reverse(myhome))
org_members = get_org_users_by_url_prefix(url_prefix, 0, MAX_INT) org_members = get_org_users_by_url_prefix(url_prefix, 0, MAX_INT)
repos = list_org_inner_pub_repos(org.org_id) repos = list_org_inner_pub_repos(org.org_id, request.user.username)
return render_to_response('organizations/org_info.html', { return render_to_response('organizations/org_info.html', {
'org': org, 'org': org,
'org_users': org_members, 'org_users': org_members,
'repos': repos, 'repos': repos,
'create_shared_repo': True,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required
@ -102,7 +103,7 @@ def org_personal(request, url_prefix):
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
# Org repos others shared to me # Org repos others shared to me
in_repos = list_org_shared_repos(user,'to_email', -1, -1) in_repos = list_org_shared_repos(org.org_id, user,'to_email', -1, -1)
# Org groups user created # Org groups user created
groups = get_org_groups_by_user(org.org_id, user) groups = get_org_groups_by_user(org.org_id, user)
@ -122,6 +123,8 @@ def org_personal(request, url_prefix):
'org': org, 'org': org,
'groups': groups, 'groups': groups,
'contacts': contacts, 'contacts': contacts,
'create_shared_repo': False,
'allow_public_share': True,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required
@ -136,10 +139,11 @@ def org_inner_pub_repo_create(request, url_prefix):
result = {} result = {}
content_type = 'application/json; charset=utf-8' content_type = 'application/json; charset=utf-8'
form = RepoCreateForm(request.POST) form = SharedRepoCreateForm(request.POST)
if form.is_valid(): if form.is_valid():
repo_name = form.cleaned_data['repo_name'] repo_name = form.cleaned_data['repo_name']
repo_desc = form.cleaned_data['repo_desc'] repo_desc = form.cleaned_data['repo_desc']
permission = form.cleaned_data['permission']
passwd = form.cleaned_data['passwd'] passwd = form.cleaned_data['passwd']
user = request.user.username user = request.user.username
org = get_user_current_org(request.user.username, url_prefix) org = get_user_current_org(request.user.username, url_prefix)
@ -152,7 +156,7 @@ def org_inner_pub_repo_create(request, url_prefix):
repo_id = create_org_repo(repo_name, repo_desc, user, passwd, repo_id = create_org_repo(repo_name, repo_desc, user, passwd,
org.org_id) org.org_id)
# set org inner pub # set org inner pub
seafserv_threaded_rpc.set_org_inner_pub_repo(org.org_id, repo_id) seafserv_threaded_rpc.set_org_inner_pub_repo(org.org_id, repo_id, permission)
except: except:
repo_id = None repo_id = None
if not repo_id: if not repo_id:
@ -175,7 +179,9 @@ def unset_org_inner_pub_repo(request, url_prefix, repo_id):
except SearpcError: except SearpcError:
pass pass
return HttpResponseRedirect(reverse(org_info, args=[url_prefix])) messages.add_message(request, messages.INFO, '操作成功')
return HttpResponseRedirect(reverse(org_shareadmin, args=[url_prefix]))
@login_required @login_required
def org_groups(request, url_prefix): def org_groups(request, url_prefix):
@ -505,6 +511,7 @@ def org_repo_share(request, url_prefix):
email_or_group = form.cleaned_data['email_or_group'] email_or_group = form.cleaned_data['email_or_group']
repo_id = form.cleaned_data['repo_id'] repo_id = form.cleaned_data['repo_id']
permission = form.cleaned_data['permission']
from_email = request.user.username from_email = request.user.username
# Test whether user is the repo owner # Test whether user is the repo owner
@ -519,7 +526,21 @@ def org_repo_share(request, url_prefix):
for share_to in share_to_list: for share_to in share_to_list:
# if share_to is user name, the format is: 'example@mail.com'; # if share_to is user name, the format is: 'example@mail.com';
# if share_to is group, the format is 'group_name <creator@mail.com>' # if share_to is group, the format is 'group_name <creator@mail.com>'
if (share_to.split(' ')[0].find('@') == -1): if share_to == 'all':
''' Share to public '''
try:
seafserv_threaded_rpc.set_org_inner_pub_repo(org.org_id,
repo_id, permission)
except:
msg = u'共享到公共资料失败'
message.add_message(request, message.ERROR, msg)
continue
msg = u'共享公共资料成功,请前往<a href="%s">共享管理</a>查看。' % \
(reverse('org_shareadmin', args=[org.url_prefix]))
messages.add_message(request, messages.INFO, msg)
elif (share_to.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(share_to.split(' ')) < 2: if len(share_to.split(' ')) < 2:
@ -541,7 +562,7 @@ def org_repo_share(request, url_prefix):
org.org_id, org.org_id,
group.id, group.id,
from_email, from_email,
'rw') permission)
find = True find = True
msg = u'共享到 %s 成功,请前往<a href="%s">共享管理</a>查看。' % \ msg = u'共享到 %s 成功,请前往<a href="%s">共享管理</a>查看。' % \
(group_name, reverse('org_shareadmin', args=[org.url_prefix])) (group_name, reverse('org_shareadmin', args=[org.url_prefix]))
@ -562,7 +583,7 @@ def org_repo_share(request, url_prefix):
# Record share info to db. # Record share info to db.
try: try:
seafserv_threaded_rpc.add_share(repo_id, from_email, share_to, seafserv_threaded_rpc.add_share(repo_id, from_email, share_to,
'rw') permission)
msg = u'共享给 %s 成功,请前往<a href="%s">共享管理</a>查看。' % \ msg = u'共享给 %s 成功,请前往<a href="%s">共享管理</a>查看。' % \
(share_to, reverse('org_shareadmin', args=[org.url_prefix])) (share_to, reverse('org_shareadmin', args=[org.url_prefix]))
messages.add_message(request, messages.INFO, msg) messages.add_message(request, messages.INFO, msg)
@ -585,37 +606,42 @@ def org_shareadmin(request, url_prefix):
if not org: if not org:
return HttpResponseRedirect(reverse(myhome)) return HttpResponseRedirect(reverse(myhome))
# Org repos that are shared to others. shared_repos = []
out_repos = list_org_shared_repos(username, 'from_email', -1, -1)
# Org repos that are shared to groups. # personal repos shared by this user
shared_repos += seafserv_threaded_rpc.list_org_share_repos(org.org_id,
username,
'from_email',
-1, -1)
# repos shared to groups
group_repos = seafserv_threaded_rpc.get_org_group_repos_by_owner(org.org_id, group_repos = seafserv_threaded_rpc.get_org_group_repos_by_owner(org.org_id,
username) username)
for group_repo in group_repos: for repo in group_repos:
repo_id = group_repo.props.repo_id group = ccnet_threaded_rpc.get_group(int(repo.group_id))
if not repo_id:
continue
repo = get_repo(repo_id)
if not repo:
continue
group_id = group_repo.props.group_id
group = ccnet_threaded_rpc.get_group(int(group_id))
if not group: if not group:
repo.props.user = ''
continue continue
repo.props.shared_email = group.props.group_name repo.props.user = group.props.group_name
repo.props.share_permission = group_repo.props.permission shared_repos += group_repos
repo.gid = group_id
out_repos.append(repo) # public repos shared by this user
pub_repos = seafserv_threaded_rpc.list_org_inner_pub_repos_by_owner(org.org_id,
username)
for repo in pub_repos:
repo.props.user = '所有团体成员'
shared_repos += pub_repos
for repo in out_repos: for repo in shared_repos:
if repo.props.share_permission == 'rw': if repo.props.permission == 'rw':
repo.share_permission = '可读写' repo.share_permission = '可读写'
elif repo.props.share_permission == 'r': elif repo.props.permission == 'r':
repo.share_permission = '只可浏览' repo.share_permission = '只可浏览'
else: else:
repo.share_permission = '' repo.share_permission = ''
shared_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id))
# File shared links # File shared links
fileshares = FileShare.objects.filter(username=request.user.username) fileshares = FileShare.objects.filter(username=request.user.username)
o_fileshares = [] # shared files in org repos o_fileshares = [] # shared files in org repos
@ -630,7 +656,7 @@ def org_shareadmin(request, url_prefix):
return render_to_response('repo/share_admin.html', { return render_to_response('repo/share_admin.html', {
"org": org, "org": org,
"out_repos": out_repos, "shared_repos": shared_repos,
"fileshares": o_fileshares, "fileshares": o_fileshares,
"protocol": request.is_secure() and 'https' or 'http', "protocol": request.is_secure() and 'https' or 'http',
"domain": RequestSite(request).domain, "domain": RequestSite(request).domain,

View File

@ -5,28 +5,36 @@
{% block right_panel %} {% block right_panel %}
<h3>我共享的同步目录</h3> <h3>我共享的同步目录</h3>
{% if out_repos %} {% if shared_repos %}
<table class="repo-list"> <table class="repo-list">
<tr> <tr>
<th width="5%"><!--icon--></th> <th width="5%"><!--icon--></th>
<th width="20%">名字</th> <th width="20%">名字</th>
<th width="25%">共享给</th> <th width="25%">共享给</th>
<th width="10%">权限</th> <th width="10%">权限</th>
<th width="37%">描述</th> <th width="35%">描述</th>
<th width="8%">操作</th> <th width="10%">操作</th>
</tr> </tr>
{% for repo in out_repos %} {% for repo in shared_repos %}
<tr> <tr>
<td><img src="{{MEDIA_URL}}img/sync-folder-20.png" alt="目录icon" /></td> <td><img src="{{MEDIA_URL}}img/sync-folder-20.png" alt="目录icon" /></td>
<td><a href="{{ SITE_ROOT }}repo/{{ repo.props.id }}">{{ repo.props.name }}</a></td> <td><a href="{{ SITE_ROOT }}repo/{{ repo.props.repo_id }}">{{ repo.props.repo_name }}</a></td>
<td>{{ repo.props.shared_email }}</td> <td>{{ repo.props.user }}</td>
<td>{{ repo.share_permission }}</td> <td>{{ repo.share_permission }}</td>
<td>{{ repo.props.desc }}</td> <td>{{ repo.props.repo_desc }}</td>
<td> <td>
{% if repo.gid %} {% if repo.props.share_type == 'group' %}
<a href="#" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&from={{ request.user }}&gid={{ repo.gid }}" class="cancel-share op">删除</a> <a href="#" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.repo_id }}&from={{ request.user }}&gid={{ repo.props.group_id }}" class="cancel-share op">取消共享</a>
{% endif %}
{% if repo.props.share_type == 'personal' %}
<a href="#" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.repo_id }}&from={{ request.user }}&to={{ repo.props.user }}" class="cancel-share op">取消共享</a>
{% endif %}
{% if repo.props.share_type == 'public' %}
{% if not org %}
<a href="#" data="{{ SITE_ROOT }}repo/unsetinnerpub/{{ repo.props.repo_id }}" class="cancel-share op">取消共享</a>
{% else %} {% else %}
<a href="#" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&from={{ request.user }}&to={{ repo.props.shared_email }}" class="cancel-share op">删除</a> <a href="#" data="{{ SITE_ROOT }}organizations/{{ org.url_prefix }}/innerpubrepo/unset/{{ repo.props.repo_id }}" class="cancel-share op">取消共享</a>
{% endif %}
{% endif %} {% endif %}
</td> </td>
</tr> </tr>

View File

@ -23,6 +23,11 @@ from seahub.share.models import FileShare
from seahub.views import validate_owner, is_registered_user from seahub.views import validate_owner, is_registered_user
from seahub.utils import render_permission_error, string2list from seahub.utils import render_permission_error, string2list
try:
from seahub.settings import CLOUD_MODE
except ImportError:
CLOUD_MODE = False
@login_required @login_required
def share_repo(request): def share_repo(request):
""" """
@ -53,7 +58,23 @@ 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.find('@') == -1: if to_email == 'all':
''' Share to public '''
# ignore 'all' if we're running in cloud mode
if not CLOUD_MODE:
try:
seafserv_threaded_rpc.set_inner_pub_repo(repo_id, permission)
except:
msg = u'共享到公共资料失败'
message.add_message(request, message.ERROR, msg)
continue
msg = u'共享公共资料成功,请前往<a href="%s">共享管理</a>查看。' % \
(reverse('share_admin'))
messages.add_message(request, messages.INFO, msg)
elif to_email.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
group_name = to_email group_name = to_email
@ -114,36 +135,39 @@ def share_admin(request):
""" """
username = request.user.username username = request.user.username
# personal repos that are share to user shared_repos = []
out_repos = list_personal_shared_repos(username, 'from_email', -1, -1)
# repos that are share to groups # personal repos shared by this user
shared_repos += seafserv_threaded_rpc.list_share_repos(username, 'from_email',
-1, -1)
# repos shared to groups
group_repos = seafserv_threaded_rpc.get_group_repos_by_owner(username) group_repos = seafserv_threaded_rpc.get_group_repos_by_owner(username)
for group_repo in group_repos: for repo in group_repos:
repo_id = group_repo.props.repo_id group = ccnet_threaded_rpc.get_group(int(repo.group_id))
if not repo_id:
continue
repo = get_repo(repo_id)
if not repo:
continue
group_id = group_repo.props.group_id
group = ccnet_threaded_rpc.get_group(int(group_id))
if not group: if not group:
repo.props.user = ''
continue continue
repo.props.shared_email = group.props.group_name repo.props.user = group.props.group_name
repo.props.share_permission = group_repo.props.permission shared_repos += group_repos
repo.gid = group_id
out_repos.append(repo) if not CLOUD_MODE:
# public repos shared by this user
pub_repos = seafserv_threaded_rpc.list_inner_pub_repos_by_owner(username)
for repo in pub_repos:
repo.props.user = '所有人'
shared_repos += pub_repos
for repo in out_repos: for repo in shared_repos:
if repo.props.share_permission == 'rw': if repo.props.permission == 'rw':
repo.share_permission = '可读写' repo.share_permission = '可读写'
elif repo.props.share_permission == 'r': elif repo.props.permission == 'r':
repo.share_permission = '只可浏览' repo.share_permission = '只可浏览'
else: else:
repo.share_permission = '' repo.share_permission = ''
shared_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id))
# Repo anonymous share links # Repo anonymous share links
# out_links = AnonymousShare.objects.filter(repo_owner=request.user.username) # out_links = AnonymousShare.objects.filter(repo_owner=request.user.username)
# for link in out_links: # for link in out_links:
@ -162,7 +186,8 @@ def share_admin(request):
p_fileshares.append(fs) p_fileshares.append(fs)
return render_to_response('repo/share_admin.html', { return render_to_response('repo/share_admin.html', {
"out_repos": out_repos, "org": None,
"shared_repos": shared_repos,
# "out_links": out_links, # "out_links": out_links,
"fileshares": p_fileshares, "fileshares": p_fileshares,
"protocol": request.is_secure() and 'https' or 'http', "protocol": request.is_secure() and 'https' or 'http',

View File

@ -33,17 +33,18 @@
{% for repo in public_repos %} {% for repo in public_repos %}
<tr> <tr>
<td><img src="{{MEDIA_URL}}img/sync-folder-20.png" alt="目录icon" /></td> <td><img src="{{MEDIA_URL}}img/sync-folder-20.png" alt="目录icon" /></td>
<td><a href="{% url 'repo' repo.id %}">{{ repo.props.name }}</a></td> <td><a href="{% url 'repo' repo.props.repo_id %}">{{ repo.props.repo_name }}</a></td>
<td>{{ repo.props.desc }}</td> <td>{{ repo.props.repo_desc }}</td>
{% if repo.latest_modify %} {% if repo.props.last_modified %}
<td>{{ repo.latest_modify|translate_commit_time }}</td> <td>{{ repo.props.last_modified|translate_commit_time }}</td>
{% else %} {% else %}
<td>--</td> <td>--</td>
{% endif %} {% endif %}
<td>{{ repo.owner|email2nickname }}</td> <td>{{ repo.props.user|email2nickname }}</td>
<td> <td>
<img src="{{ MEDIA_URL }}img/download-20.png" data="{{ repo.props.id }}" class="download-btn op-icon vh" title="下载到本地" alt="下载" /> {% if repo.user_perm == 'rw' %}
<img src="{{ MEDIA_URL }}img/delete-20.png" data="{% url 'views.unset_inner_pub_repo' repo.id %}" class="unshare-btn op-icon vh" title="取消共享" alt="取消共享" /> <img src="{{ MEDIA_URL }}img/download-20.png" data="{{ repo.props.repo_id }}" class="download-btn op-icon vh" title="下载到本地" alt="下载" />
{% endif %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -4,6 +4,13 @@
<input id="repo-name" type="text" name="repo_name" value="" /><br /> <input id="repo-name" type="text" name="repo_name" value="" /><br />
<label>描述:</label><br/> <label>描述:</label><br/>
<textarea id="repo-desc" name="repo_desc"></textarea> <textarea id="repo-desc" name="repo_desc"></textarea>
{% if create_shared_repo %}
<label style="display:block">共享权限:</label>
<select name="permission">
<option value="rw" selected="selected">可读写</option>
<option value="r">只可浏览</option>
</select>
{% endif %}
<div class="repo-create-encryption"> <div class="repo-create-encryption">
<input type="checkbox" name="encryption" id="encrypt-switch" /><label>加密</label><br /> <input type="checkbox" name="encryption" id="encrypt-switch" /><label>加密</label><br />
<label>密码:</label><span class="tip">(3到15个字符)</span><br /> <label>密码:</label><span class="tip">(3到15个字符)</span><br />

View File

@ -31,6 +31,9 @@ $('#repo-create-submit').click(function() {
data: { data: {
'repo_name': $('#repo-name').val(), 'repo_name': $('#repo-name').val(),
'repo_desc': $('#repo-desc').val(), 'repo_desc': $('#repo-desc').val(),
{% if create_shared_repo %}
'permission': $('#repo-create-form select[name="permission"]').val(),
{% endif %}
'encryption': $('#encrypt-switch').attr('checked') ? 1 : 0, 'encryption': $('#encrypt-switch').attr('checked') ? 1 : 0,
'passwd': passwd.val(), 'passwd': passwd.val(),
'passwd_again': passwd_again.val() 'passwd_again': passwd_again.val()

View File

@ -1,12 +1,14 @@
<form id="repo-share-form" action="{{ post_url }}" method="post" name="repo-share-form" class="hide"> <form id="repo-share-form" action="{{ post_url }}" method="post" name="repo-share-form" class="hide">
{% if allow_public_share %}
<label>邮箱或群组,输入 all 共享到公共资料:</label><br />
{% else %}
<label>邮箱或群组:</label><br /> <label>邮箱或群组:</label><br />
{% endif %}
<textarea id="email_or_group" name="email_or_group"></textarea> <textarea id="email_or_group" name="email_or_group"></textarea>
<div> <select name="permission">
<select id="share-permission" name="permission">
<option value="rw" selected="selected">可读写</option> <option value="rw" selected="selected">可读写</option>
<option value="r">只可浏览</option> <option value="r">只可浏览</option>
</select> </select>
</div>
<input id="repo_id" type="hidden" name="repo_id" value="" /> <input id="repo_id" type="hidden" name="repo_id" value="" />
<p class="tip">{{ tips }}</p> <p class="tip">{{ tips }}</p>
<p class="error hide"></p> <p class="error hide"></p>

View File

@ -14,17 +14,19 @@
{% for repo in in_repos %} {% for repo in in_repos %}
<tr> <tr>
<td><img src="{{MEDIA_URL}}img/sync-folder-20.png" alt="目录icon" /></td> <td><img src="{{MEDIA_URL}}img/sync-folder-20.png" alt="目录icon" /></td>
<td><a href="{{ SITE_ROOT }}repo/{{ repo.props.id }}">{{ repo.props.name }}</a></td> <td><a href="{{ SITE_ROOT }}repo/{{ repo.props.repo_id }}">{{ repo.props.repo_name }}</a></td>
<td>{{ repo.props.desc }}</td> <td>{{ repo.props.repo_desc }}</td>
{% if repo.latest_modify %} {% if repo.props.last_modified %}
<td>{{ repo.latest_modify|translate_commit_time }}</td> <td>{{ repo.props.last_modified|translate_commit_time }}</td>
{% else %} {% else %}
<td>--</td> <td>--</td>
{% endif %} {% endif %}
<td>{{ repo.props.shared_email|email2nickname }}</td> <td>{{ repo.props.user|email2nickname }}</td>
<td> <td>
<img src="{{ MEDIA_URL }}img/download-20.png" data="{{ repo.props.id }}" class="download-btn op-icon vh" title="下载到本地" alt="下载" /> {% if repo.user_perm == 'rw' %}
<img src="{{ MEDIA_URL }}img/delete-20.png" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.id }}&from={{ repo.shared_email }}&to={{ request.user }}" class="unshare-btn op-icon vh" title="取消共享" alt="取消共享" /> <img src="{{ MEDIA_URL }}img/download-20.png" data="{{ repo.props.repo_id }}" class="download-btn op-icon vh" title="下载到本地" alt="下载" />
{% endif %}
<img src="{{ MEDIA_URL }}img/delete-20.png" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.repo_id }}&from={{ repo.props.user }}&to={{ request.user }}" class="unshare-btn op-icon vh" title="取消共享" alt="取消共享" />
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -521,21 +521,22 @@ def get_org_groups_by_repo(org_id, repo_id):
return groups return groups
# inner pub repo # inner pub repo
def list_inner_pub_repos(): def list_inner_pub_repos(username):
""" """
List inner pub repos, which can be access by everyone. List inner pub repos, which can be access by everyone.
""" """
inner_pub_repos = seafserv_threaded_rpc.list_inner_pub_repos()
for repo in inner_pub_repos:
repo.owner = seafserv_threaded_rpc.get_repo_owner(repo.id)
try: try:
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime shared_repos = seafserv_threaded_rpc.list_inner_pub_repos()
except: except:
repo.latest_modify = None shared_repos = []
inner_pub_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) for repo in shared_repos:
return inner_pub_repos perm = seafserv_threaded_rpc.check_permission(repo.props.repo_id,
username)
repo.user_perm = perm
shared_repos.sort(lambda x, y: cmp(y.props.last_modified, x.props.last_modified))
return shared_repos
def is_inner_pub_repo(repo_id): def is_inner_pub_repo(repo_id):
""" """
@ -550,25 +551,23 @@ def is_inner_pub_repo(repo_id):
return ret return ret
# org inner pub repo # org inner pub repo
def list_org_inner_pub_repos(org_id, start=None, limit=None): def list_org_inner_pub_repos(org_id, username, start=None, limit=None):
""" """
List org inner pub repos, which can be access by all org members. List org inner pub repos, which can be access by all org members.
""" """
try: try:
repos = seafserv_threaded_rpc.list_org_inner_pub_repos(org_id) shared_repos = seafserv_threaded_rpc.list_org_inner_pub_repos(org_id)
except SearpcError: except SearpcError:
repos = [] shared_repos = []
# calculate repo's lastest modify time for repo in shared_repos:
for repo in repos: perm = seafserv_threaded_rpc.check_permission(repo.props.repo_id,
repo.owner = seafserv_threaded_rpc.get_org_repo_owner(repo.id) username)
try: repo.user_perm = perm
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
except: # sort repos by last modify time
repo.latest_modify = None shared_repos.sort(lambda x, y: cmp(y.props.last_modified, x.props.last_modified))
# sort repos by latest modify time return shared_repos
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return repos
# repo permissoin # repo permissoin
def check_permission(repo_id, user): def check_permission(repo_id, user):
@ -606,48 +605,35 @@ def list_personal_shared_repos(user, user_type, start, limit):
If `user_type` is 'to_email', list repos others sahre to user. If `user_type` is 'to_email', list repos others sahre to user.
""" """
try: try:
repos = seafserv_threaded_rpc.list_share_repos(user, user_type, share_repos = seafserv_threaded_rpc.list_share_repos(user, user_type,
start, limit) start, limit)
except SearpcError: except SearpcError:
repos = [] share_repos = []
p_repos = [] for repo in share_repos:
if repos: repo.user_perm = check_permission(repo.props.repo_id, user)
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)) share_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified))
return p_repos return share_repos
def list_org_shared_repos(user, user_type, start, limit): def list_org_shared_repos(org_id, user, user_type, start, limit):
""" """
List org repos that user share with others. List org repos that user share with others.
If `user_type` is 'from_email', list repos user shares to 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. If `user_type` is 'to_email', list repos others sahre to user.
""" """
try: try:
repos = seafserv_threaded_rpc.list_share_repos(user, user_type, share_repos = seafserv_threaded_rpc.list_org_share_repos(org_id,
user, user_type,
start, limit) start, limit)
except SearpcError: except SearpcError:
repos = [] share_repos = []
o_repos = [] for repo in share_repos:
if repos: repo.user_perm = check_permission(repo.props.repo_id, user)
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)) share_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified))
return o_repos return share_repos
def is_valid_filename(file_or_dir): def is_valid_filename(file_or_dir):
""" """

View File

@ -55,7 +55,7 @@ from notifications.models import UserNotification
from profile.models import Profile from profile.models import Profile
from forms import AddUserForm, FileLinkShareForm, RepoCreateForm, \ from forms import AddUserForm, FileLinkShareForm, RepoCreateForm, \
RepoNewDirForm, RepoNewFileForm, FileCommentForm, RepoRenameFileForm, \ RepoNewDirForm, RepoNewFileForm, FileCommentForm, RepoRenameFileForm, \
RepoPassowrdForm RepoPassowrdForm, SharedRepoCreateForm
from utils import render_permission_error, render_error, list_to_string, \ from utils import render_permission_error, render_error, list_to_string, \
get_httpserver_root, get_ccnetapplet_root, gen_token, \ get_httpserver_root, get_ccnetapplet_root, gen_token, \
calculate_repo_last_modify, valid_previewed_file, \ calculate_repo_last_modify, valid_previewed_file, \
@ -790,6 +790,13 @@ 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
try:
from settings import CLOUD_MODE
except:
CLOUD_MODE = False
allow_public_share = True if not CLOUD_MODE else False
return render_to_response('myhome.html', { return render_to_response('myhome.html', {
"myname": email, "myname": email,
"nickname": nickname, "nickname": nickname,
@ -803,6 +810,8 @@ 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,
"create_shared_repo": False,
"allow_public_share": allow_public_share,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required
@ -824,7 +833,7 @@ def public_home(request):
# form = MessageForm() # form = MessageForm()
users = get_emailusers(-1, -1) users = get_emailusers(-1, -1)
public_repos = list_inner_pub_repos() public_repos = list_inner_pub_repos(request.user.username)
# """inner pub messages""" # """inner pub messages"""
# # Make sure page request is an int. If not, deliver first page. # # Make sure page request is an int. If not, deliver first page.
@ -855,6 +864,7 @@ def public_home(request):
return render_to_response('public_home.html', { return render_to_response('public_home.html', {
'users': users, 'users': users,
'public_repos': public_repos, 'public_repos': public_repos,
'create_shared_repo': True,
# 'form': form, # 'form': form,
# 'innerpub_msgs': innerpub_msgs, # 'innerpub_msgs': innerpub_msgs,
# 'current_page': current_page, # 'current_page': current_page,
@ -943,19 +953,22 @@ def public_repo_create(request):
result = {} result = {}
content_type = 'application/json; charset=utf-8' content_type = 'application/json; charset=utf-8'
form = RepoCreateForm(request.POST) form = SharedRepoCreateForm(request.POST)
if form.is_valid(): if form.is_valid():
repo_name = form.cleaned_data['repo_name'] repo_name = form.cleaned_data['repo_name']
repo_desc = form.cleaned_data['repo_desc'] repo_desc = form.cleaned_data['repo_desc']
permission = form.cleaned_data['permission']
passwd = form.cleaned_data['passwd'] passwd = form.cleaned_data['passwd']
user = request.user.username user = request.user.username
print permission
try: try:
# create a repo # create a repo
repo_id = seafserv_threaded_rpc.create_repo(repo_name, repo_desc, repo_id = seafserv_threaded_rpc.create_repo(repo_name, repo_desc,
user, passwd) user, passwd)
# set this repo as inner pub # set this repo as inner pub
seafserv_threaded_rpc.set_inner_pub_repo(repo_id) seafserv_threaded_rpc.set_inner_pub_repo(repo_id, permission)
except: except:
repo_id = None repo_id = None
if not repo_id: if not repo_id:
@ -973,7 +986,10 @@ def unset_inner_pub_repo(request, repo_id):
seafserv_threaded_rpc.unset_inner_pub_repo(repo_id) seafserv_threaded_rpc.unset_inner_pub_repo(repo_id)
except SearpcError: except SearpcError:
pass pass
return HttpResponseRedirect(reverse('public_home'))
messages.add_message(request, messages.INFO, '操作成功')
return HttpResponseRedirect(reverse('share_admin'))
@login_required @login_required
def ownerhome(request, owner_name): def ownerhome(request, owner_name):