1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-18 00:00:00 +00:00

Add group management, and modify repo download link

This commit is contained in:
xiez
2012-05-16 14:10:54 +08:00
parent edb5ae0744
commit 91dbc381f4
7 changed files with 127 additions and 34 deletions

View File

@@ -5,22 +5,21 @@
{% block left_panel %}
<h3>管理员</h3>
{% for member in members %}
{% if member.props.is_staff == 1 %}
<p>{{ member.props.user_name }}</p>
{% if member.is_staff == 1 %}
<p>{{ member.short_username }}</p>
{% endif %}
{% endfor %}
<h3>成员</h3>
{% for member in members %}
{% if member.props.is_staff == 0 %}
<p>{{ member.props.user_name }}</p>
{% if member.is_staff == 0 %}
<p>{{ member.short_username }}</p>
{% endif %}
{% endfor %}
<h3>操作</h3>
<ul>
{% if is_staff %}
<li><a id="add-member" href="#">添加成员</a></li>
<li><a id="remove-member" href="#">删除成员</a></li>
<li><a id="remove-group" href="#">解散小组</a></li>
<li><a id="group-mgr" href="{{ SITE_ROOT }}group/manage/{{ group_id }}/">小组管理</a></li>
{% else %}
<li><a id="quit-group" href="#">退出小组</a></li>
{% endif %}
@@ -45,7 +44,7 @@
<td>{{ repo.props.desc }}</td>
<td>{{ repo.share_from }}</td>
<td>
<button data="{{ SITE_ROOT }}download/repo/?repo_id={{ repo.props.id }}" class="download-btn">下载</button>
<button data="{{ repo.props.id }}" class="download-btn">下载</button>
{% if is_staff or repo.share_from_me %}
<button data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&gid={{ group_id }}" class="repo-delete-btn">删除</button>
{% endif %}
@@ -70,12 +69,6 @@
<input type="submit" value="提交" />
</form>
<div id="dialog-remove-confirm" class="center hide">
<p>确定要解散?</p>
<button id="rm-yes-btn">确定</button>
<button class="simplemodal-close">取消</button>
</div>
<div id="dialog-quit-confirm" class="center hide">
<p>确定要退出?</p>
<button id="quit-yes-btn">确定</button>
@@ -90,22 +83,10 @@ $("#add-member").click(function() {
$("#member-add-form").modal({appendTo: "#main", containerCss:{padding:18}});
});
$("#remove-member").click(function() {
$("#member-remove-form").modal({appendTo: "#main", containerCss:{padding:18}});
});
$("#remove-group").click(function() {
$('#dialog-remove-confirm').modal({appendTo:'#main'});
});
$("#quit-group").click(function() {
$('#dialog-quit-confirm').modal({appendTo:'#main'});
});
$('#rm-yes-btn').click(function() {
location.href = "{{ SITE_ROOT }}group/rm/?gid={{ group_id }}";
});
$('#quit-yes-btn').click(function() {
location.href = "{{ SITE_ROOT }}group/quit/?gid={{ group_id }}";
});
@@ -114,5 +95,8 @@ $('.repo-delete-btn').click(function() {
location.href = $(this).attr('data');
});
$('.download-btn').click(function() {
window.open('{{ SITE_ROOT }}seafile_access_check/?repo_id=' + $(this).attr('data'));
});
</script>
{% endblock %}

View File

@@ -0,0 +1,59 @@
{% extends "myhome_base.html" %}
{% load seahub_tags %}
{% block nav_group_class %}class="cur"{% endblock %}
{% block left_panel %}
<ul>
<li><a id="group-info" href="{{ SITE_ROOT }}group/{{ group_id }}/">返回小组</a></li>
<li><a id="group-remove" href="#">解散小组</a></li>
</ul>
{% endblock %}
{% block right_panel %}
<h3>小组管理</h3>
{% if members %}
<table class="member-list">
<tr>
<th width="70%">邮箱</th>
<th width="30%">操作</th>
</tr>
{% for member in members %}
<tr>
<td>{{ member.user_name }}</td>
{% if not member.is_staff %}
<td><button data="{{ member.user_name }}" class="member-remove-btn">删除</button></td>
{% else %}
<td></td>
{% endif %}
</tr>
{% endfor %}
</table>
{% else %}
<p>暂无</p>
{% endif %}
<form id="member-remove-form" action="{{ SITE_ROOT }}group/memberrm/" method="post" name="member-remove-form" class="hide">
<label>邮箱</label><br />
<input id="user_name" name="user_name" value="" />
<input type="hidden" id="group_id" name="group_id" value="{{ group_id }}" />
<input type="submit" value="提交" />
</form>
{% endblock %}
{% block extra_script %}
<script type="text/javascript">
$("#group-remove").click(function() {
location.href = "{{ SITE_ROOT }}group/rm?gid={{ group_id }}";
});
$('.member-remove-btn').click(function() {
username = $(this).attr('data');
$("#user_name").val(username);
$("#member-remove-form").submit();
});
</script>
{% endblock %}

View File

