Commit 77f3a1f1 authored by wangyong's avatar wangyong

add asset add

parent d0d433db
......@@ -10,6 +10,9 @@ build
_mailinglist
.tox
.cache/
migrations/
.idea/
db.sqlite3
config.py
*/migrations/*
*.log
## [文档和规范]
// Jumpserver //
~ Jumpserver是什么?
Jumpserver是一款开源的跳板机(堡垒机)产品, 主要使用Python,Django开发
他实现了跳板机(堡垒机)的主要功能,删减、优化了传统堡垒机,致力于为互联网
运维提供服务
~ 版本依赖
* Python 2.7
* Django 1.10
~ 快速开始
```
pip install -r requirements.txt
cp config-example.py config.py
cd apps/ && python manage.py loaddata init # 初始化数据
python manage.py runserver 0.0.0.0:80
```
~ 文档
#### [项目结构描述](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/project_structure.md)
#### [Python代码规范](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/python_style_guide.md)
#### [API设计规范](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/api_style_guide.md)
#### [表结构](https://code.simcu.com/jumpserver/jumpserver/wikis/table_structure_image)
* [项目结构描述](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/project_structure.md)
* [Python代码规范](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/python_style_guide.md)
* [API设计规范](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/api_style_guide.md)
* [表结构](https://code.simcu.com/jumpserver/jumpserver/wikis/table_structure_image)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
if __name__ == '__main__':
pass
# ~*~ coding: utf-8 ~*~
#
from rest_framework import serializers
from .models import (
AssetGroup,Asset,IDC,AssetExtend
)
from rest_framework import viewsets,serializers
class AssetGroupSerializer(serializers.ModelSerializer):
class Meta:
model = AssetGroup
#exclude = [
#'password', 'first_name', 'last_name', 'secret_key_otp',
#'private_key', 'public_key', 'avatar',
#]
class AssetSerializer(serializers.ModelSerializer):
class Meta:
model = Asset
#fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
class IDCSerializer(serializers.ModelSerializer):
class Meta:
model = IDC
#fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
class AssetGroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows AssetGroup to be viewed or edited.
"""
queryset = AssetGroup.objects.all()
serializer_class = AssetGroupSerializer
class AssetViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows Asset to be viewed or edited.
"""
queryset = Asset.objects.all()
serializer_class = AssetSerializer
class IDCViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows IDC to be viewed or edited.
"""
queryset = IDC.objects.all()
serializer_class = IDCSerializer
\ No newline at end of file
......@@ -6,7 +6,7 @@
<div class="col-sm-10">
<div class="ibox float-e-margins">
<div id="ibox-content" class="ibox-title">
<h5> 填写资产基本信息 </h5>
<h5> 添加资产 </h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
......@@ -22,12 +22,12 @@
<div class="ibox-content">
<div class="panel blank-panel">
<div class="panel-options">
<ul class="nav nav-tabs">
<li class="active"><a href="{% url 'assets:asset-add' %}" class="text-center"><i class="fa fa-laptop"></i> 单台添加 </a></li>
{# <div class="panel-options">#}
{# <ul class="nav nav-tabs">#}
{# <li class="active"><a href="{% url 'assets:asset-add' %}" class="text-center"><i class="fa fa-laptop"></i> 单台添加 </a></li>#}
{# <li><a href="{% url 'asset_add_batch' %}" class="text-center"><i class="fa fa-bar-chart-o"></i> 批量添加 </a></li>#}
</ul>
</div>
{# </ul>#}
{# </div>#}
<div class="panel-body">
<div class="tab-content">
<div id="tab-1" class="ibox float-e-margins tab-pane active">
......@@ -40,6 +40,7 @@
<form id="assetForm" method="post" class="form-horizontal">
{% csrf_token %}
<h3 class="widget-head-color-box">基本信息</h3>
{{ form.hostname|bootstrap_horizontal }}
......@@ -79,12 +80,38 @@
</div>
</div>
<div class="hr-line-dashed"></div>
{{ form.group|bootstrap_horizontal }}
{# <div class="hr-line-dashed"></div>#}
{# {{ form.group|bootstrap_horizontal }}#}
{# {{ af.is_active|bootstrap_horizontal }}#}
<div class="hr-line-dashed"></div>
{{ form.comment|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
<h3>关联资产用户</h3>
<div class="form-group">
<label for="j_group" class="col-sm-2 control-label">管理用户<span class="red-fonts"> *</span></label>
<div class="col-sm-8">
<div class="radio i-checks">
<label><input type="radio" checked="checked" id="id_use_default_auth" name="use_default_auth"><span>使用预定义管理用户</span></label>
<label><input type="radio" checked="checked" id="id_use_default_auth" name="use_default_auth"><span>自定义</span></label>
</div>
</div>
</div>
<p class="col-sm-offset-2">Tips: 管理用户是服务器存在的root或拥有sudo的用户,用来推送系统用户</p>
<div class="form-group" id="admin_account" style="display: none">
<label class="col-sm-2 control-label"> <span class="red-fonts"></span> </label>
<div class="col-sm-3">
<input type="text" placeholder="Username" name="username" class="form-control">
</div>
<label class="col-sm-1 control-label"> <span class="red-fonts"></span> </label>
<div class="col-sm-4">
<input type="password" placeholder="Password" name="password" class="form-control">
</div>
</div>
<div class="form-group"><label class="col-sm-2 control-label"> 是否激活<span class="red-fonts"> *</span> </label>
<div class="col-sm-8">
<div class="radio i-checks">
......
# coding:utf-8
from django.conf.urls import url
from django.conf.urls import url,include
from .views import *
from .api import (
AssetGroupViewSet,AssetViewSet,IDCViewSet
)
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'assetgroup', AssetGroupViewSet)
router.register(r'asset', AssetViewSet)
router.register(r'idc', IDCViewSet)
app_name = 'assets'
urlpatterns = [
......@@ -9,4 +16,5 @@ urlpatterns = [
url(r'^$', AssetListView.as_view(), name='asset-list'),
url(r'^(?P<pk>[0-9]+)/delete/$', AssetDeleteView.as_view(), name='asset-list'),
url(r'^(?P<pk>[0-9]+)/detail/$', AssetDetailView.as_view(), name='asset-detail'),
url(r'^api/v1.0/', include(router.urls)),
]
## Celery usage
Jumpserver use celery to run task async. Using redis as the broker, so
you should run a redis instance
#### Run redis
$ yum -y install redis
or
$ docker run -name jumpserver-redis -d -p 6379:6379 redis redis-server
#### Write tasks in app_name/tasks.py
ops/tasks.py
```
from __future__ import absolute_import
import time
from celery import shared_task
from common import celery_app
@shared_task
def longtime_add(x, y):
print 'long time task begins'
# sleep 5 seconds
time.sleep(5)
print 'long time task finished'
return x + y
@celery_app.task(name='hello-world')
def hello():
print 'hello world!'
```
#### Run celery in development
```
$ cd apps
$ celery -A common worker -l info
```
#### Test using task
```
$ ./manage.py shell
>>> from ops.tasks import longtime_add
>>> res = longtime_add.delay(1, 2)
>>> res.get()
```
from __future__ import absolute_import
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
from __future__ import unicode_literals
from django.apps import AppConfig
class CommonConfig(AppConfig):
name = 'common'
# ~*~ coding: utf-8 ~*~
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jumpserver.settings')
from django.conf import settings
app = Celery('jumpserver')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: [app_config.split('.')[0] for app_config in settings.INSTALLED_APPS])
from __future__ import unicode_literals
from django.db import models
# Create your models here.
from __future__ import absolute_import
from celery import shared_task
from django.core.mail import send_mail
from django.conf import settings
@shared_task(name='send_mail_async')
def send_mail_async(*args, **kwargs):
""" Using celery to send email async
You can use it as django send_mail function
Example:
send_mail_sync.delay(subject, message, from_mail, recipient_list, fail_silently=False, html_message=None)
Also you can ignore the from_mail, unlike django send_mail, from_email is not a require args:
Example:
send_mail_sync.delay(subject, message, recipient_list, fail_silently=False, html_message=None)
"""
if len(args) == 3:
args = list(args)
args[0] = settings.EMAIL_SUBJECT_PREFIX + args[0]
args.insert(2, settings.EMAIL_HOST_USER)
args = tuple(args)
send_mail(*args, **kwargs)
# def send_mail_async(subject, message, from_mail, recipient_list, fail_silently=False, html_message=None):
# if settings.CONFIG.MAIL_SUBJECT_PREFIX:
# subject += settings.CONFIG.MAIL_SUBJECT_PREFIX
# send_mail(subject, message, from_mail, recipient_list, fail_silently=fail_silently, html_message=html_message)
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
{% include '_head_css_js.html' %}
<link href="{% static "css/jumpserver.css" %}" rel="stylesheet">
<script src="{% static "js/jumpserver.js" %}"></script>
</head>
<body class="gray-bg">
<div class="passwordBox2 animated fadeInDown">
<div class="row">
<div class="col-md-12">
<div class="ibox-content">
<div>
<img src="{% static 'img/logo.png' %}" style="margin: auto" width="82" height="82">
<h2 style="display: inline">Jumpserver</h2>
</div>
{% if errors %}
<p>
<div class="alert alert-danger">
{{ errors }}
</div>
</p>
{% endif %}
{% if messages %}
<p>
<div class="alert alert-success">
{{ messages }}
</div>
</p>
{% endif %}
<div class="row">
<div class="col-lg-3">
<a href="{{ redirect_url }}" class="btn btn-primary block full-width m-b">返回</a>
</div>
</div>
</div>
</div>
</div>
<hr/>
<div class="row">
<div class="col-md-6">
Copyright Jumpserver.org
</div>
<div class="col-md-6 text-right">
<small>© 2014-2016</small>
</div>
</div>
</div>
</body>
</html>
# ~*~ coding: utf-8 ~*~
from django import template
from django.utils import timezone
from django.conf import settings
register = template.Library()
@register.filter
def join_queryset_attr(queryset, attr, delimiter=', '):
return delimiter.join([getattr(obj, attr, '') for obj in queryset])
@register.filter
def pagination_range(total_page, current_num=1, display=5):
"""Return Page range
:param total_page: Total numbers of paginator
:param current_num: current display page num
:param display: Display as many as [:display:] page
In order to display many page num on web like:
< 1 2 3 4 5 >
"""
try:
current_num = int(current_num)
except ValueError:
current_num = 1
start = current_num - display/2 if current_num > display/2 else 1
end = start + display if start + display <= total_page else total_page + 1
return range(start, end)
# -*- coding: utf-8 -*-
#
from __future__ import unicode_literals
from django.shortcuts import reverse as dj_reverse
from django.conf import settings
def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None, external=False):
url = dj_reverse(viewname, urlconf=urlconf, args=args, kwargs=kwargs, current_app=current_app)
if external:
url = settings.SITE_URL.strip('/') + url
return url
def get_object_or_none(model, **kwargs):
try:
obj = model.objects.get(**kwargs)
except model.DoesNotExist:
obj = None
return obj
from __future__ import absolute_import, unicode_literals
from django.shortcuts import render
from django.views.generic import TemplateView
[{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_added": "2016-08-24T08:24:34.436Z", "created_by": "System"}}, {"model": "users.usergroup", "pk": 2, "fields": {"name": "Jack Kelly", "comment": "Donec dapibus.", "date_added": "2016-08-24T08:28:27.037Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 3, "fields": {"name": "Tina Thomas", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.039Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 4, "fields": {"name": "Denise Anderson", "comment": "Pellentesque eget nunc.", "date_added": "2016-08-24T08:28:27.041Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 5, "fields": {"name": "Joe Cox", "comment": "Sed ante.", "date_added": "2016-08-24T08:28:27.043Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 6, "fields": {"name": "Louise Tucker", "comment": "Etiam faucibus cursus urna.", "date_added": "2016-08-24T08:28:27.045Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 7, "fields": {"name": "Anne Owens", "comment": "Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.", "date_added": "2016-08-24T08:28:27.047Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 8, "fields": {"name": "Tammy Ramos", "comment": "Praesent blandit lacinia erat.", "date_added": "2016-08-24T08:28:27.049Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 9, "fields": {"name": "Christina Lynch", "comment": "Ut at dolor quis odio consequat varius.", "date_added": "2016-08-24T08:28:27.051Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 10, "fields": {"name": "Jennifer Hanson", "comment": "Mauris lacinia sapien quis libero.", "date_added": "2016-08-24T08:28:27.053Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 11, "fields": {"name": "Arthur Kelly", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_added": "2016-08-24T08:28:27.055Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 12, "fields": {"name": "Katherine Henry", "comment": "Duis at velit eu est congue elementum.", "date_added": "2016-08-24T08:28:27.058Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 13, "fields": {"name": "Lori Burns", "comment": "Curabitur in libero ut massa volutpat convallis.", "date_added": "2016-08-24T08:28:27.060Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 14, "fields": {"name": "Ann Greene", "comment": "Duis at velit eu est congue elementum.", "date_added": "2016-08-24T08:28:27.062Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 15, "fields": {"name": "Kathy Porter", "comment": "Curabitur at ipsum ac tellus semper interdum.", "date_added": "2016-08-24T08:28:27.063Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 16, "fields": {"name": "Betty Porter", "comment": "Sed ante.", "date_added": "2016-08-24T08:28:27.065Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 17, "fields": {"name": "Emily Fowler", "comment": "Nam tristique tortor eu pede.", "date_added": "2016-08-24T08:28:27.067Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 18, "fields": {"name": "Stephanie Wood", "comment": "In congue.", "date_added": "2016-08-24T08:28:27.068Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 19, "fields": {"name": "Sharon Spencer", "comment": "Vivamus vestibulum sagittis sapien.", "date_added": "2016-08-24T08:28:27.070Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 20, "fields": {"name": "Louise Johnston", "comment": "Duis consequat dui nec nisi volutpat eleifend.", "date_added": "2016-08-24T08:28:27.072Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 21, "fields": {"name": "Kimberly Medina", "comment": "Phasellus in felis.", "date_added": "2016-08-24T08:28:27.074Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 22, "fields": {"name": "Tammy Coleman", "comment": "Aliquam non mauris.", "date_added": "2016-08-24T08:28:27.076Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 23, "fields": {"name": "Sharon Fox", "comment": "Cras non velit nec nisi vulputate nonummy.", "date_added": "2016-08-24T08:28:27.077Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 24, "fields": {"name": "Julia Webb", "comment": "Donec quis orci eget orci vehicula condimentum.", "date_added": "2016-08-24T08:28:27.079Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 25, "fields": {"name": "Rose Wilson", "comment": "Vestibulum sed magna at nunc commodo placerat.", "date_added": "2016-08-24T08:28:27.081Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 26, "fields": {"name": "Doris Johnson", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.082Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 27, "fields": {"name": "Janet Howell", "comment": "Duis consequat dui nec nisi volutpat eleifend.", "date_added": "2016-08-24T08:28:27.084Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 28, "fields": {"name": "Irene Simpson", "comment": "Integer a nibh.", "date_added": "2016-08-24T08:28:27.086Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 29, "fields": {"name": "Cheryl Bailey", "comment": "Donec semper sapien a libero.", "date_added": "2016-08-24T08:28:27.088Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 30, "fields": {"name": "Anne Elliott", "comment": "Suspendisse accumsan tortor quis turpis.", "date_added": "2016-08-24T08:28:27.089Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 31, "fields": {"name": "Jean Welch", "comment": "Nunc purus.", "date_added": "2016-08-24T08:28:27.091Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 32, "fields": {"name": "Bonnie Gray", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "date_added": "2016-08-24T08:28:27.092Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 33, "fields": {"name": "Diana Fisher", "comment": "Maecenas tincidunt lacus at velit.", "date_added": "2016-08-24T08:28:27.094Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 34, "fields": {"name": "Jennifer James", "comment": "Phasellus id sapien in sapien iaculis congue.", "date_added": "2016-08-24T08:28:27.096Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 35, "fields": {"name": "Sara Mason", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "date_added": "2016-08-24T08:28:27.098Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 36, "fields": {"name": "Pamela Austin", "comment": "Etiam justo.", "date_added": "2016-08-24T08:28:27.100Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 37, "fields": {"name": "Sara George", "comment": "Integer ac leo.", "date_added": "2016-08-24T08:28:27.102Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 38, "fields": {"name": "Margaret Ramos", "comment": "Cras non velit nec nisi vulputate nonummy.", "date_added": "2016-08-24T08:28:27.104Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 39, "fields": {"name": "Elizabeth Powell", "comment": "In sagittis dui vel nisl.", "date_added": "2016-08-24T08:28:27.105Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 40, "fields": {"name": "Kimberly Mccoy", "comment": "Nulla nisl.", "date_added": "2016-08-24T08:28:27.108Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 41, "fields": {"name": "Sharon Price", "comment": "Donec quis orci eget orci vehicula condimentum.", "date_added": "2016-08-24T08:28:27.109Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 42, "fields": {"name": "Marilyn Dean", "comment": "Aenean sit amet justo.", "date_added": "2016-08-24T08:28:27.111Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 43, "fields": {"name": "Linda King", "comment": "Integer tincidunt ante vel ipsum.", "date_added": "2016-08-24T08:28:27.113Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 44, "fields": {"name": "Ann Freeman", "comment": "Donec quis orci eget orci vehicula condimentum.", "date_added": "2016-08-24T08:28:27.114Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 45, "fields": {"name": "Janet Webb", "comment": "In sagittis dui vel nisl.", "date_added": "2016-08-24T08:28:27.116Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 46, "fields": {"name": "Julie Stone", "comment": "Fusce consequat.", "date_added": "2016-08-24T08:28:27.119Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 47, "fields": {"name": "Annie Rice", "comment": "Quisque id justo sit amet sapien dignissim vestibulum.", "date_added": "2016-08-24T08:28:27.122Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 48, "fields": {"name": "Brenda Matthews", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.124Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 49, "fields": {"name": "Amanda Ruiz", "comment": "Sed ante.", "date_added": "2016-08-24T08:28:27.125Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 50, "fields": {"name": "Ruby Brown", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.127Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 51, "fields": {"name": "Mary Richards", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "date_added": "2016-08-24T08:28:27.129Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 52, "fields": {"name": "Andrea Woods", "comment": "Curabitur convallis.", "date_added": "2016-08-24T08:28:27.131Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 53, "fields": {"name": "Mary Hughes", "comment": "Suspendisse ornare consequat lectus.", "date_added": "2016-08-24T08:28:27.133Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 54, "fields": {"name": "Evelyn Palmer", "comment": "Praesent id massa id nisl venenatis lacinia.", "date_added": "2016-08-24T08:28:27.135Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 55, "fields": {"name": "Joan Stewart", "comment": "Integer tincidunt ante vel ipsum.", "date_added": "2016-08-24T08:28:27.136Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 56, "fields": {"name": "Tammy Edwards", "comment": "In congue.", "date_added": "2016-08-24T08:28:27.138Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 57, "fields": {"name": "Tina Chapman", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_added": "2016-08-24T08:28:27.140Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 58, "fields": {"name": "Donna Hart", "comment": "Nulla facilisi.", "date_added": "2016-08-24T08:28:27.142Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 59, "fields": {"name": "Teresa Pierce", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.143Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 60, "fields": {"name": "Annie Austin", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.145Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 61, "fields": {"name": "Judith Johnston", "comment": "Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo.", "date_added": "2016-08-24T08:28:27.147Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 62, "fields": {"name": "Gloria Willis", "comment": "Pellentesque at nulla.", "date_added": "2016-08-24T08:28:27.148Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 63, "fields": {"name": "Catherine Fields", "comment": "Nunc purus.", "date_added": "2016-08-24T08:28:27.150Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 64, "fields": {"name": "Julie Webb", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.152Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 65, "fields": {"name": "Deborah Wood", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.154Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 66, "fields": {"name": "Stephanie Hall", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "date_added": "2016-08-24T08:28:27.156Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 67, "fields": {"name": "Theresa Hall", "comment": "Mauris lacinia sapien quis libero.", "date_added": "2016-08-24T08:28:27.158Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 68, "fields": {"name": "Debra Wallace", "comment": "Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue.", "date_added": "2016-08-24T08:28:27.159Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 69, "fields": {"name": "Maria Cunningham", "comment": "Integer a nibh.", "date_added": "2016-08-24T08:28:27.161Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 70, "fields": {"name": "Joan Henry", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.162Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 71, "fields": {"name": "Alice Nelson", "comment": "Suspendisse accumsan tortor quis turpis.", "date_added": "2016-08-24T08:28:27.164Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 72, "fields": {"name": "Donna Porter", "comment": "Maecenas pulvinar lobortis est.", "date_added": "2016-08-24T08:28:27.166Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 73, "fields": {"name": "Jessica Evans", "comment": "Nulla suscipit ligula in lacus.", "date_added": "2016-08-24T08:28:27.168Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 74, "fields": {"name": "Tammy Burns", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_added": "2016-08-24T08:28:27.169Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 75, "fields": {"name": "Evelyn Brooks", "comment": "Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.", "date_added": "2016-08-24T08:28:27.171Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 76, "fields": {"name": "Carol Williamson", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_added": "2016-08-24T08:28:27.173Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 77, "fields": {"name": "Diana Bowman", "comment": "Donec posuere metus vitae ipsum.", "date_added": "2016-08-24T08:28:27.175Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 78, "fields": {"name": "Wanda Owens", "comment": "Nunc rhoncus dui vel sem.", "date_added": "2016-08-24T08:28:27.177Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 79, "fields": {"name": "Ruth Castillo", "comment": "Aenean lectus.", "date_added": "2016-08-24T08:28:27.178Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 80, "fields": {"name": "Joan Ross", "comment": "Fusce consequat.", "date_added": "2016-08-24T08:28:27.180Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 81, "fields": {"name": "Barbara Hicks", "comment": "Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.", "date_added": "2016-08-24T08:28:27.182Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 82, "fields": {"name": "Melissa Hicks", "comment": "Integer a nibh.", "date_added": "2016-08-24T08:28:27.184Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 83, "fields": {"name": "Melissa Woods", "comment": "Suspendisse potenti.", "date_added": "2016-08-24T08:28:27.185Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 84, "fields": {"name": "Janice Schmidt", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est.", "date_added": "2016-08-24T08:28:27.187Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 85, "fields": {"name": "Diane West", "comment": "Suspendisse potenti.", "date_added": "2016-08-24T08:28:27.189Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 86, "fields": {"name": "Rachel Myers", "comment": "Curabitur at ipsum ac tellus semper interdum.", "date_added": "2016-08-24T08:28:27.191Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 87, "fields": {"name": "Elizabeth Morgan", "comment": "Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.", "date_added": "2016-08-24T08:28:27.192Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 88, "fields": {"name": "Michelle Howell", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_added": "2016-08-24T08:28:27.194Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 89, "fields": {"name": "Joyce Richardson", "comment": "Pellentesque ultrices mattis odio.", "date_added": "2016-08-24T08:28:27.196Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 90, "fields": {"name": "Judy Stone", "comment": "Suspendisse accumsan tortor quis turpis.", "date_added": "2016-08-24T08:28:27.198Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 91, "fields": {"name": "Norma Garcia", "comment": "Proin eu mi.", "date_added": "2016-08-24T08:28:27.199Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 92, "fields": {"name": "Marie Torres", "comment": "Mauris sit amet eros.", "date_added": "2016-08-24T08:28:27.201Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 93, "fields": {"name": "Dorothy Williamson", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_added": "2016-08-24T08:28:27.203Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 94, "fields": {"name": "Martha Gonzales", "comment": "Donec ut dolor.", "date_added": "2016-08-24T08:28:27.205Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 95, "fields": {"name": "Katherine Frazier", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_added": "2016-08-24T08:28:27.207Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 96, "fields": {"name": "Betty Bell", "comment": "Donec ut mauris eget massa tempor convallis.", "date_added": "2016-08-24T08:28:27.209Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 97, "fields": {"name": "Janice Peterson", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.211Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 98, "fields": {"name": "Teresa Morales", "comment": "Nam dui.", "date_added": "2016-08-24T08:28:27.212Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 99, "fields": {"name": "Mildred Price", "comment": "Nulla nisl.", "date_added": "2016-08-24T08:28:27.214Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 100, "fields": {"name": "Elizabeth Stevens", "comment": "Aliquam non mauris.", "date_added": "2016-08-24T08:28:27.215Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 101, "fields": {"name": "Doris Chapman", "comment": "Donec ut mauris eget massa tempor convallis.", "date_added": "2016-08-24T08:28:27.217Z", "created_by": "admin"}}, {"model": "contenttypes.contenttype", "pk": 1, "fields": {"app_label": "users", "model": "usergroup"}}, {"model": "contenttypes.contenttype", "pk": 2, "fields": {"app_label": "users", "model": "user"}}, {"model": "contenttypes.contenttype", "pk": 3, "fields": {"app_label": "assets", "model": "assetgroup"}}, {"model": "contenttypes.contenttype", "pk": 4, "fields": {"app_label": "assets", "model": "idc"}}, {"model": "contenttypes.contenttype", "pk": 5, "fields": {"app_label": "assets", "model": "asset"}}, {"model": "contenttypes.contenttype", "pk": 6, "fields": {"app_label": "assets", "model": "assetextend"}}, {"model": "contenttypes.contenttype", "pk": 7, "fields": {"app_label": "auth", "model": "group"}}, {"model": "contenttypes.contenttype", "pk": 8, "fields": {"app_label": "auth", "model": "permission"}}, {"model": "contenttypes.contenttype", "pk": 9, "fields": {"app_label": "contenttypes", "model": "contenttype"}}, {"model": "contenttypes.contenttype", "pk": 10, "fields": {"app_label": "sessions", "model": "session"}}, {"model": "auth.permission", "pk": 1, "fields": {"name": "Can add user group", "content_type": 1, "codename": "add_usergroup"}}, {"model": "auth.permission", "pk": 2, "fields": {"name": "Can change user group", "content_type": 1, "codename": "change_usergroup"}}, {"model": "auth.permission", "pk": 3, "fields": {"name": "Can delete user group", "content_type": 1, "codename": "delete_usergroup"}}, {"model": "auth.permission", "pk": 4, "fields": {"name": "Can add user", "content_type": 2, "codename": "add_user"}}, {"model": "auth.permission", "pk": 5, "fields": {"name": "Can change user", "content_type": 2, "codename": "change_user"}}, {"model": "auth.permission", "pk": 6, "fields": {"name": "Can delete user", "content_type": 2, "codename": "delete_user"}}, {"model": "auth.permission", "pk": 7, "fields": {"name": "Can add asset group", "content_type": 3, "codename": "add_assetgroup"}}, {"model": "auth.permission", "pk": 8, "fields": {"name": "Can change asset group", "content_type": 3, "codename": "change_assetgroup"}}, {"model": "auth.permission", "pk": 9, "fields": {"name": "Can delete asset group", "content_type": 3, "codename": "delete_assetgroup"}}, {"model": "auth.permission", "pk": 10, "fields": {"name": "Can add IDC\u673a\u623f", "content_type": 4, "codename": "add_idc"}}, {"model": "auth.permission", "pk": 11, "fields": {"name": "Can change IDC\u673a\u623f", "content_type": 4, "codename": "change_idc"}}, {"model": "auth.permission", "pk": 12, "fields": {"name": "Can delete IDC\u673a\u623f", "content_type": 4, "codename": "delete_idc"}}, {"model": "auth.permission", "pk": 13, "fields": {"name": "Can add asset", "content_type": 5, "codename": "add_asset"}}, {"model": "auth.permission", "pk": 14, "fields": {"name": "Can change asset", "content_type": 5, "codename": "change_asset"}}, {"model": "auth.permission", "pk": 15, "fields": {"name": "Can delete asset", "content_type": 5, "codename": "delete_asset"}}, {"model": "auth.permission", "pk": 16, "fields": {"name": "Can add asset extend", "content_type": 6, "codename": "add_assetextend"}}, {"model": "auth.permission", "pk": 17, "fields": {"name": "Can change asset extend", "content_type": 6, "codename": "change_assetextend"}}, {"model": "auth.permission", "pk": 18, "fields": {"name": "Can delete asset extend", "content_type": 6, "codename": "delete_assetextend"}}, {"model": "auth.permission", "pk": 19, "fields": {"name": "Can add group", "content_type": 7, "codename": "add_group"}}, {"model": "auth.permission", "pk": 20, "fields": {"name": "Can change group", "content_type": 7, "codename": "change_group"}}, {"model": "auth.permission", "pk": 21, "fields": {"name": "Can delete group", "content_type": 7, "codename": "delete_group"}}, {"model": "auth.permission", "pk": 22, "fields": {"name": "Can add permission", "content_type": 8, "codename": "add_permission"}}, {"model": "auth.permission", "pk": 23, "fields": {"name": "Can change permission", "content_type": 8, "codename": "change_permission"}}, {"model": "auth.permission", "pk": 24, "fields": {"name": "Can delete permission", "content_type": 8, "codename": "delete_permission"}}, {"model": "auth.permission", "pk": 25, "fields": {"name": "Can add content type", "content_type": 9, "codename": "add_contenttype"}}, {"model": "auth.permission", "pk": 26, "fields": {"name": "Can change content type", "content_type": 9, "codename": "change_contenttype"}}, {"model": "auth.permission", "pk": 27, "fields": {"name": "Can delete content type", "content_type": 9, "codename": "delete_contenttype"}}, {"model": "auth.permission", "pk": 28, "fields": {"name": "Can add session", "content_type": 10, "codename": "add_session"}}, {"model": "auth.permission", "pk": 29, "fields": {"name": "Can change session", "content_type": 10, "codename": "change_session"}}, {"model": "auth.permission", "pk": 30, "fields": {"name": "Can delete session", "content_type": 10, "codename": "delete_session"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$MC3vobX7pa0C$l9qIj4UwHqODnj1hMvVy9DjLxbBumZaioQWIFrWQR7c=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:24:34.438Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "role": "Admin", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-07T08:24:34.438Z", "created_by": "System", "user_permissions": [], "groups": [1]}}, {"model": "users.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$30000$yNZSOWobN3Rl$qQthoTbTac4mWPCRZBfpgECmopE2Ee2VuyV8vO8sOMU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:27.364Z", "username": "kelly90", "name": "Louise Graham", "email": "denise@wikido.com", "role": "User", "avatar": "", "wechat": "barbara92", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce consequat.", "date_expired": "2086-08-07T08:28:27.364Z", "created_by": "admin", "user_permissions": [], "groups": [1, 15]}}, {"model": "users.user", "pk": 3, "fields": {"password": "pbkdf2_sha256$30000$wIwffDBEaD3J$opZ15T8kMrxk/IKK1qE9L3l5enL9QCMmCtAZGd3eegg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:27.526Z", "username": "alice82", "name": "Debra Ruiz", "email": "amy@abata.mil", "role": "User", "avatar": "", "wechat": "heather83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "date_expired": "2086-08-07T08:28:27.526Z", "created_by": "kelly90", "user_permissions": [], "groups": [1, 63]}}, {"model": "users.user", "pk": 4, "fields": {"password": "pbkdf2_sha256$30000$oH7H1RoGzcCF$+6O7VAix0BviVCQdd1TBuViIQdbwzdjvTVCEn8/kfn0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:27.693Z", "username": "ruth80", "name": "Kathleen Howard", "email": "brenda@jaxbean.org", "role": "Admin", "avatar": "", "wechat": "tina64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque porta volutpat erat.", "date_expired": "2086-08-07T08:28:27.693Z", "created_by": "alice82", "user_permissions": [], "groups": [1, 22]}}, {"model": "users.user", "pk": 5, "fields": {"password": "pbkdf2_sha256$30000$q2cwdxremOJe$g7eUgbYpny33zH0XSPqm7St1Hya4b6J8nKJhtWxXuVU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:27.882Z", "username": "cheryl65", "name": "Brenda Dunn", "email": "cheryl@fiveclub.info", "role": "Admin", "avatar": "", "wechat": "wanda65", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam molestie nibh in lectus.", "date_expired": "2086-08-07T08:28:27.882Z", "created_by": "admin", "user_permissions": [], "groups": [1, 99]}}, {"model": "users.user", "pk": 6, "fields": {"password": "pbkdf2_sha256$30000$hfOIIvnkXQaV$0fU1tEA2L4hVUXcZw/3ngWnabDWDDhFCY9a9VJrtTGg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.051Z", "username": "paula74", "name": "Lisa Payne", "email": "marilyn@realcube.biz", "role": "Admin", "avatar": "", "wechat": "denise91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo.", "date_expired": "2086-08-07T08:28:28.051Z", "created_by": "alice82", "user_permissions": [], "groups": [1, 36]}}, {"model": "users.user", "pk": 7, "fields": {"password": "pbkdf2_sha256$30000$p1AlW9euPRbI$kbqLYDYf3DMLcU2lS86GSpxNMhRsMTHTIOahHjGbH/k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.214Z", "username": "julia85", "name": "Helen Hart", "email": "brian@meemm.edu", "role": "Admin", "avatar": "", "wechat": "kelly93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_expired": "2086-08-07T08:28:28.214Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 47]}}, {"model": "users.user", "pk": 8, "fields": {"password": "pbkdf2_sha256$30000$2MluEddU7aIM$na6GOrUSSFVdvxaQ63zRJG1JMATZjdi306qkQ2C3W2s=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.379Z", "username": "diana67", "name": "Sarah Carpenter", "email": "beverly@linkbuzz.org", "role": "User", "avatar": "", "wechat": "wanda72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.", "date_expired": "2086-08-07T08:28:28.379Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 94]}}, {"model": "users.user", "pk": 9, "fields": {"password": "pbkdf2_sha256$30000$zZ3psax49Cgh$JMgc1rHRuZYkA9OGC42RuhBLmi/49iA56N8eK9TBgUM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.543Z", "username": "katherine66", "name": "Janet Mendoza", "email": "kimberly@realpoint.name", "role": "User", "avatar": "", "wechat": "cynthia79", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nam tristique tortor eu pede.", "date_expired": "2086-08-07T08:28:28.543Z", "created_by": "julia85", "user_permissions": [], "groups": [1, 24]}}, {"model": "users.user", "pk": 10, "fields": {"password": "pbkdf2_sha256$30000$BJDgNig7sJs9$KGPLjUQ9g3p/hZUUhaXULTw7aWKfAFJFloEMr7vHeD4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.709Z", "username": "andrea90", "name": "Shirley Bradley", "email": "anne@aimbu.edu", "role": "Admin", "avatar": "", "wechat": "shirley75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Phasellus sit amet erat.", "date_expired": "2086-08-07T08:28:28.709Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 67]}}, {"model": "users.user", "pk": 11, "fields": {"password": "pbkdf2_sha256$30000$RlCDGvXqJDPT$5HG5JiL4cbCVxVGjRkgX1OcWmp128uWsg2vB3VOKiwY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.871Z", "username": "nancy67", "name": "Kathy Armstrong", "email": "deborah@vipe.gov", "role": "Admin", "avatar": "", "wechat": "catherine70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam varius.", "date_expired": "2086-08-07T08:28:28.871Z", "created_by": "kelly90", "user_permissions": [], "groups": [1, 17]}}, {"model": "users.user", "pk": 12, "fields": {"password": "pbkdf2_sha256$30000$zqNu0TFHv3hk$ezY6/LMRTRrGXWm9yFGISxgN/tEECKl1ysMZtZ9Idi0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.043Z", "username": "elizabeth70", "name": "Marilyn Hall", "email": "christine@gigashots.info", "role": "User", "avatar": "", "wechat": "tammy93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum rutrum rutrum neque.", "date_expired": "2086-08-07T08:28:29.043Z", "created_by": "nancy67", "user_permissions": [], "groups": [1, 84]}}, {"model": "users.user", "pk": 13, "fields": {"password": "pbkdf2_sha256$30000$40lB7E6ySi8d$RNXLXzP/wYWwirpnvbBbSvLKrw6GH9/p3BqgI1pBWfE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.208Z", "username": "catherine86", "name": "Kelly Martinez", "email": "lillian@skibox.gov", "role": "Admin", "avatar": "", "wechat": "virginia84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum rutrum rutrum neque.", "date_expired": "2086-08-07T08:28:29.208Z", "created_by": "diana67", "user_permissions": [], "groups": [1, 101]}}, {"model": "users.user", "pk": 14, "fields": {"password": "pbkdf2_sha256$30000$FxumgXNTfOXY$PtL6OdyeP2uGZ+OXXdHSJ98x7bDaMq1qrar3uHi+ZS4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.378Z", "username": "anne65", "name": "Joan Martin", "email": "melissa@twitterwire.net", "role": "Admin", "avatar": "", "wechat": "carolyn67", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_expired": "2086-08-07T08:28:29.378Z", "created_by": "katherine66", "user_permissions": [], "groups": [1, 13]}}, {"model": "users.user", "pk": 15, "fields": {"password": "pbkdf2_sha256$30000$sjICFWQTmUY6$BsIiBvBzrrvMDmYPbn6QR3EyTytjv4z1vwfzrqr9JcM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.553Z", "username": "sara80", "name": "Phyllis Barnes", "email": "paula@tagchat.net", "role": "Admin", "avatar": "", "wechat": "angela68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam molestie nibh in lectus.", "date_expired": "2086-08-07T08:28:29.553Z", "created_by": "elizabeth70", "user_permissions": [], "groups": [1, 80]}}, {"model": "users.user", "pk": 16, "fields": {"password": "pbkdf2_sha256$30000$sxOa3lit0NqU$jJxqPBY4mI+ODEQrUSqf7fPSuL+xKQsQCEviDR0fb+0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.719Z", "username": "martha69", "name": "Rose Bell", "email": "julia@wikivu.biz", "role": "Admin", "avatar": "", "wechat": "marie77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_expired": "2086-08-07T08:28:29.719Z", "created_by": "julia85", "user_permissions": [], "groups": [1, 49]}}, {"model": "users.user", "pk": 17, "fields": {"password": "pbkdf2_sha256$30000$J3KkUAbAwesQ$j3oQfRxPQzXgSbPH/4ch57A4Cr20DFckDFav2yP7Cxk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.885Z", "username": "jane70", "name": "Gloria Medina", "email": "paula@twiyo.name", "role": "User", "avatar": "", "wechat": "barbara74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis mattis egestas metus.", "date_expired": "2086-08-07T08:28:29.885Z", "created_by": "admin", "user_permissions": [], "groups": [1, 35]}}, {"model": "users.user", "pk": 18, "fields": {"password": "pbkdf2_sha256$30000$EQGGqMhGTOrq$OfHX+CPqJ20MfcjgC99APoFF5vyXIaSHVCIAa31Dptk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.051Z", "username": "alice91", "name": "Ashley Fuller", "email": "marie@miboo.edu", "role": "Admin", "avatar": "", "wechat": "deborah70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque viverra pede ac diam.", "date_expired": "2086-08-07T08:28:30.052Z", "created_by": "jane70", "user_permissions": [], "groups": [1, 55]}}, {"model": "users.user", "pk": 19, "fields": {"password": "pbkdf2_sha256$30000$2xVLDbytCNBO$8UuzQ8JQyW/onkys95yZRyQNv+O5g61lXh1lqHVNomE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.218Z", "username": "nancy68", "name": "Margaret Ellis", "email": "anne@gabspot.com", "role": "Admin", "avatar": "", "wechat": "mary68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla facilisi.", "date_expired": "2086-08-07T08:28:30.219Z", "created_by": "sara80", "user_permissions": [], "groups": [1, 32]}}, {"model": "users.user", "pk": 20, "fields": {"password": "pbkdf2_sha256$30000$xgBQ4DtvfBbF$hpFvAO9oGMts0xWOqsEYMhgiwEs3Kfx/TkiiDTRUrDU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.390Z", "username": "rachel71", "name": "Virginia Reid", "email": "nancy@dynabox.name", "role": "Admin", "avatar": "", "wechat": "janet91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "date_expired": "2086-08-07T08:28:30.390Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 6]}}, {"model": "users.user", "pk": 21, "fields": {"password": "pbkdf2_sha256$30000$qffvM7Xh7k6J$+V2DFlceIeIflNk2/GzG+jbJVtykM/CK6YxGpCVqGyc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.558Z", "username": "phyllis91", "name": "Deborah Murray", "email": "annie@katz.gov", "role": "User", "avatar": "", "wechat": "shirley82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_expired": "2086-08-07T08:28:30.559Z", "created_by": "elizabeth70", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 22, "fields": {"password": "pbkdf2_sha256$30000$0lmP7GyOCdpn$/8j37xI29A+zsm+hlHRIbrZv1ZlLdOs2fe+FHx6p+Wk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.728Z", "username": "angela85", "name": "Amy Carpenter", "email": "sarah@tanoodle.com", "role": "User", "avatar": "", "wechat": "robin78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam justo.", "date_expired": "2086-08-07T08:28:30.728Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 66]}}, {"model": "users.user", "pk": 23, "fields": {"password": "pbkdf2_sha256$30000$7FsKnea4MaJp$iWWZGq98ZkyQKuTYYTu9rFxxIgZI3/l7a3WExkhsp8I=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.900Z", "username": "deborah79", "name": "Janice Cunningham", "email": "patricia@quinu.mil", "role": "User", "avatar": "", "wechat": "margaret90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum ac est lacinia nisi venenatis tristique.", "date_expired": "2086-08-07T08:28:30.900Z", "created_by": "alice91", "user_permissions": [], "groups": [1, 12]}}, {"model": "users.user", "pk": 24, "fields": {"password": "pbkdf2_sha256$30000$sZSvg6FHoFN9$1ftMr3P/fP3sH5M2JwPNYw6cvn3K7i9l25WDuSlnHs4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.069Z", "username": "linda71", "name": "Phyllis Powell", "email": "kathy@mydeo.name", "role": "Admin", "avatar": "", "wechat": "jane70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin risus.", "date_expired": "2086-08-07T08:28:31.069Z", "created_by": "deborah79", "user_permissions": [], "groups": [1, 86]}}, {"model": "users.user", "pk": 25, "fields": {"password": "pbkdf2_sha256$30000$EOYzOMQPLGZ5$qqqzNz4O27Zm+vdn2sMDSWC/NSzIljfcTuSMDAbvoxg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.238Z", "username": "joan93", "name": "Anna Stone", "email": "anne@midel.info", "role": "Admin", "avatar": "", "wechat": "janet68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque porta volutpat erat.", "date_expired": "2086-08-07T08:28:31.238Z", "created_by": "alice91", "user_permissions": [], "groups": [1, 71]}}, {"model": "users.user", "pk": 26, "fields": {"password": "pbkdf2_sha256$30000$Ptd48bnGq6jm$kDj9ZQMh8szTJPmHjQR6spjohSyIHKBnCtAjb31lTJY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.399Z", "username": "julia77", "name": "Jessica Ellis", "email": "doris@zava.org", "role": "Admin", "avatar": "", "wechat": "mildred73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_expired": "2086-08-07T08:28:31.399Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 27, "fields": {"password": "pbkdf2_sha256$30000$j2wxF9x6ogfR$8VM+Hk1Cj3QASiWgtD3ywfrSMu3Bu8PoAziypJ/g8ac=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.573Z", "username": "karen71", "name": "Anna Morrison", "email": "michelle@bluezoom.info", "role": "Admin", "avatar": "", "wechat": "sara64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam sit amet turpis elementum ligula vehicula consequat.", "date_expired": "2086-08-07T08:28:31.573Z", "created_by": "paula74", "user_permissions": [], "groups": [1, 91]}}, {"model": "users.user", "pk": 28, "fields": {"password": "pbkdf2_sha256$30000$i3oCNuy3kmmk$Ekh8Xb2F1hVTYkgwq8aS/cLgbV0Ax8guZ9KE0CxsobM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.740Z", "username": "kelly87", "name": "Phyllis Powell", "email": "angela@vidoo.name", "role": "User", "avatar": "", "wechat": "robin71", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris ullamcorper purus sit amet nulla.", "date_expired": "2086-08-07T08:28:31.740Z", "created_by": "nancy68", "user_permissions": [], "groups": [1, 69]}}, {"model": "users.user", "pk": 29, "fields": {"password": "pbkdf2_sha256$30000$nX9LMcvMgwAW$euCP/Ij2NlOWKSJRpmxFdvOruX3ap/pUus7eY18VE6M=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.900Z", "username": "donna86", "name": "Mildred George", "email": "jane@jatri.biz", "role": "Admin", "avatar": "", "wechat": "tammy67", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin leo odio, porttitor id, consequat in, consequat ut, nulla.", "date_expired": "2086-08-07T08:28:31.900Z", "created_by": "diana67", "user_permissions": [], "groups": [1, 8]}}, {"model": "users.user", "pk": 30, "fields": {"password": "pbkdf2_sha256$30000$ICz6gNHeh8KO$mBskkyHU95K8m9sYhohHUtDPi0JeGwi8WE4pfIEy5Vk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.070Z", "username": "helen73", "name": "Dorothy Willis", "email": "christine@devcast.mil", "role": "User", "avatar": "", "wechat": "martha64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque id justo sit amet sapien dignissim vestibulum.", "date_expired": "2086-08-07T08:28:32.070Z", "created_by": "deborah79", "user_permissions": [], "groups": [1, 58]}}, {"model": "users.user", "pk": 31, "fields": {"password": "pbkdf2_sha256$30000$eGRRzr5zuRxZ$vZA7L3a2nFMnbNsKdWJY7WskgCKFEJASNIOIP/nIXEU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.244Z", "username": "janice66", "name": "Norma Garrett", "email": "carol@izio.info", "role": "User", "avatar": "", "wechat": "anne68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam vel augue.", "date_expired": "2086-08-07T08:28:32.244Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 58]}}, {"model": "users.user", "pk": 32, "fields": {"password": "pbkdf2_sha256$30000$p9ycZp3fQfrF$N/Z9NC6GCsBgwhAKieWRv7elaAbnu9L0QDPY3co4e90=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.422Z", "username": "heather67", "name": "Helen Berry", "email": "kelly@yodo.com", "role": "User", "avatar": "", "wechat": "diana82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "date_expired": "2086-08-07T08:28:32.422Z", "created_by": "nancy68", "user_permissions": [], "groups": [1, 27]}}, {"model": "users.user", "pk": 33, "fields": {"password": "pbkdf2_sha256$30000$YrwlQADdtpic$dCxx0aFs44O/kWGTUo5PwRNxdlC9qE40Q68wQPuVFtU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.587Z", "username": "catherine80", "name": "Judy Wilson", "email": "tammy@quimm.info", "role": "User", "avatar": "", "wechat": "judy76", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In eleifend quam a odio.", "date_expired": "2086-08-07T08:28:32.587Z", "created_by": "janice66", "user_permissions": [], "groups": [1, 3]}}, {"model": "users.user", "pk": 34, "fields": {"password": "pbkdf2_sha256$30000$mlSeIgPPC7bZ$gixCwn6TcLyzN2iQJkI8WIxL6PIb3Mt7rCiRGf9I6Gs=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.759Z", "username": "carol68", "name": "Annie Mccoy", "email": "norma@fadeo.mil", "role": "User", "avatar": "", "wechat": "kathy87", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Curabitur in libero ut massa volutpat convallis.", "date_expired": "2086-08-07T08:28:32.759Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 45]}}, {"model": "users.user", "pk": 35, "fields": {"password": "pbkdf2_sha256$30000$uusQ02K7q0Lq$H6gkT/1hejdbLuOaaDSQf7n/PaBDiboOen4nhHyFf2k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.927Z", "username": "susan72", "name": "Heather Alvarez", "email": "rebecca@twitterlist.info", "role": "Admin", "avatar": "", "wechat": "jean78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "date_expired": "2086-08-07T08:28:32.927Z", "created_by": "joan93", "user_permissions": [], "groups": [1, 18]}}, {"model": "users.user", "pk": 36, "fields": {"password": "pbkdf2_sha256$30000$gYNPdDwpo9iX$utej1iSaEa7Yl53I3dtttLg9FDxM+0zggynBaOCQ0TU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.102Z", "username": "anna64", "name": "Laura Tucker", "email": "julia@blognation.net", "role": "Admin", "avatar": "", "wechat": "marie83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Praesent blandit lacinia erat.", "date_expired": "2086-08-07T08:28:33.102Z", "created_by": "paula74", "user_permissions": [], "groups": [1, 100]}}, {"model": "users.user", "pk": 37, "fields": {"password": "pbkdf2_sha256$30000$S4E17Qra03bA$KLxL3iR0uePpDIM7o0M9n5wJ/9SrsmUBf9e8bMh9EG8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.279Z", "username": "debra65", "name": "Kathryn Hill", "email": "joyce@shufflebeat.gov", "role": "User", "avatar": "", "wechat": "kimberly69", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Phasellus id sapien in sapien iaculis congue.", "date_expired": "2086-08-07T08:28:33.279Z", "created_by": "alice82", "user_permissions": [], "groups": [1, 17]}}, {"model": "users.user", "pk": 38, "fields": {"password": "pbkdf2_sha256$30000$Qg4QNxmxbi8C$5PFxSJhmCgo3/v8m83WEKdgXp55h0YGi2Dif20z/vUA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.446Z", "username": "frances70", "name": "Evelyn Matthews", "email": "jennifer@oloo.mil", "role": "User", "avatar": "", "wechat": "virginia86", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras non velit nec nisi vulputate nonummy.", "date_expired": "2086-08-07T08:28:33.446Z", "created_by": "admin", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 39, "fields": {"password": "pbkdf2_sha256$30000$qdtflj11nfCB$XO8fRmeH88+p/MMYoR0KKHDW+FQSzjjvvfP+Nlhass0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.617Z", "username": "marie79", "name": "Sara Hall", "email": "kimberly@yadel.gov", "role": "User", "avatar": "", "wechat": "ann69", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer tincidunt ante vel ipsum.", "date_expired": "2086-08-07T08:28:33.617Z", "created_by": "julia85", "user_permissions": [], "groups": [1, 39]}}, {"model": "users.user", "pk": 40, "fields": {"password": "pbkdf2_sha256$30000$QFy1OdH17txx$8Psd7+Y56UmYJlBdbI5KMl6FlUUO7X36J8+Fz68qMW4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.789Z", "username": "jessica65", "name": "Maria Ross", "email": "donna@rhyzio.edu", "role": "Admin", "avatar": "", "wechat": "jessica70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque eget nunc.", "date_expired": "2086-08-07T08:28:33.789Z", "created_by": "angela85", "user_permissions": [], "groups": [1, 24]}}, {"model": "users.user", "pk": 41, "fields": {"password": "pbkdf2_sha256$30000$F20fxq4LSr6c$pzttCD16zt9a0Mx5AwNf5is4XdjjwSsIJ6YcEsLLApU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.955Z", "username": "melissa79", "name": "Marilyn Chavez", "email": "judith@brainbox.net", "role": "User", "avatar": "", "wechat": "julia63", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo.", "date_expired": "2086-08-07T08:28:33.955Z", "created_by": "elizabeth70", "user_permissions": [], "groups": [1, 31]}}, {"model": "users.user", "pk": 42, "fields": {"password": "pbkdf2_sha256$30000$2B6OskcgsZUL$It3rtOrwCS5iPsymmQmkXDfvblVjREgQg7aVhOQHhsw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.122Z", "username": "frances63", "name": "Lillian Stone", "email": "christine@jumpxs.name", "role": "User", "avatar": "", "wechat": "norma88", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", "date_expired": "2086-08-07T08:28:34.122Z", "created_by": "jane70", "user_permissions": [], "groups": [1, 13]}}, {"model": "users.user", "pk": 43, "fields": {"password": "pbkdf2_sha256$30000$8Vc7DWMqnDCn$4jZh/GSazSUShLUK35ICWdVmGAeW6Ba7PP//CtSSe4k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.291Z", "username": "betty76", "name": "Shirley Howard", "email": "robin@voonte.mil", "role": "User", "avatar": "", "wechat": "kathleen74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce consequat.", "date_expired": "2086-08-07T08:28:34.291Z", "created_by": "rachel71", "user_permissions": [], "groups": [1, 92]}}, {"model": "users.user", "pk": 44, "fields": {"password": "pbkdf2_sha256$30000$bPqoMiKJt9aP$W9sU/rcRac00djidMqqzFSMme5dlnVdrLdiJRvVsyU8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.463Z", "username": "marie86", "name": "Debra Clark", "email": "christina@devify.mil", "role": "User", "avatar": "", "wechat": "wanda65", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla justo.", "date_expired": "2086-08-07T08:28:34.463Z", "created_by": "karen71", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 45, "fields": {"password": "pbkdf2_sha256$30000$y0Xd2dCqAQCt$MzfBMGtMCpzPEJ4MYE7qkMIp3qac/4UjWQZcRs2m8Xo=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.636Z", "username": "christine86", "name": "Lillian Berry", "email": "angela@ntags.biz", "role": "Admin", "avatar": "", "wechat": "michelle82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam porttitor lacus at turpis.", "date_expired": "2086-08-07T08:28:34.636Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 12]}}, {"model": "users.user", "pk": 46, "fields": {"password": "pbkdf2_sha256$30000$4jPSAo5SbHxi$H1KVNR9gmffRqwkV6WXHQPICBNHz/yg0RPtrC4/jquE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.810Z", "username": "jean93", "name": "Kathy Carroll", "email": "sandra@zoomzone.mil", "role": "Admin", "avatar": "", "wechat": "beverly71", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In est risus, auctor sed, tristique in, tempus sit amet, sem.", "date_expired": "2086-08-07T08:28:34.810Z", "created_by": "paula74", "user_permissions": [], "groups": [1, 90]}}, {"model": "users.user", "pk": 47, "fields": {"password": "pbkdf2_sha256$30000$i4UnL4WDW5fC$2+xRGEQ8hBOIsg+OCU7Jb7qLu/H211/GCyBmXsGaO3g=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.978Z", "username": "tammy88", "name": "Jennifer Garrett", "email": "andrea@innotype.biz", "role": "User", "avatar": "", "wechat": "sharon68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi.", "date_expired": "2086-08-07T08:28:34.978Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 71]}}, {"model": "users.user", "pk": 48, "fields": {"password": "pbkdf2_sha256$30000$6N0r8tqOu3gC$nODa0E+vS1scLJYxNdsJwTpy5MRLLe9yw+2kRQaNHJE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.142Z", "username": "anne87", "name": "Patricia Weaver", "email": "paula@tagpad.mil", "role": "Admin", "avatar": "", "wechat": "norma74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla ut erat id mauris vulputate elementum.", "date_expired": "2086-08-07T08:28:35.142Z", "created_by": "frances63", "user_permissions": [], "groups": [1, 22]}}, {"model": "users.user", "pk": 49, "fields": {"password": "pbkdf2_sha256$30000$D1tMvBBTQUVv$a2PWfGR/5IQgJ2yLNGwgZ4gz6zPloKknos3lVVA46zM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.317Z", "username": "janet92", "name": "Anne King", "email": "pamela@thoughtstorm.gov", "role": "User", "avatar": "", "wechat": "mildred67", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", "date_expired": "2086-08-07T08:28:35.317Z", "created_by": "linda71", "user_permissions": [], "groups": [1, 92]}}, {"model": "users.user", "pk": 50, "fields": {"password": "pbkdf2_sha256$30000$XQ8hvDyDE4cr$eCWi/3Z1Cyhh0GmLsjwhxFeYTmkj0c96b1EgU2OAI2E=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.487Z", "username": "pamela86", "name": "Michelle Gomez", "email": "amanda@wordware.com", "role": "User", "avatar": "", "wechat": "evelyn71", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus in felis eu sapien cursus vestibulum.", "date_expired": "2086-08-07T08:28:35.487Z", "created_by": "karen71", "user_permissions": [], "groups": [1, 41]}}, {"model": "users.user", "pk": 51, "fields": {"password": "pbkdf2_sha256$30000$UnK9cNpgwgzV$JXO2yHEfEjzcK6bWzbyC56yielKH0smjMU0yrdupafc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.658Z", "username": "ruby91", "name": "Gloria Richards", "email": "susan@edgeclub.biz", "role": "User", "avatar": "", "wechat": "norma93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam faucibus cursus urna.", "date_expired": "2086-08-07T08:28:35.658Z", "created_by": "anne87", "user_permissions": [], "groups": [1, 63]}}, {"model": "users.user", "pk": 52, "fields": {"password": "pbkdf2_sha256$30000$f0bLtRkCljcn$gGvTMtV6NqJF7trmKA7G+Em8buYBuv+ROBpsjf4THqQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.880Z", "username": "deborah71", "name": "Ruth Perry", "email": "cynthia@lazzy.biz", "role": "User", "avatar": "", "wechat": "irene74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Donec ut mauris eget massa tempor convallis.", "date_expired": "2086-08-07T08:28:35.880Z", "created_by": "frances70", "user_permissions": [], "groups": [1, 15]}}, {"model": "users.user", "pk": 53, "fields": {"password": "pbkdf2_sha256$30000$1TBXzRO4NYI1$XvQsCr5DlMof68/Nmgu1lOvFzk1bs3sMpoQpyJlRTOA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.067Z", "username": "annie94", "name": "Debra Carroll", "email": "carol@brainsphere.info", "role": "User", "avatar": "", "wechat": "jacqueline64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_expired": "2086-08-07T08:28:36.067Z", "created_by": "anne87", "user_permissions": [], "groups": [1, 74]}}, {"model": "users.user", "pk": 54, "fields": {"password": "pbkdf2_sha256$30000$sgQX3LfKTo79$4WVDzP6NvCpuwrF9CB6L76/GJhLsZmGs1u4VP9T0nBg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.239Z", "username": "louise91", "name": "Ann Knight", "email": "louise@jaxworks.com", "role": "User", "avatar": "", "wechat": "stephanie89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla nisl.", "date_expired": "2086-08-07T08:28:36.239Z", "created_by": "janet92", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 55, "fields": {"password": "pbkdf2_sha256$30000$GpBkGACwIQ5d$jJLcoN1VsPENNmKom1rJx8WinDpNeu6eXQF6uNAolBQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.413Z", "username": "doris80", "name": "Kimberly Gibson", "email": "melissa@zoomcast.net", "role": "User", "avatar": "", "wechat": "emily78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin at turpis a pede posuere nonummy.", "date_expired": "2086-08-07T08:28:36.413Z", "created_by": "ruby91", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 56, "fields": {"password": "pbkdf2_sha256$30000$JhqNYk5eUk28$7n8ReaBiCAPq7WbxDRP0pMl7cxSwQAfFHw5Ggmn7cJA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.594Z", "username": "sara67", "name": "Kathryn Mason", "email": "tina@oyondu.biz", "role": "User", "avatar": "", "wechat": "judith74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis aliquam convallis nunc.", "date_expired": "2086-08-07T08:28:36.594Z", "created_by": "rachel71", "user_permissions": [], "groups": [1, 72]}}, {"model": "users.user", "pk": 57, "fields": {"password": "pbkdf2_sha256$30000$8jc2xlDQzqxV$/an5bkloSmz/MgJn4+y4FNWN8q43Zr26wuhjL+WL34E=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.769Z", "username": "phyllis72", "name": "Judy Burns", "email": "evelyn@voomm.mil", "role": "User", "avatar": "", "wechat": "shirley89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_expired": "2086-08-07T08:28:36.769Z", "created_by": "susan72", "user_permissions": [], "groups": [1, 24]}}, {"model": "users.user", "pk": 58, "fields": {"password": "pbkdf2_sha256$30000$Vm5Btl1y6oBV$BHoN1F2BMLeeKVdbz0Ah87ZbC0zFdlKL4JcJvYlmGyo=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.944Z", "username": "jennifer78", "name": "Kelly Arnold", "email": "mildred@gabvine.biz", "role": "User", "avatar": "", "wechat": "melissa78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Praesent lectus.", "date_expired": "2086-08-07T08:28:36.944Z", "created_by": "martha69", "user_permissions": [], "groups": [1, 60]}}, {"model": "users.user", "pk": 59, "fields": {"password": "pbkdf2_sha256$30000$082liCF7dOEC$GlWO4X+DQe3y7y5516ofn/mZLMOeQDvt9LMw06arjJc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.118Z", "username": "kathryn75", "name": "Linda Harrison", "email": "christina@aimbu.mil", "role": "Admin", "avatar": "", "wechat": "mary81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis consequat dui nec nisi volutpat eleifend.", "date_expired": "2086-08-07T08:28:37.118Z", "created_by": "angela85", "user_permissions": [], "groups": [1, 51]}}, {"model": "users.user", "pk": 60, "fields": {"password": "pbkdf2_sha256$30000$RM597Mvp6GOc$3h1e5QvcV5bE6OenOYzdJNF0yVso08pymLPGqeerJqw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.301Z", "username": "joyce71", "name": "Pamela Payne", "email": "louise@linkbuzz.mil", "role": "User", "avatar": "", "wechat": "ashley84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis at velit eu est congue elementum.", "date_expired": "2086-08-07T08:28:37.301Z", "created_by": "paula74", "user_permissions": [], "groups": [1, 74]}}, {"model": "users.user", "pk": 61, "fields": {"password": "pbkdf2_sha256$30000$cJsctboWnVGC$+ppsZkvx/CbQAd2zk3TmFXhMK613Es825+KpNxdgTNw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.482Z", "username": "dorothy78", "name": "Mildred Turner", "email": "nancy@quaxo.com", "role": "Admin", "avatar": "", "wechat": "lois75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.", "date_expired": "2086-08-07T08:28:37.482Z", "created_by": "louise91", "user_permissions": [], "groups": [1, 44]}}, {"model": "users.user", "pk": 62, "fields": {"password": "pbkdf2_sha256$30000$HbHG20XKWfD9$cFbE2EGMXt6YrweKM5vnrXjnYlz7MGYrHZp9biThEZM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.660Z", "username": "jessica68", "name": "Nicole Shaw", "email": "kathy@brainsphere.mil", "role": "Admin", "avatar": "", "wechat": "carolyn85", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque at nulla.", "date_expired": "2086-08-07T08:28:37.660Z", "created_by": "kathryn75", "user_permissions": [], "groups": [1, 66]}}, {"model": "users.user", "pk": 63, "fields": {"password": "pbkdf2_sha256$30000$U5pJunQzaMt8$GM5WIhA8IKkK7Wi/2qHWpy/uOYukx4QNXYDDUcgUukw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.830Z", "username": "kathy87", "name": "Laura Lynch", "email": "louise@photospace.net", "role": "Admin", "avatar": "", "wechat": "betty72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nunc rhoncus dui vel sem.", "date_expired": "2086-08-07T08:28:37.830Z", "created_by": "phyllis91", "user_permissions": [], "groups": [1, 100]}}, {"model": "users.user", "pk": 64, "fields": {"password": "pbkdf2_sha256$30000$Fy5vAQw6BXHe$oq8j8c0HN89W3J4jRQqJJOOq8R9CnUJsk4ahTXRsVvQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.003Z", "username": "susan78", "name": "Catherine Watkins", "email": "rose@devpulse.com", "role": "Admin", "avatar": "", "wechat": "frances93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_expired": "2086-08-07T08:28:38.003Z", "created_by": "jessica65", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 65, "fields": {"password": "pbkdf2_sha256$30000$WZX6D8oCNGJo$KVX6YFggdd1cmM+XQzd6KTKp1wEQDGRjdv2fB5R2XqE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.179Z", "username": "ruth93", "name": "Irene Campbell", "email": "debra@wikizz.mil", "role": "Admin", "avatar": "", "wechat": "laura90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque eget nunc.", "date_expired": "2086-08-07T08:28:38.179Z", "created_by": "linda71", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 66, "fields": {"password": "pbkdf2_sha256$30000$bjo1e1VWco0G$3l1lf4UBz01a1WO1t4Gx8TWeV9WOMSQwfFcP24rV5gE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.355Z", "username": "frances92", "name": "Kathryn Fields", "email": "bonnie@avaveo.gov", "role": "Admin", "avatar": "", "wechat": "heather77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque ut erat.", "date_expired": "2086-08-07T08:28:38.355Z", "created_by": "katherine66", "user_permissions": [], "groups": [1, 53]}}, {"model": "users.user", "pk": 67, "fields": {"password": "pbkdf2_sha256$30000$JttyHFZiTcFW$0oetRMFdJ37YPaNhrN+p0bAknEbiL2xzWbtsobDwY5o=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.530Z", "username": "pamela64", "name": "Gloria Cruz", "email": "nancy@tazzy.mil", "role": "Admin", "avatar": "", "wechat": "betty89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas pulvinar lobortis est.", "date_expired": "2086-08-07T08:28:38.530Z", "created_by": "heather67", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 68, "fields": {"password": "pbkdf2_sha256$30000$1RsHRAPegsyk$R0y8OVuwbkAoOa6h4hCtHEejKIoTkl+m3HRhe++ESsk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.709Z", "username": "tina83", "name": "Michelle Marshall", "email": "julie@skyvu.biz", "role": "Admin", "avatar": "", "wechat": "amanda64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In hac habitasse platea dictumst.", "date_expired": "2086-08-07T08:28:38.709Z", "created_by": "jane70", "user_permissions": [], "groups": [1, 5]}}, {"model": "users.user", "pk": 69, "fields": {"password": "pbkdf2_sha256$30000$HxdquslYeFyq$NUL2UzrkPEqt51JixNV8K3lOwJ/UjSapUtXBSjm1JCA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.878Z", "username": "jessica70", "name": "Katherine Nichols", "email": "lillian@trunyx.net", "role": "User", "avatar": "", "wechat": "katherine68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi vel lectus in quam fringilla rhoncus.", "date_expired": "2086-08-07T08:28:38.878Z", "created_by": "dorothy78", "user_permissions": [], "groups": [1, 11]}}, {"model": "users.user", "pk": 70, "fields": {"password": "pbkdf2_sha256$30000$oDwymM0MQJgc$I34H6igYt3e1rQmQVNw6SC0WmjZX3wY6YBwQHUEe5Dw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.048Z", "username": "emily75", "name": "Evelyn Ferguson", "email": "angela@kazu.biz", "role": "Admin", "avatar": "", "wechat": "lisa81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris sit amet eros.", "date_expired": "2086-08-07T08:28:39.048Z", "created_by": "janice66", "user_permissions": [], "groups": [1, 82]}}, {"model": "users.user", "pk": 71, "fields": {"password": "pbkdf2_sha256$30000$dhr6hh27WXDQ$baWYdAVQy44SrtwQ5PdHAlLCNGiZg34Jqy3ZTW3fzRY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.220Z", "username": "rebecca73", "name": "Catherine Lopez", "email": "evelyn@brainverse.com", "role": "Admin", "avatar": "", "wechat": "kathryn81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam vel augue.", "date_expired": "2086-08-07T08:28:39.220Z", "created_by": "jessica70", "user_permissions": [], "groups": [1, 96]}}, {"model": "users.user", "pk": 72, "fields": {"password": "pbkdf2_sha256$30000$5yDQBB3JOP7t$A10o7ATrCgM6Ga+WFom9ltYqARbAxd7jn4WgGD0REPU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.390Z", "username": "catherine74", "name": "Ruth Jordan", "email": "nancy@flashset.com", "role": "Admin", "avatar": "", "wechat": "beverly64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Ut tellus.", "date_expired": "2086-08-07T08:28:39.390Z", "created_by": "andrea90", "user_permissions": [], "groups": [1, 21]}}, {"model": "users.user", "pk": 73, "fields": {"password": "pbkdf2_sha256$30000$RA9462tqlWbl$RmWpLjHVXa4x5Wv/Snt1AXoF1FtYNItsxE5HLZCkZg4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.554Z", "username": "phyllis78", "name": "Angela Jackson", "email": "deborah@yadel.name", "role": "User", "avatar": "", "wechat": "tina90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam vel augue.", "date_expired": "2086-08-07T08:28:39.554Z", "created_by": "karen71", "user_permissions": [], "groups": [1, 29]}}, {"model": "users.user", "pk": 74, "fields": {"password": "pbkdf2_sha256$30000$0CJZ42imsLpj$uv8ewfpqmbeOiDppb2XuOftJn+5f2ylReR/QrCGJOno=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.718Z", "username": "ruby72", "name": "Ann Johnston", "email": "alice@skippad.info", "role": "User", "avatar": "", "wechat": "jane82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam faucibus cursus urna.", "date_expired": "2086-08-07T08:28:39.718Z", "created_by": "rebecca73", "user_permissions": [], "groups": [1, 35]}}, {"model": "users.user", "pk": 75, "fields": {"password": "pbkdf2_sha256$30000$fDlwx7BshvJf$MFAImUkVcR+kKNN5EsJkp3kASKxfnZoqppfUqocy3z4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.887Z", "username": "sharon76", "name": "Andrea Powell", "email": "ruth@omba.com", "role": "User", "avatar": "", "wechat": "carol72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer tincidunt ante vel ipsum.", "date_expired": "2086-08-07T08:28:39.887Z", "created_by": "katherine66", "user_permissions": [], "groups": [1, 13]}}, {"model": "users.user", "pk": 76, "fields": {"password": "pbkdf2_sha256$30000$zvnXmknAI9RB$d+J5nYmJrkyjQgNAjSBhYXv3g1RietnMUQ7NGnilOVM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.055Z", "username": "anna89", "name": "Annie Jacobs", "email": "joan@rhybox.gov", "role": "Admin", "avatar": "", "wechat": "cynthia70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.", "date_expired": "2086-08-07T08:28:40.055Z", "created_by": "christine86", "user_permissions": [], "groups": [1, 32]}}, {"model": "users.user", "pk": 77, "fields": {"password": "pbkdf2_sha256$30000$AzgTx4TsQK9f$UKsJQePzCR9o3JVNBLraPjHgsZAdEXkiyYlExeaZkts=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.220Z", "username": "amanda80", "name": "Theresa Murray", "email": "teresa@mycat.name", "role": "User", "avatar": "", "wechat": "carol82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Sed vel enim sit amet nunc viverra dapibus.", "date_expired": "2086-08-07T08:28:40.220Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 35]}}, {"model": "users.user", "pk": 78, "fields": {"password": "pbkdf2_sha256$30000$FeTfHi7naFxK$Q/ti6HpujlsaOVinCAlOfscUJ1BZeN9gVobq1i+6eP8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.395Z", "username": "ruth83", "name": "Kimberly Edwards", "email": "laura@pixope.gov", "role": "Admin", "avatar": "", "wechat": "martha69", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin at turpis a pede posuere nonummy.", "date_expired": "2086-08-07T08:28:40.395Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 53]}}, {"model": "users.user", "pk": 79, "fields": {"password": "pbkdf2_sha256$30000$MbcnEja0arkE$nffCEDWn0VI0wx01MftSjNAyS7soA2GiCHtBDLbWWw8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.568Z", "username": "gloria84", "name": "Ruth Bryant", "email": "marie@cogibox.mil", "role": "User", "avatar": "", "wechat": "sara82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer ac leo.", "date_expired": "2086-08-07T08:28:40.568Z", "created_by": "tammy88", "user_permissions": [], "groups": [1]}}, {"model": "users.user", "pk": 80, "fields": {"password": "pbkdf2_sha256$30000$1C6xRcrTFOtP$DktCF1JtEcLkugJm5OXdNOXzJRKQEHnSwtPCXfI1TEg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.744Z", "username": "lois85", "name": "Annie Harvey", "email": "jennifer@centizu.edu", "role": "User", "avatar": "", "wechat": "catherine83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer non velit.", "date_expired": "2086-08-07T08:28:40.744Z", "created_by": "gloria84", "user_permissions": [], "groups": [1, 63]}}, {"model": "users.user", "pk": 81, "fields": {"password": "pbkdf2_sha256$30000$0xFZz2uiFiRs$+skfKQONB79O75+VQJoU4QqTIllCNWLTTBq0fJAFeYw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.916Z", "username": "bonnie82", "name": "Ruth Snyder", "email": "irene@vinte.edu", "role": "User", "avatar": "", "wechat": "cheryl72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc.", "date_expired": "2086-08-07T08:28:40.916Z", "created_by": "jessica65", "user_permissions": [], "groups": [1, 35]}}, {"model": "users.user", "pk": 82, "fields": {"password": "pbkdf2_sha256$30000$1dXoe9vGrnKv$drHeEFI/bCXS3jwnu3pBCxJF37P5FC3M32VKtGOu2VI=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.084Z", "username": "janet74", "name": "Denise Gilbert", "email": "elizabeth@camimbo.org", "role": "Admin", "avatar": "", "wechat": "julia94", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vestibulum sagittis sapien.", "date_expired": "2086-08-07T08:28:41.084Z", "created_by": "joan93", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 83, "fields": {"password": "pbkdf2_sha256$30000$493QFfk3ZmH0$nkcZmGw0n5falyoZBVCGKEzoZ7mpkXM1E7sbWWJcPSw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.269Z", "username": "kimberly80", "name": "Julie Black", "email": "alice@aimbu.gov", "role": "Admin", "avatar": "", "wechat": "jacqueline66", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aliquam sit amet diam in magna bibendum imperdiet.", "date_expired": "2086-08-07T08:28:41.269Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 73]}}, {"model": "users.user", "pk": 84, "fields": {"password": "pbkdf2_sha256$30000$69v4y0VkVOAq$CazOpZXAjj5AEMKY6EqMR1L7dGvewnriym+7iAZuTDw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.444Z", "username": "heather90", "name": "Lillian Lewis", "email": "joyce@chatterpoint.com", "role": "User", "avatar": "", "wechat": "linda70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aliquam sit amet diam in magna bibendum imperdiet.", "date_expired": "2086-08-07T08:28:41.444Z", "created_by": "jessica68", "user_permissions": [], "groups": [1, 63]}}, {"model": "users.user", "pk": 85, "fields": {"password": "pbkdf2_sha256$30000$oioTwzMZWbGE$qAmLUDGWH2cXYD41cPxA4Otg4kYOhzsqcaBjAhIhulY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.618Z", "username": "margaret83", "name": "Sandra Bradley", "email": "norma@dabjam.biz", "role": "User", "avatar": "", "wechat": "anna72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam pretium iaculis justo.", "date_expired": "2086-08-07T08:28:41.619Z", "created_by": "kelly87", "user_permissions": [], "groups": [1, 81]}}, {"model": "users.user", "pk": 86, "fields": {"password": "pbkdf2_sha256$30000$9RXRYrXDZt43$3JTS2HVgsnYQQJlGCfOi07/pEvPPiGHlc8pUd27bZIA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.792Z", "username": "michelle85", "name": "Joyce Richards", "email": "kathleen@centidel.edu", "role": "User", "avatar": "", "wechat": "patricia87", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer ac leo.", "date_expired": "2086-08-07T08:28:41.792Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 44]}}, {"model": "users.user", "pk": 87, "fields": {"password": "pbkdf2_sha256$30000$w97iKyeRIHbm$g01Mkn27oMU8Kdc026iIgHzaO3w9NQ6l+yxM5NSwiy8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.973Z", "username": "joan94", "name": "Theresa Gonzalez", "email": "dorothy@trudeo.gov", "role": "Admin", "avatar": "", "wechat": "anna83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Curabitur at ipsum ac tellus semper interdum.", "date_expired": "2086-08-07T08:28:41.973Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 88, "fields": {"password": "pbkdf2_sha256$30000$78JGLDoVPZy3$RpnmgxFQel2ZxEn5ONEXEurrLPVaVe4U0yk2qtFND7k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.147Z", "username": "heather85", "name": "Gloria Phillips", "email": "jane@livez.com", "role": "Admin", "avatar": "", "wechat": "debra78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris sit amet eros.", "date_expired": "2086-08-07T08:28:42.147Z", "created_by": "joan94", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 89, "fields": {"password": "pbkdf2_sha256$30000$xqjFpBq89AdU$tOuvyBSOEDDnMLldWk9IJrRTYLP2yChIMR5gPCDjuD4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.330Z", "username": "irene94", "name": "Linda Nichols", "email": "norma@edgeclub.gov", "role": "User", "avatar": "", "wechat": "brenda84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa.", "date_expired": "2086-08-07T08:28:42.330Z", "created_by": "ruby72", "user_permissions": [], "groups": [1, 86]}}, {"model": "users.user", "pk": 90, "fields": {"password": "pbkdf2_sha256$30000$vq3fGM2341TD$QCIab505iEJXMDdjd7NctR3nfL6CPtp7BIu9pJAbMqg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.500Z", "username": "pamela88", "name": "Diana Castillo", "email": "frances@ooba.biz", "role": "Admin", "avatar": "", "wechat": "betty75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In sagittis dui vel nisl.", "date_expired": "2086-08-07T08:28:42.500Z", "created_by": "doris80", "user_permissions": [], "groups": [1, 60]}}, {"model": "users.user", "pk": 91, "fields": {"password": "pbkdf2_sha256$30000$JQhrFswD8kgR$Ii2nQft1hRq8HLjy9Ph3+4nziFdjYczx3LR6E8aRLIc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.675Z", "username": "carolyn70", "name": "Andrea Rice", "email": "karen@skynoodle.mil", "role": "Admin", "avatar": "", "wechat": "irene70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In blandit ultrices enim.", "date_expired": "2086-08-07T08:28:42.675Z", "created_by": "heather85", "user_permissions": [], "groups": [1, 101]}}, {"model": "users.user", "pk": 92, "fields": {"password": "pbkdf2_sha256$30000$ElB3UukIRlrB$Phh6ujwtDMeLtvpGpzPQoZqlXDZRHh52UTEovXjlumE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.848Z", "username": "judy74", "name": "Norma Spencer", "email": "kathryn@photobug.org", "role": "Admin", "avatar": "", "wechat": "brenda73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nunc rhoncus dui vel sem.", "date_expired": "2086-08-07T08:28:42.848Z", "created_by": "helen73", "user_permissions": [], "groups": [1, 34]}}, {"model": "users.user", "pk": 93, "fields": {"password": "pbkdf2_sha256$30000$w04UrJuCXeDn$KP35fbxINr7/2ME4FIU2FWh6HUsmA5PHqcQThcRbXc4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.026Z", "username": "amanda79", "name": "Angela Kelley", "email": "wanda@gigaclub.edu", "role": "User", "avatar": "", "wechat": "phyllis68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas rhoncus aliquam lacus.", "date_expired": "2086-08-07T08:28:43.027Z", "created_by": "annie94", "user_permissions": [], "groups": [1, 21]}}, {"model": "users.user", "pk": 94, "fields": {"password": "pbkdf2_sha256$30000$cb7WZCwshudU$FgK4A4C78q/jSWt5xxmx9lh4OQz14Tjbt9FQ8ZwQ48w=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.198Z", "username": "janice79", "name": "Christine Wagner", "email": "kathryn@gigazoom.biz", "role": "User", "avatar": "", "wechat": "rebecca73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris lacinia sapien quis libero.", "date_expired": "2086-08-07T08:28:43.198Z", "created_by": "alice91", "user_permissions": [], "groups": [1, 83]}}, {"model": "users.user", "pk": 95, "fields": {"password": "pbkdf2_sha256$30000$Dl1ZfqZzYVrm$U/EWtQdO6bKqSLa0E1BgJ2xVnopBmH1U0NvLDgdRaV8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.369Z", "username": "paula85", "name": "Tammy Mason", "email": "marie@gabtune.biz", "role": "Admin", "avatar": "", "wechat": "barbara90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.", "date_expired": "2086-08-07T08:28:43.369Z", "created_by": "amanda79", "user_permissions": [], "groups": [1, 19]}}, {"model": "users.user", "pk": 96, "fields": {"password": "pbkdf2_sha256$30000$6z5UindQfosg$zgLh1rzEIWzJ8hqbVDikLsnuBAex/SHHnyvGZ9ky/HA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.544Z", "username": "michelle71", "name": "Laura Edwards", "email": "phyllis@youbridge.net", "role": "Admin", "avatar": "", "wechat": "virginia72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo.", "date_expired": "2086-08-07T08:28:43.544Z", "created_by": "louise91", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 97, "fields": {"password": "pbkdf2_sha256$30000$vMBkUgmf9xyx$r7FsATzJelp12GELuLy8imj8yFjBXwNgIPjzdvNMfFQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.716Z", "username": "virginia79", "name": "Bonnie Ryan", "email": "ashley@npath.mil", "role": "User", "avatar": "", "wechat": "kathleen65", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_expired": "2086-08-07T08:28:43.716Z", "created_by": "paula85", "user_permissions": [], "groups": [1, 84]}}, {"model": "users.user", "pk": 98, "fields": {"password": "pbkdf2_sha256$30000$znjFHoPtepw6$Ob2i7Ds7tAJf5c75D+WUshT9zHPZaq82R2OPmaGc+28=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.893Z", "username": "teresa85", "name": "Karen Mills", "email": "christina@leenti.com", "role": "User", "avatar": "", "wechat": "lisa79", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aenean auctor gravida sem.", "date_expired": "2086-08-07T08:28:43.893Z", "created_by": "heather90", "user_permissions": [], "groups": [1, 31]}}, {"model": "users.user", "pk": 99, "fields": {"password": "pbkdf2_sha256$30000$AJmKiJo2SafR$beLOo8FB5BLGgOBgLq0ksuoomUGnJigh2UXHdN9FUno=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:44.064Z", "username": "emily73", "name": "Debra Lane", "email": "susan@meezzy.info", "role": "Admin", "avatar": "", "wechat": "bonnie77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.", "date_expired": "2086-08-07T08:28:44.064Z", "created_by": "nancy68", "user_permissions": [], "groups": [1, 9]}}, {"model": "users.user", "pk": 100, "fields": {"password": "pbkdf2_sha256$30000$Kfk3jcSn9LdX$2wPA/h+FngHPlV/SMni7x/Ljs7/qExH+mBq7xRNX6no=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:44.235Z", "username": "lori85", "name": "Robin Cooper", "email": "rachel@zoozzy.name", "role": "User", "avatar": "", "wechat": "virginia70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Donec semper sapien a libero.", "date_expired": "2086-08-07T08:28:44.235Z", "created_by": "jane70", "user_permissions": [], "groups": [1, 44]}}, {"model": "users.user", "pk": 101, "fields": {"password": "pbkdf2_sha256$30000$FMdEDD6qovwL$V/MEYLk6sF4AIbqQN1XMftBqCDn2sVZybFXBJjxTv1k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:44.407Z", "username": "laura78", "name": "Janet Bennett", "email": "denise@divanoodle.name", "role": "User", "avatar": "", "wechat": "katherine81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque viverra pede ac diam.", "date_expired": "2086-08-07T08:28:44.407Z", "created_by": "kimberly80", "user_permissions": [], "groups": [1, 57]}}]
\ No newline at end of file
[{"model": "users.role", "pk": 1, "fields": {"name": "Administrator", "date_added": "2016-08-20T17:03:42.631Z", "created_by": "System", "comment": "\u7ba1\u7406\u5458", "permissions": [16, 17, 18, 19, 20, 21, 10, 11, 12, 13, 14, 15, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 1, 2, 3, 4, 5, 6, 7, 8, 9]}}, {"model": "users.role", "pk": 2, "fields": {"name": "User", "date_added": "2016-08-20T17:03:42.671Z", "created_by": "System", "comment": "\u7528\u6237", "permissions": []}}, {"model": "users.role", "pk": 3, "fields": {"name": "Auditor", "date_added": "2016-08-20T17:03:42.683Z", "created_by": "System", "comment": "\u5ba1\u8ba1\u5458", "permissions": []}}, {"model": "users.usergroup", "pk": 1, "fields": {"name": "ALL", "comment": "Default usergroup for all user", "date_added": "2016-08-20T17:03:42.693Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$xZUhPadgI8rs$n2rm5futcOv7Ww4b4BflN8K90Vk3u7ozfnOS7GQq0ns=", "last_login": null, "is_superuser": false, "first_name": "", "last_name": "", "is_staff": false, "is_active": true, "date_joined": "2016-08-20T17:03:42.752Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "role": 1, "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-03T17:03:42.753Z", "created_by": "System", "user_permissions": [], "groups": [1]}}][{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_added": "2016-08-24T08:24:34.436Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$MC3vobX7pa0C$l9qIj4UwHqODnj1hMvVy9DjLxbBumZaioQWIFrWQR7c=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:24:34.438Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "role": "Admin", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-07T08:24:34.438Z", "created_by": "System", "user_permissions": [], "groups": [1]}}]
\ No newline at end of file
[{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_added": "2016-08-24T08:24:34.436Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$MC3vobX7pa0C$l9qIj4UwHqODnj1hMvVy9DjLxbBumZaioQWIFrWQR7c=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:24:34.438Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "role": "Admin", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-07T08:24:34.438Z", "created_by": "System", "user_permissions": [], "groups": [1]}}]
\ No newline at end of file
[{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_added": "2016-08-24T08:24:34.436Z", "created_by": "System"}}, {"model": "users.usergroup", "pk": 2, "fields": {"name": "Jack Kelly", "comment": "Donec dapibus.", "date_added": "2016-08-24T08:28:27.037Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 3, "fields": {"name": "Tina Thomas", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.039Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 4, "fields": {"name": "Denise Anderson", "comment": "Pellentesque eget nunc.", "date_added": "2016-08-24T08:28:27.041Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 5, "fields": {"name": "Joe Cox", "comment": "Sed ante.", "date_added": "2016-08-24T08:28:27.043Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 6, "fields": {"name": "Louise Tucker", "comment": "Etiam faucibus cursus urna.", "date_added": "2016-08-24T08:28:27.045Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 7, "fields": {"name": "Anne Owens", "comment": "Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.", "date_added": "2016-08-24T08:28:27.047Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 8, "fields": {"name": "Tammy Ramos", "comment": "Praesent blandit lacinia erat.", "date_added": "2016-08-24T08:28:27.049Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 9, "fields": {"name": "Christina Lynch", "comment": "Ut at dolor quis odio consequat varius.", "date_added": "2016-08-24T08:28:27.051Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 10, "fields": {"name": "Jennifer Hanson", "comment": "Mauris lacinia sapien quis libero.", "date_added": "2016-08-24T08:28:27.053Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 11, "fields": {"name": "Arthur Kelly", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_added": "2016-08-24T08:28:27.055Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 12, "fields": {"name": "Katherine Henry", "comment": "Duis at velit eu est congue elementum.", "date_added": "2016-08-24T08:28:27.058Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 13, "fields": {"name": "Lori Burns", "comment": "Curabitur in libero ut massa volutpat convallis.", "date_added": "2016-08-24T08:28:27.060Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 14, "fields": {"name": "Ann Greene", "comment": "Duis at velit eu est congue elementum.", "date_added": "2016-08-24T08:28:27.062Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 15, "fields": {"name": "Kathy Porter", "comment": "Curabitur at ipsum ac tellus semper interdum.", "date_added": "2016-08-24T08:28:27.063Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 16, "fields": {"name": "Betty Porter", "comment": "Sed ante.", "date_added": "2016-08-24T08:28:27.065Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 17, "fields": {"name": "Emily Fowler", "comment": "Nam tristique tortor eu pede.", "date_added": "2016-08-24T08:28:27.067Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 18, "fields": {"name": "Stephanie Wood", "comment": "In congue.", "date_added": "2016-08-24T08:28:27.068Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 19, "fields": {"name": "Sharon Spencer", "comment": "Vivamus vestibulum sagittis sapien.", "date_added": "2016-08-24T08:28:27.070Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 20, "fields": {"name": "Louise Johnston", "comment": "Duis consequat dui nec nisi volutpat eleifend.", "date_added": "2016-08-24T08:28:27.072Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 21, "fields": {"name": "Kimberly Medina", "comment": "Phasellus in felis.", "date_added": "2016-08-24T08:28:27.074Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 22, "fields": {"name": "Tammy Coleman", "comment": "Aliquam non mauris.", "date_added": "2016-08-24T08:28:27.076Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 23, "fields": {"name": "Sharon Fox", "comment": "Cras non velit nec nisi vulputate nonummy.", "date_added": "2016-08-24T08:28:27.077Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 24, "fields": {"name": "Julia Webb", "comment": "Donec quis orci eget orci vehicula condimentum.", "date_added": "2016-08-24T08:28:27.079Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 25, "fields": {"name": "Rose Wilson", "comment": "Vestibulum sed magna at nunc commodo placerat.", "date_added": "2016-08-24T08:28:27.081Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 26, "fields": {"name": "Doris Johnson", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.082Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 27, "fields": {"name": "Janet Howell", "comment": "Duis consequat dui nec nisi volutpat eleifend.", "date_added": "2016-08-24T08:28:27.084Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 28, "fields": {"name": "Irene Simpson", "comment": "Integer a nibh.", "date_added": "2016-08-24T08:28:27.086Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 29, "fields": {"name": "Cheryl Bailey", "comment": "Donec semper sapien a libero.", "date_added": "2016-08-24T08:28:27.088Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 30, "fields": {"name": "Anne Elliott", "comment": "Suspendisse accumsan tortor quis turpis.", "date_added": "2016-08-24T08:28:27.089Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 31, "fields": {"name": "Jean Welch", "comment": "Nunc purus.", "date_added": "2016-08-24T08:28:27.091Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 32, "fields": {"name": "Bonnie Gray", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "date_added": "2016-08-24T08:28:27.092Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 33, "fields": {"name": "Diana Fisher", "comment": "Maecenas tincidunt lacus at velit.", "date_added": "2016-08-24T08:28:27.094Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 34, "fields": {"name": "Jennifer James", "comment": "Phasellus id sapien in sapien iaculis congue.", "date_added": "2016-08-24T08:28:27.096Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 35, "fields": {"name": "Sara Mason", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "date_added": "2016-08-24T08:28:27.098Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 36, "fields": {"name": "Pamela Austin", "comment": "Etiam justo.", "date_added": "2016-08-24T08:28:27.100Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 37, "fields": {"name": "Sara George", "comment": "Integer ac leo.", "date_added": "2016-08-24T08:28:27.102Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 38, "fields": {"name": "Margaret Ramos", "comment": "Cras non velit nec nisi vulputate nonummy.", "date_added": "2016-08-24T08:28:27.104Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 39, "fields": {"name": "Elizabeth Powell", "comment": "In sagittis dui vel nisl.", "date_added": "2016-08-24T08:28:27.105Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 40, "fields": {"name": "Kimberly Mccoy", "comment": "Nulla nisl.", "date_added": "2016-08-24T08:28:27.108Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 41, "fields": {"name": "Sharon Price", "comment": "Donec quis orci eget orci vehicula condimentum.", "date_added": "2016-08-24T08:28:27.109Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 42, "fields": {"name": "Marilyn Dean", "comment": "Aenean sit amet justo.", "date_added": "2016-08-24T08:28:27.111Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 43, "fields": {"name": "Linda King", "comment": "Integer tincidunt ante vel ipsum.", "date_added": "2016-08-24T08:28:27.113Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 44, "fields": {"name": "Ann Freeman", "comment": "Donec quis orci eget orci vehicula condimentum.", "date_added": "2016-08-24T08:28:27.114Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 45, "fields": {"name": "Janet Webb", "comment": "In sagittis dui vel nisl.", "date_added": "2016-08-24T08:28:27.116Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 46, "fields": {"name": "Julie Stone", "comment": "Fusce consequat.", "date_added": "2016-08-24T08:28:27.119Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 47, "fields": {"name": "Annie Rice", "comment": "Quisque id justo sit amet sapien dignissim vestibulum.", "date_added": "2016-08-24T08:28:27.122Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 48, "fields": {"name": "Brenda Matthews", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.124Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 49, "fields": {"name": "Amanda Ruiz", "comment": "Sed ante.", "date_added": "2016-08-24T08:28:27.125Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 50, "fields": {"name": "Ruby Brown", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.127Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 51, "fields": {"name": "Mary Richards", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "date_added": "2016-08-24T08:28:27.129Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 52, "fields": {"name": "Andrea Woods", "comment": "Curabitur convallis.", "date_added": "2016-08-24T08:28:27.131Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 53, "fields": {"name": "Mary Hughes", "comment": "Suspendisse ornare consequat lectus.", "date_added": "2016-08-24T08:28:27.133Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 54, "fields": {"name": "Evelyn Palmer", "comment": "Praesent id massa id nisl venenatis lacinia.", "date_added": "2016-08-24T08:28:27.135Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 55, "fields": {"name": "Joan Stewart", "comment": "Integer tincidunt ante vel ipsum.", "date_added": "2016-08-24T08:28:27.136Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 56, "fields": {"name": "Tammy Edwards", "comment": "In congue.", "date_added": "2016-08-24T08:28:27.138Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 57, "fields": {"name": "Tina Chapman", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_added": "2016-08-24T08:28:27.140Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 58, "fields": {"name": "Donna Hart", "comment": "Nulla facilisi.", "date_added": "2016-08-24T08:28:27.142Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 59, "fields": {"name": "Teresa Pierce", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.143Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 60, "fields": {"name": "Annie Austin", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.145Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 61, "fields": {"name": "Judith Johnston", "comment": "Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo.", "date_added": "2016-08-24T08:28:27.147Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 62, "fields": {"name": "Gloria Willis", "comment": "Pellentesque at nulla.", "date_added": "2016-08-24T08:28:27.148Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 63, "fields": {"name": "Catherine Fields", "comment": "Nunc purus.", "date_added": "2016-08-24T08:28:27.150Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 64, "fields": {"name": "Julie Webb", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.152Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 65, "fields": {"name": "Deborah Wood", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-08-24T08:28:27.154Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 66, "fields": {"name": "Stephanie Hall", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "date_added": "2016-08-24T08:28:27.156Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 67, "fields": {"name": "Theresa Hall", "comment": "Mauris lacinia sapien quis libero.", "date_added": "2016-08-24T08:28:27.158Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 68, "fields": {"name": "Debra Wallace", "comment": "Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue.", "date_added": "2016-08-24T08:28:27.159Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 69, "fields": {"name": "Maria Cunningham", "comment": "Integer a nibh.", "date_added": "2016-08-24T08:28:27.161Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 70, "fields": {"name": "Joan Henry", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.162Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 71, "fields": {"name": "Alice Nelson", "comment": "Suspendisse accumsan tortor quis turpis.", "date_added": "2016-08-24T08:28:27.164Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 72, "fields": {"name": "Donna Porter", "comment": "Maecenas pulvinar lobortis est.", "date_added": "2016-08-24T08:28:27.166Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 73, "fields": {"name": "Jessica Evans", "comment": "Nulla suscipit ligula in lacus.", "date_added": "2016-08-24T08:28:27.168Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 74, "fields": {"name": "Tammy Burns", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_added": "2016-08-24T08:28:27.169Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 75, "fields": {"name": "Evelyn Brooks", "comment": "Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.", "date_added": "2016-08-24T08:28:27.171Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 76, "fields": {"name": "Carol Williamson", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_added": "2016-08-24T08:28:27.173Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 77, "fields": {"name": "Diana Bowman", "comment": "Donec posuere metus vitae ipsum.", "date_added": "2016-08-24T08:28:27.175Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 78, "fields": {"name": "Wanda Owens", "comment": "Nunc rhoncus dui vel sem.", "date_added": "2016-08-24T08:28:27.177Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 79, "fields": {"name": "Ruth Castillo", "comment": "Aenean lectus.", "date_added": "2016-08-24T08:28:27.178Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 80, "fields": {"name": "Joan Ross", "comment": "Fusce consequat.", "date_added": "2016-08-24T08:28:27.180Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 81, "fields": {"name": "Barbara Hicks", "comment": "Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.", "date_added": "2016-08-24T08:28:27.182Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 82, "fields": {"name": "Melissa Hicks", "comment": "Integer a nibh.", "date_added": "2016-08-24T08:28:27.184Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 83, "fields": {"name": "Melissa Woods", "comment": "Suspendisse potenti.", "date_added": "2016-08-24T08:28:27.185Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 84, "fields": {"name": "Janice Schmidt", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est.", "date_added": "2016-08-24T08:28:27.187Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 85, "fields": {"name": "Diane West", "comment": "Suspendisse potenti.", "date_added": "2016-08-24T08:28:27.189Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 86, "fields": {"name": "Rachel Myers", "comment": "Curabitur at ipsum ac tellus semper interdum.", "date_added": "2016-08-24T08:28:27.191Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 87, "fields": {"name": "Elizabeth Morgan", "comment": "Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.", "date_added": "2016-08-24T08:28:27.192Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 88, "fields": {"name": "Michelle Howell", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_added": "2016-08-24T08:28:27.194Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 89, "fields": {"name": "Joyce Richardson", "comment": "Pellentesque ultrices mattis odio.", "date_added": "2016-08-24T08:28:27.196Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 90, "fields": {"name": "Judy Stone", "comment": "Suspendisse accumsan tortor quis turpis.", "date_added": "2016-08-24T08:28:27.198Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 91, "fields": {"name": "Norma Garcia", "comment": "Proin eu mi.", "date_added": "2016-08-24T08:28:27.199Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 92, "fields": {"name": "Marie Torres", "comment": "Mauris sit amet eros.", "date_added": "2016-08-24T08:28:27.201Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 93, "fields": {"name": "Dorothy Williamson", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_added": "2016-08-24T08:28:27.203Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 94, "fields": {"name": "Martha Gonzales", "comment": "Donec ut dolor.", "date_added": "2016-08-24T08:28:27.205Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 95, "fields": {"name": "Katherine Frazier", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_added": "2016-08-24T08:28:27.207Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 96, "fields": {"name": "Betty Bell", "comment": "Donec ut mauris eget massa tempor convallis.", "date_added": "2016-08-24T08:28:27.209Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 97, "fields": {"name": "Janice Peterson", "comment": "Nullam porttitor lacus at turpis.", "date_added": "2016-08-24T08:28:27.211Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 98, "fields": {"name": "Teresa Morales", "comment": "Nam dui.", "date_added": "2016-08-24T08:28:27.212Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 99, "fields": {"name": "Mildred Price", "comment": "Nulla nisl.", "date_added": "2016-08-24T08:28:27.214Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 100, "fields": {"name": "Elizabeth Stevens", "comment": "Aliquam non mauris.", "date_added": "2016-08-24T08:28:27.215Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 101, "fields": {"name": "Doris Chapman", "comment": "Donec ut mauris eget massa tempor convallis.", "date_added": "2016-08-24T08:28:27.217Z", "created_by": "admin"}}, {"model": "contenttypes.contenttype", "pk": 1, "fields": {"app_label": "users", "model": "usergroup"}}, {"model": "contenttypes.contenttype", "pk": 2, "fields": {"app_label": "users", "model": "user"}}, {"model": "contenttypes.contenttype", "pk": 3, "fields": {"app_label": "assets", "model": "assetgroup"}}, {"model": "contenttypes.contenttype", "pk": 4, "fields": {"app_label": "assets", "model": "idc"}}, {"model": "contenttypes.contenttype", "pk": 5, "fields": {"app_label": "assets", "model": "asset"}}, {"model": "contenttypes.contenttype", "pk": 6, "fields": {"app_label": "assets", "model": "assetextend"}}, {"model": "contenttypes.contenttype", "pk": 7, "fields": {"app_label": "auth", "model": "group"}}, {"model": "contenttypes.contenttype", "pk": 8, "fields": {"app_label": "auth", "model": "permission"}}, {"model": "contenttypes.contenttype", "pk": 9, "fields": {"app_label": "contenttypes", "model": "contenttype"}}, {"model": "contenttypes.contenttype", "pk": 10, "fields": {"app_label": "sessions", "model": "session"}}, {"model": "auth.permission", "pk": 1, "fields": {"name": "Can add user group", "content_type": 1, "codename": "add_usergroup"}}, {"model": "auth.permission", "pk": 2, "fields": {"name": "Can change user group", "content_type": 1, "codename": "change_usergroup"}}, {"model": "auth.permission", "pk": 3, "fields": {"name": "Can delete user group", "content_type": 1, "codename": "delete_usergroup"}}, {"model": "auth.permission", "pk": 4, "fields": {"name": "Can add user", "content_type": 2, "codename": "add_user"}}, {"model": "auth.permission", "pk": 5, "fields": {"name": "Can change user", "content_type": 2, "codename": "change_user"}}, {"model": "auth.permission", "pk": 6, "fields": {"name": "Can delete user", "content_type": 2, "codename": "delete_user"}}, {"model": "auth.permission", "pk": 7, "fields": {"name": "Can add asset group", "content_type": 3, "codename": "add_assetgroup"}}, {"model": "auth.permission", "pk": 8, "fields": {"name": "Can change asset group", "content_type": 3, "codename": "change_assetgroup"}}, {"model": "auth.permission", "pk": 9, "fields": {"name": "Can delete asset group", "content_type": 3, "codename": "delete_assetgroup"}}, {"model": "auth.permission", "pk": 10, "fields": {"name": "Can add IDC\u673a\u623f", "content_type": 4, "codename": "add_idc"}}, {"model": "auth.permission", "pk": 11, "fields": {"name": "Can change IDC\u673a\u623f", "content_type": 4, "codename": "change_idc"}}, {"model": "auth.permission", "pk": 12, "fields": {"name": "Can delete IDC\u673a\u623f", "content_type": 4, "codename": "delete_idc"}}, {"model": "auth.permission", "pk": 13, "fields": {"name": "Can add asset", "content_type": 5, "codename": "add_asset"}}, {"model": "auth.permission", "pk": 14, "fields": {"name": "Can change asset", "content_type": 5, "codename": "change_asset"}}, {"model": "auth.permission", "pk": 15, "fields": {"name": "Can delete asset", "content_type": 5, "codename": "delete_asset"}}, {"model": "auth.permission", "pk": 16, "fields": {"name": "Can add asset extend", "content_type": 6, "codename": "add_assetextend"}}, {"model": "auth.permission", "pk": 17, "fields": {"name": "Can change asset extend", "content_type": 6, "codename": "change_assetextend"}}, {"model": "auth.permission", "pk": 18, "fields": {"name": "Can delete asset extend", "content_type": 6, "codename": "delete_assetextend"}}, {"model": "auth.permission", "pk": 19, "fields": {"name": "Can add group", "content_type": 7, "codename": "add_group"}}, {"model": "auth.permission", "pk": 20, "fields": {"name": "Can change group", "content_type": 7, "codename": "change_group"}}, {"model": "auth.permission", "pk": 21, "fields": {"name": "Can delete group", "content_type": 7, "codename": "delete_group"}}, {"model": "auth.permission", "pk": 22, "fields": {"name": "Can add permission", "content_type": 8, "codename": "add_permission"}}, {"model": "auth.permission", "pk": 23, "fields": {"name": "Can change permission", "content_type": 8, "codename": "change_permission"}}, {"model": "auth.permission", "pk": 24, "fields": {"name": "Can delete permission", "content_type": 8, "codename": "delete_permission"}}, {"model": "auth.permission", "pk": 25, "fields": {"name": "Can add content type", "content_type": 9, "codename": "add_contenttype"}}, {"model": "auth.permission", "pk": 26, "fields": {"name": "Can change content type", "content_type": 9, "codename": "change_contenttype"}}, {"model": "auth.permission", "pk": 27, "fields": {"name": "Can delete content type", "content_type": 9, "codename": "delete_contenttype"}}, {"model": "auth.permission", "pk": 28, "fields": {"name": "Can add session", "content_type": 10, "codename": "add_session"}}, {"model": "auth.permission", "pk": 29, "fields": {"name": "Can change session", "content_type": 10, "codename": "change_session"}}, {"model": "auth.permission", "pk": 30, "fields": {"name": "Can delete session", "content_type": 10, "codename": "delete_session"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$MC3vobX7pa0C$l9qIj4UwHqODnj1hMvVy9DjLxbBumZaioQWIFrWQR7c=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:24:34.438Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "role": "Admin", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-07T08:24:34.438Z", "created_by": "System", "user_permissions": [], "groups": [1]}}, {"model": "users.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$30000$yNZSOWobN3Rl$qQthoTbTac4mWPCRZBfpgECmopE2Ee2VuyV8vO8sOMU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:27.364Z", "username": "kelly90", "name": "Louise Graham", "email": "denise@wikido.com", "role": "User", "avatar": "", "wechat": "barbara92", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce consequat.", "date_expired": "2086-08-07T08:28:27.364Z", "created_by": "admin", "user_permissions": [], "groups": [1, 15]}}, {"model": "users.user", "pk": 3, "fields": {"password": "pbkdf2_sha256$30000$wIwffDBEaD3J$opZ15T8kMrxk/IKK1qE9L3l5enL9QCMmCtAZGd3eegg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:27.526Z", "username": "alice82", "name": "Debra Ruiz", "email": "amy@abata.mil", "role": "User", "avatar": "", "wechat": "heather83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "date_expired": "2086-08-07T08:28:27.526Z", "created_by": "kelly90", "user_permissions": [], "groups": [1, 63]}}, {"model": "users.user", "pk": 4, "fields": {"password": "pbkdf2_sha256$30000$oH7H1RoGzcCF$+6O7VAix0BviVCQdd1TBuViIQdbwzdjvTVCEn8/kfn0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:27.693Z", "username": "ruth80", "name": "Kathleen Howard", "email": "brenda@jaxbean.org", "role": "Admin", "avatar": "", "wechat": "tina64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque porta volutpat erat.", "date_expired": "2086-08-07T08:28:27.693Z", "created_by": "alice82", "user_permissions": [], "groups": [1, 22]}}, {"model": "users.user", "pk": 5, "fields": {"password": "pbkdf2_sha256$30000$q2cwdxremOJe$g7eUgbYpny33zH0XSPqm7St1Hya4b6J8nKJhtWxXuVU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:27.882Z", "username": "cheryl65", "name": "Brenda Dunn", "email": "cheryl@fiveclub.info", "role": "Admin", "avatar": "", "wechat": "wanda65", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam molestie nibh in lectus.", "date_expired": "2086-08-07T08:28:27.882Z", "created_by": "admin", "user_permissions": [], "groups": [1, 99]}}, {"model": "users.user", "pk": 6, "fields": {"password": "pbkdf2_sha256$30000$hfOIIvnkXQaV$0fU1tEA2L4hVUXcZw/3ngWnabDWDDhFCY9a9VJrtTGg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.051Z", "username": "paula74", "name": "Lisa Payne", "email": "marilyn@realcube.biz", "role": "Admin", "avatar": "", "wechat": "denise91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo.", "date_expired": "2086-08-07T08:28:28.051Z", "created_by": "alice82", "user_permissions": [], "groups": [1, 36]}}, {"model": "users.user", "pk": 7, "fields": {"password": "pbkdf2_sha256$30000$p1AlW9euPRbI$kbqLYDYf3DMLcU2lS86GSpxNMhRsMTHTIOahHjGbH/k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.214Z", "username": "julia85", "name": "Helen Hart", "email": "brian@meemm.edu", "role": "Admin", "avatar": "", "wechat": "kelly93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_expired": "2086-08-07T08:28:28.214Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 47]}}, {"model": "users.user", "pk": 8, "fields": {"password": "pbkdf2_sha256$30000$2MluEddU7aIM$na6GOrUSSFVdvxaQ63zRJG1JMATZjdi306qkQ2C3W2s=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.379Z", "username": "diana67", "name": "Sarah Carpenter", "email": "beverly@linkbuzz.org", "role": "User", "avatar": "", "wechat": "wanda72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.", "date_expired": "2086-08-07T08:28:28.379Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 94]}}, {"model": "users.user", "pk": 9, "fields": {"password": "pbkdf2_sha256$30000$zZ3psax49Cgh$JMgc1rHRuZYkA9OGC42RuhBLmi/49iA56N8eK9TBgUM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.543Z", "username": "katherine66", "name": "Janet Mendoza", "email": "kimberly@realpoint.name", "role": "User", "avatar": "", "wechat": "cynthia79", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nam tristique tortor eu pede.", "date_expired": "2086-08-07T08:28:28.543Z", "created_by": "julia85", "user_permissions": [], "groups": [1, 24]}}, {"model": "users.user", "pk": 10, "fields": {"password": "pbkdf2_sha256$30000$BJDgNig7sJs9$KGPLjUQ9g3p/hZUUhaXULTw7aWKfAFJFloEMr7vHeD4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.709Z", "username": "andrea90", "name": "Shirley Bradley", "email": "anne@aimbu.edu", "role": "Admin", "avatar": "", "wechat": "shirley75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Phasellus sit amet erat.", "date_expired": "2086-08-07T08:28:28.709Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 67]}}, {"model": "users.user", "pk": 11, "fields": {"password": "pbkdf2_sha256$30000$RlCDGvXqJDPT$5HG5JiL4cbCVxVGjRkgX1OcWmp128uWsg2vB3VOKiwY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:28.871Z", "username": "nancy67", "name": "Kathy Armstrong", "email": "deborah@vipe.gov", "role": "Admin", "avatar": "", "wechat": "catherine70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam varius.", "date_expired": "2086-08-07T08:28:28.871Z", "created_by": "kelly90", "user_permissions": [], "groups": [1, 17]}}, {"model": "users.user", "pk": 12, "fields": {"password": "pbkdf2_sha256$30000$zqNu0TFHv3hk$ezY6/LMRTRrGXWm9yFGISxgN/tEECKl1ysMZtZ9Idi0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.043Z", "username": "elizabeth70", "name": "Marilyn Hall", "email": "christine@gigashots.info", "role": "User", "avatar": "", "wechat": "tammy93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum rutrum rutrum neque.", "date_expired": "2086-08-07T08:28:29.043Z", "created_by": "nancy67", "user_permissions": [], "groups": [1, 84]}}, {"model": "users.user", "pk": 13, "fields": {"password": "pbkdf2_sha256$30000$40lB7E6ySi8d$RNXLXzP/wYWwirpnvbBbSvLKrw6GH9/p3BqgI1pBWfE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.208Z", "username": "catherine86", "name": "Kelly Martinez", "email": "lillian@skibox.gov", "role": "Admin", "avatar": "", "wechat": "virginia84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum rutrum rutrum neque.", "date_expired": "2086-08-07T08:28:29.208Z", "created_by": "diana67", "user_permissions": [], "groups": [1, 101]}}, {"model": "users.user", "pk": 14, "fields": {"password": "pbkdf2_sha256$30000$FxumgXNTfOXY$PtL6OdyeP2uGZ+OXXdHSJ98x7bDaMq1qrar3uHi+ZS4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.378Z", "username": "anne65", "name": "Joan Martin", "email": "melissa@twitterwire.net", "role": "Admin", "avatar": "", "wechat": "carolyn67", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_expired": "2086-08-07T08:28:29.378Z", "created_by": "katherine66", "user_permissions": [], "groups": [1, 13]}}, {"model": "users.user", "pk": 15, "fields": {"password": "pbkdf2_sha256$30000$sjICFWQTmUY6$BsIiBvBzrrvMDmYPbn6QR3EyTytjv4z1vwfzrqr9JcM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.553Z", "username": "sara80", "name": "Phyllis Barnes", "email": "paula@tagchat.net", "role": "Admin", "avatar": "", "wechat": "angela68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam molestie nibh in lectus.", "date_expired": "2086-08-07T08:28:29.553Z", "created_by": "elizabeth70", "user_permissions": [], "groups": [1, 80]}}, {"model": "users.user", "pk": 16, "fields": {"password": "pbkdf2_sha256$30000$sxOa3lit0NqU$jJxqPBY4mI+ODEQrUSqf7fPSuL+xKQsQCEviDR0fb+0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.719Z", "username": "martha69", "name": "Rose Bell", "email": "julia@wikivu.biz", "role": "Admin", "avatar": "", "wechat": "marie77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_expired": "2086-08-07T08:28:29.719Z", "created_by": "julia85", "user_permissions": [], "groups": [1, 49]}}, {"model": "users.user", "pk": 17, "fields": {"password": "pbkdf2_sha256$30000$J3KkUAbAwesQ$j3oQfRxPQzXgSbPH/4ch57A4Cr20DFckDFav2yP7Cxk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:29.885Z", "username": "jane70", "name": "Gloria Medina", "email": "paula@twiyo.name", "role": "User", "avatar": "", "wechat": "barbara74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis mattis egestas metus.", "date_expired": "2086-08-07T08:28:29.885Z", "created_by": "admin", "user_permissions": [], "groups": [1, 35]}}, {"model": "users.user", "pk": 18, "fields": {"password": "pbkdf2_sha256$30000$EQGGqMhGTOrq$OfHX+CPqJ20MfcjgC99APoFF5vyXIaSHVCIAa31Dptk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.051Z", "username": "alice91", "name": "Ashley Fuller", "email": "marie@miboo.edu", "role": "Admin", "avatar": "", "wechat": "deborah70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque viverra pede ac diam.", "date_expired": "2086-08-07T08:28:30.052Z", "created_by": "jane70", "user_permissions": [], "groups": [1, 55]}}, {"model": "users.user", "pk": 19, "fields": {"password": "pbkdf2_sha256$30000$2xVLDbytCNBO$8UuzQ8JQyW/onkys95yZRyQNv+O5g61lXh1lqHVNomE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.218Z", "username": "nancy68", "name": "Margaret Ellis", "email": "anne@gabspot.com", "role": "Admin", "avatar": "", "wechat": "mary68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla facilisi.", "date_expired": "2086-08-07T08:28:30.219Z", "created_by": "sara80", "user_permissions": [], "groups": [1, 32]}}, {"model": "users.user", "pk": 20, "fields": {"password": "pbkdf2_sha256$30000$xgBQ4DtvfBbF$hpFvAO9oGMts0xWOqsEYMhgiwEs3Kfx/TkiiDTRUrDU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.390Z", "username": "rachel71", "name": "Virginia Reid", "email": "nancy@dynabox.name", "role": "Admin", "avatar": "", "wechat": "janet91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "date_expired": "2086-08-07T08:28:30.390Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 6]}}, {"model": "users.user", "pk": 21, "fields": {"password": "pbkdf2_sha256$30000$qffvM7Xh7k6J$+V2DFlceIeIflNk2/GzG+jbJVtykM/CK6YxGpCVqGyc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.558Z", "username": "phyllis91", "name": "Deborah Murray", "email": "annie@katz.gov", "role": "User", "avatar": "", "wechat": "shirley82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_expired": "2086-08-07T08:28:30.559Z", "created_by": "elizabeth70", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 22, "fields": {"password": "pbkdf2_sha256$30000$0lmP7GyOCdpn$/8j37xI29A+zsm+hlHRIbrZv1ZlLdOs2fe+FHx6p+Wk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.728Z", "username": "angela85", "name": "Amy Carpenter", "email": "sarah@tanoodle.com", "role": "User", "avatar": "", "wechat": "robin78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam justo.", "date_expired": "2086-08-07T08:28:30.728Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 66]}}, {"model": "users.user", "pk": 23, "fields": {"password": "pbkdf2_sha256$30000$7FsKnea4MaJp$iWWZGq98ZkyQKuTYYTu9rFxxIgZI3/l7a3WExkhsp8I=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:30.900Z", "username": "deborah79", "name": "Janice Cunningham", "email": "patricia@quinu.mil", "role": "User", "avatar": "", "wechat": "margaret90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum ac est lacinia nisi venenatis tristique.", "date_expired": "2086-08-07T08:28:30.900Z", "created_by": "alice91", "user_permissions": [], "groups": [1, 12]}}, {"model": "users.user", "pk": 24, "fields": {"password": "pbkdf2_sha256$30000$sZSvg6FHoFN9$1ftMr3P/fP3sH5M2JwPNYw6cvn3K7i9l25WDuSlnHs4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.069Z", "username": "linda71", "name": "Phyllis Powell", "email": "kathy@mydeo.name", "role": "Admin", "avatar": "", "wechat": "jane70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin risus.", "date_expired": "2086-08-07T08:28:31.069Z", "created_by": "deborah79", "user_permissions": [], "groups": [1, 86]}}, {"model": "users.user", "pk": 25, "fields": {"password": "pbkdf2_sha256$30000$EOYzOMQPLGZ5$qqqzNz4O27Zm+vdn2sMDSWC/NSzIljfcTuSMDAbvoxg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.238Z", "username": "joan93", "name": "Anna Stone", "email": "anne@midel.info", "role": "Admin", "avatar": "", "wechat": "janet68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque porta volutpat erat.", "date_expired": "2086-08-07T08:28:31.238Z", "created_by": "alice91", "user_permissions": [], "groups": [1, 71]}}, {"model": "users.user", "pk": 26, "fields": {"password": "pbkdf2_sha256$30000$Ptd48bnGq6jm$kDj9ZQMh8szTJPmHjQR6spjohSyIHKBnCtAjb31lTJY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.399Z", "username": "julia77", "name": "Jessica Ellis", "email": "doris@zava.org", "role": "Admin", "avatar": "", "wechat": "mildred73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_expired": "2086-08-07T08:28:31.399Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 27, "fields": {"password": "pbkdf2_sha256$30000$j2wxF9x6ogfR$8VM+Hk1Cj3QASiWgtD3ywfrSMu3Bu8PoAziypJ/g8ac=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.573Z", "username": "karen71", "name": "Anna Morrison", "email": "michelle@bluezoom.info", "role": "Admin", "avatar": "", "wechat": "sara64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam sit amet turpis elementum ligula vehicula consequat.", "date_expired": "2086-08-07T08:28:31.573Z", "created_by": "paula74", "user_permissions": [], "groups": [1, 91]}}, {"model": "users.user", "pk": 28, "fields": {"password": "pbkdf2_sha256$30000$i3oCNuy3kmmk$Ekh8Xb2F1hVTYkgwq8aS/cLgbV0Ax8guZ9KE0CxsobM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.740Z", "username": "kelly87", "name": "Phyllis Powell", "email": "angela@vidoo.name", "role": "User", "avatar": "", "wechat": "robin71", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris ullamcorper purus sit amet nulla.", "date_expired": "2086-08-07T08:28:31.740Z", "created_by": "nancy68", "user_permissions": [], "groups": [1, 69]}}, {"model": "users.user", "pk": 29, "fields": {"password": "pbkdf2_sha256$30000$nX9LMcvMgwAW$euCP/Ij2NlOWKSJRpmxFdvOruX3ap/pUus7eY18VE6M=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:31.900Z", "username": "donna86", "name": "Mildred George", "email": "jane@jatri.biz", "role": "Admin", "avatar": "", "wechat": "tammy67", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin leo odio, porttitor id, consequat in, consequat ut, nulla.", "date_expired": "2086-08-07T08:28:31.900Z", "created_by": "diana67", "user_permissions": [], "groups": [1, 8]}}, {"model": "users.user", "pk": 30, "fields": {"password": "pbkdf2_sha256$30000$ICz6gNHeh8KO$mBskkyHU95K8m9sYhohHUtDPi0JeGwi8WE4pfIEy5Vk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.070Z", "username": "helen73", "name": "Dorothy Willis", "email": "christine@devcast.mil", "role": "User", "avatar": "", "wechat": "martha64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque id justo sit amet sapien dignissim vestibulum.", "date_expired": "2086-08-07T08:28:32.070Z", "created_by": "deborah79", "user_permissions": [], "groups": [1, 58]}}, {"model": "users.user", "pk": 31, "fields": {"password": "pbkdf2_sha256$30000$eGRRzr5zuRxZ$vZA7L3a2nFMnbNsKdWJY7WskgCKFEJASNIOIP/nIXEU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.244Z", "username": "janice66", "name": "Norma Garrett", "email": "carol@izio.info", "role": "User", "avatar": "", "wechat": "anne68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam vel augue.", "date_expired": "2086-08-07T08:28:32.244Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 58]}}, {"model": "users.user", "pk": 32, "fields": {"password": "pbkdf2_sha256$30000$p9ycZp3fQfrF$N/Z9NC6GCsBgwhAKieWRv7elaAbnu9L0QDPY3co4e90=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.422Z", "username": "heather67", "name": "Helen Berry", "email": "kelly@yodo.com", "role": "User", "avatar": "", "wechat": "diana82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "date_expired": "2086-08-07T08:28:32.422Z", "created_by": "nancy68", "user_permissions": [], "groups": [1, 27]}}, {"model": "users.user", "pk": 33, "fields": {"password": "pbkdf2_sha256$30000$YrwlQADdtpic$dCxx0aFs44O/kWGTUo5PwRNxdlC9qE40Q68wQPuVFtU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.587Z", "username": "catherine80", "name": "Judy Wilson", "email": "tammy@quimm.info", "role": "User", "avatar": "", "wechat": "judy76", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In eleifend quam a odio.", "date_expired": "2086-08-07T08:28:32.587Z", "created_by": "janice66", "user_permissions": [], "groups": [1, 3]}}, {"model": "users.user", "pk": 34, "fields": {"password": "pbkdf2_sha256$30000$mlSeIgPPC7bZ$gixCwn6TcLyzN2iQJkI8WIxL6PIb3Mt7rCiRGf9I6Gs=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.759Z", "username": "carol68", "name": "Annie Mccoy", "email": "norma@fadeo.mil", "role": "User", "avatar": "", "wechat": "kathy87", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Curabitur in libero ut massa volutpat convallis.", "date_expired": "2086-08-07T08:28:32.759Z", "created_by": "ruth80", "user_permissions": [], "groups": [1, 45]}}, {"model": "users.user", "pk": 35, "fields": {"password": "pbkdf2_sha256$30000$uusQ02K7q0Lq$H6gkT/1hejdbLuOaaDSQf7n/PaBDiboOen4nhHyFf2k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:32.927Z", "username": "susan72", "name": "Heather Alvarez", "email": "rebecca@twitterlist.info", "role": "Admin", "avatar": "", "wechat": "jean78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "date_expired": "2086-08-07T08:28:32.927Z", "created_by": "joan93", "user_permissions": [], "groups": [1, 18]}}, {"model": "users.user", "pk": 36, "fields": {"password": "pbkdf2_sha256$30000$gYNPdDwpo9iX$utej1iSaEa7Yl53I3dtttLg9FDxM+0zggynBaOCQ0TU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.102Z", "username": "anna64", "name": "Laura Tucker", "email": "julia@blognation.net", "role": "Admin", "avatar": "", "wechat": "marie83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Praesent blandit lacinia erat.", "date_expired": "2086-08-07T08:28:33.102Z", "created_by": "paula74", "user_permissions": [], "groups": [1, 100]}}, {"model": "users.user", "pk": 37, "fields": {"password": "pbkdf2_sha256$30000$S4E17Qra03bA$KLxL3iR0uePpDIM7o0M9n5wJ/9SrsmUBf9e8bMh9EG8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.279Z", "username": "debra65", "name": "Kathryn Hill", "email": "joyce@shufflebeat.gov", "role": "User", "avatar": "", "wechat": "kimberly69", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Phasellus id sapien in sapien iaculis congue.", "date_expired": "2086-08-07T08:28:33.279Z", "created_by": "alice82", "user_permissions": [], "groups": [1, 17]}}, {"model": "users.user", "pk": 38, "fields": {"password": "pbkdf2_sha256$30000$Qg4QNxmxbi8C$5PFxSJhmCgo3/v8m83WEKdgXp55h0YGi2Dif20z/vUA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.446Z", "username": "frances70", "name": "Evelyn Matthews", "email": "jennifer@oloo.mil", "role": "User", "avatar": "", "wechat": "virginia86", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras non velit nec nisi vulputate nonummy.", "date_expired": "2086-08-07T08:28:33.446Z", "created_by": "admin", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 39, "fields": {"password": "pbkdf2_sha256$30000$qdtflj11nfCB$XO8fRmeH88+p/MMYoR0KKHDW+FQSzjjvvfP+Nlhass0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.617Z", "username": "marie79", "name": "Sara Hall", "email": "kimberly@yadel.gov", "role": "User", "avatar": "", "wechat": "ann69", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer tincidunt ante vel ipsum.", "date_expired": "2086-08-07T08:28:33.617Z", "created_by": "julia85", "user_permissions": [], "groups": [1, 39]}}, {"model": "users.user", "pk": 40, "fields": {"password": "pbkdf2_sha256$30000$QFy1OdH17txx$8Psd7+Y56UmYJlBdbI5KMl6FlUUO7X36J8+Fz68qMW4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.789Z", "username": "jessica65", "name": "Maria Ross", "email": "donna@rhyzio.edu", "role": "Admin", "avatar": "", "wechat": "jessica70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque eget nunc.", "date_expired": "2086-08-07T08:28:33.789Z", "created_by": "angela85", "user_permissions": [], "groups": [1, 24]}}, {"model": "users.user", "pk": 41, "fields": {"password": "pbkdf2_sha256$30000$F20fxq4LSr6c$pzttCD16zt9a0Mx5AwNf5is4XdjjwSsIJ6YcEsLLApU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:33.955Z", "username": "melissa79", "name": "Marilyn Chavez", "email": "judith@brainbox.net", "role": "User", "avatar": "", "wechat": "julia63", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo.", "date_expired": "2086-08-07T08:28:33.955Z", "created_by": "elizabeth70", "user_permissions": [], "groups": [1, 31]}}, {"model": "users.user", "pk": 42, "fields": {"password": "pbkdf2_sha256$30000$2B6OskcgsZUL$It3rtOrwCS5iPsymmQmkXDfvblVjREgQg7aVhOQHhsw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.122Z", "username": "frances63", "name": "Lillian Stone", "email": "christine@jumpxs.name", "role": "User", "avatar": "", "wechat": "norma88", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", "date_expired": "2086-08-07T08:28:34.122Z", "created_by": "jane70", "user_permissions": [], "groups": [1, 13]}}, {"model": "users.user", "pk": 43, "fields": {"password": "pbkdf2_sha256$30000$8Vc7DWMqnDCn$4jZh/GSazSUShLUK35ICWdVmGAeW6Ba7PP//CtSSe4k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.291Z", "username": "betty76", "name": "Shirley Howard", "email": "robin@voonte.mil", "role": "User", "avatar": "", "wechat": "kathleen74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce consequat.", "date_expired": "2086-08-07T08:28:34.291Z", "created_by": "rachel71", "user_permissions": [], "groups": [1, 92]}}, {"model": "users.user", "pk": 44, "fields": {"password": "pbkdf2_sha256$30000$bPqoMiKJt9aP$W9sU/rcRac00djidMqqzFSMme5dlnVdrLdiJRvVsyU8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.463Z", "username": "marie86", "name": "Debra Clark", "email": "christina@devify.mil", "role": "User", "avatar": "", "wechat": "wanda65", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla justo.", "date_expired": "2086-08-07T08:28:34.463Z", "created_by": "karen71", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 45, "fields": {"password": "pbkdf2_sha256$30000$y0Xd2dCqAQCt$MzfBMGtMCpzPEJ4MYE7qkMIp3qac/4UjWQZcRs2m8Xo=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.636Z", "username": "christine86", "name": "Lillian Berry", "email": "angela@ntags.biz", "role": "Admin", "avatar": "", "wechat": "michelle82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam porttitor lacus at turpis.", "date_expired": "2086-08-07T08:28:34.636Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 12]}}, {"model": "users.user", "pk": 46, "fields": {"password": "pbkdf2_sha256$30000$4jPSAo5SbHxi$H1KVNR9gmffRqwkV6WXHQPICBNHz/yg0RPtrC4/jquE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.810Z", "username": "jean93", "name": "Kathy Carroll", "email": "sandra@zoomzone.mil", "role": "Admin", "avatar": "", "wechat": "beverly71", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In est risus, auctor sed, tristique in, tempus sit amet, sem.", "date_expired": "2086-08-07T08:28:34.810Z", "created_by": "paula74", "user_permissions": [], "groups": [1, 90]}}, {"model": "users.user", "pk": 47, "fields": {"password": "pbkdf2_sha256$30000$i4UnL4WDW5fC$2+xRGEQ8hBOIsg+OCU7Jb7qLu/H211/GCyBmXsGaO3g=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:34.978Z", "username": "tammy88", "name": "Jennifer Garrett", "email": "andrea@innotype.biz", "role": "User", "avatar": "", "wechat": "sharon68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi.", "date_expired": "2086-08-07T08:28:34.978Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 71]}}, {"model": "users.user", "pk": 48, "fields": {"password": "pbkdf2_sha256$30000$6N0r8tqOu3gC$nODa0E+vS1scLJYxNdsJwTpy5MRLLe9yw+2kRQaNHJE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.142Z", "username": "anne87", "name": "Patricia Weaver", "email": "paula@tagpad.mil", "role": "Admin", "avatar": "", "wechat": "norma74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla ut erat id mauris vulputate elementum.", "date_expired": "2086-08-07T08:28:35.142Z", "created_by": "frances63", "user_permissions": [], "groups": [1, 22]}}, {"model": "users.user", "pk": 49, "fields": {"password": "pbkdf2_sha256$30000$D1tMvBBTQUVv$a2PWfGR/5IQgJ2yLNGwgZ4gz6zPloKknos3lVVA46zM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.317Z", "username": "janet92", "name": "Anne King", "email": "pamela@thoughtstorm.gov", "role": "User", "avatar": "", "wechat": "mildred67", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", "date_expired": "2086-08-07T08:28:35.317Z", "created_by": "linda71", "user_permissions": [], "groups": [1, 92]}}, {"model": "users.user", "pk": 50, "fields": {"password": "pbkdf2_sha256$30000$XQ8hvDyDE4cr$eCWi/3Z1Cyhh0GmLsjwhxFeYTmkj0c96b1EgU2OAI2E=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.487Z", "username": "pamela86", "name": "Michelle Gomez", "email": "amanda@wordware.com", "role": "User", "avatar": "", "wechat": "evelyn71", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus in felis eu sapien cursus vestibulum.", "date_expired": "2086-08-07T08:28:35.487Z", "created_by": "karen71", "user_permissions": [], "groups": [1, 41]}}, {"model": "users.user", "pk": 51, "fields": {"password": "pbkdf2_sha256$30000$UnK9cNpgwgzV$JXO2yHEfEjzcK6bWzbyC56yielKH0smjMU0yrdupafc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.658Z", "username": "ruby91", "name": "Gloria Richards", "email": "susan@edgeclub.biz", "role": "User", "avatar": "", "wechat": "norma93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam faucibus cursus urna.", "date_expired": "2086-08-07T08:28:35.658Z", "created_by": "anne87", "user_permissions": [], "groups": [1, 63]}}, {"model": "users.user", "pk": 52, "fields": {"password": "pbkdf2_sha256$30000$f0bLtRkCljcn$gGvTMtV6NqJF7trmKA7G+Em8buYBuv+ROBpsjf4THqQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:35.880Z", "username": "deborah71", "name": "Ruth Perry", "email": "cynthia@lazzy.biz", "role": "User", "avatar": "", "wechat": "irene74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Donec ut mauris eget massa tempor convallis.", "date_expired": "2086-08-07T08:28:35.880Z", "created_by": "frances70", "user_permissions": [], "groups": [1, 15]}}, {"model": "users.user", "pk": 53, "fields": {"password": "pbkdf2_sha256$30000$1TBXzRO4NYI1$XvQsCr5DlMof68/Nmgu1lOvFzk1bs3sMpoQpyJlRTOA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.067Z", "username": "annie94", "name": "Debra Carroll", "email": "carol@brainsphere.info", "role": "User", "avatar": "", "wechat": "jacqueline64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_expired": "2086-08-07T08:28:36.067Z", "created_by": "anne87", "user_permissions": [], "groups": [1, 74]}}, {"model": "users.user", "pk": 54, "fields": {"password": "pbkdf2_sha256$30000$sgQX3LfKTo79$4WVDzP6NvCpuwrF9CB6L76/GJhLsZmGs1u4VP9T0nBg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.239Z", "username": "louise91", "name": "Ann Knight", "email": "louise@jaxworks.com", "role": "User", "avatar": "", "wechat": "stephanie89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla nisl.", "date_expired": "2086-08-07T08:28:36.239Z", "created_by": "janet92", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 55, "fields": {"password": "pbkdf2_sha256$30000$GpBkGACwIQ5d$jJLcoN1VsPENNmKom1rJx8WinDpNeu6eXQF6uNAolBQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.413Z", "username": "doris80", "name": "Kimberly Gibson", "email": "melissa@zoomcast.net", "role": "User", "avatar": "", "wechat": "emily78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin at turpis a pede posuere nonummy.", "date_expired": "2086-08-07T08:28:36.413Z", "created_by": "ruby91", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 56, "fields": {"password": "pbkdf2_sha256$30000$JhqNYk5eUk28$7n8ReaBiCAPq7WbxDRP0pMl7cxSwQAfFHw5Ggmn7cJA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.594Z", "username": "sara67", "name": "Kathryn Mason", "email": "tina@oyondu.biz", "role": "User", "avatar": "", "wechat": "judith74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis aliquam convallis nunc.", "date_expired": "2086-08-07T08:28:36.594Z", "created_by": "rachel71", "user_permissions": [], "groups": [1, 72]}}, {"model": "users.user", "pk": 57, "fields": {"password": "pbkdf2_sha256$30000$8jc2xlDQzqxV$/an5bkloSmz/MgJn4+y4FNWN8q43Zr26wuhjL+WL34E=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.769Z", "username": "phyllis72", "name": "Judy Burns", "email": "evelyn@voomm.mil", "role": "User", "avatar": "", "wechat": "shirley89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_expired": "2086-08-07T08:28:36.769Z", "created_by": "susan72", "user_permissions": [], "groups": [1, 24]}}, {"model": "users.user", "pk": 58, "fields": {"password": "pbkdf2_sha256$30000$Vm5Btl1y6oBV$BHoN1F2BMLeeKVdbz0Ah87ZbC0zFdlKL4JcJvYlmGyo=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:36.944Z", "username": "jennifer78", "name": "Kelly Arnold", "email": "mildred@gabvine.biz", "role": "User", "avatar": "", "wechat": "melissa78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Praesent lectus.", "date_expired": "2086-08-07T08:28:36.944Z", "created_by": "martha69", "user_permissions": [], "groups": [1, 60]}}, {"model": "users.user", "pk": 59, "fields": {"password": "pbkdf2_sha256$30000$082liCF7dOEC$GlWO4X+DQe3y7y5516ofn/mZLMOeQDvt9LMw06arjJc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.118Z", "username": "kathryn75", "name": "Linda Harrison", "email": "christina@aimbu.mil", "role": "Admin", "avatar": "", "wechat": "mary81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis consequat dui nec nisi volutpat eleifend.", "date_expired": "2086-08-07T08:28:37.118Z", "created_by": "angela85", "user_permissions": [], "groups": [1, 51]}}, {"model": "users.user", "pk": 60, "fields": {"password": "pbkdf2_sha256$30000$RM597Mvp6GOc$3h1e5QvcV5bE6OenOYzdJNF0yVso08pymLPGqeerJqw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.301Z", "username": "joyce71", "name": "Pamela Payne", "email": "louise@linkbuzz.mil", "role": "User", "avatar": "", "wechat": "ashley84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis at velit eu est congue elementum.", "date_expired": "2086-08-07T08:28:37.301Z", "created_by": "paula74", "user_permissions": [], "groups": [1, 74]}}, {"model": "users.user", "pk": 61, "fields": {"password": "pbkdf2_sha256$30000$cJsctboWnVGC$+ppsZkvx/CbQAd2zk3TmFXhMK613Es825+KpNxdgTNw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.482Z", "username": "dorothy78", "name": "Mildred Turner", "email": "nancy@quaxo.com", "role": "Admin", "avatar": "", "wechat": "lois75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.", "date_expired": "2086-08-07T08:28:37.482Z", "created_by": "louise91", "user_permissions": [], "groups": [1, 44]}}, {"model": "users.user", "pk": 62, "fields": {"password": "pbkdf2_sha256$30000$HbHG20XKWfD9$cFbE2EGMXt6YrweKM5vnrXjnYlz7MGYrHZp9biThEZM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.660Z", "username": "jessica68", "name": "Nicole Shaw", "email": "kathy@brainsphere.mil", "role": "Admin", "avatar": "", "wechat": "carolyn85", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque at nulla.", "date_expired": "2086-08-07T08:28:37.660Z", "created_by": "kathryn75", "user_permissions": [], "groups": [1, 66]}}, {"model": "users.user", "pk": 63, "fields": {"password": "pbkdf2_sha256$30000$U5pJunQzaMt8$GM5WIhA8IKkK7Wi/2qHWpy/uOYukx4QNXYDDUcgUukw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:37.830Z", "username": "kathy87", "name": "Laura Lynch", "email": "louise@photospace.net", "role": "Admin", "avatar": "", "wechat": "betty72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nunc rhoncus dui vel sem.", "date_expired": "2086-08-07T08:28:37.830Z", "created_by": "phyllis91", "user_permissions": [], "groups": [1, 100]}}, {"model": "users.user", "pk": 64, "fields": {"password": "pbkdf2_sha256$30000$Fy5vAQw6BXHe$oq8j8c0HN89W3J4jRQqJJOOq8R9CnUJsk4ahTXRsVvQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.003Z", "username": "susan78", "name": "Catherine Watkins", "email": "rose@devpulse.com", "role": "Admin", "avatar": "", "wechat": "frances93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_expired": "2086-08-07T08:28:38.003Z", "created_by": "jessica65", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 65, "fields": {"password": "pbkdf2_sha256$30000$WZX6D8oCNGJo$KVX6YFggdd1cmM+XQzd6KTKp1wEQDGRjdv2fB5R2XqE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.179Z", "username": "ruth93", "name": "Irene Campbell", "email": "debra@wikizz.mil", "role": "Admin", "avatar": "", "wechat": "laura90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque eget nunc.", "date_expired": "2086-08-07T08:28:38.179Z", "created_by": "linda71", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 66, "fields": {"password": "pbkdf2_sha256$30000$bjo1e1VWco0G$3l1lf4UBz01a1WO1t4Gx8TWeV9WOMSQwfFcP24rV5gE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.355Z", "username": "frances92", "name": "Kathryn Fields", "email": "bonnie@avaveo.gov", "role": "Admin", "avatar": "", "wechat": "heather77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque ut erat.", "date_expired": "2086-08-07T08:28:38.355Z", "created_by": "katherine66", "user_permissions": [], "groups": [1, 53]}}, {"model": "users.user", "pk": 67, "fields": {"password": "pbkdf2_sha256$30000$JttyHFZiTcFW$0oetRMFdJ37YPaNhrN+p0bAknEbiL2xzWbtsobDwY5o=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.530Z", "username": "pamela64", "name": "Gloria Cruz", "email": "nancy@tazzy.mil", "role": "Admin", "avatar": "", "wechat": "betty89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas pulvinar lobortis est.", "date_expired": "2086-08-07T08:28:38.530Z", "created_by": "heather67", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 68, "fields": {"password": "pbkdf2_sha256$30000$1RsHRAPegsyk$R0y8OVuwbkAoOa6h4hCtHEejKIoTkl+m3HRhe++ESsk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.709Z", "username": "tina83", "name": "Michelle Marshall", "email": "julie@skyvu.biz", "role": "Admin", "avatar": "", "wechat": "amanda64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In hac habitasse platea dictumst.", "date_expired": "2086-08-07T08:28:38.709Z", "created_by": "jane70", "user_permissions": [], "groups": [1, 5]}}, {"model": "users.user", "pk": 69, "fields": {"password": "pbkdf2_sha256$30000$HxdquslYeFyq$NUL2UzrkPEqt51JixNV8K3lOwJ/UjSapUtXBSjm1JCA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:38.878Z", "username": "jessica70", "name": "Katherine Nichols", "email": "lillian@trunyx.net", "role": "User", "avatar": "", "wechat": "katherine68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi vel lectus in quam fringilla rhoncus.", "date_expired": "2086-08-07T08:28:38.878Z", "created_by": "dorothy78", "user_permissions": [], "groups": [1, 11]}}, {"model": "users.user", "pk": 70, "fields": {"password": "pbkdf2_sha256$30000$oDwymM0MQJgc$I34H6igYt3e1rQmQVNw6SC0WmjZX3wY6YBwQHUEe5Dw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.048Z", "username": "emily75", "name": "Evelyn Ferguson", "email": "angela@kazu.biz", "role": "Admin", "avatar": "", "wechat": "lisa81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris sit amet eros.", "date_expired": "2086-08-07T08:28:39.048Z", "created_by": "janice66", "user_permissions": [], "groups": [1, 82]}}, {"model": "users.user", "pk": 71, "fields": {"password": "pbkdf2_sha256$30000$dhr6hh27WXDQ$baWYdAVQy44SrtwQ5PdHAlLCNGiZg34Jqy3ZTW3fzRY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.220Z", "username": "rebecca73", "name": "Catherine Lopez", "email": "evelyn@brainverse.com", "role": "Admin", "avatar": "", "wechat": "kathryn81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam vel augue.", "date_expired": "2086-08-07T08:28:39.220Z", "created_by": "jessica70", "user_permissions": [], "groups": [1, 96]}}, {"model": "users.user", "pk": 72, "fields": {"password": "pbkdf2_sha256$30000$5yDQBB3JOP7t$A10o7ATrCgM6Ga+WFom9ltYqARbAxd7jn4WgGD0REPU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.390Z", "username": "catherine74", "name": "Ruth Jordan", "email": "nancy@flashset.com", "role": "Admin", "avatar": "", "wechat": "beverly64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Ut tellus.", "date_expired": "2086-08-07T08:28:39.390Z", "created_by": "andrea90", "user_permissions": [], "groups": [1, 21]}}, {"model": "users.user", "pk": 73, "fields": {"password": "pbkdf2_sha256$30000$RA9462tqlWbl$RmWpLjHVXa4x5Wv/Snt1AXoF1FtYNItsxE5HLZCkZg4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.554Z", "username": "phyllis78", "name": "Angela Jackson", "email": "deborah@yadel.name", "role": "User", "avatar": "", "wechat": "tina90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam vel augue.", "date_expired": "2086-08-07T08:28:39.554Z", "created_by": "karen71", "user_permissions": [], "groups": [1, 29]}}, {"model": "users.user", "pk": 74, "fields": {"password": "pbkdf2_sha256$30000$0CJZ42imsLpj$uv8ewfpqmbeOiDppb2XuOftJn+5f2ylReR/QrCGJOno=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.718Z", "username": "ruby72", "name": "Ann Johnston", "email": "alice@skippad.info", "role": "User", "avatar": "", "wechat": "jane82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam faucibus cursus urna.", "date_expired": "2086-08-07T08:28:39.718Z", "created_by": "rebecca73", "user_permissions": [], "groups": [1, 35]}}, {"model": "users.user", "pk": 75, "fields": {"password": "pbkdf2_sha256$30000$fDlwx7BshvJf$MFAImUkVcR+kKNN5EsJkp3kASKxfnZoqppfUqocy3z4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:39.887Z", "username": "sharon76", "name": "Andrea Powell", "email": "ruth@omba.com", "role": "User", "avatar": "", "wechat": "carol72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer tincidunt ante vel ipsum.", "date_expired": "2086-08-07T08:28:39.887Z", "created_by": "katherine66", "user_permissions": [], "groups": [1, 13]}}, {"model": "users.user", "pk": 76, "fields": {"password": "pbkdf2_sha256$30000$zvnXmknAI9RB$d+J5nYmJrkyjQgNAjSBhYXv3g1RietnMUQ7NGnilOVM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.055Z", "username": "anna89", "name": "Annie Jacobs", "email": "joan@rhybox.gov", "role": "Admin", "avatar": "", "wechat": "cynthia70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.", "date_expired": "2086-08-07T08:28:40.055Z", "created_by": "christine86", "user_permissions": [], "groups": [1, 32]}}, {"model": "users.user", "pk": 77, "fields": {"password": "pbkdf2_sha256$30000$AzgTx4TsQK9f$UKsJQePzCR9o3JVNBLraPjHgsZAdEXkiyYlExeaZkts=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.220Z", "username": "amanda80", "name": "Theresa Murray", "email": "teresa@mycat.name", "role": "User", "avatar": "", "wechat": "carol82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Sed vel enim sit amet nunc viverra dapibus.", "date_expired": "2086-08-07T08:28:40.220Z", "created_by": "cheryl65", "user_permissions": [], "groups": [1, 35]}}, {"model": "users.user", "pk": 78, "fields": {"password": "pbkdf2_sha256$30000$FeTfHi7naFxK$Q/ti6HpujlsaOVinCAlOfscUJ1BZeN9gVobq1i+6eP8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.395Z", "username": "ruth83", "name": "Kimberly Edwards", "email": "laura@pixope.gov", "role": "Admin", "avatar": "", "wechat": "martha69", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin at turpis a pede posuere nonummy.", "date_expired": "2086-08-07T08:28:40.395Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 53]}}, {"model": "users.user", "pk": 79, "fields": {"password": "pbkdf2_sha256$30000$MbcnEja0arkE$nffCEDWn0VI0wx01MftSjNAyS7soA2GiCHtBDLbWWw8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.568Z", "username": "gloria84", "name": "Ruth Bryant", "email": "marie@cogibox.mil", "role": "User", "avatar": "", "wechat": "sara82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer ac leo.", "date_expired": "2086-08-07T08:28:40.568Z", "created_by": "tammy88", "user_permissions": [], "groups": [1]}}, {"model": "users.user", "pk": 80, "fields": {"password": "pbkdf2_sha256$30000$1C6xRcrTFOtP$DktCF1JtEcLkugJm5OXdNOXzJRKQEHnSwtPCXfI1TEg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.744Z", "username": "lois85", "name": "Annie Harvey", "email": "jennifer@centizu.edu", "role": "User", "avatar": "", "wechat": "catherine83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer non velit.", "date_expired": "2086-08-07T08:28:40.744Z", "created_by": "gloria84", "user_permissions": [], "groups": [1, 63]}}, {"model": "users.user", "pk": 81, "fields": {"password": "pbkdf2_sha256$30000$0xFZz2uiFiRs$+skfKQONB79O75+VQJoU4QqTIllCNWLTTBq0fJAFeYw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:40.916Z", "username": "bonnie82", "name": "Ruth Snyder", "email": "irene@vinte.edu", "role": "User", "avatar": "", "wechat": "cheryl72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc.", "date_expired": "2086-08-07T08:28:40.916Z", "created_by": "jessica65", "user_permissions": [], "groups": [1, 35]}}, {"model": "users.user", "pk": 82, "fields": {"password": "pbkdf2_sha256$30000$1dXoe9vGrnKv$drHeEFI/bCXS3jwnu3pBCxJF37P5FC3M32VKtGOu2VI=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.084Z", "username": "janet74", "name": "Denise Gilbert", "email": "elizabeth@camimbo.org", "role": "Admin", "avatar": "", "wechat": "julia94", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vestibulum sagittis sapien.", "date_expired": "2086-08-07T08:28:41.084Z", "created_by": "joan93", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 83, "fields": {"password": "pbkdf2_sha256$30000$493QFfk3ZmH0$nkcZmGw0n5falyoZBVCGKEzoZ7mpkXM1E7sbWWJcPSw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.269Z", "username": "kimberly80", "name": "Julie Black", "email": "alice@aimbu.gov", "role": "Admin", "avatar": "", "wechat": "jacqueline66", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aliquam sit amet diam in magna bibendum imperdiet.", "date_expired": "2086-08-07T08:28:41.269Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 73]}}, {"model": "users.user", "pk": 84, "fields": {"password": "pbkdf2_sha256$30000$69v4y0VkVOAq$CazOpZXAjj5AEMKY6EqMR1L7dGvewnriym+7iAZuTDw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.444Z", "username": "heather90", "name": "Lillian Lewis", "email": "joyce@chatterpoint.com", "role": "User", "avatar": "", "wechat": "linda70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aliquam sit amet diam in magna bibendum imperdiet.", "date_expired": "2086-08-07T08:28:41.444Z", "created_by": "jessica68", "user_permissions": [], "groups": [1, 63]}}, {"model": "users.user", "pk": 85, "fields": {"password": "pbkdf2_sha256$30000$oioTwzMZWbGE$qAmLUDGWH2cXYD41cPxA4Otg4kYOhzsqcaBjAhIhulY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.618Z", "username": "margaret83", "name": "Sandra Bradley", "email": "norma@dabjam.biz", "role": "User", "avatar": "", "wechat": "anna72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Etiam pretium iaculis justo.", "date_expired": "2086-08-07T08:28:41.619Z", "created_by": "kelly87", "user_permissions": [], "groups": [1, 81]}}, {"model": "users.user", "pk": 86, "fields": {"password": "pbkdf2_sha256$30000$9RXRYrXDZt43$3JTS2HVgsnYQQJlGCfOi07/pEvPPiGHlc8pUd27bZIA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.792Z", "username": "michelle85", "name": "Joyce Richards", "email": "kathleen@centidel.edu", "role": "User", "avatar": "", "wechat": "patricia87", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer ac leo.", "date_expired": "2086-08-07T08:28:41.792Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 44]}}, {"model": "users.user", "pk": 87, "fields": {"password": "pbkdf2_sha256$30000$w97iKyeRIHbm$g01Mkn27oMU8Kdc026iIgHzaO3w9NQ6l+yxM5NSwiy8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:41.973Z", "username": "joan94", "name": "Theresa Gonzalez", "email": "dorothy@trudeo.gov", "role": "Admin", "avatar": "", "wechat": "anna83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Curabitur at ipsum ac tellus semper interdum.", "date_expired": "2086-08-07T08:28:41.973Z", "created_by": "anne65", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 88, "fields": {"password": "pbkdf2_sha256$30000$78JGLDoVPZy3$RpnmgxFQel2ZxEn5ONEXEurrLPVaVe4U0yk2qtFND7k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.147Z", "username": "heather85", "name": "Gloria Phillips", "email": "jane@livez.com", "role": "Admin", "avatar": "", "wechat": "debra78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris sit amet eros.", "date_expired": "2086-08-07T08:28:42.147Z", "created_by": "joan94", "user_permissions": [], "groups": [1, 14]}}, {"model": "users.user", "pk": 89, "fields": {"password": "pbkdf2_sha256$30000$xqjFpBq89AdU$tOuvyBSOEDDnMLldWk9IJrRTYLP2yChIMR5gPCDjuD4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.330Z", "username": "irene94", "name": "Linda Nichols", "email": "norma@edgeclub.gov", "role": "User", "avatar": "", "wechat": "brenda84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa.", "date_expired": "2086-08-07T08:28:42.330Z", "created_by": "ruby72", "user_permissions": [], "groups": [1, 86]}}, {"model": "users.user", "pk": 90, "fields": {"password": "pbkdf2_sha256$30000$vq3fGM2341TD$QCIab505iEJXMDdjd7NctR3nfL6CPtp7BIu9pJAbMqg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.500Z", "username": "pamela88", "name": "Diana Castillo", "email": "frances@ooba.biz", "role": "Admin", "avatar": "", "wechat": "betty75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In sagittis dui vel nisl.", "date_expired": "2086-08-07T08:28:42.500Z", "created_by": "doris80", "user_permissions": [], "groups": [1, 60]}}, {"model": "users.user", "pk": 91, "fields": {"password": "pbkdf2_sha256$30000$JQhrFswD8kgR$Ii2nQft1hRq8HLjy9Ph3+4nziFdjYczx3LR6E8aRLIc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.675Z", "username": "carolyn70", "name": "Andrea Rice", "email": "karen@skynoodle.mil", "role": "Admin", "avatar": "", "wechat": "irene70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In blandit ultrices enim.", "date_expired": "2086-08-07T08:28:42.675Z", "created_by": "heather85", "user_permissions": [], "groups": [1, 101]}}, {"model": "users.user", "pk": 92, "fields": {"password": "pbkdf2_sha256$30000$ElB3UukIRlrB$Phh6ujwtDMeLtvpGpzPQoZqlXDZRHh52UTEovXjlumE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:42.848Z", "username": "judy74", "name": "Norma Spencer", "email": "kathryn@photobug.org", "role": "Admin", "avatar": "", "wechat": "brenda73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nunc rhoncus dui vel sem.", "date_expired": "2086-08-07T08:28:42.848Z", "created_by": "helen73", "user_permissions": [], "groups": [1, 34]}}, {"model": "users.user", "pk": 93, "fields": {"password": "pbkdf2_sha256$30000$w04UrJuCXeDn$KP35fbxINr7/2ME4FIU2FWh6HUsmA5PHqcQThcRbXc4=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.026Z", "username": "amanda79", "name": "Angela Kelley", "email": "wanda@gigaclub.edu", "role": "User", "avatar": "", "wechat": "phyllis68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas rhoncus aliquam lacus.", "date_expired": "2086-08-07T08:28:43.027Z", "created_by": "annie94", "user_permissions": [], "groups": [1, 21]}}, {"model": "users.user", "pk": 94, "fields": {"password": "pbkdf2_sha256$30000$cb7WZCwshudU$FgK4A4C78q/jSWt5xxmx9lh4OQz14Tjbt9FQ8ZwQ48w=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.198Z", "username": "janice79", "name": "Christine Wagner", "email": "kathryn@gigazoom.biz", "role": "User", "avatar": "", "wechat": "rebecca73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris lacinia sapien quis libero.", "date_expired": "2086-08-07T08:28:43.198Z", "created_by": "alice91", "user_permissions": [], "groups": [1, 83]}}, {"model": "users.user", "pk": 95, "fields": {"password": "pbkdf2_sha256$30000$Dl1ZfqZzYVrm$U/EWtQdO6bKqSLa0E1BgJ2xVnopBmH1U0NvLDgdRaV8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.369Z", "username": "paula85", "name": "Tammy Mason", "email": "marie@gabtune.biz", "role": "Admin", "avatar": "", "wechat": "barbara90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.", "date_expired": "2086-08-07T08:28:43.369Z", "created_by": "amanda79", "user_permissions": [], "groups": [1, 19]}}, {"model": "users.user", "pk": 96, "fields": {"password": "pbkdf2_sha256$30000$6z5UindQfosg$zgLh1rzEIWzJ8hqbVDikLsnuBAex/SHHnyvGZ9ky/HA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.544Z", "username": "michelle71", "name": "Laura Edwards", "email": "phyllis@youbridge.net", "role": "Admin", "avatar": "", "wechat": "virginia72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo.", "date_expired": "2086-08-07T08:28:43.544Z", "created_by": "louise91", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 97, "fields": {"password": "pbkdf2_sha256$30000$vMBkUgmf9xyx$r7FsATzJelp12GELuLy8imj8yFjBXwNgIPjzdvNMfFQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.716Z", "username": "virginia79", "name": "Bonnie Ryan", "email": "ashley@npath.mil", "role": "User", "avatar": "", "wechat": "kathleen65", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_expired": "2086-08-07T08:28:43.716Z", "created_by": "paula85", "user_permissions": [], "groups": [1, 84]}}, {"model": "users.user", "pk": 98, "fields": {"password": "pbkdf2_sha256$30000$znjFHoPtepw6$Ob2i7Ds7tAJf5c75D+WUshT9zHPZaq82R2OPmaGc+28=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:43.893Z", "username": "teresa85", "name": "Karen Mills", "email": "christina@leenti.com", "role": "User", "avatar": "", "wechat": "lisa79", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aenean auctor gravida sem.", "date_expired": "2086-08-07T08:28:43.893Z", "created_by": "heather90", "user_permissions": [], "groups": [1, 31]}}, {"model": "users.user", "pk": 99, "fields": {"password": "pbkdf2_sha256$30000$AJmKiJo2SafR$beLOo8FB5BLGgOBgLq0ksuoomUGnJigh2UXHdN9FUno=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:44.064Z", "username": "emily73", "name": "Debra Lane", "email": "susan@meezzy.info", "role": "Admin", "avatar": "", "wechat": "bonnie77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.", "date_expired": "2086-08-07T08:28:44.064Z", "created_by": "nancy68", "user_permissions": [], "groups": [1, 9]}}, {"model": "users.user", "pk": 100, "fields": {"password": "pbkdf2_sha256$30000$Kfk3jcSn9LdX$2wPA/h+FngHPlV/SMni7x/Ljs7/qExH+mBq7xRNX6no=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:44.235Z", "username": "lori85", "name": "Robin Cooper", "email": "rachel@zoozzy.name", "role": "User", "avatar": "", "wechat": "virginia70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Donec semper sapien a libero.", "date_expired": "2086-08-07T08:28:44.235Z", "created_by": "jane70", "user_permissions": [], "groups": [1, 44]}}, {"model": "users.user", "pk": 101, "fields": {"password": "pbkdf2_sha256$30000$FMdEDD6qovwL$V/MEYLk6sF4AIbqQN1XMftBqCDn2sVZybFXBJjxTv1k=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:28:44.407Z", "username": "laura78", "name": "Janet Bennett", "email": "denise@divanoodle.name", "role": "User", "avatar": "", "wechat": "katherine81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque viverra pede ac diam.", "date_expired": "2086-08-07T08:28:44.407Z", "created_by": "kimberly80", "user_permissions": [], "groups": [1, 57]}}]
\ No newline at end of file
......@@ -11,22 +11,42 @@ https://docs.djangoproject.com/en/1.10/ref/settings/
"""
import os
import sys
from django.urls import reverse_lazy
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_DIR = os.path.dirname(BASE_DIR)
sys.path.append(PROJECT_DIR)
# Import project config setting
try:
from config import config as env_config, env
CONFIG = env_config.get(env, 'default')()
except ImportError:
CONFIG = type('_', (), {'__getattr__': None})()
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '2vym+ky!997d5kkcc64mnz06y1mmui3lut#(^wd=%s_qj$1%xv'
SECRET_KEY = CONFIG.SECRET_KEY or '2vym+ky!997d5kkcc64mnz06y1mmui3lut#(^wd=%s_qj$1%x'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
DEBUG = CONFIG.DEBUG or False
# Absolute url for some case, for example email link
SITE_URL = CONFIG.SITE_URL or 'http://localhost'
ALLOWED_HOSTS = []
# LOG LEVEL
LOG_LEVEL = 'DEBUG' if DEBUG else CONFIG.LOG_LEVEL or 'WARNING'
ALLOWED_HOSTS = CONFIG.ALLOWED_HOSTS or []
# Application definition
......@@ -34,8 +54,12 @@ INSTALLED_APPS = [
'users.apps.UsersConfig',
'assets.apps.AssetsConfig',
'perms.apps.PermsConfig',
'webterminal.apps.WebterminalConfig',
'ops.apps.OpsConfig',
'audits.apps.AuditsConfig',
'common.apps.CommonConfig',
'rest_framework',
'rest_framework.authtoken',
'bootstrapform',
# 'django.contrib.admin',
'django.contrib.auth',
......@@ -43,6 +67,8 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ws4redis',
]
MIDDLEWARE = [
......@@ -68,24 +94,39 @@ TEMPLATES = [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.static',
'django.template.context_processors.request',
'ws4redis.context_processors.default',
],
},
},
]
WSGI_APPLICATION = 'jumpserver.wsgi.application'
# WSGI_APPLICATION = 'jumpserver.wsgi.application'
LOGIN_REDIRECT_URL = reverse_lazy('index')
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
if CONFIG.DB_ENGINE == 'sqlite':
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': CONFIG.DB_NAME or os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.%s' % CONFIG.DB_ENGINE,
'NAME': CONFIG.DB_NAME,
'HOST': CONFIG.DB_HOST,
'PORT': CONFIG.DB_PORT,
'USER': CONFIG.DB_USER,
'PASSWORD': CONFIG.DB_PASSWORD,
}
}
}
# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
......@@ -105,6 +146,69 @@ AUTH_PASSWORD_VALIDATORS = [
},
]
# Logging setting
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'main': {
'datefmt': '%Y-%m-%d %H:%M:%S',
'format': '%(asctime)s [%(module)s %(levelname)s] %(message)s',
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'main'
},
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'main',
'filename': os.path.join(PROJECT_DIR, 'logs', 'jumpserver.log')
},
},
'loggers': {
'django': {
'handlers': ['null'],
'propagate': False,
'level': LOG_LEVEL,
},
'django.request': {
'handlers': ['console', 'file'],
'level': LOG_LEVEL,
'propagate': False,
},
'django.server': {
'handlers': ['console', 'file'],
'level': LOG_LEVEL,
'propagate': False,
},
'jumpserver': {
'handlers': ['console', 'file'],
'level': LOG_LEVEL,
},
'jumpserver.users.api': {
'handlers': ['console', 'file'],
'level': LOG_LEVEL,
},
'jumpserver.users.view': {
'handlers': ['console', 'file'],
'level': LOG_LEVEL,
}
}
}
# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/
......@@ -119,14 +223,82 @@ USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
AUTH_USER_MODEL = 'users.User'
# Media files (File, ImageField) will be save these
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/') + '/'
# Use django-bootstrap-form to format template, input max width arg
BOOTSTRAP_COLUMN_COUNT = 11
# Init data or generate fake data source for development
FIXTURE_DIRS = [os.path.join(BASE_DIR, 'fixtures'), ]
# Email config
EMAIL_HOST = CONFIG.EMAIL_HOST
EMAIL_PORT = CONFIG.EMAIL_PORT
EMAIL_HOST_USER = CONFIG.EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = CONFIG.EMAIL_HOST_PASSWORD
EMAIL_USE_SSL = CONFIG.EMAIL_USE_SSL
EMAIL_USE_TLS = CONFIG.EMAIL_USE_TLS
EMAIL_SUBJECT_PREFIX = CONFIG.EMAIL_SUBJECT_PREFIX
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAdminUser',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
),
}
# This setting is required to override the Django's main loop, when running in
# development mode, such as ./manage runserver
WSGI_APPLICATION = 'ws4redis.django_runserver.application'
# URL that distinguishes websocket connections from normal requests
WEBSOCKET_URL = '/ws/'
# WebSocket Redis
WS4REDIS_CONNECTION = {
'host': CONFIG.REDIS_HOST or '127.0.0.1',
'port': CONFIG.REDIS_PORT or 6379,
'db': 2,
}
# Set the number of seconds each message shall persisted
WS4REDIS_EXPIRE = 3600
WS4REDIS_HEARTBEAT = 'love you'
WS4REDIS_PREFIX = 'demo'
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_PREFIX = 'session'
# Custom User Auth model
AUTH_USER_MODEL = 'users.User'
# Celery using redis as broker
BROKER_URL = 'redis://%(password)s%(host)s:%(port)s/3' % {
'password': CONFIG.REDIS_PASSWORD + ':' if CONFIG.REDIS_PASSWORD else '',
'host': CONFIG.REDIS_HOST or '127.0.0.1',
'port': CONFIG.REDIS_PORT or 6379,
}
CELERY_RESULT_BACKEND = BROKER_URL
......@@ -14,10 +14,29 @@ Including another URLconf
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url, include
#from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from django.views.generic.base import TemplateView
from django.http import HttpResponseRedirect
# def view(request, **kwargs):
# if kwargs:
# print kwargs
# return HttpResponseRedirect('/' + kwargs["module"] + '/' + kwargs["version"] + '/' + kwargs["api"])
urlpatterns = [
url(r'^users/', include('users.urls')),
url(r'^$', TemplateView.as_view(template_name='base.html'), name='index'),
url(r'^(api/)?users/', include('users.urls')),
url(r'^assets/', include('assets.urls')),
# url(r'^admin/', admin.site.urls),
url(r'^terminal/', include('webterminal.urls')),
]
#urlpatterns += [
# url(r'^api/users/', include('users.api_urls')),
#]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# ~*~ coding: utf-8 ~*~
from __future__ import unicode_literals
import os
import json
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.inventory import Inventory, Host, Group
from ansible.vars import VariableManager
from ansible.parsing.dataloader import DataLoader
from ansible.executor import playbook_executor
from ansible.utils.display import Display
from ansible.playbook.play import Play
import ansible.constants as default_config
from ansible.plugins.callback import CallbackBase
class AnsibleError(StandardError):
pass
class Config(object):
"""Ansible运行时配置类, 用于初始化Ansible.
"""
def __init__(self, verbosity=None, inventory=None, listhosts=None, subset=None, module_paths=None, extra_vars=None,
forks=None, ask_vault_pass=None, vault_password_files=None, new_vault_password_file=None,
output_file=None, tags=None, skip_tags=None, one_line=None, tree=None, ask_sudo_pass=None, ask_su_pass=None,
sudo=None, sudo_user=None, become=None, become_method=None, become_user=None, become_ask_pass=None,
ask_pass=None, private_key_file=None, remote_user=None, connection=None, timeout=None, ssh_common_args=None,
sftp_extra_args=None, scp_extra_args=None, ssh_extra_args=None, poll_interval=None, seconds=None, check=None,
syntax=None, diff=None, force_handlers=None, flush_cache=None, listtasks=None, listtags=None, module_path=None):
self.verbosity = verbosity
self.inventory = inventory
self.listhosts = listhosts
self.subset = subset
self.module_paths = module_paths
self.extra_vars = extra_vars
self.forks = forks
self.ask_vault_pass = ask_vault_pass
self.vault_password_files = vault_password_files
self.new_vault_password_file = new_vault_password_file
self.output_file = output_file
self.tags = tags
self.skip_tags = skip_tags
self.one_line = one_line
self.tree = tree
self.ask_sudo_pass = ask_sudo_pass
self.ask_su_pass = ask_su_pass
self.sudo = sudo
self.sudo_user = sudo_user
self.become = become
self.become_method = become_method
self.become_user = become_user
self.become_ask_pass = become_ask_pass
self.ask_pass = ask_pass
self.private_key_file = private_key_file
self.remote_user = remote_user
self.connection = connection
self.timeout = timeout
self.ssh_common_args = ssh_common_args
self.sftp_extra_args = sftp_extra_args
self.scp_extra_args = scp_extra_args
self.ssh_extra_args = ssh_extra_args
self.poll_interval = poll_interval
self.seconds = seconds
self.check = check
self.syntax = syntax
self.diff = diff
self.force_handlers = force_handlers
self.flush_cache = flush_cache
self.listtasks = listtasks
self.listtags = listtags
self.module_path = module_path
self.__overwrite_default()
def __overwrite_default(self):
"""上面并不能包含Ansible所有的配置, 如果有其他的配置,
可以通过替换default_config模块里面的变量进行重载, 
比如 default_config.DEFAULT_ASK_PASS = False.
"""
default_config.HOST_KEY_CHECKING = False
class MyInventory(object):
"""Ansible Inventory对象的封装, Inventory是Ansbile中的核心概念(资产清单),
这个概念和CMDB很像,都是对资产的抽象. 为了简化Inventory的使用, 通过传入资产列表即可初始化Inventory.
"""
def __init__(self, *assets, **group):
"""初始化Inventory对象, args为一个资产列表, kwargs是资产组变量列表, 比如
args:
[{
"name": "asset_name",
"ip": "asset_ip",
"port": "asset_port",
"username": "asset_user",
"password": "asset_pass",
"key": "asset_private_key",
"group": "asset_group_name",
...
}]
kwargs:
"groupName1": {"group_variable1": "value1",...}
"groupName2": {"group_variable1": "value1",...}
"""
self.assets = assets
self.assets_group = group
self.loader = DataLoader()
self.variable_manager = VariableManager()
self.groups = []
self.inventory = self.gen_inventory()
def __gen_group(self):
"""初始化Ansible Group, 将资产添加到Inventory里面
:return: None
"""
# 创建Ansible Group.
for asset in self.assets:
g_name = asset.get('group', 'default')
if g_name not in [g.name for g in self.groups]:
group = Group(name=asset.get('group', 'default'))
self.groups.append(group)
# 初始化组变量
for group_name, variables in self.assets_group.iteritems():
for g in self.groups:
if g.name == group_name:
for v_name, v_value in variables:
g.set_variable(v_name, v_value)
# 往组里面添加Host
for asset in self.assets:
host = Host(name=asset['name'], port=asset['port'])
host.set_variable('ansible_ssh_host', asset['ip'])
host.set_variable('ansible_ssh_port', asset['port'])
host.set_variable('ansible_ssh_user', asset['username'])
if asset.get('password'):
host.set_variable('ansible_ssh_pass', asset['password'])
if asset.get('key'):
host.set_variable('ansible_ssh_private_key_file', asset['key'])
for key, value in asset.iteritems():
if key not in ["name", "port", "ip", "username", "password", "key"]:
host.set_variable(key, value)
for g in self.groups:
if g.name == asset.get('group', 'default'):
g.add_host(host)
def validate(self):
pass
def gen_inventory(self):
self.validate()
i = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list=[])
self.__gen_group()
for g in self.groups:
i.add_group(g)
self.variable_manager.set_inventory(i)
return i
class PlayBookRunner(object):
"""用于执行AnsiblePlaybook的接口.简化Playbook对象的使用
"""
def __init__(self, inventory, config, palybook_path, playbook_var, become_pass, verbosity=0):
"""
:param inventory: myinventory实例
:param config: Config实例
:param palybook_path: playbook的路径
:param playbook_var: 执行Playbook时的变量
:param become_pass: sudo passsword
:param verbosity: --verbosity
"""
self.options = config
self.options.verbosity = verbosity
self.options.connection = 'smart'
# 设置verbosity级别, 及命令行的--verbose选项
self.display = Display()
self.display.verbosity = self.options.verbosity
playbook_executor.verbosity = self.options.verbosity
# sudo成其他用户的配置
self.options.become = True
self.options.become_method = 'sudo'
self.options.become_user = 'root'
passwords = {'become_pass': become_pass}
# 传入playbook的路径,以及执行需要的变量
inventory.variable_manager.extra_vars = playbook_var
pb_dir = os.path.dirname(__file__)
playbook = "%s/%s" % (pb_dir, palybook_path)
# 初始化playbook的executor
self.pbex = playbook_executor.PlaybookExecutor(
playbooks=[playbook],
inventory=inventory,
variable_manager=inventory.variable_manager,
loader=inventory.loader,
options=self.options,
passwords=passwords)
def run(self):
"""执行Playbook, 记录执行日志, 处理执行结果.
:return: <AnsibleResult>对象
"""
self.pbex.run()
stats = self.pbex._tqm._stats
# 测试执行是否成功
run_success = True
hosts = sorted(stats.processed.keys())
for h in hosts:
t = stats.summarize(h)
if t['unreachable'] > 0 or t['failures'] > 0:
run_success = False
# TODO: 记录执行日志, 处理执行结果.
return stats
class ADHocRunner(object):
"""ADHoc接口
"""
def __init__(self, inventory, config, become_pass=None, verbosity=0):
"""
:param inventory: myinventory实例
:param config: Config实例
:param play_data:
play_data = dict(
name="Ansible Ad-Hoc",
hosts=pattern,
gather_facts=True,
tasks=[dict(action=dict(module='service', args={'name': 'vsftpd', 'state': 'restarted'}), async=async, poll=poll)]
)
"""
self.options = config
self.options.verbosity = verbosity
self.options.connection = 'smart'
# 设置verbosity级别, 及命令行的--verbose选项
self.display = Display()
self.display.verbosity = self.options.verbosity
playbook_executor.verbosity = self.options.verbosity
# sudo成其他用户的配置
self.options.become = True
self.options.become_method = 'sudo'
self.options.become_user = 'root'
self.passwords = {'become_pass': become_pass}
# 初始化callback插件
# self.results_callback = ResultCallback()
# 初始化Play
play_source = {
"name": "Ansible Play",
"hosts": "*",
"gather_facts": "no",
"tasks": [
dict(action=dict(module='shell', args='id'), register='shell_out'),
dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
]
}
self.play = Play().load(play_source, variable_manager=inventory.variable_manager, loader=inventory.loader)
self.inventory = inventory
def run(self):
"""执行ADHoc 记录日志, 处理结果
"""
tqm = None
# TODO:日志和结果分析
try:
tqm = TaskQueueManager(
inventory=self.inventory.inventory,
variable_manager=self.inventory.variable_manager,
loader=self.inventory.loader,
stdout_callback=default_config.DEFAULT_STDOUT_CALLBACK,
options=self.options,
passwords=self.passwords
)
result = tqm.run(self.play)
return result
finally:
if tqm:
tqm.cleanup()
if __name__ == "__main__":
conf = Config()
assets = [{
"name": "localhost",
"ip": "localhost",
"port": "22",
"username": "yumaojun",
"password": "xxx",
"key": "asset_private_key",
}]
inv = MyInventory(*assets)
print inv.inventory.get_group('default').get_hosts()
hoc = ADHocRunner(inv, conf, 'xxx')
hoc.run()
from .tasks import longtime_add
import time
result = longtime_add.delay(1,2)
print 'Task finished? ', result.ready()
print 'Task result: ', result.result
time.sleep(10)
print 'Task finished? ', result.ready()
print 'Task result: ', result.result
\ No newline at end of file
from __future__ import absolute_import
import time
from celery import shared_task
from common import celery_app
@shared_task
def longtime_add(x, y):
print 'long time task begins'
# sleep 5 seconds
time.sleep(5)
print 'long time task finished'
return x + y
@celery_app.task(name='hello-world')
def hello():
print('hello world!')
/* The MIT License */
.dropzone,
.dropzone *,
.dropzone-previews,
.dropzone-previews * {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.dropzone {
position: relative;
border: 1px solid rgba(0,0,0,0.08);
background: rgba(0,0,0,0.02);
padding: 1em;
}
.dropzone.dz-clickable {
cursor: pointer;
}
.dropzone.dz-clickable .dz-message,
.dropzone.dz-clickable .dz-message span {
cursor: pointer;
}
.dropzone.dz-clickable * {
cursor: default;
}
.dropzone .dz-message {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone.dz-drag-hover {
border-color: rgba(0,0,0,0.15);
background: rgba(0,0,0,0.04);
}
.dropzone.dz-started .dz-message {
display: none;
}
.dropzone .dz-preview,
.dropzone-previews .dz-preview {
background: rgba(255,255,255,0.8);
position: relative;
display: inline-block;
margin: 17px;
vertical-align: top;
border: 1px solid #acacac;
padding: 6px 6px 6px 6px;
}
.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],
.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {
display: none;
}
.dropzone .dz-preview .dz-details,
.dropzone-previews .dz-preview .dz-details {
width: 100px;
height: 100px;
position: relative;
background: #ebebeb;
padding: 5px;
margin-bottom: 22px;
}
.dropzone .dz-preview .dz-details .dz-filename,
.dropzone-previews .dz-preview .dz-details .dz-filename {
overflow: hidden;
height: 100%;
}
.dropzone .dz-preview .dz-details img,
.dropzone-previews .dz-preview .dz-details img {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
}
.dropzone .dz-preview .dz-details .dz-size,
.dropzone-previews .dz-preview .dz-details .dz-size {
position: absolute;
bottom: -28px;
left: 3px;
height: 28px;
line-height: 28px;
}
.dropzone .dz-preview.dz-error .dz-error-mark,
.dropzone-previews .dz-preview.dz-error .dz-error-mark {
display: block;
}
.dropzone .dz-preview.dz-success .dz-success-mark,
.dropzone-previews .dz-preview.dz-success .dz-success-mark {
display: block;
}
.dropzone .dz-preview:hover .dz-details img,
.dropzone-previews .dz-preview:hover .dz-details img {
display: none;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark,
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
display: none;
position: absolute;
width: 40px;
height: 40px;
font-size: 30px;
text-align: center;
right: -10px;
top: -10px;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
color: #8cc657;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
color: #ee162d;
}
.dropzone .dz-preview .dz-progress,
.dropzone-previews .dz-preview .dz-progress {
position: absolute;
top: 100px;
left: 6px;
right: 6px;
height: 6px;
background: #d7d7d7;
display: none;
}
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 0%;
background-color: #8cc657;
}
.dropzone .dz-preview.dz-processing .dz-progress,
.dropzone-previews .dz-preview.dz-processing .dz-progress {
display: block;
}
.dropzone .dz-preview .dz-error-message,
.dropzone-previews .dz-preview .dz-error-message {
display: none;
position: absolute;
top: -5px;
left: -20px;
background: rgba(245,245,245,0.8);
padding: 8px 10px;
color: #800;
min-width: 140px;
max-width: 500px;
z-index: 500;
}
.dropzone .dz-preview:hover.dz-error .dz-error-message,
.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
display: block;
}
/* The MIT License */
.dropzone,
.dropzone *,
.dropzone-previews,
.dropzone-previews * {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.dropzone {
position: relative;
border: 1px solid rgba(0,0,0,0.08);
background: rgba(0,0,0,0.02);
padding: 1em;
}
.dropzone.dz-clickable {
cursor: pointer;
}
.dropzone.dz-clickable .dz-message,
.dropzone.dz-clickable .dz-message span {
cursor: pointer;
}
.dropzone.dz-clickable * {
cursor: default;
}
.dropzone .dz-message {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone.dz-drag-hover {
border-color: rgba(0,0,0,0.15);
background: rgba(0,0,0,0.04);
}
.dropzone.dz-started .dz-message {
display: none;
}
.dropzone .dz-preview,
.dropzone-previews .dz-preview {
background: rgba(255,255,255,0.8);
position: relative;
display: inline-block;
margin: 17px;
vertical-align: top;
border: 1px solid #acacac;
padding: 6px 6px 6px 6px;
}
.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],
.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {
display: none;
}
.dropzone .dz-preview .dz-details,
.dropzone-previews .dz-preview .dz-details {
width: 100px;
height: 100px;
position: relative;
background: #ebebeb;
padding: 5px;
margin-bottom: 22px;
}
.dropzone .dz-preview .dz-details .dz-filename,
.dropzone-previews .dz-preview .dz-details .dz-filename {
overflow: hidden;
height: 100%;
}
.dropzone .dz-preview .dz-details img,
.dropzone-previews .dz-preview .dz-details img {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
}
.dropzone .dz-preview .dz-details .dz-size,
.dropzone-previews .dz-preview .dz-details .dz-size {
position: absolute;
bottom: -28px;
left: 3px;
height: 28px;
line-height: 28px;
}
.dropzone .dz-preview.dz-error .dz-error-mark,
.dropzone-previews .dz-preview.dz-error .dz-error-mark {
display: block;
}
.dropzone .dz-preview.dz-success .dz-success-mark,
.dropzone-previews .dz-preview.dz-success .dz-success-mark {
display: block;
}
.dropzone .dz-preview:hover .dz-details img,
.dropzone-previews .dz-preview:hover .dz-details img {
display: none;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark,
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
display: none;
position: absolute;
width: 40px;
height: 40px;
font-size: 30px;
text-align: center;
right: -10px;
top: -10px;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
color: #8cc657;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
color: #ee162d;
}
.dropzone .dz-preview .dz-progress,
.dropzone-previews .dz-preview .dz-progress {
position: absolute;
top: 100px;
left: 6px;
right: 6px;
height: 6px;
background: #d7d7d7;
display: none;
}
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 0%;
background-color: #8cc657;
}
.dropzone .dz-preview.dz-processing .dz-progress,
.dropzone-previews .dz-preview.dz-processing .dz-progress {
display: block;
}
.dropzone .dz-preview .dz-error-message,
.dropzone-previews .dz-preview .dz-error-message {
display: none;
position: absolute;
top: -5px;
left: -20px;
background: rgba(245,245,245,0.8);
padding: 8px 10px;
color: #800;
min-width: 140px;
max-width: 500px;
z-index: 500;
}
.dropzone .dz-preview:hover.dz-error .dz-error-message,
.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
display: block;
}
.dropzone {
border: 1px solid rgba(0,0,0,0.03);
min-height: 360px;
-webkit-border-radius: 3px;
border-radius: 3px;
background: rgba(0,0,0,0.03);
padding: 23px;
}
.dropzone .dz-default.dz-message {
opacity: 1;
-ms-filter: none;
filter: none;
-webkit-transition: opacity 0.3s ease-in-out;
-moz-transition: opacity 0.3s ease-in-out;
-o-transition: opacity 0.3s ease-in-out;
-ms-transition: opacity 0.3s ease-in-out;
transition: opacity 0.3s ease-in-out;
background-image: url("../images/spritemap.png");
background-repeat: no-repeat;
background-position: 0 0;
position: absolute;
width: 428px;
height: 123px;
margin-left: -214px;
margin-top: -61.5px;
top: 50%;
left: 50%;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
.dropzone .dz-default.dz-message {
background-image: url("../images/spritemap@2x.png");
-webkit-background-size: 428px 406px;
-moz-background-size: 428px 406px;
background-size: 428px 406px;
}
}
.dropzone .dz-default.dz-message span {
display: none;
}
.dropzone.dz-square .dz-default.dz-message {
background-position: 0 -123px;
width: 268px;
margin-left: -134px;
height: 174px;
margin-top: -87px;
}
.dropzone.dz-drag-hover .dz-message {
opacity: 0.15;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)";
filter: alpha(opacity=15);
}
.dropzone.dz-started .dz-message {
display: block;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
}
.dropzone .dz-preview,
.dropzone-previews .dz-preview {
-webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16);
box-shadow: 1px 1px 4px rgba(0,0,0,0.16);
font-size: 14px;
}
.dropzone .dz-preview.dz-image-preview:hover .dz-details img,
.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img {
display: block;
opacity: 0.1;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)";
filter: alpha(opacity=10);
}
.dropzone .dz-preview.dz-success .dz-success-mark,
.dropzone-previews .dz-preview.dz-success .dz-success-mark {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone .dz-preview.dz-error .dz-error-mark,
.dropzone-previews .dz-preview.dz-error .dz-error-mark {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone .dz-preview.dz-error .dz-progress .dz-upload,
.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload {
background: #ee1e2d;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark,
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
display: block;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
-webkit-transition: opacity 0.4s ease-in-out;
-moz-transition: opacity 0.4s ease-in-out;
-o-transition: opacity 0.4s ease-in-out;
-ms-transition: opacity 0.4s ease-in-out;
transition: opacity 0.4s ease-in-out;
background-image: url("../images/spritemap.png");
background-repeat: no-repeat;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark,
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
background-image: url("../images/spritemap@2x.png");
-webkit-background-size: 428px 406px;
-moz-background-size: 428px 406px;
background-size: 428px 406px;
}
}
.dropzone .dz-preview .dz-error-mark span,
.dropzone-previews .dz-preview .dz-error-mark span,
.dropzone .dz-preview .dz-success-mark span,
.dropzone-previews .dz-preview .dz-success-mark span {
display: none;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
background-position: -268px -123px;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
background-position: -268px -163px;
}
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
-webkit-animation: loading 0.4s linear infinite;
-moz-animation: loading 0.4s linear infinite;
-o-animation: loading 0.4s linear infinite;
-ms-animation: loading 0.4s linear infinite;
animation: loading 0.4s linear infinite;
-webkit-transition: width 0.3s ease-in-out;
-moz-transition: width 0.3s ease-in-out;
-o-transition: width 0.3s ease-in-out;
-ms-transition: width 0.3s ease-in-out;
transition: width 0.3s ease-in-out;
-webkit-border-radius: 2px;
border-radius: 2px;
position: absolute;
top: 0;
left: 0;
width: 0%;
height: 100%;
background-image: url("../images/spritemap.png");
background-repeat: repeat-x;
background-position: 0px -400px;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
background-image: url("../images/spritemap@2x.png");
-webkit-background-size: 428px 406px;
-moz-background-size: 428px 406px;
background-size: 428px 406px;
}
}
.dropzone .dz-preview.dz-success .dz-progress,
.dropzone-previews .dz-preview.dz-success .dz-progress {
display: block;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
-webkit-transition: opacity 0.4s ease-in-out;
-moz-transition: opacity 0.4s ease-in-out;
-o-transition: opacity 0.4s ease-in-out;
-ms-transition: opacity 0.4s ease-in-out;
transition: opacity 0.4s ease-in-out;
}
.dropzone .dz-preview .dz-error-message,
.dropzone-previews .dz-preview .dz-error-message {
display: block;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
-webkit-transition: opacity 0.3s ease-in-out;
-moz-transition: opacity 0.3s ease-in-out;
-o-transition: opacity 0.3s ease-in-out;
-ms-transition: opacity 0.3s ease-in-out;
transition: opacity 0.3s ease-in-out;
}
.dropzone .dz-preview:hover.dz-error .dz-error-message,
.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone a.dz-remove,
.dropzone-previews a.dz-remove {
background-image: -webkit-linear-gradient(top, #fafafa, #eee);
background-image: -moz-linear-gradient(top, #fafafa, #eee);
background-image: -o-linear-gradient(top, #fafafa, #eee);
background-image: -ms-linear-gradient(top, #fafafa, #eee);
background-image: linear-gradient(to bottom, #fafafa, #eee);
-webkit-border-radius: 2px;
border-radius: 2px;
border: 1px solid #eee;
text-decoration: none;
display: block;
padding: 4px 5px;
text-align: center;
color: #aaa;
margin-top: 26px;
}
.dropzone a.dz-remove:hover,
.dropzone-previews a.dz-remove:hover {
color: #666;
}
@-moz-keyframes loading {
0% {
background-position: 0 -400px;
}
100% {
background-position: -7px -400px;
}
}
@-webkit-keyframes loading {
0% {
background-position: 0 -400px;
}
100% {
background-position: -7px -400px;
}
}
@-o-keyframes loading {
0% {
background-position: 0 -400px;
}
100% {
background-position: -7px -400px;
}
}
@-ms-keyframes loading {
0% {
background-position: 0 -400px;
}
100% {
background-position: -7px -400px;
}
}
@keyframes loading {
0% {
background-position: 0 -400px;
}
100% {
background-position: -7px -400px;
}
}
.red-fonts {
color: #ed5565;
}
.form-group.required .control-label:after {
content: " *";
color: red;
}
.n-invalid {border: 1px solid #f00;}
.primary-panel .ibox-title {
color: #ffffff;
background-color: #1AB394;
}
.primary-panel .ibox-content {
border: 1px solid #1AB394;
}
.info-panel .ibox-title {
color: #ffffff;
background-color: #23c6c8;
}
.info-panel .ibox-content {
border: 1px solid #23c6c8;;
}
th a {
color: #676a6c;
}
.select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #1ab394;
color: white;
}
.select2-selection--multiple {
border: 1px solid #e5e6e7 !important;
cursor: text !important;
}
.select2-container--forcus {
border: 1px solid #1AB394 !important;
}
.select2-selection__choice,
.chosen-container-multi .chosen-choices li.search-choice {
background: #f1f1f1 !important;
border: 1px solid #e5e6e7 !important;
/*border: 1px solid #ededed;*/
border-radius: 2px !important;
box-shadow: none !important;
color: #333333 !important;
cursor: default !important;
line-height: 13px !important;
/*margin: 3px 0 3px 5px !important;*/
padding: 3px 20px 3px 5px !important;
position: relative !important;
}
.select2-container--default.select2-container--focus .select2-selection--multiple {
border: 1px solid #1ab394 !important;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3) !important;
}
.passwordBox2 {
max-width: 660px;
margin: 0 auto;
padding: 100px 20px 20px 20px;
}
.no-borders-tr td {
border-top: none !important;
}
/* Magnific Popup CSS */
.mfp-bg {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1042;
overflow: hidden;
position: fixed;
background: #0b0b0b;
opacity: 0.8;
filter: alpha(opacity=80); }
.mfp-wrap {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1043;
position: fixed;
outline: none !important;
-webkit-backface-visibility: hidden; }
.mfp-container {
text-align: center;
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
padding: 0 8px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box; }
.mfp-container:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle; }
.mfp-align-top .mfp-container:before {
display: none; }
.mfp-content {
position: relative;
display: inline-block;
vertical-align: middle;
margin: 0 auto;
text-align: left;
z-index: 1045; }
.mfp-inline-holder .mfp-content, .mfp-ajax-holder .mfp-content {
width: 100%;
cursor: auto; }
.mfp-ajax-cur {
cursor: progress; }
.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
cursor: -moz-zoom-out;
cursor: -webkit-zoom-out;
cursor: zoom-out; }
.mfp-zoom {
cursor: pointer;
cursor: -webkit-zoom-in;
cursor: -moz-zoom-in;
cursor: zoom-in; }
.mfp-auto-cursor .mfp-content {
cursor: auto; }
.mfp-close, .mfp-arrow, .mfp-preloader, .mfp-counter {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none; }
.mfp-loading.mfp-figure {
display: none; }
.mfp-hide {
display: none !important; }
.mfp-preloader {
color: #CCC;
position: absolute;
top: 50%;
width: auto;
text-align: center;
margin-top: -0.8em;
left: 8px;
right: 8px;
z-index: 1044; }
.mfp-preloader a {
color: #CCC; }
.mfp-preloader a:hover {
color: #FFF; }
.mfp-s-ready .mfp-preloader {
display: none; }
.mfp-s-error .mfp-content {
display: none; }
button.mfp-close, button.mfp-arrow {
overflow: visible;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
display: block;
outline: none;
padding: 0;
z-index: 1046;
-webkit-box-shadow: none;
box-shadow: none; }
button::-moz-focus-inner {
padding: 0;
border: 0; }
.mfp-close {
width: 44px;
height: 44px;
line-height: 44px;
position: absolute;
right: 0;
top: 0;
text-decoration: none;
text-align: center;
opacity: 0.65;
filter: alpha(opacity=65);
padding: 0 0 18px 10px;
color: #FFF;
font-style: normal;
font-size: 28px;
font-family: Arial, Baskerville, monospace; }
.mfp-close:hover, .mfp-close:focus {
opacity: 1;
filter: alpha(opacity=100); }
.mfp-close:active {
top: 1px; }
.mfp-close-btn-in .mfp-close {
color: #333; }
.mfp-image-holder .mfp-close, .mfp-iframe-holder .mfp-close {
color: #FFF;
right: -6px;
text-align: right;
padding-right: 6px;
width: 100%; }
.mfp-counter {
position: absolute;
top: 0;
right: 0;
color: #CCC;
font-size: 12px;
line-height: 18px;
white-space: nowrap; }
.mfp-arrow {
position: absolute;
opacity: 0.65;
filter: alpha(opacity=65);
margin: 0;
top: 50%;
margin-top: -55px;
padding: 0;
width: 90px;
height: 110px;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
.mfp-arrow:active {
margin-top: -54px; }
.mfp-arrow:hover, .mfp-arrow:focus {
opacity: 1;
filter: alpha(opacity=100); }
.mfp-arrow:before, .mfp-arrow:after, .mfp-arrow .mfp-b, .mfp-arrow .mfp-a {
content: '';
display: block;
width: 0;
height: 0;
position: absolute;
left: 0;
top: 0;
margin-top: 35px;
margin-left: 35px;
border: medium inset transparent; }
.mfp-arrow:after, .mfp-arrow .mfp-a {
border-top-width: 13px;
border-bottom-width: 13px;
top: 8px; }
.mfp-arrow:before, .mfp-arrow .mfp-b {
border-top-width: 21px;
border-bottom-width: 21px;
opacity: 0.7; }
.mfp-arrow-left {
left: 0; }
.mfp-arrow-left:after, .mfp-arrow-left .mfp-a {
border-right: 17px solid #FFF;
margin-left: 31px; }
.mfp-arrow-left:before, .mfp-arrow-left .mfp-b {
margin-left: 25px;
border-right: 27px solid #3F3F3F; }
.mfp-arrow-right {
right: 0; }
.mfp-arrow-right:after, .mfp-arrow-right .mfp-a {
border-left: 17px solid #FFF;
margin-left: 39px; }
.mfp-arrow-right:before, .mfp-arrow-right .mfp-b {
border-left: 27px solid #3F3F3F; }
.mfp-iframe-holder {
padding-top: 40px;
padding-bottom: 40px; }
.mfp-iframe-holder .mfp-content {
line-height: 0;
width: 100%;
max-width: 900px; }
.mfp-iframe-holder .mfp-close {
top: -40px; }
.mfp-iframe-scaler {
width: 100%;
height: 0;
overflow: hidden;
padding-top: 56.25%; }
.mfp-iframe-scaler iframe {
position: absolute;
display: block;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
background: #000; }
/* Main image in popup */
img.mfp-img {
width: auto;
max-width: 100%;
height: auto;
display: block;
line-height: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 40px 0 40px;
margin: 0 auto; }
/* The shadow behind the image */
.mfp-figure {
line-height: 0; }
.mfp-figure:after {
content: '';
position: absolute;
left: 0;
top: 40px;
bottom: 40px;
display: block;
right: 0;
width: auto;
height: auto;
z-index: -1;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
background: #444; }
.mfp-figure small {
color: #BDBDBD;
display: block;
font-size: 12px;
line-height: 14px; }
.mfp-figure figure {
margin: 0; }
.mfp-bottom-bar {
margin-top: -36px;
position: absolute;
top: 100%;
left: 0;
width: 100%;
cursor: auto; }
.mfp-title {
text-align: left;
line-height: 18px;
color: #F3F3F3;
word-wrap: break-word;
padding-right: 36px; }
.mfp-image-holder .mfp-content {
max-width: 100%; }
.mfp-gallery .mfp-image-holder .mfp-figure {
cursor: pointer; }
@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
/**
* Remove all paddings around the image on small screen
*/
.mfp-img-mobile .mfp-image-holder {
padding-left: 0;
padding-right: 0; }
.mfp-img-mobile img.mfp-img {
padding: 0; }
.mfp-img-mobile .mfp-figure:after {
top: 0;
bottom: 0; }
.mfp-img-mobile .mfp-figure small {
display: inline;
margin-left: 5px; }
.mfp-img-mobile .mfp-bottom-bar {
background: rgba(0, 0, 0, 0.6);
bottom: 0;
margin: 0;
top: auto;
padding: 3px 5px;
position: fixed;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box; }
.mfp-img-mobile .mfp-bottom-bar:empty {
padding: 0; }
.mfp-img-mobile .mfp-counter {
right: 5px;
top: 3px; }
.mfp-img-mobile .mfp-close {
top: 0;
right: 0;
width: 35px;
height: 35px;
line-height: 35px;
background: rgba(0, 0, 0, 0.6);
position: fixed;
text-align: center;
padding: 0; }
}
@media all and (max-width: 900px) {
.mfp-arrow {
-webkit-transform: scale(0.75);
transform: scale(0.75); }
.mfp-arrow-left {
-webkit-transform-origin: 0;
transform-origin: 0; }
.mfp-arrow-right {
-webkit-transform-origin: 100%;
transform-origin: 100%; }
.mfp-container {
padding-left: 6px;
padding-right: 6px; }
}
.mfp-ie7 .mfp-img {
padding: 0; }
.mfp-ie7 .mfp-bottom-bar {
width: 600px;
left: 50%;
margin-left: -300px;
margin-top: 5px;
padding-bottom: 5px; }
.mfp-ie7 .mfp-container {
padding: 0; }
.mfp-ie7 .mfp-content {
padding-top: 44px; }
.mfp-ie7 .mfp-close {
top: 0;
right: 0;
padding-top: 0; }
/*!
Chosen, a Select Box Enhancer for jQuery and Prototype
by Patrick Filler for Harvest, http://getharvest.com
Version 1.1.0
Full source at https://github.com/harvesthq/chosen
Copyright (c) 2011 Harvest http://getharvest.com
MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
This file is generated by `grunt build`, do not edit it by hand.
*/
/* @group Base */
.chosen-container {
position: relative;
display: inline-block;
vertical-align: middle;
font-size: 13px;
zoom: 1;
*display: inline;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.chosen-container .chosen-drop {
position: absolute;
top: 100%;
left: -9999px;
z-index: 1010;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
width: 100%;
border: 1px solid #aaa;
border-top: 0;
background: #fff;
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
}
.chosen-container.chosen-with-drop .chosen-drop {
left: 0;
}
.chosen-container a {
cursor: pointer;
}
/* @end */
/* @group Single Chosen */
.chosen-container-single .chosen-single {
position: relative;
display: block;
overflow: hidden;
padding: 0 0 0 8px;
height: 23px;
border: 1px solid #aaa;
border-radius: 5px;
background-color: #fff;
background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
background-clip: padding-box;
box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
color: #444;
text-decoration: none;
white-space: nowrap;
line-height: 24px;
}
.chosen-container-single .chosen-default {
color: #999;
}
.chosen-container-single .chosen-single span {
display: block;
overflow: hidden;
margin-right: 26px;
text-overflow: ellipsis;
white-space: nowrap;
}
.chosen-container-single .chosen-single-with-deselect span {
margin-right: 38px;
}
.chosen-container-single .chosen-single abbr {
position: absolute;
top: 6px;
right: 26px;
display: block;
width: 12px;
height: 12px;
background: url('chosen-sprite.png') -42px 1px no-repeat;
font-size: 1px;
}
.chosen-container-single .chosen-single abbr:hover {
background-position: -42px -10px;
}
.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
background-position: -42px -10px;
}
.chosen-container-single .chosen-single div {
position: absolute;
top: 0;
right: 0;
display: block;
width: 18px;
height: 100%;
}
.chosen-container-single .chosen-single div b {
display: block;
width: 100%;
height: 100%;
background: url('chosen-sprite.png') no-repeat 0px 2px;
}
.chosen-container-single .chosen-search {
position: relative;
z-index: 1010;
margin: 0;
padding: 3px 4px;
white-space: nowrap;
}
.chosen-container-single .chosen-search input[type="text"] {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
margin: 1px 0;
padding: 4px 20px 4px 5px;
width: 100%;
height: auto;
outline: 0;
border: 1px solid #aaa;
background: white url('chosen-sprite.png') no-repeat 100% -20px;
background: url('chosen-sprite.png') no-repeat 100% -20px;
font-size: 1em;
font-family: sans-serif;
line-height: normal;
border-radius: 0;
}
.chosen-container-single .chosen-drop {
margin-top: -1px;
border-radius: 0 0 4px 4px;
background-clip: padding-box;
}
.chosen-container-single.chosen-container-single-nosearch .chosen-search {
position: absolute;
left: -9999px;
}
/* @end */
/* @group Results */
.chosen-container .chosen-results {
position: relative;
overflow-x: hidden;
overflow-y: auto;
margin: 0 4px 4px 0;
padding: 0 0 0 4px;
max-height: 240px;
-webkit-overflow-scrolling: touch;
}
.chosen-container .chosen-results li {
display: none;
margin: 0;
padding: 5px 6px;
list-style: none;
line-height: 15px;
-webkit-touch-callout: none;
}
.chosen-container .chosen-results li.active-result {
display: list-item;
cursor: pointer;
}
.chosen-container .chosen-results li.disabled-result {
display: list-item;
color: #ccc;
cursor: default;
}
.chosen-container .chosen-results li.highlighted {
background-color: #3875d7;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
color: #fff;
}
.chosen-container .chosen-results li.no-results {
display: list-item;
background: #f4f4f4;
}
.chosen-container .chosen-results li.group-result {
display: list-item;
font-weight: bold;
cursor: default;
}
.chosen-container .chosen-results li.group-option {
padding-left: 15px;
}
.chosen-container .chosen-results li em {
font-style: normal;
text-decoration: underline;
}
/* @end */
/* @group Multi Chosen */
.chosen-container-multi .chosen-choices {
-moz-box-sizing: border-box;
background-color: #FFFFFF;
border: 1px solid #CBD5DD;
border-radius: 2px;
cursor: text;
height: auto !important;
margin: 0;
min-height: 30px;
overflow: hidden;
padding: 2px;
position: relative;
width: 100%;
}
.chosen-container-multi .chosen-choices li {
float: left;
list-style: none;
}
.chosen-container-multi .chosen-choices li.search-field {
margin: 0;
padding: 0;
white-space: nowrap;
}
.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
margin: 1px 0;
padding: 5px;
height: 25px;
outline: 0;
border: 0 !important;
background: transparent !important;
box-shadow: none;
color: #666;
font-size: 100%;
font-family: sans-serif;
line-height: normal;
border-radius: 0;
}
.chosen-container-multi .chosen-choices li.search-field .default {
color: #999;
}
.chosen-container-multi .chosen-choices li.search-choice {
position: relative;
margin: 3px 0 3px 5px;
padding: 3px 20px 3px 5px;
border: 1px solid #aaa;
border-radius: 3px;
background-color: #e4e4e4;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-clip: padding-box;
box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
color: #333;
line-height: 13px;
cursor: default;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
position: absolute;
top: 4px;
right: 3px;
display: block;
width: 12px;
height: 12px;
background: url('chosen-sprite.png') -42px 1px no-repeat;
font-size: 1px;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
background-position: -42px -10px;
}
.chosen-container-multi .chosen-choices li.search-choice-disabled {
padding-right: 5px;
border: 1px solid #ccc;
background-color: #e4e4e4;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
color: #666;
}
.chosen-container-multi .chosen-choices li.search-choice-focus {
background: #d4d4d4;
}
.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
background-position: -42px -10px;
}
.chosen-container-multi .chosen-results {
margin: 0;
padding: 0;
}
.chosen-container-multi .chosen-drop .result-selected {
display: list-item;
color: #ccc;
cursor: default;
}
/* @end */
/* @group Active */
.chosen-container-active .chosen-single {
border: 1px solid #5897fb;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
.chosen-container-active.chosen-with-drop .chosen-single {
border: 1px solid #aaa;
-moz-border-radius-bottomright: 0;
border-bottom-right-radius: 0;
-moz-border-radius-bottomleft: 0;
border-bottom-left-radius: 0;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%);
background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%);
background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%);
background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
box-shadow: 0 1px 0 #fff inset;
}
.chosen-container-active.chosen-with-drop .chosen-single div {
border-left: none;
background: transparent;
}
.chosen-container-active.chosen-with-drop .chosen-single div b {
background-position: -18px 2px;
}
.chosen-container-active .chosen-choices {
border: 1px solid #5897fb;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
color: #111 !important;
}
/* @end */
/* @group Disabled Support */
.chosen-disabled {
opacity: 0.5 !important;
cursor: default;
}
.chosen-disabled .chosen-single {
cursor: default;
}
.chosen-disabled .chosen-choices .search-choice .search-choice-close {
cursor: default;
}
/* @end */
/* @group Right to Left */
.chosen-rtl {
text-align: right;
}
.chosen-rtl .chosen-single {
overflow: visible;
padding: 0 8px 0 0;
}
.chosen-rtl .chosen-single span {
margin-right: 0;
margin-left: 26px;
direction: rtl;
}
.chosen-rtl .chosen-single-with-deselect span {
margin-left: 38px;
}
.chosen-rtl .chosen-single div {
right: auto;
left: 3px;
}
.chosen-rtl .chosen-single abbr {
right: auto;
left: 26px;
}
.chosen-rtl .chosen-choices li {
float: right;
}
.chosen-rtl .chosen-choices li.search-field input[type="text"] {
direction: rtl;
}
.chosen-rtl .chosen-choices li.search-choice {
margin: 3px 5px 3px 0;
padding: 3px 5px 3px 19px;
}
.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
right: auto;
left: 4px;
}
.chosen-rtl.chosen-container-single-nosearch .chosen-search,
.chosen-rtl .chosen-drop {
left: 9999px;
}
.chosen-rtl.chosen-container-single .chosen-results {
margin: 0 0 4px 4px;
padding: 0 4px 0 0;
}
.chosen-rtl .chosen-results li.group-option {
padding-right: 15px;
padding-left: 0;
}
.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
border-right: none;
}
.chosen-rtl .chosen-search input[type="text"] {
padding: 4px 5px 4px 20px;
background: white url('chosen-sprite.png') no-repeat -30px -20px;
background: url('chosen-sprite.png') no-repeat -30px -20px;
direction: rtl;
}
.chosen-rtl.chosen-container-single .chosen-single div b {
background-position: 6px 2px;
}
.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
background-position: -12px 2px;
}
/* @end */
/* @group Retina compatibility */
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
.chosen-rtl .chosen-search input[type="text"],
.chosen-container-single .chosen-single abbr,
.chosen-container-single .chosen-single div b,
.chosen-container-single .chosen-search input[type="text"],
.chosen-container-multi .chosen-choices .search-choice .search-choice-close,
.chosen-container .chosen-results-scroll-down span,
.chosen-container .chosen-results-scroll-up span {
background-image: url('chosen-sprite@2x.png') !important;
background-size: 52px 37px !important;
background-repeat: no-repeat !important;
}
}
/* @end */
/*
* This combined file was created by the DataTables downloader builder:
* https://datatables.net/download
*
* To rebuild or modify this file with the latest versions of the included
* software please visit:
* https://datatables.net/download/#bs/pdfmake-0.1.18,dt-1.10.10,b-1.1.0,b-html5-1.1.0,b-print-1.1.0,r-2.0.0
*
* Included libraries:
* pdfmake 0.1.18, DataTables 1.10.10, Buttons 1.1.0, HTML5 export 1.1.0, Print view 1.1.0, Responsive 2.0.0
*/
table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-collapse:separate !important}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}
div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.dropdown-menu.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.dropdown-menu.fixed.two-column{margin-left:-150px}ul.dt-button-collection.dropdown-menu.fixed.three-column{margin-left:-225px}ul.dt-button-collection.dropdown-menu.fixed.four-column{margin-left:-300px}ul.dt-button-collection.dropdown-menu>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.dropdown-menu.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.dropdown-menu.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.dropdown-menu.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2001}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons a.btn{float:none}}
table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child:before{top:8px;left:4px;height:16px;width:16px;display:block;position:absolute;color:white;border:2px solid white;border-radius:16px;box-shadow:0 0 3px #444;box-sizing:content-box;font-family:'Courier New', Courier, monospace;text-indent:4px;line-height:16px;content:'+';background-color:#337ab7}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-inline.collapsed>tbody>tr.child td:before{display:none}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:white;border:2px solid white;border-radius:16px;box-shadow:0 0 3px #444;box-sizing:content-box;font-family:'Courier New', Courier, monospace;text-indent:4px;line-height:16px;content:'+';background-color:#337ab7}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable>tbody>tr.child{padding:0.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul li{border-bottom:1px solid #efefef;padding:0.5em 0}table.dataTable>tbody>tr.child ul li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:0.5em;box-shadow:0 12px 30px rgba(0,0,0,0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}
.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none;}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px;}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none;}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap;}.select2-container .select2-search--inline{float:left;}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none;}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051;}.select2-results{display:block;}.select2-results__options{list-style:none;margin:0;padding:0;}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none;}.select2-results__option[aria-selected]{cursor:pointer;}.select2-container--open .select2-dropdown{left:0;}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0;}.select2-search--dropdown{display:block;padding:4px;}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none;}.select2-search--dropdown.select2-search--hide{display:none;}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0);}.select2-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px;}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px;}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999;}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px;}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0;}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left;}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto;}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default;}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none;}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px;}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%;}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left;}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px;}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder{float:right;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto;}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0;}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default;}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none;}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0;}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa;}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto;}.select2-container--default .select2-results__option[role=group]{padding:0;}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999;}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd;}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em;}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white;}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px;}.select2-container--classic .select2-selection--single{background-color:#f6f6f6;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #ffffff 50%, #eeeeee 100%);background-image:-o-linear-gradient(top, #ffffff 50%, #eeeeee 100%);background-image:linear-gradient(to bottom, #ffffff 50%, #eeeeee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb;}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px;}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px;}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999;}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);background-image:-o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);background-image:linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0);}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0;}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left;}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto;}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb;}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none;}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px;}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #ffffff 0%, #eeeeee 50%);background-image:-o-linear-gradient(top, #ffffff 0%, #eeeeee 50%);background-image:linear-gradient(to bottom, #ffffff 0%, #eeeeee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eeeeee 50%, #ffffff 100%);background-image:-o-linear-gradient(top, #eeeeee 50%, #ffffff 100%);background-image:linear-gradient(to bottom, #eeeeee 50%, #ffffff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb;}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px;}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none;}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px;}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto;}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb;}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0;}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0;}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;}.select2-container--classic .select2-dropdown{background-color:white;border:1px solid transparent;}.select2-container--classic .select2-dropdown--above{border-bottom:none;}.select2-container--classic .select2-dropdown--below{border-top:none;}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto;}.select2-container--classic .select2-results__option[role=group]{padding:0;}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey;}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:white;}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px;}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb;}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
apps/static/img/facio.ico

1.59 KB | W: | H:

apps/static/img/facio.ico

1.7 KB | W: | H:

apps/static/img/facio.ico
apps/static/img/facio.ico
apps/static/img/facio.ico
apps/static/img/facio.ico
  • 2-up
  • Swipe
  • Onion skin
......@@ -34,9 +34,9 @@ $(document).ready(function () {
});
// Append config box / Only for demo purpose
$.get("/skin_config/", function (data) {
$('body').append(data);
});
//$.get("/skin_config/", function (data) {
// $('body').append(data);
//});
// minimalize menu
$('.navbar-minimalize').click(function () {
......
/*!
Chosen, a Select Box Enhancer for jQuery and Prototype
by Patrick Filler for Harvest, http://getharvest.com
Version 1.1.0
Full source at https://github.com/harvesthq/chosen
Copyright (c) 2011 Harvest http://getharvest.com
MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
This file is generated by `grunt build`, do not edit it by hand.
*/
(function() {
var $, AbstractChosen, Chosen, SelectParser, _ref,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
SelectParser = (function() {
function SelectParser() {
this.options_index = 0;
this.parsed = [];
}
SelectParser.prototype.add_node = function(child) {
if (child.nodeName.toUpperCase() === "OPTGROUP") {
return this.add_group(child);
} else {
return this.add_option(child);
}
};
SelectParser.prototype.add_group = function(group) {
var group_position, option, _i, _len, _ref, _results;
group_position = this.parsed.length;
this.parsed.push({
array_index: group_position,
group: true,
label: this.escapeExpression(group.label),
children: 0,
disabled: group.disabled
});
_ref = group.childNodes;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
option = _ref[_i];
_results.push(this.add_option(option, group_position, group.disabled));
}
return _results;
};
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
if (option.nodeName.toUpperCase() === "OPTION") {
if (option.text !== "") {
if (group_position != null) {
this.parsed[group_position].children += 1;
}
this.parsed.push({
array_index: this.parsed.length,
options_index: this.options_index,
value: option.value,
text: option.text,
html: option.innerHTML,
selected: option.selected,
disabled: group_disabled === true ? group_disabled : option.disabled,
group_array_index: group_position,
classes: option.className,
style: option.style.cssText
});
} else {
this.parsed.push({
array_index: this.parsed.length,
options_index: this.options_index,
empty: true
});
}
return this.options_index += 1;
}
};
SelectParser.prototype.escapeExpression = function(text) {
var map, unsafe_chars;
if ((text == null) || text === false) {
return "";
}
if (!/[\&\<\>\"\'\`]/.test(text)) {
return text;
}
map = {
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#x27;",
"`": "&#x60;"
};
unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g;
return text.replace(unsafe_chars, function(chr) {
return map[chr] || "&amp;";
});
};
return SelectParser;
})();
SelectParser.select_to_array = function(select) {
var child, parser, _i, _len, _ref;
parser = new SelectParser();
_ref = select.childNodes;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
child = _ref[_i];
parser.add_node(child);
}
return parser.parsed;
};
AbstractChosen = (function() {
function AbstractChosen(form_field, options) {
this.form_field = form_field;
this.options = options != null ? options : {};
if (!AbstractChosen.browser_is_supported()) {
return;
}
this.is_multiple = this.form_field.multiple;
this.set_default_text();
this.set_default_values();
this.setup();
this.set_up_html();
this.register_observers();
}
AbstractChosen.prototype.set_default_values = function() {
var _this = this;
this.click_test_action = function(evt) {
return _this.test_active_click(evt);
};
this.activate_action = function(evt) {
return _this.activate_field(evt);
};
this.active_field = false;
this.mouse_on_container = false;
this.results_showing = false;
this.result_highlighted = null;
this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
this.disable_search_threshold = this.options.disable_search_threshold || 0;
this.disable_search = this.options.disable_search || false;
this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
this.group_search = this.options.group_search != null ? this.options.group_search : true;
this.search_contains = this.options.search_contains || false;
this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
this.max_selected_options = this.options.max_selected_options || Infinity;
this.inherit_select_classes = this.options.inherit_select_classes || false;
this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
};
AbstractChosen.prototype.set_default_text = function() {
if (this.form_field.getAttribute("data-placeholder")) {
this.default_text = this.form_field.getAttribute("data-placeholder");
} else if (this.is_multiple) {
this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
} else {
this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
}
return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
};
AbstractChosen.prototype.mouse_enter = function() {
return this.mouse_on_container = true;
};
AbstractChosen.prototype.mouse_leave = function() {
return this.mouse_on_container = false;
};
AbstractChosen.prototype.input_focus = function(evt) {
var _this = this;
if (this.is_multiple) {
if (!this.active_field) {
return setTimeout((function() {
return _this.container_mousedown();
}), 50);
}
} else {
if (!this.active_field) {
return this.activate_field();
}
}
};
AbstractChosen.prototype.input_blur = function(evt) {
var _this = this;
if (!this.mouse_on_container) {
this.active_field = false;
return setTimeout((function() {
return _this.blur_test();
}), 100);
}
};
AbstractChosen.prototype.results_option_build = function(options) {
var content, data, _i, _len, _ref;
content = '';
_ref = this.results_data;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
data = _ref[_i];
if (data.group) {
content += this.result_add_group(data);
} else {
content += this.result_add_option(data);
}
if (options != null ? options.first : void 0) {
if (data.selected && this.is_multiple) {
this.choice_build(data);
} else if (data.selected && !this.is_multiple) {
this.single_set_selected_text(data.text);
}
}
}
return content;
};
AbstractChosen.prototype.result_add_option = function(option) {
var classes, option_el;
if (!option.search_match) {
return '';
}
if (!this.include_option_in_results(option)) {
return '';
}
classes = [];
if (!option.disabled && !(option.selected && this.is_multiple)) {
classes.push("active-result");
}
if (option.disabled && !(option.selected && this.is_multiple)) {
classes.push("disabled-result");
}
if (option.selected) {
classes.push("result-selected");
}
if (option.group_array_index != null) {
classes.push("group-option");
}
if (option.classes !== "") {
classes.push(option.classes);
}
option_el = document.createElement("li");
option_el.className = classes.join(" ");
option_el.style.cssText = option.style;
option_el.setAttribute("data-option-array-index", option.array_index);
option_el.innerHTML = option.search_text;
return this.outerHTML(option_el);
};
AbstractChosen.prototype.result_add_group = function(group) {
var group_el;
if (!(group.search_match || group.group_match)) {
return '';
}
if (!(group.active_options > 0)) {
return '';
}
group_el = document.createElement("li");
group_el.className = "group-result";
group_el.innerHTML = group.search_text;
return this.outerHTML(group_el);
};
AbstractChosen.prototype.results_update_field = function() {
this.set_default_text();
if (!this.is_multiple) {
this.results_reset_cleanup();
}
this.result_clear_highlight();
this.results_build();
if (this.results_showing) {
return this.winnow_results();
}
};
AbstractChosen.prototype.reset_single_select_options = function() {
var result, _i, _len, _ref, _results;
_ref = this.results_data;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
result = _ref[_i];
if (result.selected) {
_results.push(result.selected = false);
} else {
_results.push(void 0);
}
}
return _results;
};
AbstractChosen.prototype.results_toggle = function() {
if (this.results_showing) {
return this.results_hide();
} else {
return this.results_show();
}
};
AbstractChosen.prototype.results_search = function(evt) {
if (this.results_showing) {
return this.winnow_results();
} else {
return this.results_show();
}
};
AbstractChosen.prototype.winnow_results = function() {
var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;
this.no_results_clear();
results = 0;
searchText = this.get_search_text();
escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
regexAnchor = this.search_contains ? "" : "^";
regex = new RegExp(regexAnchor + escapedSearchText, 'i');
zregex = new RegExp(escapedSearchText, 'i');
_ref = this.results_data;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
option = _ref[_i];
option.search_match = false;
results_group = null;
if (this.include_option_in_results(option)) {
if (option.group) {
option.group_match = false;
option.active_options = 0;
}
if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
results_group = this.results_data[option.group_array_index];
if (results_group.active_options === 0 && results_group.search_match) {
results += 1;
}
results_group.active_options += 1;
}
if (!(option.group && !this.group_search)) {
option.search_text = option.group ? option.label : option.html;
option.search_match = this.search_string_match(option.search_text, regex);
if (option.search_match && !option.group) {
results += 1;
}
if (option.search_match) {
if (searchText.length) {
startpos = option.search_text.search(zregex);
text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
}
if (results_group != null) {
results_group.group_match = true;
}
} else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
option.search_match = true;
}
}
}
}
this.result_clear_highlight();
if (results < 1 && searchText.length) {
this.update_results_content("");
return this.no_results(searchText);
} else {
this.update_results_content(this.results_option_build());
return this.winnow_results_set_highlight();
}
};
AbstractChosen.prototype.search_string_match = function(search_string, regex) {
var part, parts, _i, _len;
if (regex.test(search_string)) {
return true;
} else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) {
parts = search_string.replace(/\[|\]/g, "").split(" ");
if (parts.length) {
for (_i = 0, _len = parts.length; _i < _len; _i++) {
part = parts[_i];
if (regex.test(part)) {
return true;
}
}
}
}
};
AbstractChosen.prototype.choices_count = function() {
var option, _i, _len, _ref;
if (this.selected_option_count != null) {
return this.selected_option_count;
}
this.selected_option_count = 0;
_ref = this.form_field.options;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
option = _ref[_i];
if (option.selected) {
this.selected_option_count += 1;
}
}
return this.selected_option_count;
};
AbstractChosen.prototype.choices_click = function(evt) {
evt.preventDefault();
if (!(this.results_showing || this.is_disabled)) {
return this.results_show();
}
};
AbstractChosen.prototype.keyup_checker = function(evt) {
var stroke, _ref;
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
this.search_field_scale();
switch (stroke) {
case 8:
if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
return this.keydown_backstroke();
} else if (!this.pending_backstroke) {
this.result_clear_highlight();
return this.results_search();
}
break;
case 13:
evt.preventDefault();
if (this.results_showing) {
return this.result_select(evt);
}
break;
case 27:
if (this.results_showing) {
this.results_hide();
}
return true;
case 9:
case 38:
case 40:
case 16:
case 91:
case 17:
break;
default:
return this.results_search();
}
};
AbstractChosen.prototype.clipboard_event_checker = function(evt) {
var _this = this;
return setTimeout((function() {
return _this.results_search();
}), 50);
};
AbstractChosen.prototype.container_width = function() {
if (this.options.width != null) {
return this.options.width;
} else {
return "" + this.form_field.offsetWidth + "px";
}
};
AbstractChosen.prototype.include_option_in_results = function(option) {
if (this.is_multiple && (!this.display_selected_options && option.selected)) {
return false;
}
if (!this.display_disabled_options && option.disabled) {
return false;
}
if (option.empty) {
return false;
}
return true;
};
AbstractChosen.prototype.search_results_touchstart = function(evt) {
this.touch_started = true;
return this.search_results_mouseover(evt);
};
AbstractChosen.prototype.search_results_touchmove = function(evt) {
this.touch_started = false;
return this.search_results_mouseout(evt);
};
AbstractChosen.prototype.search_results_touchend = function(evt) {
if (this.touch_started) {
return this.search_results_mouseup(evt);
}
};
AbstractChosen.prototype.outerHTML = function(element) {
var tmp;
if (element.outerHTML) {
return element.outerHTML;
}
tmp = document.createElement("div");
tmp.appendChild(element);
return tmp.innerHTML;
};
AbstractChosen.browser_is_supported = function() {
if (window.navigator.appName === "Microsoft Internet Explorer") {
return document.documentMode >= 8;
}
if (/iP(od|hone)/i.test(window.navigator.userAgent)) {
return false;
}
if (/Android/i.test(window.navigator.userAgent)) {
if (/Mobile/i.test(window.navigator.userAgent)) {
return false;
}
}
return true;
};
AbstractChosen.default_multiple_text = "Select Some Options";
AbstractChosen.default_single_text = "Select an Option";
AbstractChosen.default_no_result_text = "No results match";
return AbstractChosen;
})();
$ = jQuery;
$.fn.extend({
chosen: function(options) {
if (!AbstractChosen.browser_is_supported()) {
return this;
}
return this.each(function(input_field) {
var $this, chosen;
$this = $(this);
chosen = $this.data('chosen');
if (options === 'destroy' && chosen) {
chosen.destroy();
} else if (!chosen) {
$this.data('chosen', new Chosen(this, options));
}
});
}
});
Chosen = (function(_super) {
__extends(Chosen, _super);
function Chosen() {
_ref = Chosen.__super__.constructor.apply(this, arguments);
return _ref;
}
Chosen.prototype.setup = function() {
this.form_field_jq = $(this.form_field);
this.current_selectedIndex = this.form_field.selectedIndex;
return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl");
};
Chosen.prototype.set_up_html = function() {
var container_classes, container_props;
container_classes = ["chosen-container"];
container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
if (this.inherit_select_classes && this.form_field.className) {
container_classes.push(this.form_field.className);
}
if (this.is_rtl) {
container_classes.push("chosen-rtl");
}
container_props = {
'class': container_classes.join(' '),
'style': "width: " + (this.container_width()) + ";",
'title': this.form_field.title
};
if (this.form_field.id.length) {
container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
}
this.container = $("<div />", container_props);
if (this.is_multiple) {
this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>');
} else {
this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>');
}
this.form_field_jq.hide().after(this.container);
this.dropdown = this.container.find('div.chosen-drop').first();
this.search_field = this.container.find('input').first();
this.search_results = this.container.find('ul.chosen-results').first();
this.search_field_scale();
this.search_no_results = this.container.find('li.no-results').first();
if (this.is_multiple) {
this.search_choices = this.container.find('ul.chosen-choices').first();
this.search_container = this.container.find('li.search-field').first();
} else {
this.search_container = this.container.find('div.chosen-search').first();
this.selected_item = this.container.find('.chosen-single').first();
}
this.results_build();
this.set_tab_index();
this.set_label_behavior();
return this.form_field_jq.trigger("chosen:ready", {
chosen: this
});
};
Chosen.prototype.register_observers = function() {
var _this = this;
this.container.bind('mousedown.chosen', function(evt) {
_this.container_mousedown(evt);
});
this.container.bind('mouseup.chosen', function(evt) {
_this.container_mouseup(evt);
});
this.container.bind('mouseenter.chosen', function(evt) {
_this.mouse_enter(evt);
});
this.container.bind('mouseleave.chosen', function(evt) {
_this.mouse_leave(evt);
});
this.search_results.bind('mouseup.chosen', function(evt) {
_this.search_results_mouseup(evt);
});
this.search_results.bind('mouseover.chosen', function(evt) {
_this.search_results_mouseover(evt);
});
this.search_results.bind('mouseout.chosen', function(evt) {
_this.search_results_mouseout(evt);
});
this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) {
_this.search_results_mousewheel(evt);
});
this.search_results.bind('touchstart.chosen', function(evt) {
_this.search_results_touchstart(evt);
});
this.search_results.bind('touchmove.chosen', function(evt) {
_this.search_results_touchmove(evt);
});
this.search_results.bind('touchend.chosen', function(evt) {
_this.search_results_touchend(evt);
});
this.form_field_jq.bind("chosen:updated.chosen", function(evt) {
_this.results_update_field(evt);
});
this.form_field_jq.bind("chosen:activate.chosen", function(evt) {
_this.activate_field(evt);
});
this.form_field_jq.bind("chosen:open.chosen", function(evt) {
_this.container_mousedown(evt);
});
this.form_field_jq.bind("chosen:close.chosen", function(evt) {
_this.input_blur(evt);
});
this.search_field.bind('blur.chosen', function(evt) {
_this.input_blur(evt);
});
this.search_field.bind('keyup.chosen', function(evt) {
_this.keyup_checker(evt);
});
this.search_field.bind('keydown.chosen', function(evt) {
_this.keydown_checker(evt);
});
this.search_field.bind('focus.chosen', function(evt) {
_this.input_focus(evt);
});
this.search_field.bind('cut.chosen', function(evt) {
_this.clipboard_event_checker(evt);
});
this.search_field.bind('paste.chosen', function(evt) {
_this.clipboard_event_checker(evt);
});
if (this.is_multiple) {
return this.search_choices.bind('click.chosen', function(evt) {
_this.choices_click(evt);
});
} else {
return this.container.bind('click.chosen', function(evt) {
evt.preventDefault();
});
}
};
Chosen.prototype.destroy = function() {
$(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
if (this.search_field[0].tabIndex) {
this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
}
this.container.remove();
this.form_field_jq.removeData('chosen');
return this.form_field_jq.show();
};
Chosen.prototype.search_field_disabled = function() {
this.is_disabled = this.form_field_jq[0].disabled;
if (this.is_disabled) {
this.container.addClass('chosen-disabled');
this.search_field[0].disabled = true;
if (!this.is_multiple) {
this.selected_item.unbind("focus.chosen", this.activate_action);
}
return this.close_field();
} else {
this.container.removeClass('chosen-disabled');
this.search_field[0].disabled = false;
if (!this.is_multiple) {
return this.selected_item.bind("focus.chosen", this.activate_action);
}
}
};
Chosen.prototype.container_mousedown = function(evt) {
if (!this.is_disabled) {
if (evt && evt.type === "mousedown" && !this.results_showing) {
evt.preventDefault();
}
if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
if (!this.active_field) {
if (this.is_multiple) {
this.search_field.val("");
}
$(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action);
this.results_show();
} else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
evt.preventDefault();
this.results_toggle();
}
return this.activate_field();
}
}
};
Chosen.prototype.container_mouseup = function(evt) {
if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
return this.results_reset(evt);
}
};
Chosen.prototype.search_results_mousewheel = function(evt) {
var delta;
if (evt.originalEvent) {
delta = -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
}
if (delta != null) {
evt.preventDefault();
if (evt.type === 'DOMMouseScroll') {
delta = delta * 40;
}
return this.search_results.scrollTop(delta + this.search_results.scrollTop());
}
};
Chosen.prototype.blur_test = function(evt) {
if (!this.active_field && this.container.hasClass("chosen-container-active")) {
return this.close_field();
}
};
Chosen.prototype.close_field = function() {
$(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
this.active_field = false;
this.results_hide();
this.container.removeClass("chosen-container-active");
this.clear_backstroke();
this.show_search_field_default();
return this.search_field_scale();
};
Chosen.prototype.activate_field = function() {
this.container.addClass("chosen-container-active");
this.active_field = true;
this.search_field.val(this.search_field.val());
return this.search_field.focus();
};
Chosen.prototype.test_active_click = function(evt) {
var active_container;
active_container = $(evt.target).closest('.chosen-container');
if (active_container.length && this.container[0] === active_container[0]) {
return this.active_field = true;
} else {
return this.close_field();
}
};
Chosen.prototype.results_build = function() {
this.parsing = true;
this.selected_option_count = null;
this.results_data = SelectParser.select_to_array(this.form_field);
if (this.is_multiple) {
this.search_choices.find("li.search-choice").remove();
} else if (!this.is_multiple) {
this.single_set_selected_text();
if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
this.search_field[0].readOnly = true;
this.container.addClass("chosen-container-single-nosearch");
} else {
this.search_field[0].readOnly = false;
this.container.removeClass("chosen-container-single-nosearch");
}
}
this.update_results_content(this.results_option_build({
first: true
}));
this.search_field_disabled();
this.show_search_field_default();
this.search_field_scale();
return this.parsing = false;
};
Chosen.prototype.result_do_highlight = function(el) {
var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
if (el.length) {
this.result_clear_highlight();
this.result_highlight = el;
this.result_highlight.addClass("highlighted");
maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
visible_top = this.search_results.scrollTop();
visible_bottom = maxHeight + visible_top;
high_top = this.result_highlight.position().top + this.search_results.scrollTop();
high_bottom = high_top + this.result_highlight.outerHeight();
if (high_bottom >= visible_bottom) {
return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
} else if (high_top < visible_top) {
return this.search_results.scrollTop(high_top);
}
}
};
Chosen.prototype.result_clear_highlight = function() {
if (this.result_highlight) {
this.result_highlight.removeClass("highlighted");
}
return this.result_highlight = null;
};
Chosen.prototype.results_show = function() {
if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
this.form_field_jq.trigger("chosen:maxselected", {
chosen: this
});
return false;
}
this.container.addClass("chosen-with-drop");
this.results_showing = true;
this.search_field.focus();
this.search_field.val(this.search_field.val());
this.winnow_results();
return this.form_field_jq.trigger("chosen:showing_dropdown", {
chosen: this
});
};
Chosen.prototype.update_results_content = function(content) {
return this.search_results.html(content);
};
Chosen.prototype.results_hide = function() {
if (this.results_showing) {
this.result_clear_highlight();
this.container.removeClass("chosen-with-drop");
this.form_field_jq.trigger("chosen:hiding_dropdown", {
chosen: this
});
}
return this.results_showing = false;
};
Chosen.prototype.set_tab_index = function(el) {
var ti;
if (this.form_field.tabIndex) {
ti = this.form_field.tabIndex;
this.form_field.tabIndex = -1;
return this.search_field[0].tabIndex = ti;
}
};
Chosen.prototype.set_label_behavior = function() {
var _this = this;
this.form_field_label = this.form_field_jq.parents("label");
if (!this.form_field_label.length && this.form_field.id.length) {
this.form_field_label = $("label[for='" + this.form_field.id + "']");
}
if (this.form_field_label.length > 0) {
return this.form_field_label.bind('click.chosen', function(evt) {
if (_this.is_multiple) {
return _this.container_mousedown(evt);
} else {
return _this.activate_field();
}
});
}
};
Chosen.prototype.show_search_field_default = function() {
if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
this.search_field.val(this.default_text);
return this.search_field.addClass("default");
} else {
this.search_field.val("");
return this.search_field.removeClass("default");
}
};
Chosen.prototype.search_results_mouseup = function(evt) {
var target;
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
if (target.length) {
this.result_highlight = target;
this.result_select(evt);
return this.search_field.focus();
}
};
Chosen.prototype.search_results_mouseover = function(evt) {
var target;
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
if (target) {
return this.result_do_highlight(target);
}
};
Chosen.prototype.search_results_mouseout = function(evt) {
if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
return this.result_clear_highlight();
}
};
Chosen.prototype.choice_build = function(item) {
var choice, close_link,
_this = this;
choice = $('<li />', {
"class": "search-choice"
}).html("<span>" + item.html + "</span>");
if (item.disabled) {
choice.addClass('search-choice-disabled');
} else {
close_link = $('<a />', {
"class": 'search-choice-close',
'data-option-array-index': item.array_index
});
close_link.bind('click.chosen', function(evt) {
return _this.choice_destroy_link_click(evt);
});
choice.append(close_link);
}
return this.search_container.before(choice);
};
Chosen.prototype.choice_destroy_link_click = function(evt) {
evt.preventDefault();
evt.stopPropagation();
if (!this.is_disabled) {
return this.choice_destroy($(evt.target));
}
};
Chosen.prototype.choice_destroy = function(link) {
if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
this.show_search_field_default();
if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {
this.results_hide();
}
link.parents('li').first().remove();
return this.search_field_scale();
}
};
Chosen.prototype.results_reset = function() {
this.reset_single_select_options();
this.form_field.options[0].selected = true;
this.single_set_selected_text();
this.show_search_field_default();
this.results_reset_cleanup();
this.form_field_jq.trigger("change");
if (this.active_field) {
return this.results_hide();
}
};
Chosen.prototype.results_reset_cleanup = function() {
this.current_selectedIndex = this.form_field.selectedIndex;
return this.selected_item.find("abbr").remove();
};
Chosen.prototype.result_select = function(evt) {
var high, item;
if (this.result_highlight) {
high = this.result_highlight;
this.result_clear_highlight();
if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
this.form_field_jq.trigger("chosen:maxselected", {
chosen: this
});
return false;
}
if (this.is_multiple) {
high.removeClass("active-result");
} else {
this.reset_single_select_options();
}
item = this.results_data[high[0].getAttribute("data-option-array-index")];
item.selected = true;
this.form_field.options[item.options_index].selected = true;
this.selected_option_count = null;
if (this.is_multiple) {
this.choice_build(item);
} else {
this.single_set_selected_text(item.text);
}
if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
this.results_hide();
}
this.search_field.val("");
if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
this.form_field_jq.trigger("change", {
'selected': this.form_field.options[item.options_index].value
});
}
this.current_selectedIndex = this.form_field.selectedIndex;
return this.search_field_scale();
}
};
Chosen.prototype.single_set_selected_text = function(text) {
if (text == null) {
text = this.default_text;
}
if (text === this.default_text) {
this.selected_item.addClass("chosen-default");
} else {
this.single_deselect_control_build();
this.selected_item.removeClass("chosen-default");
}
return this.selected_item.find("span").text(text);
};
Chosen.prototype.result_deselect = function(pos) {
var result_data;
result_data = this.results_data[pos];
if (!this.form_field.options[result_data.options_index].disabled) {
result_data.selected = false;
this.form_field.options[result_data.options_index].selected = false;
this.selected_option_count = null;
this.result_clear_highlight();
if (this.results_showing) {
this.winnow_results();
}
this.form_field_jq.trigger("change", {
deselected: this.form_field.options[result_data.options_index].value
});
this.search_field_scale();
return true;
} else {
return false;
}
};
Chosen.prototype.single_deselect_control_build = function() {
if (!this.allow_single_deselect) {
return;
}
if (!this.selected_item.find("abbr").length) {
this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
}
return this.selected_item.addClass("chosen-single-with-deselect");
};
Chosen.prototype.get_search_text = function() {
if (this.search_field.val() === this.default_text) {
return "";
} else {
return $('<div/>').text($.trim(this.search_field.val())).html();
}
};
Chosen.prototype.winnow_results_set_highlight = function() {
var do_high, selected_results;
selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
if (do_high != null) {
return this.result_do_highlight(do_high);
}
};
Chosen.prototype.no_results = function(terms) {
var no_results_html;
no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
no_results_html.find("span").first().html(terms);
this.search_results.append(no_results_html);
return this.form_field_jq.trigger("chosen:no_results", {
chosen: this
});
};
Chosen.prototype.no_results_clear = function() {
return this.search_results.find(".no-results").remove();
};
Chosen.prototype.keydown_arrow = function() {
var next_sib;
if (this.results_showing && this.result_highlight) {
next_sib = this.result_highlight.nextAll("li.active-result").first();
if (next_sib) {
return this.result_do_highlight(next_sib);
}
} else {
return this.results_show();
}
};
Chosen.prototype.keyup_arrow = function() {
var prev_sibs;
if (!this.results_showing && !this.is_multiple) {
return this.results_show();
} else if (this.result_highlight) {
prev_sibs = this.result_highlight.prevAll("li.active-result");
if (prev_sibs.length) {
return this.result_do_highlight(prev_sibs.first());
} else {
if (this.choices_count() > 0) {
this.results_hide();
}
return this.result_clear_highlight();
}
}
};
Chosen.prototype.keydown_backstroke = function() {
var next_available_destroy;
if (this.pending_backstroke) {
this.choice_destroy(this.pending_backstroke.find("a").first());
return this.clear_backstroke();
} else {
next_available_destroy = this.search_container.siblings("li.search-choice").last();
if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
this.pending_backstroke = next_available_destroy;
if (this.single_backstroke_delete) {
return this.keydown_backstroke();
} else {
return this.pending_backstroke.addClass("search-choice-focus");
}
}
}
};
Chosen.prototype.clear_backstroke = function() {
if (this.pending_backstroke) {
this.pending_backstroke.removeClass("search-choice-focus");
}
return this.pending_backstroke = null;
};
Chosen.prototype.keydown_checker = function(evt) {
var stroke, _ref1;
stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;
this.search_field_scale();
if (stroke !== 8 && this.pending_backstroke) {
this.clear_backstroke();
}
switch (stroke) {
case 8:
this.backstroke_length = this.search_field.val().length;
break;
case 9:
if (this.results_showing && !this.is_multiple) {
this.result_select(evt);
}
this.mouse_on_container = false;
break;
case 13:
evt.preventDefault();
break;
case 38:
evt.preventDefault();
this.keyup_arrow();
break;
case 40:
evt.preventDefault();
this.keydown_arrow();
break;
}
};
Chosen.prototype.search_field_scale = function() {
var div, f_width, h, style, style_block, styles, w, _i, _len;
if (this.is_multiple) {
h = 0;
w = 0;
style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
for (_i = 0, _len = styles.length; _i < _len; _i++) {
style = styles[_i];
style_block += style + ":" + this.search_field.css(style) + ";";
}
div = $('<div />', {
'style': style_block
});
div.text(this.search_field.val());
$('body').append(div);
w = div.width() + 25;
div.remove();
f_width = this.container.outerWidth();
if (w > f_width - 10) {
w = f_width - 10;
}
return this.search_field.css({
'width': w + 'px'
});
}
};
return Chosen;
})(AbstractChosen);
}).call(this);
This source diff could not be displayed because it is too large. You can view the blob instead.
/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){return n.apply(b,v.call(arguments,0).concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice;this.listeners=this.listeners||{},a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),this.$results.append(d)},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")});var f=e.filter("[aria-selected=true]");f.length>0?f.first().trigger("mouseenter"):e.first().trigger("mouseenter")})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";{a(h)}this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b){var c=this,d=b.id+"-results";this.$results.attr("id",d),b.on("results:all",function(a){c.clear(),c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("results:append",function(a){c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("query",function(a){c.showLoading(a)}),b.on("select",function(){b.isOpen()&&c.setClasses()}),b.on("unselect",function(){b.isOpen()&&c.setClasses()}),b.on("open",function(){c.$results.attr("aria-expanded","true"),c.$results.attr("aria-hidden","false"),c.setClasses(),c.ensureHighlightVisible()}),b.on("close",function(){c.$results.attr("aria-expanded","false"),c.$results.attr("aria-hidden","true"),c.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=c.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=c.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?c.trigger("close"):c.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a);if(0!==d){var e=d-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top,h=f.offset().top,i=c.$results.scrollTop()+(h-g);0===e?c.$results.scrollTop(0):0>h-g&&c.$results.scrollTop(i)}}),b.on("results:next",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a),e=d+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top+c.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=c.$results.scrollTop()+h-g;0===e?c.$results.scrollTop(0):h>g&&c.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){c.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=c.$results.scrollTop(),d=c.$results.get(0).scrollHeight-c.$results.scrollTop()+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&d<=c.$results.height();e?(c.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(c.$results.scrollTop(c.$results.get(0).scrollHeight-c.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var d=a(this),e=d.data("data");return"true"===d.attr("aria-selected")?void(c.options.get("multiple")?c.trigger("unselect",{originalEvent:b,data:e}):c.trigger("close")):void c.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(){var b=a(this).data("data");c.getHighlightedResults().removeClass("select2-results__option--highlighted"),c.trigger("results:focus",{data:b,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a){var b=this,d=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){b.trigger("focus",a)}),this.$selection.on("blur",function(a){b.trigger("blur",a)}),this.$selection.on("keydown",function(a){b.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){b.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){b.update(a.data)}),a.on("open",function(){b.$selection.attr("aria-expanded","true"),b.$selection.attr("aria-owns",d),b._attachCloseHandler(a)}),a.on("close",function(){b.$selection.attr("aria-expanded","false"),b.$selection.removeAttr("aria-activedescendant"),b.$selection.removeAttr("aria-owns"),b.$selection.focus(),b._detachCloseHandler(a)}),a.on("enable",function(){b.$selection.attr("tabindex",b._tabindex)}),a.on("disable",function(){b.$selection.attr("tabindex","-1")})},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},d.prototype.bind=function(a){var b=this;d.__super__.bind.apply(this,arguments);var c=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",c),this.$selection.attr("aria-labelledby",c),this.$selection.on("mousedown",function(a){1===a.which&&b.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(){}),this.$selection.on("blur",function(){}),a.on("selection:update",function(a){b.update(a.data)})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){return a("<span></span>")},d.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.display(b),d=this.$selection.find(".select2-selection__rendered");d.empty().append(c),d.prop("title",b.title||b.text)},d}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(){var b=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){b.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(c){var d=a(this),e=d.parent(),f=e.data("data");b.trigger("unselect",{originalEvent:c,data:f})})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.display(e),g=this.selectionContainer();g.append(f),g.prop("title",e.title||e.text),g.data("data",e),b.push(g)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(){function a(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},a.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},a}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle")}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus()}),b.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.focus()}),b.on("enable",function(){e.$search.prop("disabled",!1)}),b.on("disable",function(){e.$search.prop("disabled",!0)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e.trigger("blur",a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}}),this.$selection.on("input",".select2-search--inline",function(){e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input",".select2-search--inline",function(a){e.handleSearch(a)})},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.trigger("open"),this.$search.val(b.text+" ")},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"":"A","":"A","À":"A","Á":"A","Â":"A","":"A","":"A","":"A","":"A","Ã":"A","Ā":"A","Ă":"A","":"A","":"A","":"A","":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","":"A","":"A","":"A","":"A","Ą":"A","Ⱥ":"A","":"A","":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","":"AO","":"AU","":"AV","":"AV","":"AY","":"B","":"B","":"B","":"B","":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","":"C","":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","":"C","Ƈ":"C","Ȼ":"C","":"C","":"D","":"D","":"D","Ď":"D","":"D","":"D","":"D","":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","":"E","":"E","È":"E","É":"E","Ê":"E","":"E","":"E","":"E","":"E","":"E","Ē":"E","":"E","":"E","Ĕ":"E","Ė":"E","Ë":"E","":"E","Ě":"E","Ȅ":"E","Ȇ":"E","":"E","":"E","Ȩ":"E","":"E","Ę":"E","":"E","":"E","Ɛ":"E","Ǝ":"E","":"F","":"F","":"F","Ƒ":"F","":"F","":"G","":"G","Ǵ":"G","Ĝ":"G","":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","":"G","":"G","":"G","":"H","":"H","Ĥ":"H","":"H","":"H","Ȟ":"H","":"H","":"H","":"H","Ħ":"H","":"H","":"H","":"H","":"I","":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","":"I","":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","":"I","Į":"I","":"I","Ɨ":"I","":"J","":"J","Ĵ":"J","Ɉ":"J","":"K","":"K","":"K","Ǩ":"K","":"K","Ķ":"K","":"K","Ƙ":"K","":"K","":"K","":"K","":"K","":"K","":"L","":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","":"L","":"L","Ļ":"L","":"L","":"L","Ł":"L","Ƚ":"L","":"L","":"L","":"L","":"L","":"L","LJ":"LJ","Lj":"Lj","":"M","":"M","":"M","":"M","":"M","":"M","Ɯ":"M","":"N","":"N","Ǹ":"N","Ń":"N","Ñ":"N","":"N","Ň":"N","":"N","Ņ":"N","":"N","":"N","Ƞ":"N","Ɲ":"N","":"N","":"N","NJ":"NJ","Nj":"Nj","":"O","":"O","Ò":"O","Ó":"O","Ô":"O","":"O","":"O","":"O","":"O","Õ":"O","":"O","Ȭ":"O","":"O","Ō":"O","":"O","":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","":"O","":"O","":"O","":"O","":"O","":"O","":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","":"O","":"O","Ƣ":"OI","":"OO","Ȣ":"OU","":"P","":"P","":"P","":"P","Ƥ":"P","":"P","":"P","":"P","":"P","":"Q","":"Q","":"Q","":"Q","Ɋ":"Q","":"R","":"R","Ŕ":"R","":"R","Ř":"R","Ȑ":"R","Ȓ":"R","":"R","":"R","Ŗ":"R","":"R","Ɍ":"R","":"R","":"R","":"R","":"R","":"S","":"S","":"S","Ś":"S","":"S","Ŝ":"S","":"S","Š":"S","":"S","":"S","":"S","Ș":"S","Ş":"S","":"S","":"S","":"S","":"T","":"T","":"T","Ť":"T","":"T","Ț":"T","Ţ":"T","":"T","":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","":"T","":"TZ","":"U","":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","":"U","Ū":"U","":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","":"U","":"U","":"U","":"U","":"U","":"U","":"U","Ų":"U","":"U","":"U","Ʉ":"U","":"V","":"V","":"V","":"V","Ʋ":"V","":"V","Ʌ":"V","":"VY","":"W","":"W","":"W","":"W","Ŵ":"W","":"W","":"W","":"W","":"W","":"X","":"X","":"X","":"X","":"Y","":"Y","":"Y","Ý":"Y","Ŷ":"Y","":"Y","Ȳ":"Y","":"Y","Ÿ":"Y","":"Y","":"Y","Ƴ":"Y","Ɏ":"Y","":"Y","":"Z","":"Z","Ź":"Z","":"Z","Ż":"Z","Ž":"Z","":"Z","":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","":"Z","":"Z","":"a","":"a","":"a","à":"a","á":"a","â":"a","":"a","":"a","":"a","":"a","ã":"a","ā":"a","ă":"a","":"a","":"a","":"a","":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","":"a","":"a","":"a","":"a","ą":"a","":"a","ɐ":"a","":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","":"ao","":"au","":"av","":"av","":"ay","":"b","":"b","":"b","":"b","":"b","ƀ":"b","ƃ":"b","ɓ":"b","":"c","":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","":"c","ƈ":"c","ȼ":"c","":"c","":"c","":"d","":"d","":"d","ď":"d","":"d","":"d","":"d","":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","":"d","dz":"dz","dž":"dz","":"e","":"e","è":"e","é":"e","ê":"e","":"e","ế":"e","":"e","":"e","":"e","ē":"e","":"e","":"e","ĕ":"e","ė":"e","ë":"e","":"e","ě":"e","ȅ":"e","ȇ":"e","":"e","":"e","ȩ":"e","":"e","ę":"e","":"e","":"e","ɇ":"e","ɛ":"e","ǝ":"e","":"f","":"f","":"f","ƒ":"f","":"f","":"g","":"g","ǵ":"g","ĝ":"g","":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","":"g","":"g","":"g","":"h","":"h","ĥ":"h","":"h","":"h","ȟ":"h","":"h","":"h","":"h","":"h","ħ":"h","":"h","":"h","ɥ":"h","ƕ":"hv","":"i","":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","":"i","":"i","ǐ":"i","ȉ":"i","ȋ":"i","":"i","į":"i","":"i","ɨ":"i","ı":"i","":"j","":"j","ĵ":"j","ǰ":"j","ɉ":"j","":"k","":"k","":"k","ǩ":"k","":"k","ķ":"k","":"k","ƙ":"k","":"k","":"k","":"k","":"k","":"k","":"l","":"l","ŀ":"l","ĺ":"l","ľ":"l","":"l","":"l","ļ":"l","":"l","":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","":"l","":"l","":"l","":"l","lj":"lj","":"m","":"m","ḿ":"m","":"m","":"m","ɱ":"m","ɯ":"m","":"n","":"n","ǹ":"n","ń":"n","ñ":"n","":"n","ň":"n","":"n","ņ":"n","":"n","":"n","ƞ":"n","ɲ":"n","ʼn":"n","":"n","":"n","nj":"nj","":"o","":"o","ò":"o","ó":"o","ô":"o","":"o","":"o","":"o","":"o","õ":"o","":"o","ȭ":"o","":"o","ō":"o","":"o","":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","":"o","":"o","":"o","":"o","":"o","":"o","":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","":"o","":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","":"oo","":"p","":"p","":"p","":"p","ƥ":"p","":"p","":"p","":"p","":"p","":"q","":"q","ɋ":"q","":"q","":"q","":"r","":"r","ŕ":"r","":"r","ř":"r","ȑ":"r","ȓ":"r","":"r","":"r","ŗ":"r","":"r","ɍ":"r","ɽ":"r","":"r","":"r","":"r","":"s","":"s","ß":"s","ś":"s","":"s","ŝ":"s","":"s","š":"s","":"s","":"s","":"s","ș":"s","ş":"s","ȿ":"s","":"s","":"s","":"s","":"t","":"t","":"t","":"t","ť":"t","":"t","ț":"t","ţ":"t","":"t","":"t","ŧ":"t","ƭ":"t","ʈ":"t","":"t","":"t","":"tz","":"u","":"u","ù":"u","ú":"u","û":"u","ũ":"u","":"u","ū":"u","":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","":"u","":"u","":"u","":"u","":"u","":"u","":"u","ų":"u","":"u","":"u","ʉ":"u","":"v","":"v","":"v","ṿ":"v","ʋ":"v","":"v","ʌ":"v","":"vy","":"w","":"w","":"w","":"w","ŵ":"w","":"w","":"w","":"w","":"w","":"w","":"x","":"x","":"x","":"x","":"y","":"y","":"y","ý":"y","ŷ":"y","":"y","ȳ":"y","":"y","ÿ":"y","":"y","":"y","":"y","ƴ":"y","ɏ":"y","ỿ":"y","":"z","":"z","ź":"z","":"z","ż":"z","ž":"z","":"z","":"z","ƶ":"z","ȥ":"z","ɀ":"z","":"z","":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a){var b=this;this.container=a,a.on("select",function(a){b.select(a.data)}),a.on("unselect",function(a){b.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};
if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=(c.extend(!0,{},l,j),this.option(l));k.replaceWith(m)}else{var n=this.option(j);if(j.children){var o=this.convertToOptions(j.children);b.appendMany(n,o)}h.push(n)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(b,c){this.ajaxOptions=this._applyDefaults(c.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),a.__super__.constructor.call(this,b,c)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return{q:a.term}},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url(a)),"function"==typeof f.data&&(f.data=f.data(a)),this.ajaxOptions.delay&&""!==a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");if(void 0!==f&&(this.createTag=f),b.call(this,c,d),a.isArray(e))for(var g=0;g<e.length;g++){var h=e[g],i=this._normalizeItem(h),j=this.option(i);this.$element.append(j)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(){var b=(this._lastTag,this.$element.find("option[data-select2-tag]"));b.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(a,b,c){function d(a){e.select(a)}var e=this;b.term=b.term||"";var f=this.tokenizer(b,this.options,d);f.term!==b.term&&(this.$search.length&&(this.$search.val(f.term),this.$search.focus()),b.term=f.term),a.call(this,b,c)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);e(m),g=g.substr(h+1)||"",h=0}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.position=function(){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a){function b(){}return b.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},b.prototype.handleSearch=function(){if(!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},b.prototype.showSearch=function(){return!0},b}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="option load-more" role="treeitem"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(a,b,c){this.$dropdownParent=c.get("dropdownParent")||document.body,a.call(this,b,c)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c){var d=this,e="scroll.select2."+c.id,f="resize.select2."+c.id,g="orientationchange.select2."+c.id,h=this.$container.parents().filter(b.hasScroll);h.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),h.on(e,function(){var b=a(this).data("select2-scroll-position");a(this).scrollTop(b.y)}),a(window).on(e+" "+f+" "+g,function(){d._positionDropdown(),d._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c){var d="scroll.select2."+c.id,e="resize.select2."+c.id,f="orientationchange.select2."+c.id,g=this.$container.parents().filter(b.hasScroll);g.off(d),a(window).off(d+" "+e+" "+f)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=(this.$container.position(),this.$container.offset());f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom};c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){this.$dropdownContainer.width();var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(){d._handleSelectOnClose()})},a.prototype._handleSelectOnClose=function(){var a=this.getHighlightedResults();a.length<1||this.trigger("select",{data:a.data("data")})},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close")},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend({},this.defaults,l),null==l.dataAdapter){if(l.dataAdapter=null!=l.ajax?o:null!=l.data?n:m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.selectionAdapter=l.multiple?e:d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(this.options.dir=a.prop("dir")?a.prop("dir"):a.closest("[dir]").prop("dir")?a.closest("[dir]").prop("dir"):"ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this._sync=c.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._sync);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener("DOMAttrModified",b._sync,!1)},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("focus",function(){a.$container.addClass("select2-container--focus")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open"),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ENTER?(a.trigger("results:select"),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle"),b.preventDefault()):c===d.UP?(a.trigger("results:previous"),b.preventDefault()):c===d.DOWN?(a.trigger("results:next"),b.preventDefault()):(c===d.ESC||c===d.TAB)&&(a.close(),b.preventDefault()):(c===d.ENTER||c===d.SPACE||(c===d.DOWN||c===d.UP)&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable")):this.trigger("enable")},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||(this.trigger("query",{}),this.trigger("open"))},e.prototype.close=function(){this.isOpen()&&this.trigger("close")},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener("DOMAttrModified",this._sync,!1),this._sync=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(f=d(this),null!=f&&g.push(f))})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),a.call(this,b,c)}return b.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},b.prototype.select=function(b,c){if(this.options.get("multiple")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger("change")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger("change")},b.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e];
b.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger("change")})},b.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},b.prototype.addOptions=function(b,c){var d=a.map(c,function(b){return a.data(b[0],"data")});this._currentData.push.apply(this._currentData,d)},b}),b.define("select2/compat/matcher",["jquery"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||""===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f],h=b(c.term,g.text,g);h||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define("select2/compat/query",[],function(){function a(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c;var d=this.options.get("query");d.call(null,b)},a}),b.define("select2/dropdown/attachContainer",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){var d=c.find(".dropdown-wrapper");d.append(b),b.addClass("select2-dropdown--below"),c.addClass("select2-container--below")},a}),b.define("select2/dropdown/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$dropdown.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("select2/selection/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$selection.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("jquery.select2",["jquery","require","./select2/core","./select2/defaults"],function(a,b,c,d){if(b("jquery.mousewheel"),null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){{var d=a.extend({},b,!0);new c(a(this),d)}}),this;if("string"==typeof b){var d=this.data("select2");null==d&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2.");var f=Array.prototype.slice.call(arguments,1),g=d[b](f);return a.inArray(b,e)>-1?this:g}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),function(c){"function"==typeof b.define&&b.define.amd?b.define("jquery.mousewheel",["jquery"],c):"object"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
\ No newline at end of file
{% load static %}
<!-- Mainly scripts -->
<script src="{% static "js/plugins/metisMenu/jquery.metisMenu.js" %}"></script>
{#<script src="{% static "js/plugins/slimscroll/jquery.slimscroll.min.js" %}"></script>#}
{#<script src="{% static "js/bootstrap-dialog.js" %}"></script>#}
{#<script src="{% static "js/mindmup-editabletable.js" %}"></script>#}
{#<script src="{% static "js/plugins/fullcalendar/moment.min.js" %}"></script>#}
{#<script src="{% static "js/plugins/fullcalendar/fullcalendar.min.js" %}"></script>#}
<!-- Custom and plugin javascript -->
<script src="{% static "js/inspinia.js" %}"></script>
{#<script src="{% static "js/plugins/pace/pace.min.js" %}"></script>#}
<script src="{% static "js/jumpserver.js" %}"></script>
<!-- Peity -->
{#<script src="{% static "js/plugins/peity/jquery.peity.min.js" %}"></script>#}
{#<script src="{% static "js/demo/peity-demo.js" %}"></script>#}
<script src="{% static "js/base.js" %}"></script>
<!-- pop windows layer-->
{#<script src="{% static "js/layer/layer.js" %}"></script>#}
<!-- highcharts -->
{#<script src="{% static "js/highcharts/highcharts.js" %}"></script>#}
{#<script src="{% static "js/dropzone/dropzone.js" %}"></script>#}
<!-- active menu -->
<script>
var url_array = document.location.pathname.split("/");
......@@ -35,4 +17,37 @@
$("#"+s1).addClass('active');
$('#'+s1+' .'+s2).addClass('active');
}
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
var sessionid = getCookie('sessionid');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
{# xhr.setRequestHeader("sessionid", sessionid);#}
}
}
});
</script>
\ No newline at end of file
......@@ -3,21 +3,13 @@
<!-- css file -->
<link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet">
<link href="{% static "css/font-awesome.css" %}" rel="stylesheet">
{#<link href="{% static "css/plugins/iCheck/custom.css" %}" rel="stylesheet">#}
{#<link href="{% static "css/animate.css" %}" rel="stylesheet">#}
<link href="{% static "css/style.css" %}" rel="stylesheet">
{#<link href="{% static "css/colorbox.css" %}" rel="stylesheet">#}
<link href="{% static "css/vaildator/jquery.validator.css" %}" rel="stylesheet">
{#<link href="{% static "css/magnific/magnific-popup.css" %}" rel="stylesheet">#}
{#<link href="{% static "css/plugins/fullcalendar/fullcalendar.css" %}" rel="stylesheet">#}
{#<link href="{% static "css/dropzone/basic.css" %}" rel="stylesheet">#}
<link href="{% static "css/plugins/vaildator/jquery.validator.css" %}" rel="stylesheet">
<!-- scripts -->
<script src="{% static "js/jquery-2.1.1.js" %}"></script>
<script src="{% static "js/bootstrap.min.js" %}"></script>
<script src="{% static "js/base.js" %}"></script>
<!-- validator js -->
{#<script src="{% static "js/validator/jquery.validator.js" %}"></script>#}
{#<script src="{% static "js/validator/zh_CN.js" %}"></script>#}
{#<script src="{% static "js/datapicker/bootstrap-datepicker.js" %}"></script>#}
<div class="row border-bottom">
<nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
<nav class="navbar navbar-static-top white-bg" role="navigation" style="margin-bottom: 0">
<div class="navbar-header">
<a class="navbar-minimalize minimalize-styl-2 btn btn-primary " href="#"><i class="fa fa-bars"></i> </a>
<form role="search" class="navbar-form-custom" method="get" action="">
......@@ -18,7 +18,7 @@
</a>
</li>
<li>
<a href="">
<a href="{% url 'users:logout' %}">
<i class="fa fa-sign-out"></i> Log out
</a>
</li>
......@@ -28,19 +28,19 @@
<div class="row wrapper border-bottom white-bg page-heading">
<div class="col-sm-10">
<h2>{{ title }}</h2>
<h2></h2>
<ol class="breadcrumb">
<li>
<a href="">仪表盘</a>
</li>
<li>
{% if path1 %}
<a>{{ path1 }}</a>
{% if app %}
<a>{{ app }}</a>
{% endif %}
</li>
{% if path2 %}
{% if action %}
<li class="active">
<strong>{{ path2 }}</strong>
<strong>{{ action }}</strong>
</li>
{% endif %}
</ol>
......
......@@ -2,7 +2,11 @@
<div class="sidebar-collapse">
<ul class="nav" id="side-menu">
{% include '_user_profile.html' %}
{% include '_nav.html' %}
{% if request.user.is_superuser %}
{% include '_nav.html' %}
{% else %}
{% include '_nav_user.html' %}
{% endif %}
</ul>
</div>
</nav>
{% extends 'base.html' %}
{% load common_tags %}
{% block content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5> {{ action }} </h5>
<div class="ibox-tools">
<a class="collapise-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<div class="">
{# left button add #}
{% block content_left_head %} {% endblock %}
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" name="keyword" placeholder="Search" value="{{ keyword }}">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
搜索
</button>
</div>
</div>
</form>
</div>
<table class="table table-striped table-bordered table-hover " id="editable" >
<thead>
<tr>
{% block table_head %} {% endblock %}
</tr>
</thead>
<tbody>
{% block table_body %} {% endblock %}
</tbody>
</table>
<div class="row">
<div class="col-sm-4">
{# Update batch #}
{% block content_bottom_left %} {% endblock %}
</div>
{% include '_pagination.html' %}
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}" style="margin: 20px auto 0px">
{{ message|safe }}
</div>
{% endfor %}
{% endif %}
<li id="">
<li id="index">
<a href="">
<i class="fa fa-dashboard"></i> <span class="nav-label">仪表盘</span><span class="label label-info pull-right"></span>
</a>
</li>
<li id="">
<li id="users">
<a href="#">
<i class="fa fa-group"></i> <span class="nav-label">用户管理</span><span class="fa arrow"></span>
</a>
<ul class="nav nav-second-level">
<li class="group"><a href="#">用户列表</a></li>
<li class="user"><a href="#">用户组列表</a></li>
<ul class="nav nav-second-level active">
<li class="users"><a href="{% url 'users:user-list' %}">用户列表</a></li>
<li class="usergroups"><a href="{% url 'users:usergroup-list' %}">用户组列表</a></li>
</ul>
</li>
<li id="">
......
<li id="index">
<a href="">
<i class="fa fa-dashboard"></i> <span class="nav-label">仪表盘</span><span class="label label-info pull-right"></span>
</a>
</li>
<li id="">
<a href="">
<i class="fa fa-files-o"></i><span class="nav-label">我的资产</span><span class="label label-info pull-right"></span>
</a>
</li>
<li id="">
<a href="#">
<i class="fa fa-download"></i> <span class="nav-label">上传下载</span><span class="fa arrow"></span>
</a>
<ul class="nav nav-second-level">
<li class="upload"><a href="">文件上传</a></li>
<li class="download"><a href="">文件下载</a></li>
</ul>
</li>
<li id="">
<a href="">
<i class="fa fa-gears"></i> <span class="nav-label">用户信息</span><span class="label label-info pull-right"></span>
</a>
</li>
<li class="special_link">
<a href="http://www.jumpserver.org" target="_blank"><i class="fa fa-database"></i>
<span class="nav-label">访问官网</span>
</a>
</li>
\ No newline at end of file
{% if is_paginated %}
<div class="row">
<div class="col-sm-6">
<div class="dataTables_info" id="editable_info" role="status" aria-live="polite">
Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ paginator.count }} entries
</div>
</div>
<div class="col-sm-6">
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
<ul class="pagination" style="margin-top: 0; float: right">
{% if page_obj.has_previous %}
<li class="paginate_button previous" aria-controls="editable" tabindex="0"
id="editable_previous">
<a class="page" href="?page={{ page_obj.previous_page_number }}">Previous</a>
</li>
{% endif %}
<li class="paginate_button active" aria-controls="editable" tabindex="0">
<a class="page" href="?page={{ page_obj.number }}" title="第{{ page_obj.number }}页">{{ page_obj.number }}</a>
</li>
{% if page_obj.has_next %}
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
<a class="page" href="?page={{ page_obj.next_page_number }}">Next</a>
</li>
{% endif %}
</ul>
</div>
</div>
</div>
{% endif %}
{% load common_tags %}
{% if is_paginated %}
<div class="col-sm-4">
<div class="dataTables_info text-center" id="editable_info" role="status" aria-live="polite">
{{ page_obj.start_index }} - {{ page_obj.end_index }} of {{ paginator.count }}
</div>
</div>
<div class="col-sm-4">
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
<ul class="pagination" style="margin-top: 0; float: right">
{% if page_obj.has_previous %}
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="previous">
<a data-page="next" href="?page={{ page_obj.previous_page_number}}"></a>
</li>
{% endif %}
{% for page in paginator.num_pages|pagination_range:page_obj.number %}
{% if page == page_obj.number %}
<li class="paginate_button active" aria-controls="editable" tabindex="0">
{% else %}
<li class="paginate_button" aria-controls="editable" tabindex="0">
{% endif %}
<a class="page" href="?page={{ page }}" title="第{{ page }}页">{{ page }}</a>
</li>
{% endfor %}
{% if page_obj.has_next %}
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="next">
<a data-page="next" href="?page={{ page_obj.next_page_number }}"></a>
</li>
{% endif %}
</ul>
</div>
</div>
{% endif %}
<script>
function sleep(n) { //n表示的毫秒数
var start = new Date().getTime();
......
......@@ -7,10 +7,10 @@
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
<span class="clear">
<span class="block m-t-xs">
<strong class="font-bold"> Admin <span style="color: #8095a8"></span></strong>
<strong class="font-bold"> {{ request.user.name }}<span style="color: #8095a8"></span></strong>
</span>
<span class="text-muted text-xs block">
{{ role | default:'普通用户' }}<b class="caret"></b>
{{ request.user.get_role_display | default:'普通用户' }}<b class="caret"></b>
</span>
</span>
</a>
......
......@@ -11,6 +11,8 @@
<link rel="shortcut icon" href={% static "img/facio.ico" %} type="image/x-icon">
{% include '_head_css_js.html' %}
{% block custom_head_css_js %} {% endblock %}
<link href="{% static "css/jumpserver.css" %}" rel="stylesheet">
<script src="{% static "js/jumpserver.js" %}"></script>
</head>
<body>
......@@ -18,6 +20,7 @@
{% include '_left_side_bar.html' %}
<div id="page-wrapper" class="gray-bg">
{% include '_header_bar.html' %}
{% include '_message.html' %}
{% block content %}{% endblock %}
{% include '_footer.html' %}
</div>
......@@ -25,5 +28,5 @@
</body>
{% include '_foot_js.html' %}
{% block custom_footer_js %} {% endblock %}
{% block custom_foot_js %} {% endblock %}
</html>
\ No newline at end of file
# ~*~ coding: utf-8 ~*~
#
#
import logging
from rest_framework import generics, mixins, status, permissions
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import UserSerializer, UserGroupSerializer, UserActiveSerializer
from .models import User, UserGroup
logger = logging.getLogger('jumpserver.users.api')
class UserListAddApi(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetailDeleteUpdateApi(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
def delete(self, request, *args, **kwargs):
print(self.request.data)
return super(UserDetailDeleteUpdateApi, self).delete(request, *args, **kwargs)
# def get(self, request, *args, **kwargs):
# print("hello world")
# print(request.user)
# return super(UserDetailDeleteUpdateApi, self).get(request, *args, **kwargs)
class UserActiveApi(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserActiveSerializer
# def put(self, request, *args, **kwargs):
# for k, v in request.META.items():
# logger.debug("%s --> %s" % (k, v))
# return super(UserActiveApi, self).put(request, *args, **kwargs)
class UserGroupListAddApi(generics.ListCreateAPIView):
queryset = UserGroup.objects.all()
serializer_class = UserGroupSerializer
class UserGroupDetailDeleteUpdateApi(generics.RetrieveUpdateDestroyAPIView):
queryset = UserGroup.objects.all()
serializer_class = UserGroupSerializer
......@@ -5,3 +5,4 @@ from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
# ~*~ coding: utf-8 ~*~
from django.forms import ModelForm
from django import forms
from .models import User, UserGroup
class UserForm(ModelForm):
# class UserLoginForm(ModelForm):
# class Meta:
# model = User
# fields = [
# "email", "password"
# ]
class UserLoginForm(forms.Form):
username = forms.CharField(label='用户名', max_length=100)
password = forms.CharField(label='密码', widget=forms.PasswordInput, max_length=100)
class UserAddForm(ModelForm):
class Meta:
model = User
fields = [
'username', 'name', 'email', 'groups', 'wechat',
'phone', 'enable_2FA', 'role', 'comment',
'phone', 'enable_otp', 'role', 'date_expired', 'comment',
]
help_texts = {
'username': '* required',
'email': '* required',
}
widgets = {
'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': '请选择用户组'}),
}
class UserUpdateForm(ModelForm):
class Meta:
model = User
fields = [
'name', 'email', 'groups', 'wechat',
'phone', 'enable_otp', 'role', 'date_expired', 'comment',
]
help_texts = {
'username': '* required',
'email': '* required',
'groups': '* required'
}
widgets = {
'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': '请选择用户组'}),
}
class UserGroupForm(ModelForm):
class Meta:
model = UserGroup
fields = [
'name', 'comment',
]
help_texts = {
'name': '* required'
}
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-13 16:36
from __future__ import unicode_literals
import django.contrib.auth.models
import django.contrib.auth.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
('auth', '0008_alter_user_username_max_length'),
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.ASCIIUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('avatar', models.ImageField(default='', upload_to=b'', verbose_name='\u5934\u50cf')),
('wechat', models.CharField(max_length=30, verbose_name='\u5fae\u4fe1')),
('phone', models.CharField(max_length=20, verbose_name='\u624b\u673a')),
('enable_2FA', models.BooleanField(default=False, verbose_name='\u542f\u7528\u4e8c\u6b21\u9a8c\u8bc1')),
('secret_key_2FA', models.CharField(max_length=16)),
('private_key', models.CharField(max_length=5000)),
('public_key', models.CharField(max_length=1000)),
('created_by', models.CharField(max_length=30)),
('date_expired', models.DateTimeField()),
],
options={
'db_table': 'user',
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
),
migrations.CreateModel(
name='Role',
fields=[
('group_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='auth.Group')),
('comment', models.CharField(blank=True, max_length=80)),
],
options={
'db_table': 'role',
},
bases=('auth.group',),
),
migrations.CreateModel(
name='UserGroup',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='\u8bf7\u8f93\u5165\u7ec4\u540d\u79f0', max_length=100, unique=True, verbose_name='\u7ec4\u540d\u79f0')),
('comment', models.TextField(blank=True, help_text='\u8bf7\u8f93\u5165\u7528\u6237\u7ec4\u63cf\u8ff0', verbose_name='\u63cf\u8ff0')),
('date_added', models.DateTimeField(auto_now_add=True)),
('created_by', models.CharField(max_length=100)),
],
options={
'db_table': 'usergroup',
},
),
migrations.AddField(
model_name='user',
name='groups',
field=models.ManyToManyField(to='users.UserGroup'),
),
migrations.AddField(
model_name='user',
name='role',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Role'),
),
migrations.AddField(
model_name='user',
name='user_permissions',
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-14 04:37
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='user',
name='comment',
field=models.CharField(blank=True, max_length=200, verbose_name='\u63cf\u8ff0'),
),
migrations.AlterField(
model_name='user',
name='date_expired',
field=models.DateTimeField(default=datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)),
),
migrations.AlterField(
model_name='user',
name='phone',
field=models.CharField(max_length=20, verbose_name='\u624b\u673a\u53f7'),
),
migrations.AlterField(
model_name='user',
name='private_key',
field=models.CharField(max_length=5000, verbose_name='ssh\u79c1\u94a5'),
),
migrations.AlterField(
model_name='user',
name='public_key',
field=models.CharField(max_length=1000, verbose_name='\u516c\u94a5'),
),
migrations.AlterField(
model_name='user',
name='role',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Role', verbose_name='\u89d2\u8272'),
),
migrations.AlterField(
model_name='usergroup',
name='comment',
field=models.TextField(blank=True, verbose_name='\u63cf\u8ff0'),
),
migrations.AlterField(
model_name='usergroup',
name='name',
field=models.CharField(max_length=100, unique=True, verbose_name='\u7ec4\u540d\u79f0'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-14 09:58
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0002_auto_20160814_1237'),
]
operations = [
migrations.AddField(
model_name='user',
name='name',
field=models.CharField(default='guanghongwei', max_length=20),
preserve_default=False,
),
migrations.AlterField(
model_name='user',
name='avatar',
field=models.ImageField(blank=True, upload_to=b'', verbose_name='\u5934\u50cf'),
),
migrations.AlterField(
model_name='user',
name='created_by',
field=models.CharField(default='', max_length=30),
),
migrations.AlterField(
model_name='user',
name='phone',
field=models.CharField(blank=True, max_length=20, verbose_name='\u624b\u673a\u53f7'),
),
migrations.AlterField(
model_name='user',
name='private_key',
field=models.CharField(blank=True, max_length=5000, verbose_name='ssh\u79c1\u94a5'),
),
migrations.AlterField(
model_name='user',
name='public_key',
field=models.CharField(blank=True, max_length=1000, verbose_name='\u516c\u94a5'),
),
migrations.AlterField(
model_name='user',
name='secret_key_2FA',
field=models.CharField(blank=True, max_length=16),
),
migrations.AlterField(
model_name='user',
name='wechat',
field=models.CharField(blank=True, max_length=30, verbose_name='\u5fae\u4fe1'),
),
]
......@@ -4,37 +4,55 @@ from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.contrib.auth.hashers import make_password
from django.utils import timezone
from django.db import models
from django.contrib.auth.models import AbstractUser, Permission
from django.contrib.auth.models import Group as AbstractGroup
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db import IntegrityError
from rest_framework.authtoken.models import Token
from django.core import signing
class Role(AbstractGroup):
comment = models.CharField(max_length=80, blank=True)
# class Role(models.Model):
# name = models.CharField('name', max_length=80, unique=True)
# permissions = models.ManyToManyField(
# Permission,
# verbose_name='permissions',
# blank=True,
# )
# date_added = models.DateTimeField(auto_now_add=True)
# created_by = models.CharField(max_length=100)
# comment = models.CharField(max_length=80, blank=True)
#
# def __unicode__(self):
# return self.name
#
# def delete(self, using=None, keep_parents=False):
# if self.users.all().count() > 0:
# raise OperationalError('Role %s has some member, should not be delete.' % self.name)
# else:
# return super(Role, self).delete(using=using, keep_parents=keep_parents)
#
# class Meta:
# db_table = 'role'
#
# @classmethod
# def initial(cls):
# roles = {
# 'Administrator': {'permissions': Permission.objects.all(), 'comment': '管理员'},
# 'User': {'permissions': [], 'comment': '用户'},
# 'Auditor': {'permissions': Permission.objects.filter(content_type__app_label='audits'),
# 'comment': '审计员'},
# }
def __unicode__(self):
return self.name
class Meta:
db_table = 'role'
@classmethod
def init(cls):
roles = {
'Administrator': {'permissions': Permission.objects.all(), 'comment': '管理员'},
'User': {'permissions': [], 'comment': '用户'},
'Auditor': {'permissions': Permission.objects.filter(content_type__app_label='audits'),
'comment': '审计员'},
}
for role in cls.objects.all():
role.permissions.clear()
cls.objects.all().delete()
for role_name, props in roles.items():
role = cls.objects.create(name=role_name, comment=props.get('comment', ''))
role.permissions = props.get('permissions', [])
# for role_name, props in roles.items():
# if not cls.objects.filter(name=role_name):
# role = cls.objects.create(name=role_name, comment=props.get('comment', ''), created_by='System')
# if props.get('permissions'):
# role.permissions = props.get('permissions')
class UserGroup(models.Model):
......@@ -49,23 +67,210 @@ class UserGroup(models.Model):
class Meta:
db_table = 'usergroup'
@classmethod
def initial(cls):
group_or_create = cls.objects.get_or_create(name='Default', comment='Default user group for all user',
created_by='System')
return group_or_create[0]
@classmethod
def generate_fake(cls, count=100):
from random import seed, randint, choice
import forgery_py
from django.db import IntegrityError
seed()
for i in range(count):
group = cls(name=forgery_py.name.full_name(),
comment=forgery_py.lorem_ipsum.sentence(),
created_by=choice(User.objects.all()).username
)
try:
group.save()
except IntegrityError:
print('Error continue')
continue
def date_expired_default():
return timezone.now() + timezone.timedelta(days=365 * 70)
class User(AbstractUser):
ROLE_CHOICES = (
('Admin', '管理员'),
('User', '用户'),
)
username = models.CharField(max_length=20, unique=True, verbose_name='用户名')
name = models.CharField(max_length=20, verbose_name='姓名')
name = models.CharField(max_length=20, blank=True, verbose_name='姓名')
email = models.EmailField(max_length=30, unique=True, verbose_name='邮件')
groups = models.ManyToManyField(UserGroup, verbose_name='用户组')
avatar = models.ImageField(verbose_name='头像', blank=True)
groups = models.ManyToManyField(UserGroup, related_name='users', blank=True, verbose_name='用户组')
role = models.CharField(choices=ROLE_CHOICES, default='User', max_length=10, blank=True, verbose_name='角色')
avatar = models.ImageField(upload_to="avatar", verbose_name='头像')
wechat = models.CharField(max_length=30, blank=True, verbose_name='微信')
phone = models.CharField(max_length=20, blank=True, verbose_name='手机号')
enable_2FA = models.BooleanField(default=False, verbose_name='启用二次验证')
secret_key_2FA = models.CharField(max_length=16, blank=True)
role = models.ForeignKey(Role, on_delete=models.PROTECT, verbose_name='角色')
enable_otp = models.BooleanField(default=False, verbose_name='启用二次验证')
secret_key_otp = models.CharField(max_length=16, blank=True)
private_key = models.CharField(max_length=5000, blank=True, verbose_name='ssh私钥') # ssh key max length 4096 bit
public_key = models.CharField(max_length=1000, blank=True, verbose_name='公钥')
comment = models.CharField(max_length=200, blank=True, verbose_name='描述')
comment = models.TextField(max_length=200, blank=True, verbose_name='描述')
is_first_login = models.BooleanField(default=False)
date_expired = models.DateTimeField(default=date_expired_default, blank=True, null=True, verbose_name='有效期')
created_by = models.CharField(max_length=30, default='')
date_expired = models.DateTimeField(default=datetime.datetime.max)
@property
def password_raw(self):
raise AttributeError('Password raw is not readable attribute')
#: Use this attr to set user object password, example
#: user = User(username='example', password_raw='password', ...)
#: It's equal:
#: user = User(username='example', ...)
#: user.set_password('password')
@password_raw.setter
def password_raw(self, raw_password):
self.set_password(raw_password)
@property
def is_expired(self):
if self.date_expired > timezone.now():
return False
else:
return True
@property
def is_superuser(self):
if self.role == 'Admin':
return True
else:
return False
@is_superuser.setter
def is_superuser(self, value):
if value is True:
self.role = 'Admin'
else:
self.role = 'User'
@property
def is_staff(self):
if self.is_authenticated and self.is_active and not self.is_expired and self.is_superuser:
return True
else:
return False
@is_staff.setter
def is_staff(self, value):
pass
def save(self, *args, **kwargs):
# If user not set name, it's default equal username
if not self.name:
self.name = self.username
super(User, self).save(*args, **kwargs)
# Set user default group 'All'
# Todo: It's have bug
group = UserGroup.initial()
if group not in self.groups.all():
self.groups.add(group)
# super(User, self).save(*args, **kwargs)
@property
def private_token(self):
return self.get_private_token()
def get_private_token(self):
try:
token = Token.objects.get(user=self)
except Token.DoesNotExist:
token = Token.objects.create(user=self)
return token.key
def refresh_private_token(self):
Token.objects.filter(user=self).delete()
return Token.objects.create(user=self)
def generate_reset_token(self):
return signing.dumps({'reset': self.id, 'email': self.email})
@classmethod
def validate_reset_token(cls, token, max_age=3600):
try:
data = signing.loads(token, max_age=max_age)
user_id = data.get('reset', None)
user_email = data.get('email', '')
user = cls.objects.get(id=user_id, email=user_email)
except signing.BadSignature, cls.DoesNotExist:
user = None
return user
def reset_password(self, new_password):
self.set_password(new_password)
self.save()
class Meta:
db_table = 'user'
#: Use this method initial user
@classmethod
def initial(cls):
user = cls(username='admin',
email='admin@jumpserver.org',
name='Administrator',
password_raw='admin',
role='Admin',
comment='Administrator is the super user of system',
created_by='System')
user.save()
user.groups.add(UserGroup.initial())
@classmethod
def generate_fake(cls, count=100):
from random import seed, choice
import forgery_py
from django.db import IntegrityError
seed()
for i in range(count):
user = cls(username=forgery_py.internet.user_name(True),
email=forgery_py.internet.email_address(),
name=forgery_py.name.full_name(),
password=make_password(forgery_py.lorem_ipsum.word()),
role=choice(dict(User.ROLE_CHOICES).keys()),
wechat=forgery_py.internet.user_name(True),
comment=forgery_py.lorem_ipsum.sentence(),
created_by=choice(cls.objects.all()).username,
)
try:
user.save()
except IntegrityError:
print('Duplicate Error, continue ...')
continue
user.groups.add(choice(UserGroup.objects.all()))
user.save()
def init_all_models():
for model in (UserGroup, User):
if hasattr(model, 'initial'):
model.initial()
def generate_fake():
for model in (UserGroup, User):
if hasattr(model, 'generate_fake'):
model.generate_fake()
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
try:
Token.objects.create(user=instance)
except IntegrityError:
pass
# -*- coding: utf-8 -*-
#
from rest_framework import serializers
from .models import User, UserGroup
class UserSerializer(serializers.ModelSerializer):
groups = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='users:usergroup-detail-api')
class Meta:
model = User
exclude = [
'password', 'first_name', 'last_name', 'secret_key_otp',
'private_key', 'public_key', 'avatar',
]
class UserActiveSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['is_active']
class UserGroupSerializer(serializers.ModelSerializer):
users = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='users:user-detail-api')
class Meta:
model = UserGroup
fields = '__all__'
{% extends 'base.html' %}
{% load static %}
{% load bootstrap %}
{% block custom_head_css_js %}
<link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
<script src="{% static "js/plugins/select2/select2.full.min.js" %}"></script>
<link href="{% static "css/plugins/datepicker/datepicker3.css" %}" rel="stylesheet">
{% endblock %}
{% block content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>填写用户信息</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<form method="post" id="userForm" class="form-horizontal" action="" enctype="multipart/form-data">
{% csrf_token %}
<h3>账户</h3>
{% block username %} {% endblock %}
{{ form.email|bootstrap_horizontal }}
{{ form.name|bootstrap_horizontal }}
{{ form.groups|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
{% block password %} {% endblock %}
<div class="hr-line-dashed"></div>
<h3>角色安全</h3>
{{ form.role|bootstrap_horizontal }}
<div class="form-group {% if form.date_expired.errors %} has-error {% endif %}" id="date_5">
<label for="{{ form.date_expired.id_for_label }}" class="col-sm-2 control-label">{{ form.date_expired.label }}</label>
<div class="col-sm-9">
<div class="input-group date">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
<input id="{{ form.date_expired.id_for_label }}" name="{{ form.date_expired.html_name }}" type="text" class="form-control" value="{{ form.date_expired.value|date:'m/d/Y' }}">
</div>
<span class="help-block ">{{ form.date_expired.errors }}</span>
</div>
</div>
<div class="form-group">
<label for="{{ form.enable_otp.id_for_label }}" class="col-sm-2 control-label">二次验证</label>
<div class="col-sm-8">
{{ form.enable_otp }}
</div>
</div>
<div class="hr-line-dashed"></div>
<h3>信息</h3>
{{ form.phone|bootstrap_horizontal }}
{{ form.wechat|bootstrap_horizontal }}
{{ form.comment|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="reset">取消</button>
<button id="submit_button" class="btn btn-primary" type="submit">确认保存</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block custom_foot_js %}
<script src="{% static 'js/plugins/datapicker/bootstrap-datepicker.js' %}"></script>
<script>
$(document).ready(function () {
$('.select2').select2();
$('.input-group.date').datepicker({
todayBtn: "linked",
keyboardNavigation: false,
forceParse: false,
calendarWeeks: true,
autoclose: true
});
})
</script>
{% endblock %}
\ No newline at end of file
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>INSPINIA | Forgot password</title>
{% include '_head_css_js.html' %}
<link href="{% static "css/jumpserver.css" %}" rel="stylesheet">
<script src="{% static "js/jumpserver.js" %}"></script>
</head>
<body class="gray-bg">
<div class="passwordBox animated fadeInDown">
<div class="row">
<div class="col-md-12">
<div class="ibox-content">
<img src="{% static 'img/logo.png' %}" style="margin: auto" width="82" height="82">
<h2 class="font-bold" style="display: inline">忘记密码 ?</h2>
<h1></h1>
{% if errors %}
<p class="red-fonts">{{ errors }}</p>
{% endif %}
<p>
输入您的邮箱, 将会发一封重置短信邮件到您的邮箱中
</p>
<div class="row">
<div class="col-lg-12">
<form class="m-t" role="form" action="" method="post">
{% csrf_token %}
<div class="form-group">
<input type="email" name="email" class="form-control" placeholder="Email address" required="">
</div>
<button type="submit" class="btn btn-primary block full-width m-b">重置密码</button>
</form>
</div>
</div>
</div>
</div>
</div>
<hr/>
<div class="row">
<div class="col-md-6">
Copyright Jumpserver.org
</div>
<div class="col-md-6 text-right">
<small>© 2014-2016</small>
</div>
</div>
</div>
</body>
</html>
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> JumpServer </title>
<link rel="shortcut icon" href="{% static "img/facio.ico" %}" type="image/x-icon">
{% include '_head_css_js.html' %}
<link href="{% static "css/jumpserver.css" %}" rel="stylesheet">
<script src="{% static "js/jumpserver.js" %}"></script>
</head>
<body class="gray-bg">
<div class="loginColumns animated fadeInDown">
<div class="row">
<div class="col-md-6">
<h2 class="font-bold">欢迎使用Jumpserver开源跳板机</h2>
<p>
Jumpserver是一款使用Python, Django开发的开源跳板机系统, 助力互联网企业高效 用户、资产、权限、审计 管理
</p>
<p>
我们自五湖四海,我们对开源精神无比敬仰和崇拜,我们对完美、整洁、优雅 无止境的追求
</p>
<p>
专注自动化运维,努力打造 易用、稳定、安全、自动化 的跳板机, 这是我们的不懈的追求和动力
</p>
<p>
<small>永远年轻,永远热泪盈眶 stay foolish stay hungry</small>
</p>
</div>
<div class="col-md-6">
<div class="ibox-content">
<div><img src="{% static 'img/logo.png' %}" width="82" height="82"> <span class="font-bold text-center" style="font-size: 32px; font-family: inherit">登录</span></div>
<form class="m-t" role="form" method="post" action="{% url 'users:login' %}">
{% csrf_token %}
{% if form.errors %}
<p class="red-fonts">用户名/密码 不正确, 请重试</p>
{% endif %}
<div class="form-group">
<input type="text" class="form-control" name="username" placeholder="Username" required="">
</div>
<div class="form-group">
<input type="password" class="form-control" name="password" placeholder="Password" required="">
</div>
<button type="submit" class="btn btn-primary block full-width m-b">Login</button>
<a href="{% url 'users:forget-password' %}">
<small>Forgot password?</small>
</a>
<p class="text-muted text-center">
{# <small>Do not have an account?</small>#}
</p>
{# <a class="btn btn-sm btn-white btn-block" href="register.html">Create an account</a>#}
</form>
<p class="m-t">
{# <small>Inspinia we app framework base on Bootstrap 3 &copy; 2014</small>#}
</p>
</div>
</div>
</div>
<hr/>
<div class="row">
<div class="col-md-6">
Copyright Jumpserver.org
</div>
<div class="col-md-6 text-right">
<small>© 2014-2016</small>
</div>
</div>
</div>
</body>
</html>
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> JumpServer </title>
<link rel="shortcut icon" href="{% static "img/facio.ico" %}" type="image/x-icon">
{% include '_head_css_js.html' %}
<link href="{% static "css/jumpserver.css" %}" rel="stylesheet">
<script src="{% static "js/jumpserver.js" %}"></script>
</head>
<body class="gray-bg">
<div class="loginColumns animated fadeInDown">
<div class="row">
<div class="col-md-6">
<h2 class="font-bold">欢迎使用Jumpserver开源跳板机</h2>
<p>
Jumpserver是一款使用Python, Django开发的开源跳板机系统, 助力互联网企业高效 用户、资产、权限、审计 管理
</p>
<p>
我们自五湖四海,我们对开源精神无比敬仰和崇拜,我们对完美、整洁、优雅 无止境的追求
</p>
<p>
专注自动化运维,努力打造 易用、稳定、安全、自动化 的跳板机, 这是我们的不懈的追求和动力
</p>
<p>
<small>永远年轻,永远热泪盈眶 stay foolish stay hungry</small>
</p>
</div>
<div class="col-md-6">
<div class="ibox-content">
<div><img src="{% static 'img/logo.png' %}" width="82" height="82"> <span class="font-bold text-center" style="font-size: 32px; font-family: inherit">重设密码</span></div>
<form class="m-t" role="form" method="post" action="">
{% csrf_token %}
{% if errors %}
<p class="red-fonts">{{ errors }}</p>
{% endif %}
<div class="form-group">
<input type="password" class="form-control" name="password" placeholder="Password" required="">
</div>
<div class="form-group">
<input type="password" class="form-control" name="password-confirm" placeholder="Password again" required="">
</div>
<button type="submit" class="btn btn-primary block full-width m-b">Setting</button>
<a href="#">
<small>Forgot password?</small>
</a>
<p class="text-muted text-center">
{# <small>Do not have an account?</small>#}
</p>
{# <a class="btn btn-sm btn-white btn-block" href="register.html">Create an account</a>#}
</form>
<p class="m-t">
{# <small>Inspinia we app framework base on Bootstrap 3 &copy; 2014</small>#}
</p>
</div>
</div>
</div>
<hr/>
<div class="row">
<div class="col-md-6">
Copyright Jumpserver.org
</div>
<div class="col-md-6 text-right">
<small>© 2014-2016</small>
</div>
</div>
</div>
</body>
</html>
{% extends 'base.html' %}
{% extends 'users/_user.html' %}
{% load bootstrap %}
{% block content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>填写用户信息</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<form method="post" id="userForm" class="form-horizontal" action="">
{% csrf_token %}
<h2>账户</h2>
{{ form.username|bootstrap_horizontal }}
{{ form.name|bootstrap_horizontal }}
{{ form.email|bootstrap_horizontal }}
{{ form.groups|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
<h2>密码</h2>
<div class="form-group">
<label class="col-sm-2 control-label">密码</label>
<div class="col-sm-8 bottom-left" >
生成重置密码连接,通过邮件发送给用户
</div>
</div>
<div class="hr-line-dashed"></div>
<h2>角色安全</h2>
<div class="form-group">
<label for="email" class="col-sm-2 control-label">Email<span class="red-fonts">*</span></label>
<div class="col-sm-8">
<input id="email" name="email" type="email" placeholder="username@jumpserver.org" class="form-control" {% if error %}value="{{ email }}" {% endif %}>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label">其它</label>
<div class="col-sm-2">
<div class="checkbox i-checks">
<label><input type="checkbox" value="0" name="extra" >禁用 </label>
</div>
</div>
<div class="col-sm-2">
<div class="checkbox i-checks">
<label><input type="checkbox" value="1" name="extra" checked>发送邮件 </label>
</div>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="reset">取消</button>
<button id="submit_button" class="btn btn-primary" type="submit">确认保存</button>
</div>
</div>
</form>
</div>
</div>
</div>
{% block username %}
{{ form.username|bootstrap_horizontal }}
{% endblock %}
{% block password %}
<h3>密码</h3>
<div class="form-group">
<label class="col-sm-2 control-label">密码</label>
<div class="col-sm-8 controls" >
生成重置密码连接,通过邮件发送给用户
</div>
</div>
{% endblock %}
{% block self_footer_js %}
<script>
$('#userForm').validator({
timely: 2,
theme: "yellow_right_effect",
rules: {
check_username: [/^[\w.]{3,20}$/, '大小写字母数字和下划线小数点'],
type_m: function(element){
return $("#M").is(":checked");
}
},
fields: {
"username": {
rule: "required;check_username",
tip: "输入用户名",
ok: "",
msg: {required: "必须填写!"}
},
"password": {
rule: "required;length[6~50]",
tip: "输入密码",
ok: "",
msg: {required: "必须填写!"}
},
"name": {
rule: "required",
tip: "姓名",
ok: "",
msg: {required: "必须填写"}
},
"email": {
rule: "required",
tip: "Email",
ok: "",
msg: {required: "必须填写"}
}
},
valid: function(form) {
form.submit();
}
});
</script>
{% endblock %}
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>确认删除</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>Are you sure you want to delete "{{ object.name }}"?</p>
<input type="submit" value="Confirm" />
</form>
</body>
</html>
\ No newline at end of file
{% extends 'base.html' %}
{% load common_tags %}
{% load users_tags %}
{% load static %}
{% block custom_head_css_js %}
<link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
<script src="{% static "js/plugins/select2/select2.full.min.js" %}"></script>
{% endblock %}
{% block content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
{# <div class="ibox-content">#}
<div class="panel-options">
<ul class="nav nav-tabs">
<li class="active"><a href="" class="text-center"><i class="fa fa-laptop"></i> 用户信息 </a>
</li>
<li><a href="" class="text-center"><i class="fa fa-bar-chart-o"></i> 用户资产</a></li>
<li><a href="" class="text-center"><i class="fa fa-bar-chart-o"></i> 登录记录 </a></li>
<div class="" style="float: right">
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" id="keyword" name="keyword"
value="{{ keyword }}" placeholder="Search">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
搜索
</button>
</div>
</div>
</form>
</div>
</ul>
</div>
<div class="tab-content">
<div class="col-sm-7" style="padding-left: 0px;">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="label"><b>{{ user.name }}</b></span>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#"></a>
</li>
<li><a href="#"></a>
</li>
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<table class="table">
<tbody>
<tr class="no-borders-tr">
<td colspan="2">
<img src="{{ user | user_avatar_url }}" class="img-circle" width="64" height="64">
</td>
</tr>
<tr>
<td width="20%">姓名:</td>
<td><b>{{ user.name }}</b></td>
</tr>
<tr>
<td>用户名:</td>
<td><b>{{ user.username }}</b></td>
</tr>
<tr>
<td>邮件:</td>
<td><b>{{ user.email }}</b></td>
</tr>
{% if user.phone %}
<tr>
<td>手机:</td>
<td><b>{{ user.phone }}</b></td>
</tr>
{% endif %}
{% if user.wechat %}
<tr>
<td>微信:</td>
<td><b>{{ user.wechat }}</b></td>
</tr>
{% endif %}
<tr>
<td>角色:</td>
<td><b>{{ user.get_role_display }}</b></td>
</tr>
<tr>
<td>有效期:</td>
<td><b>{{ user.date_expired|date:"Y-m-j H:i:s" }}</b></td>
</tr>
<tr>
<td>创建者:</td>
<td><b>{{ user.created_by }}</b></td>
</tr>
<tr>
<td>创建日期:</td>
<td><b>{{ user.date_joined|date:"Y-m-j H:i:s" }}</b></td>
</tr>
<tr>
<td>最后登录:</td>
<td><b>{{ user.last_login|date:"Y-m-j H:i:s" }}</b></td>
</tr>
<tr>
<td class="no-borders">描述:</td>
<td class="no-borders"><b>{{ user.comment }}</b></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-sm-5" style="padding-left: 0px;">
<div class="panel panel-primary">
<div class="panel-heading">
<i class="fa fa-info-circle"></i> 快速修改
</div>
<div class="panel-body">
<table class="table">
<tbody>
<tr class="no-borders-tr">
<td width="50%">Active:</td>
<td><span style="float: right">
<div class="switch">
<div class="onoffswitch">
<input type="checkbox" {% if user.is_active %} checked {% endif %} class="onoffswitch-checkbox" id="is_active" onchange="switch_user_status(this)">
<label class="onoffswitch-label" for="is_active">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
</div>
</span></td>
</tr>
<tr>
<td>二次验证:</td>
<td><span style="float: right">
<div class="switch">
<div class="onoffswitch">
<input type="checkbox" class="onoffswitch-checkbox"
id="example2">
<label class="onoffswitch-label" for="example2">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
</div>
</span></td>
</tr>
<tr>
<td>重置密码:</td>
<td>
<span style="float: right">
<button type="button" class="btn btn-primary btn-xs" style="width: 54px">重置</button>
</span>
</td>
</tr>
<tr>
<td>重置密钥:</td>
<td>
<span style="float: right">
<button type="button" class="btn btn-primary btn-xs" style="width: 54px;">重置</button>
</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">
<i class="fa fa-info-circle"></i> 用户组
</div>
<div class="panel-body">
<table class="table">
<tbody>
<form>
<tr>
<td colspan="2" class="no-borders">
<select data-placeholder="选择用户组" class="select2" style="width: 100%" multiple="" tabindex="4">
{% for group in groups %}
<option value="{{ group.id }}">{{ group.name }}</option>
{% endfor %}
</select>
</td>
</tr>
<tr>
<td colspan="2" class="no-borders">
<button type="button" class="btn btn-info btn-small">添加到用户组</button>
</td>
</tr>
</form>
{% for group in user.groups.all %}
<tr>
<td ><b>{{ group.name }}</b></td>
<td>
<button class="btn btn-danger btn-sm" type="button" style="float: right;"><i class="fa fa-minus"></i></button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block custom_foot_js %}
<script>
function switch_user_status(obj) {
var status = $(obj).prop('checked');
$.ajax({
url: "{% url 'users:user-active-api' pk=user.id %}",
type: "PUT",
data: {
'is_active': status
},
success: function (data, status) {
console.log(data)
},
error: function () {
console.log('error')
}
})
}
$(document).ready(function () {
$('.select2').select2();
})
</script>
{% endblock %}
\ No newline at end of file
{% extends 'users/_user.html' %}
{% block username %}
<div class="form-group">
<label for="{{ form.username.id_for_label }}" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-9 controls" >
<input id="{{ form.username.id_for_label }}" name="{{ form.username.html_name }}" type="text" value="{{ user.username }}" readonly class="form-control">
</div>
</div>
{% endblock %}
{% block password %}
<h3>密码</h3>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">密码</label>
<div class="col-sm-9 controls" >
<input id="password" name="password" type="password" class="form-control">
</div>
</div>
{% endblock %}
\ No newline at end of file
{% extends '_list_base.html' %}
{% load common_tags %}
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5> 查看用户 </h5>
<div class="ibox-tools">
<a class="collapise-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<div class="">
<a href="{% url 'users:user-add' %}" class="btn btn-sm btn-primary "> 添加用户 </a>
<a id="del_btn" class="btn btn-sm btn-danger "> 删除所选 </a>
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" name="keyword" placeholder="用户名或姓名" value="{{ keyword }}">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
搜索
</button>
</div>
</div>
</form>
</div>
<table class="table table-striped table-bordered table-hover " id="editable" >
<thead>
<tr>
<th class="text-center">
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')">
</th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=name">姓名</a></th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=username">用户名</a></th>
<th class="text-center">角色</th>
<th class="text-center">用户组</th>
<th class="text-center">资产数量</th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=date_expired">有效</a></th>
<th class="text-center"></th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr class="gradeX">
<td class="text-center">
<input type="checkbox" name="checked" value="{{ user.id }}">
</td>
<td class="text-center">
<a href="{% url 'users:user-detail' pk=user.id %}">
{{ user.name }}
</a>
</td>
<td class="text-center">{{ user.username }}</td>
<td class="text-center">{{ user.role.name }}</td>
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.groups.all|join_queryset_attr:"name" }} </td>
<th class="text-center">{{ user.name }}</th>
<td class="text-center">
{% if user.is_expired %}
<i class="fa fa-times text-danger"></i>
{% else %}
<i class="fa fa-check text-navy"></i>
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'users:user-edit' pk=user.id %}" class="btn btn-xs btn-info">编辑</a>
<a href="{% url 'users:user-delete' pk=user.id %}" class="btn btn-xs btn-danger del {% if user.username == 'admin' %} disabled {% endif %}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="row">
<div class="col-sm-6">
</div>
{% include '_pagination.html' %}
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% extends 'base.html' %}
{% block content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5> 查看用户 </h5>
<div class="ibox-tools">
<a class="collapise-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
{% extends '_list_base.html' %}
{% load common_tags %}
{% block content_left_head %}
<a href="{% url 'users:user-add' %}" class="btn btn-sm btn-primary "> 添加用户 </a>
{# <a id="del_btn" class="btn btn-sm btn-danger "> 删除所选 </a>#}
{% endblock %}
{% block table_head %}
<th class="text-center">
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')">
</th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=name">姓名</a></th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=username">用户名</a></th>
<th class="text-center">角色</th>
<th class="text-center">用户组</th>
<th class="text-center">资产数量</th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=date_expired">有效</a></th>
<th class="text-center"></th>
{% endblock %}
{% block table_body %}
{% for user in user_list %}
<tr class="gradeX">
<td class="text-center">
<input type="checkbox" name="checked" value="{{ user.id }}">
</td>
<td class="text-center">
<a href="{% url 'users:user-detail' pk=user.id %}">
{{ user.name }}
</a>
</td>
<td class="text-center">{{ user.username }}</td>
<td class="text-center">{{ user.get_role_display }}</td>
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.groups.all|join_queryset_attr:"name" }} </td>
<th class="text-center">{{ user.name }}</th>
<td class="text-center">
{% if user.is_expired %}
<i class="fa fa-times text-danger"></i>
{% else %}
<i class="fa fa-check text-navy"></i>
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'users:user-edit' pk=user.id %}" class="btn btn-xs btn-info">编辑</a>
<a href="{% url 'users:user-delete' pk=user.id %}" class="btn btn-xs btn-danger del {% if user.id == request.user.id or user.username == 'admin' %} disabled {% endif %}">删除</a>
</td>
</tr>
{% endfor %}
{% endblock %}
<div class="ibox-content">
<div class="">
<a href="#" class="btn btn-sm btn-primary "> 添加用户 </a>
<a id="del_btn" class="btn btn-sm btn-danger "> 删除所选 </a>
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
搜索
</button>
</div>
</div>
</form>
</div>
{% block content_bottom_left %}
<form id="" method="get" action="" class=" mail-search">
<div class="input-group">
<select class="form-control m-b" style="width: auto">
<option>批量删除</option>
<option>批量更新</option>
<option>批量禁用</option>
<option>批量导出</option>
</select>
<table class="table table-striped table-bordered table-hover " id="editable" >
<thead>
<tr>
<th class="text-center">
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')">
</th>
<th class="text-center">姓名</th>
<th class="text-center">用户名</th>
<th class="text-center">角色</th>
<th class="text-center">用户组</th>
<th class="text-center">资产数量</th>
<th class="text-center">有效</th>
<th class="text-center"></th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr class="gradeX">
<td class="text-center">
<input type="checkbox" name="checked" value="{{ user.id }}">
</td>
<td class="text-center">
<a href="{% url 'users:user-detail' pk=user.id %}?id={{ user.id }}">
{{ user.name }}
</a>
</td>
<td class="text-center">{{ user.username }}</td>
<td class="text-center">{{ user.role.name }}</td>
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.group.all }} </td>
<th class="text-center">{{ user.name }}</th>
<td class="text-center">{{ user.name }}</td>
<td class="text-center">
<a href="{% url 'users:user-edit' pk=user.id %}?id={{ user.id }}" class="btn btn-xs btn-info">编辑</a>
<a href="{% url 'users:user-delete' pk=user.id %}?id={{ user.id }}" class="btn btn-xs btn-danger del {% if user.username == 'admin' %} disabled {% endif %}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% include '_pagination.html' %}
</div>
<div class="input-group-btn pull-left" style="padding-left: 5px;">
<button id='search_btn' type="submit" style="height: 32px;" class="btn btn-sm btn-primary">
确认
</button>
</div>
</div>
</div>
</div>
</div>
</form>
{% endblock %}
{% extends 'base.html' %}
{% load static %}
{% load bootstrap %}
{% block custom_head_css_js %}
<link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
<script src="{% static "js/plugins/select2/select2.full.min.js" %}"></script>
{% endblock %}
{% block content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>填写用户组信息</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<form method="post" id="userForm" class="form-horizontal" action="" >
{% csrf_token %}
{{ form.name|bootstrap_horizontal }}
<div class="form-group">
<label for="users" class="col-sm-2 control-label">用户</label>
<div class="col-sm-9">
<select name="users" id="users" data-placeholder="选择用户" class="select2 form-control m-b" multiple tabindex="2">
{% for user in users %}
<option value="{{ user.id }}">{{ user.name }}</option>
{% endfor %}
</select>
</div>
</div>
{{ form.comment|bootstrap_horizontal }}
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="reset">取消</button>
<button id="submit_button" class="btn btn-primary" type="submit">确认保存</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block custom_foot_js %}
<script>
$(document).ready(function () {
$('.select2').select2();
})
</script>
{% endblock %}
\ No newline at end of file
{% extends '_list_base.html' %}
{% load common_tags %}
{% block content_left_head %}
<a href="{% url 'users:usergroup-add' %}" class="btn btn-sm btn-primary "> 添加用户组 </a>
{% endblock %}
{% block table_head %}
<th class="text-center">
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')">
</th>
<th class="text-center"><a href="{% url 'users:usergroup-list' %}?sort=name">名称</a></th>
<th class="text-center">用户数量</th>
<th class="text-center">资产数量</th>
<th class="text-center">描述</th>
<th class="text-center"></th>
{% endblock %}
{% block table_body %}
{% for usergroup in usergroup_list %}
<tr class="gradeX">
<td class="text-center">
<input type="checkbox" name="checked" value="{{ usergroup.id }}">
</td>
<td class="text-center">
<a href="{% url 'users:usergroup-detail' pk=usergroup.id %}">
{{ usergroup.name }}
</a>
</td>
<td class="text-center">{{ usergroup.users.all|length }}</td>
<td class="text-center">数量</td>
<th class="text-center">{{ usergroup.comment|truncatewords:8 }}</th>
<td class="text-center">
<a href="{% url 'users:usergroup-edit' pk=usergroup.id %}" class="btn btn-xs btn-info">编辑</a>
<a href="{% url 'users:usergroup-delete' pk=usergroup.id %}" class="btn btn-xs btn-danger del">删除</a>
</td>
</tr>
{% endfor %}
{% endblock %}
{% block content_bottom_left %}
<form id="" method="get" action="" class=" mail-search">
<div class="input-group">
<select class="form-control m-b" style="width: auto">
<option>批量删除</option>
<option>批量更新</option>
<option>批量禁用</option>
<option>批量导出</option>
</select>
<div class="input-group-btn pull-left" style="padding-left: 5px;">
<button id='search_btn' type="submit" style="height: 32px;" class="btn btn-sm btn-primary">
确认
</button>
</div>
</div>
</form>
{% endblock %}
# ~*~ coding: utf-8 ~*~
import os
import urllib
import hashlib
from django import template
from django.utils import timezone
from django.conf import settings
register = template.Library()
@register.filter
def join_queryset_attr(queryset, attr, delimiter=', '):
return delimiter.join([getattr(obj, attr, '') for obj in queryset])
@register.filter
def is_expired(datetime):
if datetime > timezone.now():
return False
else:
return True
@register.filter
def user_avatar_url(user):
if user.avatar:
return user.avatar.url
else:
default_dir = os.path.join(settings.MEDIA_ROOT, 'avatar', 'default')
if os.path.isdir(default_dir):
default_avatar_list = os.listdir(default_dir)
default_avatar = default_avatar_list[len(user.username) % len(default_avatar_list)]
return os.path.join(settings.MEDIA_URL, 'avatar', 'default', default_avatar)
return 'https://www.gravatar.com/avatar/c6812ab450230979465d7bf288eadce2a?s=120&d=identicon'
# ~*~ coding: utf-8 ~*~
from random import choice
import forgery_py
from users.models import User, UserGroup, init_all_models
def gen_username():
return forgery_py.internet.user_name(True)
def gen_email():
return forgery_py.internet.email_address()
def gen_name():
return forgery_py.name.full_name()
def get_role():
role = choice(dict(User.ROLE_CHOICES).keys())
return role
\ No newline at end of file
# ~*~ coding: utf-8 ~*~
from django.utils import timezone
from django.shortcuts import reverse
from django.test import TestCase, TransactionTestCase
from django.db import IntegrityError
from users.models import User, UserGroup, init_all_models
from django.contrib.auth.models import Permission
from .base import gen_name, gen_username, gen_email, get_role
class UserModelTest(TransactionTestCase):
def setUp(self):
init_all_models()
# 创建一个用户用于测试
role = get_role()
user = User(name='test', username='test', email='test@email.org', role=role)
user.save()
def test_initial(self):
self.assertEqual(User.objects.all().count(), 2)
@property
def role(self):
return get_role()
# 创建一个姓名一致的用户, 应该创建成功
def test_user_name_duplicate(self):
user1 = User(name='test', username=gen_username(), password_raw=gen_username(),
email=gen_email())
try:
user1.save()
user1.delete()
except IntegrityError:
self.assertTrue(0, 'Duplicate <name> not allowed.')
# 创建一个用户名一致的用户, 应该创建不成功
def test_user_username_duplicate(self):
user2 = User(username='test', email=gen_email(), role=self.role)
with self.assertRaises(IntegrityError):
user2.save()
# 创建一个Email一致的用户,应该创建不成功
def test_user_email_duplicate(self):
user3 = User(username=gen_username(), email='test@email.org', role=self.role)
with self.assertRaises(IntegrityError):
user3.save()
# 用户过期测试
def test_user_was_expired(self):
date = timezone.now() - timezone.timedelta(days=1)
user = User(name=gen_name(), username=gen_username(),
email=gen_email(), role=self.role, date_expired=date)
self.assertTrue(user.is_expired)
# 测试用户默认会输入All用户组
def test_user_with_default_group(self):
role = get_role()
user = User(username=gen_username(), email=gen_email(), role=role)
user.save()
self.assertEqual(user.groups.count(), 1)
self.assertEqual(user.groups.first().name, 'Default')
def test_user_password_authenticated(self):
password = gen_username() * 3
user = User(username=gen_username(), password_raw=password, role=self.role)
user.save()
self.assertTrue(user.check_password(password))
self.assertFalse(user.check_password(password*2))
def test_user_reset_password(self):
user = User.objects.first()
token = User.generate_reset_token(user.email)
new_password = gen_username()
User.reset_password(token, new_password)
user_ = User.objects.get(id=user.id)
self.assertTrue(user_.check_password(new_password))
def tearDown(self):
User.objects.all().delete()
UserGroup.objects.all().delete()
class UserGroupModelTestCase(TransactionTestCase):
pass
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
from users.models import User, UserGroup, init_all_models
from django.shortcuts import reverse
from django.test import TestCase, Client, TransactionTestCase
from .base import gen_username, gen_name, gen_email, get_role
class UserListViewTests(TransactionTestCase):
def setUp(self):
init_all_models()
self.client.login(username='admin', password='admin')
def test_a_new_user_in_list(self):
username = gen_username()
user = User(username=username, email=gen_email(), role=get_role())
user.save()
response = self.client.get(reverse('users:user-list'))
self.assertContains(response, username)
def test_list_view_with_admin_user(self):
response = self.client.get(reverse('users:user-list'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Admin')
self.assertEqual(response.context['user_list'].count(), User.objects.all().count())
def test_pagination(self):
User.generate_fake(count=20)
response = self.client.get(reverse('users:user-list'))
self.assertEqual(response.context['is_paginated'], True)
def tearDown(self):
self.client.logout()
class UserAddTests(TestCase):
def setUp(self):
init_all_models()
self.client.login(username='admin', password='admin')
def test_add_a_new_user(self):
username = gen_username()
data = {
'username': username,
'comment': '',
'name': gen_name(),
'email': gen_email(),
'groups': [UserGroup.objects.first().id, ],
'role': get_role(),
'date_expired': '2086-08-06 19:12:22',
}
response = self.client.post(reverse('users:user-add'), data)
self.assertEqual(response.status_code, 302)
self.assertEqual(response['location'], reverse('users:user-list'))
response = self.client.get(reverse('users:user-list'))
self.assertContains(response, username)
def tearDown(self):
self.client.logout()
from django.conf.urls import url
from django.contrib.auth import views as auth_views
from .views import UserListView, UserAddView
import views
import api
app_name = 'users'
urlpatterns = [
url(r'^$', UserListView.as_view(), name='user-list'),
url(r'^(?P<pk>[0-9]+)/$', UserListView.as_view(), name='user-detail'),
url(r'^add/$', UserAddView.as_view(), name='user-add'),
url(r'^(?P<pk>[0-9]+)/edit/$', UserListView.as_view(), name='user-edit'),
url(r'^(?P<pk>[0-9]+)/delete/$', UserListView.as_view(), name='user-delete'),
url(r'^login$', auth_views.login, {'template_name': 'users/login.html'}, name='login'),
url(r'^logout$', auth_views.logout, {'template_name': 'users/login.html'}, name='logout'),
url(r'^password/forget$', views.UserForgetPasswordView.as_view(), name='forget-password'),
url(r'^password/forget/sendmail-success$',
views.UserForgetPasswordSendmailSuccessView.as_view(), name='forget-password-sendmail-success'),
url(r'^password/reset$', views.UserResetPasswordView.as_view(), name='reset-password'),
url(r'^password/reset/success$', views.UserResetPasswordSuccessView.as_view(), name='reset-password-success'),
url(r'^users$', views.UserListView.as_view(), name='user-list'),
url(r'^users/(?P<pk>[0-9]+)$', views.UserDetailView.as_view(), name='user-detail'),
url(r'^users/add$', views.UserAddView.as_view(), name='user-add'),
url(r'^users/(?P<pk>[0-9]+)/edit$', views.UserUpdateView.as_view(), name='user-edit'),
url(r'^users/(?P<pk>[0-9]+)/delete$', views.UserDeleteView.as_view(), name='user-delete'),
url(r'^usergroups$', views.UserGroupListView.as_view(), name='usergroup-list'),
url(r'^usergroups/(?P<pk>[0-9]+)$', views.UserGroupDetailView.as_view(), name='usergroup-detail'),
url(r'^usergroups/add/$', views.UserGroupAddView.as_view(), name='usergroup-add'),
url(r'^usergroups/(?P<pk>[0-9]+)/edit$', views.UserGroupUpdateView.as_view(), name='usergroup-edit'),
url(r'^usergroups/(?P<pk>[0-9]+)/delete$', views.UserGroupDeleteView.as_view(), name='usergroup-delete'),
]
urlpatterns += [
url(r'^v1/users$', api.UserListAddApi.as_view(), name='user-list-api'),
url(r'^v1/users/(?P<pk>[0-9]+)$', api.UserDetailDeleteUpdateApi.as_view(), name='user-detail-api'),
url(r'^v1/users/(?P<pk>[0-9]+)/active$', api.UserActiveApi.as_view(), name='user-active-api'),
url(r'^v1/usergroups$', api.UserGroupListAddApi.as_view(), name='usergroup-list-api'),
url(r'^v1/usergroups/(?P<pk>[0-9]+)$', api.UserGroupDetailDeleteUpdateApi.as_view(), name='usergroup-detail-api'),
]
# ~*~ coding: utf-8 ~*~
#
from __future__ import unicode_literals
import os
import logging
from paramiko.rsakey import RSAKey
from django.contrib.auth.mixins import UserPassesTestMixin
from django.urls import reverse_lazy
from common.tasks import send_mail_async
from common.utils import reverse
from users.models import User
try:
import cStringIO as StringIO
except ImportError:
import StringIO
logger = logging.getLogger('jumpserver')
class AdminUserRequiredMixin(UserPassesTestMixin):
login_url = reverse_lazy('users:login')
def test_func(self):
return self.request.user.is_staff
def ssh_key_gen(length=2048, password=None, username='root', hostname=None):
"""Generate user ssh private and public key
Use paramiko RSAKey generate it.
"""
if hostname is None:
hostname = os.uname()[1]
f = StringIO.StringIO()
try:
logger.debug('Begin to generate ssh private key ...')
private_key_obj = RSAKey.generate(length)
private_key_obj.write_private_key(f, password=password)
private_key = f.getvalue()
public_key = "%(key_type)s %(key_content)s %(username)s@%(hostname)s" % {
'key_type': private_key_obj.get_name(),
'key_content': private_key_obj.get_base64(),
'username': username,
'hostname': hostname,
}
logger.debug('Finish to generate ssh private key ...')
return private_key, public_key
except IOError:
raise IOError('These is error when generate ssh key.')
def user_add_success_next(user):
subject = '您的用户创建成功'
recipient_list = [user.email]
message = """
您好 %(name)s:
</br>
恭喜您,您的账号已经创建成功.
</br>
<a href="%(rest_password_url)s?token=%(rest_password_token)s">请点击这里设置密码</a>
</br>
这个链接有效期1小时, 超过时间您可以 <a href="%(forget_password_url)s?email=%(email)s">重新申请</a>
</br>
---
</br>
<a href="%(login_url)s">直接登录</a>
</br>
""" % {
'name': user.name,
'rest_password_url': reverse('users:reset-password', external=True),
'rest_password_token': user.generate_reset_token(),
'forget_password_url': reverse('users:forget-password', external=True),
'email': user.email,
'login_url': reverse('users:login', external=True),
}
send_mail_async.delay(subject, message, recipient_list, html_message=message)
def send_reset_password_mail(user):
subject = '重设密码'
recipient_list = [user.email]
message = """
您好 %(name)s:
</br>
您好,请点击下面链接重置密码, 如果不是您申请的, 请关注账号安全
</br>
<a href="%(rest_password_url)s?token=%(rest_password_token)s">请点击这里设置密码</a>
</br>
这个链接有效期1小时, 超过时间您可以 <a href="%(forget_password_url)s?email=%(email)s">重新申请</a>
</br>
---
</br>
<a href="%(login_url)s">直接登录</a>
</br>
""" % {
'name': user.name,
'rest_password_url': reverse('users:reset-password', external=True),
'rest_password_token': user.generate_reset_token(),
'forget_password_url': reverse('users:forget-password', external=True),
'email': user.email,
'login_url': reverse('users:login', external=True),
}
send_mail_async.delay(subject, message, recipient_list, html_message=message)
# ~*~ coding: utf-8 ~*~
from __future__ import unicode_literals
import logging
from django.shortcuts import get_object_or_404, reverse, render, Http404
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
from django.db.models import Q
from django.views.generic.base import View, TemplateView
from django.views.generic.list import ListView
from django.views.generic.edit import CreateView
from django.views.generic.edit import CreateView, DeleteView, UpdateView, ProcessFormView, FormView
from django.views.generic.detail import DetailView
from django.contrib.messages.views import SuccessMessageMixin
from django.conf import settings
from django.http import HttpResponseRedirect
from common.utils import get_object_or_none
from .models import User, UserGroup
from .forms import UserForm
from .forms import UserAddForm, UserUpdateForm, UserGroupForm, UserLoginForm
from .utils import AdminUserRequiredMixin, ssh_key_gen, user_add_success_next, send_reset_password_mail
logger = logging.getLogger('jumpserver.users.views')
class UserListView(ListView):
class UserListView(AdminUserRequiredMixin, ListView):
model = User
paginate_by = 10
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
context_object_name = 'user_list'
template_name = 'users/user_list.html'
ordering = '-date_joined'
def get_queryset(self):
self.queryset = super(UserListView, self).get_queryset()
self.keyword = keyword = self.request.GET.get('keyword', '')
self.sort = sort = self.request.GET.get('sort')
if keyword:
self.queryset = self.queryset.filter(Q(username__icontains=keyword) |
Q(name__icontains=keyword))
if sort:
self.queryset = self.queryset.order_by(sort)
return self.queryset
def get_context_data(self, **kwargs):
context = super(UserListView, self).get_context_data(**kwargs)
context.update({'path1': '用户管理', 'path2': '用户列表', 'title': '用户列表'})
context.update({'app': '用户管理', 'action': '用户列表', 'keyword': self.keyword})
return context
class UserAddView(CreateView):
class UserAddView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView):
model = User
form_class = UserForm
form_class = UserAddForm
template_name = 'users/user_add.html'
success_url = reverse_lazy('users:user-list')
success_message = '添加用户 <a href="%s">%s</a> 成功 .'
def get_context_data(self, **kwargs):
context = super(UserAddView, self).get_context_data(**kwargs)
context.update({'app': '用户管理', 'action': '用户添加'})
return context
def form_valid(self, form):
user = form.save(commit=False)
user.created_by = self.request.user.username or 'System'
user.save()
user_add_success_next(user)
return super(UserAddView, self).form_valid(form)
def get_success_message(self, cleaned_data):
return self.success_message % (
reverse_lazy('users:user-detail', kwargs={'pk': self.object.pk}),
self.object.name,
)
class UserUpdateView(AdminUserRequiredMixin, UpdateView):
model = User
form_class = UserUpdateForm
template_name = 'users/user_edit.html'
context_object_name = 'user'
success_url = reverse_lazy('users:user-list')
def form_valid(self, form):
username = self.object.username
user = form.save(commit=False)
user.username = username
user.save()
password = self.request.POST.get('password', '')
if password:
user.set_password(password)
return super(UserUpdateView, self).form_valid(form)
def form_invalid(self, form):
print(form.errors)
return super(UserUpdateView, self).form_invalid(form)
def get_context_data(self, **kwargs):
context = super(UserUpdateView, self).get_context_data(**kwargs)
context.update({'app': '用户管理', 'action': '用户编辑'})
return context
class UserDeleteView(AdminUserRequiredMixin, DeleteView):
model = User
success_url = reverse_lazy('users:user-list')
template_name = 'users/user_delete_confirm.html'
class UserDetailView(AdminUserRequiredMixin, DetailView):
model = User
template_name = 'users/user_detail.html'
context_object_name = "user"
def get_context_data(self, **kwargs):
context = super(UserDetailView, self).get_context_data(**kwargs)
groups = [group for group in UserGroup.objects.iterator() if group not in self.object.groups.iterator()]
context.update({'app': '用户管理', 'action': '用户详情', 'groups': groups})
return context
class UserGroupListView(AdminUserRequiredMixin, ListView):
model = UserGroup
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
context_object_name = 'usergroup_list'
template_name = 'users/usergroup_list.html'
ordering = '-date_added'
def get_queryset(self):
self.queryset = super(UserGroupListView, self).get_queryset()
self.keyword = keyword = self.request.GET.get('keyword', '')
self.sort = sort = self.request.GET.get('sort')
if keyword:
self.queryset = self.queryset.filter(name__icontains=keyword)
if sort:
self.queryset = self.queryset.order_by(sort)
return self.queryset
def get_context_data(self, **kwargs):
context = super(UserGroupListView, self).get_context_data(**kwargs)
context.update({'app': '用户管理', 'action': '用户组列表', 'keyword': self.keyword})
return context
class UserGroupAddView(AdminUserRequiredMixin, CreateView):
model = UserGroup
form_class = UserGroupForm
template_name = 'users/usergroup_add.html'
success_url = reverse_lazy('users:usergroup-list')
def get_context_data(self, **kwargs):
context = super(UserGroupAddView, self).get_context_data(**kwargs)
users = User.objects.all()
context.update({'app': '用户管理', 'action': '用户组添加', 'users': users})
return context
def form_valid(self, form):
usergroup = form.save()
users_id_list = self.request.POST.getlist('users', [])
users = [get_object_or_404(User, id=user_id) for user_id in users_id_list]
usergroup.created_by = self.request.user.username or 'Admin'
usergroup.users.add(*tuple(users))
usergroup.save()
return super(UserGroupAddView, self).form_valid(form)
class UserGroupUpdateView(UpdateView):
pass
class UserGroupDetailView(DetailView):
pass
class UserGroupDeleteView(DeleteView):
pass
class UserForgetPasswordView(TemplateView):
template_name = 'users/forget_password.html'
def post(self, request, *args, **kwargs):
email = request.POST.get('email')
user = get_object_or_none(User, email=email)
if not user:
return self.get(request, errors='邮件地址错误,请重新输入')
else:
send_reset_password_mail(user)
return HttpResponseRedirect(reverse('users:forget-password-sendmail-success'))
class UserForgetPasswordSendmailSuccessView(TemplateView):
template_name = 'common/flash_message_standalone.html'
def get_context_data(self, **kwargs):
context = {
'title': '发送重置邮件',
'messages': '发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)',
'redirect_url': reverse('users:login'),
}
kwargs.update(context)
return super(UserForgetPasswordSendmailSuccessView, self).get_context_data(**kwargs)
class UserResetPasswordSuccessView(TemplateView):
template_name = 'common/flash_message_standalone.html'
def get_context_data(self, **kwargs):
context = {
'title': '重设密码成功',
'messages': '密码重置成功, 请返回登录页面登录系统',
'redirect_url': reverse('users:login'),
}
kwargs.update(context)
return super(UserResetPasswordSuccessView, self).get_context_data(**kwargs)
class UserResetPasswordView(TemplateView):
template_name = 'users/reset_password.html'
def get(self, request, *args, **kwargs):
token = request.GET.get('token')
user = User.validate_reset_token(token)
if not user:
kwargs.update({'errors': 'Token不正确或已过期'})
return super(UserResetPasswordView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
password = request.POST.get('password')
password_confirm = request.POST.get('password-confirm')
token = request.GET.get('token')
if password != password_confirm:
return self.get(request, errors='两次密码不匹配')
user = User.validate_reset_token(token)
if not user:
return self.get(request, errors='Token不正确或已过期')
user.reset_password(password)
return HttpResponseRedirect(reverse('users:reset-password-success'))
from django.contrib import admin
# Register your models here.
from __future__ import unicode_literals
from django.apps import AppConfig
class WebterminalConfig(AppConfig):
name = 'webterminal'
from __future__ import unicode_literals
from django.db import models
# Create your models here.
{% extends 'base.html' %}
{% block content %}
<div class="container">
<div id="term">
</div>
</div>
<div class="termChangBar">
<input type="number" min="100" value="100" placeholder="col" id="term-col"/>
<input type="number" min="35" value="35" placeholder="row" id="term-row"/>
<button id="col-row">修改窗口大小</button>
</div>
{% endblock %}
{% block custom_foot_js %}
<script type="application/javascript" src="/static/js/jquery-2.1.1.js"></script>
<script type="application/javascript" src="/static/js/term.js"></script>
<script>/**
* Created by liuzheng on 3/3/16.
*/
var rowHeight = 1;
var colWidth = 1;
function WSSHClient() {
}
WSSHClient.prototype._generateEndpoint = function (options) {
console.log(options);
if (window.location.protocol == 'https:') {
var protocol = 'wss://';
} else {
var protocol = 'ws://';
}
var endpoint = protocol + document.URL.match(RegExp('//(.*?)/'))[1] + '/ws/foobar?subscribe-broadcast&publish-broadcast&echo';
return endpoint;
};
WSSHClient.prototype.connect = function (options) {
var endpoint = this._generateEndpoint(options);
if (window.WebSocket) {
this._connection = new WebSocket(endpoint);
}
else if (window.MozWebSocket) {
this._connection = MozWebSocket(endpoint);
}
else {
options.onError('WebSocket Not Supported');
return;
}
this._connection.onopen = function () {
options.onConnect();
};
this._connection.onmessage = function (evt) {
try {
options.onData(evt.data);
} catch (e) {
var data = JSON.parse(evt.data.toString());
options.onError(data.error);
}
};
this._connection.onclose = function (evt) {
options.onClose();
};
};
WSSHClient.prototype.send = function (data) {
this._connection.send(JSON.stringify({'data': data}));
};
function openTerminal(options) {
var client = new WSSHClient();
var rowHeight, colWidth;
try {
rowHeight = localStorage.getItem('term-row');
colWidth = localStorage.getItem('term-col');
} catch (err) {
rowHeight = 35;
colWidth = 100
}
if (rowHeight) {
} else {
rowHeight = 35
}
if (colWidth) {
} else {
colWidth = 100
}
var term = new Terminal({
rows: rowHeight,
cols: colWidth,
useStyle: true,
screenKeys: true
});
term.open();
term.on('data', function (data) {
client.send(data)
});
$('.terminal').detach().appendTo('#term');
//term.resize(colWidth, rowHeight);
term.write('Connecting...');
client.connect($.extend(options, {
onError: function (error) {
term.write('Error: ' + error + '\r\n');
},
onConnect: function () {
// Erase our connecting message
client.send({'resize': {'rows': rowHeight, 'cols': colWidth}});
term.write('\r');
},
onClose: function () {
term.write('Connection Reset By Peer');
},
onData: function (data) {
if (data == "love you")
console.log(data);
else
term.write(data);
}
}));
//rowHeight = 0.0 + 1.00 * $('.terminal').height() / 24;
//colWidth = 0.0 + 1.00 * $('.terminal').width() / 80;
return {'term': term, 'client': client};
}
//function resize() {
// $('.terminal').css('width', window.innerWidth - 25);
// console.log(window.innerWidth);
// console.log(window.innerWidth - 10);
// var rows = Math.floor(window.innerHeight / rowHeight) - 2;
// var cols = Math.floor(window.innerWidth / colWidth) - 1;
//
// return {rows: rows, cols: cols};
//}
$(document).ready(function () {
var options = {};
$('#ssh').show();
var term_client = openTerminal(options);
console.log(rowHeight);
// by liuzheng712 because it will bring record bug
//window.onresize = function () {
// var geom = resize();
// console.log(geom);
// term_client.term.resize(geom.cols, geom.rows);
// term_client.client.send({'resize': {'rows': geom.rows, 'cols': geom.cols}});
// $('#ssh').show();
//}
try {
$('#term-row')[0].value = localStorage.getItem('term-row');
$('#term-col')[0].value = localStorage.getItem('term-col');
} catch (err) {
$('#term-row')[0].value = 35;
$('#term-col')[0].value = 100;
}
$('#col-row').click(function () {
var col = $('#term-col').val();
var row = $('#term-row').val();
localStorage.setItem('term-col', col);
localStorage.setItem('term-row', row);
term_client.term.resize(col, row);
term_client.client.send({'resize': {'rows': row, 'cols': col}});
$('#ssh').show();
});
$(".terminal").mouseleave(function () {
$(".termChangBar").slideDown();
});
$(".terminal").mouseenter(function () {
$(".termChangBar").slideUp();
})
});</script>
{% endblock %}
from django.test import TestCase
# Create your tests here.
# coding:utf-8
from django.conf.urls import url
from .views import *
from django.contrib import admin
admin.autodiscover()
app_name = 'webterminal'
urlpatterns = [
url(r'^$', TerminalView.as_view(), name='webterminal'),
]
\ No newline at end of file
from django.shortcuts import render
from django.urls import reverse_lazy
from django.db.models import Q
from django.views.generic.list import ListView
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from django.views.generic.detail import DetailView
from django.views.generic.base import TemplateView
from django.views import View
from django.http import HttpResponse
from ws4redis.redis_store import RedisMessage
from ws4redis.publisher import RedisPublisher
from django.conf import settings
# Create your views here.
class TerminalView(TemplateView):
template_name = 'main.html'
def get(self, request, *args, **kwargs):
welcome = RedisMessage('Hello everybody') # create a welcome message to be sent to everybody
RedisPublisher(facility='foobar', broadcast=True).publish_message(welcome)
return super(TerminalView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
redis_publisher = RedisPublisher(facility='foobar', groups=[request.POST.get('group')])
message = RedisMessage(request.POST.get('message'))
redis_publisher.publish_message(message)
return HttpResponse('OK')
"""
jumpserver.config
~~~~~~~~~~~~~~~~~
Jumpserver project setting file
:copyright: (c) 2014-2016 by Jumpserver Team.
:license: GPL v2, see LICENSE for more details.
"""
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
class Config:
# Use it to encrypt or decrypt data
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY') or '2vym+ky!997d5kkcc64mnz06y1mmui3lut#(^wd=%s_qj$1%x'
# How many line display every page, default 20
DISPLAY_PER_PAGE = 20
# It's used to identify your site, When we send a create mail to user, we only know login url is /login/
# But we should know the absolute url like: http://jms.jumpserver.org/login/, so SITE_URL is
# HTTP_PROTOCOL://HOST[:PORT]
SITE_URL = 'http://localhost'
# Django security setting, if your disable debug model, you should setting that
ALLOWED_HOSTS = ['*']
# Development env open this, when error occur display the full process track, Production disable it
DEBUG = True
# DEBUG, INFO, WARNING, ERROR, CRITICAL can set. See https://docs.djangoproject.com/en/1.10/topics/logging/
LOG_LEVEL = 'DEBUG'
# Database setting, Support sqlite3, mysql, postgres ....
# See https://docs.djangoproject.com/en/1.10/ref/settings/#databases
# Sqlite setting:
DATABASE_ENGINE = 'sqlite3'
DB_NAME = os.path.join(BASE_DIR, 'db.sqlite3')
# Mysql or postgres setting like:
# DB_ENGINE = 'mysql'
# DB_HOST = '127.0.0.1'
# DB_PORT = 3306
# DB_USER = 'root'
# DB_PASSWORD = ''
# DB_NAME = 'jumpserver'
# When Django start it will bind this host and port
# ./manage.py runserver 127.0.0.1:8080
# Todo: Gunicorn or uwsgi run may be use it
HTTP_LISTEN_HOST = '127.0.0.1'
HTTP_LISTEN_PORT = 8080
# Use Redis as broker for celery and web socket
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
# REDIS_PASSWORD = ''
# Email SMTP setting, we only support smtp send mail
# EMAIL_HOST = 'smtp.qq.com'
# EMAIL_PORT = 25
# EMAIL_HOST_USER = ''
# EMAIL_HOST_PASSWORD = ''
# EMAIL_USE_SSL = False # If port is 465, set True
# EMAIL_USE_TLS = False # If port is 587, set True
# EMAIL_SUBJECT_PREFIX = '[Jumpserver] '
def __init__(self):
pass
def __getattr__(self, item):
return None
class DevelopmentConfig(Config):
DEBUG = True
DISPLAY_PER_PAGE = 20
DB_ENGINE = 'sqlite'
DB_NAME = os.path.join(BASE_DIR, 'db.sqlite3')
class ProductionConfig(Config):
DEBUG = False
DB_ENGINE = 'mysql'
DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = ''
DB_NAME = 'jumpserver'
config = {
'development': DevelopmentConfig,
'production': ProductionConfig,
'default': DevelopmentConfig,
}
env = 'development'
......@@ -31,6 +31,13 @@
│ │ ├── urls.py // urlconf文件
│ │ ├── utils.py // 将views和api可复用的代码放在这里, api和views只是请求和返回不同
│ │ └── views.py // views文件
│ ├── common
│ │ ├── templatetags // 通用template tag
│ │ ├── utils.py // 通用的函数方法
│ │ └── views.py
│ ├── fixtures // 初始化数据目录
│ │ ├── init.json // 初始化项目数据库
│ │ └── fake.json // 生成大量测试数据
│ ├── jumpserver // 项目设置目录
│ │ ├── __init__.py
│ │ ├── settings.py // 项目设置文件
......
......@@ -37,7 +37,7 @@
<type label="SET" quote="" sql="SET" length="1"/>
<type label="Bit" quote="" sql="bit" length="0"/>
</group>
</datatypes><table x="397" y="254" name="user">
</datatypes><table x="399" y="254" name="user">
<row name="id" null="1" autoincrement="1">
<datatype>INTEGER</datatype>
<default>NULL</default></row>
......@@ -71,9 +71,12 @@
<row name="is_active" null="0" autoincrement="0">
<datatype>INTEGER</datatype>
<default>0</default></row>
<row name="two_factor_auth" null="1" autoincrement="0">
<row name="enable_2FA" null="1" autoincrement="0">
<datatype>INTEGER</datatype>
<default>0</default></row>
<row name="secret_key_2FA" null="1" autoincrement="0">
<datatype>CHAR</datatype>
<default>NULL</default></row>
<row name="role" null="1" autoincrement="0">
<datatype>INTEGER</datatype>
<default>NULL</default><relation table="role" row="id" />
......@@ -87,6 +90,9 @@
<row name="public_key" null="1" autoincrement="0">
<datatype>VARCHAR</datatype>
<default>NULL</default></row>
<row name="comment" null="1" autoincrement="0">
<datatype>CHAR</datatype>
<default>NULL</default></row>
<row name="date_joined" null="1" autoincrement="0">
<datatype>DATETIME</datatype>
<default>'now()'</default></row>
......@@ -223,6 +229,10 @@
<row name="password" null="1" autoincrement="0">
<datatype>VARCHAR</datatype>
<default>NULL</default></row>
<row name="admin_user" null="1" autoincrement="0">
<datatype>INTEGER</datatype>
<default>NULL</default><relation table="adminuser" row="id" />
</row>
<row name="idc" null="1" autoincrement="0">
<datatype>INTEGER</datatype>
<default>NULL</default><relation table="idc" row="id" />
......@@ -265,16 +275,18 @@
<row name="disk" null="1" autoincrement="0">
<datatype>VARCHAR</datatype>
<default>NULL</default></row>
<row name="is_active" null="1" autoincrement="0">
<datatype>INTEGER</datatype>
<default>NULL</default></row>
<row name="comment" null="1" autoincrement="0">
<datatype>CHAR</datatype>
<default>NULL</default></row>
<row name="created_by" null="1" autoincrement="0">
<datatype>VARCHAR</datatype>
<default>NULL</default></row>
<row name="date_added" null="1" autoincrement="0">
<datatype>DATETIME</datatype>
<default>NULL</default></row>
<row name="admin_user" null="1" autoincrement="0">
<datatype>INTEGER</datatype>
<default>NULL</default><relation table="adminuser" row="id" />
</row>
<key type="PRIMARY" name="">
<part>id</part>
</key>
......@@ -359,6 +371,9 @@
<row name="comment" null="1" autoincrement="0">
<datatype>VARCHAR</datatype>
<default>NULL</default></row>
<row name="created_by" null="1" autoincrement="0">
<datatype>VARCHAR</datatype>
<default>NULL</default></row>
<row name="date_added" null="1" autoincrement="0">
<datatype>DATETIME</datatype>
<default>NULL</default></row>
......@@ -519,7 +534,7 @@
<part>id</part>
</key>
</table>
<table x="1080" y="886" name="task">
<table x="1081" y="917" name="task">
<row name="id" null="1" autoincrement="1">
<datatype>INTEGER</datatype>
<default>NULL</default></row>
......@@ -623,7 +638,7 @@
<part>id</part>
</key>
</table>
<table x="297" y="753" name="loginlog">
<table x="300" y="770" name="loginlog">
<row name="id" null="1" autoincrement="1">
<datatype>INTEGER</datatype>
<default>NULL</default></row>
......@@ -652,7 +667,7 @@
<part>id</part>
</key>
</table>
<table x="139" y="757" name="adminlog">
<table x="139" y="772" name="adminlog">
<row name="id" null="1" autoincrement="1">
<datatype>INTEGER</datatype>
<default>NULL</default></row>
......@@ -678,7 +693,7 @@
<part>id</part>
</key>
</table>
<table x="459" y="752" name="proxylog">
<table x="460" y="769" name="proxylog">
<row name="id" null="1" autoincrement="1">
<datatype>INTEGER</datatype>
<default>NULL</default></row>
......@@ -775,3 +790,4 @@
</key>
</table>
</sql>
django==1.10
pillow
\ No newline at end of file
Django==1.10
django-bootstrap-form==3.2.1
django-redis-sessions==0.5.6
django-websocket-redis==0.4.6
gevent==1.1.2
greenlet==0.4.10
logging==0.4.9.6
Pillow==3.3.1
pyte==0.5.2
redis==2.10.5
six==1.10.0
wcwidth==0.1.7
websocket-client==0.37.0
djangorestframework==3.4.5
ForgeryPy==0.1
paramiko==2.0.2
celery==3.1.23
ansible==2.1.1.0
#!/usr/bin/env python
# ~*~ coding: utf-8 ~*~
from threading import Thread
import os
import subprocess
try:
from config import config as env_config, env
CONFIG = env_config.get(env, 'default')()
except ImportError:
CONFIG = type('_', (), {'__getattr__': None})()
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
apps_dir = os.path.join(BASE_DIR, 'apps')
def start_django():
http_host = CONFIG.HTTP_BIND_HOST or 'locahost'
http_port = CONFIG.HTTP_LISTEN_HOST or '8080'
os.chdir(apps_dir)
print('start django')
subprocess.call('python ./manage.py runserver %s:%s' % (http_host, http_port), shell=True)
def start_celery():
os.chdir(apps_dir)
print('start celery')
subprocess.call('celery -A common worker -l info', shell=True)
def main():
t1 = Thread(target=start_django, args=())
t2 = Thread(target=start_celery, args=())
t1.start()
t2.start()
t1.join()
t2.join()
if __name__ == '__main__':
main()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment