鉴权开始

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_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/')

View File

@ -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

View File

@ -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):

View File

@ -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):

View File

@ -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'),

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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>

View File

@ -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">

View File

@ -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 %}