mirror of https://github.com/jumpserver/jumpserver
菜单active
commit
449bde4b03
|
@ -38,3 +38,11 @@ def groups_str(username):
|
|||
@register.filter(name='get_item')
|
||||
def get_item(dictionary, key):
|
||||
return dictionary.get(key)
|
||||
|
||||
|
||||
@register.filter(name='bool2str')
|
||||
def bool2str(value):
|
||||
if value:
|
||||
return u'是'
|
||||
else:
|
||||
return u'否'
|
|
@ -10,4 +10,7 @@ urlpatterns = patterns('juser.views',
|
|||
(r'^user_list/$', 'user_list'),
|
||||
(r'^group_add/$', 'group_add'),
|
||||
(r'^group_list/$', 'group_list'),
|
||||
(r'^user_detail/$', 'user_detail'),
|
||||
(r'^user_del/$', 'user_del'),
|
||||
(r'^user_edit/$', 'user_edit'),
|
||||
)
|
||||
|
|
117
juser/views.py
117
juser/views.py
|
@ -11,6 +11,7 @@ import ldap
|
|||
from ldap import modlist
|
||||
from Crypto.PublicKey import RSA
|
||||
import crypt
|
||||
from django.http import HttpResponseRedirect
|
||||
|
||||
from django.shortcuts import render_to_response
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
|
@ -19,7 +20,7 @@ from juser.models import UserGroup, User
|
|||
from connect import PyCrypt, KEY
|
||||
from connect import BASE_DIR
|
||||
from connect import CONF
|
||||
|
||||
from django.core.paginator import Paginator, EmptyPage, InvalidPage
|
||||
|
||||
CRYPTOR = PyCrypt(KEY)
|
||||
LDAP_ENABLE = CONF.getint('ldap', 'ldap_enable')
|
||||
|
@ -107,6 +108,7 @@ class LDAPMgmt():
|
|||
except ldap.LDAPError, e:
|
||||
print e
|
||||
|
||||
|
||||
def gen_sha512(salt, password):
|
||||
return crypt.crypt(password, '$6$%s$' % salt)
|
||||
|
||||
|
@ -152,14 +154,121 @@ def group_list(request):
|
|||
|
||||
def user_list(request):
|
||||
user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'}
|
||||
header_title, path1, path2 = '查看用户 | Add User', 'juser', 'user_list'
|
||||
users = User.objects.all()
|
||||
header_title, path1, path2 = '查看用户 | Show User', 'juser', 'user_list'
|
||||
users = contact_list = User.objects.all().order_by('id')
|
||||
p = paginator = Paginator(contact_list, 10)
|
||||
|
||||
try:
|
||||
page = int(request.GET.get('page', '1'))
|
||||
except ValueError:
|
||||
page = 1
|
||||
|
||||
try:
|
||||
contacts = paginator.page(page)
|
||||
except (EmptyPage, InvalidPage):
|
||||
contacts = paginator.page(paginator.num_pages)
|
||||
return render_to_response('juser/user_list.html', locals())
|
||||
|
||||
|
||||
def user_detail(request):
|
||||
username = request.GET.get('username', None)
|
||||
if not username:
|
||||
return HttpResponseRedirect('/')
|
||||
user = User.objects.get(username=username)
|
||||
return render_to_response('juser/user_detail.html', locals())
|
||||
|
||||
|
||||
def user_del(request):
|
||||
username = request.GET.get('username', None)
|
||||
if not username:
|
||||
return HttpResponseRedirect('/')
|
||||
user = User.objects.get(username=username)
|
||||
user.delete()
|
||||
return HttpResponseRedirect('/juser/user_list/', locals())
|
||||
|
||||
|
||||
def user_edit(request):
|
||||
header_title, path1, path2 = '编辑用户 | Edit User', 'juser', 'user_edit'
|
||||
hidden = "hidden"
|
||||
if request.method == 'GET':
|
||||
username = request.GET.get('username', None)
|
||||
if not username:
|
||||
return HttpResponseRedirect('/')
|
||||
user = User.objects.get(username=username)
|
||||
username = user.username
|
||||
password = user.password
|
||||
ssh_key_pwd1 = user.ssh_key_pwd1
|
||||
name = user.name
|
||||
all_group = UserGroup.objects.all()
|
||||
groups = user.user_group.all()
|
||||
groups_str = ' '.join([str(group.id) for group in groups])
|
||||
user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'}
|
||||
role_post = user.role
|
||||
ssh_pwd = user.ssh_pwd
|
||||
email = user.email
|
||||
|
||||
else:
|
||||
username = request.POST.get('username', None)
|
||||
password = request.POST.get('password', None)
|
||||
name = request.POST.get('name', None)
|
||||
email = request.POST.get('email', '')
|
||||
groups = request.POST.getlist('groups', None)
|
||||
groups_str = ' '.join(groups)
|
||||
role_post = request.POST.get('role', None)
|
||||
ssh_pwd = request.POST.get('ssh_pwd', None)
|
||||
ssh_key_pwd1 = request.POST.get('ssh_key_pwd1', None)
|
||||
is_active = request.POST.get('is_active', '1')
|
||||
ldap_pwd = gen_rand_pwd(16)
|
||||
all_group = UserGroup.objects.all()
|
||||
user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'}
|
||||
|
||||
if username:
|
||||
user = User.objects.get(username=username)
|
||||
else:
|
||||
return HttpResponseRedirect('/')
|
||||
|
||||
if password != user.password:
|
||||
password = md5_crypt(password)
|
||||
|
||||
if ssh_pwd != user.ssh_pwd:
|
||||
ssh_pwd = CRYPTOR.encrypt(ssh_pwd)
|
||||
|
||||
if ssh_key_pwd1 != user.ssh_key_pwd1:
|
||||
ssh_key_pwd1 = CRYPTOR.encrypt(ssh_key_pwd1)
|
||||
|
||||
db_update_user(username=username,
|
||||
password=password,
|
||||
name=name,
|
||||
email=email,
|
||||
groups=groups,
|
||||
role=role_post,
|
||||
ssh_pwd=ssh_pwd,
|
||||
ssh_key_pwd1=ssh_key_pwd1)
|
||||
msg = u'修改用户成功'
|
||||
|
||||
return HttpResponseRedirect('/juser/user_list/')
|
||||
|
||||
return render_to_response('juser/user_add.html', locals())
|
||||
|
||||
|
||||
def db_add_user(**kwargs):
|
||||
groups_post = kwargs.pop('groups')
|
||||
user = User(**kwargs)
|
||||
group_select = []
|
||||
for group_id in groups_post:
|
||||
group = UserGroup.objects.filter(id=group_id)
|
||||
group_select.extend(group)
|
||||
user.save()
|
||||
user.user_group = group_select
|
||||
|
||||
|
||||
def db_update_user(**kwargs):
|
||||
groups_post = kwargs.pop('groups')
|
||||
username = kwargs.get('username')
|
||||
user = User.objects.filter(username=username)
|
||||
user.update(**kwargs)
|
||||
user = User.objects.get(username=username)
|
||||
group_select = []
|
||||
for group_id in groups_post:
|
||||
group = UserGroup.objects.filter(id=group_id)
|
||||
group_select.extend(group)
|
||||
|
@ -249,7 +358,7 @@ def ldap_del_user(username):
|
|||
group_dn = "cn=%s,ou=Group,%s" % (username, LDAP_BASE_DN)
|
||||
sudo_dn = 'cn=%s,ou=Sudoers,%s' % (username, LDAP_BASE_DN)
|
||||
|
||||
ldap_conn = LDAPMgmt()
|
||||
ldap_conn = LDAPMgmt(LDAP_HOST_URL, LDAP_BASE_DN, LDAP_ROOT_DN, LDAP_ROOT_PW)
|
||||
ldap_conn.delete(user_dn)
|
||||
ldap_conn.delete(group_dn)
|
||||
ldap_conn.delete(sudo_dn)
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
</head>
|
||||
|
||||
<body class="skin-1">
|
||||
<body>
|
||||
|
||||
<div id="wrapper">
|
||||
{% include 'nav.html' %}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<div class="footer fixed">
|
||||
<div class="pull-right">
|
||||
Version <strong>2.2.0</strong> GPL.
|
||||
Version <strong>1.2.0</strong> GPL.
|
||||
</div>
|
||||
<div>
|
||||
<strong>Copyright</strong> Jumpserver.org Organization © 2014-2015
|
||||
|
|
|
@ -74,7 +74,6 @@
|
|||
form.submit();
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
|
@ -35,7 +35,7 @@
|
|||
{% if msg %}
|
||||
<div class="alert alert-success text-center">{{ msg }}</div>
|
||||
{% endif %}
|
||||
<div class="form-group">
|
||||
<div class="form-group {{ hidden }}">
|
||||
<label for="username" class="col-sm-2 control-label">用户名<span class="red-fonts">*</span></label>
|
||||
<div class="col-sm-8">
|
||||
<input id="username" name="username" placeholder="Username" type="text" class="form-control" value={{ username }}>
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
{% load mytags %}
|
||||
<html>
|
||||
<head>
|
||||
{% include 'link_css.html' %}
|
||||
|
||||
<style type="text/css">
|
||||
body
|
||||
{
|
||||
background: #FFFFFF;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="row">
|
||||
<div class="contact-box">
|
||||
<h2 class="text-center">{{ user.name }} 用户详情</h2>
|
||||
<div class="ibox-content">
|
||||
<div class="">
|
||||
<a target="_blank" href="/juser/user_add/" class="btn btn-sm btn-primary "> 添加 </a>
|
||||
</div>
|
||||
|
||||
<table class="table table-striped table-bordered table-hover " id="editable" >
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-center">用户</th>
|
||||
<th class="text-center">详情</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">ID</td>
|
||||
<td class="text-center">{{ user.id }}</td>
|
||||
</tr>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">username</td>
|
||||
<td class="text-center">{{ user.username }}</td>
|
||||
</tr>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">姓名</td>
|
||||
<td class="text-center">{{ user.name }}</td>
|
||||
</tr>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">角色</td>
|
||||
<td class="text-center">{{ user.id|get_role }}</td>
|
||||
</tr>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">属组</td>
|
||||
<td class="text-center">{{ user.username|groups_str }}</td>
|
||||
</tr>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">Email</td>
|
||||
<td class="text-center">{{ user.email }}</td>
|
||||
</tr>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">激活</td>
|
||||
<td class="text-center">{{ user.is_active|bool2str }}</td>
|
||||
</tr>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">添加时间</td>
|
||||
<td class="text-center">{{ user.joined }}</td>
|
||||
</tr>
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">最后登录</td>
|
||||
<td class="text-center">{{ user.last_login }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -1,14 +1,14 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load mytags %}
|
||||
|
||||
{% block content %}
|
||||
{% include 'nav_cat_bar.html' %}
|
||||
<div class="wrapper wrapper-content animated fadeInRight">
|
||||
{% include 'nav_cat_bar.html' %}
|
||||
|
||||
<div class="wrapper wrapper-content animated fadeInRight">
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5>用户信息 <small> show user info.</small></h5>
|
||||
<h5> 查看用户 <small> show user info.</small> </h5>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
|
@ -27,54 +27,94 @@
|
|||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content" style="display: block;">
|
||||
<form method="post" action="">
|
||||
<table class="table table-hover">
|
||||
|
||||
<div class="ibox-content">
|
||||
<div class="">
|
||||
<a target="_blank" href="/juser/user_add/" class="btn btn-sm btn-primary "> 添加 </a>
|
||||
</div>
|
||||
|
||||
<table class="table table-striped table-bordered table-hover " id="editable" >
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<div class="checkbox i-checks">
|
||||
<input onclick="selectAll()" type="checkbox" name="select_all" style="select_all" id="select_all">
|
||||
</div>
|
||||
</th>
|
||||
<th>ID</th>
|
||||
<th>用户名</th>
|
||||
<th>姓名</th>
|
||||
<th>属组</th>
|
||||
<th>角色</th>
|
||||
<th>Email</th>
|
||||
<th>激活</th>
|
||||
<th class="text-center"><input type="checkbox" class="i-checks" name=""></th>
|
||||
<th class="text-center">ID</th>
|
||||
<th class="text-center">用户名</th>
|
||||
<th class="text-center">姓名</th>
|
||||
<th class="text-center">属组</th>
|
||||
<th class="text-center">角色</th>
|
||||
<th class="text-center">Email</th>
|
||||
<th class="text-center">激活</th>
|
||||
<th class="text-center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user in users %}
|
||||
<tr>
|
||||
<td>
|
||||
<div class="checkbox i-checks">
|
||||
<input type="checkbox" value="{{ user.id }}" name="selected">
|
||||
</div>
|
||||
{% for user in contacts.object_list %}
|
||||
<tr class="gradeX">
|
||||
<td class="text-center"><input type="checkbox" class="i-checks" name=""></td>
|
||||
<td class="text-center"> {{ user.id }} </td>
|
||||
<td class="text-center"> {{ user.username }} </td>
|
||||
<td class="text-center"> {{ user.name }} </td>
|
||||
<td class="text-center"> {{ user.username|groups_str }}</td>
|
||||
<td class="text-center">{{ user.id|get_role }}</td>
|
||||
<td class="text-center">{{ user.email }}</td>
|
||||
<td class="text-center">{{ user.is_active|bool2str }}</td>
|
||||
<td class="text-center">
|
||||
<a href="../user_detail/?username={{ user.username }}" class="iframe btn btn-xs btn-primary">详情</a>
|
||||
<a href="../user_edit/?username={{ user.username }}" class="btn btn-xs btn-info">编辑</a>
|
||||
<a href="../user_del/?username={{ user.username }}" class="btn btn-xs btn-danger">删除</a>
|
||||
</td>
|
||||
<td>{{ user.id }}</td>
|
||||
<td>{{ user.username }}</td>
|
||||
<td>{{ user.name }}</td>
|
||||
<td>{{ user.username|groups_str }}</td>
|
||||
<td>{{ user.id|get_role }}</td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.is_active }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-4 col-sm-offset-2">
|
||||
<button class="btn btn-white" type="submit">取消</button>
|
||||
<button id="submit_button" class="btn btn-primary" type="submit">确认删除</button>
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="dataTables_info" id="editable_info" role="status" aria-live="polite">
|
||||
Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="col-sm-6">
|
||||
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
|
||||
<ul class="pagination" style="margin-top: 0; float: right">
|
||||
{% if contacts.has_previous %}
|
||||
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||
<a href="?page={{ contacts.previous_page_number }}">Previous</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||
<a href="#">Previous</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% for page in p.page_range %}
|
||||
{% ifequal offset1 page %}
|
||||
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||
{% else %}
|
||||
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||
{% endifequal %}
|
||||
{% endfor %}
|
||||
{% if contacts.has_next %}
|
||||
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
|
||||
<a href="?page={{ contacts.next_page_number }}">Next</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
|
||||
<a href="#">Next</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
$(".iframe").colorbox({iframe:true, width:"70%", height:"70%"});
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
|
@ -0,0 +1,80 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load mytags %}
|
||||
|
||||
{% block content %}
|
||||
{% include 'nav_cat_bar.html' %}
|
||||
<div class="wrapper wrapper-content animated fadeInRight">
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5>用户信息 <small> show user info.</small></h5>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
<li><a href="#">未启用 1</a>
|
||||
</li>
|
||||
<li><a href="#">未启用 2</a>
|
||||
</li>
|
||||
</ul>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content" style="display: block;">
|
||||
<form method="post" action="">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<div class="checkbox i-checks">
|
||||
<input onclick="selectAll()" type="checkbox" name="select_all" style="select_all" id="select_all">
|
||||
</div>
|
||||
</th>
|
||||
<th>ID</th>
|
||||
<th>用户名</th>
|
||||
<th>姓名</th>
|
||||
<th>属组</th>
|
||||
<th>角色</th>
|
||||
<th>Email</th>
|
||||
<th>激活</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user in users %}
|
||||
<tr>
|
||||
<td>
|
||||
<div class="checkbox i-checks">
|
||||
<input type="checkbox" value="{{ user.id }}" name="selected">
|
||||
</div>
|
||||
</td>
|
||||
<td>{{ user.id }}</td>
|
||||
<td>{{ user.username }}</td>
|
||||
<td>{{ user.name }}</td>
|
||||
<td>{{ user.username|groups_str }}</td>
|
||||
<td>{{ user.id|get_role }}</td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.is_active }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-4 col-sm-offset-2">
|
||||
<button class="btn btn-white" type="submit">取消</button>
|
||||
<button id="submit_button" class="btn btn-primary" type="submit">确认删除</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<li ><a href="dashboard_3.html">Dashboard v.3</a></li>
|
||||
</ul>-->
|
||||
</li>
|
||||
<li>
|
||||
<li id="juser">
|
||||
<a href="#"><i class="fa fa-rebel"></i> <span class="nav-label">用户管理</span><span class="fa arrow"></span></a>
|
||||
<ul class="nav nav-second-level">
|
||||
<li><a href="/juser/user_list/">查看用户</a></li>
|
||||
|
@ -20,7 +20,7 @@
|
|||
<li><a href="/juser/group_add/">添加属组</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<li id="jasset">
|
||||
<a href="mailbox.html"><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a>
|
||||
<ul class="nav nav-second-level">
|
||||
<li><a href="/jasset/host_list/">查看资产</a></li>
|
||||
|
@ -31,7 +31,7 @@
|
|||
<li><a href="/jasset/group_add/">添加业务组</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<li id="jperm">
|
||||
<a href="#"><i class="fa fa-edit"></i> <span class="nav-label">授权管理</span><span class="fa arrow"></span></a>
|
||||
<ul class="nav nav-second-level">
|
||||
<li><a href="/jperm/perm_user_show/">查看授权</a></li>
|
||||
|
|
|
@ -33,3 +33,9 @@
|
|||
<!-- validator js -->
|
||||
<script src="/static/js/validator/jquery.validator.js"></script>
|
||||
<script src="/static/js/validator/zh_CN.js"></script>
|
||||
|
||||
<!-- active menu -->
|
||||
<script>
|
||||
var str = document.location.pathname.split("/")[1];
|
||||
$("#"+str).addClass('active');
|
||||
</script>
|
Loading…
Reference in New Issue