鉴权开始

pull/6/head
guanghongwei 2015-03-15 23:23:20 +08:00
parent f3ae7f00a0
commit a2ede31ae6
14 changed files with 243 additions and 124 deletions

View File

@ -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_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) user_asset_cmd_groups_get(user_groups_select, asset_groups_select, cmd_groups_select)
if not LDAP_ENABLE:
return True
users = [] users = []
assets = [] assets = []
cmds = [] cmds = []
@ -283,8 +286,9 @@ def sudo_add(request):
cmd_groups_select = request.POST.getlist('cmd_groups_select') cmd_groups_select = request.POST.getlist('cmd_groups_select')
comment = request.POST.get('comment', '') comment = request.POST.get('comment', '')
sudo_db_add(name, users_runas, user_groups_select, asset_groups_select, cmd_groups_select, comment) if LDAP_ENABLE:
sudo_ldap_add(name, users_runas, user_groups_select, asset_groups_select, cmd_groups_select) 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 = '娣诲姞鎴愬姛' msg = '娣诲姞鎴愬姛'
return render_to_response('jperm/sudo_add.html', locals(), context_instance=RequestContext(request)) 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) sudo_perm = SudoPerm.objects.get(id=sudo_perm_id)
old_name = sudo_perm.name old_name = sudo_perm.name
sudo_db_update(sudo_perm_id, name, users_runas, user_groups_select, if LDAP_ENABLE:
asset_groups_select, cmd_groups_select, comment) sudo_db_update(sudo_perm_id, name, users_runas, user_groups_select,
sudo_ldap_add(name, users_runas, user_groups_select, asset_groups_select, asset_groups_select, cmd_groups_select, comment)
cmd_groups_select, update=True, old_name=str(old_name)) sudo_ldap_add(name, users_runas, user_groups_select, asset_groups_select,
cmd_groups_select, update=True, old_name=str(old_name))
msg = '淇敼鎴愬姛' msg = '淇敼鎴愬姛'
return HttpResponseRedirect('/jperm/sudo_list/') return HttpResponseRedirect('/jperm/sudo_list/')

View File

@ -8,7 +8,7 @@ password = mysql234
database = jumpserver database = jumpserver
[ldap] [ldap]
ldap_enable = 0 ldap_enable = 1
host_url = ldap://127.0.0.1:389 host_url = ldap://127.0.0.1:389
base_dn = dc=jumpserver, dc=org base_dn = dc=jumpserver, dc=org
root_dn = cn=admin,dc=jumpserver,dc=org root_dn = cn=admin,dc=jumpserver,dc=org

View File

@ -9,6 +9,7 @@ from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex from binascii import b2a_hex, a2b_hex
import ldap import ldap
from ldap import modlist from ldap import modlist
import hashlib
from django.http import HttpResponse, Http404 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') SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server')
KEY = CONF.get('web', 'key') KEY = CONF.get('web', 'key')
LOGIN_NAME = getpass.getuser() LOGIN_NAME = getpass.getuser()
LDAP_ENABLE = CONF.getint('ldap', 'ldap_enable')
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
class LDAPMgmt(): class LDAPMgmt():
@ -111,8 +86,54 @@ class LDAPMgmt():
return plain_text.rstrip('\0') 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): def require_login(func):

View File

@ -1,4 +1,4 @@
#coding: utf-8 # coding: utf-8
import hashlib import hashlib
from ConfigParser import ConfigParser from ConfigParser import ConfigParser
@ -17,27 +17,7 @@ from django.template import RequestContext
from juser.models import User, UserGroup from juser.models import User, UserGroup
from jlog.models import Log from jlog.models import Log
from jasset.models import Asset, BisGroup, IDC from jasset.models import Asset, BisGroup, IDC
from jumpserver.api import require_admin, require_super_user, require_login, CRYPTOR, LDAPMgmt from jumpserver.api import *
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()
def getDaysByNum(num): def getDaysByNum(num):