@@ -2,7 +2,7 @@ from django.conf.urls.defaults import *
from views import group_list, group_add, group_info, \
group_add_member, group_remove_member, \
group_quit, group_remove
group_quit, group_remove, group_manage
urlpatterns = patterns('',
url(r'^$', group_list, name='group_list'),
@@ -11,5 +11,6 @@ urlpatterns = patterns('',
(r'^memberadd/$', group_add_member),
(r'^memberrm/$', group_remove_member),
(r'^quit/$', group_quit),
url(r'^manage/(?P<group_id>[^/]+)/$', group_manage, name='group_manage'),
url(r'^(?P<group_id>[^/]+)/$', group_info, name='group_info'),
)

View File

@@ -10,7 +10,7 @@ from seaserv import ccnet_rpc, seafserv_threaded_rpc, get_repo, \
get_group_repoids
from seahub.views import validate_emailuser
from seahub.utils import go_error, go_permission_error
from seahub.utils import go_error, go_permission_error, validate_group_name
from pysearpc import SearpcError
@@ -27,8 +27,8 @@ def group_add(request):
error_msg = None
if request.method == 'POST':
group_name = request.POST.get('group_name')
if group_name.find('@') >= 0:
return go_error(request, u'小组名称能包含@')
if not validate_group_name(group_name):
return go_error(request, u'小组名称能包含中英文字符,数字及下划线')
try:
ccnet_rpc.create_group(group_name.encode('utf-8'), request.user.username)
@@ -47,6 +47,10 @@ def group_remove(request):
except ValueError:
return HttpResponseRedirect(reverse('group_list', args=[]))
# check whether use is the group staff
if not ccnet_rpc.check_group_staff(group_id_int, request.user.username):
return go_permission_error(request, u'只有小组管理员有权解散小组')
try:
ccnet_rpc.remove_group(group_id_int, request.user.username)
seafserv_threaded_rpc.remove_repo_group(group_id_int, None)
@@ -62,6 +66,15 @@ def group_info(request, group_id):
except ValueError:
return HttpResponseRedirect(reverse('group_list', args=[]))
# check whether user belong to the group
joined = False
groups = ccnet_rpc.get_groups(request.user.username)
for group in groups:
if group.id == group_id_int:
joined = True
if not joined:
return go_error(request, u'未加入该小组')
group = ccnet_rpc.get_group(group_id_int)
if not group:
return HttpResponseRedirect(reverse('group_list', args=[]))
@@ -72,6 +85,8 @@ def group_info(request, group_id):
is_staff = False
members = ccnet_rpc.get_group_members(group_id_int)
for member in members:
member.short_username = member.user_name.split('@')[0]
repos = []
repo_ids = get_group_repoids(group_id=group_id_int)
@@ -136,7 +151,7 @@ def group_remove_member(request):
except SearpcError, e:
return go_error(request, e.msg)
return HttpResponseRedirect(reverse('group_info', args=[group_id]))
return HttpResponseRedirect(reverse('group_manage', args=[group_id]))
@login_required
def group_quit(request):
@@ -154,6 +169,24 @@ def group_quit(request):
return HttpResponseRedirect(reverse('group_list', args=[]))
@login_required
def group_manage(request, group_id):
try:
group_id_int = int(group_id)
except ValueError:
return HttpResponseRedirect(reverse('group_list', args=[]))
# check whether user is the group staff
if not ccnet_rpc.check_group_staff(group_id_int, request.user.username):
return go_permission_error(request, u'只有小组管理员有权管理小组')
members = ccnet_rpc.get_group_members(group_id_int)
return render_to_response('group/group_manage.html', {
'group_id': group_id_int,
'members': members,
}, context_instance=RequestContext(request))
def group_share_repo(request, repo_id, group_id, from_email):
"""
share a repo to a group
@@ -173,7 +206,7 @@ def group_share_repo(request, repo_id, group_id, from_email):
if not joined:
return go_error(request, u'共享失败:未加入该小组')
if seafserv_threaded_rpc.group_share_repo(repo_id, group_id, from_email) != 0:
if seafserv_threaded_rpc.group_share_repo(repo_id, group_id, from_email, 'rw') != 0:
return go_error(request, u'共享失败:内部错误')
def group_unshare_repo(request, repo_id, group_id, from_email):

View File

@@ -160,7 +160,7 @@ $(function() {
addConfirmTo($('.repo-delete-btn'));
$(".download-btn").click(function() {
window.open('/seafile_access_check/?repo_id=' + $(this).attr('data'));
window.open('{{ SITE_ROOT }}seafile_access_check/?repo_id=' + $(this).attr('data'));
});
});

View File

@@ -7,6 +7,7 @@ from django.template import RequestContext
from django.utils.hashcompat import sha_constructor
import time
import re
import settings
def go_permission_error(request, msg=None):
@@ -71,3 +72,11 @@ def gen_token():
token = sha_constructor(settings.SECRET_KEY + unicode(time.time())).hexdigest()[::8]
return token
def validate_group_name(group_name):
"""
Check whether group name is valid.
A valid group name only contains alphanumeric character
"""
return re.match('^\w+$', group_name, re.U)

View File

@@ -381,9 +381,12 @@ def repo_add_share(request):
group_name = to_email.split(' ')[0]
group_creator = to_email.split(' ')[1]
if validate_owner(request, repo_id):
# get all the groups the user joined
groups = ccnet_rpc.get_groups(request.user.username)
find = False
for group in groups:
# for every group that user joined, if group name and
# group creator matchs, then has find the group
if group.props.group_name == group_name and \
group_creator.find(group.props.creator_name) >= 0:
from seahub.group.views import group_share_repo
@@ -423,8 +426,12 @@ def repo_list_share(request):
if not repo_id:
continue
repo = get_repo(repo_id)
if not repo:
continue
group_id = group_repo.props.group_id
group = ccnet_rpc.get_group(int(group_id))
if not group:
continue
repo.props.shared_email = group.props.group_name
repo.gid = group_id