mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-16 15:19:06 +00:00
Modify org user add
This commit is contained in:
@@ -8,7 +8,7 @@ from django.http import HttpResponse, HttpResponseServerError
|
|||||||
|
|
||||||
from auth.decorators import login_required, api_login_required
|
from auth.decorators import login_required, api_login_required
|
||||||
|
|
||||||
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_groups, get_repos, \
|
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, \
|
||||||
get_repo, get_commits, get_branches, \
|
get_repo, get_commits, get_branches, \
|
||||||
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, get_ccnetuser, \
|
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, get_ccnetuser, \
|
||||||
get_group_repoids, check_group_staff
|
get_group_repoids, check_group_staff
|
||||||
|
@@ -7,7 +7,7 @@ from django.template import RequestContext
|
|||||||
|
|
||||||
from auth.decorators import login_required
|
from auth.decorators import login_required
|
||||||
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, get_repo, \
|
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, get_repo, \
|
||||||
get_group_repoids, check_group_staff, get_commits
|
get_group_repoids, check_group_staff, get_commits, get_personal_groups
|
||||||
from pysearpc import SearpcError
|
from pysearpc import SearpcError
|
||||||
|
|
||||||
from models import GroupMessage, MessageReply
|
from models import GroupMessage, MessageReply
|
||||||
@@ -41,7 +41,7 @@ def group_list(request):
|
|||||||
error_msg = e.msg
|
error_msg = e.msg
|
||||||
return go_error(request, error_msg)
|
return go_error(request, error_msg)
|
||||||
|
|
||||||
groups = ccnet_threaded_rpc.get_groups(request.user.username);
|
groups = get_personal_groups(request.user.username);
|
||||||
|
|
||||||
return render_to_response("group/groups.html", {
|
return render_to_response("group/groups.html", {
|
||||||
"groups": groups,
|
"groups": groups,
|
||||||
|
@@ -0,0 +1,17 @@
|
|||||||
|
{% autoescape off %}
|
||||||
|
亲爱的 {{ email }}:
|
||||||
|
{{ user }} 在 SeaCloud 云存储上将您加入到 {{ org_name }} 团队!
|
||||||
|
|
||||||
|
以下是您的登录信息:
|
||||||
|
用户名: {{ email }}
|
||||||
|
密码: {{ password }}
|
||||||
|
|
||||||
|
请点击以下链接登录:
|
||||||
|
{{ protocol }}://{{ domain }}{% url auth_login %}
|
||||||
|
|
||||||
|
登录后请立即更改密码。
|
||||||
|
感谢使用我们的网站!
|
||||||
|
|
||||||
|
Seafile团队
|
||||||
|
|
||||||
|
{% endautoescape %}
|
96
organizations/templates/organizations/org_useradmin.html
Normal file
96
organizations/templates/organizations/org_useradmin.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
{% extends "org_admin_base.html" %}
|
||||||
|
|
||||||
|
{% block nav_useradmin_class %}class="cur"{% endblock %}
|
||||||
|
{% block left_panel %}
|
||||||
|
<h3>操作</h3>
|
||||||
|
<ul class="with-bg">
|
||||||
|
<li><a href="" class="user-add">添加用户</a></li>
|
||||||
|
</ul>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block right_panel %}
|
||||||
|
{% if messages %}
|
||||||
|
<ul class="messages">
|
||||||
|
{% for message in messages %}
|
||||||
|
{% if message.tags == 'info' %}
|
||||||
|
<li class="notification">邮件发送成功。</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if message.tags == 'error' %}
|
||||||
|
<li class="error">邮件发送失败。</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<h3>所有用户</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th width="90%">邮箱</th>
|
||||||
|
<th width="10%">操作</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
{% for user in users %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{{ SITE_ROOT }}useradmin/info/{{ user.props.email }}/">{{ user.props.email }}</a></td>
|
||||||
|
<td>
|
||||||
|
{% if not user.is_self %}
|
||||||
|
<button class="remove-user-btn" data="{% url org_user_remove org.url_prefix user.email %}">删除</button>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div id="paginator">
|
||||||
|
{% if current_page != 1 %}
|
||||||
|
<a href="{{ SITE_ROOT }}organizations/{{ org.url_prefix }}/useradmin/?page={{ prev_page }}&per_page={{ per_page }}">上一页</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if page_next %}
|
||||||
|
<a href="{{ SITE_ROOT }}organizations/{{ org.url_prefix }}/useradmin/?page={{ next_page }}&per_page={{ per_page }}">下一页</a>
|
||||||
|
{% endif %}
|
||||||
|
<span>每页:</span>
|
||||||
|
{% if per_page == 25 %}
|
||||||
|
<span> 25 </span>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ SITE_ROOT}}organizations/{{ org.url_prefix }}/useradmin/?per_page=25" class="per-page">25</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if per_page == 50 %}
|
||||||
|
<span> 50 </span>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ SITE_ROOT}}organizations/{{ org.url_prefix }}/useradmin/?per_page=50" class="per-page">50</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if per_page == 100 %}
|
||||||
|
<span> 100 </span>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ SITE_ROOT}}organizations/{{ org.url_prefix }}/useradmin/?per_page=100" class="per-page">100</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form id="user-add-form" action="" method="post" name="user-add-form" class="hide">
|
||||||
|
<label>邮箱:</label><br />
|
||||||
|
<textarea id="emails" name="emails"></textarea>
|
||||||
|
<p class="tip">可以是非网站注册用户,我们会以邮件通知对方。</p>
|
||||||
|
<p class="error hide">输入不能为空。</p>
|
||||||
|
<input type="submit" value="提交" />
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block extra_script %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
$('.activate').each(function(){
|
||||||
|
$(this).click(function(){
|
||||||
|
location.href = $(this).attr('data');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.user-add').click(function() {
|
||||||
|
$("#user-add-form").modal({appendTo: "#main"});
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
//delete confirm
|
||||||
|
addConfirmTo($('.remove-user-btn'));
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
@@ -1,7 +1,7 @@
|
|||||||
from django.conf.urls.defaults import *
|
from django.conf.urls.defaults import *
|
||||||
|
|
||||||
from views import *
|
from views import *
|
||||||
from seahub.views import repo, repo_history, org_seafadmin, org_useradmin, \
|
from seahub.views import repo, repo_history, org_seafadmin, \
|
||||||
org_group_admin
|
org_group_admin
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
@@ -16,5 +16,6 @@ urlpatterns = patterns('',
|
|||||||
### Org admin ###
|
### Org admin ###
|
||||||
url(r'^([^/]+)/seafadmin/$', org_seafadmin, name='org_seafadmin'),
|
url(r'^([^/]+)/seafadmin/$', org_seafadmin, name='org_seafadmin'),
|
||||||
url(r'^([^/]+)/useradmin/$', org_useradmin, name='org_useradmin'),
|
url(r'^([^/]+)/useradmin/$', org_useradmin, name='org_useradmin'),
|
||||||
|
url(r'^([^/]+)/useradmin/remove/(?P<user>[^/]+)/$', org_user_remove, name='org_user_remove'),
|
||||||
url(r'^([^/]+)/groupadmin/$', org_group_admin, name='org_groupadmin'),
|
url(r'^([^/]+)/groupadmin/$', org_group_admin, name='org_groupadmin'),
|
||||||
)
|
)
|
||||||
|
@@ -1,20 +1,28 @@
|
|||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
import sys
|
import sys
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.contrib import messages
|
||||||
|
from django.core.mail import send_mail
|
||||||
|
from django.contrib.sites.models import Site, RequestSite
|
||||||
from django.http import HttpResponse, HttpResponseRedirect, Http404
|
from django.http import HttpResponse, HttpResponseRedirect, Http404
|
||||||
from django.template import RequestContext
|
|
||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response
|
||||||
|
from django.template import Context, loader, RequestContext
|
||||||
|
|
||||||
from auth.decorators import login_required
|
from auth.decorators import login_required
|
||||||
from pysearpc import SearpcError
|
from pysearpc import SearpcError
|
||||||
from seaserv import ccnet_threaded_rpc, get_orgs_by_user, get_org_repos, \
|
from seaserv import ccnet_threaded_rpc, get_orgs_by_user, get_org_repos, \
|
||||||
get_org_by_url_prefix, create_org, get_user_current_org
|
get_org_by_url_prefix, create_org, get_user_current_org, add_org_user, \
|
||||||
|
get_ccnetuser, remove_org_user, get_org_groups
|
||||||
|
|
||||||
from forms import OrgCreateForm
|
from forms import OrgCreateForm
|
||||||
from settings import ORG_CACHE_PREFIX
|
from settings import ORG_CACHE_PREFIX
|
||||||
from utils import set_org_ctx
|
from utils import set_org_ctx
|
||||||
|
from registration.models import RegistrationProfile
|
||||||
|
import seahub.settings as seahub_settings
|
||||||
|
from seahub.utils import go_error, go_permission_error, validate_group_name, \
|
||||||
|
emails2list, gen_token
|
||||||
from seahub.views import myhome
|
from seahub.views import myhome
|
||||||
from seahub.utils import go_error, go_permission_error, validate_group_name
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def create_org(request):
|
def create_org(request):
|
||||||
@@ -95,9 +103,111 @@ def org_groups(request, url_prefix):
|
|||||||
error_msg = e.msg
|
error_msg = e.msg
|
||||||
return go_error(request, error_msg)
|
return go_error(request, error_msg)
|
||||||
|
|
||||||
groups = ccnet_threaded_rpc.get_org_groups(org.org_id, 0, sys.maxint)
|
groups = get_org_groups(org.org_id, 0, sys.maxint)
|
||||||
return render_to_response('organizations/org_groups.html', {
|
return render_to_response('organizations/org_groups.html', {
|
||||||
'org': org,
|
'org': org,
|
||||||
'groups': groups,
|
'groups': groups,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
def send_org_user_add_mail(request, email, password, org_name):
|
||||||
|
"""
|
||||||
|
Send email when add new user.
|
||||||
|
"""
|
||||||
|
use_https = request.is_secure()
|
||||||
|
domain = RequestSite(request).domain
|
||||||
|
|
||||||
|
t = loader.get_template('organizations/org_user_add_email.html')
|
||||||
|
c = {
|
||||||
|
'user': request.user.username,
|
||||||
|
'org_name': org_name,
|
||||||
|
'email': email,
|
||||||
|
'password': password,
|
||||||
|
'domain': domain,
|
||||||
|
'protocol': use_https and 'https' or 'http',
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
send_mail(u'SeaCloud注册信息', t.render(Context(c)),
|
||||||
|
None, [email], fail_silently=False)
|
||||||
|
messages.add_message(request, messages.INFO, email)
|
||||||
|
except:
|
||||||
|
messages.add_message(request, messages.ERROR, email)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def org_useradmin(request, url_prefix):
|
||||||
|
"""
|
||||||
|
List and add org users.
|
||||||
|
"""
|
||||||
|
if not request.user.org['is_staff']:
|
||||||
|
raise Http404
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
emails = request.POST.get('emails')
|
||||||
|
|
||||||
|
email_list = emails2list(emails)
|
||||||
|
for email in email_list:
|
||||||
|
if not email or email.find('@') <= 0 :
|
||||||
|
continue
|
||||||
|
|
||||||
|
org_id = request.user.org['org_id']
|
||||||
|
if get_ccnetuser(username=email):
|
||||||
|
email = email.strip(' ')
|
||||||
|
org_id = request.user.org['org_id']
|
||||||
|
add_org_user(org_id, email, 0)
|
||||||
|
else:
|
||||||
|
# User is not registered, just create account and
|
||||||
|
# add that account to org
|
||||||
|
password = gen_token(max_length=6)
|
||||||
|
if Site._meta.installed:
|
||||||
|
site = Site.objects.get_current()
|
||||||
|
else:
|
||||||
|
site = RequestSite(request)
|
||||||
|
RegistrationProfile.objects.create_active_user(\
|
||||||
|
email, email, password, site, send_email=False)
|
||||||
|
add_org_user(org_id, email, 0)
|
||||||
|
if hasattr(seahub_settings, 'EMAIL_HOST'):
|
||||||
|
org_name = request.user.org['org_name']
|
||||||
|
send_org_user_add_mail(request, email, password, org_name)
|
||||||
|
|
||||||
|
# Make sure page request is an int. If not, deliver first page.
|
||||||
|
try:
|
||||||
|
current_page = int(request.GET.get('page', '1'))
|
||||||
|
per_page= int(request.GET.get('per_page', '25'))
|
||||||
|
except ValueError:
|
||||||
|
current_page = 1
|
||||||
|
per_page = 25
|
||||||
|
|
||||||
|
url_prefix = request.user.org['url_prefix']
|
||||||
|
users_plus_one = ccnet_threaded_rpc.get_org_emailusers(\
|
||||||
|
url_prefix, per_page * (current_page - 1), per_page + 1)
|
||||||
|
if len(users_plus_one) == per_page + 1:
|
||||||
|
page_next = True
|
||||||
|
else:
|
||||||
|
page_next = False
|
||||||
|
|
||||||
|
users = users_plus_one[:per_page]
|
||||||
|
for user in users:
|
||||||
|
if user.props.id == request.user.id:
|
||||||
|
user.is_self = True
|
||||||
|
|
||||||
|
return render_to_response(
|
||||||
|
'organizations/org_useradmin.html', {
|
||||||
|
'users': users,
|
||||||
|
'current_page': current_page,
|
||||||
|
'prev_page': current_page-1,
|
||||||
|
'next_page': current_page+1,
|
||||||
|
'per_page': per_page,
|
||||||
|
'page_next': page_next,
|
||||||
|
},
|
||||||
|
context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def org_user_remove(request, user):
|
||||||
|
"""
|
||||||
|
Remove org user
|
||||||
|
"""
|
||||||
|
org_id = request.user.org['org_id']
|
||||||
|
url_prefix = request.user.org['url_prefix']
|
||||||
|
remove_org_user(org_id, user)
|
||||||
|
|
||||||
|
return HttpResponseRedirect(reverse('org_useradmin', args=[url_prefix]))
|
||||||
|
@@ -1,81 +0,0 @@
|
|||||||
{% extends "org_admin_base.html" %}
|
|
||||||
|
|
||||||
{% block nav_useradmin_class %}class="cur"{% endblock %}
|
|
||||||
{% block left_panel %}
|
|
||||||
<h3>操作</h3>
|
|
||||||
<ul class="with-bg">
|
|
||||||
<li><a href="{{ SITE_ROOT }}useradmin/add/">添加用户</a></li>
|
|
||||||
</ul>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
||||||
{% block right_panel %}
|
|
||||||
{% if messages %}
|
|
||||||
<ul class="messages">
|
|
||||||
{% for message in messages %}
|
|
||||||
{% if message.tags == 'info' %}
|
|
||||||
<li class="notification">邮件发送成功。</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if message.tags == 'error' %}
|
|
||||||
<li class="error">邮件发送失败。</li>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<h3>所有用户</h3>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th width="60%">邮箱</th>
|
|
||||||
<th width="30%">是否激活</th>
|
|
||||||
<th width="10%">操作</th>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
{% for user in users %}
|
|
||||||
<tr>
|
|
||||||
<td><a href="{{ SITE_ROOT }}useradmin/info/{{ user.props.email }}/">{{ user.props.email }}</a></td>
|
|
||||||
{% if user.props.is_active %}
|
|
||||||
<td>已激活</td>
|
|
||||||
{% else %}
|
|
||||||
<td><button data="{{ SITE_ROOT }}useradmin/activate/{{ user.props.id }}/" class="activate">激活</button></td>
|
|
||||||
{% endif %}
|
|
||||||
<td>
|
|
||||||
{% if user.profile %}
|
|
||||||
<!-- <button class="add-role-btn" userid="{{ user.profile.ccnet_user_id }}" email="{{ user.email }}">添加角色</button> -->
|
|
||||||
{% endif %}
|
|
||||||
{% if not user.is_self %}
|
|
||||||
<button class="remove-user-btn" data="{{ SITE_ROOT }}useradmin/remove/{{ user.props.id }}/">删除</button>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<form id="add-role-form" action="" method="post" class="hide">
|
|
||||||
<p><span id="user_email"></span> 的新角色 (即 MyClient 等):</p>
|
|
||||||
<input id="id_role" type="text" name="role" /><br/>
|
|
||||||
<input id="id_summit" type="submit" value="提交" />
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block extra_script %}
|
|
||||||
<script type="text/javascript">
|
|
||||||
$('.activate').each(function(){
|
|
||||||
$(this).click(function(){
|
|
||||||
location.href = $(this).attr('data');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
$(".add-role-btn").each(function() {
|
|
||||||
$(this).click(function() {
|
|
||||||
var url = "{{ SITE_ROOT }}useradmin/" + $(this).attr("userid") + "/role/add/";
|
|
||||||
$("#add-role-form").attr('action', url);
|
|
||||||
$("#user_email").html($(this).attr("email"));
|
|
||||||
$("#add-role-form").modal({appendTo: "#main"});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
//delete confirm
|
|
||||||
addConfirmTo($('.remove-user-btn'));
|
|
||||||
addConfirmTo($('.role-delete-btn'));
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
@@ -26,9 +26,8 @@
|
|||||||
<h3>所有用户</h3>
|
<h3>所有用户</h3>
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<th width="50%">邮箱</th>
|
<th width="70%">邮箱</th>
|
||||||
<th width="20%">是否激活</th>
|
<th width="20%">是否激活</th>
|
||||||
<th width="20%">是否企业帐号</th>
|
|
||||||
<th width="10%">操作</th>
|
<th width="10%">操作</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
@@ -40,15 +39,7 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<td><button data="{{ SITE_ROOT }}useradmin/activate/{{ user.props.id }}/" class="activate">激活</button></td>
|
<td><button data="{{ SITE_ROOT }}useradmin/activate/{{ user.props.id }}/" class="activate">激活</button></td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if user.is_org_user %}
|
|
||||||
<td>是</td>
|
|
||||||
{% else %}
|
|
||||||
<td></td>
|
|
||||||
{% endif %}
|
|
||||||
<td>
|
<td>
|
||||||
{% if user.profile %}
|
|
||||||
<!-- <button class="add-role-btn" userid="{{ user.profile.ccnet_user_id }}" email="{{ user.email }}">添加角色</button> -->
|
|
||||||
{% endif %}
|
|
||||||
{% if not user.is_self %}
|
{% if not user.is_self %}
|
||||||
<button class="remove-user-btn" data="{{ SITE_ROOT }}useradmin/remove/{{ user.props.id }}/">删除</button>
|
<button class="remove-user-btn" data="{{ SITE_ROOT }}useradmin/remove/{{ user.props.id }}/">删除</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -57,11 +48,31 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<form id="add-role-form" action="" method="post" class="hide">
|
<div id="paginator">
|
||||||
<p><span id="user_email"></span> 的新角色 (即 MyClient 等):</p>
|
{% if current_page != 1 %}
|
||||||
<input id="id_role" type="text" name="role" /><br/>
|
<a href="{{ SITE_ROOT }}sys/useradmin/?page={{ prev_page }}&per_page={{ per_page }}">上一页</a>
|
||||||
<input id="id_summit" type="submit" value="提交" />
|
{% endif %}
|
||||||
</form>
|
{% if page_next %}
|
||||||
|
<a href="{{ SITE_ROOT }}sys/useradmin/?page={{ next_page }}&per_page={{ per_page }}">下一页</a>
|
||||||
|
{% endif %}
|
||||||
|
<span>每页:</span>
|
||||||
|
{% if per_page == 25 %}
|
||||||
|
<span> 25 </span>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ SITE_ROOT}}sys/useradmin/?per_page=25" class="per-page">25</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if per_page == 50 %}
|
||||||
|
<span> 50 </span>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ SITE_ROOT}}sys/useradmin/?per_page=50" class="per-page">50</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if per_page == 100 %}
|
||||||
|
<span> 100 </span>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ SITE_ROOT}}sys/useradmin/?per_page=100" class="per-page">100</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block extra_script %}
|
{% block extra_script %}
|
||||||
@@ -71,17 +82,8 @@ $('.activate').each(function(){
|
|||||||
location.href = $(this).attr('data');
|
location.href = $(this).attr('data');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
$(".add-role-btn").each(function() {
|
|
||||||
$(this).click(function() {
|
|
||||||
var url = "{{ SITE_ROOT }}useradmin/" + $(this).attr("userid") + "/role/add/";
|
|
||||||
$("#add-role-form").attr('action', url);
|
|
||||||
$("#user_email").html($(this).attr("email"));
|
|
||||||
$("#add-role-form").modal({appendTo: "#main"});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
//delete confirm
|
//delete confirm
|
||||||
addConfirmTo($('.remove-user-btn'));
|
addConfirmTo($('.remove-user-btn'));
|
||||||
addConfirmTo($('.role-delete-btn'));
|
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -3,13 +3,13 @@ import service
|
|||||||
from service import ccnet_rpc, monitor_rpc, seafserv_rpc, \
|
from service import ccnet_rpc, monitor_rpc, seafserv_rpc, \
|
||||||
seafserv_threaded_rpc, ccnet_threaded_rpc
|
seafserv_threaded_rpc, ccnet_threaded_rpc
|
||||||
from service import send_command
|
from service import send_command
|
||||||
from service import get_groups, get_group
|
from service import get_org_groups, get_personal_groups
|
||||||
from service import get_repos, get_repo, get_commits, get_branches, get_org_repos
|
from service import get_repos, get_repo, get_commits, get_branches, get_org_repos
|
||||||
from service import get_binding_peerids
|
from service import get_binding_peerids
|
||||||
from service import get_ccnetuser
|
from service import get_ccnetuser, get_emailusers
|
||||||
from service import get_group_repoids, check_group_staff
|
from service import get_group_repoids, check_group_staff
|
||||||
from service import create_org, get_orgs_by_user, get_org_by_url_prefix, \
|
from service import create_org, get_orgs_by_user, get_org_by_url_prefix, \
|
||||||
get_user_current_org
|
get_user_current_org, add_org_user, remove_org_user
|
||||||
|
|
||||||
from service import CCNET_CONF_PATH
|
from service import CCNET_CONF_PATH
|
||||||
|
|
||||||
|
@@ -84,29 +84,56 @@ def get_ccnetuser(username=None, userid=None):
|
|||||||
|
|
||||||
return ccnetuser
|
return ccnetuser
|
||||||
|
|
||||||
def get_groups():
|
def get_emailusers(start, limit):
|
||||||
"""Get group object list. """
|
try:
|
||||||
group_ids = ccnet_threaded_rpc.list_groups()
|
users = ccnet_threaded_rpc.get_emailusers(start, limit)
|
||||||
if not group_ids:
|
except SearpcError:
|
||||||
return []
|
users = []
|
||||||
groups = []
|
return users
|
||||||
for group_id in group_ids.split("\n"):
|
|
||||||
# too handle the ending '\n'
|
# def get_groups():
|
||||||
if group_id == '':
|
# """Get group object list. """
|
||||||
continue
|
# group_ids = ccnet_threaded_rpc.list_groups()
|
||||||
group = ccnet_threaded_rpc.get_group(group_id)
|
# if not group_ids:
|
||||||
groups.append(group)
|
# return []
|
||||||
|
# groups = []
|
||||||
|
# for group_id in group_ids.split("\n"):
|
||||||
|
# # too handle the ending '\n'
|
||||||
|
# if group_id == '':
|
||||||
|
# continue
|
||||||
|
# group = ccnet_threaded_rpc.get_group(group_id)
|
||||||
|
# groups.append(group)
|
||||||
|
# return groups
|
||||||
|
|
||||||
|
|
||||||
|
# def get_group(group_id):
|
||||||
|
# group = ccnet_threaded_rpc.get_group(group_id)
|
||||||
|
# if not group:
|
||||||
|
# return None
|
||||||
|
# group.members = group.props.members.split(" ")
|
||||||
|
# group.followers = group.props.followers.split(" ")
|
||||||
|
# group.maintainers = group.props.maintainers.split(" ")
|
||||||
|
# return group
|
||||||
|
|
||||||
|
def get_org_groups(org_id, start, limit):
|
||||||
|
try:
|
||||||
|
groups = ccnet_threaded_rpc.get_org_groups(org_id, 0, sys.maxint)
|
||||||
|
except SearpcError:
|
||||||
|
groups = []
|
||||||
return groups
|
return groups
|
||||||
|
|
||||||
|
def get_personal_groups(email):
|
||||||
|
try:
|
||||||
|
groups_all = ccnet_threaded_rpc.get_groups(email)
|
||||||
|
except SearpcError:
|
||||||
|
return []
|
||||||
|
|
||||||
def get_group(group_id):
|
personal_groups = []
|
||||||
group = ccnet_threaded_rpc.get_group(group_id)
|
for group in groups_all:
|
||||||
if not group:
|
if not ccnet_threaded_rpc.is_org_group(group.id):
|
||||||
return None
|
personal_groups.append(group)
|
||||||
group.members = group.props.members.split(" ")
|
|
||||||
group.followers = group.props.followers.split(" ")
|
return personal_groups
|
||||||
group.maintainers = group.props.maintainers.split(" ")
|
|
||||||
return group
|
|
||||||
|
|
||||||
def create_org(org_name, url_prefix, username):
|
def create_org(org_name, url_prefix, username):
|
||||||
ccnet_threaded_rpc.create_org(org_name, url_prefix, username)
|
ccnet_threaded_rpc.create_org(org_name, url_prefix, username)
|
||||||
@@ -134,6 +161,18 @@ def get_user_current_org(user, url_prefix):
|
|||||||
return org
|
return org
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def add_org_user(org_id, email, is_staff):
|
||||||
|
try:
|
||||||
|
ccnet_threaded_rpc.add_org_user(org_id, email, is_staff)
|
||||||
|
except SearpcError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def remove_org_user(org_id, email):
|
||||||
|
try:
|
||||||
|
ccnet_threaded_rpc.remove_org_user(org_id, email)
|
||||||
|
except SearpcError:
|
||||||
|
pass
|
||||||
|
|
||||||
def send_command(command):
|
def send_command(command):
|
||||||
client = pool.get_client()
|
client = pool.get_client()
|
||||||
client.send_cmd(command)
|
client.send_cmd(command)
|
||||||
|
2
urls.py
2
urls.py
@@ -4,7 +4,7 @@ from django.views.generic.simple import direct_to_template
|
|||||||
|
|
||||||
from seahub.views import root, myhome, \
|
from seahub.views import root, myhome, \
|
||||||
repo, repo_history, modify_token, remove_repo, sys_seafadmin, sys_useradmin, \
|
repo, repo_history, modify_token, remove_repo, sys_seafadmin, sys_useradmin, \
|
||||||
org_seafadmin, org_useradmin, org_group_admin, org_remove, \
|
org_seafadmin, org_group_admin, org_remove, \
|
||||||
activate_user, user_add, user_remove, sys_group_admin, sys_org_admin, \
|
activate_user, user_add, user_remove, sys_group_admin, sys_org_admin, \
|
||||||
ownerhome, repo_history_revert, repo_file_get, \
|
ownerhome, repo_history_revert, repo_file_get, \
|
||||||
user_info, repo_set_access_property, repo_access_file, \
|
user_info, repo_set_access_property, repo_access_file, \
|
||||||
|
8
utils.py
8
utils.py
@@ -284,3 +284,11 @@ def get_ccnet_server_addr_port():
|
|||||||
return settings.CCNET_SERVER_ADDR, settings.CCNET_SERVER_PORT
|
return settings.CCNET_SERVER_ADDR, settings.CCNET_SERVER_PORT
|
||||||
except:
|
except:
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
|
def emails2list(emails):
|
||||||
|
"""
|
||||||
|
Split email string contacted with diffent separator.
|
||||||
|
"""
|
||||||
|
email_str = emails.replace(';', ',').replace('\n', ',').replace('\r', ',')
|
||||||
|
return email_str.split(',')
|
||||||
|
|
||||||
|
57
views.py
57
views.py
@@ -27,10 +27,10 @@ from auth.forms import AuthenticationForm, PasswordResetForm, SetPasswordForm, \
|
|||||||
PasswordChangeForm
|
PasswordChangeForm
|
||||||
from auth.tokens import default_token_generator
|
from auth.tokens import default_token_generator
|
||||||
from share.models import FileShare
|
from share.models import FileShare
|
||||||
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_groups, get_repos, \
|
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, get_emailusers, \
|
||||||
get_repo, get_commits, get_branches, \
|
get_repo, get_commits, get_branches, \
|
||||||
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, get_ccnetuser, \
|
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, get_ccnetuser, \
|
||||||
get_group_repoids, check_group_staff
|
get_group_repoids, check_group_staff, get_personal_groups
|
||||||
from pysearpc import SearpcError
|
from pysearpc import SearpcError
|
||||||
|
|
||||||
from seahub.base.accounts import CcnetUser
|
from seahub.base.accounts import CcnetUser
|
||||||
@@ -44,7 +44,7 @@ from utils import go_permission_error, go_error, list_to_string, \
|
|||||||
calculate_repo_last_modify, valid_previewed_file, \
|
calculate_repo_last_modify, valid_previewed_file, \
|
||||||
check_filename_with_rename, get_accessible_repos, EMPTY_SHA1, \
|
check_filename_with_rename, get_accessible_repos, EMPTY_SHA1, \
|
||||||
get_file_revision_id_size, get_ccnet_server_addr_port, \
|
get_file_revision_id_size, get_ccnet_server_addr_port, \
|
||||||
gen_file_get_url
|
gen_file_get_url, emails2list
|
||||||
from seahub.profile.models import Profile
|
from seahub.profile.models import Profile
|
||||||
from seahub.settings import FILE_PREVIEW_MAX_SIZE, CROCODOC_API_TOKEN
|
from seahub.settings import FILE_PREVIEW_MAX_SIZE, CROCODOC_API_TOKEN
|
||||||
|
|
||||||
@@ -705,7 +705,8 @@ def myhome(request):
|
|||||||
grpmsg_reply_list.append(n.detail)
|
grpmsg_reply_list.append(n.detail)
|
||||||
|
|
||||||
# my groups
|
# my groups
|
||||||
groups = ccnet_threaded_rpc.get_groups(email)
|
groups = get_personal_groups(email)
|
||||||
|
|
||||||
groups_manage = []
|
groups_manage = []
|
||||||
groups_join = []
|
groups_join = []
|
||||||
for group in groups:
|
for group in groups:
|
||||||
@@ -1234,36 +1235,32 @@ def sys_useradmin(request):
|
|||||||
if not request.user.is_staff:
|
if not request.user.is_staff:
|
||||||
raise Http404
|
raise Http404
|
||||||
|
|
||||||
users = ccnet_threaded_rpc.get_emailusers(-1,-1)
|
# Make sure page request is an int. If not, deliver first page.
|
||||||
|
try:
|
||||||
|
current_page = int(request.GET.get('page', '1'))
|
||||||
|
per_page= int(request.GET.get('per_page', '25'))
|
||||||
|
except ValueError:
|
||||||
|
current_page = 1
|
||||||
|
per_page = 25
|
||||||
|
users_plus_one = get_emailusers(per_page * (current_page - 1), per_page + 1)
|
||||||
|
if len(users_plus_one) == per_page + 1:
|
||||||
|
page_next = True
|
||||||
|
else:
|
||||||
|
page_next = False
|
||||||
|
|
||||||
|
users = users_plus_one[:per_page]
|
||||||
for user in users:
|
for user in users:
|
||||||
if user.props.id == request.user.id:
|
if user.props.id == request.user.id:
|
||||||
user.is_self = True
|
user.is_self = True
|
||||||
# TODO: may add new is_org_user rpc
|
|
||||||
user.is_org_user = True if ccnet_threaded_rpc.get_org_by_user(user.email) else False
|
|
||||||
|
|
||||||
return render_to_response(
|
return render_to_response(
|
||||||
'sys_useradmin.html', {
|
'sys_useradmin.html', {
|
||||||
'users': users,
|
'users': users,
|
||||||
},
|
'current_page': current_page,
|
||||||
context_instance=RequestContext(request))
|
'prev_page': current_page-1,
|
||||||
|
'next_page': current_page+1,
|
||||||
@login_required
|
'per_page': per_page,
|
||||||
def org_useradmin(request, url_prefix):
|
'page_next': page_next,
|
||||||
if not request.user.org['is_staff']:
|
|
||||||
raise Http404
|
|
||||||
|
|
||||||
users = ccnet_threaded_rpc.get_org_emailusers(request.user.org['url_prefix'],
|
|
||||||
0, sys.maxint)
|
|
||||||
|
|
||||||
for user in users:
|
|
||||||
if user.props.id == request.user.id:
|
|
||||||
user.is_self = True
|
|
||||||
user.is_org_user = True
|
|
||||||
|
|
||||||
return render_to_response(
|
|
||||||
'org_useradmin.html', {
|
|
||||||
'users': users,
|
|
||||||
},
|
},
|
||||||
context_instance=RequestContext(request))
|
context_instance=RequestContext(request))
|
||||||
|
|
||||||
@@ -1960,18 +1957,14 @@ def send_shared_link(request):
|
|||||||
email = form.cleaned_data['email']
|
email = form.cleaned_data['email']
|
||||||
file_shared_link = form.cleaned_data['file_shared_link']
|
file_shared_link = form.cleaned_data['file_shared_link']
|
||||||
|
|
||||||
# Handle the diffent separator
|
to_email_list = emails2list(email)
|
||||||
to_email_str = email.replace(';',',')
|
|
||||||
to_email_str = to_email_str.replace('\n',',')
|
|
||||||
to_email_str = to_email_str.replace('\r',',')
|
|
||||||
to_email_list = to_email_str.split(',')
|
|
||||||
|
|
||||||
t = loader.get_template('shared_link_email.html')
|
t = loader.get_template('shared_link_email.html')
|
||||||
|
|
||||||
for to_email in to_email_list:
|
for to_email in to_email_list:
|
||||||
to_email = to_email.strip(' ')
|
|
||||||
if not to_email:
|
if not to_email:
|
||||||
continue
|
continue
|
||||||
|
to_email = to_email.strip(' ')
|
||||||
|
|
||||||
c = {
|
c = {
|
||||||
'email': request.user.username,
|
'email': request.user.username,
|
||||||
|
Reference in New Issue
Block a user