From 1ea63bf3d02a8424fab0fe6c6bd133c42282cfda Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 14:36:58 +0800 Subject: [PATCH 01/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=88=E6=9D=83web?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jpermission/urls.py | 2 +- jpermission/views.py | 19 ++++- jumpserver/templatetags/mytags.py | 7 +- templates/jperm/perm_host.html | 111 ++++++++++++++++++++++++++++ templates/jperm/perm_user_list.html | 61 --------------- templates/nav.html | 6 +- 6 files changed, 135 insertions(+), 71 deletions(-) create mode 100644 templates/jperm/perm_host.html delete mode 100644 templates/jperm/perm_user_list.html diff --git a/jpermission/urls.py b/jpermission/urls.py index 39256ca7f..60fe5446c 100644 --- a/jpermission/urls.py +++ b/jpermission/urls.py @@ -6,7 +6,7 @@ urlpatterns = patterns('jpermission.views', # url(r'^$', 'jumpserver.views.home', name='home'), # url(r'^blog/', include('blog.urls')), - (r'^perm_user_list/$', 'perm_user_list'), + (r'^perm_host/$', 'perm_host'), (r'^perm_add/$', 'perm_add'), (r'^perm_user_show/$', 'perm_user_show'), (r'^perm_list/$', 'perm_list'), diff --git a/jpermission/views.py b/jpermission/views.py index 8da55a238..174b1f9a6 100644 --- a/jpermission/views.py +++ b/jpermission/views.py @@ -5,12 +5,23 @@ from django.http import HttpResponseRedirect from juser.models import User from jasset.models import Asset from jpermission.models import Permission +from django.core.paginator import Paginator, EmptyPage, InvalidPage -def perm_user_list(request): - header_title, path1, path2 = u'查看授权用户 | Perm User Detail.', u'授权管理', u'用户详情' - users = User.objects.all() - return render_to_response('jperm/perm_user_list.html', locals(),) +def perm_host(request): + header_title, path1, path2 = u'主机授权 | Perm Host Detail.', u'jperm', u'perm_host' + 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('jperm/perm_host.html', locals(),) def perm_add(request): diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 4c4045254..d33858277 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -45,4 +45,9 @@ def bool2str(value): if value: return u'是' else: - return u'否' \ No newline at end of file + return u'否' + +@register.filter(name='perm_total') +def perm_total(user_id): + user = User.objects.get(int(user_id)) + return user.permission_set.all().count() \ No newline at end of file diff --git a/templates/jperm/perm_host.html b/templates/jperm/perm_host.html new file mode 100644 index 000000000..d2f8753b0 --- /dev/null +++ b/templates/jperm/perm_host.html @@ -0,0 +1,111 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
主机授权 show host perm info.
+ +
+ +
+ + + + + + + + + + + + + + {% for group in contacts.object_list %} + + + + + + + + {% endfor %} + +
用户名姓名属组授权总数操作
{{ user.username }} {{ user.name }} {{ user.username|groups_str }} {{ user.id|perm_count }} + 详情 + 编辑 +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+
+
+
    + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% for page in p.page_range %} + {% ifequal offset1 page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} +
+
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_user_list.html b/templates/jperm/perm_user_list.html deleted file mode 100644 index 20d835726..000000000 --- a/templates/jperm/perm_user_list.html +++ /dev/null @@ -1,61 +0,0 @@ -{% extends 'base.html' %} -{% load mytags %} - -{% block content %} - {% include 'nav_cat_bar.html' %} -
-
-
-
-
-
用户信息 show user info.
- -
-
-
- - - - - - - - - {% for user in users %} - - - - - - {% endfor %} - -
ID添加授权
{{ user.id }}{{ user.username }}添加权限
-
-
- - -
-
-
-
-
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/templates/nav.html b/templates/nav.html index 2eff7a7fd..451e0a097 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -34,10 +34,8 @@
  • 授权管理
  • From 96738976fb5c5a82643671ad55872f08797cfe80 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 14:46:35 +0800 Subject: [PATCH 02/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9jpermistion=20-->=20jpe?= =?UTF-8?q?rm=20=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jasset/views.py | 2 +- {jpermission => jperm}/__init__.py | 0 {jpermission => jperm}/admin.py | 0 {jpermission => jperm}/models.py | 0 {jpermission => jperm}/tests.py | 0 {jpermission => jperm}/urls.py | 4 ++-- {jpermission => jperm}/views.py | 2 +- jumpserver/settings.py | 2 +- jumpserver/urls.py | 2 +- 9 files changed, 6 insertions(+), 6 deletions(-) rename {jpermission => jperm}/__init__.py (100%) rename {jpermission => jperm}/admin.py (100%) rename {jpermission => jperm}/models.py (100%) rename {jpermission => jperm}/tests.py (100%) rename {jpermission => jperm}/urls.py (78%) rename {jpermission => jperm}/views.py (98%) diff --git a/jasset/views.py b/jasset/views.py index 482ed8fad..c04d34281 100644 --- a/jasset/views.py +++ b/jasset/views.py @@ -7,7 +7,7 @@ from django.core.paginator import Paginator, EmptyPage from models import IDC, Asset, BisGroup from juser.models import UserGroup from connect import PyCrypt, KEY -from jpermission.models import Permission +from jperm.models import Permission cryptor = PyCrypt(KEY) diff --git a/jpermission/__init__.py b/jperm/__init__.py similarity index 100% rename from jpermission/__init__.py rename to jperm/__init__.py diff --git a/jpermission/admin.py b/jperm/admin.py similarity index 100% rename from jpermission/admin.py rename to jperm/admin.py diff --git a/jpermission/models.py b/jperm/models.py similarity index 100% rename from jpermission/models.py rename to jperm/models.py diff --git a/jpermission/tests.py b/jperm/tests.py similarity index 100% rename from jpermission/tests.py rename to jperm/tests.py diff --git a/jpermission/urls.py b/jperm/urls.py similarity index 78% rename from jpermission/urls.py rename to jperm/urls.py index 60fe5446c..a82d23305 100644 --- a/jpermission/urls.py +++ b/jperm/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import patterns, include, url -urlpatterns = patterns('jpermission.views', +urlpatterns = patterns('jperm.views', # Examples: # url(r'^$', 'jumpserver.views.home', name='home'), # url(r'^blog/', include('blog.urls')), @@ -9,5 +9,5 @@ urlpatterns = patterns('jpermission.views', (r'^perm_host/$', 'perm_host'), (r'^perm_add/$', 'perm_add'), (r'^perm_user_show/$', 'perm_user_show'), - (r'^perm_list/$', 'perm_list'), + (r'^perm_host/$', 'perm_list'), ) diff --git a/jpermission/views.py b/jperm/views.py similarity index 98% rename from jpermission/views.py rename to jperm/views.py index 174b1f9a6..dc5f071ef 100644 --- a/jpermission/views.py +++ b/jperm/views.py @@ -4,7 +4,7 @@ from django.shortcuts import render_to_response from django.http import HttpResponseRedirect from juser.models import User from jasset.models import Asset -from jpermission.models import Permission +from jperm.models import Permission from django.core.paginator import Paginator, EmptyPage, InvalidPage diff --git a/jumpserver/settings.py b/jumpserver/settings.py index 5b991157f..2a20aab9d 100644 --- a/jumpserver/settings.py +++ b/jumpserver/settings.py @@ -49,7 +49,7 @@ INSTALLED_APPS = ( 'jumpserver', 'juser', 'jasset', - 'jpermission', + 'jperm', 'jlog', ) diff --git a/jumpserver/urls.py b/jumpserver/urls.py index 44bb490c8..13e669b86 100644 --- a/jumpserver/urls.py +++ b/jumpserver/urls.py @@ -9,6 +9,6 @@ urlpatterns = patterns('', (r'^skin_config/$', 'jumpserver.views.skin_config'), (r'^base/$', 'jumpserver.views.base'), (r'^juser/', include('juser.urls')), - (r'^jperm/', include('jpermission.urls')), + (r'^jperm/', include('jperm.urls')), url(r'^jasset/', include('jasset.urls')), ) From df82c17c1c5d9ce2a8b3ecd0c7bf3054a4c1556d Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 14:48:29 +0800 Subject: [PATCH 03/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9nav=20perm=5Fhost?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/nav.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/nav.html b/templates/nav.html index 451e0a097..0148484e9 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -34,8 +34,8 @@
  • 授权管理
  • From aa7e8c0ed49e1547f3ec9f658f31ff1b2d754428 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 14:49:38 +0800 Subject: [PATCH 04/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9tag=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=20perm=5Ftotal=20->=20perm=5Fcount?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index d33858277..3d8b3ee87 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -47,7 +47,7 @@ def bool2str(value): else: return u'否' -@register.filter(name='perm_total') -def perm_total(user_id): +@register.filter(name='perm_count ') +def perm_count(user_id): user = User.objects.get(int(user_id)) return user.permission_set.all().count() \ No newline at end of file From 3f0e8fcc2de33443666ce076255cf43689847a8d Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 14:50:21 +0800 Subject: [PATCH 05/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9tag=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=20perm=5Ftotal=20->=20perm=5Fcount?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 3d8b3ee87..b00016220 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -47,7 +47,7 @@ def bool2str(value): else: return u'否' -@register.filter(name='perm_count ') +@register.filter(name='perm_count') def perm_count(user_id): user = User.objects.get(int(user_id)) return user.permission_set.all().count() \ No newline at end of file From 90f078a0f8dca32a7976268fcdfa474687fa66e9 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 14:53:18 +0800 Subject: [PATCH 06/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 1 + templates/jperm/perm_host.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index b00016220..c603cfa0b 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -47,6 +47,7 @@ def bool2str(value): else: return u'否' + @register.filter(name='perm_count') def perm_count(user_id): user = User.objects.get(int(user_id)) diff --git a/templates/jperm/perm_host.html b/templates/jperm/perm_host.html index d2f8753b0..974c45fea 100644 --- a/templates/jperm/perm_host.html +++ b/templates/jperm/perm_host.html @@ -44,7 +44,7 @@ - {% for group in contacts.object_list %} + {% for user in contacts.object_list %} {{ user.username }} {{ user.name }} From ecbba5ea61ee735d338a261037c75f66bb605609 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 15:02:50 +0800 Subject: [PATCH 07/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9perm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/models.py | 2 +- jperm/views.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jperm/models.py b/jperm/models.py index d942e337a..b462d77ef 100644 --- a/jperm/models.py +++ b/jperm/models.py @@ -3,7 +3,7 @@ from juser.models import User from jasset.models import Asset -class Permission(models.Model): +class Perm(models.Model): USER_ROLE_CHOICES = ( ('SU', 'SuperUser'), ('CU', 'CommonUser'), diff --git a/jperm/views.py b/jperm/views.py index dc5f071ef..369761008 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -4,7 +4,7 @@ from django.shortcuts import render_to_response from django.http import HttpResponseRedirect from juser.models import User from jasset.models import Asset -from jperm.models import Permission +from jperm.models import Perm from django.core.paginator import Paginator, EmptyPage, InvalidPage @@ -33,7 +33,7 @@ def perm_add(request): user = User.objects.get(username=username) permed_hosts = [] - for perm in user.permission_set.all(): + for perm in user.perm_set.all(): permed_hosts.append(perm.asset) hosts_all = Asset.objects.all() @@ -46,7 +46,7 @@ def perm_add(request): user = User.objects.get(username=username) for id in host_ids: asset = Asset.objects.get(id=id) - perm = Permission(user=user, asset=asset) + perm = Perm(user=user, asset=asset) perm.save() msg = u'添加成功' @@ -67,7 +67,7 @@ def perm_list(request): user = User.objects.get(username=username) hosts = [] - for perm in user.permission_set.all(): + for perm in user.perm_set.all(): hosts.append(perm.asset) return render_to_response('jperm/perm_list.html', locals()) From d7d988b067336cd8061f349d59b5cb7ce6d8dc75 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 15:04:02 +0800 Subject: [PATCH 08/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jasset/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jasset/views.py b/jasset/views.py index c04d34281..ea59152ac 100644 --- a/jasset/views.py +++ b/jasset/views.py @@ -7,7 +7,7 @@ from django.core.paginator import Paginator, EmptyPage from models import IDC, Asset, BisGroup from juser.models import UserGroup from connect import PyCrypt, KEY -from jperm.models import Permission +from jperm.models import Perm cryptor = PyCrypt(KEY) From 34b78825d272f46f99c0da17a7497a1c80b34dc6 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 15:05:02 +0800 Subject: [PATCH 09/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9Permssion=20-->=20Perm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index c603cfa0b..46dbbd506 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -51,4 +51,4 @@ def bool2str(value): @register.filter(name='perm_count') def perm_count(user_id): user = User.objects.get(int(user_id)) - return user.permission_set.all().count() \ No newline at end of file + return user.perm_set.all().count() \ No newline at end of file From 8738b517ccc92526da5965f02dd328e86e5db75e Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 15:07:14 +0800 Subject: [PATCH 10/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 46dbbd506..dedb756cc 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -50,5 +50,5 @@ def bool2str(value): @register.filter(name='perm_count') def perm_count(user_id): - user = User.objects.get(int(user_id)) + user = User.objects.get(id=int(user_id)) return user.perm_set.all().count() \ No newline at end of file From de175eb3cd2860df35e0e1cb69a6545fc46e9717 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 16:06:07 +0800 Subject: [PATCH 11/39] =?UTF-8?q?=E6=B7=BB=E5=8A=A0tab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/jperm/perm_host.html | 145 +++++++++++++++++++-------------- 1 file changed, 86 insertions(+), 59 deletions(-) diff --git a/templates/jperm/perm_host.html b/templates/jperm/perm_host.html index 974c45fea..ac753eaee 100644 --- a/templates/jperm/perm_host.html +++ b/templates/jperm/perm_host.html @@ -32,70 +32,97 @@ +
    - - - - - - - - - - - - {% for user in contacts.object_list %} - - - - - - - - {% endfor %} - -
    用户名姓名属组授权总数操作
    {{ user.username }} {{ user.name }} {{ user.username|groups_str }} {{ user.id|perm_count }} - 详情 - 编辑 -
    -
    -
    -
    - Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries -
    -
    -
    -
    -
      - {% if contacts.has_previous %} - - {% else %} - - {% endif %} - {% for page in p.page_range %} - {% ifequal offset1 page %} -
    • {{ page }}
    • - {% else %} -
    • {{ page }}
    • - {% endifequal %} - {% endfor %} - {% if contacts.has_next %} - - {% else %} - - {% endif %} + + +
      + +
      +
      + + + + + + + + + + + + {% for user in contacts.object_list %} + + + + + + + + {% endfor %} + +
      用户名姓名属组授权总数操作
      {{ user.username }} {{ user.name }} {{ user.username|groups_str }} {{ user.id|perm_count }} + 详情 + 编辑 +
      +
      +
      +
      + Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
      +
      +
      +
      +
        + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% for page in p.page_range %} + {% ifequal offset1 page %} +
      • {{ page }}
      • + {% else %} +
      • {{ page }}
      • + {% endifequal %} + {% endfor %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} +
      +
      +
      +
      +
      + +
      + +
      +
      + +
      +
    + + +
    From 3903eedc1af3bc9eec65b1ec256c31c7c8be7164 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 16:27:29 +0800 Subject: [PATCH 12/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B1=9E=E7=BB=84?= =?UTF-8?q?=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/views.py | 8 +++-- templates/jperm/perm_host.html | 63 +++++++++++++++++++++++++++++++--- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/jperm/views.py b/jperm/views.py index 369761008..559b002a1 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -2,7 +2,7 @@ from django.shortcuts import render_to_response from django.http import HttpResponseRedirect -from juser.models import User +from juser.models import User, UserGroup from jasset.models import Asset from jperm.models import Perm from django.core.paginator import Paginator, EmptyPage, InvalidPage @@ -11,7 +11,9 @@ from django.core.paginator import Paginator, EmptyPage, InvalidPage def perm_host(request): header_title, path1, path2 = u'主机授权 | Perm Host Detail.', u'jperm', u'perm_host' users = contact_list = User.objects.all().order_by('id') + groups = contact_list2 = UserGroup.objects.all().order_by('id') p = paginator = Paginator(contact_list, 10) + p2 = paginator2 = Paginator(contact_list2, 10) try: page = int(request.GET.get('page', '1')) except ValueError: @@ -19,9 +21,11 @@ def perm_host(request): try: contacts = paginator.page(page) + contacts2 = paginator2.page(page) except (EmptyPage, InvalidPage): contacts = paginator.page(paginator.num_pages) - return render_to_response('jperm/perm_host.html', locals(),) + contacts2 = paginator2.page(paginator2.num_pages) + return render_to_response('jperm/perm_host.html', locals()) def perm_add(request): diff --git a/templates/jperm/perm_host.html b/templates/jperm/perm_host.html index ac753eaee..7e10c65c6 100644 --- a/templates/jperm/perm_host.html +++ b/templates/jperm/perm_host.html @@ -29,11 +29,7 @@
    -
    -
    + + + + + + + + + + {% for group in contacts2.object_list %} + + + + + + {% endfor %} + +
    组名备注操作
    {{ group.name }} {{ group.comment }} + 详情 + 编辑 +
    +
    +
    +
    + Showing {{ contacts2.start_index }} to {{ contacts2.end_index }} of {{ p2.count }} entries +
    +
    +
    +
    +
      + {% if contacts2.has_previous %} + + {% else %} + + {% endif %} + {% for page in p2.page_range %} + {% ifequal offset1 page %} +
    • {{ page2 }}
    • + {% else %} +
    • {{ page2 }}
    • + {% endifequal %} + {% endfor %} + {% if contacts2.has_next %} + + {% else %} + + {% endif %} +
    +
    +
    +
    From 373e417729816fac0ad32a93987f21492a4deda5 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 16:29:19 +0800 Subject: [PATCH 13/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/jperm/perm_host.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/jperm/perm_host.html b/templates/jperm/perm_host.html index 7e10c65c6..71d003b13 100644 --- a/templates/jperm/perm_host.html +++ b/templates/jperm/perm_host.html @@ -150,9 +150,9 @@ {% endif %} {% for page in p2.page_range %} {% ifequal offset1 page %} -
  • {{ page2 }}
  • +
  • {{ page }}
  • {% else %} -
  • {{ page2 }}
  • +
  • {{ page }}
  • {% endifequal %} {% endfor %} {% if contacts2.has_next %} From 0b79f8e3452349e7ca5c7f51c7be8480fa6dc4eb Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 16:49:47 +0800 Subject: [PATCH 14/39] =?UTF-8?q?=E5=8F=8C=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/views.py | 7 +++ templates/jperm/perm_edit.html | 78 ++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 templates/jperm/perm_edit.html diff --git a/jperm/views.py b/jperm/views.py index 559b002a1..54b08d353 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -28,6 +28,13 @@ def perm_host(request): return render_to_response('jperm/perm_host.html', locals()) +def perm_edit(request): + header_title, path1, path2 = u'授权编辑 | Perm Edit.', u'jperm', u'perm_edit' + if request.method == 'GET': + if request.GET.get('id', None): + pass + + def perm_add(request): header_title, path1, path2 = u'添加授权 | Add User perm.', u'授权管理', u'添加授权' if request.method == 'GET': diff --git a/templates/jperm/perm_edit.html b/templates/jperm/perm_edit.html new file mode 100644 index 000000000..79d151674 --- /dev/null +++ b/templates/jperm/perm_edit.html @@ -0,0 +1,78 @@ +{% extends 'base.html' %} +{% load mytags %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
    +
    +
    +
    +
    +
    编辑授权 {{ user.name }} Edit perm info.
    + +
    +
    +
    + {% if error %} +
    {{ error }}
    + {% endif %} + {% if msg %} +
    {{ msg }}
    + {% endif %} +
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +{% endblock %} \ No newline at end of file From 00ec6c9034982d5f35799674e5d0df63c48e552f Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 16:50:38 +0800 Subject: [PATCH 15/39] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=8F=8C=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jperm/urls.py b/jperm/urls.py index a82d23305..09c3d02cb 100644 --- a/jperm/urls.py +++ b/jperm/urls.py @@ -10,4 +10,5 @@ urlpatterns = patterns('jperm.views', (r'^perm_add/$', 'perm_add'), (r'^perm_user_show/$', 'perm_user_show'), (r'^perm_host/$', 'perm_list'), + (r'^perm_edit/$', 'perm_edit'), ) From 20fb5d669909dbed55662930841f9338fd3fd6bc Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 24 Jan 2015 16:51:39 +0800 Subject: [PATCH 16/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jperm/views.py b/jperm/views.py index 54b08d353..0f87fe4a0 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -32,7 +32,7 @@ def perm_edit(request): header_title, path1, path2 = u'授权编辑 | Perm Edit.', u'jperm', u'perm_edit' if request.method == 'GET': if request.GET.get('id', None): - pass + return render_to_response('jperm/perm_edit.html', locals()) def perm_add(request): From 569e12e83cac9116a76aac9a16508432c99137a1 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 25 Jan 2015 21:46:19 +0800 Subject: [PATCH 17/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/views.py | 3 + static/css/style.css | 3 + templates/jperm/perm_edit.html | 131 ++++++++++++++++++++++++--------- templates/link_css.html | 2 + templates/script.html | 2 + 5 files changed, 108 insertions(+), 33 deletions(-) diff --git a/jperm/views.py b/jperm/views.py index 0f87fe4a0..9902fe08b 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -32,6 +32,9 @@ def perm_edit(request): header_title, path1, path2 = u'授权编辑 | Perm Edit.', u'jperm', u'perm_edit' if request.method == 'GET': if request.GET.get('id', None): + user_id = request.GET.get('id') + user = User.objects.get(id=user_id) + assets = Asset.objects.all() return render_to_response('jperm/perm_edit.html', locals()) diff --git a/static/css/style.css b/static/css/style.css index 8550c5a87..28ced9696 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -2623,6 +2623,9 @@ a:focus { .b-r { border-right: 1px solid #e7eaec; } +.b-l { + border-left: 1px solid #e7eaec; +} .hr-line-dashed { border-top: 1px dashed #e7eaec; color: #ffffff; diff --git a/templates/jperm/perm_edit.html b/templates/jperm/perm_edit.html index 79d151674..90eb35fd1 100644 --- a/templates/jperm/perm_edit.html +++ b/templates/jperm/perm_edit.html @@ -2,13 +2,40 @@ {% load mytags %} {% block content %} + + {% include 'nav_cat_bar.html' %}
    +
    -
    编辑授权 {{ user.name }} Edit perm info.
    +
    Basic form Simple login form example
    +
    -
    - {% if error %} -
    {{ error }}
    - {% endif %} - {% if msg %} -
    {{ msg }}
    - {% endif %} -
    -
    - +
    +
    +
    + +
    -
    -
    - - +
    +
    +
    -
    - -
    -
    - +
    +
    +
    + +
    -
    -
    +
    + +
    +

    未授权主机

    +
    + + +
    +
    + +
    +
    + + +
    +
    + +

    已授权主机

    +
    + +
    +
    +
    +
    +
    - +
    +
    +
    + + {% endblock %} \ No newline at end of file diff --git a/templates/link_css.html b/templates/link_css.html index 057f788be..5849bc727 100644 --- a/templates/link_css.html +++ b/templates/link_css.html @@ -1,6 +1,8 @@ + + diff --git a/templates/script.html b/templates/script.html index f63ee35f1..170330146 100644 --- a/templates/script.html +++ b/templates/script.html @@ -27,6 +27,8 @@ + + From c460323c5b04db9ce6ea879b5fde7634fe303330 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 25 Jan 2015 23:38:58 +0800 Subject: [PATCH 18/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=88=E6=9D=83web?= =?UTF-8?q?=20=E6=98=A0=E5=B0=84=E5=8E=BB=E6=8E=89=20user=5Fcommon=20?= =?UTF-8?q?=E5=92=8C=20password=5Fcommon=20=3D=3D=3D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- connect.py | 21 +++------------ jasset/models.py | 6 ++--- jperm/models.py | 8 ------ jperm/views.py | 20 ++++++++++++++- templates/jperm/perm_edit.html | 47 ++++++++++++++++++++-------------- 5 files changed, 52 insertions(+), 50 deletions(-) diff --git a/connect.py b/connect.py index 3d52e727b..3fed445f2 100755 --- a/connect.py +++ b/connect.py @@ -240,28 +240,13 @@ def get_connect_item(username, ip): if asset.login_type in login_type_dict: password = cryptor.decrypt(login_type_dict[asset.login_type]) - return username, password, ip, port elif asset.login_type == 'M': - perms = asset.permission_set.filter(user=user) - if perms: - perm = perms[0] - else: - raise ServerError('Permission %s to %s does not exist.' % (username, ip)) + username = asset.username + password= cryptor.decrypt(asset.password) + return username, password, ip, port - if perm.role == 'SU': - username_super = asset.username_super - password_super = cryptor.decrypt(asset.password_super) - return username_super, password_super, ip, port - - elif perm.role == 'CU': - username_common = asset.username_common - password_common = asset.password_common - return username_common, password_common, ip, port - - else: - raise ServerError('Perm in %s for %s map role is not in ["SU", "CU"].' % (ip, username)) else: raise ServerError('Login type is not in ["L", "S", "P", "M"]') diff --git a/jasset/models.py b/jasset/models.py index 99f435f96..d7d262185 100644 --- a/jasset/models.py +++ b/jasset/models.py @@ -32,10 +32,8 @@ class Asset(models.Model): user_group = models.ManyToManyField(UserGroup) bis_group = models.ManyToManyField(BisGroup) login_type = models.CharField(max_length=1, choices=LOGIN_TYPE_CHOICES, default='L') - username_common = models.CharField(max_length=20, blank=True, null=True) - password_common = models.CharField(max_length=80, blank=True, null=True) - username_super = models.CharField(max_length=20, blank=True, null=True) - password_super = models.CharField(max_length=80, blank=True, null=True) + username = models.CharField(max_length=20, blank=True, null=True) + password = models.CharField(max_length=80, blank=True, null=True) date_added = models.DateTimeField(auto_now=True, default=datetime.datetime.now(), null=True) is_active = models.BooleanField(default=True) comment = models.CharField(max_length=100, blank=True, null=True) diff --git a/jperm/models.py b/jperm/models.py index b462d77ef..27d57c12c 100644 --- a/jperm/models.py +++ b/jperm/models.py @@ -4,16 +4,8 @@ from jasset.models import Asset class Perm(models.Model): - USER_ROLE_CHOICES = ( - ('SU', 'SuperUser'), - ('CU', 'CommonUser'), - ) user = models.ForeignKey(User) asset = models.ForeignKey(Asset) - role = models.CharField(choices=USER_ROLE_CHOICES, - max_length=2, - blank=True, - null=True) def __unicode__(self): return '%s_%s' % (self.user.username, self.asset.ip) \ No newline at end of file diff --git a/jperm/views.py b/jperm/views.py index 9902fe08b..ff9a2abc5 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -1,7 +1,7 @@ # coding: utf-8 from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect +from django.http import HttpResponseRedirect, HttpResponse from juser.models import User, UserGroup from jasset.models import Asset from jperm.models import Perm @@ -28,6 +28,13 @@ def perm_host(request): return render_to_response('jperm/perm_host.html', locals()) +def perm_user_host(username, ip): + user = User.objects.get(username=username) + asset = Asset.objects.get(ip=ip) + if not Perm.objects.filter(user=user, asset=asset): + Perm.objects.create(user=user, asset=asset) + + def perm_edit(request): header_title, path1, path2 = u'授权编辑 | Perm Edit.', u'jperm', u'perm_edit' if request.method == 'GET': @@ -35,7 +42,18 @@ def perm_edit(request): user_id = request.GET.get('id') user = User.objects.get(id=user_id) assets = Asset.objects.all() + assets_permed = [] + for perm in user.perm_set.all(): + assets_permed.append(perm.asset) + assets_unperm = list(set(assets)-set(assets_permed)) return render_to_response('jperm/perm_edit.html', locals()) + else: + host_ips = request.POST.getlist('host_permed', '') + username = request.POST.get('username') + for ip in host_ips: + perm_user_host(username, ip) + + return HttpResponseRedirect('/jperm/perm_host/') def perm_add(request): diff --git a/templates/jperm/perm_edit.html b/templates/jperm/perm_edit.html index 90eb35fd1..9491d5b1a 100644 --- a/templates/jperm/perm_edit.html +++ b/templates/jperm/perm_edit.html @@ -21,8 +21,13 @@ function search_host(text){ $("#host_unperm").children().each(function(){$(this).remove();}); $("#host_all").children().each(function(){ - if ($(this).text().search(text) != -1) { - $("#host_unperm").append($(this).clone()) + if ($(this).text().search(text) != -1){ +{# $("#host_permed").children().each(function(){#} +{# if ($(this).text().search(text) == -1){#} +{# $("#host_unperm").append($(this).clone())#} +{# }#} +{# });#} + $("#host_unperm").append($(this).clone()) } }); } @@ -35,7 +40,7 @@
    -
    Basic form Simple login form example
    +
    授权编辑表单 Edit perm of user
    @@ -60,7 +65,7 @@
    - +
    @@ -71,12 +76,13 @@
    - +
    +

    未授权主机

    @@ -86,7 +92,7 @@ {% endfor %} @@ -100,9 +106,12 @@
    -

    已授权主机

    +

    授权主机

    @@ -111,7 +120,7 @@
    - +
    @@ -128,16 +137,16 @@ $("#"+str).addClass('active'); $("#"+str1).addClass('active'); - +{# #} {% endblock %} \ No newline at end of file From ca3d4de819b7fb5f72d01b7be8a37a51986f5548 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Mon, 26 Jan 2015 11:51:12 +0800 Subject: [PATCH 19/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9js=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/jperm/perm_edit.html | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/templates/jperm/perm_edit.html b/templates/jperm/perm_edit.html index 9491d5b1a..1ce00ec94 100644 --- a/templates/jperm/perm_edit.html +++ b/templates/jperm/perm_edit.html @@ -20,14 +20,13 @@ function search_host(text){ $("#host_unperm").children().each(function(){$(this).remove();}); + var permArray = []; + $("#host_permed").children().each(function(){ + permArray.push($(this).text()); + }); $("#host_all").children().each(function(){ - if ($(this).text().search(text) != -1){ -{# $("#host_permed").children().each(function(){#} -{# if ($(this).text().search(text) == -1){#} -{# $("#host_unperm").append($(this).clone())#} -{# }#} -{# });#} - $("#host_unperm").append($(this).clone()) + if ($(this).text().search(text) != -1 && permArray.indexOf($(this).text()) == -1) { + $("#host_unperm").append($(this).clone()) } }); } From c4196e7d5afbea990ffcdf150d2ebba877dc11de Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 27 Jan 2015 00:14:50 +0800 Subject: [PATCH 20/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BB=84=E6=96=B9?= =?UTF-8?q?=E9=9D=A2=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/models.py | 18 +- jperm/urls.py | 5 +- jperm/views.py | 36 +- static/css/plugins/iCheck/custom.css | 319 ++++++++++++++---- static/js/plugins/iCheck/icheck.min.js | 18 +- templates/css_js.html | 33 -- templates/jperm/perm_group_edit.html | 151 +++++++++ templates/jperm/perm_host.html | 8 +- templates/jperm/perm_user_detail.html | 47 +++ .../{perm_edit.html => perm_user_edit.html} | 0 templates/juser/user_add.html | 60 +++- templates/juser/user_list.html | 10 +- templates/juser/user_list1.html | 130 +++++++ templates/link_css.html | 4 +- templates/script.html | 42 ++- 15 files changed, 742 insertions(+), 139 deletions(-) delete mode 100644 templates/css_js.html create mode 100644 templates/jperm/perm_group_edit.html create mode 100644 templates/jperm/perm_user_detail.html rename templates/jperm/{perm_edit.html => perm_user_edit.html} (100%) create mode 100644 templates/juser/user_list1.html diff --git a/jperm/models.py b/jperm/models.py index 27d57c12c..9aa31c2a0 100644 --- a/jperm/models.py +++ b/jperm/models.py @@ -1,11 +1,21 @@ from django.db import models -from juser.models import User -from jasset.models import Asset +from juser.models import User, UserGroup +from jasset.models import Asset, BisGroup -class Perm(models.Model): +class PermUser(models.Model): user = models.ForeignKey(User) asset = models.ForeignKey(Asset) + asset_group = models.ForeignKey(BisGroup) def __unicode__(self): - return '%s_%s' % (self.user.username, self.asset.ip) \ No newline at end of file + return '%s_%s' % (self.user.username, self.asset.ip) + + +class PermUserGroup(models.Model): + group = models.ForeignKey(UserGroup) + asset = models.ForeignKey(Asset) + asset_group = models.ForeignKey(BisGroup) + + def __unicode__(self): + return '%s_%s' % (self.group.name, self.asset.ip) \ No newline at end of file diff --git a/jperm/urls.py b/jperm/urls.py index 09c3d02cb..380a92a86 100644 --- a/jperm/urls.py +++ b/jperm/urls.py @@ -10,5 +10,8 @@ urlpatterns = patterns('jperm.views', (r'^perm_add/$', 'perm_add'), (r'^perm_user_show/$', 'perm_user_show'), (r'^perm_host/$', 'perm_list'), - (r'^perm_edit/$', 'perm_edit'), + (r'^perm_user_edit/$', 'perm_user_edit'), + (r'^perm_user_detail/$', 'perm_user_detail'), + (r'^perm_group_edit/$', 'perm_group_edit'), + (r'^perm_group_detail/$', 'perm_group_detail'), ) diff --git a/jperm/views.py b/jperm/views.py index ff9a2abc5..8a6a843f6 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -28,14 +28,15 @@ def perm_host(request): return render_to_response('jperm/perm_host.html', locals()) -def perm_user_host(username, ip): +def perm_user_host(username, ips): user = User.objects.get(username=username) - asset = Asset.objects.get(ip=ip) - if not Perm.objects.filter(user=user, asset=asset): + user.perm_set.all().delete() + for ip in ips: + asset = Asset.objects.get(ip=ip) Perm.objects.create(user=user, asset=asset) -def perm_edit(request): +def perm_user_edit(request): header_title, path1, path2 = u'授权编辑 | Perm Edit.', u'jperm', u'perm_edit' if request.method == 'GET': if request.GET.get('id', None): @@ -46,16 +47,33 @@ def perm_edit(request): for perm in user.perm_set.all(): assets_permed.append(perm.asset) assets_unperm = list(set(assets)-set(assets_permed)) - return render_to_response('jperm/perm_edit.html', locals()) + return render_to_response('jperm/perm_user_edit.html', locals()) else: host_ips = request.POST.getlist('host_permed', '') username = request.POST.get('username') - for ip in host_ips: - perm_user_host(username, ip) + perm_user_host(username, host_ips) return HttpResponseRedirect('/jperm/perm_host/') +def perm_user_detail(request): + user_id = request.GET.get('id', '') + user = User.objects.get(id=user_id) + host_permed = [] + for perm in user.perm_set.all(): + host_permed.append(perm.asset) + + return render_to_response('jperm/perm_user_detail.html', locals()) + + +def perm_group_edit(request): + if request.method == 'GET': + group_id = request.GET.get('id', '') + group = UserGroup.objects.get(id=group_id) + + return render_to_response('jperm/perm_group_edit.html') + + def perm_add(request): header_title, path1, path2 = u'添加授权 | Add User perm.', u'授权管理', u'添加授权' if request.method == 'GET': @@ -76,8 +94,8 @@ def perm_add(request): host_ids = request.POST.getlist('host_ids', None) user = User.objects.get(username=username) - for id in host_ids: - asset = Asset.objects.get(id=id) + for host_id in host_ids: + asset = Asset.objects.get(id=host_id) perm = Perm(user=user, asset=asset) perm.save() msg = u'添加成功' diff --git a/static/css/plugins/iCheck/custom.css b/static/css/plugins/iCheck/custom.css index bddfe9b3c..77437305a 100644 --- a/static/css/plugins/iCheck/custom.css +++ b/static/css/plugins/iCheck/custom.css @@ -1,59 +1,260 @@ -/* iCheck plugin Square skin, green ------------------------------------ */ -.icheckbox_square-green, -.iradio_square-green { - display: inline-block; - *display: inline; - vertical-align: middle; - margin: 0; - padding: 0; - width: 22px; - height: 22px; - background: url(green.png) no-repeat; - border: none; - cursor: pointer; -} - -.icheckbox_square-green { - background-position: 0 0; -} -.icheckbox_square-green.hover { - background-position: -24px 0; -} -.icheckbox_square-green.checked { - background-position: -48px 0; -} -.icheckbox_square-green.disabled { - background-position: -72px 0; - cursor: default; -} -.icheckbox_square-green.checked.disabled { - background-position: -96px 0; -} - -.iradio_square-green { - background-position: -120px 0; -} -.iradio_square-green.hover { - background-position: -144px 0; -} -.iradio_square-green.checked { - background-position: -168px 0; -} -.iradio_square-green.disabled { - background-position: -192px 0; - cursor: default; -} -.iradio_square-green.checked.disabled { - background-position: -216px 0; -} - -/* HiDPI support */ -@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { - .icheckbox_square-green, - .iradio_square-green { - background-image: url(green@2x.png); - -webkit-background-size: 240px 24px; - background-size: 240px 24px; - } -} \ No newline at end of file +@import url("normalize.css"); +@font-face{font-family:'MontserratRegular';src:url("./montserrat-regular.eot");src:url("./montserrat-regular.eot?#iefix") format('embedded-opentype'),url("./montserrat-regular.woff") format('woff'),url("./montserrat-regular.ttf") format('truetype'),url("./montserrat-regular.svg#MontserratRegular") format('svg');font-style:normal;font-weight:normal} +@font-face{font-family:'MontserratBold';src:url("./montserrat-bold.eot");src:url("./montserrat-bold.eot?#iefix") format('embedded-opentype'),url("./montserrat-bold.woff") format('woff'),url("./montserrat-bold.ttf") format('truetype'),url("./montserrat-bold.svg#MontserratBold") format('svg');font-style:normal;font-weight:bold} +html,body{height:100%} +body{font:14px/20px 'MontserratRegular',Helvetica,Arial,sans-serif;color:#222;background:#ebe7df url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAFZCAIAAAA96mnzAAACKklEQVR4Xn2VUW7kMAxD+QLf/1x7gv71LNwdKTLhZFtggMCwSVEUPdb3159/v0uSrM8HtGRZuoQk1R69J12o9ixJWvSnVyfLdbNw0XAXWe1fIL8BoqmNGiV/cHc9Gq4NXxLKHhteRyLpA28cl0SLdx0BckSWL4gkPlIVTg1nN9Ys3iyWI5AGDA5xOXB5BJaWmOw6KSLeU6+0P50QshQyEL2im/YMIL60dTSZ3RXenlkiJpMj8XPMAl1FtjMRW19NxzOE5VGWPVGrc7aSJgz1Y9ku57mpYSwn1h0ivFOXxoCKMCXiahbbZNIZR+tkphllPsomipCwb4GMkXTmPfVg40Jt2y4RQM/PqX5JTM4iiTN8Zz1XvbIAEEvoEW+3nxTLL3lB7t7J3WwyI7g5OVxKIeFEH4FIGLC9I+XqvSd4AxJM5O6WTPr54RAxLG44FVrEuz+kFdXyLiuX6kLPVLZL2ISlcHNlBIKm5rR8nEi9wJeA6Y8JZlJOyDiin0K5ag+AXHtALBicXasjIUu9h0STBbCMU+89gMnu/J05MU1QWqdbPMRPIZIzDgsi8Olg5t7wHhUg/pv5RUzO+BHDmczHkAfZWxlSYgNI5Ig5XRoc66dW9L45eHDkbkqCO7RLG5cna/HD7YhZnfINkFo8iNyj5kx6pFrxNGRlfhV2e1Zt5DnGU8T7Tud1ivi8jU8/3Zy88pkn6+zdXiJ7AVSFBZA3VcwDfXtt5UUHS38B35hQVuJip4MAAAAASUVORK5CYII=") repeat-x;*background-image:url("ie/header-line.png")} +a{color:#222;text-decoration:none;border-bottom:1px solid #bbb;} +a:hover{color:#000} +a,.self{-webkit-transition:color .1s;-moz-transition:color .1s;-ms-transition:color .1s;-o-transition:color .1s;transition:color .1s} +.self{color:#333;border-bottom:1px dotted #aaa;cursor:pointer;} +.self:hover{color:#000} +strong{font-family:'MontserratBold',Helvetica,Arial,sans-serif;font-weight:700} +p{margin:0 0 8px} +label{cursor:pointer} +h1,h2,h3,h4{margin:0;font:bold 20px/60px 'MontserratBold',Helvetica,Arial,sans-serif} +h2{height:60px;text-align:center;text-transform:uppercase} +h4{font-size:18px;line-height:24px} +ul{margin:0;padding:0;list-style:none} +table{width:100%;margin-bottom:21px} +th,td{padding:11px 20px 12px;vertical-align:top;font-weight:normal;text-align:left;border-bottom:2px solid #e7e5e0;} +thead th,thead td{background:#f3f2ef} +th{white-space:nowrap} +td{width:100%} +.focus{outline:1px dotted rgba(0,0,0,0.5) !important} +.clear{position:relative;*zoom:1;} +.clear:before,.clear:after{content:'';display:table;clear:both} +.layout{width:930px;margin:0 auto;padding:0 15px} +.header{padding:115px 0 73px;color:#fff;text-align:center;} +.header h1,.header strong{letter-spacing:-1px;text-transform:uppercase} +.header h1{padding-bottom:23px;font-size:22px;line-height:28px} +.header h3{position:relative;padding:35px 0 17px;font-size:120px;line-height:140px;letter-spacing:-5px;} +.header h3 span{font-size:30px;line-height:40px;letter-spacing:0;margin-left:-10px;vertical-align:baseline;} +.header h3:before{content:'';display:inline-block;width:72px;height:64px;margin-right:32px;vertical-align:middle;background:url("icheck.png")} +.header h3:after{content:'';position:absolute;top:0;left:50%;width:100px;margin-left:-50px;border-top:3px solid #fff} +.header strong{font:24px/30px 'MontserratRegular',Helvetica,Arial,sans-serif;} +.header strong a{color:#fff;border-bottom-color:#fff} +.features{position:relative;font-size:16px;color:#555;background:#fff;} +.features .self{color:#555;border-bottom-color:#bbb;} +.features .self:hover{color:#222} +.features .arrows{top:0} +.features:hover .arrows .bottom{left:0} +.features h2{color:#fff;background:#2489c5} +.features ul{padding:44px 60px 36px} +.features li{padding:0 0 9px 36px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABI0lEQVR4XpXSP0vDUBjF4ZtLkIr4EYzduogdXJTWWV2FLMVNoQrdAhlUUFAEcejo1q13svgFBAUdxA/g30kcdQoIIlL9DWcKuZEeeOCl99w3gTSI49h4MoFb/KCJz6KShS/rOh/TbEZZECLBiSQIR1nQQgAnAVr/LZjEnIq76OJbutjRGR26isUB3pDhBikucWoUzVdI1cl05zBk2MI5jvCKIfL5QluzxTS20bY6WENdl0ujTl13Ni3DABtwWEFp1HG6M7Aq9NHBGRbgy7w6HfTzX6GHCyyXPV2dnu9/MIUX+PIMOkRsbq7hHkZmxciDOrZoQRUVPCGCw504RDobR7VoQQ0f2Mejls1IRb/t4R10CcLc6/2igSVcw8gqFnEMOnSVPxQqQaPw2y7fAAAAAElFTkSuQmCC") 0 1px no-repeat;*background-image:url("ie/icon-star.png");} +.features li.offset{margin-top:20px} +.mark{padding:0 2px;color:#777;background:#e7e5e0;} +.skin-polaris .mark{background:#232830} +.skin-futurico .mark{background:#25262a} +.social{height:60px;margin-bottom:60px;padding:0 60px;font-size:16px;color:#555;background:#f5f3ef;} +.social a{color:#777;border-bottom-color:#ccc;} +.social a:hover{color:#444} +.social .left{float:left;padding-top:19px;} +.social .left li{float:left;padding-right:30px;} +.social .left li a{position:relative} +.social .right{float:right;padding-top:20px;} +.social .right li{float:right;padding-left:10px} +.social .right.local{padding-top:19px;} +.social .right.local li{padding-left:30px;font-size:14px} +.demo-holder{margin-bottom:97px} +.demo-title{padding-bottom:36px;font-size:26px;letter-spacing:-1px} +.demo{position:relative;} +.demo:hover .arrows .top,.demo:hover .arrows .bottom{left:0} +.demo-list{position:relative;margin-right:360px;padding:33px 57px 17px;color:#555;background:#fff;border:3px solid #ddd8ce;} +.demo-list ul{float:right;white-space:nowrap;} +.demo-list ul:first-child{float:left} +.demo-list ul li{position:relative;padding:0 0 18px 42px} +.demo-list ul input{position:absolute;top:4px;left:0} +.demo-list ul .icheckbox_square-blue,.demo-list ul .iradio_square-blue{position:absolute;top:-1px;left:0} +.demo-list ul span{color:#bbb} +.demo-methods{padding:21px 360px 0 0;} +.demo-methods .mark{background:#d3cfc6} +.demo-methods dt{position:relative;padding:17px 150px 18px 0;font:16px/24px 'MontserratRegular',Helvetica,Arial,sans-serif;color:#444;border-bottom:3px solid #ddd8ce;} +.demo-methods dt .self{cursor:pointer;} +.demo-methods dt .self:hover{color:#222} +.demo-methods dt .code{position:absolute;right:0;bottom:18px;color:#777;} +.demo-methods dt .code .self:hover{color:#444} +.demo-methods dd{position:relative;display:none;margin:0;background:#fff;border:3px solid #ddd8ce;border-top:none;} +.demo-methods dd:before{content:'';position:absolute;top:-13px;left:0;width:0;height:0;border:5px solid transparent;border-bottom-color:#ddd8ce;border-left-color:#ddd8ce} +.demo-methods dd .markup{margin:0;color:#888;background:#f5f3ef;border:none;} +.demo-methods dd .markup .comment{color:#aaa} +.demo-callbacks{position:absolute;top:0;right:0;bottom:0;width:300px;color:#aaa;background:#232323;border:3px solid #ddd8ce;} +.demo-callbacks h2{color:#fff;background:#6a5a8c} +.demo-callbacks ul{position:absolute;top:60px;width:100%;bottom:0;overflow:auto;} +.demo-callbacks ul::-webkit-scrollbar{width:10px;background:none;} +.demo-callbacks ul::-webkit-scrollbar-track{background:none;border:none;} +.demo-callbacks ul::-webkit-scrollbar-track-piece:disabled{display:none !important;} +.demo-callbacks ul::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25);border:none;} +.demo-callbacks ul::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.3);} +.demo-callbacks ul li{margin-top:-1px;padding:13px 20px 15px;border-top:1px solid #2e2e2e;} +.demo-callbacks ul li span{color:#888} +.skins{position:relative;*zoom:1;} +.skins h2{position:absolute;top:-38px;right:0;left:0;font-size:24px;text-align:center} +.arrows{position:absolute;top:3px;left:-60px;width:60px;overflow:hidden;} +.arrows .top,.arrows .bottom{position:relative;left:60px;width:60px;height:60px;cursor:pointer;-webkit-transition:left .3s,background-color .2s;-moz-transition:left .3s,background-color .2s;-ms-transition:left .3s,background-color .2s;-o-transition:left .3s,background-color .2s;transition:left .3s,background-color .2s} +.arrows .top{background:#83b3be url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAdklEQVR4Xo3MuwmFQBiE0b0FmAuutnRBsAARLMTYRzvWItiEYLq/s6CYyMwGXzTDcWbG8mhEf/ZjQIV2ZCigjiASMAVJIAVKAQ4FKWBDJVoYpAB/7z8GRaAQgBNQG8dZA28f0BmHBgUCKGh9hhpNKH8BWY8GlF2OH3hCC1zmdAAAAABJRU5ErkJggg==") 50% no-repeat;*background-image:url("ie/arrow-top.png");} +.arrows .top:hover{background-color:#6ba4b1} +.arrows .bottom{background:#e2b78d url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAf0lEQVR4Xo3MzQmEQBCE0TGAvQuOpiQIBiCCgXj2J52NRTAJwev0Vh+WOgjlNHyHguYFM/M6tKLSd2YTmtHHR48S8jtQzAB2430d2bgJvQLsdqRCZwZUPAFLaPjrjYAUMKLgwBtUK4CIhi4BEFGQBohISANEJKQBIqqIFtSqvx/0bXhCCUrgiAAAAABJRU5ErkJggg==") 50% no-repeat;*background-image:url("ie/arrow-bottom.png");} +.arrows .bottom:hover{background-color:#dba571} +@media screen and (max-width:1049px){.arrows,.fork-me{display:none} +}.skin{position:relative;margin-bottom:40px;} +.skin:hover .arrows .top,.skin:hover .arrows .bottom{left:0} +.skin h3{position:relative;z-index:20;float:left;height:60px;padding:0 57px;line-height:58px;background:#fff;border:3px solid #ddd8ce;border-bottom:none;} +.skin h3:before{content:'';position:absolute;top:100%;left:0;width:100%;height:2px;margin-top:-1px;background:#fff} +.skin.skin-polaris h3{color:#cacdd1;background:#2c323c;} +.skin.skin-polaris h3:before{background:#2c323c} +.skin.skin-futurico h3{color:#c3c3c3;background:#2e3035;} +.skin.skin-futurico h3:before{background:#2e3035} +.skin dl{z-index:10;width:100%;margin:0} +.skin dt{position:relative;top:-53px;right:-3px;float:right;height:47px;margin-right:-3px;padding:0 57px;line-height:47px;border:3px solid #ddd8ce;cursor:pointer;} +.skin dt:hover{background:#f0ede7;border-bottom:3px solid #ddd8ce} +.skin dt.selected{height:50px;background:#fff;border-bottom:none;cursor:default;} +.skin dt.selected:before{content:'';position:absolute;top:100%;left:0;width:100%;height:2px;margin-top:-1px;background:#fff} +.skin.skin-polaris dt{color:#cacdd1;background:#647083;} +.skin.skin-polaris dt:hover{background:#4a5361} +.skin.skin-polaris dt.selected{background:#2c323c;} +.skin.skin-polaris dt.selected:before{background:#2c323c} +.skin.skin-futurico dt{color:#c3c3c3;background:#676c77;} +.skin.skin-futurico dt:hover{background:#4b4e56} +.skin.skin-futurico dt.selected{background:#2e3035;} +.skin.skin-futurico dt.selected:before{background:#2e3035} +.skin dd{position:relative;display:none;float:left;width:100%;margin:-3px -100% 0 0;overflow:hidden;color:#444;background:#fff;border:3px solid #ddd8ce;} +.skin dd.selected{display:block} +.skin dd a{color:#444;} +.skin dd a:hover{color:#111} +.skin.skin-polaris dd{color:#7a828b;background:#2c323c;} +.skin.skin-polaris dd a{color:#7a828b;border-bottom-color:#4e596b;} +.skin.skin-polaris dd a:hover{color:#a2a7ae} +.skin.skin-futurico dd{color:#888;background:#2e3035;} +.skin.skin-futurico dd a{color:#888;border-bottom-color:#545861;} +.skin.skin-futurico dd a:hover{color:#aaa} +.skin-section{float:left;padding:42px 0 31px 57px;line-height:18px;} +.skin-section h4{padding-bottom:18px;} +.skin-polaris .skin-section h4{color:#959ba2} +.skin-futurico .skin-section h4{color:#a0a0a0} +.skin-section .list{float:left;padding-right:60px;} +.skin-section .list li{position:relative;padding-bottom:15px} +.skin-minimal .skin-section .list li{padding-left:38px} +.skin-square .skin-section .list li{padding-left:42px} +.skin-flat .skin-section .list li,.skin-line .skin-section label{padding-left:40px} +.skin-line .skin-section h4{padding-bottom:24px} +.skin-line .skin-section .list{padding-right:40px;} +.skin-line .skin-section .list li{padding-bottom:10px} +.skin-polaris .skin-section .list li{padding-left:37px} +.skin-futurico .skin-section .list li{padding-left:36px} +.icheckbox_minimal,.icheckbox_minimal-red,.icheckbox_minimal-green,.icheckbox_minimal-blue,.icheckbox_minimal-aero,.icheckbox_minimal-grey,.icheckbox_minimal-orange,.icheckbox_minimal-yellow,.icheckbox_minimal-pink,.icheckbox_minimal-purple,.iradio_minimal,.iradio_minimal-red,.iradio_minimal-green,.iradio_minimal-blue,.iradio_minimal-aero,.iradio_minimal-grey,.iradio_minimal-orange,.iradio_minimal-yellow,.iradio_minimal-pink,.iradio_minimal-purple{position:absolute;top:1px;left:0} +.skin input[type=checkbox],.skin input[type=radio]{position:absolute;top:2px;left:0} +.icheckbox_square,.icheckbox_square-red,.icheckbox_square-green,.icheckbox_square-blue,.icheckbox_square-aero,.icheckbox_square-grey,.icheckbox_square-orange,.icheckbox_square-yellow,.icheckbox_square-pink,.icheckbox_square-purple,.iradio_square,.iradio_square-red,.iradio_square-green,.iradio_square-blue,.iradio_square-aero,.iradio_square-grey,.iradio_square-orange,.iradio_square-yellow,.iradio_square-pink,.iradio_square-purple{position:absolute;top:-1px;left:0} +.icheckbox_flat,.icheckbox_flat-red,.icheckbox_flat-green,.icheckbox_flat-blue,.icheckbox_flat-aero,.icheckbox_flat-grey,.icheckbox_flat-orange,.icheckbox_flat-yellow,.icheckbox_flat-pink,.icheckbox_flat-purple,.iradio_flat,.iradio_flat-red,.iradio_flat-green,.iradio_flat-blue,.iradio_flat-aero,.iradio_flat-grey,.iradio_flat-orange,.iradio_flat-yellow,.iradio_flat-pink,.iradio_flat-purple{position:absolute;top:0;left:0} +.icheckbox_polaris,.iradio_polaris{position:absolute;top:-4px;left:-6px} +.icheckbox_futurico,.iradio_futurico{position:absolute;top:2px;left:0} +.skin-states{float:right;padding-right:57px;padding-left:0;} +.skin-states .state{cursor:default !important} +.skin-states .list{padding-right:0} +.skin-minimal .skin-states .list li{padding-left:71px} +.skin-square .skin-states .list li{padding-left:79px} +.skin-flat .skin-states .list li{padding-left:75px} +.skin-line .skin-states .list{padding-right:0} +.skin-polaris .skin-states .list li{padding-left:69px} +.skin-futurico .skin-states .list li{padding-left:67px} +.skin-states .iradio_minimal,.skin-states .iradio_minimal-red,.skin-states .iradio_minimal-green,.skin-states .iradio_minimal-blue,.skin-states .iradio_minimal-aero,.skin-states .iradio_minimal-grey,.skin-states .iradio_minimal-orange,.skin-states .iradio_minimal-yellow,.skin-states .iradio_minimal-pink,.skin-states .iradio_minimal-purple{left:33px} +.skin-states .iradio_square,.skin-states .iradio_square-red,.skin-states .iradio_square-green,.skin-states .iradio_square-blue,.skin-states .iradio_square-aero,.skin-states .iradio_square-grey,.skin-states .iradio_square-orange,.skin-states .iradio_square-yellow,.skin-states .iradio_square-pink,.skin-states .iradio_square-purple{left:37px} +.skin-states .iradio_flat,.skin-states .iradio_flat-red,.skin-states .iradio_flat-green,.skin-states .iradio_flat-blue,.skin-states .iradio_flat-aero,.skin-states .iradio_flat-grey,.skin-states .iradio_flat-orange,.skin-states .iradio_flat-yellow,.skin-states .iradio_flat-pink,.skin-states .iradio_flat-purple{left:35px} +.skin-states .iradio_polaris{left:26px} +.skin-states .iradio_futurico{left:31px} +.colors{clear:both;padding:24px 0 9px;} +.skin-line .colors{padding-top:28px} +.colors strong{float:left;line-height:20px;margin-right:20px} +.colors li{position:relative;float:left;width:16px;height:16px;margin:2px 1px 0 0;background:#000;cursor:pointer;filter:alpha(opacity=50);opacity:.5;-webkit-transition:opacity .2s;-moz-transition:opacity .2s;-ms-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s;} +.colors li:hover{filter:alpha(opacity=100);opacity:1} +.colors li.active{height:20px;margin-top:0;filter:alpha(opacity=75);opacity:.75} +.colors li.red{background:#d54e21} +.colors li.green{background:#78a300} +.colors li.blue{background:#0e76a8} +.colors li.aero{background:#9cc2cb} +.colors li.grey{background:#73716e} +.colors li.orange{background:#f70} +.colors li.yellow{background:#fc0} +.colors li.pink{background:#ff66b5} +.colors li.purple{background:#6a5a8c} +.skin-square .colors li.red{background:#e56c69} +.skin-square .colors li.green{background:#1b7e5a} +.skin-square .colors li.blue{background:#2489c5} +.skin-square .colors li.aero{background:#9cc2cb} +.skin-square .colors li.grey{background:#73716e} +.skin-square .colors li.yellow{background:#fc3} +.skin-square .colors li.pink{background:#a77a94} +.skin-square .colors li.purple{background:#6a5a8c} +.skin-square .colors li.orange{background:#f70} +.skin-flat .colors li.red{background:#ec7063} +.skin-flat .colors li.green{background:#1abc9c} +.skin-flat .colors li.blue{background:#3498db} +.skin-flat .colors li.grey{background:#95a5a6} +.skin-flat .colors li.orange{background:#f39c12} +.skin-flat .colors li.yellow{background:#f1c40f} +.skin-flat .colors li.pink{background:#af7ac5} +.skin-flat .colors li.purple{background:#8677a7} +.skin-line .colors li.yellow{background:#ffc414} +.skins-info{padding:13px 0 57px;font-size:16px;line-height:22px;text-align:center;} +.skins-info p{margin-bottom:17px} +.skins-info .skins-banner{margin:34px 0 3px;} +.skins-info .skins-banner a{display:block;width:728px;height:90px;margin:0 auto;overflow:hidden;text-indent:100%;white-space:nowrap;background:url(banner.jpg);-webkit-transition:opacity 0.4s ease;-moz-transition:opacity 0.4s ease;-o-transition:opacity 0.4s ease;transition:opacity 0.4s ease;border:none;} +.skins-info .skins-banner a:hover{opacity:.8;} +.skin-pre{padding:43px 60px 0} +.skin-usage{padding:19px 60px 8px;list-style:decimal outside;} +.skin-usage li{margin-bottom:23px} +.skin-usage .schemes{margin-bottom:-3px;padding:13px 0 0 20px;color:#888;} +.skin-usage .schemes ul{float:left;padding-right:60px} +.skin-usage .schemes li{margin:0;padding-bottom:3px} +.usage{position:relative;margin-bottom:80px;background:#fff;} +.usage a{border-bottom-color:#ddd} +.usage .self{border-bottom-color:#bbb} +.usage .arrows{top:0} +.usage:hover .arrows .top,.usage:hover .arrows .bottom{left:0} +.usage h2{color:#fff;background:#1f7f5c} +.usage h4{margin:26px 0 10px;} +.usage h4.indeterminate{margin-top:28px} +.usage p{margin-bottom:5px;} +.usage p.offset{margin-top:10px} +.usage p.callbacks-info{margin-bottom:19px} +.usage p.methods-info{margin-bottom:10px} +.usage p.methods-callback{margin-top:10px} +.usage p.issue-tracker{margin-top:31px} +.usage .markup{margin:9px 0 16px} +.usage .usage-inner{font-size:15px;line-height:23px;padding:41px 60px 39px} +.markup{margin:10px 0 18px;padding:8px 0 9px 17px;font:14px/20px 'MontserratRegular',Helvetica,Arial,sans-serif;color:#777;background:#e7e5e0;border-left:3px solid #d7d5cb;} +.markup .comment{color:#999;} +.markup .comment .self{color:#555;} +.markup .comment .self:hover{color:#333} +.skin-polaris .markup{background:#232830;border-left-color:#1f232a} +.skin-futurico .markup{background:#25262a;border-left-color:#202225} +.skin-polaris .markup .comment,.skin-futurico .markup .comment{color:#555} +.browsers{margin-bottom:74px;} +.browsers h2{margin-bottom:29px;font-size:24px} +.browsers-inner{padding:0 60px;font-size:15px;line-height:23px;} +.browsers-inner p{margin-bottom:15px} +.benefits{position:relative;margin-bottom:59px;color:#888;background:#232323;} +.benefits .arrows{top:0} +.benefits:hover .arrows .top,.benefits:hover .arrows .bottom{left:0} +.benefits h2{color:#fff;background:#6a5b8c} +.benefits a{color:#888;border-bottom-color:#444;} +.benefits a:hover{color:#aaa} +.benefits .mark{color:#777;background:#393939} +.benefits-inner{padding:41px 60px 29px;font-size:15px;line-height:23px;} +.benefits-inner p{margin-bottom:15px} +.benefits-inner ul{margin:-10px 0 15px} +.download{height:63px;text-align:center;} +.download a{display:block;height:60px;font-size:18px;line-height:58px;color:#fff;border-bottom:0 solid #e24f49;background:#e76b66;-webkit-transition:border-bottom .2s;-moz-transition:border-bottom .2s;-ms-transition:border-bottom .2s;-o-transition:border-bottom .2s;transition:border-bottom .2s;} +.download a:before{content:'';display:inline-block;width:26px;height:26px;margin-right:12px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAACYUlEQVR4Xr3VPWhTURjH4VOt0ES7ZRJbEJpsNsaimx9E0GpRCdgU/NhsRAdNBYcK0RirQcSkIIK2cRBRiragVayDhqBDLVWatFvsIKK2UMEp4KBcf8N/KNdwvcHWAw8c/rzvebk5yU2dZVnmf6wVNdb70Ca+5Rrkx0e8E/ZkyzCoAyuxBZu17/jXQV34jjwCytowjUk90Ywyo5q8errcDoriPgpoRhEj6MQrGHmpbARF1RbUG3Uz6Bae4iBacQNNSKEPRi4pa1JNq3pGcds+qNrXu4B1CKKCWtZqlPAZO/72RDGsRdKWh5ATIdOSpHpjbu6ojBfYBiPdOIQeHJMeZd0wsh1jKDsNakEc97AHo8o3IYCz2I1nGMYuZQHVGPXs1RlxtNgH+TCFtBpvIqua40ghqkGdOIp27VOqMcigX8PTKIKzWXwZDDbAQhDG5o6yx2iAkQY80T4HYxOEpbP/uCOnN+wq1Nlq6x3qrWp3NIcKJvAWV+FVzU804i6uwyNZZY34BaOeyzpjQmfOLR70DSGcwyxOIa7mAZzHQ+QxLHllCdUYnMYZzOqsjeBsPbp8QFZ7Lw7gCt4jhGu4qCEGa5SVVWPUM4Yjbn5HfrTjNYzk8AAZ5CSjbBBG3qjXr0CqX+YAviJpy6cQg9NKIoJBN6+gIGbwA16kMY5eeGDEo2xcNV71TCPo5qM7iX14hJIueB4XkICRhLJ51ZTUsx8n3AwawmGE8QUhRDR4J4yElUUQUm1YvUPOfxPO4khj66KL70W/m+Z6uF3P0YdJBRVlZqkHlbEezQo+YWHJB8mC1Lx+Ayeq7nRIoewwAAAAAElFTkSuQmCC");*background-image:url("ie/icon-options.png");vertical-align:middle} +.download a:hover{border-bottom-width:3px} +.license{color:#444;text-align:center;padding:30px 0 75px} +.footer{padding-top:28px;height:60px;color:#666;background:#e2dfd8;} +.footer ul{float:left;} +.footer ul li{float:left;padding:2px 10px 0 0} +.footer ul.local li{padding:0 30px 0 0} +.footer .code{float:right} +.footer a{color:#444;} +.footer a:hover{color:#222} +.footer-inner{width:930px;margin:0 auto;overflow:hidden} +.fork-me{position:fixed;*position:absolute;top:0;right:0;width:40px;height:40px;overflow:hidden;text-indent:100%;white-space:nowrap;background:#28545b url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAnElEQVR4XqVSgQmEMAyszw/gCI7wK7iBblBHcISfxG6gG/gjuIGO0A3ygaYQCCG2HhweF+6aShsAcDcBJBpuvlwFagqGJwUf5EL6kgV2eEe2yIgc9QI73CMPs8AOywI7nHDSzCxYxcnJ6+hrFnQkJrb2nGclP3Fj+vf0IUV1AgCZHiS86lOObxD4qqSD5mtXmAq1e2fB3vqXact3f/JmXumJlVq1AAAAAElFTkSuQmCC") 50% no-repeat;*background-image:url("ie/icon-fork.png");} +.fork-me:hover{background-color:#1f7f5c} +.skin dt,.fork-me{-webkit-transition:background-color .2s;-moz-transition:background-color .2s;-ms-transition:background-color .2s;-o-transition:background-color .2s;transition:background-color .2s} diff --git a/static/js/plugins/iCheck/icheck.min.js b/static/js/plugins/iCheck/icheck.min.js index 9b826fb7e..7cdb17e0d 100644 --- a/static/js/plugins/iCheck/icheck.min.js +++ b/static/js/plugins/iCheck/icheck.min.js @@ -1,11 +1,11 @@ /*! iCheck v1.0.2 by Damir Sultanov, http://git.io/arlzeA, MIT Licensed */ (function(f){function A(a,b,d){var c=a[0],g=/er/.test(d)?_indeterminate:/bl/.test(d)?n:k,e=d==_update?{checked:c[k],disabled:c[n],indeterminate:"true"==a.attr(_indeterminate)||"false"==a.attr(_determinate)}:c[g];if(/^(ch|di|in)/.test(d)&&!e)x(a,g);else if(/^(un|en|de)/.test(d)&&e)q(a,g);else if(d==_update)for(var f in e)e[f]?x(a,f,!0):q(a,f,!0);else if(!b||"toggle"==d){if(!b)a[_callback]("ifClicked");e?c[_type]!==r&&q(a,g):x(a,g)}}function x(a,b,d){var c=a[0],g=a.parent(),e=b==k,u=b==_indeterminate, - v=b==n,s=u?_determinate:e?y:"enabled",F=l(a,s+t(c[_type])),B=l(a,b+t(c[_type]));if(!0!==c[b]){if(!d&&b==k&&c[_type]==r&&c.name){var w=a.closest("form"),p='input[name="'+c.name+'"]',p=w.length?w.find(p):f(p);p.each(function(){this!==c&&f(this).data(m)&&q(f(this),b)})}u?(c[b]=!0,c[k]&&q(a,k,"force")):(d||(c[b]=!0),e&&c[_indeterminate]&&q(a,_indeterminate,!1));D(a,e,b,d)}c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"default");g[_add](B||l(a,b)||"");g.attr("role")&&!u&&g.attr("aria-"+(v?n:k),"true"); - g[_remove](F||l(a,s)||"")}function q(a,b,d){var c=a[0],g=a.parent(),e=b==k,f=b==_indeterminate,m=b==n,s=f?_determinate:e?y:"enabled",q=l(a,s+t(c[_type])),r=l(a,b+t(c[_type]));if(!1!==c[b]){if(f||!d||"force"==d)c[b]=!1;D(a,e,s,d)}!c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"pointer");g[_remove](r||l(a,b)||"");g.attr("role")&&!f&&g.attr("aria-"+(m?n:k),"false");g[_add](q||l(a,s)||"")}function E(a,b){if(a.data(m)){a.parent().html(a.attr("style",a.data(m).s||""));if(b)a[_callback](b);a.off(".i").unwrap(); - f(_label+'[for="'+a[0].id+'"]').add(a.closest(_label)).off(".i")}}function l(a,b,f){if(a.data(m))return a.data(m).o[b+(f?"":"Class")]}function t(a){return a.charAt(0).toUpperCase()+a.slice(1)}function D(a,b,f,c){if(!c){if(b)a[_callback]("ifToggled");a[_callback]("ifChanged")[_callback]("if"+t(f))}}var m="iCheck",C=m+"-helper",r="radio",k="checked",y="un"+k,n="disabled";_determinate="determinate";_indeterminate="in"+_determinate;_update="update";_type="type";_click="click";_touch="touchbegin.i touchend.i"; - _add="addClass";_remove="removeClass";_callback="trigger";_label="label";_cursor="cursor";_mobile=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);f.fn[m]=function(a,b){var d='input[type="checkbox"], input[type="'+r+'"]',c=f(),g=function(a){a.each(function(){var a=f(this);c=a.is(d)?c.add(a):c.add(a.find(d))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(a))return a=a.toLowerCase(),g(this),c.each(function(){var c= - f(this);"destroy"==a?E(c,"ifDestroyed"):A(c,!0,a);f.isFunction(b)&&b()});if("object"!=typeof a&&a)return this;var e=f.extend({checkedClass:k,disabledClass:n,indeterminateClass:_indeterminate,labelHover:!0},a),l=e.handle,v=e.hoverClass||"hover",s=e.focusClass||"focus",t=e.activeClass||"active",B=!!e.labelHover,w=e.labelHoverClass||"hover",p=(""+e.increaseArea).replace("%","")|0;if("checkbox"==l||l==r)d='input[type="'+l+'"]';-50>p&&(p=-50);g(this);return c.each(function(){var a=f(this);E(a);var c=this, - b=c.id,g=-p+"%",d=100+2*p+"%",d={position:"absolute",top:g,left:g,display:"block",width:d,height:d,margin:0,padding:0,background:"#fff",border:0,opacity:0},g=_mobile?{position:"absolute",visibility:"hidden"}:p?d:{position:"absolute",opacity:0},l="checkbox"==c[_type]?e.checkboxClass||"icheckbox":e.radioClass||"i"+r,z=f(_label+'[for="'+b+'"]').add(a.closest(_label)),u=!!e.aria,y=m+"-"+Math.random().toString(36).substr(2,6),h='
    ")[_callback]("ifCreated").parent().append(e.insert);d=f('').css(d).appendTo(h);a.data(m,{o:e,s:a.attr("style")}).css(g);e.inheritClass&&h[_add](c.className||"");e.inheritID&&b&&h.attr("id",m+"-"+b);"static"==h.css("position")&&h.css("position","relative");A(a,!0,_update);if(z.length)z.on(_click+".i mouseover.i mouseout.i "+_touch,function(b){var d=b[_type],e=f(this);if(!c[n]){if(d==_click){if(f(b.target).is("a"))return; - A(a,!1,!0)}else B&&(/ut|nd/.test(d)?(h[_remove](v),e[_remove](w)):(h[_add](v),e[_add](w)));if(_mobile)b.stopPropagation();else return!1}});a.on(_click+".i focus.i blur.i keyup.i keydown.i keypress.i",function(b){var d=b[_type];b=b.keyCode;if(d==_click)return!1;if("keydown"==d&&32==b)return c[_type]==r&&c[k]||(c[k]?q(a,k):x(a,k)),!1;if("keyup"==d&&c[_type]==r)!c[k]&&x(a,k);else if(/us|ur/.test(d))h["blur"==d?_remove:_add](s)});d.on(_click+" mousedown mouseup mouseover mouseout "+_touch,function(b){var d= - b[_type],e=/wn|up/.test(d)?t:v;if(!c[n]){if(d==_click)A(a,!1,!0);else{if(/wn|er|in/.test(d))h[_add](e);else h[_remove](e+" "+t);if(z.length&&B&&e==v)z[/ut|nd/.test(d)?_remove:_add](w)}if(_mobile)b.stopPropagation();else return!1}})})}})(window.jQuery||window.Zepto); +v=b==n,s=u?_determinate:e?y:"enabled",F=l(a,s+t(c[_type])),B=l(a,b+t(c[_type]));if(!0!==c[b]){if(!d&&b==k&&c[_type]==r&&c.name){var w=a.closest("form"),p='input[name="'+c.name+'"]',p=w.length?w.find(p):f(p);p.each(function(){this!==c&&f(this).data(m)&&q(f(this),b)})}u?(c[b]=!0,c[k]&&q(a,k,"force")):(d||(c[b]=!0),e&&c[_indeterminate]&&q(a,_indeterminate,!1));D(a,e,b,d)}c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"default");g[_add](B||l(a,b)||"");g.attr("role")&&!u&&g.attr("aria-"+(v?n:k),"true"); +g[_remove](F||l(a,s)||"")}function q(a,b,d){var c=a[0],g=a.parent(),e=b==k,f=b==_indeterminate,m=b==n,s=f?_determinate:e?y:"enabled",q=l(a,s+t(c[_type])),r=l(a,b+t(c[_type]));if(!1!==c[b]){if(f||!d||"force"==d)c[b]=!1;D(a,e,s,d)}!c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"pointer");g[_remove](r||l(a,b)||"");g.attr("role")&&!f&&g.attr("aria-"+(m?n:k),"false");g[_add](q||l(a,s)||"")}function E(a,b){if(a.data(m)){a.parent().html(a.attr("style",a.data(m).s||""));if(b)a[_callback](b);a.off(".i").unwrap(); +f(_label+'[for="'+a[0].id+'"]').add(a.closest(_label)).off(".i")}}function l(a,b,f){if(a.data(m))return a.data(m).o[b+(f?"":"Class")]}function t(a){return a.charAt(0).toUpperCase()+a.slice(1)}function D(a,b,f,c){if(!c){if(b)a[_callback]("ifToggled");a[_callback]("ifChanged")[_callback]("if"+t(f))}}var m="iCheck",C=m+"-helper",r="radio",k="checked",y="un"+k,n="disabled";_determinate="determinate";_indeterminate="in"+_determinate;_update="update";_type="type";_click="click";_touch="touchbegin.i touchend.i"; +_add="addClass";_remove="removeClass";_callback="trigger";_label="label";_cursor="cursor";_mobile=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);f.fn[m]=function(a,b){var d='input[type="checkbox"], input[type="'+r+'"]',c=f(),g=function(a){a.each(function(){var a=f(this);c=a.is(d)?c.add(a):c.add(a.find(d))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(a))return a=a.toLowerCase(),g(this),c.each(function(){var c= +f(this);"destroy"==a?E(c,"ifDestroyed"):A(c,!0,a);f.isFunction(b)&&b()});if("object"!=typeof a&&a)return this;var e=f.extend({checkedClass:k,disabledClass:n,indeterminateClass:_indeterminate,labelHover:!0},a),l=e.handle,v=e.hoverClass||"hover",s=e.focusClass||"focus",t=e.activeClass||"active",B=!!e.labelHover,w=e.labelHoverClass||"hover",p=(""+e.increaseArea).replace("%","")|0;if("checkbox"==l||l==r)d='input[type="'+l+'"]';-50>p&&(p=-50);g(this);return c.each(function(){var a=f(this);E(a);var c=this, +b=c.id,g=-p+"%",d=100+2*p+"%",d={position:"absolute",top:g,left:g,display:"block",width:d,height:d,margin:0,padding:0,background:"#fff",border:0,opacity:0},g=_mobile?{position:"absolute",visibility:"hidden"}:p?d:{position:"absolute",opacity:0},l="checkbox"==c[_type]?e.checkboxClass||"icheckbox":e.radioClass||"i"+r,z=f(_label+'[for="'+b+'"]').add(a.closest(_label)),u=!!e.aria,y=m+"-"+Math.random().toString(36).substr(2,6),h='
    ")[_callback]("ifCreated").parent().append(e.insert);d=f('').css(d).appendTo(h);a.data(m,{o:e,s:a.attr("style")}).css(g);e.inheritClass&&h[_add](c.className||"");e.inheritID&&b&&h.attr("id",m+"-"+b);"static"==h.css("position")&&h.css("position","relative");A(a,!0,_update);if(z.length)z.on(_click+".i mouseover.i mouseout.i "+_touch,function(b){var d=b[_type],e=f(this);if(!c[n]){if(d==_click){if(f(b.target).is("a"))return; +A(a,!1,!0)}else B&&(/ut|nd/.test(d)?(h[_remove](v),e[_remove](w)):(h[_add](v),e[_add](w)));if(_mobile)b.stopPropagation();else return!1}});a.on(_click+".i focus.i blur.i keyup.i keydown.i keypress.i",function(b){var d=b[_type];b=b.keyCode;if(d==_click)return!1;if("keydown"==d&&32==b)return c[_type]==r&&c[k]||(c[k]?q(a,k):x(a,k)),!1;if("keyup"==d&&c[_type]==r)!c[k]&&x(a,k);else if(/us|ur/.test(d))h["blur"==d?_remove:_add](s)});d.on(_click+" mousedown mouseup mouseover mouseout "+_touch,function(b){var d= +b[_type],e=/wn|up/.test(d)?t:v;if(!c[n]){if(d==_click)A(a,!1,!0);else{if(/wn|er|in/.test(d))h[_add](e);else h[_remove](e+" "+t);if(z.length&&B&&e==v)z[/ut|nd/.test(d)?_remove:_add](w)}if(_mobile)b.stopPropagation();else return!1}})})}})(window.jQuery||window.Zepto); diff --git a/templates/css_js.html b/templates/css_js.html deleted file mode 100644 index 9004ffc1e..000000000 --- a/templates/css_js.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/templates/jperm/perm_group_edit.html b/templates/jperm/perm_group_edit.html new file mode 100644 index 000000000..20121cc66 --- /dev/null +++ b/templates/jperm/perm_group_edit.html @@ -0,0 +1,151 @@ +{% extends 'base.html' %} +{% load mytags %} + +{% block content %} + + + {% include 'nav_cat_bar.html' %} +
    +
    +
    +
    + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    + + +
    +

    未授权主机

    +
    + + +
    +
    + +
    +
    + + +
    +
    + +

    授权主机

    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + +{# #} + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_host.html b/templates/jperm/perm_host.html index 71d003b13..15270e669 100644 --- a/templates/jperm/perm_host.html +++ b/templates/jperm/perm_host.html @@ -61,8 +61,8 @@ {{ user.username|groups_str }} {{ user.id|perm_count }} - 详情 - 编辑 + 详情 + 编辑 {% endfor %} @@ -123,8 +123,8 @@ {{ group.name }} {{ group.comment }} - 详情 - 编辑 + 详情 + 编辑 {% endfor %} diff --git a/templates/jperm/perm_user_detail.html b/templates/jperm/perm_user_detail.html new file mode 100644 index 000000000..09116581d --- /dev/null +++ b/templates/jperm/perm_user_detail.html @@ -0,0 +1,47 @@ +{% load mytags %} + + + {% include 'link_css.html' %} + + + + + +
    +
    +

    {{ user.name }} 授权详情

    +
    + + + + + + + + + + + + {% for asset in host_permed %} + + + + + + + {% endfor %} + +
    IDIP主机组IDC
    {{ asset.id }}{{ asset.ip }} + {% for group in asset.bis_group.all %} + {{ group }} + {% endfor %} + {{ asset.idc.name }}
    +
    +
    + + \ No newline at end of file diff --git a/templates/jperm/perm_edit.html b/templates/jperm/perm_user_edit.html similarity index 100% rename from templates/jperm/perm_edit.html rename to templates/jperm/perm_user_edit.html diff --git a/templates/juser/user_add.html b/templates/juser/user_add.html index 657792157..5b1390e96 100644 --- a/templates/juser/user_add.html +++ b/templates/juser/user_add.html @@ -1,6 +1,7 @@ {% extends 'base.html' %} {% load mytags %} + {% block content %} {% include 'nav_cat_bar.html' %}
    @@ -28,7 +29,7 @@
    -
    + {% if error %}
    {{ error }}
    {% endif %} @@ -148,4 +149,61 @@
    + + + {% endblock %} \ No newline at end of file diff --git a/templates/juser/user_list.html b/templates/juser/user_list.html index f2c5596c4..18e222aa6 100644 --- a/templates/juser/user_list.html +++ b/templates/juser/user_list.html @@ -36,7 +36,9 @@ - + @@ -50,7 +52,9 @@ {% for user in contacts.object_list %} - + @@ -117,4 +121,4 @@ }); -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/juser/user_list1.html b/templates/juser/user_list1.html new file mode 100644 index 000000000..6c8f2cdad --- /dev/null +++ b/templates/juser/user_list1.html @@ -0,0 +1,130 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
    +
    +
    +
    +
    +
    查看用户 show user info.
    + +
    + +
    + + +
    + + ID 用户名 姓名
    + + {{ user.id }} {{ user.username }} {{ user.name }}
    + + + + + + + + + + + + + + + {% for user in contacts.object_list %} + + + + + + + + + + + + {% endfor %} + +
    ID用户名姓名属组角色Email激活操作
    {{ user.id }} {{ user.username }} {{ user.name }} {{ user.username|groups_str }}{{ user.id|get_role }}{{ user.email }}{{ user.is_active|bool2str }} + 详情 + 编辑 + 删除 +
    +
    +
    +
    + Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
    +
    +
    +
    +
      + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% for page in p.page_range %} + {% ifequal offset1 page %} +
    • {{ page }}
    • + {% else %} +
    • {{ page }}
    • + {% endifequal %} + {% endfor %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/link_css.html b/templates/link_css.html index 5849bc727..37adaf59f 100644 --- a/templates/link_css.html +++ b/templates/link_css.html @@ -1,9 +1,7 @@ - - - \ No newline at end of file + diff --git a/templates/script.html b/templates/script.html index 170330146..8857cc21d 100644 --- a/templates/script.html +++ b/templates/script.html @@ -4,30 +4,46 @@ - - - - + + + + - - - - - - - +--> + function selectAll(){ + var checklist = document.getElementsByName ("selected"); + if(document.getElementById("select_all").checked) + { + for(var i=0;i - From 5ddcdf99c147b6d9ec72b070d0483b0377fa243f Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Tue, 27 Jan 2015 15:01:09 +0800 Subject: [PATCH 21/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BB=84=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/models.py | 16 +++------------- juser/models.py | 6 ++++++ juser/views.py | 21 ++++++++++++--------- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/jperm/models.py b/jperm/models.py index 9aa31c2a0..75a4081f2 100644 --- a/jperm/models.py +++ b/jperm/models.py @@ -3,19 +3,9 @@ from juser.models import User, UserGroup from jasset.models import Asset, BisGroup -class PermUser(models.Model): - user = models.ForeignKey(User) - asset = models.ForeignKey(Asset) +class Perm(models.Model): + user_group = models.ForeignKey(UserGroup) asset_group = models.ForeignKey(BisGroup) def __unicode__(self): - return '%s_%s' % (self.user.username, self.asset.ip) - - -class PermUserGroup(models.Model): - group = models.ForeignKey(UserGroup) - asset = models.ForeignKey(Asset) - asset_group = models.ForeignKey(BisGroup) - - def __unicode__(self): - return '%s_%s' % (self.group.name, self.asset.ip) \ No newline at end of file + return '%s_%s' % (self.user_group.name, self.asset_group.name) \ No newline at end of file diff --git a/juser/models.py b/juser/models.py index 25bc2c055..4426a3b17 100644 --- a/juser/models.py +++ b/juser/models.py @@ -2,7 +2,13 @@ from django.db import models class UserGroup(models.Model): + GROUP_TYPE_CHOICES = ( + ('U', 'UniqueUserGroup'), + ('M', 'ManyUserGroup') + ) + name = models.CharField(max_length=80, unique=True) + type = models.CharField(max_length=1, choices=GROUP_TYPE_CHOICES, default='U') comment = models.CharField(max_length=160, blank=True, null=True) def __unicode__(self): diff --git a/juser/views.py b/juser/views.py index e090dd8ce..0b1077731 100644 --- a/juser/views.py +++ b/juser/views.py @@ -113,6 +113,14 @@ def gen_sha512(salt, password): return crypt.crypt(password, '$6$%s$' % salt) +def group_db_add(**kwargs): + group_name = kwargs.get('name') + group = UserGroup.objects.filter(name=group_name) + if group: + raise AddError + UserGroup.objects.create(**kwargs) + + def group_add(request): error = '' msg = '' @@ -127,13 +135,8 @@ def group_add(request): error = u'组名不能为空' raise AddError - group = UserGroup.objects.filter(name=group_name) - if group: - error = u'组 %s 已存在' % group_name - raise AddError + group_db_add(name=group_name, comment=comment, type='M') - group = UserGroup(name=group_name, comment=comment) - group.save() except AddError: pass @@ -148,7 +151,7 @@ def group_add(request): def group_list(request): header_title, path1, path2 = '查看属组 | Show Group', 'juser', 'group_list' - groups = contact_list = UserGroup.objects.all().order_by('id') + groups = contact_list = UserGroup.objects.filter(type='M').order_by('id') p = paginator = Paginator(contact_list, 10) try: @@ -418,7 +421,7 @@ def user_add(request): msg = '' header_title, path1, path2 = '添加用户 | Add User', 'juser', 'user_add' user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} - all_group = UserGroup.objects.all() + all_group = UserGroup.objects.filter(type='M') if request.method == 'POST': username = request.POST.get('username', None) password = request.POST.get('password', None) @@ -457,10 +460,10 @@ def user_add(request): date_joined=time_now) server_add_user(username, password, ssh_key_pwd1) + group_db_add(name=username, comment=username, type='U') if LDAP_ENABLE: ldap_add_user(username, ldap_pwd) msg = u'添加用户 %s 成功!' % username - # locals = lambda: {} except Exception, e: error = u'添加用户 %s 失败 %s ' % (username, e) From 2acc715ebedb93eaf4b764ea30f8e4eb32ca3eaf Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Tue, 27 Jan 2015 16:43:37 +0800 Subject: [PATCH 22/39] =?UTF-8?q?x=E4=BF=AE=E6=94=B9js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/plugins/iCheck/custom.css | 319 +++++-------------------- static/js/plugins/iCheck/icheck.min.js | 18 +- 2 files changed, 68 insertions(+), 269 deletions(-) diff --git a/static/css/plugins/iCheck/custom.css b/static/css/plugins/iCheck/custom.css index 77437305a..bddfe9b3c 100644 --- a/static/css/plugins/iCheck/custom.css +++ b/static/css/plugins/iCheck/custom.css @@ -1,260 +1,59 @@ -@import url("normalize.css"); -@font-face{font-family:'MontserratRegular';src:url("./montserrat-regular.eot");src:url("./montserrat-regular.eot?#iefix") format('embedded-opentype'),url("./montserrat-regular.woff") format('woff'),url("./montserrat-regular.ttf") format('truetype'),url("./montserrat-regular.svg#MontserratRegular") format('svg');font-style:normal;font-weight:normal} -@font-face{font-family:'MontserratBold';src:url("./montserrat-bold.eot");src:url("./montserrat-bold.eot?#iefix") format('embedded-opentype'),url("./montserrat-bold.woff") format('woff'),url("./montserrat-bold.ttf") format('truetype'),url("./montserrat-bold.svg#MontserratBold") format('svg');font-style:normal;font-weight:bold} -html,body{height:100%} -body{font:14px/20px 'MontserratRegular',Helvetica,Arial,sans-serif;color:#222;background:#ebe7df url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAFZCAIAAAA96mnzAAACKklEQVR4Xn2VUW7kMAxD+QLf/1x7gv71LNwdKTLhZFtggMCwSVEUPdb3159/v0uSrM8HtGRZuoQk1R69J12o9ixJWvSnVyfLdbNw0XAXWe1fIL8BoqmNGiV/cHc9Gq4NXxLKHhteRyLpA28cl0SLdx0BckSWL4gkPlIVTg1nN9Ys3iyWI5AGDA5xOXB5BJaWmOw6KSLeU6+0P50QshQyEL2im/YMIL60dTSZ3RXenlkiJpMj8XPMAl1FtjMRW19NxzOE5VGWPVGrc7aSJgz1Y9ku57mpYSwn1h0ivFOXxoCKMCXiahbbZNIZR+tkphllPsomipCwb4GMkXTmPfVg40Jt2y4RQM/PqX5JTM4iiTN8Zz1XvbIAEEvoEW+3nxTLL3lB7t7J3WwyI7g5OVxKIeFEH4FIGLC9I+XqvSd4AxJM5O6WTPr54RAxLG44FVrEuz+kFdXyLiuX6kLPVLZL2ISlcHNlBIKm5rR8nEi9wJeA6Y8JZlJOyDiin0K5ag+AXHtALBicXasjIUu9h0STBbCMU+89gMnu/J05MU1QWqdbPMRPIZIzDgsi8Olg5t7wHhUg/pv5RUzO+BHDmczHkAfZWxlSYgNI5Ig5XRoc66dW9L45eHDkbkqCO7RLG5cna/HD7YhZnfINkFo8iNyj5kx6pFrxNGRlfhV2e1Zt5DnGU8T7Tud1ivi8jU8/3Zy88pkn6+zdXiJ7AVSFBZA3VcwDfXtt5UUHS38B35hQVuJip4MAAAAASUVORK5CYII=") repeat-x;*background-image:url("ie/header-line.png")} -a{color:#222;text-decoration:none;border-bottom:1px solid #bbb;} -a:hover{color:#000} -a,.self{-webkit-transition:color .1s;-moz-transition:color .1s;-ms-transition:color .1s;-o-transition:color .1s;transition:color .1s} -.self{color:#333;border-bottom:1px dotted #aaa;cursor:pointer;} -.self:hover{color:#000} -strong{font-family:'MontserratBold',Helvetica,Arial,sans-serif;font-weight:700} -p{margin:0 0 8px} -label{cursor:pointer} -h1,h2,h3,h4{margin:0;font:bold 20px/60px 'MontserratBold',Helvetica,Arial,sans-serif} -h2{height:60px;text-align:center;text-transform:uppercase} -h4{font-size:18px;line-height:24px} -ul{margin:0;padding:0;list-style:none} -table{width:100%;margin-bottom:21px} -th,td{padding:11px 20px 12px;vertical-align:top;font-weight:normal;text-align:left;border-bottom:2px solid #e7e5e0;} -thead th,thead td{background:#f3f2ef} -th{white-space:nowrap} -td{width:100%} -.focus{outline:1px dotted rgba(0,0,0,0.5) !important} -.clear{position:relative;*zoom:1;} -.clear:before,.clear:after{content:'';display:table;clear:both} -.layout{width:930px;margin:0 auto;padding:0 15px} -.header{padding:115px 0 73px;color:#fff;text-align:center;} -.header h1,.header strong{letter-spacing:-1px;text-transform:uppercase} -.header h1{padding-bottom:23px;font-size:22px;line-height:28px} -.header h3{position:relative;padding:35px 0 17px;font-size:120px;line-height:140px;letter-spacing:-5px;} -.header h3 span{font-size:30px;line-height:40px;letter-spacing:0;margin-left:-10px;vertical-align:baseline;} -.header h3:before{content:'';display:inline-block;width:72px;height:64px;margin-right:32px;vertical-align:middle;background:url("icheck.png")} -.header h3:after{content:'';position:absolute;top:0;left:50%;width:100px;margin-left:-50px;border-top:3px solid #fff} -.header strong{font:24px/30px 'MontserratRegular',Helvetica,Arial,sans-serif;} -.header strong a{color:#fff;border-bottom-color:#fff} -.features{position:relative;font-size:16px;color:#555;background:#fff;} -.features .self{color:#555;border-bottom-color:#bbb;} -.features .self:hover{color:#222} -.features .arrows{top:0} -.features:hover .arrows .bottom{left:0} -.features h2{color:#fff;background:#2489c5} -.features ul{padding:44px 60px 36px} -.features li{padding:0 0 9px 36px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABI0lEQVR4XpXSP0vDUBjF4ZtLkIr4EYzduogdXJTWWV2FLMVNoQrdAhlUUFAEcejo1q13svgFBAUdxA/g30kcdQoIIlL9DWcKuZEeeOCl99w3gTSI49h4MoFb/KCJz6KShS/rOh/TbEZZECLBiSQIR1nQQgAnAVr/LZjEnIq76OJbutjRGR26isUB3pDhBikucWoUzVdI1cl05zBk2MI5jvCKIfL5QluzxTS20bY6WENdl0ujTl13Ni3DABtwWEFp1HG6M7Aq9NHBGRbgy7w6HfTzX6GHCyyXPV2dnu9/MIUX+PIMOkRsbq7hHkZmxciDOrZoQRUVPCGCw504RDobR7VoQQ0f2Mejls1IRb/t4R10CcLc6/2igSVcw8gqFnEMOnSVPxQqQaPw2y7fAAAAAElFTkSuQmCC") 0 1px no-repeat;*background-image:url("ie/icon-star.png");} -.features li.offset{margin-top:20px} -.mark{padding:0 2px;color:#777;background:#e7e5e0;} -.skin-polaris .mark{background:#232830} -.skin-futurico .mark{background:#25262a} -.social{height:60px;margin-bottom:60px;padding:0 60px;font-size:16px;color:#555;background:#f5f3ef;} -.social a{color:#777;border-bottom-color:#ccc;} -.social a:hover{color:#444} -.social .left{float:left;padding-top:19px;} -.social .left li{float:left;padding-right:30px;} -.social .left li a{position:relative} -.social .right{float:right;padding-top:20px;} -.social .right li{float:right;padding-left:10px} -.social .right.local{padding-top:19px;} -.social .right.local li{padding-left:30px;font-size:14px} -.demo-holder{margin-bottom:97px} -.demo-title{padding-bottom:36px;font-size:26px;letter-spacing:-1px} -.demo{position:relative;} -.demo:hover .arrows .top,.demo:hover .arrows .bottom{left:0} -.demo-list{position:relative;margin-right:360px;padding:33px 57px 17px;color:#555;background:#fff;border:3px solid #ddd8ce;} -.demo-list ul{float:right;white-space:nowrap;} -.demo-list ul:first-child{float:left} -.demo-list ul li{position:relative;padding:0 0 18px 42px} -.demo-list ul input{position:absolute;top:4px;left:0} -.demo-list ul .icheckbox_square-blue,.demo-list ul .iradio_square-blue{position:absolute;top:-1px;left:0} -.demo-list ul span{color:#bbb} -.demo-methods{padding:21px 360px 0 0;} -.demo-methods .mark{background:#d3cfc6} -.demo-methods dt{position:relative;padding:17px 150px 18px 0;font:16px/24px 'MontserratRegular',Helvetica,Arial,sans-serif;color:#444;border-bottom:3px solid #ddd8ce;} -.demo-methods dt .self{cursor:pointer;} -.demo-methods dt .self:hover{color:#222} -.demo-methods dt .code{position:absolute;right:0;bottom:18px;color:#777;} -.demo-methods dt .code .self:hover{color:#444} -.demo-methods dd{position:relative;display:none;margin:0;background:#fff;border:3px solid #ddd8ce;border-top:none;} -.demo-methods dd:before{content:'';position:absolute;top:-13px;left:0;width:0;height:0;border:5px solid transparent;border-bottom-color:#ddd8ce;border-left-color:#ddd8ce} -.demo-methods dd .markup{margin:0;color:#888;background:#f5f3ef;border:none;} -.demo-methods dd .markup .comment{color:#aaa} -.demo-callbacks{position:absolute;top:0;right:0;bottom:0;width:300px;color:#aaa;background:#232323;border:3px solid #ddd8ce;} -.demo-callbacks h2{color:#fff;background:#6a5a8c} -.demo-callbacks ul{position:absolute;top:60px;width:100%;bottom:0;overflow:auto;} -.demo-callbacks ul::-webkit-scrollbar{width:10px;background:none;} -.demo-callbacks ul::-webkit-scrollbar-track{background:none;border:none;} -.demo-callbacks ul::-webkit-scrollbar-track-piece:disabled{display:none !important;} -.demo-callbacks ul::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25);border:none;} -.demo-callbacks ul::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.3);} -.demo-callbacks ul li{margin-top:-1px;padding:13px 20px 15px;border-top:1px solid #2e2e2e;} -.demo-callbacks ul li span{color:#888} -.skins{position:relative;*zoom:1;} -.skins h2{position:absolute;top:-38px;right:0;left:0;font-size:24px;text-align:center} -.arrows{position:absolute;top:3px;left:-60px;width:60px;overflow:hidden;} -.arrows .top,.arrows .bottom{position:relative;left:60px;width:60px;height:60px;cursor:pointer;-webkit-transition:left .3s,background-color .2s;-moz-transition:left .3s,background-color .2s;-ms-transition:left .3s,background-color .2s;-o-transition:left .3s,background-color .2s;transition:left .3s,background-color .2s} -.arrows .top{background:#83b3be url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAdklEQVR4Xo3MuwmFQBiE0b0FmAuutnRBsAARLMTYRzvWItiEYLq/s6CYyMwGXzTDcWbG8mhEf/ZjQIV2ZCigjiASMAVJIAVKAQ4FKWBDJVoYpAB/7z8GRaAQgBNQG8dZA28f0BmHBgUCKGh9hhpNKH8BWY8GlF2OH3hCC1zmdAAAAABJRU5ErkJggg==") 50% no-repeat;*background-image:url("ie/arrow-top.png");} -.arrows .top:hover{background-color:#6ba4b1} -.arrows .bottom{background:#e2b78d url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAf0lEQVR4Xo3MzQmEQBCE0TGAvQuOpiQIBiCCgXj2J52NRTAJwev0Vh+WOgjlNHyHguYFM/M6tKLSd2YTmtHHR48S8jtQzAB2430d2bgJvQLsdqRCZwZUPAFLaPjrjYAUMKLgwBtUK4CIhi4BEFGQBohISANEJKQBIqqIFtSqvx/0bXhCCUrgiAAAAABJRU5ErkJggg==") 50% no-repeat;*background-image:url("ie/arrow-bottom.png");} -.arrows .bottom:hover{background-color:#dba571} -@media screen and (max-width:1049px){.arrows,.fork-me{display:none} -}.skin{position:relative;margin-bottom:40px;} -.skin:hover .arrows .top,.skin:hover .arrows .bottom{left:0} -.skin h3{position:relative;z-index:20;float:left;height:60px;padding:0 57px;line-height:58px;background:#fff;border:3px solid #ddd8ce;border-bottom:none;} -.skin h3:before{content:'';position:absolute;top:100%;left:0;width:100%;height:2px;margin-top:-1px;background:#fff} -.skin.skin-polaris h3{color:#cacdd1;background:#2c323c;} -.skin.skin-polaris h3:before{background:#2c323c} -.skin.skin-futurico h3{color:#c3c3c3;background:#2e3035;} -.skin.skin-futurico h3:before{background:#2e3035} -.skin dl{z-index:10;width:100%;margin:0} -.skin dt{position:relative;top:-53px;right:-3px;float:right;height:47px;margin-right:-3px;padding:0 57px;line-height:47px;border:3px solid #ddd8ce;cursor:pointer;} -.skin dt:hover{background:#f0ede7;border-bottom:3px solid #ddd8ce} -.skin dt.selected{height:50px;background:#fff;border-bottom:none;cursor:default;} -.skin dt.selected:before{content:'';position:absolute;top:100%;left:0;width:100%;height:2px;margin-top:-1px;background:#fff} -.skin.skin-polaris dt{color:#cacdd1;background:#647083;} -.skin.skin-polaris dt:hover{background:#4a5361} -.skin.skin-polaris dt.selected{background:#2c323c;} -.skin.skin-polaris dt.selected:before{background:#2c323c} -.skin.skin-futurico dt{color:#c3c3c3;background:#676c77;} -.skin.skin-futurico dt:hover{background:#4b4e56} -.skin.skin-futurico dt.selected{background:#2e3035;} -.skin.skin-futurico dt.selected:before{background:#2e3035} -.skin dd{position:relative;display:none;float:left;width:100%;margin:-3px -100% 0 0;overflow:hidden;color:#444;background:#fff;border:3px solid #ddd8ce;} -.skin dd.selected{display:block} -.skin dd a{color:#444;} -.skin dd a:hover{color:#111} -.skin.skin-polaris dd{color:#7a828b;background:#2c323c;} -.skin.skin-polaris dd a{color:#7a828b;border-bottom-color:#4e596b;} -.skin.skin-polaris dd a:hover{color:#a2a7ae} -.skin.skin-futurico dd{color:#888;background:#2e3035;} -.skin.skin-futurico dd a{color:#888;border-bottom-color:#545861;} -.skin.skin-futurico dd a:hover{color:#aaa} -.skin-section{float:left;padding:42px 0 31px 57px;line-height:18px;} -.skin-section h4{padding-bottom:18px;} -.skin-polaris .skin-section h4{color:#959ba2} -.skin-futurico .skin-section h4{color:#a0a0a0} -.skin-section .list{float:left;padding-right:60px;} -.skin-section .list li{position:relative;padding-bottom:15px} -.skin-minimal .skin-section .list li{padding-left:38px} -.skin-square .skin-section .list li{padding-left:42px} -.skin-flat .skin-section .list li,.skin-line .skin-section label{padding-left:40px} -.skin-line .skin-section h4{padding-bottom:24px} -.skin-line .skin-section .list{padding-right:40px;} -.skin-line .skin-section .list li{padding-bottom:10px} -.skin-polaris .skin-section .list li{padding-left:37px} -.skin-futurico .skin-section .list li{padding-left:36px} -.icheckbox_minimal,.icheckbox_minimal-red,.icheckbox_minimal-green,.icheckbox_minimal-blue,.icheckbox_minimal-aero,.icheckbox_minimal-grey,.icheckbox_minimal-orange,.icheckbox_minimal-yellow,.icheckbox_minimal-pink,.icheckbox_minimal-purple,.iradio_minimal,.iradio_minimal-red,.iradio_minimal-green,.iradio_minimal-blue,.iradio_minimal-aero,.iradio_minimal-grey,.iradio_minimal-orange,.iradio_minimal-yellow,.iradio_minimal-pink,.iradio_minimal-purple{position:absolute;top:1px;left:0} -.skin input[type=checkbox],.skin input[type=radio]{position:absolute;top:2px;left:0} -.icheckbox_square,.icheckbox_square-red,.icheckbox_square-green,.icheckbox_square-blue,.icheckbox_square-aero,.icheckbox_square-grey,.icheckbox_square-orange,.icheckbox_square-yellow,.icheckbox_square-pink,.icheckbox_square-purple,.iradio_square,.iradio_square-red,.iradio_square-green,.iradio_square-blue,.iradio_square-aero,.iradio_square-grey,.iradio_square-orange,.iradio_square-yellow,.iradio_square-pink,.iradio_square-purple{position:absolute;top:-1px;left:0} -.icheckbox_flat,.icheckbox_flat-red,.icheckbox_flat-green,.icheckbox_flat-blue,.icheckbox_flat-aero,.icheckbox_flat-grey,.icheckbox_flat-orange,.icheckbox_flat-yellow,.icheckbox_flat-pink,.icheckbox_flat-purple,.iradio_flat,.iradio_flat-red,.iradio_flat-green,.iradio_flat-blue,.iradio_flat-aero,.iradio_flat-grey,.iradio_flat-orange,.iradio_flat-yellow,.iradio_flat-pink,.iradio_flat-purple{position:absolute;top:0;left:0} -.icheckbox_polaris,.iradio_polaris{position:absolute;top:-4px;left:-6px} -.icheckbox_futurico,.iradio_futurico{position:absolute;top:2px;left:0} -.skin-states{float:right;padding-right:57px;padding-left:0;} -.skin-states .state{cursor:default !important} -.skin-states .list{padding-right:0} -.skin-minimal .skin-states .list li{padding-left:71px} -.skin-square .skin-states .list li{padding-left:79px} -.skin-flat .skin-states .list li{padding-left:75px} -.skin-line .skin-states .list{padding-right:0} -.skin-polaris .skin-states .list li{padding-left:69px} -.skin-futurico .skin-states .list li{padding-left:67px} -.skin-states .iradio_minimal,.skin-states .iradio_minimal-red,.skin-states .iradio_minimal-green,.skin-states .iradio_minimal-blue,.skin-states .iradio_minimal-aero,.skin-states .iradio_minimal-grey,.skin-states .iradio_minimal-orange,.skin-states .iradio_minimal-yellow,.skin-states .iradio_minimal-pink,.skin-states .iradio_minimal-purple{left:33px} -.skin-states .iradio_square,.skin-states .iradio_square-red,.skin-states .iradio_square-green,.skin-states .iradio_square-blue,.skin-states .iradio_square-aero,.skin-states .iradio_square-grey,.skin-states .iradio_square-orange,.skin-states .iradio_square-yellow,.skin-states .iradio_square-pink,.skin-states .iradio_square-purple{left:37px} -.skin-states .iradio_flat,.skin-states .iradio_flat-red,.skin-states .iradio_flat-green,.skin-states .iradio_flat-blue,.skin-states .iradio_flat-aero,.skin-states .iradio_flat-grey,.skin-states .iradio_flat-orange,.skin-states .iradio_flat-yellow,.skin-states .iradio_flat-pink,.skin-states .iradio_flat-purple{left:35px} -.skin-states .iradio_polaris{left:26px} -.skin-states .iradio_futurico{left:31px} -.colors{clear:both;padding:24px 0 9px;} -.skin-line .colors{padding-top:28px} -.colors strong{float:left;line-height:20px;margin-right:20px} -.colors li{position:relative;float:left;width:16px;height:16px;margin:2px 1px 0 0;background:#000;cursor:pointer;filter:alpha(opacity=50);opacity:.5;-webkit-transition:opacity .2s;-moz-transition:opacity .2s;-ms-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s;} -.colors li:hover{filter:alpha(opacity=100);opacity:1} -.colors li.active{height:20px;margin-top:0;filter:alpha(opacity=75);opacity:.75} -.colors li.red{background:#d54e21} -.colors li.green{background:#78a300} -.colors li.blue{background:#0e76a8} -.colors li.aero{background:#9cc2cb} -.colors li.grey{background:#73716e} -.colors li.orange{background:#f70} -.colors li.yellow{background:#fc0} -.colors li.pink{background:#ff66b5} -.colors li.purple{background:#6a5a8c} -.skin-square .colors li.red{background:#e56c69} -.skin-square .colors li.green{background:#1b7e5a} -.skin-square .colors li.blue{background:#2489c5} -.skin-square .colors li.aero{background:#9cc2cb} -.skin-square .colors li.grey{background:#73716e} -.skin-square .colors li.yellow{background:#fc3} -.skin-square .colors li.pink{background:#a77a94} -.skin-square .colors li.purple{background:#6a5a8c} -.skin-square .colors li.orange{background:#f70} -.skin-flat .colors li.red{background:#ec7063} -.skin-flat .colors li.green{background:#1abc9c} -.skin-flat .colors li.blue{background:#3498db} -.skin-flat .colors li.grey{background:#95a5a6} -.skin-flat .colors li.orange{background:#f39c12} -.skin-flat .colors li.yellow{background:#f1c40f} -.skin-flat .colors li.pink{background:#af7ac5} -.skin-flat .colors li.purple{background:#8677a7} -.skin-line .colors li.yellow{background:#ffc414} -.skins-info{padding:13px 0 57px;font-size:16px;line-height:22px;text-align:center;} -.skins-info p{margin-bottom:17px} -.skins-info .skins-banner{margin:34px 0 3px;} -.skins-info .skins-banner a{display:block;width:728px;height:90px;margin:0 auto;overflow:hidden;text-indent:100%;white-space:nowrap;background:url(banner.jpg);-webkit-transition:opacity 0.4s ease;-moz-transition:opacity 0.4s ease;-o-transition:opacity 0.4s ease;transition:opacity 0.4s ease;border:none;} -.skins-info .skins-banner a:hover{opacity:.8;} -.skin-pre{padding:43px 60px 0} -.skin-usage{padding:19px 60px 8px;list-style:decimal outside;} -.skin-usage li{margin-bottom:23px} -.skin-usage .schemes{margin-bottom:-3px;padding:13px 0 0 20px;color:#888;} -.skin-usage .schemes ul{float:left;padding-right:60px} -.skin-usage .schemes li{margin:0;padding-bottom:3px} -.usage{position:relative;margin-bottom:80px;background:#fff;} -.usage a{border-bottom-color:#ddd} -.usage .self{border-bottom-color:#bbb} -.usage .arrows{top:0} -.usage:hover .arrows .top,.usage:hover .arrows .bottom{left:0} -.usage h2{color:#fff;background:#1f7f5c} -.usage h4{margin:26px 0 10px;} -.usage h4.indeterminate{margin-top:28px} -.usage p{margin-bottom:5px;} -.usage p.offset{margin-top:10px} -.usage p.callbacks-info{margin-bottom:19px} -.usage p.methods-info{margin-bottom:10px} -.usage p.methods-callback{margin-top:10px} -.usage p.issue-tracker{margin-top:31px} -.usage .markup{margin:9px 0 16px} -.usage .usage-inner{font-size:15px;line-height:23px;padding:41px 60px 39px} -.markup{margin:10px 0 18px;padding:8px 0 9px 17px;font:14px/20px 'MontserratRegular',Helvetica,Arial,sans-serif;color:#777;background:#e7e5e0;border-left:3px solid #d7d5cb;} -.markup .comment{color:#999;} -.markup .comment .self{color:#555;} -.markup .comment .self:hover{color:#333} -.skin-polaris .markup{background:#232830;border-left-color:#1f232a} -.skin-futurico .markup{background:#25262a;border-left-color:#202225} -.skin-polaris .markup .comment,.skin-futurico .markup .comment{color:#555} -.browsers{margin-bottom:74px;} -.browsers h2{margin-bottom:29px;font-size:24px} -.browsers-inner{padding:0 60px;font-size:15px;line-height:23px;} -.browsers-inner p{margin-bottom:15px} -.benefits{position:relative;margin-bottom:59px;color:#888;background:#232323;} -.benefits .arrows{top:0} -.benefits:hover .arrows .top,.benefits:hover .arrows .bottom{left:0} -.benefits h2{color:#fff;background:#6a5b8c} -.benefits a{color:#888;border-bottom-color:#444;} -.benefits a:hover{color:#aaa} -.benefits .mark{color:#777;background:#393939} -.benefits-inner{padding:41px 60px 29px;font-size:15px;line-height:23px;} -.benefits-inner p{margin-bottom:15px} -.benefits-inner ul{margin:-10px 0 15px} -.download{height:63px;text-align:center;} -.download a{display:block;height:60px;font-size:18px;line-height:58px;color:#fff;border-bottom:0 solid #e24f49;background:#e76b66;-webkit-transition:border-bottom .2s;-moz-transition:border-bottom .2s;-ms-transition:border-bottom .2s;-o-transition:border-bottom .2s;transition:border-bottom .2s;} -.download a:before{content:'';display:inline-block;width:26px;height:26px;margin-right:12px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAACYUlEQVR4Xr3VPWhTURjH4VOt0ES7ZRJbEJpsNsaimx9E0GpRCdgU/NhsRAdNBYcK0RirQcSkIIK2cRBRiragVayDhqBDLVWatFvsIKK2UMEp4KBcf8N/KNdwvcHWAw8c/rzvebk5yU2dZVnmf6wVNdb70Ca+5Rrkx0e8E/ZkyzCoAyuxBZu17/jXQV34jjwCytowjUk90Ywyo5q8errcDoriPgpoRhEj6MQrGHmpbARF1RbUG3Uz6Bae4iBacQNNSKEPRi4pa1JNq3pGcds+qNrXu4B1CKKCWtZqlPAZO/72RDGsRdKWh5ATIdOSpHpjbu6ojBfYBiPdOIQeHJMeZd0wsh1jKDsNakEc97AHo8o3IYCz2I1nGMYuZQHVGPXs1RlxtNgH+TCFtBpvIqua40ghqkGdOIp27VOqMcigX8PTKIKzWXwZDDbAQhDG5o6yx2iAkQY80T4HYxOEpbP/uCOnN+wq1Nlq6x3qrWp3NIcKJvAWV+FVzU804i6uwyNZZY34BaOeyzpjQmfOLR70DSGcwyxOIa7mAZzHQ+QxLHllCdUYnMYZzOqsjeBsPbp8QFZ7Lw7gCt4jhGu4qCEGa5SVVWPUM4Yjbn5HfrTjNYzk8AAZ5CSjbBBG3qjXr0CqX+YAviJpy6cQg9NKIoJBN6+gIGbwA16kMY5eeGDEo2xcNV71TCPo5qM7iX14hJIueB4XkICRhLJ51ZTUsx8n3AwawmGE8QUhRDR4J4yElUUQUm1YvUPOfxPO4khj66KL70W/m+Z6uF3P0YdJBRVlZqkHlbEezQo+YWHJB8mC1Lx+Ayeq7nRIoewwAAAAAElFTkSuQmCC");*background-image:url("ie/icon-options.png");vertical-align:middle} -.download a:hover{border-bottom-width:3px} -.license{color:#444;text-align:center;padding:30px 0 75px} -.footer{padding-top:28px;height:60px;color:#666;background:#e2dfd8;} -.footer ul{float:left;} -.footer ul li{float:left;padding:2px 10px 0 0} -.footer ul.local li{padding:0 30px 0 0} -.footer .code{float:right} -.footer a{color:#444;} -.footer a:hover{color:#222} -.footer-inner{width:930px;margin:0 auto;overflow:hidden} -.fork-me{position:fixed;*position:absolute;top:0;right:0;width:40px;height:40px;overflow:hidden;text-indent:100%;white-space:nowrap;background:#28545b url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAnElEQVR4XqVSgQmEMAyszw/gCI7wK7iBblBHcISfxG6gG/gjuIGO0A3ygaYQCCG2HhweF+6aShsAcDcBJBpuvlwFagqGJwUf5EL6kgV2eEe2yIgc9QI73CMPs8AOywI7nHDSzCxYxcnJ6+hrFnQkJrb2nGclP3Fj+vf0IUV1AgCZHiS86lOObxD4qqSD5mtXmAq1e2fB3vqXact3f/JmXumJlVq1AAAAAElFTkSuQmCC") 50% no-repeat;*background-image:url("ie/icon-fork.png");} -.fork-me:hover{background-color:#1f7f5c} -.skin dt,.fork-me{-webkit-transition:background-color .2s;-moz-transition:background-color .2s;-ms-transition:background-color .2s;-o-transition:background-color .2s;transition:background-color .2s} +/* iCheck plugin Square skin, green +----------------------------------- */ +.icheckbox_square-green, +.iradio_square-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-green { + background-position: 0 0; +} +.icheckbox_square-green.hover { + background-position: -24px 0; +} +.icheckbox_square-green.checked { + background-position: -48px 0; +} +.icheckbox_square-green.disabled { + background-position: -72px 0; + cursor: default; +} +.icheckbox_square-green.checked.disabled { + background-position: -96px 0; +} + +.iradio_square-green { + background-position: -120px 0; +} +.iradio_square-green.hover { + background-position: -144px 0; +} +.iradio_square-green.checked { + background-position: -168px 0; +} +.iradio_square-green.disabled { + background-position: -192px 0; + cursor: default; +} +.iradio_square-green.checked.disabled { + background-position: -216px 0; +} + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-green, + .iradio_square-green { + background-image: url(green@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/static/js/plugins/iCheck/icheck.min.js b/static/js/plugins/iCheck/icheck.min.js index 7cdb17e0d..9b826fb7e 100644 --- a/static/js/plugins/iCheck/icheck.min.js +++ b/static/js/plugins/iCheck/icheck.min.js @@ -1,11 +1,11 @@ /*! iCheck v1.0.2 by Damir Sultanov, http://git.io/arlzeA, MIT Licensed */ (function(f){function A(a,b,d){var c=a[0],g=/er/.test(d)?_indeterminate:/bl/.test(d)?n:k,e=d==_update?{checked:c[k],disabled:c[n],indeterminate:"true"==a.attr(_indeterminate)||"false"==a.attr(_determinate)}:c[g];if(/^(ch|di|in)/.test(d)&&!e)x(a,g);else if(/^(un|en|de)/.test(d)&&e)q(a,g);else if(d==_update)for(var f in e)e[f]?x(a,f,!0):q(a,f,!0);else if(!b||"toggle"==d){if(!b)a[_callback]("ifClicked");e?c[_type]!==r&&q(a,g):x(a,g)}}function x(a,b,d){var c=a[0],g=a.parent(),e=b==k,u=b==_indeterminate, -v=b==n,s=u?_determinate:e?y:"enabled",F=l(a,s+t(c[_type])),B=l(a,b+t(c[_type]));if(!0!==c[b]){if(!d&&b==k&&c[_type]==r&&c.name){var w=a.closest("form"),p='input[name="'+c.name+'"]',p=w.length?w.find(p):f(p);p.each(function(){this!==c&&f(this).data(m)&&q(f(this),b)})}u?(c[b]=!0,c[k]&&q(a,k,"force")):(d||(c[b]=!0),e&&c[_indeterminate]&&q(a,_indeterminate,!1));D(a,e,b,d)}c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"default");g[_add](B||l(a,b)||"");g.attr("role")&&!u&&g.attr("aria-"+(v?n:k),"true"); -g[_remove](F||l(a,s)||"")}function q(a,b,d){var c=a[0],g=a.parent(),e=b==k,f=b==_indeterminate,m=b==n,s=f?_determinate:e?y:"enabled",q=l(a,s+t(c[_type])),r=l(a,b+t(c[_type]));if(!1!==c[b]){if(f||!d||"force"==d)c[b]=!1;D(a,e,s,d)}!c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"pointer");g[_remove](r||l(a,b)||"");g.attr("role")&&!f&&g.attr("aria-"+(m?n:k),"false");g[_add](q||l(a,s)||"")}function E(a,b){if(a.data(m)){a.parent().html(a.attr("style",a.data(m).s||""));if(b)a[_callback](b);a.off(".i").unwrap(); -f(_label+'[for="'+a[0].id+'"]').add(a.closest(_label)).off(".i")}}function l(a,b,f){if(a.data(m))return a.data(m).o[b+(f?"":"Class")]}function t(a){return a.charAt(0).toUpperCase()+a.slice(1)}function D(a,b,f,c){if(!c){if(b)a[_callback]("ifToggled");a[_callback]("ifChanged")[_callback]("if"+t(f))}}var m="iCheck",C=m+"-helper",r="radio",k="checked",y="un"+k,n="disabled";_determinate="determinate";_indeterminate="in"+_determinate;_update="update";_type="type";_click="click";_touch="touchbegin.i touchend.i"; -_add="addClass";_remove="removeClass";_callback="trigger";_label="label";_cursor="cursor";_mobile=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);f.fn[m]=function(a,b){var d='input[type="checkbox"], input[type="'+r+'"]',c=f(),g=function(a){a.each(function(){var a=f(this);c=a.is(d)?c.add(a):c.add(a.find(d))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(a))return a=a.toLowerCase(),g(this),c.each(function(){var c= -f(this);"destroy"==a?E(c,"ifDestroyed"):A(c,!0,a);f.isFunction(b)&&b()});if("object"!=typeof a&&a)return this;var e=f.extend({checkedClass:k,disabledClass:n,indeterminateClass:_indeterminate,labelHover:!0},a),l=e.handle,v=e.hoverClass||"hover",s=e.focusClass||"focus",t=e.activeClass||"active",B=!!e.labelHover,w=e.labelHoverClass||"hover",p=(""+e.increaseArea).replace("%","")|0;if("checkbox"==l||l==r)d='input[type="'+l+'"]';-50>p&&(p=-50);g(this);return c.each(function(){var a=f(this);E(a);var c=this, -b=c.id,g=-p+"%",d=100+2*p+"%",d={position:"absolute",top:g,left:g,display:"block",width:d,height:d,margin:0,padding:0,background:"#fff",border:0,opacity:0},g=_mobile?{position:"absolute",visibility:"hidden"}:p?d:{position:"absolute",opacity:0},l="checkbox"==c[_type]?e.checkboxClass||"icheckbox":e.radioClass||"i"+r,z=f(_label+'[for="'+b+'"]').add(a.closest(_label)),u=!!e.aria,y=m+"-"+Math.random().toString(36).substr(2,6),h='
    ")[_callback]("ifCreated").parent().append(e.insert);d=f('').css(d).appendTo(h);a.data(m,{o:e,s:a.attr("style")}).css(g);e.inheritClass&&h[_add](c.className||"");e.inheritID&&b&&h.attr("id",m+"-"+b);"static"==h.css("position")&&h.css("position","relative");A(a,!0,_update);if(z.length)z.on(_click+".i mouseover.i mouseout.i "+_touch,function(b){var d=b[_type],e=f(this);if(!c[n]){if(d==_click){if(f(b.target).is("a"))return; -A(a,!1,!0)}else B&&(/ut|nd/.test(d)?(h[_remove](v),e[_remove](w)):(h[_add](v),e[_add](w)));if(_mobile)b.stopPropagation();else return!1}});a.on(_click+".i focus.i blur.i keyup.i keydown.i keypress.i",function(b){var d=b[_type];b=b.keyCode;if(d==_click)return!1;if("keydown"==d&&32==b)return c[_type]==r&&c[k]||(c[k]?q(a,k):x(a,k)),!1;if("keyup"==d&&c[_type]==r)!c[k]&&x(a,k);else if(/us|ur/.test(d))h["blur"==d?_remove:_add](s)});d.on(_click+" mousedown mouseup mouseover mouseout "+_touch,function(b){var d= -b[_type],e=/wn|up/.test(d)?t:v;if(!c[n]){if(d==_click)A(a,!1,!0);else{if(/wn|er|in/.test(d))h[_add](e);else h[_remove](e+" "+t);if(z.length&&B&&e==v)z[/ut|nd/.test(d)?_remove:_add](w)}if(_mobile)b.stopPropagation();else return!1}})})}})(window.jQuery||window.Zepto); + v=b==n,s=u?_determinate:e?y:"enabled",F=l(a,s+t(c[_type])),B=l(a,b+t(c[_type]));if(!0!==c[b]){if(!d&&b==k&&c[_type]==r&&c.name){var w=a.closest("form"),p='input[name="'+c.name+'"]',p=w.length?w.find(p):f(p);p.each(function(){this!==c&&f(this).data(m)&&q(f(this),b)})}u?(c[b]=!0,c[k]&&q(a,k,"force")):(d||(c[b]=!0),e&&c[_indeterminate]&&q(a,_indeterminate,!1));D(a,e,b,d)}c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"default");g[_add](B||l(a,b)||"");g.attr("role")&&!u&&g.attr("aria-"+(v?n:k),"true"); + g[_remove](F||l(a,s)||"")}function q(a,b,d){var c=a[0],g=a.parent(),e=b==k,f=b==_indeterminate,m=b==n,s=f?_determinate:e?y:"enabled",q=l(a,s+t(c[_type])),r=l(a,b+t(c[_type]));if(!1!==c[b]){if(f||!d||"force"==d)c[b]=!1;D(a,e,s,d)}!c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"pointer");g[_remove](r||l(a,b)||"");g.attr("role")&&!f&&g.attr("aria-"+(m?n:k),"false");g[_add](q||l(a,s)||"")}function E(a,b){if(a.data(m)){a.parent().html(a.attr("style",a.data(m).s||""));if(b)a[_callback](b);a.off(".i").unwrap(); + f(_label+'[for="'+a[0].id+'"]').add(a.closest(_label)).off(".i")}}function l(a,b,f){if(a.data(m))return a.data(m).o[b+(f?"":"Class")]}function t(a){return a.charAt(0).toUpperCase()+a.slice(1)}function D(a,b,f,c){if(!c){if(b)a[_callback]("ifToggled");a[_callback]("ifChanged")[_callback]("if"+t(f))}}var m="iCheck",C=m+"-helper",r="radio",k="checked",y="un"+k,n="disabled";_determinate="determinate";_indeterminate="in"+_determinate;_update="update";_type="type";_click="click";_touch="touchbegin.i touchend.i"; + _add="addClass";_remove="removeClass";_callback="trigger";_label="label";_cursor="cursor";_mobile=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);f.fn[m]=function(a,b){var d='input[type="checkbox"], input[type="'+r+'"]',c=f(),g=function(a){a.each(function(){var a=f(this);c=a.is(d)?c.add(a):c.add(a.find(d))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(a))return a=a.toLowerCase(),g(this),c.each(function(){var c= + f(this);"destroy"==a?E(c,"ifDestroyed"):A(c,!0,a);f.isFunction(b)&&b()});if("object"!=typeof a&&a)return this;var e=f.extend({checkedClass:k,disabledClass:n,indeterminateClass:_indeterminate,labelHover:!0},a),l=e.handle,v=e.hoverClass||"hover",s=e.focusClass||"focus",t=e.activeClass||"active",B=!!e.labelHover,w=e.labelHoverClass||"hover",p=(""+e.increaseArea).replace("%","")|0;if("checkbox"==l||l==r)d='input[type="'+l+'"]';-50>p&&(p=-50);g(this);return c.each(function(){var a=f(this);E(a);var c=this, + b=c.id,g=-p+"%",d=100+2*p+"%",d={position:"absolute",top:g,left:g,display:"block",width:d,height:d,margin:0,padding:0,background:"#fff",border:0,opacity:0},g=_mobile?{position:"absolute",visibility:"hidden"}:p?d:{position:"absolute",opacity:0},l="checkbox"==c[_type]?e.checkboxClass||"icheckbox":e.radioClass||"i"+r,z=f(_label+'[for="'+b+'"]').add(a.closest(_label)),u=!!e.aria,y=m+"-"+Math.random().toString(36).substr(2,6),h='
    ")[_callback]("ifCreated").parent().append(e.insert);d=f('').css(d).appendTo(h);a.data(m,{o:e,s:a.attr("style")}).css(g);e.inheritClass&&h[_add](c.className||"");e.inheritID&&b&&h.attr("id",m+"-"+b);"static"==h.css("position")&&h.css("position","relative");A(a,!0,_update);if(z.length)z.on(_click+".i mouseover.i mouseout.i "+_touch,function(b){var d=b[_type],e=f(this);if(!c[n]){if(d==_click){if(f(b.target).is("a"))return; + A(a,!1,!0)}else B&&(/ut|nd/.test(d)?(h[_remove](v),e[_remove](w)):(h[_add](v),e[_add](w)));if(_mobile)b.stopPropagation();else return!1}});a.on(_click+".i focus.i blur.i keyup.i keydown.i keypress.i",function(b){var d=b[_type];b=b.keyCode;if(d==_click)return!1;if("keydown"==d&&32==b)return c[_type]==r&&c[k]||(c[k]?q(a,k):x(a,k)),!1;if("keyup"==d&&c[_type]==r)!c[k]&&x(a,k);else if(/us|ur/.test(d))h["blur"==d?_remove:_add](s)});d.on(_click+" mousedown mouseup mouseover mouseout "+_touch,function(b){var d= + b[_type],e=/wn|up/.test(d)?t:v;if(!c[n]){if(d==_click)A(a,!1,!0);else{if(/wn|er|in/.test(d))h[_add](e);else h[_remove](e+" "+t);if(z.length&&B&&e==v)z[/ut|nd/.test(d)?_remove:_add](w)}if(_mobile)b.stopPropagation();else return!1}})})}})(window.jQuery||window.Zepto); From c782b46f325d8e872547f4fdb1dc15c9a5e02b4e Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Tue, 27 Jan 2015 17:24:33 +0800 Subject: [PATCH 23/39] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juser/views.py | 10 ++++++++++ templates/juser/user_add.html | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/juser/views.py b/juser/views.py index 0b1077731..04481d089 100644 --- a/juser/views.py +++ b/juser/views.py @@ -121,6 +121,15 @@ def group_db_add(**kwargs): UserGroup.objects.create(**kwargs) +def user_group_add(username, group_name): + user = User.objects.get(username=username) + group = UserGroup.objects.get(name=group_name) + groups = [group] + for g in user.user_group.all(): + groups.append(g) + user.user_group = groups + + def group_add(request): error = '' msg = '' @@ -461,6 +470,7 @@ def user_add(request): server_add_user(username, password, ssh_key_pwd1) group_db_add(name=username, comment=username, type='U') + user_group_add(username=username, group_name=username) if LDAP_ENABLE: ldap_add_user(username, ldap_pwd) msg = u'添加用户 %s 成功!' % username diff --git a/templates/juser/user_add.html b/templates/juser/user_add.html index 5b1390e96..1c11825bb 100644 --- a/templates/juser/user_add.html +++ b/templates/juser/user_add.html @@ -168,13 +168,13 @@ $('#userForm').validator({ msg: {required: "必须填写!"} }, "password": { - rule: "required;length[6~16]", + rule: "required;length[6~50]", tip: "输入密码", ok: "", msg: {required: "必须填写!"} }, "ssh_key_pwd1": { - rule: "required;length[6~16]", + rule: "required;length[6~50]", tip: "ssh私钥密码", ok: "", msg: {required: "必须填写"} From 3c8a9bab0cb09916c40fe42e8d69b7c651b0a241 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Tue, 27 Jan 2015 17:30:20 +0800 Subject: [PATCH 24/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juser/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/juser/views.py b/juser/views.py index 04481d089..b110d9b10 100644 --- a/juser/views.py +++ b/juser/views.py @@ -245,6 +245,8 @@ def user_del(request): return HttpResponseRedirect('/') user = User.objects.get(id=user_id) user.delete() + group = UserGroup.objects.get(name=user.username) + group.delete() return HttpResponseRedirect('/juser/user_list/', locals()) From 047dda5ab3eddd5b5d258eaff390e58b6a9bf97b Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Tue, 27 Jan 2015 17:56:51 +0800 Subject: [PATCH 25/39] =?UTF-8?q?=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E7=9A=84group?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 4 +++- juser/views.py | 4 ---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index dedb756cc..1ade513fc 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -2,7 +2,7 @@ import time from django import template -from juser.models import User +from juser.models import User, UserGroup register = template.Library() @@ -31,8 +31,10 @@ def get_role(user_id): def groups_str(username): groups = [] user = User.objects.get(username=username) + group_default = UserGroup.objects.get(name=username) for group in user.user_group.all(): groups.append(group.name) + groups.remove(group_default) return ','.join(groups) @register.filter(name='get_item') diff --git a/juser/views.py b/juser/views.py index b110d9b10..d8c709ced 100644 --- a/juser/views.py +++ b/juser/views.py @@ -143,15 +143,11 @@ def group_add(request): if not group_name: error = u'组名不能为空' raise AddError - group_db_add(name=group_name, comment=comment, type='M') - except AddError: pass - except TypeError: error = u'保存用户失败' - else: msg = u'添加组 %s 成功' % group_name From c04237ac76e63dd33291903a80058f479f075607 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Tue, 27 Jan 2015 18:02:51 +0800 Subject: [PATCH 26/39] =?UTF-8?q?=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E7=9A=84group?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 1ade513fc..f0223bed1 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -34,9 +34,11 @@ def groups_str(username): group_default = UserGroup.objects.get(name=username) for group in user.user_group.all(): groups.append(group.name) - groups.remove(group_default) + if group_default in groups: + groups.remove(group_default) return ','.join(groups) + @register.filter(name='get_item') def get_item(dictionary, key): return dictionary.get(key) From 308379406a2dd5b8d439e648a8d74a3d81c679d0 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Tue, 27 Jan 2015 18:05:53 +0800 Subject: [PATCH 27/39] =?UTF-8?q?=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E7=9A=84group?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index f0223bed1..3d8d56d35 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -31,11 +31,8 @@ def get_role(user_id): def groups_str(username): groups = [] user = User.objects.get(username=username) - group_default = UserGroup.objects.get(name=username) - for group in user.user_group.all(): + for group in user.user_group.filter(type='M'): groups.append(group.name) - if group_default in groups: - groups.remove(group_default) return ','.join(groups) From 2254e82bf0f916c14994453d5120e179e25260da Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Tue, 27 Jan 2015 18:53:37 +0800 Subject: [PATCH 28/39] =?UTF-8?q?=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E7=9A=84group?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juser/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/juser/views.py b/juser/views.py index d8c709ced..60cbf3f1a 100644 --- a/juser/views.py +++ b/juser/views.py @@ -259,7 +259,7 @@ def user_edit(request): ssh_key_pwd1 = user.ssh_key_pwd1 name = user.name all_group = UserGroup.objects.all() - groups = user.user_group.all() + groups = user.user_group.filter(type='M') groups_str = ' '.join([str(group.id) for group in groups]) user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} role_post = user.role From 5d38a1996cb91ceed060bd70645255474f4d1067 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Wed, 28 Jan 2015 11:17:29 +0800 Subject: [PATCH 29/39] =?UTF-8?q?=E4=BB=8E=E8=B7=B3=E6=9D=BF=E6=9C=BA?= =?UTF-8?q?=E5=88=B0=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=9A=84=E5=AF=86=E9=92=A5?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juser/models.py | 8 ++++---- juser/views.py | 22 +++++++++++----------- static/css/style.css | 2 +- templates/juser/user_add.html | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/juser/models.py b/juser/models.py index 4426a3b17..3c4167db5 100644 --- a/juser/models.py +++ b/juser/models.py @@ -3,8 +3,9 @@ from django.db import models class UserGroup(models.Model): GROUP_TYPE_CHOICES = ( - ('U', 'UniqueUserGroup'), - ('M', 'ManyUserGroup') + ('P', 'PrivateGroup'), + ('M', 'ManageGroup'), + ('A', 'AuthorizeGroup'), ) name = models.CharField(max_length=80, unique=True) @@ -28,8 +29,7 @@ class User(models.Model): role = models.CharField(max_length=2, choices=USER_ROLE_CHOICES, default='CU') user_group = models.ManyToManyField(UserGroup) ldap_pwd = models.CharField(max_length=100) - ssh_key_pwd1 = models.CharField(max_length=100) - ssh_key_pwd2 = models.CharField(max_length=100) + ssh_key_pwd = models.CharField(max_length=100) ssh_pwd = models.CharField(max_length=100) is_active = models.BooleanField(default=True) last_login = models.IntegerField(default=0) diff --git a/juser/views.py b/juser/views.py index 60cbf3f1a..879b31421 100644 --- a/juser/views.py +++ b/juser/views.py @@ -256,7 +256,7 @@ def user_edit(request): user = User.objects.get(id=user_id) username = user.username password = user.password - ssh_key_pwd1 = user.ssh_key_pwd1 + ssh_key_pwd = user.ssh_key_pwd name = user.name all_group = UserGroup.objects.all() groups = user.user_group.filter(type='M') @@ -275,7 +275,7 @@ def user_edit(request): 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) + ssh_key_pwd = request.POST.get('ssh_key_pwd', None) is_active = request.POST.get('is_active', '1') ldap_pwd = gen_rand_pwd(16) all_group = UserGroup.objects.all() @@ -292,8 +292,8 @@ def user_edit(request): 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) + if ssh_key_pwd != user.ssh_key_pwd: + ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd) db_update_user(username=username, password=password, @@ -302,7 +302,7 @@ def user_edit(request): groups=groups, role=role_post, ssh_pwd=ssh_pwd, - ssh_key_pwd1=ssh_key_pwd1) + ssh_key_pwd=ssh_key_pwd) msg = u'修改用户成功' return HttpResponseRedirect('/juser/user_list/') @@ -363,9 +363,9 @@ def gen_ssh_key(username, password=None, length=2048): bash('chown %s:%s %s' % (username, username, public_key_file)) -def server_add_user(username, password, ssh_key_pwd1): +def server_add_user(username, password, ssh_key_pwd): bash('useradd %s; echo %s | passwd --stdin %s' % (username, password, username)) - gen_ssh_key(username, ssh_key_pwd1) + gen_ssh_key(username, ssh_key_pwd) def server_del_user(username): @@ -438,12 +438,12 @@ def user_add(request): 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) + ssh_key_pwd = request.POST.get('ssh_key_pwd', None) is_active = request.POST.get('is_active', '1') ldap_pwd = gen_rand_pwd(16) try: - if None in [username, password, ssh_key_pwd1, name, groups, role_post, is_active]: + if None in [username, password, ssh_key_pwd, name, groups, role_post, is_active]: error = u'带*内容不能为空' raise AddError user = User.objects.filter(username=username) @@ -461,12 +461,12 @@ def user_add(request): name=name, email=email, groups=groups, role=role_post, ssh_pwd=CRYPTOR.encrypt(ssh_pwd), - ssh_key_pwd1=CRYPTOR.encrypt(ssh_key_pwd1), + ssh_key_pwd=CRYPTOR.encrypt(ssh_key_pwd), ldap_pwd=CRYPTOR.encrypt(ldap_pwd), is_active=is_active, date_joined=time_now) - server_add_user(username, password, ssh_key_pwd1) + server_add_user(username, password, ssh_key_pwd) group_db_add(name=username, comment=username, type='U') user_group_add(username=username, group_name=username) if LDAP_ENABLE: diff --git a/static/css/style.css b/static/css/style.css index 28ced9696..b80d0bb47 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -2577,7 +2577,7 @@ a.forum-item-title:hover { padding-right: 20px !important; } body { - font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "open sans", "Helvetica Neue", Helvetica, Arial, "微软雅黑", sans-serif; background-color: #2f4050; font-size: 13px; color: #676a6c; diff --git a/templates/juser/user_add.html b/templates/juser/user_add.html index 1c11825bb..d2c0705c8 100644 --- a/templates/juser/user_add.html +++ b/templates/juser/user_add.html @@ -56,7 +56,7 @@
    - + 登陆 Jumpserver 使用的SSH密钥的密码 From 5cd09a6503295de440cee9631c50b57b2a1cf3b9 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Wed, 28 Jan 2015 15:08:16 +0800 Subject: [PATCH 30/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BB=84=E6=97=B6=E6=B7=BB=E5=8A=A0=E6=88=90=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 22 +++-- juser/models.py | 2 +- juser/views.py | 51 +++++++---- templates/jperm/perm_user_edit.html | 13 --- templates/juser/group_add.html | 64 +++++++++++++- templates/juser/group_detail.html | 23 +++-- templates/juser/group_list.html | 4 +- templates/juser/user_add.html | 6 +- templates/juser/user_list.html | 2 - templates/juser/user_list1.html | 130 ---------------------------- templates/script.html | 19 +++- 11 files changed, 152 insertions(+), 184 deletions(-) delete mode 100644 templates/juser/user_list1.html diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 3d8d56d35..0352e7e1e 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -2,7 +2,8 @@ import time from django import template -from juser.models import User, UserGroup +from django.db.models import Q +from juser.models import User register = template.Library() @@ -24,16 +25,16 @@ def int2str(value): def get_role(user_id): user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} user = User.objects.get(id=user_id) - return user_role.get(user.role) + return user_role.get(str(user.role)) @register.filter(name='groups_str') def groups_str(username): groups = [] user = User.objects.get(username=username) - for group in user.user_group.filter(type='M'): + for group in user.user_group.filter(Q(type='A') | Q(type='M')): groups.append(group.name) - return ','.join(groups) + return ' '.join(groups) @register.filter(name='get_item') @@ -52,4 +53,15 @@ def bool2str(value): @register.filter(name='perm_count') def perm_count(user_id): user = User.objects.get(id=int(user_id)) - return user.perm_set.all().count() \ No newline at end of file + return user.perm_set.all().count() + + +@register.filter(name='group_type_to_str') +def group_type_to_str(type_name): + group_types = { + 'P': '私有组', + 'M': '管理组', + 'A': '授权组', + } + + return group_types.get(type_name) diff --git a/juser/models.py b/juser/models.py index 3c4167db5..67fe6de30 100644 --- a/juser/models.py +++ b/juser/models.py @@ -9,7 +9,7 @@ class UserGroup(models.Model): ) name = models.CharField(max_length=80, unique=True) - type = models.CharField(max_length=1, choices=GROUP_TYPE_CHOICES, default='U') + type = models.CharField(max_length=1, choices=GROUP_TYPE_CHOICES, default='P') comment = models.CharField(max_length=160, blank=True, null=True) def __unicode__(self): diff --git a/juser/views.py b/juser/views.py index 879b31421..0f4969af5 100644 --- a/juser/views.py +++ b/juser/views.py @@ -15,6 +15,7 @@ from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Q from juser.models import UserGroup, User from connect import PyCrypt, KEY @@ -117,37 +118,57 @@ def group_db_add(**kwargs): group_name = kwargs.get('name') group = UserGroup.objects.filter(name=group_name) if group: - raise AddError + raise AddError('Group %s have been exist .' % group_name) UserGroup.objects.create(**kwargs) -def user_group_add(username, group_name): - user = User.objects.get(username=username) +def add_user_to_group(username, group_name): + try: + user = User.objects.get(username=username) + group = UserGroup.objects.get(name=group_name) + except ObjectDoesNotExist: + raise AddError('User %s or group % does not exit. ' % username, group_name) + else: + groups = [group] + for g in user.user_group.all(): + groups.append(g) + user.user_group = groups + + +def group_add_user(group_name, user_id): group = UserGroup.objects.get(name=group_name) - groups = [group] - for g in user.user_group.all(): - groups.append(g) - user.user_group = groups + user = User.objects.get(id=user_id) + group.user_set.add(user) def group_add(request): error = '' msg = '' header_title, path1, path2 = '添加属组 | Add Group', 'juser', 'group_add' - + group_types = { + 'P': '私有组', + 'M': '管理组', + 'A': '授权组', + } + users = User.objects.all() if request.method == 'POST': - group_name = request.POST.get('group_name', None) - comment = request.POST.get('comment', None) + group_name = request.POST.get('group_name', '') + group_type = request.POST.get('group_type', 'A') + users_selected = request.POST.getlist('users_selected', '') + comment = request.POST.get('comment', '') try: if not group_name: error = u'组名不能为空' raise AddError - group_db_add(name=group_name, comment=comment, type='M') + group_db_add(name=group_name, comment=comment, type=group_type) + for user_id in users_selected: + group_add_user(group_name, user_id) + except AddError: pass except TypeError: - error = u'保存用户失败' + error = u'保存用户组失败' else: msg = u'添加组 %s 成功' % group_name @@ -156,7 +177,7 @@ def group_add(request): def group_list(request): header_title, path1, path2 = '查看属组 | Show Group', 'juser', 'group_list' - groups = contact_list = UserGroup.objects.filter(type='M').order_by('id') + groups = contact_list = UserGroup.objects.filter(Q(type='M') | Q(type='A')).order_by('id') p = paginator = Paginator(contact_list, 10) try: @@ -467,8 +488,8 @@ def user_add(request): date_joined=time_now) server_add_user(username, password, ssh_key_pwd) - group_db_add(name=username, comment=username, type='U') - user_group_add(username=username, group_name=username) + group_db_add(name=username, comment=username, type='P') + add_user_to_group(username=username, group_name=username) if LDAP_ENABLE: ldap_add_user(username, ldap_pwd) msg = u'添加用户 %s 成功!' % username diff --git a/templates/jperm/perm_user_edit.html b/templates/jperm/perm_user_edit.html index 1ce00ec94..00cc85e73 100644 --- a/templates/jperm/perm_user_edit.html +++ b/templates/jperm/perm_user_edit.html @@ -4,19 +4,6 @@ {% block content %} {% endblock %} \ No newline at end of file diff --git a/templates/juser/group_detail.html b/templates/juser/group_detail.html index 9b906ccc0..46c205d07 100644 --- a/templates/juser/group_detail.html +++ b/templates/juser/group_detail.html @@ -20,23 +20,22 @@ - - + + + + {% for user in users %} - - - - - - - - - - + + + + {% endfor %} + + +
    属组详情用户名姓名角色
    ID{{ group.id }}
    组名{{ group.name }}
    备注{{ group_comment }}{{ user.username }}{{ user.name }}{{ user.id|get_role }}
    diff --git a/templates/juser/group_list.html b/templates/juser/group_list.html index 086dd43d2..89f1f0f83 100644 --- a/templates/juser/group_list.html +++ b/templates/juser/group_list.html @@ -39,6 +39,7 @@ ID 组名 + 类型 备注 操作 @@ -49,9 +50,10 @@ {{ group.id }} {{ group.name }} + {{ group.type|group_type_to_str }} {{ group.comment }} - 详情 + 成员 编辑 删除 diff --git a/templates/juser/user_add.html b/templates/juser/user_add.html index d2c0705c8..9bf685edc 100644 --- a/templates/juser/user_add.html +++ b/templates/juser/user_add.html @@ -54,9 +54,9 @@
    - +
    - + 登陆 Jumpserver 使用的SSH密钥的密码 @@ -173,7 +173,7 @@ $('#userForm').validator({ ok: "", msg: {required: "必须填写!"} }, - "ssh_key_pwd1": { + "ssh_key_pwd": { rule: "required;length[6~50]", tip: "ssh私钥密码", ok: "", diff --git a/templates/juser/user_list.html b/templates/juser/user_list.html index 18e222aa6..4c10d996e 100644 --- a/templates/juser/user_list.html +++ b/templates/juser/user_list.html @@ -44,7 +44,6 @@ 姓名 属组 角色 - Email 激活 操作 @@ -60,7 +59,6 @@ {{ user.name }} {{ user.username|groups_str }} {{ user.id|get_role }} - {{ user.email }} {{ user.is_active|bool2str }} 详情 diff --git a/templates/juser/user_list1.html b/templates/juser/user_list1.html deleted file mode 100644 index 6c8f2cdad..000000000 --- a/templates/juser/user_list1.html +++ /dev/null @@ -1,130 +0,0 @@ -{% extends 'base.html' %} -{% load mytags %} -{% block content %} -{% include 'nav_cat_bar.html' %} - -
    -
    -
    -
    -
    -
    查看用户 show user info.
    - -
    - -
    - - - - - - - - - - - - - - - - - - {% for user in contacts.object_list %} - - - - - - - - - - - - {% endfor %} - -
    ID用户名姓名属组角色Email激活操作
    {{ user.id }} {{ user.username }} {{ user.name }} {{ user.username|groups_str }}{{ user.id|get_role }}{{ user.email }}{{ user.is_active|bool2str }} - 详情 - 编辑 - 删除 -
    -
    -
    -
    - Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries -
    -
    -
    -
    -
      - {% if contacts.has_previous %} - - {% else %} - - {% endif %} - {% for page in p.page_range %} - {% ifequal offset1 page %} -
    • {{ page }}
    • - {% else %} -
    • {{ page }}
    • - {% endifequal %} - {% endfor %} - {% if contacts.has_next %} - - {% else %} - - {% endif %} -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/script.html b/templates/script.html index 8857cc21d..b42ddd171 100644 --- a/templates/script.html +++ b/templates/script.html @@ -21,7 +21,7 @@ $(document).ready(function(){ $('.i-checks').iCheck({ checkboxClass: 'icheckbox_square-green', - radioClass: 'iradio_square-green', + radioClass: 'iradio_square-green' }); }); @@ -42,9 +42,26 @@ } + function move(from, to) { + $("#"+from+" option").each(function(){ + if ( $(this).prop("selected") == true ) { + $("#"+to).append(this); + } + }); + } + + function move_all(from, to){ + $("#"+from).children().each(function(){ + $("#"+to).append(this); + }); + } + + + + From 6a8db896149c7aac4b46d8e90a54107b96aa230c Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Wed, 28 Jan 2015 17:35:06 +0800 Subject: [PATCH 31/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E4=B8=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver.conf | 6 +- jumpserver/templatetags/mytags.py | 9 +- juser/views.py | 415 +++++++++++++++--------------- templates/juser/group_list.html | 4 +- templates/juser/user_add.html | 10 +- templates/juser/user_detail.html | 5 +- 6 files changed, 221 insertions(+), 228 deletions(-) diff --git a/jumpserver.conf b/jumpserver.conf index 18364c398..3a7d59784 100644 --- a/jumpserver.conf +++ b/jumpserver.conf @@ -8,11 +8,7 @@ password = mysql234 database = jumpserver [ldap] -host_url = ldap://192.168.8.60:389 -base_dn = dc=fengxing,dc=org -root_dn = cn=admin,dc=fengxing,dc=org -root_pw = 123456 -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 diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 0352e7e1e..88e709546 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -3,7 +3,7 @@ import time from django import template from django.db.models import Q -from juser.models import User +from juser.models import User, UserGroup register = template.Library() @@ -56,6 +56,12 @@ def perm_count(user_id): return user.perm_set.all().count() +@register.filter(name='member_count') +def member_count(group_id): + group = UserGroup.objects.get(id=group_id) + return group.user_set.count() + + @register.filter(name='group_type_to_str') def group_type_to_str(type_name): group_types = { @@ -63,5 +69,4 @@ def group_type_to_str(type_name): 'M': '管理组', 'A': '授权组', } - return group_types.get(type_name) diff --git a/juser/views.py b/juser/views.py index 0f4969af5..2dd3c625b 100644 --- a/juser/views.py +++ b/juser/views.py @@ -122,213 +122,17 @@ def group_db_add(**kwargs): UserGroup.objects.create(**kwargs) -def add_user_to_group(username, group_name): +def group_add_user(group_name, user_id=None, username=None): try: - user = User.objects.get(username=username) - group = UserGroup.objects.get(name=group_name) - except ObjectDoesNotExist: - raise AddError('User %s or group % does not exit. ' % username, group_name) - else: - groups = [group] - for g in user.user_group.all(): - groups.append(g) - user.user_group = groups - - -def group_add_user(group_name, user_id): - group = UserGroup.objects.get(name=group_name) - user = User.objects.get(id=user_id) - group.user_set.add(user) - - -def group_add(request): - error = '' - msg = '' - header_title, path1, path2 = '添加属组 | Add Group', 'juser', 'group_add' - group_types = { - 'P': '私有组', - 'M': '管理组', - 'A': '授权组', - } - users = User.objects.all() - if request.method == 'POST': - group_name = request.POST.get('group_name', '') - group_type = request.POST.get('group_type', 'A') - users_selected = request.POST.getlist('users_selected', '') - comment = request.POST.get('comment', '') - - try: - if not group_name: - error = u'组名不能为空' - raise AddError - group_db_add(name=group_name, comment=comment, type=group_type) - for user_id in users_selected: - group_add_user(group_name, user_id) - - except AddError: - pass - except TypeError: - error = u'保存用户组失败' + if user_id: + user = User.objects.get(id=user_id) else: - msg = u'添加组 %s 成功' % group_name - - return render_to_response('juser/group_add.html', locals()) - - -def group_list(request): - header_title, path1, path2 = '查看属组 | Show Group', 'juser', 'group_list' - groups = contact_list = UserGroup.objects.filter(Q(type='M') | Q(type='A')).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/group_list.html', locals()) - - -def group_detail(request): - group_id = request.GET.get('id', None) - if not group_id: - return HttpResponseRedirect('/') - group = UserGroup.objects.get(id=group_id) - return render_to_response('juser/group_detail.html', locals()) - - -def group_del(request): - group_id = request.GET.get('id', None) - if not group_id: - return HttpResponseRedirect('/') - group = UserGroup.objects.get(id=group_id) - group.delete() - return HttpResponseRedirect('/juser/group_list/', locals()) - - -def group_edit(request): - error = '' - msg = '' - header_title, path1, path2 = '修改属组 | Edit Group', 'juser', 'group_edit' - if request.method == 'GET': - group_id = request.GET.get('id', None) - group = UserGroup.objects.get(id=group_id) - group_name = group.name - comment = group.comment - - return render_to_response('juser/group_add.html', locals()) - else: - group_id = request.POST.get('group_id', None) - group_name = request.POST.get('group_name', None) - comment = request.POST.get('comment', '') - group = UserGroup.objects.filter(id=group_id) - group.update(name=group_name, comment=comment) - - return HttpResponseRedirect('/juser/group_list/') - - -def user_list(request): - user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} - 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): - user_id = request.GET.get('id', None) - if not user_id: - return HttpResponseRedirect('/') - user = User.objects.get(id=user_id) - return render_to_response('juser/user_detail.html', locals()) - - -def user_del(request): - user_id = request.GET.get('id', None) - if not user_id: - return HttpResponseRedirect('/') - user = User.objects.get(id=user_id) - user.delete() - group = UserGroup.objects.get(name=user.username) - group.delete() - return HttpResponseRedirect('/juser/user_list/', locals()) - - -def user_edit(request): - header_title, path1, path2 = '编辑用户 | Edit User', 'juser', 'user_edit' - readonly = "readonly" - if request.method == 'GET': - user_id = request.GET.get('id', None) - if not user_id: - return HttpResponseRedirect('/') - user = User.objects.get(id=user_id) - username = user.username - password = user.password - ssh_key_pwd = user.ssh_key_pwd - name = user.name - all_group = UserGroup.objects.all() - groups = user.user_group.filter(type='M') - 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_pwd = request.POST.get('ssh_key_pwd', 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_pwd != user.ssh_key_pwd: - ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd) - - db_update_user(username=username, - password=password, - name=name, - email=email, - groups=groups, - role=role_post, - ssh_pwd=ssh_pwd, - ssh_key_pwd=ssh_key_pwd) - msg = u'修改用户成功' - - return HttpResponseRedirect('/juser/user_list/') - - return render_to_response('juser/user_add.html', locals()) + except ObjectDoesNotExist: + raise AddError('用户获取失败') + else: + group = UserGroup.objects.get(name=group_name) + group.user_set.add(user) def db_add_user(**kwargs): @@ -444,13 +248,154 @@ def ldap_del_user(username): ldap_conn.delete(sudo_dn) -def user_add(request): +def group_add(request): error = '' msg = '' - header_title, path1, path2 = '添加用户 | Add User', 'juser', 'user_add' - user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} - all_group = UserGroup.objects.filter(type='M') + header_title, path1, path2 = '添加属组 | Add Group', 'juser', 'group_add' + group_types = { + 'P': '私有组', + 'M': '管理组', + 'A': '授权组', + } + users = User.objects.all() if request.method == 'POST': + group_name = request.POST.get('group_name', '') + group_type = request.POST.get('group_type', 'A') + users_selected = request.POST.getlist('users_selected', '') + comment = request.POST.get('comment', '') + + try: + if not group_name: + error = u'组名不能为空' + raise AddError + group_db_add(name=group_name, comment=comment, type=group_type) + for user_id in users_selected: + group_add_user(group_name, user_id=user_id) + + except AddError: + pass + except TypeError: + error = u'保存用户组失败' + else: + msg = u'添加组 %s 成功' % group_name + + return render_to_response('juser/group_add.html', locals()) + + +def group_list(request): + header_title, path1, path2 = '查看属组 | Show Group', 'juser', 'group_list' + groups = contact_list = UserGroup.objects.filter(Q(type='M') | Q(type='A')).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/group_list.html', locals()) + + +def group_detail(request): + group_id = request.GET.get('id', None) + if not group_id: + return HttpResponseRedirect('/') + group = UserGroup.objects.get(id=group_id) + users = group.user_set.all() + return render_to_response('juser/group_detail.html', locals()) + + +def group_del(request): + group_id = request.GET.get('id', None) + if not group_id: + return HttpResponseRedirect('/') + group = UserGroup.objects.get(id=group_id) + group.delete() + return HttpResponseRedirect('/juser/group_list/', locals()) + + +def group_edit(request): + error = '' + msg = '' + header_title, path1, path2 = '修改属组 | Edit Group', 'juser', 'group_edit' + if request.method == 'GET': + group_id = request.GET.get('id', None) + group = UserGroup.objects.get(id=group_id) + group_name = group.name + comment = group.comment + + return render_to_response('juser/group_add.html', locals()) + else: + group_id = request.POST.get('group_id', None) + group_name = request.POST.get('group_name', None) + comment = request.POST.get('comment', '') + group = UserGroup.objects.filter(id=group_id) + group.update(name=group_name, comment=comment) + + return HttpResponseRedirect('/juser/group_list/') + + +def user_list(request): + user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} + 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): + user_id = request.GET.get('id', None) + if not user_id: + return HttpResponseRedirect('/') + user = User.objects.get(id=user_id) + return render_to_response('juser/user_detail.html', locals()) + + +def user_del(request): + user_id = request.GET.get('id', None) + if not user_id: + return HttpResponseRedirect('/') + user = User.objects.get(id=user_id) + user.delete() + group = UserGroup.objects.get(name=user.username) + group.delete() + return HttpResponseRedirect('/juser/user_list/', locals()) + + +def user_edit(request): + header_title, path1, path2 = '编辑用户 | Edit User', 'juser', 'user_edit' + readonly = "readonly" + if request.method == 'GET': + user_id = request.GET.get('id', None) + if not user_id: + return HttpResponseRedirect('/') + user = User.objects.get(id=user_id) + username = user.username + password = user.password + ssh_key_pwd = user.ssh_key_pwd + name = user.name + all_group = UserGroup.objects.filter(Q(type='M') | Q(type='A')) + groups = user.user_group.filter(Q(type='M') | Q(type='A')) + 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) @@ -462,6 +407,56 @@ def user_add(request): ssh_key_pwd = request.POST.get('ssh_key_pwd', None) is_active = request.POST.get('is_active', '1') ldap_pwd = gen_rand_pwd(16) + all_group = UserGroup.objects.filter(Q(type='M') | Q(type='A')) + 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_pwd != user.ssh_key_pwd: + ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd) + + db_update_user(username=username, + password=password, + name=name, + email=email, + groups=groups, + role=role_post, + ssh_pwd=ssh_pwd, + ssh_key_pwd=ssh_key_pwd) + msg = u'修改用户成功' + + return HttpResponseRedirect('/juser/user_list/') + + return render_to_response('juser/user_add.html', locals()) + + +def user_add(request): + error = '' + msg = '' + header_title, path1, path2 = '添加用户 | Add User', 'juser', 'user_add' + user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} + all_group = UserGroup.objects.filter(Q(type='M') | Q(type='A')).order_by('-type') + if request.method == 'POST': + username = request.POST.get('username', None) + password = request.POST.get('password', '') + 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', 'CU') + ssh_pwd = request.POST.get('ssh_pwd', '') + ssh_key_pwd = request.POST.get('ssh_key_pwd', '') + is_active = request.POST.get('is_active', '1') + ldap_pwd = gen_rand_pwd(16) try: if None in [username, password, ssh_key_pwd, name, groups, role_post, is_active]: @@ -481,7 +476,7 @@ def user_add(request): password=md5_crypt(password), name=name, email=email, groups=groups, role=role_post, - ssh_pwd=CRYPTOR.encrypt(ssh_pwd), + ssh_pwd=CRYPTOR.encrypt(ssh_pwd) if ssh_pwd else '', ssh_key_pwd=CRYPTOR.encrypt(ssh_key_pwd), ldap_pwd=CRYPTOR.encrypt(ldap_pwd), is_active=is_active, @@ -489,7 +484,7 @@ def user_add(request): server_add_user(username, password, ssh_key_pwd) group_db_add(name=username, comment=username, type='P') - add_user_to_group(username=username, group_name=username) + group_add_user(group_name=username, username=username) if LDAP_ENABLE: ldap_add_user(username, ldap_pwd) msg = u'添加用户 %s 成功!' % username diff --git a/templates/juser/group_list.html b/templates/juser/group_list.html index 89f1f0f83..0a045d8f7 100644 --- a/templates/juser/group_list.html +++ b/templates/juser/group_list.html @@ -36,10 +36,10 @@ - + @@ -47,10 +47,10 @@ {% for group in contacts.object_list %} - + - + From c09d1d25b256d07f6bc51b711b8b8577a21ab708 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Fri, 30 Jan 2015 14:54:45 +0800 Subject: [PATCH 35/39] =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/urls.py | 3 ++- jperm/views.py | 17 ++++++++++++++++- ...{perm_user_detail.html => perm_detail.html} | 18 ++++++------------ templates/jperm/perm_list.html | 4 ++-- 4 files changed, 26 insertions(+), 16 deletions(-) rename templates/jperm/{perm_user_detail.html => perm_detail.html} (55%) diff --git a/jperm/urls.py b/jperm/urls.py index 53ebbc758..30a4fae1f 100644 --- a/jperm/urls.py +++ b/jperm/urls.py @@ -7,6 +7,7 @@ urlpatterns = patterns('jperm.views', # url(r'^blog/', include('blog.urls')), (r'^perm_edit/$', 'perm_edit'), - (r'^perm_user_show/$', 'perm_user_show'), (r'^perm_list/$', 'perm_list'), + (r'^perm_detail/$', 'perm_detail'), + (r'^perm_del/$', 'perm_del'), ) diff --git a/jperm/views.py b/jperm/views.py index 0f0226a08..f80840543 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -61,6 +61,21 @@ def perm_edit(request): return HttpResponseRedirect('/jperm/perm_list/') +def perm_detail(request): + user_group_id = request.GET.get('id') + user_group = UserGroup.objects.get(id=user_group_id) + asset_groups = [perm.asset_group for perm in user_group.perm_set.all()] + return render_to_response('jperm/perm_detail.html', locals()) + + +def perm_del(request): + user_group_id = request.GET.get('id') + user_group = UserGroup.objects.get(id=user_group_id) + Perm.objects.filter(user_group=user_group).delete() + return HttpResponseRedirect('/jperm/perm_list/') + + + # def perm_user_host(username, ips): # user = User.objects.get(username=username) # user.perm_set.all().delete() @@ -96,7 +111,7 @@ def perm_edit(request): # for perm in user.perm_set.all(): # host_permed.append(perm.asset) # -# return render_to_response('jperm/perm_user_detail.html', locals()) +# return render_to_response('jperm/perm_detail.html', locals()) # # # def perm_group_edit(request): diff --git a/templates/jperm/perm_user_detail.html b/templates/jperm/perm_detail.html similarity index 55% rename from templates/jperm/perm_user_detail.html rename to templates/jperm/perm_detail.html index 09116581d..8f5f7521a 100644 --- a/templates/jperm/perm_user_detail.html +++ b/templates/jperm/perm_detail.html @@ -14,29 +14,23 @@
    -

    {{ user.name }} 授权详情

    +

    {{ group.name }} 授权详情

    ID 组名 类型成员数量 备注 操作
    {{ group.id }} {{ group.name }} {{ group.type|group_type_to_str }} {{ group.id|member_count }} {{ group.comment }} 成员 diff --git a/templates/juser/user_add.html b/templates/juser/user_add.html index 9bf685edc..cede4b4d4 100644 --- a/templates/juser/user_add.html +++ b/templates/juser/user_add.html @@ -73,19 +73,19 @@
    - {% for group in all_group %} {% if groups_str %} {% if group.id|int2str in groups_str %} - + {% else %} - + {% endif %} {% else %} {% if forloop.first %} - + {% else %} - + {% endif %} {% endif %} {% endfor %} diff --git a/templates/juser/user_detail.html b/templates/juser/user_detail.html index be846b9a5..528795193 100644 --- a/templates/juser/user_detail.html +++ b/templates/juser/user_detail.html @@ -16,9 +16,6 @@

    {{ user.name }} 用户详情

    - @@ -58,7 +55,7 @@ - + From b62bc9d1615a99113dab0ec0ca04c27985d279a3 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Wed, 28 Jan 2015 18:00:09 +0800 Subject: [PATCH 32/39] =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=91=8A=E4=B8=80=E6=AE=B5=E8=90=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juser/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/juser/views.py b/juser/views.py index 2dd3c625b..128efbd5a 100644 --- a/juser/views.py +++ b/juser/views.py @@ -372,6 +372,8 @@ def user_del(request): user.delete() group = UserGroup.objects.get(name=user.username) group.delete() + server_del_user(user.username) + ldap_del_user(user.username) return HttpResponseRedirect('/juser/user_list/', locals()) From b4006d3d36355c8f7f1c3f4faffb04e0fc67626e Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Thu, 29 Jan 2015 00:53:15 +0800 Subject: [PATCH 33/39] =?UTF-8?q?perm=20edit=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/urls.py | 9 +- jperm/views.py | 221 +++++++++-------- jumpserver/templatetags/mytags.py | 12 +- jumpserver/urls.py | 2 +- templates/jperm/perm_edit.html | 138 +++++++++++ templates/jperm/perm_list.html | 231 ++++++++++++++---- .../{perm_host.html => perm_list2.htl.html} | 0 templates/nav.html | 2 +- 8 files changed, 452 insertions(+), 163 deletions(-) create mode 100644 templates/jperm/perm_edit.html rename templates/jperm/{perm_host.html => perm_list2.htl.html} (100%) diff --git a/jperm/urls.py b/jperm/urls.py index 380a92a86..53ebbc758 100644 --- a/jperm/urls.py +++ b/jperm/urls.py @@ -6,12 +6,7 @@ urlpatterns = patterns('jperm.views', # url(r'^$', 'jumpserver.views.home', name='home'), # url(r'^blog/', include('blog.urls')), - (r'^perm_host/$', 'perm_host'), - (r'^perm_add/$', 'perm_add'), + (r'^perm_edit/$', 'perm_edit'), (r'^perm_user_show/$', 'perm_user_show'), - (r'^perm_host/$', 'perm_list'), - (r'^perm_user_edit/$', 'perm_user_edit'), - (r'^perm_user_detail/$', 'perm_user_detail'), - (r'^perm_group_edit/$', 'perm_group_edit'), - (r'^perm_group_detail/$', 'perm_group_detail'), + (r'^perm_list/$', 'perm_list'), ) diff --git a/jperm/views.py b/jperm/views.py index 8a6a843f6..0f0226a08 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -3,15 +3,32 @@ from django.shortcuts import render_to_response from django.http import HttpResponseRedirect, HttpResponse from juser.models import User, UserGroup -from jasset.models import Asset +from jasset.models import Asset, BisGroup from jperm.models import Perm from django.core.paginator import Paginator, EmptyPage, InvalidPage -def perm_host(request): - header_title, path1, path2 = u'主机授权 | Perm Host Detail.', u'jperm', u'perm_host' - users = contact_list = User.objects.all().order_by('id') - groups = contact_list2 = UserGroup.objects.all().order_by('id') +def perm_group_update(user_group_name='', user_group_id='', asset_groups_name='', asset_groups_id=''): + if user_group_name: + user_group = UserGroup.objects.get(name=user_group_name) + else: + user_group = UserGroup.objects.get(id=user_group_id) + + Perm.objects.filter(user_group=user_group).delete() + if asset_groups_name: + for asset_group_name in asset_groups_name: + asset_group = BisGroup.objects.get(name=asset_group_name) + Perm(user_group=user_group, asset_group=asset_group).save() + else: + for asset_group_id in asset_groups_id: + asset_group = BisGroup.objects.get(id=asset_group_id) + Perm(user_group=user_group, asset_group=asset_group).save() + + +def perm_list(request): + header_title, path1, path2 = u'主机授权 | Perm Host Detail.', u'jperm', u'perm_list' + groups = contact_list = UserGroup.objects.all().order_by('type') + users = contact_list2 = User.objects.all().order_by('id') p = paginator = Paginator(contact_list, 10) p2 = paginator2 = Paginator(contact_list2, 10) try: @@ -25,99 +42,103 @@ def perm_host(request): except (EmptyPage, InvalidPage): contacts = paginator.page(paginator.num_pages) contacts2 = paginator2.page(paginator2.num_pages) - return render_to_response('jperm/perm_host.html', locals()) - - -def perm_user_host(username, ips): - user = User.objects.get(username=username) - user.perm_set.all().delete() - for ip in ips: - asset = Asset.objects.get(ip=ip) - Perm.objects.create(user=user, asset=asset) - - -def perm_user_edit(request): - header_title, path1, path2 = u'授权编辑 | Perm Edit.', u'jperm', u'perm_edit' - if request.method == 'GET': - if request.GET.get('id', None): - user_id = request.GET.get('id') - user = User.objects.get(id=user_id) - assets = Asset.objects.all() - assets_permed = [] - for perm in user.perm_set.all(): - assets_permed.append(perm.asset) - assets_unperm = list(set(assets)-set(assets_permed)) - return render_to_response('jperm/perm_user_edit.html', locals()) - else: - host_ips = request.POST.getlist('host_permed', '') - username = request.POST.get('username') - perm_user_host(username, host_ips) - - return HttpResponseRedirect('/jperm/perm_host/') - - -def perm_user_detail(request): - user_id = request.GET.get('id', '') - user = User.objects.get(id=user_id) - host_permed = [] - for perm in user.perm_set.all(): - host_permed.append(perm.asset) - - return render_to_response('jperm/perm_user_detail.html', locals()) - - -def perm_group_edit(request): - if request.method == 'GET': - group_id = request.GET.get('id', '') - group = UserGroup.objects.get(id=group_id) - - return render_to_response('jperm/perm_group_edit.html') - - -def perm_add(request): - header_title, path1, path2 = u'添加授权 | Add User perm.', u'授权管理', u'添加授权' - if request.method == 'GET': - username = request.GET.get('username', None) - if not username: - return HttpResponseRedirect('/') - - user = User.objects.get(username=username) - permed_hosts = [] - for perm in user.perm_set.all(): - permed_hosts.append(perm.asset) - - hosts_all = Asset.objects.all() - hosts = list(set(hosts_all) - set(permed_hosts)) - - else: - username = request.POST.get('username', None) - host_ids = request.POST.getlist('host_ids', None) - - user = User.objects.get(username=username) - for host_id in host_ids: - asset = Asset.objects.get(id=host_id) - perm = Perm(user=user, asset=asset) - perm.save() - msg = u'添加成功' - - return render_to_response('jperm/perm_add.html', locals()) - - -def perm_user_show(request): - header_title, path1, path2 = u'查看授权用户 | Perm User Detail.', u'授权管理', u'用户详情' - users = User.objects.all() - return render_to_response('jperm/perm_user_show.html', locals(),) - - -def perm_list(request): - header_title, path1, path2 = u'查看用户授权 | Perm User Detail.', u'授权管理', u'用户详情' - username = request.GET.get('username', None) - if not username: - return HttpResponseRedirect('/') - - user = User.objects.get(username=username) - hosts = [] - for perm in user.perm_set.all(): - hosts.append(perm.asset) - return render_to_response('jperm/perm_list.html', locals()) + + +def perm_edit(request): + if request.method == 'GET': + header_title, path1, path2 = u'编辑授权 | Perm Host Edit.', u'jperm', u'perm_edit' + user_group_id = request.GET.get('id') + user_group = UserGroup.objects.get(id=user_group_id) + asset_groups = BisGroup.objects.all() + asset_groups_permed = [perm.asset_group for perm in user_group.perm_set.all()] + asset_groups_unperm = [asset_group for asset_group in asset_groups if asset_group not in asset_groups_permed] + return render_to_response('jperm/perm_edit.html', locals()) + else: + user_group_name = request.POST.get('user_group_name') + asset_groups_selected = request.POST.getlist('asset_group_permed') + perm_group_update(user_group_name=user_group_name, asset_groups_id=asset_groups_selected) + return HttpResponseRedirect('/jperm/perm_list/') + + +# def perm_user_host(username, ips): +# user = User.objects.get(username=username) +# user.perm_set.all().delete() +# for ip in ips: +# asset = Asset.objects.get(ip=ip) +# Perm.objects.create(user=user, asset=asset) +# +# +# def perm_user_edit(request): +# header_title, path1, path2 = u'授权编辑 | Perm Edit.', u'jperm', u'perm_edit' +# if request.method == 'GET': +# if request.GET.get('id', None): +# user_id = request.GET.get('id') +# user = User.objects.get(id=user_id) +# assets = Asset.objects.all() +# assets_permed = [] +# for perm in user.perm_set.all(): +# assets_permed.append(perm.asset) +# assets_unperm = list(set(assets)-set(assets_permed)) +# return render_to_response('jperm/perm_user_edit.html', locals()) +# else: +# host_ips = request.POST.getlist('host_permed', '') +# username = request.POST.get('username') +# perm_user_host(username, host_ips) +# +# return HttpResponseRedirect('/jperm/perm_host/') +# +# +# def perm_user_detail(request): +# user_id = request.GET.get('id', '') +# user = User.objects.get(id=user_id) +# host_permed = [] +# for perm in user.perm_set.all(): +# host_permed.append(perm.asset) +# +# return render_to_response('jperm/perm_user_detail.html', locals()) +# +# +# def perm_group_edit(request): +# if request.method == 'GET': +# group_id = request.GET.get('id', '') +# group = UserGroup.objects.get(id=group_id) +# +# return render_to_response('jperm/perm_group_edit.html') +# +# +# def perm_add(request): +# header_title, path1, path2 = u'添加授权 | Add User perm.', u'授权管理', u'添加授权' +# if request.method == 'GET': +# username = request.GET.get('username', None) +# if not username: +# return HttpResponseRedirect('/') +# +# user = User.objects.get(username=username) +# permed_hosts = [] +# for perm in user.perm_set.all(): +# permed_hosts.append(perm.asset) +# +# hosts_all = Asset.objects.all() +# hosts = list(set(hosts_all) - set(permed_hosts)) +# +# else: +# username = request.POST.get('username', None) +# host_ids = request.POST.getlist('host_ids', None) +# +# user = User.objects.get(username=username) +# for host_id in host_ids: +# asset = Asset.objects.get(id=host_id) +# perm = Perm(user=user, asset=asset) +# perm.save() +# msg = u'添加成功' +# +# return render_to_response('jperm/perm_add.html', locals()) +# +# +# def perm_user_show(request): +# header_title, path1, path2 = u'查看授权用户 | Perm User Detail.', u'授权管理', u'用户详情' +# users = User.objects.all() +# return render_to_response('jperm/perm_user_show.html', locals(),) + + diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 88e709546..7ebb5cb24 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -50,18 +50,18 @@ def bool2str(value): return u'否' -@register.filter(name='perm_count') -def perm_count(user_id): - user = User.objects.get(id=int(user_id)) - return user.perm_set.all().count() - - @register.filter(name='member_count') def member_count(group_id): group = UserGroup.objects.get(id=group_id) return group.user_set.count() +@register.filter(name='perm_count') +def perm_count(group_id): + group = UserGroup.objects.get(id=group_id) + return group.perm_set.count() + + @register.filter(name='group_type_to_str') def group_type_to_str(type_name): group_types = { diff --git a/jumpserver/urls.py b/jumpserver/urls.py index 13e669b86..187362658 100644 --- a/jumpserver/urls.py +++ b/jumpserver/urls.py @@ -5,7 +5,7 @@ urlpatterns = patterns('', # Examples: # url(r'^$', 'jumpserver.views.home', name='home'), # url(r'^blog/', include('blog.urls')), - + (r'^$', 'jumpserver.views.base'), (r'^skin_config/$', 'jumpserver.views.skin_config'), (r'^base/$', 'jumpserver.views.base'), (r'^juser/', include('juser.urls')), diff --git a/templates/jperm/perm_edit.html b/templates/jperm/perm_edit.html new file mode 100644 index 000000000..cba2d4155 --- /dev/null +++ b/templates/jperm/perm_edit.html @@ -0,0 +1,138 @@ +{% extends 'base.html' %} +{% load mytags %} + +{% block content %} + + + {% include 'nav_cat_bar.html' %} +
    +
    +
    +
    + +
    +
    授权编辑表单 Edit perm of Group
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    + + +
    +

    未授权主机组

    +
    + + +
    +
    + +
    +
    + + +
    +
    + +

    授权主机

    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + +{# #} + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_list.html b/templates/jperm/perm_list.html index 6f1742bb3..fa5bc90e4 100644 --- a/templates/jperm/perm_list.html +++ b/templates/jperm/perm_list.html @@ -1,59 +1,194 @@ {% extends 'base.html' %} - +{% load mytags %} {% block content %} - {% include 'nav_cat_bar.html' %} -
    -
    -
    -
    -
    -
    权限主机 {{ user.username }} show perm host info.
    - +{% include 'nav_cat_bar.html' %} + +
    +
    +
    +
    +
    +
    用户组授权 show host perm info.
    + -
    -
    -
    添加时间{{ user.joined }}{{ user.date_joined|stamp2str }}
    最后登录
    - - - - - - - - {% for host in hosts %} - - - - - {% endfor %} - -
    IDIP
    {{ host.id }}{{ host.ip }}
    -
    -
    - - +
    + +
    +
    +
    + +
    + +
    + +
    +
    + + + + + + + + + + + + {% for group in contacts.object_list %} + + + + + + + + {% endfor %} + +
    组名类型成员数量授权数量操作
    {{ group.name }} {{ group.type|group_type_to_str }} {{ group.id|member_count }} {{ group.id|perm_count }} + 详情 + 编辑 + 删除 +
    +
    +
    +
    + Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
    +
    +
    +
    +
      + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% for page in p.page_range %} + {% ifequal offset1 page %} +
    • {{ page }}
    • + {% else %} +
    • {{ page }}
    • + {% endifequal %} + {% endfor %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} +
    +
    +
    +
    +
    + +
    + + + + + + + + + + {% for group in contacts2.object_list %} + + + + + + {% endfor %} + +
    组名备注操作
    {{ group.name }} {{ group.comment }} + 详情 + 编辑 +
    +
    +
    +
    + Showing {{ contacts2.start_index }} to {{ contacts2.end_index }} of {{ p2.count }} entries +
    +
    +
    +
    +
      + {% if contacts2.has_previous %} + + {% else %} + + {% endif %} + {% for page in p2.page_range %} + {% ifequal offset1 page %} +
    • {{ page }}
    • + {% else %} +
    • {{ page }}
    • + {% endifequal %} + {% endfor %} + {% if contacts2.has_next %} + + {% else %} + + {% endif %} +
    +
    +
    +
    +
    - + +
    +
    + + +
    +
    + + + {% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_host.html b/templates/jperm/perm_list2.htl.html similarity index 100% rename from templates/jperm/perm_host.html rename to templates/jperm/perm_list2.htl.html diff --git a/templates/nav.html b/templates/nav.html index 0148484e9..9203ea643 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -34,7 +34,7 @@
  • 授权管理
  • From d25a3ce17cd7885492d3c9a5e85b4930408bb95e Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Fri, 30 Jan 2015 11:18:30 +0800 Subject: [PATCH 34/39] =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/templatetags/mytags.py | 5 ++++- juser/views.py | 26 ++++++++++++++++++++++++-- templates/juser/group_add.html | 7 +++++-- templates/juser/user_detail.html | 6 +++++- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 7ebb5cb24..003e53cc3 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -34,7 +34,10 @@ def groups_str(username): user = User.objects.get(username=username) for group in user.user_group.filter(Q(type='A') | Q(type='M')): groups.append(group.name) - return ' '.join(groups) + if len(groups) < 4: + return ' '.join(groups) + else: + return "%s ..." % ' '.join(groups[0:3]) @register.filter(name='get_item') diff --git a/juser/views.py b/juser/views.py index 128efbd5a..c34b3910d 100644 --- a/juser/views.py +++ b/juser/views.py @@ -16,6 +16,7 @@ from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from django.core.exceptions import ObjectDoesNotExist from django.db.models import Q +from django.http import HttpResponse from juser.models import UserGroup, User from connect import PyCrypt, KEY @@ -135,6 +136,14 @@ def group_add_user(group_name, user_id=None, username=None): group.user_set.add(user) +def group_update_user(group_id, users_id): + group = UserGroup.objects.get(id=group_id) + group.user_set.clear() + for user_id in users_id: + user = User.objects.get(id=user_id) + group.user_set.add(user) + + def db_add_user(**kwargs): groups_post = kwargs.pop('groups') user = User(**kwargs) @@ -253,7 +262,7 @@ def group_add(request): msg = '' header_title, path1, path2 = '添加属组 | Add Group', 'juser', 'group_add' group_types = { - 'P': '私有组', + # 'P': '私有组', 'M': '管理组', 'A': '授权组', } @@ -321,19 +330,32 @@ def group_edit(request): error = '' msg = '' header_title, path1, path2 = '修改属组 | Edit Group', 'juser', 'group_edit' + group_types = { + # 'P': '私有组', + 'M': '管理组', + 'A': '授权组', + } if request.method == 'GET': group_id = request.GET.get('id', None) group = UserGroup.objects.get(id=group_id) group_name = group.name comment = group.comment + group_type = group.type + users_all = User.objects.all() + users_selected = group.user_set.all() + users = [user for user in users_all if user not in users_selected] return render_to_response('juser/group_add.html', locals()) else: group_id = request.POST.get('group_id', None) group_name = request.POST.get('group_name', None) comment = request.POST.get('comment', '') + users_selected = request.POST.getlist('users_selected') + group_type = request.POST.get('group_type') group = UserGroup.objects.filter(id=group_id) - group.update(name=group_name, comment=comment) + # return HttpResponse(group_type) + group.update(name=group_name, comment=comment, type=group_type) + group_update_user(group_id, users_selected) return HttpResponseRedirect('/juser/group_list/') diff --git a/templates/juser/group_add.html b/templates/juser/group_add.html index fcd00482f..db20f8506 100644 --- a/templates/juser/group_add.html +++ b/templates/juser/group_add.html @@ -52,7 +52,7 @@
    + {% for user in users_selected %} + + {% endfor %}
    @@ -96,7 +99,7 @@
    - +
    diff --git a/templates/juser/user_detail.html b/templates/juser/user_detail.html index 528795193..e06247dc5 100644 --- a/templates/juser/user_detail.html +++ b/templates/juser/user_detail.html @@ -43,7 +43,11 @@
    属组{{ user.username|groups_str }} + {% for group in user.user_group.all %} + {{ group.name }} + {% endfor %} +
    Email
    - - + - {% for asset in host_permed %} + {% for asset_group in asset_groups %} - - - - + + + {% endfor %} diff --git a/templates/jperm/perm_list.html b/templates/jperm/perm_list.html index fa5bc90e4..6e56381d7 100644 --- a/templates/jperm/perm_list.html +++ b/templates/jperm/perm_list.html @@ -61,9 +61,9 @@ {% endfor %} From c1686d52e960eede1c17bb9386301280f0ef8103 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Fri, 30 Jan 2015 16:39:34 +0800 Subject: [PATCH 36/39] =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=92=8C=E6=9F=A5=E7=9C=8B=E4=BF=AE=E6=94=B9=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jperm/urls.py | 1 + jperm/views.py | 23 +++++++++++++++ jumpserver/templatetags/mytags.py | 5 ++++ templates/jperm/perm_asset_detail.html | 41 ++++++++++++++++++++++++++ templates/jperm/perm_list.html | 17 ++++++----- 5 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 templates/jperm/perm_asset_detail.html diff --git a/jperm/urls.py b/jperm/urls.py index 30a4fae1f..80d8f8630 100644 --- a/jperm/urls.py +++ b/jperm/urls.py @@ -10,4 +10,5 @@ urlpatterns = patterns('jperm.views', (r'^perm_list/$', 'perm_list'), (r'^perm_detail/$', 'perm_detail'), (r'^perm_del/$', 'perm_del'), + (r'^perm_asset_detail/$', 'perm_asset_detail'), ) diff --git a/jperm/views.py b/jperm/views.py index f80840543..a53b7938a 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -25,6 +25,23 @@ def perm_group_update(user_group_name='', user_group_id='', asset_groups_name='' Perm(user_group=user_group, asset_group=asset_group).save() +def perm_user_asset(user_id): + user = User.objects.get(id=user_id) + user_groups = user.user_group.all() + perms = [] + assets = [] + for user_group in user_groups: + perm = user_group.perm_set.all() + perms.extend(perm) + + asset_groups = [perm.asset_group for perm in perms] + + for asset_group in asset_groups: + assets.extend(list(asset_group.asset_set.all())) + + return list(set(assets)) + + def perm_list(request): header_title, path1, path2 = u'主机授权 | Perm Host Detail.', u'jperm', u'perm_list' groups = contact_list = UserGroup.objects.all().order_by('type') @@ -75,6 +92,12 @@ def perm_del(request): return HttpResponseRedirect('/jperm/perm_list/') +def perm_asset_detail(request): + user_id = request.GET.get('id') + user = User.objects.get(id=user_id) + assets = perm_user_asset(user_id) + return render_to_response('jperm/perm_asset_detail.html', locals()) + # def perm_user_host(username, ips): # user = User.objects.get(username=username) diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py index 003e53cc3..01b81d486 100644 --- a/jumpserver/templatetags/mytags.py +++ b/jumpserver/templatetags/mytags.py @@ -4,6 +4,7 @@ import time from django import template from django.db.models import Q from juser.models import User, UserGroup +from jperm.views import perm_user_asset register = template.Library() @@ -73,3 +74,7 @@ def group_type_to_str(type_name): 'A': '授权组', } return group_types.get(type_name) + +@register.filter(name='perm_asset_count') +def perm_asset_count(user_id): + return len(perm_user_asset(user_id)) diff --git a/templates/jperm/perm_asset_detail.html b/templates/jperm/perm_asset_detail.html new file mode 100644 index 000000000..f469138d5 --- /dev/null +++ b/templates/jperm/perm_asset_detail.html @@ -0,0 +1,41 @@ +{% load mytags %} + + + {% include 'link_css.html' %} + + + + + +
    +
    +

    {{ user.name }} 授权详情

    +
    + +
    IDIP 主机组IDC主机数量
    {{ asset.id }}{{ asset.ip }} - {% for group in asset.bis_group.all %} - {{ group }} - {% endfor %} - {{ asset.idc.name }}{{ asset_group.id }}{{ asset_group.name }}{{ asset_group.asset_set.count }}
    {{ group.id|member_count }} {{ group.id|perm_count }} - 详情 + 详情 编辑 - 删除 + 删除
    + + + + + + + + + {% for asset in assets %} + + + + + + {% endfor %} + +
    主机端口登录方式
    {{ asset.ip }}{{ asset.port }}{{ asset.login_type }}
    +
    +
    + + \ No newline at end of file diff --git a/templates/jperm/perm_list.html b/templates/jperm/perm_list.html index 6e56381d7..dd8436d6c 100644 --- a/templates/jperm/perm_list.html +++ b/templates/jperm/perm_list.html @@ -113,19 +113,22 @@ - - + + + + - {% for group in contacts2.object_list %} + {% for user in contacts2.object_list %} - - + + + + {% endfor %} From 35d9be5c106b97a63e192c8c59b61356f75c25ce Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Fri, 30 Jan 2015 16:53:06 +0800 Subject: [PATCH 37/39] =?UTF-8?q?connect.py=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- connect.py | 17 +-- jperm/views.py | 88 +----------- templates/jperm/perm_group_edit.html | 151 --------------------- templates/jperm/perm_list2.htl.html | 193 --------------------------- templates/jperm/perm_user_edit.html | 138 ------------------- templates/jperm/perm_user_show.html | 61 --------- 6 files changed, 11 insertions(+), 637 deletions(-) delete mode 100644 templates/jperm/perm_group_edit.html delete mode 100644 templates/jperm/perm_list2.htl.html delete mode 100644 templates/jperm/perm_user_edit.html delete mode 100644 templates/jperm/perm_user_show.html diff --git a/connect.py b/connect.py index 3fed445f2..9a94764bf 100755 --- a/connect.py +++ b/connect.py @@ -25,6 +25,7 @@ django.setup() from juser.models import User from jasset.models import Asset from jlog.models import Log +from jperm.views import perm_user_asset try: import termios @@ -207,15 +208,10 @@ def posix_shell(chan, username, host): def get_user_host(username): """Get the hosts of under the user control.""" hosts_attr = {} - try: - user = User.objects.get(username=username) - except ObjectDoesNotExist: - raise ServerError("Username \033[1;31m%s\033[0m doesn't exist on Jumpserver." % username) - else: - perm_all = user.permission_set.all() - for perm in perm_all: - hosts_attr[perm.asset.ip] = [perm.asset.id, perm.asset.comment] - return hosts_attr + asset_all = perm_user_asset(username=username) + for asset in asset_all: + hosts_attr[asset.ip] = [asset.id, asset.comment] + return hosts_attr def get_connect_item(username, ip): @@ -234,7 +230,6 @@ def get_connect_item(username, ip): login_type_dict = { 'L': user.ldap_pwd, - 'S': user.ssh_key_pwd2, 'P': user.ssh_pwd, } @@ -244,7 +239,7 @@ def get_connect_item(username, ip): elif asset.login_type == 'M': username = asset.username - password= cryptor.decrypt(asset.password) + password = cryptor.decrypt(asset.password) return username, password, ip, port else: diff --git a/jperm/views.py b/jperm/views.py index a53b7938a..b9da25c6b 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -25,8 +25,11 @@ def perm_group_update(user_group_name='', user_group_id='', asset_groups_name='' Perm(user_group=user_group, asset_group=asset_group).save() -def perm_user_asset(user_id): - user = User.objects.get(id=user_id) +def perm_user_asset(user_id=None, username=None): + if user_id: + user = User.objects.get(id=user_id) + else: + user = User.objects.get(username=username) user_groups = user.user_group.all() perms = [] assets = [] @@ -99,84 +102,3 @@ def perm_asset_detail(request): return render_to_response('jperm/perm_asset_detail.html', locals()) -# def perm_user_host(username, ips): -# user = User.objects.get(username=username) -# user.perm_set.all().delete() -# for ip in ips: -# asset = Asset.objects.get(ip=ip) -# Perm.objects.create(user=user, asset=asset) -# -# -# def perm_user_edit(request): -# header_title, path1, path2 = u'授权编辑 | Perm Edit.', u'jperm', u'perm_edit' -# if request.method == 'GET': -# if request.GET.get('id', None): -# user_id = request.GET.get('id') -# user = User.objects.get(id=user_id) -# assets = Asset.objects.all() -# assets_permed = [] -# for perm in user.perm_set.all(): -# assets_permed.append(perm.asset) -# assets_unperm = list(set(assets)-set(assets_permed)) -# return render_to_response('jperm/perm_user_edit.html', locals()) -# else: -# host_ips = request.POST.getlist('host_permed', '') -# username = request.POST.get('username') -# perm_user_host(username, host_ips) -# -# return HttpResponseRedirect('/jperm/perm_host/') -# -# -# def perm_user_detail(request): -# user_id = request.GET.get('id', '') -# user = User.objects.get(id=user_id) -# host_permed = [] -# for perm in user.perm_set.all(): -# host_permed.append(perm.asset) -# -# return render_to_response('jperm/perm_detail.html', locals()) -# -# -# def perm_group_edit(request): -# if request.method == 'GET': -# group_id = request.GET.get('id', '') -# group = UserGroup.objects.get(id=group_id) -# -# return render_to_response('jperm/perm_group_edit.html') -# -# -# def perm_add(request): -# header_title, path1, path2 = u'添加授权 | Add User perm.', u'授权管理', u'添加授权' -# if request.method == 'GET': -# username = request.GET.get('username', None) -# if not username: -# return HttpResponseRedirect('/') -# -# user = User.objects.get(username=username) -# permed_hosts = [] -# for perm in user.perm_set.all(): -# permed_hosts.append(perm.asset) -# -# hosts_all = Asset.objects.all() -# hosts = list(set(hosts_all) - set(permed_hosts)) -# -# else: -# username = request.POST.get('username', None) -# host_ids = request.POST.getlist('host_ids', None) -# -# user = User.objects.get(username=username) -# for host_id in host_ids: -# asset = Asset.objects.get(id=host_id) -# perm = Perm(user=user, asset=asset) -# perm.save() -# msg = u'添加成功' -# -# return render_to_response('jperm/perm_add.html', locals()) -# -# -# def perm_user_show(request): -# header_title, path1, path2 = u'查看授权用户 | Perm User Detail.', u'授权管理', u'用户详情' -# users = User.objects.all() -# return render_to_response('jperm/perm_user_show.html', locals(),) - - diff --git a/templates/jperm/perm_group_edit.html b/templates/jperm/perm_group_edit.html deleted file mode 100644 index 20121cc66..000000000 --- a/templates/jperm/perm_group_edit.html +++ /dev/null @@ -1,151 +0,0 @@ -{% extends 'base.html' %} -{% load mytags %} - -{% block content %} - - - {% include 'nav_cat_bar.html' %} -
    -
    -
    -
    - -
    -
    授权编辑表单 Edit perm of user group
    - -
    - -
    -
    -
    -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    - - -
    -
    - -
    -
    - -
    -

    未授权主机

    -
    - - -
    -
    - -
    -
    - - -
    -
    - -

    授权主机

    -
    - -
    -
    -
    -
    -
    -
    - - -
    -
    -
    - - -
    -
    -
    -
    -
    - -{# #} - -{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_list2.htl.html b/templates/jperm/perm_list2.htl.html deleted file mode 100644 index 15270e669..000000000 --- a/templates/jperm/perm_list2.htl.html +++ /dev/null @@ -1,193 +0,0 @@ -{% extends 'base.html' %} -{% load mytags %} -{% block content %} -{% include 'nav_cat_bar.html' %} - -
    -
    -
    -
    -
    -
    主机授权 show host perm info.
    - -
    - -
    -
    - - -
    - -
    -
    -
    组名备注用户角色属组主机数量 操作
    {{ group.name }} {{ group.comment }} {{ user.name }} {{ user.id | get_role }} {{ user.username | groups_str }} {{ user.id | perm_asset_count }} - 详情 - 编辑 + 详情
    - - - - - - - - - - - {% for user in contacts.object_list %} - - - - - - - - {% endfor %} - -
    用户名姓名属组授权总数操作
    {{ user.username }} {{ user.name }} {{ user.username|groups_str }} {{ user.id|perm_count }} - 详情 - 编辑 -
    -
    -
    -
    - Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries -
    -
    -
    -
    -
      - {% if contacts.has_previous %} - - {% else %} - - {% endif %} - {% for page in p.page_range %} - {% ifequal offset1 page %} -
    • {{ page }}
    • - {% else %} -
    • {{ page }}
    • - {% endifequal %} - {% endfor %} - {% if contacts.has_next %} - - {% else %} - - {% endif %} -
    -
    -
    -
    -
    - -
    - - - - - - - - - - {% for group in contacts2.object_list %} - - - - - - {% endfor %} - -
    组名备注操作
    {{ group.name }} {{ group.comment }} - 详情 - 编辑 -
    -
    -
    -
    - Showing {{ contacts2.start_index }} to {{ contacts2.end_index }} of {{ p2.count }} entries -
    -
    -
    -
    -
      - {% if contacts2.has_previous %} - - {% else %} - - {% endif %} - {% for page in p2.page_range %} - {% ifequal offset1 page %} -
    • {{ page }}
    • - {% else %} -
    • {{ page }}
    • - {% endifequal %} - {% endfor %} - {% if contacts2.has_next %} - - {% else %} - - {% endif %} -
    -
    -
    -
    - -
    -
    - -
    - -
    - - - -
    -
    -
    - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_user_edit.html b/templates/jperm/perm_user_edit.html deleted file mode 100644 index 00cc85e73..000000000 --- a/templates/jperm/perm_user_edit.html +++ /dev/null @@ -1,138 +0,0 @@ -{% extends 'base.html' %} -{% load mytags %} - -{% block content %} - - - {% include 'nav_cat_bar.html' %} -
    -
    -
    -
    - -
    -
    授权编辑表单 Edit perm of user
    - -
    - -
    -
    -
    -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    - - -
    -
    - -
    -
    - -
    -

    未授权主机

    -
    - - -
    -
    - -
    -
    - - -
    -
    - -

    授权主机

    -
    - -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    -
    - -{# #} - -{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_user_show.html b/templates/jperm/perm_user_show.html deleted file mode 100644 index 842de720b..000000000 --- a/templates/jperm/perm_user_show.html +++ /dev/null @@ -1,61 +0,0 @@ -{% extends 'base.html' %} -{% load mytags %} - -{% block content %} - {% include 'nav_cat_bar.html' %} -
    -
    -
    -
    -
    -
    用户信息 show user info.
    - -
    -
    -
    - - - - - - - - - {% for user in users %} - - - - - - {% endfor %} - -
    ID添加授权
    {{ user.id }}{{ user.username }}查看权限
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    -{% endblock %} \ No newline at end of file From c1fb72f3935b1c83388491b10dd2820bc1b59899 Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Fri, 30 Jan 2015 23:30:16 +0800 Subject: [PATCH 38/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=99=BB=E9=99=86?= =?UTF-8?q?=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jumpserver/urls.py | 2 ++ jumpserver/views.py | 42 +++++++++++++++++++++++++++++++++++ juser/views.py | 4 ---- templates/base.html | 6 ++--- templates/juser/user_add.html | 8 ++++++- templates/login.html | 17 ++++++++------ templates/nav.html | 4 ++-- templates/nav_bar_header.html | 2 +- templates/nav_li_profile.html | 3 ++- 9 files changed, 69 insertions(+), 19 deletions(-) diff --git a/jumpserver/urls.py b/jumpserver/urls.py index 187362658..6a01353f1 100644 --- a/jumpserver/urls.py +++ b/jumpserver/urls.py @@ -8,6 +8,8 @@ urlpatterns = patterns('', (r'^$', 'jumpserver.views.base'), (r'^skin_config/$', 'jumpserver.views.skin_config'), (r'^base/$', 'jumpserver.views.base'), + (r'^login/$', 'jumpserver.views.login'), + (r'^logout/$', 'jumpserver.views.logout'), (r'^juser/', include('juser.urls')), (r'^jperm/', include('jperm.urls')), url(r'^jasset/', include('jasset.urls')), diff --git a/jumpserver/views.py b/jumpserver/views.py index ef9c9560c..9c50576a3 100644 --- a/jumpserver/views.py +++ b/jumpserver/views.py @@ -1,7 +1,16 @@ #coding: utf-8 +import hashlib + from django.http import HttpResponse from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect + +from juser.models import User + + +def md5_crypt(string): + return hashlib.new("md5", string).hexdigest() def base(request): @@ -12,3 +21,36 @@ def skin_config(request): return render_to_response('skin_config.html') +def login(request): + """登录界面""" + if request.session.get('username'): + return HttpResponseRedirect('/') + if request.method == 'GET': + return render_to_response('login.html') + else: + username = request.POST.get('username') + password = request.POST.get('password') + user = User.objects.filter(username=username) + if user: + user = user[0] + if md5_crypt(password) == user.password: + request.session['username'] = username + if user.role == 'SU': + request.session['role'] = 2 + elif user.role == 'GA': + request.session['role'] = 1 + else: + request.session['role'] = 0 + return HttpResponseRedirect('/') + else: + error = '密码错误,请重新输入。' + else: + error = '用户不存在。' + return render_to_response('login.html', {'error': error}) + + +def logout(request): + request.session.delete() + return HttpResponseRedirect('/login/') + + diff --git a/juser/views.py b/juser/views.py index c34b3910d..875754003 100644 --- a/juser/views.py +++ b/juser/views.py @@ -33,10 +33,6 @@ if LDAP_ENABLE: LDAP_ROOT_PW = CONF.get('ldap', 'root_pw') -def md5_crypt(string): - return hashlib.new("md5", string).hexdigest() - - def gen_rand_pwd(num): """生成随机密码""" seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/templates/base.html b/templates/base.html index 8eb5d6e1e..95cc04d06 100644 --- a/templates/base.html +++ b/templates/base.html @@ -10,7 +10,7 @@ {% include 'link_css.html' %} - {% include 'script.html' %} + @@ -27,7 +27,7 @@ - +{# #} - + {% include 'script.html' %} diff --git a/templates/juser/user_add.html b/templates/juser/user_add.html index cede4b4d4..68bf3f1a5 100644 --- a/templates/juser/user_add.html +++ b/templates/juser/user_add.html @@ -119,7 +119,7 @@
    - +
    @@ -191,6 +191,12 @@ $('#userForm').validator({ ok: "", msg: {required: "必须填写"} }, + "email": { + rule: "required", + tip: "Email", + ok: "", + msg: {required: "必须填写"} + }, "role": { rule: "checked", tip: "角色", diff --git a/templates/login.html b/templates/login.html index 263cf07e2..df3b35f2b 100644 --- a/templates/login.html +++ b/templates/login.html @@ -7,7 +7,7 @@ JumpServer | Login - + @@ -22,22 +22,25 @@
    -

    JumpServer

    +

    -

    Welcome to JumpServer

    -
    + {% if error %} +
    {{ error }}
    + {% endif %} +

    Welcome to JumpServer

    +
    - +
    - +
    Forgot password?
    -

    Inspinia we app framework base on Bootstrap 3 © 2014

    +

    Copyright Jumpserver.org Organization © 2014-2015

    diff --git a/templates/nav.html b/templates/nav.html index 9203ea643..c616bfe3f 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -34,8 +34,8 @@
  • 授权管理
  • diff --git a/templates/nav_bar_header.html b/templates/nav_bar_header.html index 50276b70f..7d4d3bb79 100644 --- a/templates/nav_bar_header.html +++ b/templates/nav_bar_header.html @@ -108,7 +108,7 @@
  • - + Log out
  • diff --git a/templates/nav_li_profile.html b/templates/nav_li_profile.html index c19e00b3f..09811e0c8 100644 --- a/templates/nav_li_profile.html +++ b/templates/nav_li_profile.html @@ -10,10 +10,11 @@
  • Contacts
  • Mailbox
  • -
  • Logout
  • +
  • Logout
  • JS+
    + From deb55d3bb229fa99b5c9bd63d4b03fbd2a2843cc Mon Sep 17 00:00:00 2001 From: guanghongwei Date: Sat, 31 Jan 2015 12:56:32 +0800 Subject: [PATCH 39/39] =?UTF-8?q?=E6=B7=BB=E5=8A=A0logo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/img/logo.png | Bin 0 -> 6116 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/img/logo.png diff --git a/static/img/logo.png b/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8ff20a6b7ad21f50bd998736adec930b76b30c GIT binary patch literal 6116 zcmVJ)wRC0bye>@)7`W8 zzyPx_GXkKv6OZ8U0R8`ljI|>o$ntghyp8xy$W0zt5XPa+iC^+wwz>zBr^H0hQa*nKJOc?p-^!f2&?T15_PN8 zfXC1Qe-_4vfsXM3Qz#ft2dFPgK~!a^v@74iz|JA^ql6_)U_*VtSJnuC!KzdtUZpZ- zZPEDsAl=Uh7J$&hDOJT<74`TK`2&on{h@VrjCa8`6lmIXI)uaUxN9TMb0EX*5=H>T zJAzVeU#p~^93sDuc!d|{)OcL)*Mzy8CXEgWDijGbqR3DPSiEkb08=!NQtO_32M2qG z$nOEZ8{}41d0k6ua7<&>8xr2AN^{YmfakrV)%y4TkHnV`kskry@dsC5WZX-tDJA7n zYk=IK_jy4Ikw3%fpm*cwq#@$F29(dI7&7Tzr;|>2@?T)NpOo5d z?7@^&y;rFkVz&qIs#IWqN{YVJ-oY+q!#_z#wf}^V*>xlonA2rmHl9ks!dNwCtce6hM_2F5nm@)VpZH$Fm5DqQDvmAbUMD zqC!xBiGD~k#{q{BPRJ?X2+!v%@^~+9)oMzk?&m+j_;>B)LS@mk>Y?8#h@Ud0223%e z@(b^n;5O=0a017*;;+L!&}28S5d^{Sbh`o+Ng_2ZjaZGXjjU+9uGqx@5Lje}oAh5Rvg8++bpidq)sLu#Gy<0&&-mh?=u_+KI>sy5)Kcbz+_ z-q6xO91Hs6ssohTI=G7_GcoAo&vZKI11YId)Aes;SooLjEyv<;(1lOeR52T?tJE7k zP9!7TBYhs|{`)nphn@*nZ|Dl0H#5?p+U2HwdlWEW4J(Or*bZ)gK?9`}jUf%?ne zhr~}*U62cP)t;wM9@e(TV4Bb{445YfCpW2kz8u_R^1sJ}CEMMO52Lj#`=hk%@T;@u zM>OC<97~^Vs3W)5T%v+J4;q63q@E3dTtWfd;{WS;7Fz#cr04;ta2#Z*wfrPY9y2l{ zTP=1Fw)4diL;(gNyd4gQeXmz+RsGdXBfcnm5*E8%Sd?OZ=67g#?SPUGGjJ-6#;Evo znJ5NMKl%(S5_HR`KXa{y`Sa!T%1tguztn6It^m_?dcjO7g(=y?g8AuLffTitKv8tS z;?mbU+MS1MFKhN&TZzy8en1O6@QH2a!Qf60lWbQ1NmH6?z{p?h@txX9U=tXMib@aO zJZ3WUjgoP3b=)CNHGj4Ie6vZ2DkOR=|eaI)ugM ztkP8iTh)^wnIz6S?1!S6Z26ErMfke9uWxS^qDg$GYbTCMMpV`90R|jxszraO?z-4koKgkmX616z@(R4! zMzf|nxr#<-VCC*@B={m|IViY@`e#L5BdSghJ*6um4b9uBkRFvlB-)3020)8~M zUUUQk#gA9C=C6xx-KRbec(vvdK5fr7!w)|FE7qMi@bvZ#)M{tPplVZ?1ajJG?{aUT zB>B&V_|;V;8TG77QRUwzypcw85F`NdaRR(m{;*_QgP{;zviSq`UcWCY?YXQ{slFRx zSNEFy^B#Ihv@>#`3nq??z}J7TrBpl~=fsnu2H!gW5vSCe1IuylS=&A`(BbImFqi>! zhITCJ75PiK@TzKxq@pcAm#9KT;oYVVbJH_%KF-PibzT9hRcTTr=6L^-PyV8-#9mcy}+`odQAQW7ritVd3dc~kWWUkjEnL3O%|C&sla1XXGqTBuUBlP_K99YEa1{; z!Fi`+X^+T%H7v}j!O@sxU}{9a+ROM{k?f@DTD=gD#6!l{%zelyW#J#X__=>AZI5XR z`&E+EEECW<-I9OR<9Mb#7gde&08E8jYrq@`?l5~7_|C`KD~$WIp4e9fO8I(=4wAYkR}2V7F$udh6$ zyT->m^#DMg8{PC9H_2}f1dHRbp+RxbKeqkPTB+~VN|mAJ(eFfM{(nBjEWqbQoJ++H z`pecP3?vAe1ODQhQ7`B;Ik?flm!mzCXl>EQ_IX)`J7y0kTE+=;4WX`y?!UVgLElYzv=A z;~oIFN&}V#g3HhjKeKQ!&ZHR(+_!mcmkqU~XBw&(Jnl3PU=V0&dJa!2$cTQu&(FAi ze&s^K)uDlWclbREQAa3LkSL9Y?%#qfe*!nQTtx!RraAZ6v!N-9{wE?qPvY6>_lKmu z-%xp2dzA};M1(yUDnK0^n@}~=DnkLVZ09B%rawzv1NY%=d-y5-DSc|c0zp5_$PSD5 zia4@iPTsqsh0lS+gfkr0qww6hL~Hm)j|*9{eFMdZ!(F*~*ste3g8XUpxB%IQSOE0v zpTB300_m7)QU0V1A-J3)Z zD3I4Pa(TFlD0R*MHr6F{1uBNX5j23~30ordcrXC&+PY3>r=8BOu7kmu1B;ggNA+;w zDo^Yvi|?Ew*{Nuc%XyX!CNlRRKoAHT#EFD{3Fu}`t=N)srRiFi8USY8=+K@8;hxRN z;ZpU6h@&1Fo4+}{H{p-{3gHTX!n0))9dO&!%p-eso4bevivGC&0^7Z14tM81F?Blh z>mv%L&EDay5N(b`ml=!W0ELGN%LT7oyFx7e_%HCsTa56dRp*!`RcDlJ57Md@Y7K&v zU*GB8o&8MT7UmOPR?yc+c~m~+Lu~iC!T60I;Qwf-b#pxLsl0sA`|Wd;s-9Nzcy01@ z$tYns9QOa-)`ki)kQ3w`7ZCZC#D_b7W*z&xu2h`YF7_e_lMn0nnA0Wq+wVAi3}pmC z7BYgoqlipiCK7r>JoE!r6prb#z}}jMT2d~ufxM%b4Cb$a0IbJ5cGyVCsG-$ibDl|X z_wK8JyrVcjL_UN8!GKYpBDKplxTf-mK~C?B@nL`x+z|N?qbX^P?(;Lu7MERC#u34B z03|s#>4}G|&P&gh6hxcDhPKOWdQ^z^5K3{ZknH3S7p?rcrQ;C4u@ZO>#Uns*sV|ZOa7w-b$ZGcEJ!e#|F_< zoNy&O`Qt|vN(KbZ)Lv24$j~m*gasFBR4A&GnRvL)FO`oEQQ6i^aWZ^wJ%&`HCQ7{x z`h3ZXe;ZNQ)wCyUuv<~Ny))$7q*QN1-^IY&I>wu{qkcy5SjjS3cG^K(Wf%n0`MhAg z(e!p_uTBjHl5*&OL#q>{iYdWSzv=8}Iu^*!8PYMnPQE+IPYVNIGLrv;yQM39!I17B zt*w|G-#aB3@ZBWeqEuET8}V=_j#Mlk;(T2-+sJdWe0MW~RsEBEedk6kdR)RE zjHx?sk`Ivs1Uearhnq2eRCtFUMNz5Uslv9CN6-L}=U6cNnVUS{B!84vUxCYXj{7PW zsCB|OO2$e0Z?N`nqHoBM0^~P`pek-7{|^-Pcp6R1UiJU@u6t>$izC$j_}M{SPg1-S z5hkZo*q)vJ_-*7v4C8rOM|&RC7=%nynxusv2nJp6v|mSgnX3GBkLMPCZy|rQK4m)@ zl4q}n+pXW6J-^FEtaT?2XxxH4<6V$f3x;o(B>zKF@nk0Llx4U7ePL-(qf$#Q;BY+W zdGmUsEQ30oquyZ`cI4(hDM>y=0g5)u?ZqEZ=|K7TySg;uUf#J`8wBz-d9r=J+jzZ= z{1RjOb0*p;AHNns!8>IOp}Lp!+u@X1@$QkmuzT01nf7!`KE$1==J)j8#2*Q74a?`o=a25Hv}pME z2X-kgav|9g4|y!0$oC?B7m@rm3SxPl#}i28mwr7xC;a%`_u`<7vjeN@uX>?tC+AV0 zW$OrR$+9f(G5MXN-;lai=S@8A4=48L3`XI5v*vY4YP-YceEH-Nom^cz2pt^tD85$e zdr1NPK}o$h%I!|LrM~~j9LBFKf4IvneRuz^q#!=0y;T@v&`95-iIv4$Lea&%pzhySpCF@!#6^k>*Iy50U{z*J}Nj^G5dQ*pwb0r!^xZ`z4#r z`eBPHEhgzrb77hA!cyPVqA{?da*wJi`-1`3Q#&{7lZE)qj&@;;f_&+6Pu=34j(mu3 z+H95kRH{i{)!?7UgNYvdbV>;pWLnt8lkW+^V#?yDN4sTV$acfA{rC?Xui_v{024Fs zY-v7uIKNMVuVT=bsrtuhyHt09Uc;rtK`7QrUtIoGOX7%1o|ZCnMU)^ayqPimN3kq z{qESwZkRz!-Rh$Cr9JGq+AE&tKi;TV-dLM-#AjLCg<_ujSzrFPPosAYN&eyy44<~2 zc9z)Y+}LD`eECba$**rwwqWvCe(Exk2??aXuG~LxY@G z;(7vAzz_0Unww7)6_@tsKK*uu4rW^{Q=1yCXVWsw0kUU<8P56QT#tOsU<<;!I9|p_ zTWJS4*;uFEZ*3*^G9JJPf({I!6I3t+3K|v^-;+?y$2 z2)$7C4fP%83P-06)IA4uq2q)lH*I1^M>8}=hA^`=so~P;q7utM-+NG&IRBoLTRJV^ugJ1mhbHcR25|0Zzg}^osHAi-?muYj z+aG6SmEWfzembh9i5sG^_ZZb!&)w;E{q#U#N%>$sV?Yf)DNJa%Mqe?f>!Yz6nCO73 zb9pU|t_%4^gI?c1Dw!>(hvgaWvfEB(b_`7eU7>S5zP|2cG>DHH`4D?8xs%Hk4!r>d2z@y+R(NU{?TlPxWF+nM9V zcT9}-vtyFbxNrE#i4Umtr4z5!+7oGCz<|1N;(L$1a@l^D-(MOF;$t@QzlulO+E!fh z`<6GE(^PJaR`#UBEmYaoHf9*huBs?3UJ=W-#GL#aSlHaS`ZC8YX*HQCmkc`r+%22Y z(H_Y52iNW^E_pE?+7vhB-@u~g=2g|9z|yuUM3Hy{ER2wD@9<``+OGT!By5afRqWwo^%S_Qt$ zsnHl5Is+2Rs3DBTrMR3zipN8nc)nua=#s}1NtOvm{w2@(n0000