mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-22 20:08:19 +00:00
Fix a few bugs for multi-tenancy
Squashed commit of the following: commit 2d7a7867df01abc2e347ee5b0af957275b367ac2 Author: zhengxie <xiez1989@gmail.com> Date: Wed May 28 15:48:30 2014 +0800 Fix org virtual repos commit 85c9981e7f1ac1f15dcc66eada0e482b05b91179 Author: zhengxie <xiez1989@gmail.com> Date: Tue May 27 16:45:32 2014 +0800 Fix share permission editing in share admin commit c35efec6f6db7157266537f6cf74b321fb386aab Author: zhengxie <xiez1989@gmail.com> Date: Tue May 27 16:35:53 2014 +0800 Fix listing Shared/Group repos commit 3400118e5778f8840575f02ead560c7f1cb61a00 Author: zhengxie <xiez1989@gmail.com> Date: Tue May 27 15:05:17 2014 +0800 Fix share/unshare repo to users commit 4c663ca8767fe34d903ca3828695253eb50f36eb Author: zhengxie <xiez1989@gmail.com> Date: Fri May 23 18:33:22 2014 +0800 Fix share/unshare inner pub repos
This commit is contained in:
@@ -76,11 +76,8 @@ $('.share-permission-select').change(function() {
|
||||
select_cont = $(this).parent(),
|
||||
user = select_cont.prev(),
|
||||
share_type = select_cont.parent().attr('data');
|
||||
{% if org %}
|
||||
var url = '{% url 'org_share_permission_admin' org.url_prefix %}?org_id={{ org.org_id }}&share_type=' + share_type;
|
||||
{% else %}
|
||||
var url = '{% url 'share_permission_admin' %}?share_type=' + share_type;
|
||||
{% endif %}
|
||||
var url = '{% url 'share_permission_admin' %}?share_type=' + share_type;
|
||||
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'POST',
|
||||
|
@@ -50,7 +50,7 @@
|
||||
<a href="{% url 'repo_remove_share' %}?repo_id={{ repo.props.repo_id }}&from={{ request.user.username|urlencode }}&to={{ repo.props.user|urlencode }}" class="cancel-share op vh">{% trans "Unshare"%}</a>
|
||||
{% endif %}
|
||||
{% if repo.props.share_type == 'public' %}
|
||||
<a href="#" data="{% url 'unsetinnerpub' repo.repo_id %}" class="cancel-share op vh">{% trans "Unshare"%}</a>
|
||||
<a href="{% url 'unsetinnerpub' repo.repo_id %}" class="cancel-share op vh">{% trans "Unshare"%}</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
@@ -16,8 +16,8 @@ from django.contrib import messages
|
||||
import seaserv
|
||||
from seaserv import seafile_api
|
||||
from seaserv import ccnet_threaded_rpc, is_org_group, \
|
||||
get_org_id_by_group, del_org_group_repo, get_group_repos_by_owner, \
|
||||
remove_share
|
||||
get_org_id_by_group, del_org_group_repo
|
||||
from pysearpc import SearpcError
|
||||
|
||||
from seahub.share.forms import RepoShareForm, FileLinkShareForm, \
|
||||
UploadLinkShareForm
|
||||
@@ -56,6 +56,15 @@ def list_org_inner_pub_repos_by_owner(org_id, username):
|
||||
return seaserv.seafserv_threaded_rpc.list_org_inner_pub_repos_by_owner(
|
||||
org_id, username)
|
||||
|
||||
def org_share_repo(org_id, repo_id, from_user, to_user, permission):
|
||||
return seaserv.seafserv_threaded_rpc.org_add_share(org_id, repo_id,
|
||||
from_user, to_user,
|
||||
permission)
|
||||
|
||||
def org_remove_share(org_id, repo_id, from_user, to_user):
|
||||
return seaserv.seafserv_threaded_rpc.org_remove_share(org_id, repo_id,
|
||||
from_user, to_user)
|
||||
|
||||
########## functions
|
||||
|
||||
def share_to_public(request, repo, permission):
|
||||
@@ -127,24 +136,37 @@ def share_to_user(request, repo, to_user, permission):
|
||||
messages.error(request, msg)
|
||||
return
|
||||
|
||||
if is_registered_user(to_user):
|
||||
try:
|
||||
# permission check
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
if not seaserv.ccnet_threaded_rpc.org_user_exists(org_id, to_user):
|
||||
msg = _(u'Failed to share to %s, user is not found.') % to_user
|
||||
messages.error(request, msg)
|
||||
return
|
||||
else:
|
||||
if not is_registered_user(to_user):
|
||||
msg = _(u'Failed to share to %s, as the email is not registered.') % to_user
|
||||
messages.error(request, msg)
|
||||
return
|
||||
|
||||
try:
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
org_share_repo(org_id, repo_id, from_user, to_user, permission)
|
||||
else:
|
||||
seafile_api.share_repo(repo_id, from_user, to_user, permission)
|
||||
except Exception, e:
|
||||
except SearpcError as e:
|
||||
logger.error(e)
|
||||
msg = _(u'Failed to share to %s, please try again later.') % to_user
|
||||
messages.error(request, msg)
|
||||
else:
|
||||
# send a signal when sharing repo successful
|
||||
share_repo_to_user_successful.send(sender=None,
|
||||
from_user=from_user,
|
||||
to_user=to_user, repo=repo)
|
||||
msg = _(u'Shared to %(email)s successfully,go check it at <a href="%(share)s">Shares</a>.') % \
|
||||
{'email':to_user, 'share':reverse('share_admin')}
|
||||
messages.success(request, msg)
|
||||
else:
|
||||
msg = _(u'Failed to share to %s, as the email is not registered.') % to_user
|
||||
messages.error(request, msg)
|
||||
# send a signal when sharing repo successful
|
||||
share_repo_to_user_successful.send(sender=None,
|
||||
from_user=from_user,
|
||||
to_user=to_user, repo=repo)
|
||||
msg = _(u'Shared to %(email)s successfully, go check it at <a href="%(share)s">Shares</a>.') % \
|
||||
{'email': to_user, 'share': reverse('share_admin')}
|
||||
messages.success(request, msg)
|
||||
|
||||
def check_user_share_quota(username, repo, users=[], groups=[]):
|
||||
"""Check whether user has enough quota when share repo to users/groups.
|
||||
@@ -266,7 +288,12 @@ def repo_remove_share(request):
|
||||
|
||||
if username != from_email and username != to_email:
|
||||
return render_permission_error(request, _(u'Failed to remove share'))
|
||||
remove_share(repo_id, from_email, to_email)
|
||||
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
org_remove_share(org_id, repo_id, from_email, to_email)
|
||||
else:
|
||||
seaserv.remove_share(repo_id, from_email, to_email)
|
||||
else:
|
||||
try:
|
||||
group_id = int(group_id)
|
||||
@@ -292,65 +319,26 @@ def repo_remove_share(request):
|
||||
next = request.META.get('HTTP_REFERER', SITE_ROOT)
|
||||
return HttpResponseRedirect(next)
|
||||
|
||||
# @login_required
|
||||
# def share_admin(request):
|
||||
# """
|
||||
# List share out libraries.
|
||||
# """
|
||||
# username = request.user.username
|
||||
|
||||
# shared_repos = []
|
||||
|
||||
# # personal repos shared by this user
|
||||
# shared_repos += list_share_repos(username, 'from_email', -1, -1)
|
||||
|
||||
# # repos shared to groups
|
||||
# group_repos = get_group_repos_by_owner(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.user = group.props.group_name
|
||||
# repo.props.user_info = repo.group_id
|
||||
# shared_repos += group_repos
|
||||
|
||||
# if not CLOUD_MODE:
|
||||
# # public repos shared by this user
|
||||
# pub_repos = list_inner_pub_repos_by_owner(username)
|
||||
# for repo in pub_repos:
|
||||
# repo.props.user = _(u'all members')
|
||||
# repo.props.user_info = 'all'
|
||||
# shared_repos += pub_repos
|
||||
|
||||
# for repo in shared_repos:
|
||||
# if repo.props.permission == 'rw':
|
||||
# repo.share_permission = _(u'Read-Write')
|
||||
# elif repo.props.permission == 'r':
|
||||
# repo.share_permission = _(u'Read-Only')
|
||||
# else:
|
||||
# repo.share_permission = ''
|
||||
|
||||
# if repo.props.share_type == 'personal':
|
||||
# repo.props.user_info = repo.props.user
|
||||
|
||||
# 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:
|
||||
# # repo = get_repo(link.repo_id)
|
||||
# # link.repo_name = repo.name
|
||||
# # link.remain_time = anon_share_token_generator.get_remain_time(link.token)
|
||||
|
||||
# return render_to_response('repo/share_admin.html', {
|
||||
# "org": None,
|
||||
# "shared_repos": shared_repos,
|
||||
# # "out_links": out_links,
|
||||
# }, context_instance=RequestContext(request))
|
||||
def get_share_out_repo_list(request):
|
||||
"""List repos that @user share to other users.
|
||||
|
||||
Returns:
|
||||
A list of repos.
|
||||
"""
|
||||
username = request.user.username
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
return seafile_api.get_org_share_out_repo_list(org_id, username,
|
||||
-1, -1)
|
||||
else:
|
||||
return seafile_api.get_share_out_repo_list(username, -1, -1)
|
||||
|
||||
def get_group_repos_by_owner(request):
|
||||
"""List repos that @user share to groups.
|
||||
|
||||
Returns:
|
||||
A list of repos.
|
||||
"""
|
||||
username = request.user.username
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
@@ -358,22 +346,26 @@ def get_group_repos_by_owner(request):
|
||||
else:
|
||||
return seaserv.get_group_repos_by_owner(username)
|
||||
|
||||
def get_inner_pub_repo_list(request):
|
||||
def list_inner_pub_repos_by_owner(request):
|
||||
"""List repos that @user share to organizatoin.
|
||||
|
||||
Returns:
|
||||
A list of repos, or empty list if in cloud_mode.
|
||||
"""
|
||||
username = request.user.username
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
return list_org_inner_pub_repos_by_owner(org_id, username)
|
||||
elif request.cloud_mode:
|
||||
return seaserv.list_inner_pub_repos_by_owner(username)
|
||||
else:
|
||||
return []
|
||||
else:
|
||||
return seaserv.list_inner_pub_repos_by_owner(username)
|
||||
|
||||
def list_share_out_repos(request):
|
||||
shared_repos = []
|
||||
username = request.user.username
|
||||
|
||||
# repos shared from this user
|
||||
shared_repos += seafile_api.get_share_out_repo_list(username, -1, -1)
|
||||
shared_repos += get_share_out_repo_list(request)
|
||||
|
||||
# repos shared to groups
|
||||
group_repos = get_group_repos_by_owner(request)
|
||||
@@ -386,8 +378,8 @@ def list_share_out_repos(request):
|
||||
repo.props.user_info = repo.group_id
|
||||
shared_repos += group_repos
|
||||
|
||||
# pub repos
|
||||
pub_repos = get_inner_pub_repo_list(request)
|
||||
# inner pub repos
|
||||
pub_repos = list_inner_pub_repos_by_owner(request)
|
||||
for repo in pub_repos:
|
||||
repo.props.user = _(u'all members')
|
||||
repo.props.user_info = 'all'
|
||||
@@ -418,7 +410,7 @@ def list_shared_repos(request):
|
||||
repo.props.user_info = repo.props.user
|
||||
out_repos.append(repo)
|
||||
|
||||
out_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id))
|
||||
out_repos.sort(lambda x, y: cmp(x.repo_name, y.repo_name))
|
||||
|
||||
return render_to_response('share/repos.html', {
|
||||
"out_repos": out_repos,
|
||||
@@ -570,8 +562,13 @@ def share_permission_admin(request):
|
||||
content_type=content_type)
|
||||
|
||||
try:
|
||||
seafile_api.set_share_permission(repo_id, from_email,
|
||||
email_or_group, permission)
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
seaserv.seafserv_threaded_rpc.org_set_share_permission(
|
||||
org_id, repo_id, from_email, email_or_group, permission)
|
||||
else:
|
||||
seafile_api.set_share_permission(repo_id, from_email,
|
||||
email_or_group, permission)
|
||||
except SearpcError:
|
||||
return HttpResponse(json.dumps({'success': False}), status=500,
|
||||
content_type=content_type)
|
||||
@@ -580,8 +577,13 @@ def share_permission_admin(request):
|
||||
|
||||
elif share_type == 'group':
|
||||
try:
|
||||
seafile_api.set_group_repo_permission(int(email_or_group),
|
||||
repo_id, permission)
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
seaserv.seafserv_threaded_rpc.set_org_group_repo_permission(
|
||||
org_id, int(email_or_group), repo_id, permission)
|
||||
else:
|
||||
seafile_api.set_group_repo_permission(int(email_or_group),
|
||||
repo_id, permission)
|
||||
except SearpcError:
|
||||
return HttpResponse(json.dumps({'success': False}), status=500,
|
||||
content_type=content_type)
|
||||
|
@@ -891,79 +891,19 @@ def get_owned_repo_list(request):
|
||||
else:
|
||||
return seafile_api.get_owned_repo_list(username)
|
||||
|
||||
def get_share_in_repo_list(request, start, limit):
|
||||
"""List share in repos;
|
||||
"""
|
||||
username = request.user.username
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
return seafile_api.get_org_share_in_repo_list(org_id, username, -1, -1)
|
||||
else:
|
||||
return seafile_api.get_share_in_repo_list(username, -1, -1)
|
||||
def get_virtual_repos_by_owner(request):
|
||||
"""List virtual repos.
|
||||
|
||||
def get_groups_by_user(request):
|
||||
"""List user groups.
|
||||
Arguments:
|
||||
- `request`:
|
||||
"""
|
||||
username = request.user.username
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
return seaserv.get_org_groups_by_user(org_id, username)
|
||||
return seaserv.seafserv_threaded_rpc.get_org_virtual_repos_by_owner(
|
||||
org_id, username)
|
||||
else:
|
||||
return seaserv.get_personal_groups_by_user(username)
|
||||
|
||||
def get_group_repos(request, groups):
|
||||
"""Get repos shared to groups.
|
||||
"""
|
||||
username = request.user.username
|
||||
group_repos = []
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
# For each group I joined...
|
||||
for grp in groups:
|
||||
# Get group repos, and for each group repos...
|
||||
for r_id in seafile_api.get_org_group_repoids(org_id, grp.id):
|
||||
# No need to list my own repo
|
||||
repo_owner = seafile_api.get_org_repo_owner(r_id)
|
||||
if repo_owner == username:
|
||||
continue
|
||||
# Convert repo properties due to the different collumns in Repo
|
||||
# and SharedRepo
|
||||
r = get_repo(r_id)
|
||||
if not r:
|
||||
continue
|
||||
r.repo_id = r.id
|
||||
r.repo_name = r.name
|
||||
r.repo_desc = r.desc
|
||||
r.last_modified = get_repo_last_modify(r)
|
||||
r.share_type = 'group'
|
||||
r.user = repo_owner
|
||||
r.user_perm = check_permission(r_id, username)
|
||||
r.group = grp
|
||||
group_repos.append(r)
|
||||
else:
|
||||
# For each group I joined...
|
||||
for grp in groups:
|
||||
# Get group repos, and for each group repos...
|
||||
for r_id in seafile_api.get_group_repoids(grp.id):
|
||||
# No need to list my own repo
|
||||
repo_owner = seafile_api.get_repo_owner(r_id)
|
||||
if repo_owner == username:
|
||||
continue
|
||||
# Convert repo properties due to the different collumns in Repo
|
||||
# and SharedRepo
|
||||
r = get_repo(r_id)
|
||||
if not r:
|
||||
continue
|
||||
r.repo_id = r.id
|
||||
r.repo_name = r.name
|
||||
r.repo_desc = r.desc
|
||||
r.last_modified = get_repo_last_modify(r)
|
||||
r.share_type = 'group'
|
||||
r.user = repo_owner
|
||||
r.user_perm = check_permission(r_id, username)
|
||||
r.group = grp
|
||||
group_repos.append(r)
|
||||
return group_repos
|
||||
return seafile_api.get_virtual_repos_by_owner(username)
|
||||
|
||||
@login_required
|
||||
@user_mods_check
|
||||
@@ -981,7 +921,7 @@ def myhome(request):
|
||||
sub_repos = []
|
||||
sub_lib_enabled = UserOptions.objects.is_sub_lib_enabled(username)
|
||||
if ENABLE_SUB_LIBRARY and sub_lib_enabled:
|
||||
sub_repos = seafile_api.get_virtual_repos_by_owner(username)
|
||||
sub_repos = get_virtual_repos_by_owner(request)
|
||||
for repo in sub_repos:
|
||||
repo.abbrev_origin_path = get_abbrev_origin_path(repo.origin_repo_name,
|
||||
repo.origin_path)
|
||||
@@ -1127,55 +1067,30 @@ def client_unsync(request):
|
||||
return HttpResponse(json.dumps({'error': _(u'Internal server error')}),
|
||||
status=500, content_type=content_type)
|
||||
|
||||
# @login_required
|
||||
# def innerpub_msg_reply(request, msg_id):
|
||||
# """Show inner pub message replies, and process message reply in ajax"""
|
||||
|
||||
# content_type = 'application/json; charset=utf-8'
|
||||
# if request.is_ajax():
|
||||
# ctx = {}
|
||||
# if request.method == 'POST':
|
||||
# form = MessageReplyForm(request.POST)
|
||||
|
||||
# # TODO: invalid form
|
||||
# if form.is_valid():
|
||||
# msg = form.cleaned_data['message']
|
||||
# try:
|
||||
# innerpub_msg = InnerPubMsg.objects.get(id=msg_id)
|
||||
# except InnerPubMsg.DoesNotExist:
|
||||
# return HttpResponseBadRequest(content_type=content_type)
|
||||
|
||||
# msg_reply = InnerPubMsgReply()
|
||||
# msg_reply.reply_to = innerpub_msg
|
||||
# msg_reply.from_email = request.user.username
|
||||
# msg_reply.message = msg
|
||||
# msg_reply.save()
|
||||
|
||||
# ctx['reply'] = msg_reply
|
||||
# html = render_to_string("group/group_reply_new.html", ctx)
|
||||
|
||||
# else:
|
||||
# try:
|
||||
# msg = InnerPubMsg.objects.get(id=msg_id)
|
||||
# except InnerPubMsg.DoesNotExist:
|
||||
# raise HttpResponse(status=400)
|
||||
|
||||
# replies = InnerPubMsgReply.objects.filter(reply_to=msg)
|
||||
# ctx['replies'] = replies
|
||||
# html = render_to_string("group/group_reply_list.html", ctx)
|
||||
|
||||
# serialized_data = json.dumps({"html": html})
|
||||
# return HttpResponse(serialized_data, content_type=content_type)
|
||||
# else:
|
||||
# return HttpResponseBadRequest(content_type=content_type)
|
||||
@login_required
|
||||
def unsetinnerpub(request, repo_id):
|
||||
"""Unshare repos in organization or in share admin page.
|
||||
|
||||
Only system admin, organization admin or repo owner can perform this op.
|
||||
"""
|
||||
repo = get_repo(repo_id)
|
||||
if not repo:
|
||||
messages.error(request, _('Failed to unshare the library, as it does not exist.'))
|
||||
return HttpResponseRedirect(reverse('share_admin'))
|
||||
|
||||
# TODO: permission check
|
||||
# permission check
|
||||
username = request.user.username
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
repo_owner = seafile_api.get_org_repo_owner(repo.id)
|
||||
is_repo_owner = True if repo_owner == username else False
|
||||
if not (request.user.org.is_staff or is_repo_owner):
|
||||
raise Http404
|
||||
else:
|
||||
repo_owner = seafile_api.get_repo_owner(repo.id)
|
||||
is_repo_owner = True if repo_owner == username else False
|
||||
if not (request.user.is_staff or is_repo_owner):
|
||||
raise Http404
|
||||
|
||||
try:
|
||||
if is_org_context(request):
|
||||
|
@@ -1148,8 +1148,13 @@ def sub_repo(request, repo_id):
|
||||
|
||||
# check if the sub-lib exist
|
||||
try:
|
||||
sub_repo = seafile_api.get_virtual_repo(repo_id, path, username)
|
||||
except SearpcError, e:
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
sub_repo = seaserv.seafserv_threaded_rpc.get_org_virtual_repo(
|
||||
org_id, repo_id, path, username)
|
||||
else:
|
||||
sub_repo = seafile_api.get_virtual_repo(repo_id, path, username)
|
||||
except SearpcError as e:
|
||||
result['error'] = e.msg
|
||||
return HttpResponse(json.dumps(result), status=500, content_type=content_type)
|
||||
|
||||
@@ -1159,7 +1164,14 @@ def sub_repo(request, repo_id):
|
||||
# create a sub-lib
|
||||
try:
|
||||
# use name as 'repo_name' & 'repo_desc' for sub_repo
|
||||
sub_repo_id = seafile_api.create_virtual_repo(repo_id, path, name, name, username)
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
sub_repo_id = seaserv.seafserv_threaded_rpc.create_org_virtual_repo(
|
||||
org_id, repo_id, path, name, name, username)
|
||||
else:
|
||||
sub_repo_id = seafile_api.create_virtual_repo(repo_id, path,
|
||||
name, name,
|
||||
username)
|
||||
result['sub_repo_id'] = sub_repo_id
|
||||
except SearpcError, e:
|
||||
result['error'] = e.msg
|
||||
@@ -1388,6 +1400,88 @@ def space_and_traffic(request):
|
||||
context_instance=RequestContext(request))
|
||||
return HttpResponse(json.dumps({"html": html}), content_type=content_type)
|
||||
|
||||
def get_share_in_repo_list(request, start, limit):
|
||||
"""List share in repos.
|
||||
"""
|
||||
username = request.user.username
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
repo_list = seafile_api.get_org_share_in_repo_list(org_id, username,
|
||||
-1, -1)
|
||||
else:
|
||||
repo_list = seafile_api.get_share_in_repo_list(username, -1, -1)
|
||||
|
||||
for repo in repo_list:
|
||||
repo.user_perm = seafile_api.check_repo_access_permission(repo.repo_id,
|
||||
username)
|
||||
return repo_list
|
||||
|
||||
def get_groups_by_user(request):
|
||||
"""List user groups.
|
||||
"""
|
||||
username = request.user.username
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
return seaserv.get_org_groups_by_user(org_id, username)
|
||||
else:
|
||||
return seaserv.get_personal_groups_by_user(username)
|
||||
|
||||
def get_group_repos(request, groups):
|
||||
"""Get repos shared to groups.
|
||||
"""
|
||||
username = request.user.username
|
||||
group_repos = []
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
# For each group I joined...
|
||||
for grp in groups:
|
||||
# Get group repos, and for each group repos...
|
||||
for r_id in seafile_api.get_org_group_repoids(org_id, grp.id):
|
||||
# No need to list my own repo
|
||||
repo_owner = seafile_api.get_org_repo_owner(r_id)
|
||||
if repo_owner == username:
|
||||
continue
|
||||
# Convert repo properties due to the different collumns in Repo
|
||||
# and SharedRepo
|
||||
r = get_repo(r_id)
|
||||
if not r:
|
||||
continue
|
||||
r.repo_id = r.id
|
||||
r.repo_name = r.name
|
||||
r.repo_desc = r.desc
|
||||
r.last_modified = get_repo_last_modify(r)
|
||||
r.share_type = 'group'
|
||||
r.user = repo_owner
|
||||
r.user_perm = seafile_api.check_repo_access_permission(
|
||||
r_id, username)
|
||||
r.group = grp
|
||||
group_repos.append(r)
|
||||
else:
|
||||
# For each group I joined...
|
||||
for grp in groups:
|
||||
# Get group repos, and for each group repos...
|
||||
for r_id in seafile_api.get_group_repoids(grp.id):
|
||||
# No need to list my own repo
|
||||
repo_owner = seafile_api.get_repo_owner(r_id)
|
||||
if repo_owner == username:
|
||||
continue
|
||||
# Convert repo properties due to the different collumns in Repo
|
||||
# and SharedRepo
|
||||
r = get_repo(r_id)
|
||||
if not r:
|
||||
continue
|
||||
r.repo_id = r.id
|
||||
r.repo_name = r.name
|
||||
r.repo_desc = r.desc
|
||||
r.last_modified = get_repo_last_modify(r)
|
||||
r.share_type = 'group'
|
||||
r.user = repo_owner
|
||||
r.user_perm = seafile_api.check_repo_access_permission(
|
||||
r_id, username)
|
||||
r.group = grp
|
||||
group_repos.append(r)
|
||||
return group_repos
|
||||
|
||||
@login_required
|
||||
def my_shared_and_group_repos(request):
|
||||
"""Return html snippet of repos that shared to user and group repos.
|
||||
@@ -1400,39 +1494,13 @@ def my_shared_and_group_repos(request):
|
||||
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
|
||||
username = request.user.username
|
||||
|
||||
shared_repos = seafile_api.get_share_in_repo_list(username, -1, -1)
|
||||
for repo in shared_repos:
|
||||
repo.user_perm = seafile_api.check_repo_access_permission(repo.repo_id, username)
|
||||
|
||||
# shared
|
||||
shared_repos = get_share_in_repo_list(request, -1, -1)
|
||||
shared_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified))
|
||||
|
||||
group_repos = []
|
||||
# Get all personal groups I joined.
|
||||
joined_groups = request.user.joined_groups
|
||||
# For each group I joined...
|
||||
for grp in joined_groups:
|
||||
# Get group repos, and for each group repos...
|
||||
for r_id in seaserv.get_group_repoids(grp.id):
|
||||
# No need to list my own repo
|
||||
repo_owner = seafile_api.get_repo_owner(r_id)
|
||||
if repo_owner == username:
|
||||
continue
|
||||
# Convert repo properties due to the different collumns in Repo
|
||||
# and SharedRepo
|
||||
r = seaserv.get_repo(r_id)
|
||||
if not r:
|
||||
continue
|
||||
r.repo_id = r.id
|
||||
r.repo_name = r.name
|
||||
r.repo_desc = r.desc
|
||||
r.last_modified = get_repo_last_modify(r)
|
||||
r.share_type = 'group'
|
||||
r.user = repo_owner
|
||||
r.user_perm = seaserv.check_permission(r_id, username)
|
||||
r.group = grp
|
||||
group_repos.append(r)
|
||||
# group repos
|
||||
joined_groups = get_groups_by_user(request)
|
||||
group_repos = get_group_repos(request, joined_groups)
|
||||
group_repos.sort(key=lambda x: x.group.group_name)
|
||||
for i, repo in enumerate(group_repos):
|
||||
if i == 0:
|
||||
@@ -1441,19 +1509,18 @@ def my_shared_and_group_repos(request):
|
||||
if repo.group.group_name != group_repos[i-1].group.group_name:
|
||||
repo.show_group_name = True
|
||||
|
||||
ctx_shared = {
|
||||
"shared_repos": shared_repos,
|
||||
}
|
||||
ctx_group = {
|
||||
"group_repos": group_repos,
|
||||
}
|
||||
shared_repos_html = render_to_string('snippets/my_shared_repos.html', ctx_shared,
|
||||
context_instance=RequestContext(request))
|
||||
group_repos_html = render_to_string('snippets/my_group_repos.html', ctx_group,
|
||||
context_instance=RequestContext(request))
|
||||
ctx_shared = {"shared_repos": shared_repos}
|
||||
ctx_group = {"group_repos": group_repos}
|
||||
shared_repos_html = render_to_string(
|
||||
'snippets/my_shared_repos.html', ctx_shared,
|
||||
context_instance=RequestContext(request))
|
||||
group_repos_html = render_to_string(
|
||||
'snippets/my_group_repos.html', ctx_group,
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
return HttpResponse(json.dumps({"shared": shared_repos_html, "group": group_repos_html}),
|
||||
content_type=content_type)
|
||||
return HttpResponse(json.dumps({"shared": shared_repos_html,
|
||||
"group": group_repos_html}),
|
||||
content_type=content_type)
|
||||
|
||||
@login_required
|
||||
def get_file_op_url(request, repo_id):
|
||||
|
@@ -44,7 +44,7 @@ from seahub.contacts.models import Contact
|
||||
from seahub.share.models import FileShare, PrivateFileDirShare
|
||||
from seahub.wiki.utils import get_wiki_dirent
|
||||
from seahub.wiki.models import WikiDoesNotExist, WikiPageMissing
|
||||
from seahub.utils import show_delete_days, render_error, \
|
||||
from seahub.utils import show_delete_days, render_error, is_org_context, \
|
||||
get_file_type_and_ext, gen_file_get_url, gen_file_share_link, \
|
||||
render_permission_error, \
|
||||
is_textual_file, show_delete_days, mkstemp, EMPTY_SHA1, HtmlDiff, \
|
||||
@@ -320,7 +320,11 @@ def view_file(request, repo_id):
|
||||
return render_permission_error(request, _(u'Unable to view file'))
|
||||
|
||||
# check if the user is the owner or not, for 'private share'
|
||||
is_repo_owner = seafile_api.is_repo_owner(username, repo.id)
|
||||
if is_org_context(request):
|
||||
repo_owner = seafile_api.get_org_repo_owner(repo.id)
|
||||
is_repo_owner = True if repo_owner == username else False
|
||||
else:
|
||||
is_repo_owner = seafile_api.is_repo_owner(username, repo.id)
|
||||
|
||||
# get file type and extension
|
||||
filetype, fileext = get_file_type_and_ext(u_filename)
|
||||
|
@@ -21,7 +21,7 @@ from seahub.share.models import FileShare, UploadLinkShare
|
||||
from seahub.views import gen_path_link, get_repo_dirents, \
|
||||
check_repo_access_permission
|
||||
|
||||
from seahub.utils import gen_file_upload_url, \
|
||||
from seahub.utils import gen_file_upload_url, is_org_context, \
|
||||
get_httpserver_root, gen_dir_share_link, gen_shared_upload_link, \
|
||||
get_max_upload_file_size, new_merge_with_no_conflict, \
|
||||
get_commit_before_new_merge
|
||||
@@ -204,7 +204,10 @@ def render_repo(request, repo):
|
||||
repo_size = get_repo_size(repo.id)
|
||||
no_quota = is_no_quota(repo.id)
|
||||
search_repo_id = None if repo.encrypted else repo.id
|
||||
repo_owner = seafile_api.get_repo_owner(repo.id)
|
||||
if is_org_context(request):
|
||||
repo_owner = seafile_api.get_org_repo_owner(repo.id)
|
||||
else:
|
||||
repo_owner = seafile_api.get_repo_owner(repo.id)
|
||||
is_repo_owner = True if repo_owner == username else False
|
||||
if is_repo_owner and not repo.is_virtual:
|
||||
show_repo_settings = True
|
||||
@@ -212,7 +215,9 @@ def render_repo(request, repo):
|
||||
show_repo_settings = False
|
||||
|
||||
more_start = None
|
||||
file_list, dir_list, dirent_more = get_repo_dirents(request, repo, head_commit, path, offset=0, limit=100)
|
||||
file_list, dir_list, dirent_more = get_repo_dirents(request, repo,
|
||||
head_commit, path,
|
||||
offset=0, limit=100)
|
||||
if dirent_more:
|
||||
more_start = 100
|
||||
zipped = get_nav_path(path, repo.name)
|
||||
|
Reference in New Issue
Block a user