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:
parent
58efc80107
commit
d30f7c4bbb
@ -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 ''
|
||||
|
5
forms.py
5
forms.py
@ -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):
|
||||
"""
|
||||
|
@ -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 %}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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 %}
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
@ -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',
|
||||
|
@ -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 %}
|
||||
|
@ -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 />
|
||||
|
@ -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()
|
||||
|
@ -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>
|
||||
|
@ -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 %}
|
||||
|
@ -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):
|
||||
"""
|
||||
|
26
views.py
26
views.py
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user