mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-09 10:50:24 +00:00
Fixed a few bugs related to org. Using with tag to wrap template include
This commit is contained in:
@@ -21,13 +21,12 @@ def base(request):
|
||||
try:
|
||||
base_template = request.base_template
|
||||
except AttributeError:
|
||||
base_template = None
|
||||
base_template = 'myhome_base.html'
|
||||
return {
|
||||
'seafile_version': SEAFILE_VERSION,
|
||||
'seahub_title': SEAHUB_TITLE,
|
||||
'cloud_mode': request.cloud_mode,
|
||||
'org': org,
|
||||
'base_template': base_template,
|
||||
# 'account_type': settings.ACCOUNT_TYPE,
|
||||
}
|
||||
|
||||
|
@@ -28,7 +28,9 @@ def ctx_switch_required(func):
|
||||
group_id = kwargs.get('group_id', '')
|
||||
if repo_id and group_id:
|
||||
return func(request, *args, **kwargs)
|
||||
|
||||
if not repo_id and not group_id:
|
||||
return func(request, *args, **kwargs)
|
||||
|
||||
user = request.user.username
|
||||
if repo_id:
|
||||
org, base_template = check_and_get_org_by_repo(repo_id, user)
|
||||
@@ -36,7 +38,10 @@ def ctx_switch_required(func):
|
||||
if group_id:
|
||||
org, base_template = check_and_get_org_by_group(int(group_id), user)
|
||||
|
||||
request.user.org = org
|
||||
if org:
|
||||
request.user.org = org._dict
|
||||
else:
|
||||
request.user.org = None
|
||||
request.base_template = base_template
|
||||
return func(request, *args, **kwargs)
|
||||
return _decorated
|
||||
|
@@ -271,6 +271,10 @@ $('#user-profile').hover(
|
||||
}
|
||||
);
|
||||
{% include 'group/msg_reply_js.html' %}
|
||||
|
||||
{% url 'create_group_repo' group.id as repo_create_url %}
|
||||
{% with post_url=repo_create_url %}
|
||||
{% include 'snippets/repo_create_js.html' %}
|
||||
{% endwith %}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@@ -32,6 +32,7 @@ from seahub.views import is_registered_user
|
||||
from seahub.forms import RepoCreateForm
|
||||
|
||||
@login_required
|
||||
@ctx_switch_required
|
||||
def group_list(request):
|
||||
error_msg = None
|
||||
if request.method == 'POST':
|
||||
@@ -173,7 +174,7 @@ def render_group_info(request, group_id, form):
|
||||
|
||||
org = request.user.org
|
||||
if org:
|
||||
repos = get_org_group_repos(org.org_id, group_id_int,
|
||||
repos = get_org_group_repos(org['org_id'], group_id_int,
|
||||
request.user.username)
|
||||
else:
|
||||
repos = get_group_repos(group_id_int, request.user.username)
|
||||
@@ -247,7 +248,6 @@ def render_group_info(request, group_id, form):
|
||||
'next_page': current_page+1,
|
||||
'per_page': per_page,
|
||||
'page_next': page_next,
|
||||
'url': reverse('create_group_repo', args=[group_id]),
|
||||
}, context_instance=RequestContext(request));
|
||||
|
||||
@login_required
|
||||
@@ -394,7 +394,7 @@ def group_members(request, group_id):
|
||||
group = get_group(group_id)
|
||||
if not group:
|
||||
return HttpResponseRedirect(reverse('group_list', args=[]))
|
||||
|
||||
|
||||
if request.method == 'POST':
|
||||
"""
|
||||
Add group members.
|
||||
|
@@ -1,5 +1,6 @@
|
||||
{% extends "org_base.html" %}
|
||||
{% load seahub_tags avatar_tags %}
|
||||
{% load url from future %}
|
||||
|
||||
{% block nav_org_class %}class="cur"{% endblock %}
|
||||
|
||||
@@ -67,6 +68,10 @@
|
||||
{% block extra_script %}
|
||||
<script type="text/javascript">
|
||||
{% include "snippets/myhome_extra_script.html" %}
|
||||
|
||||
{% url 'org_inner_pub_repo_create' org.url_prefix as repo_create_url %}
|
||||
{% with post_url=repo_create_url %}
|
||||
{% include "snippets/repo_create_js.html" %}
|
||||
{% endwith %}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
{% extends "org_base.html" %}
|
||||
{% load seahub_tags group_avatar_tags %}
|
||||
{% load url from future %}
|
||||
|
||||
{% block nav_org_personal_class %}class="cur"{% endblock %}
|
||||
{% block left_panel %}
|
||||
@@ -22,6 +23,15 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block right_panel %}
|
||||
{% if messages %}
|
||||
{% autoescape off %}
|
||||
<ul class="messages hide">
|
||||
{% for message in messages %}
|
||||
<li class="info">{{ message }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endautoescape %}
|
||||
{% endif %}
|
||||
|
||||
<h3>我拥有的同步目录</h3>
|
||||
<button id="repo-create">新建同步目录</button>
|
||||
@@ -40,7 +50,7 @@
|
||||
{% if repo.latest_modify %}
|
||||
<td>{{ repo.latest_modify|translate_commit_time }}</td>
|
||||
{% else %}
|
||||
<td>--</tdb>
|
||||
<td>--</td>
|
||||
{% endif %}
|
||||
<td>
|
||||
<img src="{{ MEDIA_URL }}img/sync-20.png" data="{{ repo.props.id }}" class="download-btn vh" title="同步到本地" alt="同步" />
|
||||
@@ -52,7 +62,11 @@
|
||||
{% endif %}
|
||||
</table>
|
||||
|
||||
{% url 'org_repo_share' org.url_prefix as repo_share_url %}
|
||||
{% with post_url=repo_share_url %}
|
||||
{% include "snippets/repo_share_form.html" %}
|
||||
{% endwith %}
|
||||
|
||||
{% include "snippets/repo_create_form.html" %}
|
||||
|
||||
{% endblock %}
|
||||
@@ -60,6 +74,10 @@
|
||||
{% block extra_script %}
|
||||
<script type="text/javascript">
|
||||
{% include "snippets/myhome_extra_script.html" %}
|
||||
|
||||
{% url 'org_repo_create' org.url_prefix as repo_create_url %}
|
||||
{% with post_url=repo_create_url %}
|
||||
{% include "snippets/repo_create_js.html" %}
|
||||
{% endwith %}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@@ -12,9 +12,11 @@ urlpatterns = patterns('',
|
||||
url(r'^(?P<url_prefix>[^/]+)/innerpubrepo/create/$', org_inner_pub_repo_create, name='org_inner_pub_repo_create'),
|
||||
url(r'^(?P<url_prefix>[^/]+)/groups/$', org_groups, name='org_groups'),
|
||||
url(r'^([^/]+)/repo/create/$', org_repo_create, name='org_repo_create'),
|
||||
url(r'^([^/]+)/repo/history/(?P<repo_id>[^/]+)/$', repo_history, name='org_repo_history'),
|
||||
url(r'^([^/]+)/repo/(?P<repo_id>[^/]+)/$', repo, name='repo'),
|
||||
url(r'^([^/]+)/repo/history/(?P<repo_id>[^/]+)/$', repo_history, name='org_repo_history'),
|
||||
url(r'^(?P<url_prefix>[^/]+)/repo/share/$', org_repo_share, name='org_repo_share'),
|
||||
|
||||
url(r'^([^/]+)/repo/(?P<repo_id>[^/]+)/$', repo, name='repo'),
|
||||
|
||||
### Org admin ###
|
||||
url(r'^(?P<url_prefix>[^/]+)/seafadmin/$', org_seafadmin, name='org_seafadmin'),
|
||||
url(r'^(?P<url_prefix>[^/]+)/useradmin/$', org_useradmin, name='org_useradmin'),
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import sys
|
||||
|
||||
from seaserv import get_org_id_by_repo_id
|
||||
from seaserv import get_org_id_by_repo_id, list_org_repos_by_owner
|
||||
|
||||
def access_org_repo(request, repo_id):
|
||||
"""
|
||||
@@ -11,3 +11,14 @@ def access_org_repo(request, repo_id):
|
||||
cur_org_id = request.user.org['org_id']
|
||||
org_id = get_org_id_by_repo_id(repo_id)
|
||||
return True if cur_org_id == org_id else False
|
||||
|
||||
def validate_org_repo_owner(org_id, repo_id, user):
|
||||
"""
|
||||
Check whether user is the owner of org repo.
|
||||
"""
|
||||
org_repos = list_org_repos_by_owner(org_id, user)
|
||||
print org_id, user, org_repos
|
||||
for r in org_repos:
|
||||
if r.id == repo_id:
|
||||
return True
|
||||
return False
|
||||
|
@@ -15,13 +15,16 @@ from pysearpc import SearpcError
|
||||
from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, \
|
||||
get_orgs_by_user, get_org_repos, list_org_inner_pub_repos, \
|
||||
get_org_by_url_prefix, create_org, get_user_current_org, add_org_user, \
|
||||
remove_org_user, get_org_groups, is_valid_filename, \
|
||||
create_org_repo, get_org_id_by_group, get_org_groups_by_user
|
||||
remove_org_user, get_org_groups, is_valid_filename, org_user_exists, \
|
||||
create_org_repo, get_org_id_by_group, get_org_groups_by_user, \
|
||||
get_org_users_by_url_prefix
|
||||
|
||||
from decorators import org_staff_required
|
||||
from forms import OrgCreateForm
|
||||
from signals import org_user_added
|
||||
from utils import validate_org_repo_owner
|
||||
from notifications.models import UserNotification
|
||||
from share.forms import RepoShareForm
|
||||
from registration.models import RegistrationProfile
|
||||
from seahub.base.accounts import User
|
||||
from seahub.contacts import Contact
|
||||
@@ -69,15 +72,13 @@ def org_info(request, url_prefix):
|
||||
if not org:
|
||||
return HttpResponseRedirect(reverse(myhome))
|
||||
|
||||
org_members = ccnet_threaded_rpc.get_org_emailusers(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)
|
||||
|
||||
return render_to_response('organizations/org_info.html', {
|
||||
'org': org,
|
||||
'org_users': org_members,
|
||||
'repos': repos,
|
||||
'url': reverse(org_inner_pub_repo_create, args=[url_prefix]),
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
@@ -97,13 +98,17 @@ def org_personal(request, url_prefix):
|
||||
calculate_repo_last_modify(owned_repos)
|
||||
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
|
||||
|
||||
# org groups user created
|
||||
groups = get_org_groups_by_user(org.org_id, user)
|
||||
|
||||
# org members used in auto complete
|
||||
org_members = get_org_users_by_url_prefix(org.url_prefix, 0, MAX_INT)
|
||||
|
||||
return render_to_response('organizations/personal.html', {
|
||||
'owned_repos': owned_repos,
|
||||
'url': reverse('org_repo_create', args=[url_prefix]),
|
||||
'org': org,
|
||||
'groups': groups,
|
||||
'org_members': org_members,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
@@ -253,7 +258,7 @@ def org_useradmin(request, url_prefix):
|
||||
current_page = 1
|
||||
per_page = 25
|
||||
|
||||
users_plus_one = ccnet_threaded_rpc.get_org_emailusers(\
|
||||
users_plus_one = get_org_users_by_url_prefix(
|
||||
url_prefix, per_page * (current_page - 1), per_page + 1)
|
||||
if len(users_plus_one) == per_page + 1:
|
||||
page_next = True
|
||||
@@ -441,3 +446,60 @@ def org_group_remove(request, url_prefix, group_id):
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(next)
|
||||
|
||||
@login_required
|
||||
def org_repo_share(request, url_prefix):
|
||||
"""
|
||||
Share org repo to members in current org.
|
||||
"""
|
||||
if request.method != 'POST':
|
||||
raise Http404
|
||||
|
||||
org = get_user_current_org(request.user.username, url_prefix)
|
||||
if not org:
|
||||
return HttpResponseRedirect(reverse(myhome))
|
||||
|
||||
form = RepoShareForm(request.POST)
|
||||
if not form.is_valid():
|
||||
# TODO: may display error msg on form
|
||||
raise Http404
|
||||
|
||||
email_or_group = form.cleaned_data['email_or_group']
|
||||
repo_id = form.cleaned_data['repo_id']
|
||||
from_email = request.user.username
|
||||
|
||||
# Test whether user is the repo owner
|
||||
if not validate_org_repo_owner(org.org_id, repo_id, request.user.username):
|
||||
return render_permission_error(request, u'只有目录拥有者有权共享目录',
|
||||
extra_ctx={
|
||||
'org': org,
|
||||
'base_template': 'org_base.html',
|
||||
})
|
||||
|
||||
to_email_list = string2list(email_or_group)
|
||||
for to_email in to_email_list:
|
||||
# if to_email is user name, the format is: 'example@mail.com';
|
||||
# if to_email is group, the format is 'group_name <creator@mail.com>'
|
||||
if (to_email.split(' ')[0].find('@') == -1):
|
||||
pass
|
||||
else:
|
||||
''' Share repo to user '''
|
||||
# Test whether to_email is in this org
|
||||
if not org_user_exists(org.org_id, to_email):
|
||||
msg = u'共享给 %s 失败:团体中不存在该用户。' % to_email
|
||||
messages.add_message(request, messages.ERROR, msg)
|
||||
continue
|
||||
|
||||
# Record share info to db.
|
||||
try:
|
||||
seafserv_threaded_rpc.add_share(repo_id, from_email, to_email,
|
||||
'rw')
|
||||
msg = u'共享给 %s 成功,请前往<a href="%s">共享管理</a>查看。' % \
|
||||
(to_email, reverse('share_admin'))
|
||||
messages.add_message(request, messages.INFO, msg)
|
||||
except SearpcError, e:
|
||||
msg = u'共享给 %s 失败。' % to_email
|
||||
messages.add_message(request, messages.ERROR, msg)
|
||||
continue
|
||||
|
||||
return HttpResponseRedirect(reverse(org_personal, args=[org.url_prefix]))
|
||||
|
@@ -128,7 +128,11 @@
|
||||
<p>暂无</p>
|
||||
{% endif %}
|
||||
|
||||
{% url 'share_repo' as repo_share_url %}
|
||||
{% with post_url=repo_share_url %}
|
||||
{% include "snippets/repo_share_form.html" %}
|
||||
{% endwith %}
|
||||
|
||||
{% include "snippets/repo_create_form.html" %}
|
||||
|
||||
{% endblock %}
|
||||
@@ -136,6 +140,11 @@
|
||||
{% block extra_script %}
|
||||
<script type="text/javascript">
|
||||
{% include "snippets/myhome_extra_script.html" %}
|
||||
|
||||
{% url 'seahub.views.repo_create' as repo_create_url %}
|
||||
{% with post_url=repo_create_url %}
|
||||
{% include "snippets/repo_create_js.html" %}
|
||||
{% endwith %}
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@@ -56,6 +56,10 @@
|
||||
{% block extra_script %}
|
||||
<script type="text/javascript">
|
||||
{% include "snippets/myhome_extra_script.html" %}
|
||||
|
||||
{% url 'seahub.views.public_repo_create' as repo_create_url %}
|
||||
{% with post_url=repo_create_url %}
|
||||
{% include "snippets/repo_create_js.html" %}
|
||||
{% endwith %}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@@ -23,7 +23,7 @@ $('#repo-create-submit').click(function() {
|
||||
passwd_again = $('#repo-create-form input[name="passwd_again"]');
|
||||
|
||||
$.ajax({
|
||||
url: '{{ url }}',
|
||||
url: '{{ post_url }}',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
cache: 'false',
|
||||
|
@@ -1,4 +1,4 @@
|
||||
<form id="repo-share-form" action="{% url share.views.share_repo %}" method="post" name="repo-share-form" class="hide">
|
||||
<form id="repo-share-form" action="{{ post_url }}" method="post" name="repo-share-form" class="hide">
|
||||
<label>邮箱或小组:</label><br />
|
||||
<textarea id="email_or_group" name="email_or_group"></textarea>
|
||||
<input id="repo_id" type="hidden" name="repo_id" value="" />
|
||||
|
@@ -14,7 +14,8 @@ from service import get_repos, get_repo, get_commits, get_branches, \
|
||||
from service import get_binding_peerids, is_valid_filename, check_permission
|
||||
from service import create_org, get_orgs_by_user, get_org_by_url_prefix, \
|
||||
get_user_current_org, add_org_user, remove_org_user, get_org_by_id, \
|
||||
get_org_id_by_repo_id, is_org_staff
|
||||
get_org_id_by_repo_id, is_org_staff, get_org_users_by_url_prefix, \
|
||||
org_user_exists, list_org_repos_by_owner
|
||||
|
||||
from service import CCNET_CONF_PATH, CCNET_SERVER_ADDR, CCNET_SERVER_PORT
|
||||
|
||||
|
@@ -135,7 +135,7 @@ def get_org_groups(org_id, start, limit):
|
||||
|
||||
def get_org_groups_by_user(org_id, user):
|
||||
"""
|
||||
Get user's groups created in org.
|
||||
Get user's groups in org.
|
||||
"""
|
||||
try:
|
||||
groups_all = ccnet_threaded_rpc.get_groups(user)
|
||||
@@ -194,17 +194,10 @@ def get_org_id_by_group(group_id):
|
||||
org_id = -1
|
||||
return org_id
|
||||
|
||||
# org
|
||||
def create_org(org_name, url_prefix, username):
|
||||
ccnet_threaded_rpc.create_org(org_name, url_prefix, username)
|
||||
|
||||
def get_orgs_by_user(user):
|
||||
try:
|
||||
orgs = ccnet_threaded_rpc.get_orgs_by_user(user)
|
||||
except SearpcError:
|
||||
orgs = []
|
||||
|
||||
return orgs
|
||||
|
||||
def get_org_by_url_prefix(url_prefix):
|
||||
try:
|
||||
org = ccnet_threaded_rpc.get_org_by_url_prefix(url_prefix)
|
||||
@@ -221,13 +214,7 @@ def get_org_by_id(org_id):
|
||||
|
||||
return org
|
||||
|
||||
def get_user_current_org(user, url_prefix):
|
||||
orgs = get_orgs_by_user(user)
|
||||
for org in orgs:
|
||||
if org.url_prefix == url_prefix:
|
||||
return org
|
||||
return None
|
||||
|
||||
# org user
|
||||
def add_org_user(org_id, email, is_staff):
|
||||
try:
|
||||
ccnet_threaded_rpc.add_org_user(org_id, email, is_staff)
|
||||
@@ -240,6 +227,31 @@ def remove_org_user(org_id, email):
|
||||
except SearpcError:
|
||||
pass
|
||||
|
||||
def org_user_exists(org_id, user):
|
||||
try:
|
||||
ret = ccnet_threaded_rpc.org_user_exists(org_id, user)
|
||||
except SearpcError:
|
||||
ret = -1
|
||||
return True if ret == 1 else False
|
||||
|
||||
def get_org_users_by_url_prefix(url_prefix, start, limit):
|
||||
"""
|
||||
List org users.
|
||||
"""
|
||||
try:
|
||||
users = ccnet_threaded_rpc.get_org_emailusers(url_prefix, start, limit)
|
||||
except:
|
||||
users = []
|
||||
return users
|
||||
|
||||
def get_orgs_by_user(user):
|
||||
try:
|
||||
orgs = ccnet_threaded_rpc.get_orgs_by_user(user)
|
||||
except SearpcError:
|
||||
orgs = []
|
||||
|
||||
return orgs
|
||||
|
||||
def is_org_staff(org_id, user):
|
||||
"""
|
||||
Check whether user is staff of a org.
|
||||
@@ -249,7 +261,14 @@ def is_org_staff(org_id, user):
|
||||
except SearpcError:
|
||||
ret = -1
|
||||
return True if ret == 1 else False
|
||||
|
||||
|
||||
def get_user_current_org(user, url_prefix):
|
||||
orgs = get_orgs_by_user(user)
|
||||
for org in orgs:
|
||||
if org.url_prefix == url_prefix:
|
||||
return org
|
||||
return None
|
||||
|
||||
def send_command(command):
|
||||
client = pool.get_client()
|
||||
client.send_cmd(command)
|
||||
@@ -267,6 +286,7 @@ def get_repos():
|
||||
"""
|
||||
return seafserv_threaded_rpc.get_repo_list("", 100)
|
||||
|
||||
# org repo
|
||||
def create_org_repo(repo_name, repo_desc, user, passwd, org_id):
|
||||
"""
|
||||
Create org repo, return valid repo id if success.
|
||||
@@ -319,6 +339,14 @@ def get_org_id_by_repo_id(repo_id):
|
||||
org_id = ''
|
||||
return org_id
|
||||
|
||||
def list_org_repos_by_owner(org_id, user):
|
||||
try:
|
||||
repos = seafserv_threaded_rpc.list_org_repos_by_owner(org_id, user)
|
||||
except SearpcError:
|
||||
repos = []
|
||||
return repos
|
||||
|
||||
# repo
|
||||
def get_repo(repo_id):
|
||||
return seafserv_threaded_rpc.get_repo(repo_id)
|
||||
|
||||
|
8
utils.py
8
utils.py
@@ -352,8 +352,8 @@ def check_and_get_org_by_repo(repo_id, user):
|
||||
if org_id > 0:
|
||||
# this repo is org repo, get org info
|
||||
org = get_org_by_id(org_id)
|
||||
org.is_staff = is_org_staff(org_id, user)
|
||||
org.email = user
|
||||
org._dict['is_staff'] = is_org_staff(org_id, user)
|
||||
org._dict['email'] = user
|
||||
base_template = 'org_base.html'
|
||||
else:
|
||||
org = None
|
||||
@@ -370,8 +370,8 @@ def check_and_get_org_by_group(group_id, user):
|
||||
if org_id > 0:
|
||||
# this repo is org repo, get org info
|
||||
org = get_org_by_id(org_id)
|
||||
org.is_staff = is_org_staff(org_id, user)
|
||||
org.email = user
|
||||
org._dict['is_staff'] = is_org_staff(org_id, user)
|
||||
org._dict['email'] = user
|
||||
base_template = 'org_base.html'
|
||||
else:
|
||||
org = None
|
||||
|
2
views.py
2
views.py
@@ -666,7 +666,6 @@ def myhome(request):
|
||||
"grpmsg_list": grpmsg_list,
|
||||
"grpmsg_reply_list": grpmsg_reply_list,
|
||||
"orgmsg_list": orgmsg_list,
|
||||
"url": reverse(repo_create),
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
@@ -682,7 +681,6 @@ def public_home(request):
|
||||
return render_to_response('public_home.html', {
|
||||
'users': users,
|
||||
'public_repos': public_repos,
|
||||
"url": reverse(public_repo_create),
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
|
Reference in New Issue
Block a user