View File

@ -7,14 +7,14 @@ urlpatterns = patterns('juser.views',
# url(r'^$', 'jumpserver.views.home', name='home'), # url(r'^$', 'jumpserver.views.home', name='home'),
# url(r'^blog/', include('blog.urls')), # 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_add/$', 'dept_add'),
(r'^dept_del/$', 'dept_del'), (r'^dept_del/$', 'dept_del'),
(r'^dept_detail/$', 'dept_detail'), (r'^dept_detail/$', 'dept_detail'),
(r'^dept_del_ajax/$', 'dept_del_ajax'), (r'^dept_del_ajax/$', 'dept_del_ajax'),
(r'^dept_edit/$', 'dept_edit'), (r'^dept_edit/$', 'dept_edit'),
(r'^group_add/$', 'group_add'), (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_detail/$', 'group_detail'),
(r'^group_del/$', 'group_del'), (r'^group_del/$', 'group_del'),
(r'^group_del_ajax/$', 'group_del_ajax'), (r'^group_del_ajax/$', 'group_del_ajax'),

View File

@ -21,8 +21,7 @@ from juser.models import UserGroup, User, DEPT
from connect import BASE_DIR from connect import BASE_DIR
from connect import CONF from connect import CONF
from jumpserver.views import md5_crypt, LDAPMgmt, LDAP_ENABLE, ldap_conn, page_list_return, pages 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, \ from jumpserver.api import *
require_admin, is_group_admin, is_super_user, CRYPTOR
if LDAP_ENABLE: if LDAP_ENABLE:
LDAP_HOST_URL = CONF.get('ldap', 'host_url') LDAP_HOST_URL = CONF.get('ldap', 'host_url')
@ -31,7 +30,7 @@ if LDAP_ENABLE:
LDAP_ROOT_PW = CONF.get('ldap', 'root_pw') LDAP_ROOT_PW = CONF.get('ldap', 'root_pw')
def gen_rand_wd(num): def gen_rand_pwd(num):
"""鐢熸垚闅忔満瀵嗙爜""" """鐢熸垚闅忔満瀵嗙爜"""
seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
salt_list = [] salt_list = []
@ -236,6 +235,17 @@ def dept_list(request):
return render_to_response('juser/dept_list.html', locals(), context_instance=RequestContext(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 @require_super_user
def dept_detail(request): def dept_detail(request):
dept_id = request.GET.get('id', None) dept_id = request.GET.get('id', None)
@ -363,13 +373,20 @@ def group_add(request):
@require_super_user @require_super_user
def group_list_su(request): def group_list(request):
header_title, path1, path2 = '鏌ョ湅灏忕粍', '鐢ㄦ埛绠$悊', '鏌ョ湅灏忕粍' header_title, path1, path2 = '鏌ョ湅灏忕粍', '鐢ㄦ埛绠$悊', '鏌ョ湅灏忕粍'
keyword = request.GET.get('search', '') 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: if keyword:
contact_list = UserGroup.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword))
else:
contact_list = UserGroup.objects.all().order_by('name')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) 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)) 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): def group_list_adm(request):
header_title, path1, path2 = '鏌ョ湅閮ㄩ棬灏忕粍', '鐢ㄦ埛绠$悊', '鏌ョ湅灏忕粍' header_title, path1, path2 = '鏌ョ湅閮ㄩ棬灏忕粍', '鐢ㄦ埛绠$悊', '鏌ョ湅灏忕粍'
keyword = request.GET.get('search', '') 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: if keyword:
contact_list = UserGroup.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword))
else:
contact_list = UserGroup.objects.all().order_by('name')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) 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)) return render_to_response('juser/group_list.html', locals(), context_instance=RequestContext(request))
@ -445,13 +463,28 @@ def group_edit(request):
else: else:
group_id = request.POST.get('group_id', '') group_id = request.POST.get('group_id', '')
group_name = request.POST.get('group_name', '') group_name = request.POST.get('group_name', '')
dept_id = request.POST.get('dept_id', '')
comment = request.POST.get('comment', '') comment = request.POST.get('comment', '')
users_selected = request.POST.getlist('users_selected') users_selected = request.POST.getlist('users_selected')
users = []
try: try:
if '' in [group_id, group_name]: if '' in [group_id, group_name]:
raise AddError('缁勫悕涓嶈兘涓虹┖') 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: except AddError, e:
error = e error = e

