1
0
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:
xiez
2012-09-01 17:46:46 +08:00
parent 738c0e47e9
commit 12a6e0a87f
17 changed files with 190 additions and 44 deletions

View File

@@ -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,
}

View File

@@ -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

View File

@@ -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 %}

View File

@@ -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.

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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'),

View File

@@ -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

View File

@@ -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]))

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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',

View File

@@ -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="" />

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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