1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-01 23:38:37 +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):
"""Convert Chinese character to pinyin."""
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("两次输入的密码不一致")
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):
"""

View File

@ -68,7 +68,9 @@
</td>
<td>{{ repo.owner|email2nickname }}</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="下载到本地" />
{% endif %}
{% 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="取消共享" />
{% 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_personal_groups_by_user, get_group, get_group_members, \
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 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, \
check_and_get_org_by_repo
from seahub.views import is_registered_user
from seahub.forms import RepoCreateForm
from seahub.forms import RepoCreateForm, SharedRepoCreateForm
class GroupMixin(object):
def get_username(self):
@ -287,6 +287,9 @@ def render_group_info(request, group_id, form):
else:
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"""
# Make sure page request is an int. If not, deliver first page.
try:
@ -349,6 +352,7 @@ def render_group_info(request, group_id, form):
'next_page': current_page+1,
'per_page': per_page,
'page_next': page_next,
'create_shared_repo': True,
}, context_instance=RequestContext(request));
@login_required
@ -732,12 +736,13 @@ def create_group_repo(request, group_id):
if not is_group_user(group_id, request.user.username):
return json_error(u"创建失败:未加入该群组")
form = RepoCreateForm(request.POST)
form = SharedRepoCreateForm(request.POST)
if not form.is_valid():
return json_error(form.errors)
else:
repo_name = form.cleaned_data['repo_name']
repo_desc = form.cleaned_data['repo_desc']
permission = form.cleaned_data['permission']
encrypted = form.cleaned_data['encryption']
passwd = form.cleaned_data['passwd']
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,
org.org_id,
group_id,
user, 'rw')
user,
permission)
except SearpcError, e:
status = -1
@ -783,7 +789,8 @@ def create_group_repo(request, group_id):
try:
status = seafserv_threaded_rpc.group_share_repo(repo_id,
group_id,
user, 'rw')
user,
permission)
except SearpcError, e:
status = -1

View File

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

View File

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

View File

@ -31,7 +31,7 @@ from share.forms import RepoShareForm
from registration.models import RegistrationProfile
from seahub.base.accounts import User
from seahub.contacts import Contact
from seahub.forms import RepoCreateForm
from seahub.forms import RepoCreateForm, SharedRepoCreateForm
import seahub.settings as seahub_settings
from seahub.utils import render_error, render_permission_error, gen_token, \
validate_group_name, string2list, calculate_repo_last_modify, MAX_INT
@ -76,12 +76,13 @@ def org_info(request, url_prefix):
return HttpResponseRedirect(reverse(myhome))
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', {
'org': org,
'org_users': org_members,
'repos': repos,
'create_shared_repo': True,
}, context_instance=RequestContext(request))
@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))
# 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
groups = get_org_groups_by_user(org.org_id, user)
@ -122,6 +123,8 @@ def org_personal(request, url_prefix):
'org': org,
'groups': groups,
'contacts': contacts,
'create_shared_repo': False,
'allow_public_share': True,
}, context_instance=RequestContext(request))
@login_required
@ -136,10 +139,11 @@ def org_inner_pub_repo_create(request, url_prefix):
result = {}
content_type = 'application/json; charset=utf-8'
form = RepoCreateForm(request.POST)
form = SharedRepoCreateForm(request.POST)
if form.is_valid():
repo_name = form.cleaned_data['repo_name']
repo_desc = form.cleaned_data['repo_desc']
permission = form.cleaned_data['permission']
passwd = form.cleaned_data['passwd']
user = request.user.username
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,
org.org_id)
# 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:
repo_id = None
if not repo_id:
@ -174,8 +178,10 @@ def unset_org_inner_pub_repo(request, url_prefix, repo_id):
seafserv_threaded_rpc.unset_org_inner_pub_repo(org.org_id, repo_id)
except SearpcError:
pass
messages.add_message(request, messages.INFO, '操作成功')
return HttpResponseRedirect(reverse(org_info, args=[url_prefix]))
return HttpResponseRedirect(reverse(org_shareadmin, args=[url_prefix]))
@login_required
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']
repo_id = form.cleaned_data['repo_id']
permission = form.cleaned_data['permission']
from_email = request.user.username
# 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:
# 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.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 '''
# TODO: if we know group id, then we can simplly call group_share_repo
if len(share_to.split(' ')) < 2:
@ -541,7 +562,7 @@ def org_repo_share(request, url_prefix):
org.org_id,
group.id,
from_email,
'rw')
permission)
find = True
msg = u'共享到 %s 成功,请前往<a href="%s">共享管理</a>查看。' % \
(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.
try:
seafserv_threaded_rpc.add_share(repo_id, from_email, share_to,
'rw')
permission)
msg = u'共享给 %s 成功,请前往<a href="%s">共享管理</a>查看。' % \
(share_to, reverse('org_shareadmin', args=[org.url_prefix]))
messages.add_message(request, messages.INFO, msg)
@ -585,37 +606,42 @@ def org_shareadmin(request, 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)
shared_repos = []
# 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,
username)
for group_repo in group_repos:
repo_id = group_repo.props.repo_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))
username)
for repo in group_repos:
group = ccnet_threaded_rpc.get_group(int(repo.group_id))
if not group:
repo.props.user = ''
continue
repo.props.shared_email = group.props.group_name
repo.props.share_permission = group_repo.props.permission
repo.gid = group_id
out_repos.append(repo)
repo.props.user = group.props.group_name
shared_repos += group_repos
for repo in out_repos:
if repo.props.share_permission == 'rw':
# 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 shared_repos:
if repo.props.permission == 'rw':
repo.share_permission = '可读写'
elif repo.props.share_permission == 'r':
elif repo.props.permission == 'r':
repo.share_permission = '只可浏览'
else:
repo.share_permission = ''
shared_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id))
# File shared links
fileshares = FileShare.objects.filter(username=request.user.username)
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', {
"org": org,
"out_repos": out_repos,
"shared_repos": shared_repos,
"fileshares": o_fileshares,
"protocol": request.is_secure() and 'https' or 'http',
"domain": RequestSite(request).domain,