View File

@ -58,11 +58,11 @@
{% for dept in contacts.object_list %} {% for dept in contacts.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center"> {{ dept.name }} </td> <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.id | dept_asset_num }} </td>
<td class="text-center"> {{ dept.comment }} </td> <td class="text-center"> {{ dept.comment }} </td>
<td class="text-center"> <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> <a href="../dept_perm_edit/?id={{ dept.id }}" class="btn btn-xs btn-danger">鎺堟潈缂栬緫</a>
</td> </td>
</tr> </tr>

View File

@ -60,7 +60,7 @@
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center"> {{ group.name }} </td> <td class="text-center"> {{ group.name }} </td>
<td class="text-center"> {{ group.dept.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_agrp_count }} </td>
<td class="text-center"> {{ group.id | ugrp_perm_asset_count }} </td> <td class="text-center"> {{ group.id | ugrp_perm_asset_count }} </td>
<td class="text-center"> {{ group.comment }} </td> <td class="text-center"> {{ group.comment }} </td>

View File

@ -58,10 +58,10 @@
{% for group in contacts.object_list %} {% for group in contacts.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center"> {{ group.name }} </td> <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"> {{ group.comment }} </td>
<td class="text-center"> <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_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> <a href="../cmd_del/?id={{ group.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
</td> </td>

View File

@ -1,42 +1,116 @@
{% extends 'base.html' %}
{% load mytags %} {% load mytags %}
<html> {% block content %}
<head> {% include 'nav_cat_bar.html' %}
{% include 'link_css.html' %}
<style type="text/css"> <div class="wrapper wrapper-content animated fadeInRight">
body <div class="row">
{ <div class="col-lg-10">
background: #FFFFFF; <div class="ibox float-e-margins">
} <div class="ibox-title">
</style> <h5> 鏌ョ湅閮ㄩ棬 </h5>
</head> <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="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" > <table class="table table-striped table-bordered table-hover " id="editable" >
<thead> <thead>
<tr> <tr>
<th class="text-center">鐢ㄦ埛鍚</th> <th class="text-center">
<th class="text-center">濮撳悕</th> <input type="checkbox" id="select_all" onclick="selectAll()" name="select_all">
<th class="text-center">瑙掕壊</th> </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> </tr>
</thead> </thead>
<tbody> <tbody>
{% for user in users %} {% for dept in contacts.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center">{{ user.username }}</td> <td class="text-center">
<td class="text-center">{{ user.name }}</td> <input type="checkbox" name="selected" value="{{ dept.id }}">
<td class="text-center">{{ user.id|get_role }}</td> </td>
</tr> <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 %} {% endfor %}
</tbody> </tbody>
</tbody>
</table> </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>
</div> </div>
</body> </div>
</html> </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 %}

View File

@ -65,13 +65,19 @@
<input type="checkbox" name="selected" value="{{ dept.id }}"> <input type="checkbox" name="selected" value="{{ dept.id }}">
</td> </td>
<td class="text-center"> {{ dept.name }} </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"> <a href="/juser/group_list/?did={{ dept.id }}">{{ dept.id | dept_group_num }}</a> </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.id | dept_asset_num}} </td>
<td class="text-center"> {{ dept.comment }} </td> <td class="text-center"> {{ dept.comment }} </td>
<td class="text-center"> <td class="text-center">
<a href="../dept_edit/?id={{ dept.id }}" class="btn btn-xs btn-info">缂栬緫</a> {# <a href="../dept_detail/?id={{ dept.id }}" class="btn btn-xs btn-primary">璇︽儏</a>#}
<a href="../dept_del/?id={{ dept.id }}" class="btn btn-xs btn-danger">鍒犻櫎</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> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -65,10 +65,9 @@
</td> </td>
<td class="text-center"> {{ group.name }} </td> <td class="text-center"> {{ group.name }} </td>
<td class="text-center"> {{ group.dept.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"> {{ group.comment }} </td>
<td class="text-center"> <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_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> <a href="../group_del/?id={{ group.id }}" class="btn btn-xs btn-danger">鍒犻櫎</a>
</td> </td>

View File

@ -15,9 +15,9 @@
<li id="juser"> <li id="juser">
<a href="#"><i class="fa fa-rebel"></i> <span class="nav-label">鐢ㄦ埛绠$悊</span><span class="fa arrow"></span></a> <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"> <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="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="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_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> <li class="user_add"><a href="/juser/user_add/">娣诲姞鐢ㄦ埛</a></li>
@ -37,15 +37,15 @@
<li id="jperm"> <li id="jperm">
<a href="#"><i class="fa fa-edit"></i> <span class="nav-label">鎺堟潈绠$悊</span><span class="fa arrow"></span></a> <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"> <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> <a href="/jperm/dept_perm_list/">閮ㄩ棬鎺堟潈</a>
</li> </li>
<li id="perm_list"> <li class="perm_list perm_edit">
<a href="/jperm/perm_list/">灏忕粍鎺堟潈</a> <a href="/jperm/perm_list/">灏忕粍鎺堟潈</a>
</li> </li>
<li id="sudo_add"> <li class="sudo_list sudo_edit sudo_add cmd_list cmd_edit">
<a href="/jperm/sudo_list/">Sudo鎺堟潈</a> <a href="/jperm/sudo_list/">Sudo鎺堟潈</a>
</li> </li>
</ul> </ul>
@ -90,10 +90,11 @@
<li id="juser"> <li id="juser">
<a href="#"><i class="fa fa-rebel"></i> <span class="nav-label">鐢ㄦ埛绠$悊</span><span class="fa arrow"></span></a> <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"> <ul class="nav nav-second-level">
<li id="group_list"><a href="/juser/group_list/">鏌ョ湅灏忕粍</a></li> <li class="dept_list dept_edit"><a href="/juser/dept_list/">鏌ョ湅閮ㄩ棬</a></li>
<li id="group_add"><a href="/juser/group_add/">娣诲姞灏忕粍</a></li> <li class="group_list"><a href="/juser/group_list/">鏌ョ湅灏忕粍</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 class="group_add"><a href="/juser/group_add/">娣诲姞灏忕粍</a></li>
<li id="user_add"><a href="/juser/user_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> </ul>
</li> </li>
<li id="jasset"> <li id="jasset">

View File

@ -49,7 +49,7 @@
{% else %} {% else %}
{% if contacts.has_previous %} {% if contacts.has_previous %}
<li class="paginate_button previous" aria-controls="editable" tabindex="0" > <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> </li>
{% else %} {% else %}
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" > <li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" >
@ -57,25 +57,25 @@
</li> </li>
{% endif %} {% endif %}
{% ifequal show_first 1 %} {% 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 %} {% endifequal %}
{% for page in page_range %} {% for page in page_range %}
{% ifequal current_page page %} {% 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 %} {% 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 %} {% endifequal %}
{% endfor %} {% endfor %}
{% ifequal show_end 1 %} {% 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 %} {% endifequal %}
{% if contacts.has_next %} {% if contacts.has_next %}
<li class="paginate_button next" aria-controls="editable" tabindex="0" > <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> </li>
{% else %} {% else %}
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" > <li class="paginate_button next disabled" aria-controls="editable" tabindex="0" >
<a href="#">Next</a> <a class="test" href="#">Next</a>
</li> </li>
{% endif %} {% endif %}
{% endif %} {% endif %}