mirror of https://github.com/jumpserver/jumpserver
鉴权开始
parent
f3ae7f00a0
commit
a2ede31ae6
|
@ -227,6 +227,9 @@ def sudo_ldap_add(name, users_runas, user_groups_select, asset_groups_select,
|
|||
user_groups_select_list, asset_groups_select_list, cmd_groups_select_list = \
|
||||
user_asset_cmd_groups_get(user_groups_select, asset_groups_select, cmd_groups_select)
|
||||
|
||||
if not LDAP_ENABLE:
|
||||
return True
|
||||
|
||||
users = []
|
||||
assets = []
|
||||
cmds = []
|
||||
|
@ -283,8 +286,9 @@ def sudo_add(request):
|
|||
cmd_groups_select = request.POST.getlist('cmd_groups_select')
|
||||
comment = request.POST.get('comment', '')
|
||||
|
||||
sudo_db_add(name, users_runas, user_groups_select, asset_groups_select, cmd_groups_select, comment)
|
||||
sudo_ldap_add(name, users_runas, user_groups_select, asset_groups_select, cmd_groups_select)
|
||||
if LDAP_ENABLE:
|
||||
sudo_db_add(name, users_runas, user_groups_select, asset_groups_select, cmd_groups_select, comment)
|
||||
sudo_ldap_add(name, users_runas, user_groups_select, asset_groups_select, cmd_groups_select)
|
||||
|
||||
msg = '娣诲姞鎴愬姛'
|
||||
return render_to_response('jperm/sudo_add.html', locals(), context_instance=RequestContext(request))
|
||||
|
@ -335,10 +339,11 @@ def sudo_edit(request):
|
|||
|
||||
sudo_perm = SudoPerm.objects.get(id=sudo_perm_id)
|
||||
old_name = sudo_perm.name
|
||||
sudo_db_update(sudo_perm_id, name, users_runas, user_groups_select,
|
||||
asset_groups_select, cmd_groups_select, comment)
|
||||
sudo_ldap_add(name, users_runas, user_groups_select, asset_groups_select,
|
||||
cmd_groups_select, update=True, old_name=str(old_name))
|
||||
if LDAP_ENABLE:
|
||||
sudo_db_update(sudo_perm_id, name, users_runas, user_groups_select,
|
||||
asset_groups_select, cmd_groups_select, comment)
|
||||
sudo_ldap_add(name, users_runas, user_groups_select, asset_groups_select,
|
||||
cmd_groups_select, update=True, old_name=str(old_name))
|
||||
msg = '淇敼鎴愬姛'
|
||||
|
||||
return HttpResponseRedirect('/jperm/sudo_list/')
|
||||
|
|
|
@ -8,7 +8,7 @@ password = mysql234
|
|||
database = jumpserver
|
||||
|
||||
[ldap]
|
||||
ldap_enable = 0
|
||||
ldap_enable = 1
|
||||
host_url = ldap://127.0.0.1:389
|
||||
base_dn = dc=jumpserver, dc=org
|
||||
root_dn = cn=admin,dc=jumpserver,dc=org
|
||||
|
|
|
@ -9,6 +9,7 @@ from Crypto.Cipher import AES
|
|||
from binascii import b2a_hex, a2b_hex
|
||||
import ldap
|
||||
from ldap import modlist
|
||||
import hashlib
|
||||
|
||||
from django.http import HttpResponse, Http404
|
||||
|
||||
|
@ -25,33 +26,7 @@ SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys')
|
|||
SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server')
|
||||
KEY = CONF.get('web', 'key')
|
||||
LOGIN_NAME = getpass.getuser()
|
||||
|
||||
|
||||
class PyCrypt(object):
|
||||
"""This class used to encrypt and decrypt password."""
|
||||
|
||||
def __init__(self, key):
|
||||
self.key = key
|
||||
self.mode = AES.MODE_CBC
|
||||
|
||||
def encrypt(self, text):
|
||||
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
||||
length = 16
|
||||
try:
|
||||
count = len(text)
|
||||
except TypeError:
|
||||
raise ServerError('Encrypt password error, TYpe error.')
|
||||
add = (length - (count % length))
|
||||
text += ('\0' * add)
|
||||
ciphertext = cryptor.encrypt(text)
|
||||
return b2a_hex(ciphertext)
|
||||
|
||||
|
||||
CRYPTOR = PyCrypt(KEY)
|
||||
|
||||
|
||||
class ServerError(Exception):
|
||||
pass
|
||||
LDAP_ENABLE = CONF.getint('ldap', 'ldap_enable')
|
||||
|
||||
|
||||
class LDAPMgmt():
|
||||
|
@ -111,8 +86,54 @@ class LDAPMgmt():
|
|||
return plain_text.rstrip('\0')
|
||||
|
||||
|
||||
if LDAP_ENABLE:
|
||||
LDAP_HOST_URL = CONF.get('ldap', 'host_url')
|
||||
LDAP_BASE_DN = CONF.get('ldap', 'base_dn')
|
||||
LDAP_ROOT_DN = CONF.get('ldap', 'root_dn')
|
||||
LDAP_ROOT_PW = CONF.get('ldap', 'root_pw')
|
||||
ldap_conn = LDAPMgmt(LDAP_HOST_URL, LDAP_BASE_DN, LDAP_ROOT_DN, LDAP_ROOT_PW)
|
||||
else:
|
||||
ldap_conn = None
|
||||
|
||||
|
||||
def md5_crypt(string):
|
||||
return hashlib.new("md5", string).hexdigest()
|
||||
|
||||
|
||||
def get_session_user_dept(request):
|
||||
user_id = request.session.get('user_id', '')
|
||||
user = User.objects.filter(id=user_id)
|
||||
if user:
|
||||
user = user[0]
|
||||
dept = user.dept
|
||||
return user, dept
|
||||
|
||||
|
||||
class PyCrypt(object):
|
||||
"""This class used to encrypt and decrypt password."""
|
||||
|
||||
def __init__(self, key):
|
||||
self.key = key
|
||||
self.mode = AES.MODE_CBC
|
||||
|
||||
def encrypt(self, text):
|
||||
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
||||
length = 16
|
||||
try:
|
||||
count = len(text)
|
||||
except TypeError:
|
||||
raise ServerError('Encrypt password error, TYpe error.')
|
||||
add = (length - (count % length))
|
||||
text += ('\0' * add)
|
||||
ciphertext = cryptor.encrypt(text)
|
||||
return b2a_hex(ciphertext)
|
||||
|
||||
|
||||
CRYPTOR = PyCrypt(KEY)
|
||||
|
||||
|
||||
class ServerError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def require_login(func):
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#coding: utf-8
|
||||
# coding: utf-8
|
||||
|
||||
import hashlib
|
||||
from ConfigParser import ConfigParser
|
||||
|
@ -17,27 +17,7 @@ from django.template import RequestContext
|
|||
from juser.models import User, UserGroup
|
||||
from jlog.models import Log
|
||||
from jasset.models import Asset, BisGroup, IDC
|
||||
from jumpserver.api import require_admin, require_super_user, require_login, CRYPTOR, LDAPMgmt
|
||||
|
||||
BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
||||
CONF = ConfigParser()
|
||||
CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf'))
|
||||
|
||||
LDAP_ENABLE = CONF.getint('ldap', 'ldap_enable')
|
||||
|
||||
|
||||
if LDAP_ENABLE:
|
||||
LDAP_HOST_URL = CONF.get('ldap', 'host_url')
|
||||
LDAP_BASE_DN = CONF.get('ldap', 'base_dn')
|
||||
LDAP_ROOT_DN = CONF.get('ldap', 'root_dn')
|
||||
LDAP_ROOT_PW = CONF.get('ldap', 'root_pw')
|
||||
ldap_conn = LDAPMgmt(LDAP_HOST_URL, LDAP_BASE_DN, LDAP_ROOT_DN, LDAP_ROOT_PW)
|
||||
else:
|
||||
ldap_conn = None
|
||||
|
||||
|
||||
def md5_crypt(string):
|
||||
return hashlib.new("md5", string).hexdigest()
|
||||
from jumpserver.api import *
|
||||
|
||||
|
||||
def getDaysByNum(num):
|
||||
|
|
|
@ -7,14 +7,14 @@ urlpatterns = patterns('juser.views',
|
|||
# url(r'^$', 'jumpserver.views.home', name='home'),
|
||||
# url(r'^blog/', include('blog.urls')),
|
||||
|
||||
(r'^dept_list/$', 'dept_list'),
|
||||
(r'^dept_list/$', view_splitter, {'su': dept_list, 'adm': dept_list_adm}),
|
||||
(r'^dept_add/$', 'dept_add'),
|
||||
(r'^dept_del/$', 'dept_del'),
|
||||
(r'^dept_detail/$', 'dept_detail'),
|
||||
(r'^dept_del_ajax/$', 'dept_del_ajax'),
|
||||
(r'^dept_edit/$', 'dept_edit'),
|
||||
(r'^group_add/$', 'group_add'),
|
||||
(r'^group_list/$', view_splitter, {'su': group_list_su, 'adm': group_list_adm}),
|
||||
(r'^group_list/$', view_splitter, {'su': group_list, 'adm': group_list_adm}),
|
||||
(r'^group_detail/$', 'group_detail'),
|
||||
(r'^group_del/$', 'group_del'),
|
||||
(r'^group_del_ajax/$', 'group_del_ajax'),
|
||||
|
|
|
@ -21,8 +21,7 @@ from juser.models import UserGroup, User, DEPT
|
|||
from connect import BASE_DIR
|
||||
from connect import CONF
|
||||
from jumpserver.views import md5_crypt, LDAPMgmt, LDAP_ENABLE, ldap_conn, page_list_return, pages
|
||||
from jumpserver.api import user_perm_group_api, require_login, require_super_user, \
|
||||
require_admin, is_group_admin, is_super_user, CRYPTOR
|
||||
from jumpserver.api import *
|
||||
|
||||
if LDAP_ENABLE:
|
||||
LDAP_HOST_URL = CONF.get('ldap', 'host_url')
|
||||
|
@ -31,7 +30,7 @@ if LDAP_ENABLE:
|
|||
LDAP_ROOT_PW = CONF.get('ldap', 'root_pw')
|
||||
|
||||
|
||||
def gen_rand_wd(num):
|
||||
def gen_rand_pwd(num):
|
||||
"""鐢熸垚闅忔満瀵嗙爜"""
|
||||
seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
salt_list = []
|
||||
|
@ -236,6 +235,17 @@ def dept_list(request):
|
|||
return render_to_response('juser/dept_list.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@require_admin
|
||||
def dept_list_adm(request):
|
||||
header_title, path1, path2 = '鏌ョ湅閮ㄩ棬', '鐢ㄦ埛绠$悊', '鏌ョ湅閮ㄩ棬'
|
||||
user, dept = get_session_user_dept(request)
|
||||
contact_list = [dept]
|
||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request)
|
||||
|
||||
return render_to_response('juser/dept_list.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
|
||||
@require_super_user
|
||||
def dept_detail(request):
|
||||
dept_id = request.GET.get('id', None)
|
||||
|
@ -363,13 +373,20 @@ def group_add(request):
|
|||
|
||||
|
||||
@require_super_user
|
||||
def group_list_su(request):
|
||||
def group_list(request):
|
||||
header_title, path1, path2 = '鏌ョ湅灏忕粍', '鐢ㄦ埛绠$悊', '鏌ョ湅灏忕粍'
|
||||
keyword = request.GET.get('search', '')
|
||||
did = request.GET.get('did', '')
|
||||
contact_list = UserGroup.objects.all().order_by('name')
|
||||
|
||||
if did:
|
||||
dept = DEPT.objects.filter(id=did)
|
||||
if dept:
|
||||
dept = dept[0]
|
||||
contact_list = dept.usergroup_set.all()
|
||||
|
||||
if keyword:
|
||||
contact_list = UserGroup.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword))
|
||||
else:
|
||||
contact_list = UserGroup.objects.all().order_by('name')
|
||||
contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword))
|
||||
|
||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request)
|
||||
return render_to_response('juser/group_list.html', locals(), context_instance=RequestContext(request))
|
||||
|
@ -379,11 +396,12 @@ def group_list_su(request):
|
|||
def group_list_adm(request):
|
||||
header_title, path1, path2 = '鏌ョ湅閮ㄩ棬灏忕粍', '鐢ㄦ埛绠$悊', '鏌ョ湅灏忕粍'
|
||||
keyword = request.GET.get('search', '')
|
||||
user_id = request.session.get('user_id')
|
||||
did = request.GET.get('did', '')
|
||||
user, dept = get_session_user_dept(request)
|
||||
contact_list = dept.usergroup_set.all().order_by('name')
|
||||
|
||||
if keyword:
|
||||
contact_list = UserGroup.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword))
|
||||
else:
|
||||
contact_list = UserGroup.objects.all().order_by('name')
|
||||
contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword))
|
||||
|
||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request)
|
||||
return render_to_response('juser/group_list.html', locals(), context_instance=RequestContext(request))
|
||||
|
@ -445,13 +463,28 @@ def group_edit(request):
|
|||
else:
|
||||
group_id = request.POST.get('group_id', '')
|
||||
group_name = request.POST.get('group_name', '')
|
||||
dept_id = request.POST.get('dept_id', '')
|
||||
comment = request.POST.get('comment', '')
|
||||
users_selected = request.POST.getlist('users_selected')
|
||||
|
||||
users = []
|
||||
try:
|
||||
if '' in [group_id, group_name]:
|
||||
raise AddError('缁勫悕涓嶈兘涓虹┖')
|
||||
UserGroup.objects.filter(id=group_id).update(name=group_name, comment=comment)
|
||||
dept = DEPT.objects.filter(id=dept_id)
|
||||
if dept:
|
||||
dept = dept[0]
|
||||
else:
|
||||
raise AddError('閮ㄩ棬涓嶅瓨鍦')
|
||||
for user_id in users_selected:
|
||||
users.extend(User.objects.filter(id=user_id))
|
||||
|
||||
user_group = UserGroup.objects.filter(id=group_id)
|
||||
if user_group:
|
||||
user_group.update(name=group_name, comment=comment, dept=dept)
|
||||
user_group = user_group[0]
|
||||
user_group.user_set.clear()
|
||||
user_group.user_set = users
|
||||
|
||||
except AddError, e:
|
||||
error = e
|
||||
|
|
|
@ -58,11 +58,11 @@
|
|||
{% for dept in contacts.object_list %}
|
||||
<tr class="gradeX">
|
||||
<td class="text-center"> {{ dept.name }} </td>
|
||||
<td class="text-center"> {{ dept.id | dept_user_num }} </td>
|
||||
<td class="text-center"><a href="/juser/user_list/?did={{ dept.id }}">{{ dept.id | dept_user_num }} </a> </td>
|
||||
<td class="text-center"> {{ dept.id | dept_asset_num }} </td>
|
||||
<td class="text-center"> {{ dept.comment }} </td>
|
||||
<td class="text-center">
|
||||
<a title="[ {{ dept.name }} ] 鎴愬憳淇℃伅" href="../dept_detail/?id={{ dept.id }}" class="iframe btn btn-xs btn-primary">涓绘満</a>
|
||||
{# <a title="[ {{ dept.name }} ] 鎴愬憳淇℃伅" href="../dept_detail/?id={{ dept.id }}" class="iframe btn btn-xs btn-primary">涓绘満</a>#}
|
||||
<a href="../dept_perm_edit/?id={{ dept.id }}" class="btn btn-xs btn-danger">鎺堟潈缂栬緫</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
<tr class="gradeX">
|
||||
<td class="text-center"> {{ group.name }} </td>
|
||||
<td class="text-center"> {{ group.dept.name }} </td>
|
||||
<td class="text-center"> {{ group.id | member_count }} </td>
|
||||
<td class="text-center"><a href="/juser/user_list/?did={{ group.id }}">{{ group.id | member_count }} </a> </td>
|
||||
<td class="text-center"> {{ group.id | ugrp_perm_agrp_count }} </td>
|
||||
<td class="text-center"> {{ group.id | ugrp_perm_asset_count }} </td>
|
||||
<td class="text-center"> {{ group.comment }} </td>
|
||||
|
|
|
@ -58,10 +58,10 @@
|
|||
{% for group in contacts.object_list %}
|
||||
<tr class="gradeX">
|
||||
<td class="text-center"> {{ group.name }} </td>
|
||||
<td class="text-center"> {{ group.cmd | string_length:50 }} </td>
|
||||
<td class="text-center" title="{{ group.cmd }}"> {{ group.cmd | string_length:50 }} </td>
|
||||
<td class="text-center"> {{ group.comment }} </td>
|
||||
<td class="text-center">
|
||||
<a href="../cmd_detail/?id={{ group.id }}" class="btn btn-xs btn-info">璇︽儏</a>
|
||||
{# <a href="../cmd_detail/?id={{ group.id }}" class="btn btn-xs btn-info">璇︽儏</a>#}
|
||||
<a href="../cmd_edit/?id={{ group.id }}" class="btn btn-xs btn-info">缂栬緫</a>
|
||||
<a href="../cmd_del/?id={{ group.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
|
||||
</td>
|
||||
|
|
|
@ -1,42 +1,116 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load mytags %}
|
||||
<html>
|
||||
<head>
|
||||
{% include 'link_css.html' %}
|
||||
{% block content %}
|
||||
{% include 'nav_cat_bar.html' %}
|
||||
|
||||
<style type="text/css">
|
||||
body
|
||||
{
|
||||
background: #FFFFFF;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<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> 鏌ョ湅閮ㄩ棬 </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>
|
||||
|
||||
<body>
|
||||
<div class="row">
|
||||
<div class="contact-box">
|
||||
<h2 class="text-center"><b>{{ dept.name }}</b> 閮ㄩ棬鎴愬憳</h2>
|
||||
<div class="ibox-content">
|
||||
<div class="">
|
||||
<a target="_blank" href="/juser/dept_add/" class="btn btn-sm btn-primary "> 娣诲姞閮ㄩ棬 </a>
|
||||
<a id="del_btn" class="btn btn-sm btn-danger"> 鍒犻櫎鎵閫 </a>
|
||||
<form id="search_form" method="get" action="" class="pull-right mail-search">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control input-sm" id="search_input" name="search" placeholder="Search">
|
||||
<div class="input-group-btn">
|
||||
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
|
||||
Search
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<table class="table table-striped table-bordered table-hover " id="editable" >
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-center">鐢ㄦ埛鍚</th>
|
||||
<th class="text-center">濮撳悕</th>
|
||||
<th class="text-center">瑙掕壊</th>
|
||||
<th class="text-center">
|
||||
<input type="checkbox" id="select_all" onclick="selectAll()" name="select_all">
|
||||
</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">澶囨敞</th>
|
||||
<th class="text-center">鎿嶄綔</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user in users %}
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">{{ user.username }}</td>
|
||||
<td class="text-center">{{ user.name }}</td>
|
||||
<td class="text-center">{{ user.id|get_role }}</td>
|
||||
</tr>
|
||||
{% for dept in contacts.object_list %}
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">
|
||||
<input type="checkbox" name="selected" value="{{ dept.id }}">
|
||||
</td>
|
||||
<td class="text-center"> {{ dept.name }} </td>
|
||||
<td class="text-center"> <a href="/juser/group_list/?did={{ dept.id }}">{{ dept.id | dept_group_num }}</a> </td>
|
||||
<td class="text-center"> <a href="/juser/user_list/?did={{ dept.id }}">{{ dept.id | dept_user_num}} </a> </td>
|
||||
<td class="text-center"> {{ dept.id | dept_asset_num}} </td>
|
||||
<td class="text-center"> {{ dept.comment }} </td>
|
||||
<td class="text-center">
|
||||
<a href="../dept_detail/?id={{ dept.id }}" class="btn btn-xs btn-primary">璇︽儏</a>
|
||||
<a href="../dept_edit/?id={{ dept.id }}" class="btn btn-xs btn-info">缂栬緫</a>
|
||||
<a href="../dept_del/?id={{ dept.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
<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>
|
||||
{% include 'paginator.html' %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
$(".iframe").colorbox({iframe:true, width:"70%", height:"70%"});
|
||||
var check_array = []
|
||||
$('#del_btn').click(function(){
|
||||
if (confirm("纭畾鍒犻櫎")) {
|
||||
$(".gradeX input:checked").each(function() {check_array.push($(this).attr("value")) })
|
||||
$(".gradeX input:checked").closest("tr").remove()
|
||||
$.post("/juser/dept_del_ajax/",
|
||||
{dept_ids: check_array.join(",")},
|
||||
function(data){
|
||||
alert(data)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
|
@ -65,13 +65,19 @@
|
|||
<input type="checkbox" name="selected" value="{{ dept.id }}">
|
||||
</td>
|
||||
<td class="text-center"> {{ dept.name }} </td>
|
||||
<td class="text-center"> <a href="/juser/">{{ dept.id | dept_group_num}}</a> </td>
|
||||
<td class="text-center"> {{ dept.id | dept_user_num}} </td>
|
||||
<td class="text-center"> <a href="/juser/group_list/?did={{ dept.id }}">{{ dept.id | dept_group_num }}</a> </td>
|
||||
<td class="text-center"> <a href="/juser/user_list/?did={{ dept.id }}">{{ dept.id | dept_user_num}} </a> </td>
|
||||
<td class="text-center"> {{ dept.id | dept_asset_num}} </td>
|
||||
<td class="text-center"> {{ dept.comment }} </td>
|
||||
<td class="text-center">
|
||||
<a href="../dept_edit/?id={{ dept.id }}" class="btn btn-xs btn-info">缂栬緫</a>
|
||||
<a href="../dept_del/?id={{ dept.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
|
||||
{# <a href="../dept_detail/?id={{ dept.id }}" class="btn btn-xs btn-primary">璇︽儏</a>#}
|
||||
{% ifequal session_role_id 2 %}
|
||||
<a href="../dept_edit/?id={{ dept.id }}" class="btn btn-xs btn-info">缂栬緫</a>
|
||||
<a href="../dept_del/?id={{ dept.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
|
||||
{% else %}
|
||||
<a href="../dept_edit/?id={{ dept.id }}" class="btn btn-xs btn-info disabled">缂栬緫</a>
|
||||
<a href="../dept_del/?id={{ dept.id }}" class="btn btn-xs btn-danger disabled">鍒犻櫎</a>
|
||||
{% endifequal %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
|
|
@ -65,10 +65,9 @@
|
|||
</td>
|
||||
<td class="text-center"> {{ group.name }} </td>
|
||||
<td class="text-center"> {{ group.dept.name }} </td>
|
||||
<td class="text-center"> {{ group.id | member_count }} </td>
|
||||
<td class="text-center"><a href="/juser/user_list/?gid={{ group.id }}"> {{ group.id | member_count }}</a> </td>
|
||||
<td class="text-center"> {{ group.comment }} </td>
|
||||
<td class="text-center">
|
||||
<a href="../user_list/group/?gid={{ group.id }}" class="btn btn-xs btn-primary">鎴愬憳</a>
|
||||
<a href="../group_edit/?id={{ group.id }}" class="btn btn-xs btn-info">缂栬緫</a>
|
||||
<a href="../group_del/?id={{ group.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
|
||||
</td>
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
<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 class="dept_list"><a href="/juser/dept_list/">鏌ョ湅閮ㄩ棬</a></li>
|
||||
<li class="dept_list dept_edit"><a href="/juser/dept_list/">鏌ョ湅閮ㄩ棬</a></li>
|
||||
<li class="dept_add"><a href="/juser/dept_add/">娣诲姞閮ㄩ棬</a></li>
|
||||
<li class="group_list"><a href="/juser/group_list/">鏌ョ湅灏忕粍</a></li>
|
||||
<li class="group_list group_edit"><a href="/juser/group_list/">鏌ョ湅灏忕粍</a></li>
|
||||
<li class="group_add"><a href="/juser/group_add/">娣诲姞灏忕粍</a></li>
|
||||
<li class="user_list user_edit"><a href="/juser/user_list/">鏌ョ湅鐢ㄦ埛<span class="label {% ifequal user_active_num user_total_num %}label-primary {% else %}label-warning {% endifequal %}pull-right">{{ user_active_num }}/{{ user_total_num }}</span></a></li>
|
||||
<li class="user_add"><a href="/juser/user_add/">娣诲姞鐢ㄦ埛</a></li>
|
||||
|
@ -37,15 +37,15 @@
|
|||
<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 id="dept_perm_list">
|
||||
<li class="dept_perm_list dept_perm_edit">
|
||||
<a href="/jperm/dept_perm_list/">閮ㄩ棬鎺堟潈</a>
|
||||
</li>
|
||||
|
||||
<li id="perm_list">
|
||||
<li class="perm_list perm_edit">
|
||||
<a href="/jperm/perm_list/">灏忕粍鎺堟潈</a>
|
||||
</li>
|
||||
|
||||
<li id="sudo_add">
|
||||
<li class="sudo_list sudo_edit sudo_add cmd_list cmd_edit">
|
||||
<a href="/jperm/sudo_list/">Sudo鎺堟潈</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -90,10 +90,11 @@
|
|||
<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 id="group_list"><a href="/juser/group_list/">鏌ョ湅灏忕粍</a></li>
|
||||
<li id="group_add"><a href="/juser/group_add/">娣诲姞灏忕粍</a></li>
|
||||
<li id="user_list"><a href="/juser/user_list/">鏌ョ湅鐢ㄦ埛<span class="label {% ifequal user_active_num user_total_num %}label-primary {% else %}label-warning {% endifequal %}pull-right">{{ user_active_num }}/{{ user_total_num }}</span></a></li>
|
||||
<li id="user_add"><a href="/juser/user_add/">娣诲姞鐢ㄦ埛</a></li>
|
||||
<li class="dept_list dept_edit"><a href="/juser/dept_list/">鏌ョ湅閮ㄩ棬</a></li>
|
||||
<li class="group_list"><a href="/juser/group_list/">鏌ョ湅灏忕粍</a></li>
|
||||
<li class="group_add"><a href="/juser/group_add/">娣诲姞灏忕粍</a></li>
|
||||
<li class="user_list"><a href="/juser/user_list/">鏌ョ湅鐢ㄦ埛<span class="label {% ifequal user_active_num user_total_num %}label-primary {% else %}label-warning {% endifequal %}pull-right">{{ user_active_num }}/{{ user_total_num }}</span></a></li>
|
||||
<li class="user_add"><a href="/juser/user_add/">娣诲姞鐢ㄦ埛</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li id="jasset">
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
{% else %}
|
||||
{% if contacts.has_previous %}
|
||||
<li class="paginate_button previous" aria-controls="editable" tabindex="0" >
|
||||
<a href="?page={{ contacts.previous_page_number }}{{ href }}">Previous</a>
|
||||
<a class="test" href="?page={{ contacts.previous_page_number }}{{ href }}">Previous</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" >
|
||||
|
@ -57,25 +57,25 @@
|
|||
</li>
|
||||
{% endif %}
|
||||
{% ifequal show_first 1 %}
|
||||
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page=1{{ href }}" title="绗1椤">1...</a></li>
|
||||
<li class="paginate_button" aria-controls="editable" tabindex="0"><a class="test" href="?page=1{{ href }}" title="绗1椤">1...</a></li>
|
||||
{% endifequal %}
|
||||
{% for page in page_range %}
|
||||
{% ifequal current_page page %}
|
||||
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?page={{ page }}" title="绗瑊{ page }}椤">{{ page }}</a></li>
|
||||
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a class="test" 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>
|
||||
<li class="paginate_button" aria-controls="editable" tabindex="0"><a class="test" href="?page={{ page }}" title="绗瑊{ page }}椤">{{ page }}</a></li>
|
||||
{% endifequal %}
|
||||
{% endfor %}
|
||||
{% ifequal show_end 1 %}
|
||||
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ p.num_pages }}" title="绗瑊{ page }}椤">...{{ p.num_pages }}</a></li>
|
||||
<li class="paginate_button" aria-controls="editable" tabindex="0"><a class="test" href="?page={{ p.num_pages }}" title="绗瑊{ page }}椤">...{{ p.num_pages }}</a></li>
|
||||
{% endifequal %}
|
||||
{% if contacts.has_next %}
|
||||
<li class="paginate_button next" aria-controls="editable" tabindex="0" >
|
||||
<a href="?page={{ contacts.next_page_number }}">Next</a>
|
||||
<a class="test" href="?page={{ contacts.next_page_number }}">Next</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" >
|
||||
<a href="#">Next</a>
|
||||
<a class="test" href="#">Next</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
|
Loading鈥
Reference in New Issue