View File

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

View File

@ -23,6 +23,11 @@ from seahub.share.models import FileShare
from seahub.views import validate_owner, is_registered_user
from seahub.utils import render_permission_error, string2list
try:
from seahub.settings import CLOUD_MODE
except ImportError:
CLOUD_MODE = False
@login_required
def share_repo(request):
"""
@ -53,7 +58,23 @@ def share_repo(request):
to_email_list = string2list(email_or_group)
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 '''
# TODO: if we know group id, then we can simplly call group_share_repo
group_name = to_email
@ -114,36 +135,39 @@ def share_admin(request):
"""
username = request.user.username
# personal repos that are share to user
out_repos = list_personal_shared_repos(username, 'from_email', -1, -1)
shared_repos = []
# 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)
for group_repo in group_repos:
repo_id = group_repo.props.repo_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))
for repo in group_repos:
group = ccnet_threaded_rpc.get_group(int(repo.group_id))
if not group:
repo.props.user = ''
continue
repo.props.shared_email = group.props.group_name
repo.props.share_permission = group_repo.props.permission
repo.gid = group_id
out_repos.append(repo)
repo.props.user = group.props.group_name
shared_repos += group_repos
for repo in out_repos:
if repo.props.share_permission == 'rw':
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 shared_repos:
if repo.props.permission == 'rw':
repo.share_permission = '可读写'
elif repo.props.share_permission == 'r':
elif repo.props.permission == 'r':
repo.share_permission = '只可浏览'
else:
repo.share_permission = ''
shared_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id))
# Repo anonymous share links
# out_links = AnonymousShare.objects.filter(repo_owner=request.user.username)
# for link in out_links:
@ -162,7 +186,8 @@ def share_admin(request):
p_fileshares.append(fs)
return render_to_response('repo/share_admin.html', {
"out_repos": out_repos,
"org": None,
"shared_repos": shared_repos,
# "out_links": out_links,
"fileshares": p_fileshares,
"protocol": request.is_secure() and 'https' or 'http',

View File

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

View File

@ -4,6 +4,13 @@
<input id="repo-name" type="text" name="repo_name" value="" /><br />
<label>描述:</label><br/>
<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">
<input type="checkbox" name="encryption" id="encrypt-switch" /><label>加密</label><br />
<label>密码:</label><span class="tip">(3到15个字符)</span><br />

View File

@ -31,6 +31,9 @@ $('#repo-create-submit').click(function() {
data: {
'repo_name': $('#repo-name').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,
'passwd': passwd.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">
{% if allow_public_share %}
<label>邮箱或群组,输入 all 共享到公共资料:</label><br />
{% else %}
<label>邮箱或群组:</label><br />
{% endif %}
<textarea id="email_or_group" name="email_or_group"></textarea>
<div>
<select id="share-permission" name="permission">
<option value="rw" selected="selected">可读写</option>
<option value="r">只可浏览</option>
</select>
</div>
<select name="permission">
<option value="rw" selected="selected">可读写</option>
<option value="r">只可浏览</option>
</select>
<input id="repo_id" type="hidden" name="repo_id" value="" />
<p class="tip">{{ tips }}</p>
<p class="error hide"></p>

View File

@ -14,17 +14,19 @@
{% for repo in in_repos %}
<tr>
<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>{{ repo.props.desc }}</td>
{% if repo.latest_modify %}
<td>{{ repo.latest_modify|translate_commit_time }}</td>
<td><a href="{{ SITE_ROOT }}repo/{{ repo.props.repo_id }}">{{ repo.props.repo_name }}</a></td>
<td>{{ repo.props.repo_desc }}</td>
{% if repo.props.last_modified %}
<td>{{ repo.props.last_modified|translate_commit_time }}</td>
{% else %}
<td>--</td>
{% endif %}
<td>{{ repo.props.shared_email|email2nickname }}</td>
<td>{{ repo.props.user|email2nickname }}</td>
<td>
<img src="{{ MEDIA_URL }}img/download-20.png" data="{{ repo.props.id }}" class="download-btn op-icon vh" title="下载到本地" alt="下载" />
<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="取消共享" />
{% if repo.user_perm == 'rw' %}
<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>
</tr>
{% endfor %}

View File

@ -521,21 +521,22 @@ def get_org_groups_by_repo(org_id, repo_id):
return groups
# inner pub repo
def list_inner_pub_repos():
def list_inner_pub_repos(username):
"""
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:
shared_repos = seafserv_threaded_rpc.list_inner_pub_repos()
except:
shared_repos = []
try:
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
except:
repo.latest_modify = None
for repo in shared_repos:
perm = seafserv_threaded_rpc.check_permission(repo.props.repo_id,
username)
repo.user_perm = perm
inner_pub_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return inner_pub_repos
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):
"""
@ -550,25 +551,23 @@ def is_inner_pub_repo(repo_id):
return ret
# 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.
"""
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:
repos = []
# calculate repo's lastest modify time
for repo in repos:
repo.owner = seafserv_threaded_rpc.get_org_repo_owner(repo.id)
try:
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
except:
repo.latest_modify = None
# sort repos by latest modify time
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return repos
shared_repos = []
for repo in shared_repos:
perm = seafserv_threaded_rpc.check_permission(repo.props.repo_id,
username)
repo.user_perm = perm
# sort repos by last modify time
shared_repos.sort(lambda x, y: cmp(y.props.last_modified, x.props.last_modified))
return shared_repos
# repo permissoin
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.
"""
try:
repos = seafserv_threaded_rpc.list_share_repos(user, user_type,
start, limit)
share_repos = seafserv_threaded_rpc.list_share_repos(user, user_type,
start, limit)
except SearpcError:
repos = []
share_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)
for repo in share_repos:
repo.user_perm = check_permission(repo.props.repo_id, user)
p_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return p_repos
share_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified))
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.
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)
share_repos = seafserv_threaded_rpc.list_org_share_repos(org_id,
user, user_type,
start, limit)
except SearpcError:
repos = []
share_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)
for repo in share_repos:
repo.user_perm = check_permission(repo.props.repo_id, user)
o_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
return o_repos
share_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified))
return share_repos
def is_valid_filename(file_or_dir):
"""

View File

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