Commit afb92373 authored by ibuler's avatar ibuler

Merge with audits

parents 6b6fdcd5 79c8f227
# ~*~ coding: utf-8 ~*~
from rest_framework import serializers
from rest_framework import viewsets, serializers,generics
from .models import AssetGroup, Asset, IDC, AssetExtend
from rest_framework import viewsets, serializers, generics
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin, ListBulkCreateUpdateDestroyAPIView
from common.mixins import BulkDeleteApiMixin
from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin,ListBulkCreateUpdateDestroyAPIView
from .serializers import *
from common.utils import get_object_or_none, signer
from .hands import IsSuperUserOrTerminalUser, IsSuperUser
from .models import AssetGroup, Asset, IDC, SystemUser
from .serializers import AssetBulkUpdateSerializer
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):
......@@ -45,10 +48,44 @@ class IDCViewSet(viewsets.ReadOnlyModelViewSet):
"""API endpoint that allows IDC to be viewed or edited."""
queryset = IDC.objects.all()
serializer_class = IDCSerializer
permission_classes = (IsSuperUser,)
class AssetListUpdateApi(BulkDeleteApiMixin, ListBulkCreateUpdateDestroyAPIView):
queryset = Asset.objects.all()
serializer_class = AssetBulkUpdateSerializer
permission_classes = (IsSuperUser,)
class SystemUserAuthApi(APIView):
permission_classes = (IsSuperUserOrTerminalUser,)
def get(self, request, *args, **kwargs):
system_user_id = request.query_params.get('system_user_id', -1)
system_user_username = request.query_params.get('system_user_username', '')
system_user = get_object_or_none(SystemUser, id=system_user_id, username=system_user_username)
if system_user:
if system_user.password:
password = signer.sign(system_user.password)
else:
password = signer.sign('')
if system_user.private_key:
private_key = signer.sign(system_user.private_key)
else:
private_key = signer.sign(None)
response = {
'id': system_user.id,
'password': password,
'private_key': private_key,
}
return Response(response)
else:
return Response({'msg': 'error system user id or username'}, status=401)
......@@ -38,16 +38,14 @@ class AssetCreateForm(forms.ModelForm):
self.instance.tags.clear()
self.instance.tags.add(*tuple(tags))
class Meta:
model = Asset
tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all())
fields = [
'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups',
'other_ip', 'remote_card_ip', 'mac_address', 'brand', 'cpu', 'memory', 'disk', 'os', 'cabinet_no',
'cabinet_pos', 'number', 'status', 'env', 'sn', 'tags',
]
tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all())
widgets = {
'groups': forms.SelectMultiple(attrs={'class': 'select2',
'data-placeholder': _('Select asset groups')}),
......@@ -60,6 +58,8 @@ class AssetCreateForm(forms.ModelForm):
help_texts = {
'hostname': '* required',
'ip': '* required',
'system_users': _('System user will be granted for user to login assets (using ansible create automatic)'),
'admin_user': _('Admin user should be exist on asset already, And have sudo ALL permission'),
'tags': '最多5个标签,单个标签最长8个汉字,按回车确认'
}
......@@ -243,7 +243,7 @@ class SystemUserForm(forms.ModelForm):
# Todo: Validate private key file, and generate public key
# Todo: Auto generate private key and public key
if private_key_file:
system_user.private_key = private_key_file.read()
system_user.private_key = private_key_file.read().strip()
system_user.save()
return self.instance
......@@ -264,6 +264,7 @@ class SystemUserForm(forms.ModelForm):
'auth_update': 'Auto update system user ssh key',
}
class AssetTagForm(forms.ModelForm):
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
label=_('Asset'),
......
......@@ -12,4 +12,5 @@
from users.utils import AdminUserRequiredMixin
from users.backends import IsSuperUserOrTerminalUser, IsSuperUser
from users.models import User, UserGroup
......@@ -7,7 +7,7 @@ from django.core import serializers
import logging
from django.utils.translation import ugettext_lazy as _
from common.utils import encrypt, decrypt
from common.utils import signer
logger = logging.getLogger(__name__)
......@@ -111,23 +111,23 @@ class AdminUser(models.Model):
@password.setter
def password(self, password_raw):
self._password = encrypt(password_raw)
self._password = signer.sign(password_raw)
@property
def private_key(self):
return decrypt(self._private_key)
return signer.unsign(self._private_key)
@private_key.setter
def private_key(self, private_key_raw):
self._private_key = encrypt(private_key_raw)
self._private_key = signer.sign(private_key_raw)
@property
def public_key(self):
return decrypt(self._public_key)
return signer.unsign(self._public_key)
@public_key.setter
def public_key(self, public_key_raw):
self._public_key = encrypt(public_key_raw)
self._public_key = signer.sign(public_key_raw)
class Meta:
db_table = 'admin_user'
......@@ -179,27 +179,27 @@ class SystemUser(models.Model):
@property
def password(self):
return decrypt(self._password)
return signer.unsign(self._password)
@password.setter
def password(self, password_raw):
self._password = encrypt(password_raw)
self._password = signer.sign(password_raw)
@property
def private_key(self):
return decrypt(self._private_key)
return signer.unsign(self._private_key)
@private_key.setter
def private_key(self, private_key_raw):
self._private_key = encrypt(private_key_raw)
self._private_key = signer.sign(private_key_raw)
@property
def public_key(self):
return decrypt(self._public_key)
return signer.unsign(self._public_key)
@public_key.setter
def public_key(self, public_key_raw):
self._public_key = encrypt(public_key_raw)
self._public_key = signer.sign(public_key_raw)
def get_assets_inherit_from_asset_groups(self):
assets = set()
......@@ -289,10 +289,10 @@ def get_default_idc():
class Asset(models.Model):
ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP'))
ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP'), db_index=True)
other_ip = models.CharField(max_length=255, null=True, blank=True, verbose_name=_('Other IP'))
remote_card_ip = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('Remote card IP'))
hostname = models.CharField(max_length=128, blank=True, verbose_name=_('Hostname'))
hostname = models.CharField(max_length=128, unique=True, verbose_name=_('Hostname'))
port = models.IntegerField(default=22, verbose_name=_('Port'))
groups = models.ManyToManyField(AssetGroup, blank=True, related_name='assets', verbose_name=_('Asset groups'))
admin_user = models.ForeignKey(AdminUser, null=True, blank=True, related_name='assets',
......
......@@ -5,6 +5,7 @@ from .models import AssetGroup, Asset, IDC, AssetExtend
from common.mixins import BulkDeleteApiMixin
from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin
class AssetBulkUpdateSerializer(BulkSerializerMixin, serializers.ModelSerializer):
# group_display = serializers.SerializerMethodField()
# active_display = serializers.SerializerMethodField()
......
......@@ -18,6 +18,9 @@
<li class="active">
<a href="" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Detail' %} </a>
</li>
<li class="pull-right">
<a class="btn btn-outline btn-default" href="{% url 'assets:admin-user-update' pk=admin_user.id %}"><i class="fa fa-edit"></i>Update</a>
</li>
</ul>
</div>
<div class="tab-content">
......
......@@ -22,6 +22,9 @@
<li>
<a href="" class="text-center"><i class="fa fa-bar-chart-o"></i> {% trans 'Asset login log' %}</a>
</li>
<li class="pull-right">
<a class="btn btn-outline btn-default" href="{% url 'assets:asset-update' pk=asset.id %}"><i class="fa fa-edit"></i>Update</a>
</li>
</ul>
</div>
<div class="tab-content">
......@@ -54,6 +57,14 @@
<td>{% trans 'IP' %}:</td>
<td><b>{{ asset.ip }}</b></td>
</tr>
<tr>
<td>{% trans 'Admin user' %}:</td>
{% if asset.admin_user %}
<td><b>{{ asset.admin_user.name }}</b></td>
{% else %}
<td><b>None</b></td>
{% endif %}
</tr>
<tr>
<td>{% trans 'Other IP' %}:</td>
<td><b>{{ asset.other_ip }}</b></td>
......@@ -173,7 +184,15 @@
</span>
</td>
</tr>
</tbody>
<tr>
<td>{% trans 'Repush system users' %}:</td>
<td>
<span class="pull-right">
<button type="button" class="btn btn-primary btn-xs" id="btn_reset_pk" style="width: 54px;">{% trans 'Push' %}</button>
</span>
</td>
</tr>
</tbody>
</table>
</div>
......@@ -215,6 +234,41 @@
</table>
</div>
</div>
<div class="panel panel-warning">
<div class="panel-heading">
<i class="fa fa-info-circle"></i> {% trans 'Asset groups' %}
</div>
<div class="panel-body">
<table class="table group_edit">
<tbody>
<form>
<tr class="no-borders-tr">
<td colspan="2">
<select data-placeholder="{% trans 'Select system user' %}" class="select2" style="width: 100%" multiple="" tabindex="4">
{% for system_user in system_users_remain %}
<option value="{{ system_user.id }}">{{ system_user.name }}</option>
{% endfor %}
</select>
</td>
</tr>
<tr class="no-borders-tr">
<td colspan="2">
<button type="button" class="btn btn-warning btn-sm">{% trans 'Associate' %}</button>
</td>
</tr>
</form>
{% for system_user in system_users %}
<tr>
<td ><b>{{ system_user.name }}</b></td>
<td>
<button class="btn btn-danger btn-xs" type="button" style="float: right;"><i class="fa fa-minus"></i></button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
......
......@@ -15,9 +15,11 @@
<div class="ibox float-e-margins">
<div class="panel-options">
<ul class="nav nav-tabs">
<li class="active"><a href="" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Detail' %} </a>
</li>
<li class="active"><a href="" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Detail' %} </a></li>
<li><a href="" class="text-center"><i class="fa fa-bar-chart-o"></i> {% trans 'Asset group perm' %}</a></li>
<li class="pull-right">
<a class="btn btn-outline btn-default" href="{% url 'assets:asset-group-update' pk=asset_group.id %}"><i class="fa fa-edit"></i>Update</a>
</li>
</ul>
</div>
<div class="tab-content">
......
......@@ -23,6 +23,9 @@
<i class="fa fa-bar-chart-o"></i> {% trans 'Associate assets and asset groups' %}
</a>
</li>
<li class="pull-right">
<a class="btn btn-outline btn-default" href="{% url 'assets:system-user-update' pk=system_user.id %}"><i class="fa fa-edit"></i>Update</a>
</li>
</ul>
</div>
<div class="tab-content">
......
......@@ -64,10 +64,10 @@ urlpatterns = [
]
urlpatterns += [
#json
url(r'^v1/assets/$', api.AssetViewSet.as_view({'get':'list'}), name='assets-list-api'),
url(r'^v1/assets_bulk/$', api.AssetListUpdateApi.as_view(), name='asset-bulk-update-api'),
url(r'^v1/idc/$', api.IDCViewSet.as_view({'get':'list'}), name='idc-list-json'),
url(r'^v1/system-user/auth/', api.SystemUserAuthApi.as_view(), name='system-user-auth'),
]
......@@ -44,8 +44,6 @@ class AssetListView(AdminUserRequiredMixin, ListView):
return super(AssetListView, self).get_context_data(**kwargs)
class AssetCreateView(AdminUserRequiredMixin,CreateAssetTagsMiXin,CreateView):
model = Asset
tag_type = 'asset'
......@@ -182,12 +180,16 @@ class AssetDetailView(DetailView):
def get_context_data(self, **kwargs):
asset_groups = self.object.groups.all()
system_users = self.object.system_users.all()
context = {
'app': 'Assets',
'action': 'Asset detail',
'asset_groups_remain': [asset_group for asset_group in AssetGroup.objects.all()
if asset_group not in asset_groups],
if asset_group not in asset_groups],
'asset_groups': asset_groups,
'system_users_remain': [system_user for system_user in SystemUser.objects.all()
if system_user not in system_users],
'system_users': system_users,
}
kwargs.update(context)
return super(AssetDetailView, self).get_context_data(**kwargs)
......
# ~*~ coding: utf-8 ~*~
#
from users.models import User
from assets.models import Asset, SystemUser
from users.backends import IsSuperUserOrTerminalUser
from terminal.models import Terminal
......@@ -71,7 +71,7 @@ class ProxyLog(models.Model):
class CommandLog(models.Model):
proxy_log = models.ForeignKey(ProxyLog, on_delete=models.CASCADE, related_name='command_log')
proxy_log = models.ForeignKey(ProxyLog, on_delete=models.CASCADE, related_name='commands')
command_no = models.IntegerField()
command = models.CharField(max_length=1000, blank=True)
output = models.TextField(blank=True)
......@@ -82,7 +82,10 @@ class CommandLog(models.Model):
@property
def output_decode(self):
return base64.b64decode(self.output).replace('\n', '<br />')
try:
return base64.b64decode(self.output).replace('\n', '<br />')
except UnicodeDecodeError:
return 'UnicodeDecodeError'
class Meta:
db_table = 'command_log'
......
......@@ -14,7 +14,8 @@ class ProxyLogSerializer(serializers.ModelSerializer):
class Meta:
model = models.ProxyLog
fields = ['id', 'name', 'username', 'hostname', 'ip', 'system_user', 'login_type', 'terminal',
'log_file', 'was_failed', 'is_finished', 'date_start', 'time', 'command_length', "commands_dict"]
'log_file', 'was_failed', 'is_finished', 'date_start', 'date_finished', 'time',
'command_length', "commands_dict"]
@staticmethod
def get_time(obj):
......@@ -25,7 +26,7 @@ class ProxyLogSerializer(serializers.ModelSerializer):
@staticmethod
def get_command_length(obj):
return len(obj.command_log.all())
return len(obj.commands.all())
class CommandLogSerializer(serializers.ModelSerializer):
......
......@@ -3,10 +3,61 @@
{% load static %}
{% load common_tags %}
{% block content_left_head %}
{# <a href="{% url 'perms:asset-permission-create' %}" class="btn btn-sm btn-primary "> {% trans "Create permission" %} </a>#}
<link href="{% static "css/plugins/footable/footable.core.css" %}" rel="stylesheet">
<style>
#search_btn {
margin-bottom: 0;
}
</style>
{% endblock %}
{% block table_search %}
<form id="search_form" method="get" action="" class="pull-right form-inline">
<div class="form-group" id="date">
<div class="input-daterange input-group" id="datepicker">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from }}">
<span class="input-group-addon">to</span>
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to }}">
</div>
</div>
<div class="input-group">
<select class="select2 form-control" name="username">
<option value="">{% trans 'User' %}</option>
{% for user in user_list %}
<option value="{{ user.username }}" {% if user.username == username %} selected {% endif %}>{{ user.username }}</option>
{% endfor %}
</select>
</div>
<div class="input-group">
<select class="select2 form-control" name="ip">
<option value="">{% trans 'Asset' %}</option>
{% for asset in asset_list %}
<option value="{{ asset.ip }}" {% if asset.ip == ip %} selected {% endif %}>{{ asset.ip }}</option>
{% endfor %}
</select>
</div>
<div class="input-group">
<select class="select2 form-control" name="system_user">
{# <option value="">{{ system_user }}</option>#}
<option value="">{% trans 'System user' %}</option>
{% for system_user in system_user_list %}
<option value="{{ system_user.username }}" {% if system_user.username == system_user %} selected {% endif %}>{{ system_user.username }}</option>
{% endfor %}
</select>
</div>
<div class="input-group">
<input type="text" class="form-control input-sm" name="keyword" placeholder="Search" value="{{ keyword }}">
</div>
<div class="input-group">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
搜索
</button>
</div>
</div>
</form>
{% endblock %}
{% block table_container %}
<table class="footable table table-stripped toggle-arrow-tiny" data-page="false">
<thead>
......@@ -15,6 +66,8 @@
<th>Command</th>
<th>Username</th>
<th>IP</th>
<th>System user</th>
<th>Proxy log</th>
<th>Datetime</th>
<th data-hide="all">Output</th>
</tr>
......@@ -22,10 +75,12 @@
<tbody>
{% for command in command_list %}
<tr>
<td>{{ command.command_no }}</td>
<td>{{ command.id }}</td>
<td>{{ command.command }}</td>
<td>{{ command.proxy_log.username }}</td>
<td>{{ command.proxy_log.ip }}</td>
<td>{{ command.proxy_log.system_user }}</td>
<td><a href="{% url 'audits:proxy-log-detail' pk=command.proxy_log.id %}">{{ command.proxy_log.id}}</a></td>
<td>{{ command.datetime }}</td>
<td>{{ command.output_decode |safe }}</td>
</tr>
......@@ -39,6 +94,13 @@
<script>
$(document).ready(function () {
$('.footable').footable();
$('.select2').select2();
$('#date .input-daterange').datepicker({
dateFormat: 'mm/dd/yy',
keyboardNavigation: false,
forceParse: false,
autoclose: true
});
});
</script>
{% endblock %}
......
{% extends '_base_list.html' %}
{% load i18n static %}
{% block custom_head_css_js %}
{{ block.super }}
<link href="{% static "css/plugins/footable/footable.core.css" %}" rel="stylesheet">
<link href="{% static "css/plugins/layer/layer.css" %}" rel="stylesheet">
{% load i18n %}
{% load static %}
{% load common_tags %}
{% block content_left_head %}
<link href="{% static 'css/plugins/datepicker/datepicker3.css' %}" rel="stylesheet">
<style>
div.dataTables_wrapper div.dataTables_filter,
.dataTables_length {
float: right !important;
#search_btn {
margin-bottom: 0;
}
</style>
{% endblock %}
div.dataTables_wrapper div.dataTables_filter {
margin-left: 15px;
}
</style>
{% block table_search %}
<form id="search_form" method="get" action="" class="pull-right form-inline">
<div class="form-group" id="date">
<div class="input-daterange input-group" id="datepicker">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_from" value="{{ date_from }}">
<span class="input-group-addon">to</span>
<input type="text" class="input-sm form-control" style="width: 100px;" name="date_to" value="{{ date_to }}">
</div>
</div>
<div class="input-group">
<select class="select2 form-control" name="username">
<option value="">{% trans 'Select user' %}</option>
{% for user in user_list %}
<option value="{{ user.username }}" {% if user.username == username %} selected {% endif %}>{{ user.username }}</option>
{% endfor %}
</select>
</div>
<div class="input-group">
<select class="select2 form-control" name="ip">
<option value="">{% trans 'Select asset' %}</option>
{% for asset in asset_list %}
<option value="{{ asset.ip }}" {% if asset.ip == ip %} selected {% endif %}>{{ asset.ip }}</option>
{% endfor %}
</select>
</div>
<div class="input-group">
<select class="select2 form-control" name="system_user">
<option value="">{% trans 'System user' %}</option>
{% for su in system_user_list %}
<option value="{{ su.username }}" {% if su.username == system_user %} selected {% endif %}>{{ su.username }}</option>
{% endfor %}
</select>
</div>
<div class="input-group">
<input type="text" class="form-control input-sm" name="keyword" placeholder="Search" value="{{ keyword }}">
</div>
<div class="input-group">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
搜索
</button>
</div>
</div>
</form>
{% endblock %}
{% block table_search %}{% endblock %}
{% block table_container %}
{#<div class="uc pull-left m-l-5 m-r-5"><a href="{% url "users:user-create" %}" class="btn btn-sm btn-primary"> {% trans "Create user" %} </a></div>#}
<table class="table table-striped table-bordered table-hover " id="proxy_log_list_table" >
<thead>
<tr>
<th class="text-center">
<div class="checkbox checkbox-default">
<input type="checkbox" class="ipt_check_all">
</div>
</th>
<th class="text-center">{% trans 'Username' %}</th>
<th class="text-center">{% trans 'IP' %}</th>
<th class="text-center">{% trans 'System user' %}</th>
{# <th class="text-center">{% trans 'Login type' %}</th>#}
<th class="text-center">{% trans 'Command' %}</th>
<th class="text-center">{% trans 'Success' %}</th>
<th class="text-center">{% trans 'Finished' %}</th>
<th class="text-center">{% trans 'Date start' %}</th>
<th class="text-center">{% trans 'Time' %}</th>
<th class="text-center">{% trans 'Action' %}</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
{% block table_head %}
<th class="text-center">{% trans 'ID' %}</th>
<th class="text-center">{% trans 'Username' %}</th>
<th class="text-center">{% trans 'IP' %}</th>
<th class="text-center">{% trans 'System user' %}</th>
<th class="text-center">{% trans 'Command' %}</th>
<th class="text-center">{% trans 'Success' %}</th>
<th class="text-center">{% trans 'Finished' %}</th>
<th class="text-center">{% trans 'Date start' %}</th>
<th class="text-center">{% trans 'Time' %}</th>
{% endblock %}
{% block custom_foot_js %}
<script src="{% static 'js/jquery.form.min.js' %}"></script>
<script src="{% static "js/plugins/layer/layer.js" %}"></script>
<script>
$(document).ready(function(){
var options = {
ele: $('#proxy_log_list_table'),
columnDefs: [
{targets: 1, createdCell: function (td, cellData, rowData) {
var detail_btn = '<a href="{% url "users:user-detail" pk=99991937 %}">' + cellData + '</a>';
$(td).html(detail_btn.replace('99991937', rowData.id));
}},
{targets: 4, createdCell: function (td, cellData, rowData) {
if (cellData) {
$(td).html('<a url="{% url "audits:proxy-log-commands-list" pk=99991938 %}" class="commands">99991937</a>'
.replace('99991937', cellData)
.replace('99991938',rowData.id))
}
}},
{targets: 5, createdCell: function (td, cellData) {
if (cellData) {
$(td).html('<i class="fa fa-times text-danger"></i>')
} else {
$(td).html('<i class="fa fa-check text-navy"></i>')
}
}},
{targets: 6, createdCell: function (td, cellData) {
if (!cellData) {
$(td).html('<i class="fa fa-times text-danger"></i>')
} else {
$(td).html('<i class="fa fa-check text-navy"></i>')
}
}},
{targets: 9, createdCell: function (td, cellData, rowData) {
var detail_btn = '<a href="{% url "audits:proxy-log-detail" pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Detail" %}</a>'
.replace('99991937', cellData);
var delete_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_delete" data-uid="99991937" data-name="99991938">{% trans "Delete" %}</a>'
.replace('99991937', cellData)
.replace('99991938', rowData.name);
$(td).html(detail_btn + delete_btn)
}}
],
ajax_url: '{% url "audits:proxy-log-list-create-api" %}',
columns: [{data: function(){return ""}}, {data: "name" }, {data: "ip"},
{data: "system_user"}, {data: "command_length"}, {data: 'was_failed'},
{data: "is_finished"}, {data: "date_start"}, {data: 'time'}, {data: 'id'}],
op_html: $('#actions').html()
};
jumpserver.initDataTable(options);
}).on('click', '.commands', function () {
var url = $(this).attr('url');
layer.open({
type: 2,
title: '很多时候,我们想最大化看,比如像这个页面。',
shadeClose: true,
shade: false,
maxmin: true, //开启最大化最小化按钮
area: ['893px', '600px'],
content: url
});
})
</script>
{% block table_body %}
{% for proxy_log in proxy_log_list %}
<tr class="gradeX">
<td class="text-center">
<a href="{% url 'audits:proxy-log-detail' pk=proxy_log.id %}">{{ proxy_log.id }}</a>
</td>
<td class="text-center">{{ proxy_log.username }}</td>
<td class="text-center">{{ proxy_log.ip }}</td>
<td class="text-center">{{ proxy_log.system_user }}</td>
<td class="text-center">{{ proxy_log.commands.all|length}}</td>
<td class="text-center">
{% if proxy_log.was_failed %}
<i class="fa fa-times text-danger"></i>
{% else %}
<i class="fa fa-check text-navy"></i>
{% endif %}
</td>
<td class="text-center">
{% if proxy_log.is_finished %}
<i class="fa fa-check text-navy"></i>
{% else %}
<i class="fa fa-times text-danger"></i>
{% endif %}
</td>
<td class="text-center">{{ proxy_log.date_start }}</td>
<td class="text-center">{{ proxy_log.date_finished|timeuntil:proxy_log.date_start }}</td>
</tr>
{% endfor %}
{% endblock %}
{% block custom_foot_js %}
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
<script>
$(document).ready(function() {
$('table').DataTable({
"searching": false,
"paging": false,
"order": []
});
$('.select2').select2();
$('#date .input-daterange').datepicker({
dateFormat: 'mm/dd/yy',
keyboardNavigation: false,
forceParse: false,
autoclose: true
});
})
</script>
{% endblock %}
# ~*~ coding: utf-8 ~*~
#
import datetime
from django.views.generic import ListView, UpdateView, DeleteView, DetailView, TemplateView
from django.views.generic.edit import SingleObjectMixin
from django.utils.translation import ugettext as _
from django.utils import timezone
from django.urls import reverse_lazy
from django.conf import settings
from django.db.models import Q
from .models import ProxyLog, CommandLog
from .utils import AdminUserRequiredMixin
from .hands import User, Asset, SystemUser
class ProxyLogListView(TemplateView):
seven_days_ago_s = (datetime.datetime.now()-datetime.timedelta(7)).strftime('%m/%d/%Y')
now_s = datetime.datetime.now().strftime('%m/%d/%Y')
class ProxyLogListView(AdminUserRequiredMixin, ListView):
model = ProxyLog
template_name = 'audits/proxy_log_list.html'
context_object_name = 'proxy_log_list'
def get_queryset(self):
self.queryset = super(ProxyLogListView, self).get_queryset()
self.keyword = keyword = self.request.GET.get('keyword', '')
self.username = username = self.request.GET.get('username', '')
self.ip = ip = self.request.GET.get('ip', '')
self.system_user = system_user = self.request.GET.get('system_user', '')
self.date_from_s = date_from_s = self.request.GET.get('date_from', '%s' % seven_days_ago_s)
self.date_to_s = date_to_s = self.request.GET.get('date_to', '%s' % now_s)
if date_from_s:
date_from = timezone.datetime.strptime(date_from_s, '%m/%d/%Y')
self.queryset = self.queryset.filter(date_start__gt=date_from)
if date_to_s:
date_to = timezone.datetime.strptime(date_to_s + ' 23:59:59', '%m/%d/%Y %H:%M:%S')
self.queryset = self.queryset.filter(date_start__lt=date_to)
if username:
self.queryset = self.queryset.filter(username=username)
if ip:
self.queryset = self.queryset.filter(ip=ip)
if system_user:
self.queryset = self.queryset.filter(system_user=system_user)
if keyword:
self.queryset = self.queryset.filter(Q(username__contains=keyword) |
Q(name__icontains=keyword) |
Q(hostname__icontains=keyword) |
Q(ip__icontains=keyword) |
Q(system_user__icontains=keyword)).distinct()
return self.queryset
def get_context_data(self, **kwargs):
context = super(ProxyLogListView, self).get_context_data(**kwargs)
context.update({'app': _('Audits'), 'action': _('Proxy log list')})
return context
context = {
'app': _('Audits'),
'action': _('Proxy log list'),
'user_list': User.objects.all().order_by('username'),
'asset_list': Asset.objects.all().order_by('ip'),
'system_user_list': SystemUser.objects.all().order_by('name'),
'keyword': self.keyword,
'date_from': self.date_from_s,
'date_to': self.date_to_s,
'username': self.username,
'ip': self.ip,
'system_user': self.system_user,
}
kwargs.update(context)
return super(ProxyLogListView, self).get_context_data(**kwargs)
class ProxyLogDetailView(AdminUserRequiredMixin, SingleObjectMixin, ListView):
......@@ -29,7 +80,7 @@ class ProxyLogDetailView(AdminUserRequiredMixin, SingleObjectMixin, ListView):
return super(ProxyLogDetailView, self).get(request, *args, **kwargs)
def get_queryset(self):
return list(self.object.command_log.all())
return list(self.object.commands.all())
def get_context_data(self, **kwargs):
context = {
......@@ -58,22 +109,46 @@ class CommandLogListView(AdminUserRequiredMixin, ListView):
context_object_name = 'command_list'
def get_queryset(self):
# Todo: Default order by lose asset connection num
self.queryset = super(CommandLogListView, self).get_queryset()
self.keyword = keyword = self.request.GET.get('keyword', '')
self.sort = sort = self.request.GET.get('sort', '-datetime')
self.username = username = self.request.GET.get('username', '')
self.ip = ip = self.request.GET.get('ip', '')
self.system_user = system_user = self.request.GET.get('system_user', '')
self.date_from_s = date_from_s = self.request.GET.get('date_from', '%s' % seven_days_ago_s)
self.date_to_s = date_to_s = self.request.GET.get('date_to', '%s' % now_s)
if date_from_s:
date_from = timezone.datetime.strptime(date_from_s, '%m/%d/%Y')
self.queryset = self.queryset.filter(datetime__gt=date_from)
if date_to_s:
date_to = timezone.datetime.strptime(date_to_s + ' 23:59:59', '%m/%d/%Y %H:%M:%S')
self.queryset = self.queryset.filter(datetime__lt=date_to)
if username:
self.queryset = self.queryset.filter(proxy_log__username=username)
if ip:
self.queryset = self.queryset.filter(proxy_log__ip=ip)
if system_user:
self.queryset = self.queryset.filter(proxy_log__system_user=system_user)
if keyword:
self.queryset = self.queryset.filter()
self.queryset = self.queryset.filter(command=keyword)
if sort:
self.queryset = self.queryset.order_by(sort)
return self.queryset
def get_context_data(self, **kwargs):
context = {
'app': 'Audits',
'action': 'Command log list'
'app': _('Audits'),
'action': _('Command log list'),
'user_list': User.objects.all().order_by('username'),
'asset_list': Asset.objects.all().order_by('ip'),
'system_user_list': SystemUser.objects.all().order_by('name'),
'keyword': self.keyword,
'date_from': self.date_from_s,
'date_to': self.date_to_s,
'username': self.username,
'ip': self.ip,
'system_user': self.system_user,
}
kwargs.update(context)
return super(CommandLogListView, self).get_context_data(**kwargs)
......@@ -8,7 +8,7 @@ import string
import logging
import datetime
from itsdangerous import Signer, TimedJSONWebSignatureSerializer, JSONWebSignatureSerializer, TimestampSigner, \
from itsdangerous import TimedJSONWebSignatureSerializer, JSONWebSignatureSerializer, \
BadSignature, SignatureExpired
from django.shortcuts import reverse as dj_reverse
from django.conf import settings
......@@ -34,31 +34,31 @@ def get_object_or_none(model, **kwargs):
return obj
def encrypt(*args, **kwargs):
try:
return signing.dumps(*args, **kwargs)
except signing.BadSignature:
return ''
def decrypt(*args, **kwargs):
try:
return signing.loads(*args, **kwargs)
except signing.BadSignature:
return ''
class Signer(object):
def __init__(self, secret_key=SECRET_KEY):
self.secret_key = secret_key
def sign(self, value):
s = JSONWebSignatureSerializer(self.secret_key)
return s.dumps(value)
def sign(value, secret_key=SECRET_KEY):
signer = TimestampSigner(secret_key)
return signer.sign(value)
def unsign(self, value):
s = JSONWebSignatureSerializer(self.secret_key)
try:
return s.loads(value)
except BadSignature:
return None
def sign_t(self, value, expires_in=3600):
s = TimedJSONWebSignatureSerializer(self.secret_key, expires_in=expires_in)
return s.dumps(value)
def unsign(value, max_age=3600, secret_key=SECRET_KEY):
signer = TimestampSigner(secret_key)
try:
return signer.unsign(value, max_age=max_age)
except (BadSignature, SignatureExpired):
return ''
def unsign_t(self, value):
s = TimedJSONWebSignatureSerializer(self.secret_key)
try:
return s.loads(value)
except (BadSignature, SignatureExpired):
return None
def date_expired_default():
......@@ -69,10 +69,6 @@ def date_expired_default():
return timezone.now() + timezone.timedelta(days=365*years)
def sign(value):
return SIGNER.sign(value)
def combine_seq(s1, s2, callback=None):
for s in (s1, s2):
if not hasattr(s, '__iter__'):
......@@ -165,3 +161,5 @@ def timesince(dt, since='', default="just now"):
return "%d %s" % (period, singular if period == 1 else plural)
return default
signer = Signer()
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
[{"model": "users.usergroup", "pk": 1, "fields": {"is_discard": false, "discard_time": null, "name": "Default", "comment": "Default user group for all user", "date_created": "2016-10-27T15:57:54Z", "created_by": "System"}}, {"model": "assets.assetextend", "pk": 1, "fields": {"key": "status", "value": "In use", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 2, "fields": {"key": "status", "value": "Out of use", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 3, "fields": {"key": "type", "value": "Server", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 4, "fields": {"key": "type", "value": "VM", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 5, "fields": {"key": "type", "value": "Switch", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 6, "fields": {"key": "type", "value": "Router", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 7, "fields": {"key": "type", "value": "Firewall", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 8, "fields": {"key": "type", "value": "Storage", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 9, "fields": {"key": "env", "value": "Production", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 10, "fields": {"key": "env", "value": "Development", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 11, "fields": {"key": "env", "value": "Testing", "created_by": "System", "date_created": "2016-10-27T15:58:15Z", "comment": ""}}, {"model": "assets.assetgroup", "pk": 1, "fields": {"name": "Default", "created_by": "", "date_created": "2016-10-27T15:58:15Z", "comment": "Default asset group", "system_users": []}}, {"model": "contenttypes.contenttype", "pk": 1, "fields": {"app_label": "users", "model": "user"}}, {"model": "contenttypes.contenttype", "pk": 2, "fields": {"app_label": "users", "model": "usergroup"}}, {"model": "contenttypes.contenttype", "pk": 3, "fields": {"app_label": "assets", "model": "adminuser"}}, {"model": "contenttypes.contenttype", "pk": 4, "fields": {"app_label": "assets", "model": "systemuser"}}, {"model": "contenttypes.contenttype", "pk": 5, "fields": {"app_label": "assets", "model": "assetgroup"}}, {"model": "contenttypes.contenttype", "pk": 6, "fields": {"app_label": "assets", "model": "asset"}}, {"model": "contenttypes.contenttype", "pk": 7, "fields": {"app_label": "assets", "model": "tag"}}, {"model": "contenttypes.contenttype", "pk": 8, "fields": {"app_label": "assets", "model": "assetextend"}}, {"model": "contenttypes.contenttype", "pk": 9, "fields": {"app_label": "assets", "model": "idc"}}, {"model": "contenttypes.contenttype", "pk": 10, "fields": {"app_label": "perms", "model": "assetpermission"}}, {"model": "contenttypes.contenttype", "pk": 11, "fields": {"app_label": "audits", "model": "loginlog"}}, {"model": "contenttypes.contenttype", "pk": 12, "fields": {"app_label": "audits", "model": "commandlog"}}, {"model": "contenttypes.contenttype", "pk": 13, "fields": {"app_label": "audits", "model": "proxylog"}}, {"model": "contenttypes.contenttype", "pk": 14, "fields": {"app_label": "terminal", "model": "terminalheatbeat"}}, {"model": "contenttypes.contenttype", "pk": 15, "fields": {"app_label": "terminal", "model": "terminal"}}, {"model": "contenttypes.contenttype", "pk": 16, "fields": {"app_label": "authtoken", "model": "token"}}, {"model": "contenttypes.contenttype", "pk": 17, "fields": {"app_label": "captcha", "model": "captchastore"}}, {"model": "contenttypes.contenttype", "pk": 18, "fields": {"app_label": "auth", "model": "permission"}}, {"model": "contenttypes.contenttype", "pk": 19, "fields": {"app_label": "auth", "model": "group"}}, {"model": "contenttypes.contenttype", "pk": 20, "fields": {"app_label": "contenttypes", "model": "contenttype"}}, {"model": "contenttypes.contenttype", "pk": 21, "fields": {"app_label": "sessions", "model": "session"}}, {"model": "auth.permission", "pk": 1, "fields": {"name": "Can add user", "content_type": 1, "codename": "add_user"}}, {"model": "auth.permission", "pk": 2, "fields": {"name": "Can change user", "content_type": 1, "codename": "change_user"}}, {"model": "auth.permission", "pk": 3, "fields": {"name": "Can delete user", "content_type": 1, "codename": "delete_user"}}, {"model": "auth.permission", "pk": 4, "fields": {"name": "Can add user group", "content_type": 2, "codename": "add_usergroup"}}, {"model": "auth.permission", "pk": 5, "fields": {"name": "Can change user group", "content_type": 2, "codename": "change_usergroup"}}, {"model": "auth.permission", "pk": 6, "fields": {"name": "Can delete user group", "content_type": 2, "codename": "delete_usergroup"}}, {"model": "auth.permission", "pk": 7, "fields": {"name": "Can add admin user", "content_type": 3, "codename": "add_adminuser"}}, {"model": "auth.permission", "pk": 8, "fields": {"name": "Can change admin user", "content_type": 3, "codename": "change_adminuser"}}, {"model": "auth.permission", "pk": 9, "fields": {"name": "Can delete admin user", "content_type": 3, "codename": "delete_adminuser"}}, {"model": "auth.permission", "pk": 10, "fields": {"name": "Can add system user", "content_type": 4, "codename": "add_systemuser"}}, {"model": "auth.permission", "pk": 11, "fields": {"name": "Can change system user", "content_type": 4, "codename": "change_systemuser"}}, {"model": "auth.permission", "pk": 12, "fields": {"name": "Can delete system user", "content_type": 4, "codename": "delete_systemuser"}}, {"model": "auth.permission", "pk": 13, "fields": {"name": "Can add asset group", "content_type": 5, "codename": "add_assetgroup"}}, {"model": "auth.permission", "pk": 14, "fields": {"name": "Can change asset group", "content_type": 5, "codename": "change_assetgroup"}}, {"model": "auth.permission", "pk": 15, "fields": {"name": "Can delete asset group", "content_type": 5, "codename": "delete_assetgroup"}}, {"model": "auth.permission", "pk": 16, "fields": {"name": "Can add asset", "content_type": 6, "codename": "add_asset"}}, {"model": "auth.permission", "pk": 17, "fields": {"name": "Can change asset", "content_type": 6, "codename": "change_asset"}}, {"model": "auth.permission", "pk": 18, "fields": {"name": "Can delete asset", "content_type": 6, "codename": "delete_asset"}}, {"model": "auth.permission", "pk": 19, "fields": {"name": "Can add tag", "content_type": 7, "codename": "add_tag"}}, {"model": "auth.permission", "pk": 20, "fields": {"name": "Can change tag", "content_type": 7, "codename": "change_tag"}}, {"model": "auth.permission", "pk": 21, "fields": {"name": "Can delete tag", "content_type": 7, "codename": "delete_tag"}}, {"model": "auth.permission", "pk": 22, "fields": {"name": "Can add asset extend", "content_type": 8, "codename": "add_assetextend"}}, {"model": "auth.permission", "pk": 23, "fields": {"name": "Can change asset extend", "content_type": 8, "codename": "change_assetextend"}}, {"model": "auth.permission", "pk": 24, "fields": {"name": "Can delete asset extend", "content_type": 8, "codename": "delete_assetextend"}}, {"model": "auth.permission", "pk": 25, "fields": {"name": "Can add idc", "content_type": 9, "codename": "add_idc"}}, {"model": "auth.permission", "pk": 26, "fields": {"name": "Can change idc", "content_type": 9, "codename": "change_idc"}}, {"model": "auth.permission", "pk": 27, "fields": {"name": "Can delete idc", "content_type": 9, "codename": "delete_idc"}}, {"model": "auth.permission", "pk": 28, "fields": {"name": "Can add asset permission", "content_type": 10, "codename": "add_assetpermission"}}, {"model": "auth.permission", "pk": 29, "fields": {"name": "Can change asset permission", "content_type": 10, "codename": "change_assetpermission"}}, {"model": "auth.permission", "pk": 30, "fields": {"name": "Can delete asset permission", "content_type": 10, "codename": "delete_assetpermission"}}, {"model": "auth.permission", "pk": 31, "fields": {"name": "Can add login log", "content_type": 11, "codename": "add_loginlog"}}, {"model": "auth.permission", "pk": 32, "fields": {"name": "Can change login log", "content_type": 11, "codename": "change_loginlog"}}, {"model": "auth.permission", "pk": 33, "fields": {"name": "Can delete login log", "content_type": 11, "codename": "delete_loginlog"}}, {"model": "auth.permission", "pk": 34, "fields": {"name": "Can add command log", "content_type": 12, "codename": "add_commandlog"}}, {"model": "auth.permission", "pk": 35, "fields": {"name": "Can change command log", "content_type": 12, "codename": "change_commandlog"}}, {"model": "auth.permission", "pk": 36, "fields": {"name": "Can delete command log", "content_type": 12, "codename": "delete_commandlog"}}, {"model": "auth.permission", "pk": 37, "fields": {"name": "Can add proxy log", "content_type": 13, "codename": "add_proxylog"}}, {"model": "auth.permission", "pk": 38, "fields": {"name": "Can change proxy log", "content_type": 13, "codename": "change_proxylog"}}, {"model": "auth.permission", "pk": 39, "fields": {"name": "Can delete proxy log", "content_type": 13, "codename": "delete_proxylog"}}, {"model": "auth.permission", "pk": 40, "fields": {"name": "Can add terminal heatbeat", "content_type": 14, "codename": "add_terminalheatbeat"}}, {"model": "auth.permission", "pk": 41, "fields": {"name": "Can change terminal heatbeat", "content_type": 14, "codename": "change_terminalheatbeat"}}, {"model": "auth.permission", "pk": 42, "fields": {"name": "Can delete terminal heatbeat", "content_type": 14, "codename": "delete_terminalheatbeat"}}, {"model": "auth.permission", "pk": 43, "fields": {"name": "Can add terminal", "content_type": 15, "codename": "add_terminal"}}, {"model": "auth.permission", "pk": 44, "fields": {"name": "Can change terminal", "content_type": 15, "codename": "change_terminal"}}, {"model": "auth.permission", "pk": 45, "fields": {"name": "Can delete terminal", "content_type": 15, "codename": "delete_terminal"}}, {"model": "auth.permission", "pk": 46, "fields": {"name": "Can add Token", "content_type": 16, "codename": "add_token"}}, {"model": "auth.permission", "pk": 47, "fields": {"name": "Can change Token", "content_type": 16, "codename": "change_token"}}, {"model": "auth.permission", "pk": 48, "fields": {"name": "Can delete Token", "content_type": 16, "codename": "delete_token"}}, {"model": "auth.permission", "pk": 49, "fields": {"name": "Can add captcha store", "content_type": 17, "codename": "add_captchastore"}}, {"model": "auth.permission", "pk": 50, "fields": {"name": "Can change captcha store", "content_type": 17, "codename": "change_captchastore"}}, {"model": "auth.permission", "pk": 51, "fields": {"name": "Can delete captcha store", "content_type": 17, "codename": "delete_captchastore"}}, {"model": "auth.permission", "pk": 52, "fields": {"name": "Can add permission", "content_type": 18, "codename": "add_permission"}}, {"model": "auth.permission", "pk": 53, "fields": {"name": "Can change permission", "content_type": 18, "codename": "change_permission"}}, {"model": "auth.permission", "pk": 54, "fields": {"name": "Can delete permission", "content_type": 18, "codename": "delete_permission"}}, {"model": "auth.permission", "pk": 55, "fields": {"name": "Can add group", "content_type": 19, "codename": "add_group"}}, {"model": "auth.permission", "pk": 56, "fields": {"name": "Can change group", "content_type": 19, "codename": "change_group"}}, {"model": "auth.permission", "pk": 57, "fields": {"name": "Can delete group", "content_type": 19, "codename": "delete_group"}}, {"model": "auth.permission", "pk": 58, "fields": {"name": "Can add content type", "content_type": 20, "codename": "add_contenttype"}}, {"model": "auth.permission", "pk": 59, "fields": {"name": "Can change content type", "content_type": 20, "codename": "change_contenttype"}}, {"model": "auth.permission", "pk": 60, "fields": {"name": "Can delete content type", "content_type": 20, "codename": "delete_contenttype"}}, {"model": "auth.permission", "pk": 61, "fields": {"name": "Can add session", "content_type": 21, "codename": "add_session"}}, {"model": "auth.permission", "pk": 62, "fields": {"name": "Can change session", "content_type": 21, "codename": "change_session"}}, {"model": "auth.permission", "pk": 63, "fields": {"name": "Can delete session", "content_type": 21, "codename": "delete_session"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$WuO8UbbG5XJi$mVNFUuecbT8zpsCHmOWYb/NytH3mwqEE3wRl9ALT7Xs=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-10-27T15:57:54Z", "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", "is_first_login": false, "date_expired": "2086-10-10T15:57:54Z", "created_by": "System", "user_permissions": [], "groups": [1]}}, {"model": "authtoken.token", "pk": "9985f19dcd935bb2dfba7a3ce00d5d11bb5168d6", "fields": {"user": 1, "created": "2016-10-27T15:57:54Z"}}]
\ No newline at end of file
[{"model": "users.usergroup", "pk": 1, "fields": {"is_discard": false, "discard_time": null, "name": "Default", "comment": "Default user group for all user", "date_created": "2016-11-02T14:49:50Z", "created_by": "System"}}, {"model": "assets.assetextend", "pk": 1, "fields": {"key": "status", "value": "In use", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 2, "fields": {"key": "status", "value": "Out of use", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 3, "fields": {"key": "type", "value": "Server", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 4, "fields": {"key": "type", "value": "VM", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 5, "fields": {"key": "type", "value": "Switch", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 6, "fields": {"key": "type", "value": "Router", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 7, "fields": {"key": "type", "value": "Firewall", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 8, "fields": {"key": "type", "value": "Storage", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 9, "fields": {"key": "env", "value": "Production", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 10, "fields": {"key": "env", "value": "Development", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetextend", "pk": 11, "fields": {"key": "env", "value": "Testing", "created_by": "System", "date_created": "2016-11-02T14:51:53Z", "comment": ""}}, {"model": "assets.assetgroup", "pk": 1, "fields": {"name": "Default", "created_by": "", "date_created": "2016-11-02T14:51:53Z", "comment": "Default asset group", "system_users": []}}, {"model": "users.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$30000$y45nsj5IDfVi$KUXoECb9rZJZ2ZosQSxi9anmj2oY5LAr1MdJby/xEzU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-11-02T14:51:45Z", "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", "is_first_login": false, "date_expired": "2086-10-16T14:51:45Z", "created_by": "System", "user_permissions": [], "groups": [1]}}]
[{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_created": "2016-09-05T11:39:25.770Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$5ReHkQOQA2Hk$DIW0b5U/uK+U0xqjA3QpYvBcODNhm2MPCm7YWbQys3I=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:39:25.771Z", "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", "is_first_login": false, "date_expired": "2086-08-19T11:39:25.771Z", "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-09-05T11:39:25.770Z", "created_by": "System"}}, {"model": "users.usergroup", "pk": 2, "fields": {"name": "Scott Brooks", "comment": "Suspendisse ornare consequat lectus.", "date_added": "2016-09-05T11:40:28.122Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 3, "fields": {"name": "Rebecca Jones", "comment": "In eleifend quam a odio.", "date_added": "2016-09-05T11:40:28.125Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 4, "fields": {"name": "Wayne Simpson", "comment": "Nulla nisl.", "date_added": "2016-09-05T11:40:28.129Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 5, "fields": {"name": "Scott Lee", "comment": "Mauris sit amet eros.", "date_added": "2016-09-05T11:40:28.133Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 6, "fields": {"name": "Stephen Franklin", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio.", "date_added": "2016-09-05T11:40:28.135Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 7, "fields": {"name": "Patricia Hamilton", "comment": "Ut at dolor quis odio consequat varius.", "date_added": "2016-09-05T11:40:28.137Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 8, "fields": {"name": "Tina Armstrong", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_added": "2016-09-05T11:40:28.139Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 9, "fields": {"name": "Sandra Walker", "comment": "Nulla ac enim.", "date_added": "2016-09-05T11:40:28.141Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 10, "fields": {"name": "Ann Washington", "comment": "Vestibulum quam sapien, varius ut, blandit non, interdum in, ante.", "date_added": "2016-09-05T11:40:28.143Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 11, "fields": {"name": "Theresa Lynch", "comment": "Aliquam quis turpis eget elit sodales scelerisque.", "date_added": "2016-09-05T11:40:28.146Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 12, "fields": {"name": "Larry Martinez", "comment": "Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis.", "date_added": "2016-09-05T11:40:28.148Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 13, "fields": {"name": "Emily Nelson", "comment": "Praesent blandit lacinia erat.", "date_added": "2016-09-05T11:40:28.150Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 14, "fields": {"name": "Cheryl Wright", "comment": "Duis ac nibh.", "date_added": "2016-09-05T11:40:28.152Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 15, "fields": {"name": "Rachel Sims", "comment": "Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla.", "date_added": "2016-09-05T11:40:28.154Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 16, "fields": {"name": "Emily Frazier", "comment": "Nullam molestie nibh in lectus.", "date_added": "2016-09-05T11:40:28.156Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 17, "fields": {"name": "Joyce Davis", "comment": "Nunc rhoncus dui vel sem.", "date_added": "2016-09-05T11:40:28.158Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 18, "fields": {"name": "Anna Rose", "comment": "Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.", "date_added": "2016-09-05T11:40:28.160Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 19, "fields": {"name": "Diana Ellis", "comment": "Cras in purus eu magna vulputate luctus.", "date_added": "2016-09-05T11:40:28.162Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 20, "fields": {"name": "Paula Collins", "comment": "Nulla tellus.", "date_added": "2016-09-05T11:40:28.164Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 21, "fields": {"name": "Judith Simmons", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_added": "2016-09-05T11:40:28.166Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 22, "fields": {"name": "Rebecca Patterson", "comment": "Fusce posuere felis sed lacus.", "date_added": "2016-09-05T11:40:28.168Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 23, "fields": {"name": "Kathleen Chavez", "comment": "Nunc rhoncus dui vel sem.", "date_added": "2016-09-05T11:40:28.170Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 24, "fields": {"name": "Sharon Johnston", "comment": "Suspendisse potenti.", "date_added": "2016-09-05T11:40:28.173Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 25, "fields": {"name": "Kathryn Cunningham", "comment": "Pellentesque ultrices mattis odio.", "date_added": "2016-09-05T11:40:28.175Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 26, "fields": {"name": "Julie Nguyen", "comment": "Donec ut mauris eget massa tempor convallis.", "date_added": "2016-09-05T11:40:28.177Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 27, "fields": {"name": "Nicole Lynch", "comment": "Proin interdum mauris non ligula pellentesque ultrices.", "date_added": "2016-09-05T11:40:28.179Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 28, "fields": {"name": "Diana Williamson", "comment": "Proin risus.", "date_added": "2016-09-05T11:40:28.181Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 29, "fields": {"name": "Lori Ellis", "comment": "Integer non velit.", "date_added": "2016-09-05T11:40:28.183Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 30, "fields": {"name": "Heather Ruiz", "comment": "Donec dapibus.", "date_added": "2016-09-05T11:40:28.185Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 31, "fields": {"name": "Norma Stevens", "comment": "Curabitur convallis.", "date_added": "2016-09-05T11:40:28.188Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 32, "fields": {"name": "Ann Murphy", "comment": "In eleifend quam a odio.", "date_added": "2016-09-05T11:40:28.190Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 33, "fields": {"name": "Stephanie Ellis", "comment": "Donec ut mauris eget massa tempor convallis.", "date_added": "2016-09-05T11:40:28.192Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 34, "fields": {"name": "Katherine Davis", "comment": "Nulla ac enim.", "date_added": "2016-09-05T11:40:28.194Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 35, "fields": {"name": "Judy Clark", "comment": "Vestibulum ac est lacinia nisi venenatis tristique.", "date_added": "2016-09-05T11:40:28.196Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 36, "fields": {"name": "Shirley Warren", "comment": "Integer ac neque.", "date_added": "2016-09-05T11:40:28.198Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 37, "fields": {"name": "Beverly Hanson", "comment": "In est risus, auctor sed, tristique in, tempus sit amet, sem.", "date_added": "2016-09-05T11:40:28.199Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 38, "fields": {"name": "Dorothy Olson", "comment": "Nulla suscipit ligula in lacus.", "date_added": "2016-09-05T11:40:28.202Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 39, "fields": {"name": "Amanda Hudson", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_added": "2016-09-05T11:40:28.204Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 40, "fields": {"name": "Cheryl Stanley", "comment": "Curabitur gravida nisi at nibh.", "date_added": "2016-09-05T11:40:28.206Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 41, "fields": {"name": "Anne Simpson", "comment": "Sed ante.", "date_added": "2016-09-05T11:40:28.208Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 42, "fields": {"name": "Linda Fernandez", "comment": "Ut tellus.", "date_added": "2016-09-05T11:40:28.210Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 43, "fields": {"name": "Nicole Cruz", "comment": "Nulla facilisi.", "date_added": "2016-09-05T11:40:28.212Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 44, "fields": {"name": "Jane Castillo", "comment": "Nunc nisl.", "date_added": "2016-09-05T11:40:28.214Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 45, "fields": {"name": "Marilyn Thompson", "comment": "Aenean auctor gravida sem.", "date_added": "2016-09-05T11:40:28.216Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 46, "fields": {"name": "Jessica Riley", "comment": "Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla.", "date_added": "2016-09-05T11:40:28.218Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 47, "fields": {"name": "Maria Wood", "comment": "Donec semper sapien a libero.", "date_added": "2016-09-05T11:40:28.220Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 48, "fields": {"name": "Christine Phillips", "comment": "Ut tellus.", "date_added": "2016-09-05T11:40:28.222Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 49, "fields": {"name": "Ruby Riley", "comment": "Phasellus id sapien in sapien iaculis congue.", "date_added": "2016-09-05T11:40:28.224Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 50, "fields": {"name": "Judith Larson", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-09-05T11:40:28.225Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 51, "fields": {"name": "Jessica Cook", "comment": "Aliquam sit amet diam in magna bibendum imperdiet.", "date_added": "2016-09-05T11:40:28.227Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 52, "fields": {"name": "Stephanie Garrett", "comment": "Maecenas rhoncus aliquam lacus.", "date_added": "2016-09-05T11:40:28.230Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 53, "fields": {"name": "Nancy Alexander", "comment": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", "date_added": "2016-09-05T11:40:28.232Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 54, "fields": {"name": "Gregory Wheeler", "comment": "Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.", "date_added": "2016-09-05T11:40:28.234Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 55, "fields": {"name": "Doris Boyd", "comment": "Suspendisse potenti.", "date_added": "2016-09-05T11:40:28.236Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 56, "fields": {"name": "Pamela Day", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-09-05T11:40:28.238Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 57, "fields": {"name": "Nancy Price", "comment": "In blandit ultrices enim.", "date_added": "2016-09-05T11:40:28.240Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 58, "fields": {"name": "Rose Brooks", "comment": "Vivamus vel nulla eget eros elementum pellentesque.", "date_added": "2016-09-05T11:40:28.242Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 59, "fields": {"name": "Lori Palmer", "comment": "In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.", "date_added": "2016-09-05T11:40:28.244Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 60, "fields": {"name": "Carol Myers", "comment": "Etiam vel augue.", "date_added": "2016-09-05T11:40:28.246Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 61, "fields": {"name": "Nancy Morrison", "comment": "Ut tellus.", "date_added": "2016-09-05T11:40:28.248Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 62, "fields": {"name": "Kelly Edwards", "comment": "Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.", "date_added": "2016-09-05T11:40:28.251Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 63, "fields": {"name": "Nicole Montgomery", "comment": "Duis ac nibh.", "date_added": "2016-09-05T11:40:28.253Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 64, "fields": {"name": "Cynthia Stephens", "comment": "In quis justo.", "date_added": "2016-09-05T11:40:28.255Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 65, "fields": {"name": "Nicole Willis", "comment": "Etiam vel augue.", "date_added": "2016-09-05T11:40:28.257Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 66, "fields": {"name": "Sharon Mills", "comment": "Proin risus.", "date_added": "2016-09-05T11:40:28.259Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 67, "fields": {"name": "Phyllis Richards", "comment": "Nulla nisl.", "date_added": "2016-09-05T11:40:28.261Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 68, "fields": {"name": "Gloria Welch", "comment": "Etiam pretium iaculis justo.", "date_added": "2016-09-05T11:40:28.263Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 69, "fields": {"name": "Paula Taylor", "comment": "Cras pellentesque volutpat dui.", "date_added": "2016-09-05T11:40:28.265Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 70, "fields": {"name": "Rebecca Flores", "comment": "In blandit ultrices enim.", "date_added": "2016-09-05T11:40:28.267Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 71, "fields": {"name": "Joan Black", "comment": "In sagittis dui vel nisl.", "date_added": "2016-09-05T11:40:28.270Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 72, "fields": {"name": "Denise Watson", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-09-05T11:40:28.272Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 73, "fields": {"name": "Judith Brooks", "comment": "Nam dui.", "date_added": "2016-09-05T11:40:28.274Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 74, "fields": {"name": "Nicole Miller", "comment": "Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.", "date_added": "2016-09-05T11:40:28.276Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 75, "fields": {"name": "Jessica Graham", "comment": "Nulla tempus.", "date_added": "2016-09-05T11:40:28.278Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 76, "fields": {"name": "Carol Edwards", "comment": "Nam tristique tortor eu pede.", "date_added": "2016-09-05T11:40:28.281Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 77, "fields": {"name": "Diane Jordan", "comment": "Nulla justo.", "date_added": "2016-09-05T11:40:28.283Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 78, "fields": {"name": "Kathleen Medina", "comment": "Pellentesque viverra pede ac diam.", "date_added": "2016-09-05T11:40:28.285Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 79, "fields": {"name": "Angela Thomas", "comment": "Integer ac leo.", "date_added": "2016-09-05T11:40:28.287Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 80, "fields": {"name": "Christina Knight", "comment": "Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla.", "date_added": "2016-09-05T11:40:28.290Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 81, "fields": {"name": "Heather Medina", "comment": "Integer ac leo.", "date_added": "2016-09-05T11:40:28.292Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 82, "fields": {"name": "Heather Campbell", "comment": "Morbi quis tortor id nulla ultrices aliquet.", "date_added": "2016-09-05T11:40:28.294Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 83, "fields": {"name": "Linda Elliott", "comment": "Cras non velit nec nisi vulputate nonummy.", "date_added": "2016-09-05T11:40:28.297Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 84, "fields": {"name": "Sara Morgan", "comment": "Duis aliquam convallis nunc.", "date_added": "2016-09-05T11:40:28.299Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 85, "fields": {"name": "Laura Hudson", "comment": "Curabitur convallis.", "date_added": "2016-09-05T11:40:28.301Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 86, "fields": {"name": "Gloria Riley", "comment": "Vestibulum sed magna at nunc commodo placerat.", "date_added": "2016-09-05T11:40:28.304Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 87, "fields": {"name": "Mary Duncan", "comment": "Maecenas ut massa quis augue luctus tincidunt.", "date_added": "2016-09-05T11:40:28.306Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 88, "fields": {"name": "Doris Kelley", "comment": "Suspendisse ornare consequat lectus.", "date_added": "2016-09-05T11:40:28.308Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 89, "fields": {"name": "Dorothy Black", "comment": "Donec ut dolor.", "date_added": "2016-09-05T11:40:28.311Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 90, "fields": {"name": "Cynthia Elliott", "comment": "Donec ut dolor.", "date_added": "2016-09-05T11:40:28.313Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 91, "fields": {"name": "Anne Willis", "comment": "Mauris lacinia sapien quis libero.", "date_added": "2016-09-05T11:40:28.315Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 92, "fields": {"name": "Kimberly Lane", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "date_added": "2016-09-05T11:40:28.318Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 93, "fields": {"name": "Doris Burns", "comment": "Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.", "date_added": "2016-09-05T11:40:28.320Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 94, "fields": {"name": "Janice White", "comment": "In hac habitasse platea dictumst.", "date_added": "2016-09-05T11:40:28.323Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 95, "fields": {"name": "Irene Mills", "comment": "Aenean auctor gravida sem.", "date_added": "2016-09-05T11:40:28.325Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 96, "fields": {"name": "Jesse Carter", "comment": "Aenean fermentum.", "date_added": "2016-09-05T11:40:28.328Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 97, "fields": {"name": "Karen Watson", "comment": "Suspendisse potenti.", "date_added": "2016-09-05T11:40:28.330Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 98, "fields": {"name": "Dorothy Wilson", "comment": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.", "date_added": "2016-09-05T11:40:28.332Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 99, "fields": {"name": "Richard Andrews", "comment": "In quis justo.", "date_added": "2016-09-05T11:40:28.334Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 100, "fields": {"name": "Catherine Bowman", "comment": "Nulla tellus.", "date_added": "2016-09-05T11:40:28.336Z", "created_by": "admin"}}, {"model": "users.usergroup", "pk": 101, "fields": {"name": "Tammy Washington", "comment": "Donec dapibus.", "date_added": "2016-09-05T11:40:28.338Z", "created_by": "admin"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$5ReHkQOQA2Hk$DIW0b5U/uK+U0xqjA3QpYvBcODNhm2MPCm7YWbQys3I=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:39:25.771Z", "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", "is_first_login": false, "date_expired": "2086-08-19T11:39:25.771Z", "created_by": "System", "user_permissions": [], "groups": [1]}}, {"model": "users.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$30000$NwQ0QSmpoKgk$pnQcfgWSmAOKs9g+xeS+d5Pt2CK8NykUxhQc+507Few=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:28.488Z", "username": "debra78", "name": "Amanda Kim", "email": "pamela@lajo.name", "role": "User", "avatar": "", "wechat": "kelly64", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Donec ut dolor.", "is_first_login": false, "date_expired": "2086-08-19T11:40:28.488Z", "created_by": "admin", "user_permissions": [], "groups": [1]}}, {"model": "users.user", "pk": 3, "fields": {"password": "pbkdf2_sha256$30000$NpN3clf5YczT$sT3OTGL1x3sh+Vz5cYTV+nhOQI7A2WhEzf6whqVR2fg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:28.659Z", "username": "marie78", "name": "Doris Clark", "email": "lillian@blogxs.mil", "role": "User", "avatar": "", "wechat": "phyllis91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce consequat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:28.659Z", "created_by": "admin", "user_permissions": [], "groups": [1, 64]}}, {"model": "users.user", "pk": 4, "fields": {"password": "pbkdf2_sha256$30000$Hnpln9zJFQuL$xkDIqpl+LNAtze2OPSfm4tMHivnChcK9BSQmTULr17U=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:28.820Z", "username": "joan82", "name": "Emily Dixon", "email": "rose@skimia.mil", "role": "Admin", "avatar": "", "wechat": "cynthia84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:28.821Z", "created_by": "admin", "user_permissions": [], "groups": [1, 12]}}, {"model": "users.user", "pk": 5, "fields": {"password": "pbkdf2_sha256$30000$oAkPuzyhsQjH$IEBHKtJuSZVpWnC0n0vMd6NOv6GBlHwdiXkzoS4AcKA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:28.992Z", "username": "helen93", "name": "Phyllis Wells", "email": "susan@yakitri.info", "role": "User", "avatar": "", "wechat": "jessica85", "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.", "is_first_login": false, "date_expired": "2086-08-19T11:40:28.992Z", "created_by": "admin", "user_permissions": [], "groups": [1, 49]}}, {"model": "users.user", "pk": 6, "fields": {"password": "pbkdf2_sha256$30000$LL5tIUJYalEm$+O1Xne9HwJRMawHoI+1hN08wCi7IVyWlfiptJPSZ868=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:29.153Z", "username": "jessica67", "name": "Jessica Gonzalez", "email": "anne@browsetype.mil", "role": "User", "avatar": "", "wechat": "dorothy70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis bibendum.", "is_first_login": false, "date_expired": "2086-08-19T11:40:29.153Z", "created_by": "helen93", "user_permissions": [], "groups": [1, 37]}}, {"model": "users.user", "pk": 7, "fields": {"password": "pbkdf2_sha256$30000$kbxycqmL62b6$LrFh/b7tHXu/UYv9SIAyZodSajagoSvQHJmbNa4iZPY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:29.320Z", "username": "amanda83", "name": "Cynthia Simpson", "email": "barbara@photobug.com", "role": "User", "avatar": "", "wechat": "gloria85", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer ac neque.", "is_first_login": false, "date_expired": "2086-08-19T11:40:29.320Z", "created_by": "jessica67", "user_permissions": [], "groups": [1, 55]}}, {"model": "users.user", "pk": 8, "fields": {"password": "pbkdf2_sha256$30000$lvVKIRcbiVH5$Z/tS8vMWxyoTPR3fiDSsADYx30MrDmZsJXCtLM+Uk8c=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:29.486Z", "username": "gloria89", "name": "Lisa Stone", "email": "jennifer@trilia.info", "role": "Admin", "avatar": "", "wechat": "ruby66", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis mattis egestas metus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:29.486Z", "created_by": "helen93", "user_permissions": [], "groups": [1, 8]}}, {"model": "users.user", "pk": 9, "fields": {"password": "pbkdf2_sha256$30000$lobNy7Fdr3S4$HZXc3BUntiiSExn3zeof+GhdBU/ufOm/pJUriD8hHpg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:29.658Z", "username": "virginia82", "name": "Jacqueline Lawrence", "email": "frances@roombo.gov", "role": "User", "avatar": "", "wechat": "irene77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In hac habitasse platea dictumst.", "is_first_login": false, "date_expired": "2086-08-19T11:40:29.658Z", "created_by": "admin", "user_permissions": [], "groups": [1, 38]}}, {"model": "users.user", "pk": 10, "fields": {"password": "pbkdf2_sha256$30000$LfEpQOng9Oey$xId/M7mkTyrKy1sU2cCIYDt8vDvO8OKMS4Kvt11GCrw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:29.822Z", "username": "shirley92", "name": "Rose Bradley", "email": "jane@eayo.org", "role": "User", "avatar": "", "wechat": "alice77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vivamus vestibulum sagittis sapien.", "is_first_login": false, "date_expired": "2086-08-19T11:40:29.822Z", "created_by": "admin", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 11, "fields": {"password": "pbkdf2_sha256$30000$9ClFk3rzOAe2$eoiEZ0feR1lmDTrPi9cT0GCoO56E4A6CYlWTbAzY5W0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:29.990Z", "username": "donna77", "name": "Kimberly Hughes", "email": "martha@jabbersphere.info", "role": "Admin", "avatar": "", "wechat": "louise92", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam molestie nibh in lectus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:29.990Z", "created_by": "virginia82", "user_permissions": [], "groups": [1, 27]}}, {"model": "users.user", "pk": 12, "fields": {"password": "pbkdf2_sha256$30000$MAJMgjslCzUU$W8lA9y17L1v+TdjhoXzJZf57oaoknN+pCp/8hTABX3I=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:30.159Z", "username": "bonnie87", "name": "Shirley Tucker", "email": "ashley@jabbercube.edu", "role": "User", "avatar": "", "wechat": "denise82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.", "is_first_login": false, "date_expired": "2086-08-19T11:40:30.159Z", "created_by": "donna77", "user_permissions": [], "groups": [1, 4]}}, {"model": "users.user", "pk": 13, "fields": {"password": "pbkdf2_sha256$30000$zCT6heqR3LaF$/SNC4wvkRotfHtnz0LtcoXF2lgScx5+7APFfnrulqeA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:30.327Z", "username": "mildred89", "name": "Amy Cole", "email": "cheryl@yambee.org", "role": "User", "avatar": "", "wechat": "anna67", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Praesent blandit lacinia erat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:30.327Z", "created_by": "shirley92", "user_permissions": [], "groups": [1, 74]}}, {"model": "users.user", "pk": 14, "fields": {"password": "pbkdf2_sha256$30000$zSK7uZolhV5W$m4FUrWJbJR/aaE4lifgyeg9Zz39t5pDzxwhjhkfpFpk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:30.494Z", "username": "betty69", "name": "Norma Little", "email": "mildred@nlounge.gov", "role": "Admin", "avatar": "", "wechat": "jennifer80", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer ac neque.", "is_first_login": false, "date_expired": "2086-08-19T11:40:30.495Z", "created_by": "shirley92", "user_permissions": [], "groups": [1, 61]}}, {"model": "users.user", "pk": 15, "fields": {"password": "pbkdf2_sha256$30000$ohJp2IQmzty1$NHWh76GPmQb9l2oqpfEjlQ+RACLbOLTQi3nLeMyMw94=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:30.658Z", "username": "kathleen81", "name": "Jennifer Garza", "email": "donna@thoughtbeat.org", "role": "Admin", "avatar": "", "wechat": "jessica70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris ullamcorper purus sit amet nulla.", "is_first_login": false, "date_expired": "2086-08-19T11:40:30.658Z", "created_by": "helen93", "user_permissions": [], "groups": [1, 22]}}, {"model": "users.user", "pk": 16, "fields": {"password": "pbkdf2_sha256$30000$8GJwjpiigEqV$hv+hRQrA4MQz8XlXvKZDsO746KQbIRjoYtgUyNvxPK0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:30.829Z", "username": "heather83", "name": "Jacqueline Gomez", "email": "mary@dabz.org", "role": "User", "avatar": "", "wechat": "katherine81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum ac est lacinia nisi venenatis tristique.", "is_first_login": false, "date_expired": "2086-08-19T11:40:30.829Z", "created_by": "gloria89", "user_permissions": [], "groups": [1, 101]}}, {"model": "users.user", "pk": 17, "fields": {"password": "pbkdf2_sha256$30000$h3T2BC3HVR6w$lqyZTTVkpyzeklHO0cv29ftO1egfHAREs42KmXgO29c=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:30.999Z", "username": "cheryl86", "name": "Doris Wright", "email": "kathleen@youbridge.org", "role": "Admin", "avatar": "", "wechat": "julia89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer ac leo.", "is_first_login": false, "date_expired": "2086-08-19T11:40:30.999Z", "created_by": "mildred89", "user_permissions": [], "groups": [1, 100]}}, {"model": "users.user", "pk": 18, "fields": {"password": "pbkdf2_sha256$30000$HPctDgqFA1O5$aHIZAhfT4hqwthO6PkYC6wHr8xpCwgfbZli1i4vBGqo=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:31.171Z", "username": "helen85", "name": "Nancy Franklin", "email": "elizabeth@kare.edu", "role": "User", "avatar": "", "wechat": "ruth86", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris ullamcorper purus sit amet nulla.", "is_first_login": false, "date_expired": "2086-08-19T11:40:31.171Z", "created_by": "helen93", "user_permissions": [], "groups": [1, 19]}}, {"model": "users.user", "pk": 19, "fields": {"password": "pbkdf2_sha256$30000$2BxbETGNZPjs$LQ4vZC//oJhw+kkQA5+QaWwQRiImMR32ZRQ/JiSmhno=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:31.342Z", "username": "evelyn66", "name": "Maria Wagner", "email": "kathy@vinte.mil", "role": "Admin", "avatar": "", "wechat": "diane67", "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; Nulla dapibus dolor vel est.", "is_first_login": false, "date_expired": "2086-08-19T11:40:31.342Z", "created_by": "betty69", "user_permissions": [], "groups": [1, 55]}}, {"model": "users.user", "pk": 20, "fields": {"password": "pbkdf2_sha256$30000$Zhr5ztI55OmZ$c1vxvnRPonGOLEYwAkwPK10gcNDRwnJItAGfYvxo/l8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:31.514Z", "username": "sharon90", "name": "Shirley Watson", "email": "cheryl@skimia.edu", "role": "User", "avatar": "", "wechat": "robin78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "is_first_login": false, "date_expired": "2086-08-19T11:40:31.514Z", "created_by": "debra78", "user_permissions": [], "groups": [1, 57]}}, {"model": "users.user", "pk": 21, "fields": {"password": "pbkdf2_sha256$30000$V8jjOOVxDN6U$nbnHTiGlw3MNK3dQZ23jpwZidyvIm9UHvJMMF5LEcBk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:31.678Z", "username": "anne65", "name": "Linda Thompson", "email": "margaret@nlounge.net", "role": "Admin", "avatar": "", "wechat": "judith94", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "is_first_login": false, "date_expired": "2086-08-19T11:40:31.678Z", "created_by": "helen93", "user_permissions": [], "groups": [1, 31]}}, {"model": "users.user", "pk": 22, "fields": {"password": "pbkdf2_sha256$30000$ASWsoeOm8bC8$JWAry3Vf4p9eqF30hWgjJYVyj+EyftYqHgLnrFcSl3w=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:31.842Z", "username": "janice81", "name": "Tina Tucker", "email": "amy@aivee.info", "role": "User", "avatar": "", "wechat": "sara86", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque id justo sit amet sapien dignissim vestibulum.", "is_first_login": false, "date_expired": "2086-08-19T11:40:31.842Z", "created_by": "donna77", "user_permissions": [], "groups": [1, 24]}}, {"model": "users.user", "pk": 23, "fields": {"password": "pbkdf2_sha256$30000$F5Igy3AG8I77$ebSGjrlcri5QHYiPSMgWjvuMqiEJZaY9nnHBQnjbioE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:32.013Z", "username": "shirley90", "name": "Donna Cole", "email": "norma@eire.com", "role": "Admin", "avatar": "", "wechat": "stephanie94", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi non lectus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:32.013Z", "created_by": "kathleen81", "user_permissions": [], "groups": [1, 50]}}, {"model": "users.user", "pk": 24, "fields": {"password": "pbkdf2_sha256$30000$TB2ioEQVTRYC$OLMEUgukLXGQkM+Ku0xYjDIuwBW0mSXc497FMYboHMc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:32.182Z", "username": "rachel86", "name": "Diana Fuller", "email": "heather@zoombox.com", "role": "User", "avatar": "", "wechat": "annie70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Curabitur in libero ut massa volutpat convallis.", "is_first_login": false, "date_expired": "2086-08-19T11:40:32.182Z", "created_by": "cheryl86", "user_permissions": [], "groups": [1, 29]}}, {"model": "users.user", "pk": 25, "fields": {"password": "pbkdf2_sha256$30000$8zRHrl5odLjt$H1LyqlzStMtrrdsqCTsEDqyzvRfVTO+s3FCkMZQUg58=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:32.354Z", "username": "gloria81", "name": "Judith Burton", "email": "pamela@browsecat.info", "role": "Admin", "avatar": "", "wechat": "kathryn84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Praesent blandit.", "is_first_login": false, "date_expired": "2086-08-19T11:40:32.354Z", "created_by": "admin", "user_permissions": [], "groups": [1, 98]}}, {"model": "users.user", "pk": 26, "fields": {"password": "pbkdf2_sha256$30000$oJ8CguLyG514$857oOSy4ZP/nmoHfr0+7YAkr+4nOxpVfs+YHHXO4HGA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:32.516Z", "username": "sarah93", "name": "Marie Robertson", "email": "cynthia@vitz.net", "role": "User", "avatar": "", "wechat": "anna82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aenean lectus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:32.516Z", "created_by": "jessica67", "user_permissions": [], "groups": [1, 15]}}, {"model": "users.user", "pk": 27, "fields": {"password": "pbkdf2_sha256$30000$KMKhgXsrpbTb$3SOKyqnAZsHsulLAR8YxRSH4oL81HecsjHuZqBwbfkA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:32.684Z", "username": "gloria69", "name": "Ashley Fernandez", "email": "lois@zooxo.name", "role": "User", "avatar": "", "wechat": "nicole91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis.", "is_first_login": false, "date_expired": "2086-08-19T11:40:32.684Z", "created_by": "amanda83", "user_permissions": [], "groups": [1, 55]}}, {"model": "users.user", "pk": 28, "fields": {"password": "pbkdf2_sha256$30000$HqsstWAnc4Dc$DbH4P0e8TewCmj12VM2PaMlxbEO9sXdMiAU/RaNcEso=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:32.851Z", "username": "patricia86", "name": "Catherine Hanson", "email": "jean@tavu.gov", "role": "User", "avatar": "", "wechat": "tina86", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Curabitur in libero ut massa volutpat convallis.", "is_first_login": false, "date_expired": "2086-08-19T11:40:32.851Z", "created_by": "sharon90", "user_permissions": [], "groups": [1, 76]}}, {"model": "users.user", "pk": 29, "fields": {"password": "pbkdf2_sha256$30000$afmfE90Qeh5l$kz0UjtWT/+8WaSFiwHUsVPMvhnxAmaZK0KvUfRGuhQY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:33.021Z", "username": "elizabeth88", "name": "Julia Green", "email": "norma@zooxo.name", "role": "User", "avatar": "", "wechat": "teresa72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aenean lectus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:33.021Z", "created_by": "gloria81", "user_permissions": [], "groups": [1, 52]}}, {"model": "users.user", "pk": 30, "fields": {"password": "pbkdf2_sha256$30000$oGne3NGRmP4F$eZoziI46KHtHHhEIbHhvx4tT7OqpAhKP7EgcJZRotM0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:33.189Z", "username": "anna73", "name": "Sharon Arnold", "email": "kelly@jabbertype.edu", "role": "User", "avatar": "", "wechat": "linda84", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer non velit.", "is_first_login": false, "date_expired": "2086-08-19T11:40:33.189Z", "created_by": "shirley92", "user_permissions": [], "groups": [1, 65]}}, {"model": "users.user", "pk": 31, "fields": {"password": "pbkdf2_sha256$30000$Beusxog5VzMe$XLk35XQG0nKVMhJAwm4xPReq8nGbLGTsTuHuoBk8/oc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:33.360Z", "username": "amanda72", "name": "Nicole Miller", "email": "ruby@innotype.net", "role": "Admin", "avatar": "", "wechat": "amy83", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque ultrices mattis odio.", "is_first_login": false, "date_expired": "2086-08-19T11:40:33.360Z", "created_by": "betty69", "user_permissions": [], "groups": [1, 79]}}, {"model": "users.user", "pk": 32, "fields": {"password": "pbkdf2_sha256$30000$xX2wCo6lmAoe$xT9sv5lhNEz5QHTGXRro1rlZq3wV1SOXR8N2AVxfIK0=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:33.525Z", "username": "karen88", "name": "Ann Perry", "email": "christine@kazu.biz", "role": "User", "avatar": "", "wechat": "kathryn93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue.", "is_first_login": false, "date_expired": "2086-08-19T11:40:33.525Z", "created_by": "shirley90", "user_permissions": [], "groups": [1, 45]}}, {"model": "users.user", "pk": 33, "fields": {"password": "pbkdf2_sha256$30000$G26Dluux88FA$yYZDtuT2kziHa7npBjc6wa0FaqlCq4xd/HNwf3M0IBA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:33.688Z", "username": "ruby85", "name": "Andrea Simmons", "email": "janice@topiclounge.gov", "role": "User", "avatar": "", "wechat": "carol63", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.", "is_first_login": false, "date_expired": "2086-08-19T11:40:33.688Z", "created_by": "virginia82", "user_permissions": [], "groups": [1, 8]}}, {"model": "users.user", "pk": 34, "fields": {"password": "pbkdf2_sha256$30000$YogIPElxW4BF$GMx/eCOf+Wo45K8f4zpgAdPHnK0hw4zxrhPFGjD1kgw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:33.849Z", "username": "jean78", "name": "Wanda Porter", "email": "debra@skipfire.edu", "role": "User", "avatar": "", "wechat": "nancy68", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue.", "is_first_login": false, "date_expired": "2086-08-19T11:40:33.850Z", "created_by": "rachel86", "user_permissions": [], "groups": [1, 34]}}, {"model": "users.user", "pk": 35, "fields": {"password": "pbkdf2_sha256$30000$VAHkvodCT4EZ$Hc0AgQpRTZ+Fyej7aYw3XFYLBqRuYNYdZrBqbNsxBWI=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:34.025Z", "username": "dorothy68", "name": "Sandra Burke", "email": "jacqueline@voonder.name", "role": "User", "avatar": "", "wechat": "anne75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas tincidunt lacus at velit.", "is_first_login": false, "date_expired": "2086-08-19T11:40:34.025Z", "created_by": "sharon90", "user_permissions": [], "groups": [1, 24]}}, {"model": "users.user", "pk": 36, "fields": {"password": "pbkdf2_sha256$30000$LCgO3uQ9b8jB$2gk2i4h9YSPE6Z5ncYqQjXWuqd957Oa5wyQWUySt/6Q=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:34.189Z", "username": "julia94", "name": "Julia Moore", "email": "kathleen@avamm.mil", "role": "User", "avatar": "", "wechat": "lois92", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.", "is_first_login": false, "date_expired": "2086-08-19T11:40:34.189Z", "created_by": "janice81", "user_permissions": [], "groups": [1, 23]}}, {"model": "users.user", "pk": 37, "fields": {"password": "pbkdf2_sha256$30000$d8I5jWJV3nrO$vXljikjtUP2iACdKvhv2VvdHgv1zL816CY3vzBzzf+U=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:34.356Z", "username": "jacqueline87", "name": "Shirley Boyd", "email": "martha@roodel.net", "role": "User", "avatar": "", "wechat": "melissa77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nunc nisl.", "is_first_login": false, "date_expired": "2086-08-19T11:40:34.356Z", "created_by": "mildred89", "user_permissions": [], "groups": [1, 32]}}, {"model": "users.user", "pk": 38, "fields": {"password": "pbkdf2_sha256$30000$GN14FUfF7nIl$QORwOV3JB8TGpGVfjTHkWyfVO/97taHbsUUEyfkO18M=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:34.525Z", "username": "margaret83", "name": "Marilyn Berry", "email": "sarah@wikibox.edu", "role": "User", "avatar": "", "wechat": "marilyn89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Ut tellus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:34.525Z", "created_by": "marie78", "user_permissions": [], "groups": [1, 49]}}, {"model": "users.user", "pk": 39, "fields": {"password": "pbkdf2_sha256$30000$JKLEc3Udbclx$TeQ8656qKhw97YsPDwhPmF3FusBzc42tfHxgpFumpg8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:34.693Z", "username": "katherine78", "name": "Patricia Andrews", "email": "lillian@snaptags.name", "role": "User", "avatar": "", "wechat": "lois82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.", "is_first_login": false, "date_expired": "2086-08-19T11:40:34.693Z", "created_by": "helen93", "user_permissions": [], "groups": [1, 70]}}, {"model": "users.user", "pk": 40, "fields": {"password": "pbkdf2_sha256$30000$LfSuq1HOppCM$PATgoI+3OWTtnBl4Qqfcrg2tIIJSJWwg2gDHqRReNHA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:34.868Z", "username": "sandra72", "name": "Karen Dunn", "email": "kathleen@realbridge.biz", "role": "User", "avatar": "", "wechat": "angela69", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer ac neque.", "is_first_login": false, "date_expired": "2086-08-19T11:40:34.868Z", "created_by": "evelyn66", "user_permissions": [], "groups": [1, 84]}}, {"model": "users.user", "pk": 41, "fields": {"password": "pbkdf2_sha256$30000$fyqfIT2o8oBh$oxWTIdDmGE6JeFiC3ht1Vfan/wixhkKQYpJuDWFXwpI=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:35.038Z", "username": "janet94", "name": "Tina Jacobs", "email": "kathryn@twitterbeat.com", "role": "Admin", "avatar": "", "wechat": "sarah85", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas ut massa quis augue luctus tincidunt.", "is_first_login": false, "date_expired": "2086-08-19T11:40:35.038Z", "created_by": "bonnie87", "user_permissions": [], "groups": [1, 3]}}, {"model": "users.user", "pk": 42, "fields": {"password": "pbkdf2_sha256$30000$lnrCgcch2hIS$zspAwtJ/kFNfHy6bgIBcFmPo02W6ymbwTNySKmcieRM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:35.206Z", "username": "heather70", "name": "Janice Fuller", "email": "lois@centizu.name", "role": "Admin", "avatar": "", "wechat": "diana87", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer a nibh.", "is_first_login": false, "date_expired": "2086-08-19T11:40:35.206Z", "created_by": "katherine78", "user_permissions": [], "groups": [1, 72]}}, {"model": "users.user", "pk": 43, "fields": {"password": "pbkdf2_sha256$30000$FG75rHLpN2yC$zavIk5IetRMZpxGKdzNiSUMFH+sRTMhDC3YZZLUbfH8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:35.377Z", "username": "helen78", "name": "Cheryl Kennedy", "email": "jacqueline@skimia.gov", "role": "User", "avatar": "", "wechat": "bonnie70", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer non velit.", "is_first_login": false, "date_expired": "2086-08-19T11:40:35.378Z", "created_by": "sarah93", "user_permissions": [], "groups": [1, 25]}}, {"model": "users.user", "pk": 44, "fields": {"password": "pbkdf2_sha256$30000$PYboz45iSFHS$szEdRkHHJnywvQxuyw+glDkVCTXb5oBb62M7pOYvr8w=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:35.544Z", "username": "frances66", "name": "Judith Thomas", "email": "robin@youopia.name", "role": "Admin", "avatar": "", "wechat": "virginia66", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin interdum mauris non ligula pellentesque ultrices.", "is_first_login": false, "date_expired": "2086-08-19T11:40:35.544Z", "created_by": "jessica67", "user_permissions": [], "groups": [1, 72]}}, {"model": "users.user", "pk": 45, "fields": {"password": "pbkdf2_sha256$30000$Hzb9aIsW4Z4g$aQPFxDUmDLi8/Y9DZDOo1M+9TmI+egl8YbWajDPApNo=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:35.712Z", "username": "joan84", "name": "Emily Hayes", "email": "ashley@flipstorm.info", "role": "Admin", "avatar": "", "wechat": "cynthia82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras non velit nec nisi vulputate nonummy.", "is_first_login": false, "date_expired": "2086-08-19T11:40:35.712Z", "created_by": "joan82", "user_permissions": [], "groups": [1, 2]}}, {"model": "users.user", "pk": 46, "fields": {"password": "pbkdf2_sha256$30000$cX83YarClOxI$mHmsPUtGvXYCXx03XRz1gGzKRGIMDCLzlmW+jvmeHyM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:35.890Z", "username": "ruby74", "name": "Gloria Ryan", "email": "wanda@zoomzone.com", "role": "User", "avatar": "", "wechat": "tammy78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "is_first_login": false, "date_expired": "2086-08-19T11:40:35.890Z", "created_by": "heather83", "user_permissions": [], "groups": [1, 89]}}, {"model": "users.user", "pk": 47, "fields": {"password": "pbkdf2_sha256$30000$QayxdbM57SkB$+O4cZ6pe3qOIOgnkmkojvz/9SNXbdQq4IN/OlWM4uqE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:36.209Z", "username": "rose65", "name": "Jennifer Hill", "email": "cynthia@meeveo.mil", "role": "User", "avatar": "", "wechat": "phyllis72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras in purus eu magna vulputate luctus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:36.209Z", "created_by": "kathleen81", "user_permissions": [], "groups": [1, 93]}}, {"model": "users.user", "pk": 48, "fields": {"password": "pbkdf2_sha256$30000$rOGXoybJrlRu$6/sbbzUXSC4gg3MnQBBQjmxSwns0kuFFXnjUFgECVCs=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:36.380Z", "username": "theresa66", "name": "Nicole Mcdonald", "email": "jennifer@thoughtblab.org", "role": "Admin", "avatar": "", "wechat": "beverly93", "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.", "is_first_login": false, "date_expired": "2086-08-19T11:40:36.380Z", "created_by": "sandra72", "user_permissions": [], "groups": [1, 54]}}, {"model": "users.user", "pk": 49, "fields": {"password": "pbkdf2_sha256$30000$ryM1OtDaFRBR$yAaYMLSu5GmHtBuj2SqNxrwX6T0ZJ0f9Ioa+QKB6Xjc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:36.547Z", "username": "jane64", "name": "Sara Romero", "email": "laura@bluejam.info", "role": "User", "avatar": "", "wechat": "ashley81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum quam sapien, varius ut, blandit non, interdum in, ante.", "is_first_login": false, "date_expired": "2086-08-19T11:40:36.547Z", "created_by": "katherine78", "user_permissions": [], "groups": [1, 95]}}, {"model": "users.user", "pk": 50, "fields": {"password": "pbkdf2_sha256$30000$qrctcs8SfAbX$MneVIdxKpm5gU0kH6Kd4AdVJW9H3Lwy57Fj9zbcDMng=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:36.715Z", "username": "joyce92", "name": "Robin Schmidt", "email": "jessica@vipe.org", "role": "Admin", "avatar": "", "wechat": "lillian69", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aliquam sit amet diam in magna bibendum imperdiet.", "is_first_login": false, "date_expired": "2086-08-19T11:40:36.715Z", "created_by": "helen78", "user_permissions": [], "groups": [1, 12]}}, {"model": "users.user", "pk": 51, "fields": {"password": "pbkdf2_sha256$30000$YBDMUxTjaJOm$eotObjSyQ8tuxwPvGzrdwe4JtewIkGP3VJjA1n12XgI=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:36.885Z", "username": "jessica83", "name": "Carol Rice", "email": "judy@oyoyo.gov", "role": "Admin", "avatar": "", "wechat": "theresa87", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla.", "is_first_login": false, "date_expired": "2086-08-19T11:40:36.886Z", "created_by": "sharon90", "user_permissions": [], "groups": [1, 5]}}, {"model": "users.user", "pk": 52, "fields": {"password": "pbkdf2_sha256$30000$rDduC7xoNL6D$Qw7IXRwcGHghVgs9JazbSWVv16226Ind2uI7Mc4LffU=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:37.049Z", "username": "norma92", "name": "Margaret Shaw", "email": "marie@gevee.net", "role": "User", "avatar": "", "wechat": "jean86", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras in purus eu magna vulputate luctus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:37.049Z", "created_by": "gloria81", "user_permissions": [], "groups": [1, 42]}}, {"model": "users.user", "pk": 53, "fields": {"password": "pbkdf2_sha256$30000$XuD0bTQbGiGR$49MGy0aIUlq6PIn5n8MFJFzQXlt+9sAAlPFiGUcz0jo=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:37.223Z", "username": "nancy93", "name": "Amy Parker", "email": "deborah@feedmix.gov", "role": "Admin", "avatar": "", "wechat": "barbara73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Proin eu mi.", "is_first_login": false, "date_expired": "2086-08-19T11:40:37.223Z", "created_by": "amanda83", "user_permissions": [], "groups": [1, 23]}}, {"model": "users.user", "pk": 54, "fields": {"password": "pbkdf2_sha256$30000$GQ29YONroMEs$zidcIhcl0MVZzqMCDOuK0ZiGmT64iVxAXvdyZidkVW8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:37.388Z", "username": "kathryn89", "name": "Anne Hanson", "email": "janice@skajo.com", "role": "User", "avatar": "", "wechat": "irene88", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Fusce consequat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:37.388Z", "created_by": "jane64", "user_permissions": [], "groups": [1, 31]}}, {"model": "users.user", "pk": 55, "fields": {"password": "pbkdf2_sha256$30000$vBohn8DgNVNW$wSrYvF4TK9+1F0FpWfU/1tonWLEzFD66xkeLUzMjXW8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:37.555Z", "username": "christine65", "name": "Linda Grant", "email": "mildred@oyoloo.info", "role": "User", "avatar": "", "wechat": "gloria89", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:37.555Z", "created_by": "jean78", "user_permissions": [], "groups": [1, 31]}}, {"model": "users.user", "pk": 56, "fields": {"password": "pbkdf2_sha256$30000$ZXZzwHmuJLhu$94jqW8ge2OV8zsCO25ejDuX2ensIrAsqZ3gMspSEWZo=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:37.724Z", "username": "christine74", "name": "Tammy Henry", "email": "susan@fatz.gov", "role": "User", "avatar": "", "wechat": "paula73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla justo.", "is_first_login": false, "date_expired": "2086-08-19T11:40:37.724Z", "created_by": "helen85", "user_permissions": [], "groups": [1, 27]}}, {"model": "users.user", "pk": 57, "fields": {"password": "pbkdf2_sha256$30000$SCBEFw4IqJSw$gKwJ+Z61A8xx8FoKKlxKi3bvymJ901XX190CttuT5SQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:37.903Z", "username": "janet78", "name": "Jennifer Stone", "email": "brenda@realblab.com", "role": "Admin", "avatar": "", "wechat": "paula74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi non quam nec dui luctus rutrum.", "is_first_login": false, "date_expired": "2086-08-19T11:40:37.903Z", "created_by": "helen78", "user_permissions": [], "groups": [1, 57]}}, {"model": "users.user", "pk": 58, "fields": {"password": "pbkdf2_sha256$30000$brXrjdiilFJy$ZQyHHfiLmBPXAOIt7HFykZVDjK1/xy2rHSD4WzyN5lk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:38.078Z", "username": "bonnie82", "name": "Tammy Barnes", "email": "judy@jazzy.edu", "role": "Admin", "avatar": "", "wechat": "norma94", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer non velit.", "is_first_login": false, "date_expired": "2086-08-19T11:40:38.079Z", "created_by": "theresa66", "user_permissions": [], "groups": [1, 12]}}, {"model": "users.user", "pk": 59, "fields": {"password": "pbkdf2_sha256$30000$ytPyWlqlgSQa$MDTPej9yHVpTXnmX+i7pjQohUjrzA1CkkjHM/mszRas=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:38.258Z", "username": "susan70", "name": "Jane Sims", "email": "jean@kwideo.org", "role": "Admin", "avatar": "", "wechat": "jean76", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi quis tortor id nulla ultrices aliquet.", "is_first_login": false, "date_expired": "2086-08-19T11:40:38.258Z", "created_by": "shirley92", "user_permissions": [], "groups": [1, 34]}}, {"model": "users.user", "pk": 60, "fields": {"password": "pbkdf2_sha256$30000$hCwgalGFVti0$QM2cah7OjPv9LmWcTUW8n0WWXrzbtDLmqXIT8I72lBw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:38.445Z", "username": "diana82", "name": "Kathleen Morrison", "email": "sharon@fanoodle.info", "role": "Admin", "avatar": "", "wechat": "kimberly94", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Phasellus sit amet erat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:38.445Z", "created_by": "kathleen81", "user_permissions": [], "groups": [1, 72]}}, {"model": "users.user", "pk": 61, "fields": {"password": "pbkdf2_sha256$30000$9veo3zwoQS6Y$o9GdPOMm8vfCz2LZ2dLFZQRPL/weVQbh1DQgTkfT01E=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:38.616Z", "username": "pamela85", "name": "Tammy Sanders", "email": "andrea@tagtune.mil", "role": "User", "avatar": "", "wechat": "debra86", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Phasellus sit amet erat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:38.616Z", "created_by": "kathryn89", "user_permissions": [], "groups": [1, 17]}}, {"model": "users.user", "pk": 62, "fields": {"password": "pbkdf2_sha256$30000$KZA3rl6hy6K8$c37Ypnuwfa+J83zGSqv/4VlEP1SjPUOO16dYWh5A37U=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:38.800Z", "username": "shirley67", "name": "Diane Hernandez", "email": "kimberly@oyoloo.net", "role": "User", "avatar": "", "wechat": "theresa91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Maecenas pulvinar lobortis est.", "is_first_login": false, "date_expired": "2086-08-19T11:40:38.800Z", "created_by": "elizabeth88", "user_permissions": [], "groups": [1, 23]}}, {"model": "users.user", "pk": 63, "fields": {"password": "pbkdf2_sha256$30000$bly0Ec71D4G5$EsaMleYNI2rqq2SDWVqpZuuqN24YFVVg3ym12YJ8aFQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:38.972Z", "username": "evelyn87", "name": "Barbara Myers", "email": "rachel@thoughtblab.mil", "role": "Admin", "avatar": "", "wechat": "virginia82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Vestibulum sed magna at nunc commodo placerat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:38.972Z", "created_by": "admin", "user_permissions": [], "groups": [1, 3]}}, {"model": "users.user", "pk": 64, "fields": {"password": "pbkdf2_sha256$30000$DlJpDuZwAGJn$x0IdHZBBa9Sv2B/7UA/S0UR1LKC9kVEjNEDP6cldOOw=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:39.145Z", "username": "lisa76", "name": "Joyce Gray", "email": "nancy@jatri.com", "role": "User", "avatar": "", "wechat": "linda76", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Suspendisse potenti.", "is_first_login": false, "date_expired": "2086-08-19T11:40:39.145Z", "created_by": "patricia86", "user_permissions": [], "groups": [1, 86]}}, {"model": "users.user", "pk": 65, "fields": {"password": "pbkdf2_sha256$30000$zTXa8Wbqkcl7$e9Sj8tRw81AIYUYTCN96g4dCrlw1ne65yAj57Lpt3fc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:39.316Z", "username": "wanda87", "name": "Angela Phillips", "email": "dorothy@vinte.name", "role": "User", "avatar": "", "wechat": "jean93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque id justo sit amet sapien dignissim vestibulum.", "is_first_login": false, "date_expired": "2086-08-19T11:40:39.316Z", "created_by": "gloria89", "user_permissions": [], "groups": [1, 18]}}, {"model": "users.user", "pk": 66, "fields": {"password": "pbkdf2_sha256$30000$snF1u8sKBGoT$iIICTiwlK7hlou+IuphT9ozgoVdg7xvQ0BhQ5hipzAM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:39.494Z", "username": "martha80", "name": "Paula Webb", "email": "joyce@jetwire.gov", "role": "Admin", "avatar": "", "wechat": "irene88", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Donec ut mauris eget massa tempor convallis.", "is_first_login": false, "date_expired": "2086-08-19T11:40:39.494Z", "created_by": "debra78", "user_permissions": [], "groups": [1, 71]}}, {"model": "users.user", "pk": 67, "fields": {"password": "pbkdf2_sha256$30000$3f2IIMh1BHsZ$sqW6OC1P8A8ZHC3hSgZjM/1onfVyeqWZrODHgB6pjo8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:39.670Z", "username": "alice90", "name": "Joyce Cole", "email": "joyce@jetwire.name", "role": "Admin", "avatar": "", "wechat": "kathryn90", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nunc rhoncus dui vel sem.", "is_first_login": false, "date_expired": "2086-08-19T11:40:39.670Z", "created_by": "jean78", "user_permissions": [], "groups": [1, 83]}}, {"model": "users.user", "pk": 68, "fields": {"password": "pbkdf2_sha256$30000$rjdFLNWTZVDP$cbLx9NhUCDjfJ5DtXBATvRBDdwWp6AwIY0cDuoS0ack=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:39.844Z", "username": "julie89", "name": "Ashley Castillo", "email": "betty@tagchat.edu", "role": "User", "avatar": "", "wechat": "teresa82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aenean auctor gravida sem.", "is_first_login": false, "date_expired": "2086-08-19T11:40:39.844Z", "created_by": "evelyn66", "user_permissions": [], "groups": [1, 3]}}, {"model": "users.user", "pk": 69, "fields": {"password": "pbkdf2_sha256$30000$aMmTSQp5D7o8$uEO2r3tTJjjiPme0wyjPAIx9+J+D4iYXpSZiud56YZM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:40.019Z", "username": "sara63", "name": "Julie Robertson", "email": "jane@twinte.biz", "role": "Admin", "avatar": "", "wechat": "laura75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Ut at dolor quis odio consequat varius.", "is_first_login": false, "date_expired": "2086-08-19T11:40:40.019Z", "created_by": "evelyn87", "user_permissions": [], "groups": [1, 28]}}, {"model": "users.user", "pk": 70, "fields": {"password": "pbkdf2_sha256$30000$tkX3zB55h35n$2GVTvEtIJEgKX2eLypbvVWG/EawxGv+pM8oGQqsTG1M=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:40.203Z", "username": "annie84", "name": "Melissa Hill", "email": "laura@bluezoom.biz", "role": "Admin", "avatar": "", "wechat": "stephanie81", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi non lectus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:40.203Z", "created_by": "norma92", "user_permissions": [], "groups": [1, 72]}}, {"model": "users.user", "pk": 71, "fields": {"password": "pbkdf2_sha256$30000$F3p7A7Z34RdN$S4zMTb8S0riGXpkTMxQNVF0t3SVT8p9q3YaGpRfvHrE=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:40.410Z", "username": "denise66", "name": "Carol Murphy", "email": "cheryl@brainbox.net", "role": "Admin", "avatar": "", "wechat": "stephanie91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aenean lectus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:40.410Z", "created_by": "betty69", "user_permissions": [], "groups": [1, 100]}}, {"model": "users.user", "pk": 72, "fields": {"password": "pbkdf2_sha256$30000$w8jVwPiLAO95$uMibVY3vK5+bb3kGIcaF3bzS/vLBXuYHUHisL+s7Gk8=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:40.588Z", "username": "maria79", "name": "Lisa Lawson", "email": "nancy@edgeblab.com", "role": "User", "avatar": "", "wechat": "sara84", "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.", "is_first_login": false, "date_expired": "2086-08-19T11:40:40.588Z", "created_by": "evelyn66", "user_permissions": [], "groups": [1, 96]}}, {"model": "users.user", "pk": 73, "fields": {"password": "pbkdf2_sha256$30000$Chfy1Xs9TYn6$D4PqnvAonoe7i2Apailkj1jNgPwJQXzu4Rdw7vojN4E=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:40.765Z", "username": "jacqueline66", "name": "Christine Johnston", "email": "annie@yombu.com", "role": "User", "avatar": "", "wechat": "shirley94", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque ut erat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:40.765Z", "created_by": "martha80", "user_permissions": [], "groups": [1, 96]}}, {"model": "users.user", "pk": 74, "fields": {"password": "pbkdf2_sha256$30000$R476WcBOQFnz$wG6PQxtKoFiCq/QvFuChZsMqmOChRyMtysWqfzobGUc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:40.946Z", "username": "diane94", "name": "Jacqueline Banks", "email": "ruth@riffwire.name", "role": "Admin", "avatar": "", "wechat": "tammy69", "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.", "is_first_login": false, "date_expired": "2086-08-19T11:40:40.946Z", "created_by": "amanda83", "user_permissions": [], "groups": [1, 54]}}, {"model": "users.user", "pk": 75, "fields": {"password": "pbkdf2_sha256$30000$0WNEpfUcEBnr$PbdTdlDrFshCA8QQyAZIPvBVLQF457Svx2u1YAJjV3A=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:41.116Z", "username": "judy68", "name": "Anna Russell", "email": "sharon@bubbletube.mil", "role": "User", "avatar": "", "wechat": "dorothy80", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.", "is_first_login": false, "date_expired": "2086-08-19T11:40:41.116Z", "created_by": "bonnie87", "user_permissions": [], "groups": [1, 37]}}, {"model": "users.user", "pk": 76, "fields": {"password": "pbkdf2_sha256$30000$k6LVybVvEzP3$TDiWfHRnQqnDXHHHRudiQAie41KzGsBKslEnL7OyHUQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:41.283Z", "username": "sara85", "name": "Joan Stewart", "email": "bonnie@gabcube.mil", "role": "User", "avatar": "", "wechat": "gloria77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla.", "is_first_login": false, "date_expired": "2086-08-19T11:40:41.283Z", "created_by": "norma92", "user_permissions": [], "groups": [1, 71]}}, {"model": "users.user", "pk": 77, "fields": {"password": "pbkdf2_sha256$30000$nq3q8AD2Egqa$8hvaQvJNjnXAvl5v1cCWKYE6SBYQuQ4Zv0XgMgUBYjQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:41.462Z", "username": "louise86", "name": "Emily King", "email": "bonnie@zazio.com", "role": "Admin", "avatar": "", "wechat": "mildred72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis at velit eu est congue elementum.", "is_first_login": false, "date_expired": "2086-08-19T11:40:41.462Z", "created_by": "karen88", "user_permissions": [], "groups": [1, 100]}}, {"model": "users.user", "pk": 78, "fields": {"password": "pbkdf2_sha256$30000$YYLnF0D85MaT$mPp4SLNiN27DJ/MQSrJO0qQDdeBcTsFIDrRJJAd2mUY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:41.636Z", "username": "melissa86", "name": "Marie Cunningham", "email": "robin@fiveclub.biz", "role": "Admin", "avatar": "", "wechat": "louise65", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aliquam erat volutpat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:41.636Z", "created_by": "donna77", "user_permissions": [], "groups": [1, 99]}}, {"model": "users.user", "pk": 79, "fields": {"password": "pbkdf2_sha256$30000$C9ZMnLwd5jWR$B994aIg+HKsCFYgevJgMhaFb/OPFVvEC1uCkCZlU63E=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:41.799Z", "username": "judith78", "name": "Laura Austin", "email": "rose@shufflebeat.net", "role": "User", "avatar": "", "wechat": "paula77", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nam dui.", "is_first_login": false, "date_expired": "2086-08-19T11:40:41.800Z", "created_by": "virginia82", "user_permissions": [], "groups": [1, 51]}}, {"model": "users.user", "pk": 80, "fields": {"password": "pbkdf2_sha256$30000$3jASiMrsqPTS$qERB/ZJBFSQ3VOATZR64Wo62zCPHmQBUX6ik6k8pxEA=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:41.977Z", "username": "kathryn68", "name": "Mildred Gonzalez", "email": "wanda@linkbuzz.org", "role": "User", "avatar": "", "wechat": "anna89", "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.", "is_first_login": false, "date_expired": "2086-08-19T11:40:41.977Z", "created_by": "alice90", "user_permissions": [], "groups": [1, 36]}}, {"model": "users.user", "pk": 81, "fields": {"password": "pbkdf2_sha256$30000$uc313SO0fl0c$rxFzlZnQy5K1pexI7CnpGvvdD5Y6dk/gGCdql4OIQTg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:42.157Z", "username": "maria70", "name": "Wanda Campbell", "email": "teresa@shuffledrive.gov", "role": "User", "avatar": "", "wechat": "lisa74", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nunc purus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:42.157Z", "created_by": "julie89", "user_permissions": [], "groups": [1, 91]}}, {"model": "users.user", "pk": 82, "fields": {"password": "pbkdf2_sha256$30000$LhslZy3f0Rp4$EYrnsUtGors84bndfamlj30+DbyKKFn3qk+3S1jch7I=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:42.480Z", "username": "judy84", "name": "Tina Harper", "email": "linda@skyble.biz", "role": "Admin", "avatar": "", "wechat": "cheryl71", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "In hac habitasse platea dictumst.", "is_first_login": false, "date_expired": "2086-08-19T11:40:42.480Z", "created_by": "amanda72", "user_permissions": [], "groups": [1, 45]}}, {"model": "users.user", "pk": 83, "fields": {"password": "pbkdf2_sha256$30000$NCu7bqBfUSlM$CmK4q/j22I7Y2RlaL4qJC8xTWXTP87fK8p5Z8iM0vHQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:42.649Z", "username": "marie69", "name": "Alice Washington", "email": "katherine@yombu.edu", "role": "Admin", "avatar": "", "wechat": "julie82", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla.", "is_first_login": false, "date_expired": "2086-08-19T11:40:42.649Z", "created_by": "louise86", "user_permissions": [], "groups": [1, 34]}}, {"model": "users.user", "pk": 84, "fields": {"password": "pbkdf2_sha256$30000$bsTlGybCG4kn$u6FggNMQcbbIMI5FMAaXek8jPBcuAhsndO2LtHvPWfY=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:42.820Z", "username": "jacqueline94", "name": "Kathy Anderson", "email": "doris@podcat.mil", "role": "Admin", "avatar": "", "wechat": "janice86", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Pellentesque at nulla.", "is_first_login": false, "date_expired": "2086-08-19T11:40:42.820Z", "created_by": "mildred89", "user_permissions": [], "groups": [1, 70]}}, {"model": "users.user", "pk": 85, "fields": {"password": "pbkdf2_sha256$30000$0OBTuxURroAg$HbRxSmld8Z2KikNSyx2qDQeXD3qkHs99drogR4lMzSk=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:43.001Z", "username": "ruth78", "name": "Susan Andrews", "email": "tammy@bubbletube.net", "role": "User", "avatar": "", "wechat": "theresa91", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nulla justo.", "is_first_login": false, "date_expired": "2086-08-19T11:40:43.001Z", "created_by": "annie84", "user_permissions": [], "groups": [1, 75]}}, {"model": "users.user", "pk": 86, "fields": {"password": "pbkdf2_sha256$30000$uzuXDjRY9cGB$7orw9rme6gdmtIXd23kY5riyg9kBeqGrZv1OLwUN2Zg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:43.179Z", "username": "betty82", "name": "Nancy Ford", "email": "robin@chatterpoint.info", "role": "User", "avatar": "", "wechat": "angela75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi quis tortor id nulla ultrices aliquet.", "is_first_login": false, "date_expired": "2086-08-19T11:40:43.179Z", "created_by": "susan70", "user_permissions": [], "groups": [1, 62]}}, {"model": "users.user", "pk": 87, "fields": {"password": "pbkdf2_sha256$30000$ihbKKzqLVsA4$qpHDQiNB0SRhGMQNOC3pyjfoHs0oLE4X90agkbwIoTg=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:43.356Z", "username": "cynthia80", "name": "Cheryl Brown", "email": "julia@centizu.info", "role": "User", "avatar": "", "wechat": "margaret72", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras non velit nec nisi vulputate nonummy.", "is_first_login": false, "date_expired": "2086-08-19T11:40:43.356Z", "created_by": "heather70", "user_permissions": [], "groups": [1, 57]}}, {"model": "users.user", "pk": 88, "fields": {"password": "pbkdf2_sha256$30000$WTGLP7qH0AXv$ijXRG/BLJYM08HrZbXis0N1+3GZUQnYTmmOxMBqnZ08=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:43.526Z", "username": "lois88", "name": "Judith Wagner", "email": "laura@edgeclub.net", "role": "User", "avatar": "", "wechat": "stephanie75", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo.", "is_first_login": false, "date_expired": "2086-08-19T11:40:43.526Z", "created_by": "margaret83", "user_permissions": [], "groups": [1, 84]}}, {"model": "users.user", "pk": 89, "fields": {"password": "pbkdf2_sha256$30000$2Jb6tBXjnnKG$KocwomlWiXZxNupZEitcXj68n85x72PBe2xv6wEic0E=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:43.698Z", "username": "melissa87", "name": "Sara Elliott", "email": "sharon@aibox.net", "role": "User", "avatar": "", "wechat": "teresa80", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Praesent id massa id nisl venenatis lacinia.", "is_first_login": false, "date_expired": "2086-08-19T11:40:43.698Z", "created_by": "rose65", "user_permissions": [], "groups": [1, 78]}}, {"model": "users.user", "pk": 90, "fields": {"password": "pbkdf2_sha256$30000$z81LhOVt6DtF$OuG7y3Z4IFLXRvMb0SFVJGerWUWmvea8Z9VwYiMXy6Y=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:43.870Z", "username": "virginia71", "name": "Beverly Grant", "email": "kimberly@youbridge.info", "role": "Admin", "avatar": "", "wechat": "katherine78", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "is_first_login": false, "date_expired": "2086-08-19T11:40:43.870Z", "created_by": "marie69", "user_permissions": [], "groups": [1, 18]}}, {"model": "users.user", "pk": 91, "fields": {"password": "pbkdf2_sha256$30000$hQEf332JcoN3$07Qubl2SHJY/mH4HYTQ6O3q4OvosQZ+tka+yXkYWSkM=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:44.200Z", "username": "jennifer80", "name": "Donna Lawson", "email": "sharon@voonder.org", "role": "User", "avatar": "", "wechat": "joyce71", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Morbi a ipsum.", "is_first_login": false, "date_expired": "2086-08-19T11:40:44.200Z", "created_by": "jessica67", "user_permissions": [], "groups": [1, 9]}}, {"model": "users.user", "pk": 92, "fields": {"password": "pbkdf2_sha256$30000$787BXJlHQQyR$QVfF5bZEGTgJqGqJkJHIcGVRN9yFGejALpmKq9TCTAc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:44.372Z", "username": "louise73", "name": "Irene Hanson", "email": "lois@realcube.info", "role": "User", "avatar": "", "wechat": "theresa76", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.", "is_first_login": false, "date_expired": "2086-08-19T11:40:44.372Z", "created_by": "helen78", "user_permissions": [], "groups": [1, 69]}}, {"model": "users.user", "pk": 93, "fields": {"password": "pbkdf2_sha256$30000$TSpRU1MwSS9o$ji11Chzq8QYQ/5zELL+e7rsda3NovvmH64OPlovKV28=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:44.545Z", "username": "denise78", "name": "Amy Stevens", "email": "karen@topdrive.gov", "role": "Admin", "avatar": "", "wechat": "tammy63", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Duis aliquam convallis nunc.", "is_first_login": false, "date_expired": "2086-08-19T11:40:44.545Z", "created_by": "sara85", "user_permissions": [], "groups": [1, 39]}}, {"model": "users.user", "pk": 94, "fields": {"password": "pbkdf2_sha256$30000$KxdVhFziqW4Y$tV46izrsfKROm+eK1PQ3Spe2mA2DI7lpBRffBnXEkFs=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:44.716Z", "username": "beverly65", "name": "Pamela Murphy", "email": "kathleen@skyble.name", "role": "Admin", "avatar": "", "wechat": "cynthia79", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Ut at dolor quis odio consequat varius.", "is_first_login": false, "date_expired": "2086-08-19T11:40:44.716Z", "created_by": "judith78", "user_permissions": [], "groups": [1, 55]}}, {"model": "users.user", "pk": 95, "fields": {"password": "pbkdf2_sha256$30000$UT06FZhNcdT0$MHZ2vI4ILv4LNLxatI+uD4Ga3fmPykCbTVBwfCa2Vbc=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:44.886Z", "username": "pamela91", "name": "Kathleen Hall", "email": "ashley@quimm.com", "role": "Admin", "avatar": "", "wechat": "pamela65", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Quisque ut erat.", "is_first_login": false, "date_expired": "2086-08-19T11:40:44.887Z", "created_by": "amanda72", "user_permissions": [], "groups": [1, 12]}}, {"model": "users.user", "pk": 96, "fields": {"password": "pbkdf2_sha256$30000$R8LIMYuDIRDC$CD4ZZ45zNLJqB4IkhoRRxaCc5AzeV/TAPXd6WJ918ww=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:45.053Z", "username": "annie80", "name": "Donna Gonzales", "email": "ashley@blogpad.org", "role": "Admin", "avatar": "", "wechat": "jessica93", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.", "is_first_login": false, "date_expired": "2086-08-19T11:40:45.053Z", "created_by": "diana82", "user_permissions": [], "groups": [1, 2]}}, {"model": "users.user", "pk": 97, "fields": {"password": "pbkdf2_sha256$30000$EB1azYvjRy4a$+r3s13wiSHjDyfhUPy+FW3aHwWleOjynlayGt9udaBQ=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:45.220Z", "username": "rebecca64", "name": "Kathy Long", "email": "rachel@divanoodle.net", "role": "Admin", "avatar": "", "wechat": "lori73", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Praesent lectus.", "is_first_login": false, "date_expired": "2086-08-19T11:40:45.220Z", "created_by": "shirley67", "user_permissions": [], "groups": [1, 94]}}, {"model": "users.user", "pk": 98, "fields": {"password": "pbkdf2_sha256$30000$Gs8j1WNM4gd6$XX82CgsJb2LJEQpcrS52gZNv9KZA0GRERgdVhPiNzPs=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:40:45.400Z", "username": "robin76", "name": "Jane Pierce", "email": "diana@realcube.biz", "role": "User", "avatar": "", "wechat": "beverly87", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Integer non velit.", "is_first_login": false, "date_expired": "2086-08-19T11:40:45.400Z", "created_by": "christine65", "user_permissions": [], "groups": [1, 35]}}]
\ No newline at end of file
......@@ -62,7 +62,6 @@ INSTALLED_APPS = [
'rest_framework.authtoken',
'bootstrapform',
'captcha',
# 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
......@@ -266,45 +265,13 @@ REST_FRAMEWORK = {
'users.backends.IsValidUser',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'users.backends.TerminalAuthentication',
'users.backends.AccessTokenAuthentication',
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
'users.backends.TerminalAuthentication',
),
}
# 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'
# SESSION_REDIS_HOST = CONFIG.REDIS_HOST
# SESSION_REDIS_PORT = CONFIG.REDIS_PORT
# SESSION_REDIS_PASSWORD = CONFIG.REDIS_PASSWORD
# SESSION_REDIS_DB = CONFIG.REDIS_DB
# Custom User Auth model
AUTH_USER_MODEL = 'users.User'
......@@ -321,5 +288,3 @@ CELERY_RESULT_BACKEND = BROKER_URL
CAPTCHA_IMAGE_SIZE = (75, 33)
CAPTCHA_FOREGROUND_COLOR = '#001100'
#
......@@ -23,7 +23,7 @@ urlpatterns = [
url(r'^captcha/', include('captcha.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'^(api/)?assets/', include('assets.urls')),
url(r'^(api/)?perms/', include('perms.urls')),
url(r'^(api/)?audits/', include('audits.urls')),
url(r'^(api/)?terminal/', include('terminal.urls')),
......
......@@ -2,11 +2,20 @@
#
from rest_framework.views import APIView, Response
from users.backends import IsValidUser
from rest_framework.generics import ListCreateAPIView
from users.backends import IsValidUser, IsSuperUser
from .utils import get_user_granted_assets, get_user_granted_asset_groups
from .models import AssetPermission
from . import serializers
class UserAssetsGrantedApi(APIView):
class AssetPermissionListCreateApi(ListCreateAPIView):
queryset = AssetPermission.objects.all()
serializer_class = serializers.AssetPermissionSerializer
permission_classes = (IsSuperUser,)
class UserAssetsApi(APIView):
permission_classes = (IsValidUser,)
def get(self, request, *args, **kwargs):
......@@ -34,3 +43,59 @@ class UserAssetsGrantedApi(APIView):
return Response(assets_json, status=200)
class UserAssetsGroupsApi(APIView):
permission_classes = (IsValidUser,)
def get(self, request, *args, **kwargs):
asset_groups = {}
user = request.user
if user:
assets = get_user_granted_assets(user)
for asset in assets:
for asset_group in asset.groups.all():
if asset_group.id in asset_groups:
asset_groups[asset_group.id]['asset_num'] += 1
else:
asset_groups[asset_group.id] = {
'id': asset_group.id,
'name': asset_group.name,
'comment': asset_group.comment,
'asset_num': 1
}
asset_groups_json = asset_groups.values()
return Response(asset_groups_json, status=200)
class UserAssetsGroupAssetsApi(APIView):
permission_classes = (IsValidUser,)
def get(self, request, *args, **kwargs):
# asset_group_id = request.query_params.get('asset_group_id', -1)
asset_group_id = kwargs.get('pk', -1)
# asset_group_name = request.query_params.get('asset_group_name', '')
user = request.user
assets_json = []
if user:
assets = get_user_granted_assets(user)
for asset, system_users in assets.items():
for asset_group in asset.groups.all():
if str(asset_group.id) == asset_group_id: # and asset_group.name == asset_group_name:
assets_json.append({
'id': asset.id,
'hostname': asset.hostname,
'ip': asset.ip,
'port': asset.port,
'system_users': [
{
'id': system_user.id,
'name': system_user.name,
'username': system_user.username,
} for system_user in system_users
],
'comment': asset.comment
})
return Response(assets_json, status=200)
......@@ -6,9 +6,18 @@ from django.utils.translation import ugettext_lazy as _
# from .hands import User, UserGroup, Asset, AssetGroup, SystemUser
from .models import AssetPermission
from .hands import associate_system_users_with_assets
class AssetPermissionForm(forms.ModelForm):
def save(self, commit=True):
instance = super(AssetPermissionForm, self).save(commit=commit)
assets = instance.assets.all()
asset_groups = instance.asset_groups.all()
system_users = instance.system_users.all()
associate_system_users_with_assets(system_users, assets, asset_groups)
return instance
class Meta:
model = AssetPermission
......@@ -34,3 +43,4 @@ class AssetPermissionForm(forms.ModelForm):
'asset_groups': '* Asset or Asset group at least one required',
'system_users': '* required',
}
......@@ -2,7 +2,13 @@
#
from users.utils import AdminUserRequiredMixin
# from users.backends import IsValdiUser
from users.models import User, UserGroup
from assets.models import Asset, AssetGroup, SystemUser
def associate_system_users_with_assets(system_users, assets, asset_groups):
for asset in assets:
asset.system_users.add(*tuple(system_users))
for asset_group in asset_groups:
asset_group.system_users.add(*tuple(system_users))
......@@ -11,19 +11,19 @@ from common.utils import date_expired_default, combine_seq
class AssetPermission(models.Model):
PRIVATE_FOR_CHOICE = (
('N', 'None'),
('U', 'user'),
('G', 'user group'),
)
# PRIVATE_FOR_CHOICE = (
# ('N', 'None'),
# ('U', 'user'),
# ('G', 'user group'),
# )
name = models.CharField(max_length=128, unique=True, verbose_name=_('Name'))
users = models.ManyToManyField(User, related_name='asset_permissions', blank=True)
user_groups = models.ManyToManyField(UserGroup, related_name='asset_permissions', blank=True)
assets = models.ManyToManyField(Asset, related_name='granted_by_permissions', blank=True)
asset_groups = models.ManyToManyField(AssetGroup, related_name='granted_by_permissions', blank=True)
system_users = models.ManyToManyField(SystemUser, related_name='granted_by_permissions')
private_for = models.CharField(choices=PRIVATE_FOR_CHOICE, max_length=1, default='N', blank=True,
verbose_name=_('Private for'))
# private_for = models.CharField(choices=PRIVATE_FOR_CHOICE, max_length=1, default='N', blank=True,
# verbose_name=_('Private for'))
is_active = models.BooleanField(default=True, verbose_name=_('Active'))
date_expired = models.DateTimeField(default=date_expired_default, verbose_name=_('Date expired'))
created_by = models.CharField(max_length=128, blank=True, verbose_name=_('Created by'))
......
# -*- coding: utf-8 -*-
#
from rest_framework import serializers
from .models import AssetPermission
class AssetPermissionSerializer(serializers.ModelSerializer):
# users_amount = serializers.SerializerMethodField()
# user_groups_amount = serializers.SerializerMethodField()
# assets_amount = serializers.SerializerMethodField()
# asset_groups_amount = serializers.SerializerMethodField()
class Meta:
model = AssetPermission
fields = ['id', 'name', 'users', 'user_groups', 'assets', 'asset_groups',
'system_users', 'is_active', 'comment', 'date_expired']
# @staticmethod
# def get_users_amount(obj):
# return obj.users.count()
#
# @staticmethod
# def get_user_groups_amount(obj):
# return obj.user_groups.count()
#
# @staticmethod
# def get_assets_amount(obj):
# return obj.assets.count()
#
# @staticmethod
# def get_asset_groups_amount(obj):
# return obj.asset_groups.count()
......@@ -76,7 +76,7 @@
</div>
{% endblock %}
{% block custom_foot_js %}
<script src="{% static 'js/plugins/datapicker/bootstrap-datepicker.js' %}"></script>
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
<script>
$(document).ready(function () {
$('.select2').select2();
......
......@@ -28,6 +28,9 @@
<a href="{% url 'perms:asset-permission-asset-list' pk=asset_permission.id %}" class="text-center">
<i class="fa fa-bar-chart-o"></i> {% trans 'Assets and asset groups' %}</a>
</li>
<li class="pull-right">
<a class="btn btn-outline btn-default" href="{% url 'perms:asset-permission-update' pk=asset_permission.id %}"><i class="fa fa-edit"></i>Update</a>
</li>
</ul>
</div>
<div class="tab-content">
......
......@@ -6,32 +6,28 @@
{% 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 'perms:asset-permission-list' %}?sort=name">{% trans 'Name' %}</a></th>
<th class="text-center">{% trans 'User count' %}</th>
<th class="text-center">{% trans 'User group count' %}</th>
<th class="text-center">{% trans 'Asset count' %}</th>
<th class="text-center">{% trans 'Asset group count' %}</th>
<th class="text-center">{% trans 'System user count' %}</th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=date_expired">{% trans 'Is valid' %}</a></th>
<th class="text-center"></th>
<th class="text-center">{% trans 'ID' %}</th>
<th class="text-center">{% trans 'Name' %}</th>
<th class="text-center">{% trans 'User' %}</th>
<th class="text-center">{% trans 'User group' %}</th>
<th class="text-center">{% trans 'Asset' %}</th>
<th class="text-center">{% trans 'Asset group' %}</th>
<th class="text-center">{% trans 'System user' %}</th>
<th class="text-center">{% trans 'Is valid' %}</th>
<th class="text-center">{% trans 'Action' %}</th>
{% endblock %}
{% block table_body %}
{% for asset_permission in asset_permission_list %}
<tr class="gradeX">
<td class="text-center">
<input type="checkbox" name="checked" value="{{ asset_permission.id }}">
</td>
<td class="text-center">{{ asset_permission.id }}</td>
<td class="text-center">
<a href="{% url 'perms:asset-permission-detail' pk=asset_permission.id %}">
{{ asset_permission.name }}
</a>
</td>
<td class="text-center">{{ asset_permission.users.count}}</td>
<td class="text-center">{{ asset_permission.user_groups.count}}</td>
<td class="text-center">{{ asset_permission.users.count }}</td>
<td class="text-center">{{ asset_permission.user_groups.count }}</td>
<td class="text-center">{{ asset_permission.assets.count }}</td>
<td class="text-center">{{ asset_permission.asset_groups.count }}</td>
<td class="text-center">{{ asset_permission.system_users.count }}</td>
......@@ -50,24 +46,14 @@
{% 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>{% trans 'Delete selected' %}</option>
<option>{% trans 'Update selected' %}</option>
<option>{% trans 'Deactive selected' %}</option>
<option>{% trans 'Export selected' %}</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">
{% trans 'Submit' %}
</button>
</div>
</div>
</form>
{% block custom_foot_js %}
<script>
$(document).ready(function() {
$('table').DataTable({
"searching": false,
"paging": false,
"order": []
})
})
</script>
{% endblock %}
......@@ -22,7 +22,13 @@ urlpatterns = [
]
urlpatterns += [
url(r'^v1/user/assets/granted/$', api.UserAssetsGrantedApi.as_view(),
name='user-assets-granted'),
url(r'^v1/asset-permission/$', api.AssetPermissionListCreateApi.as_view(),
name='asset-permission-list-create-api'),
url(r'^v1/user/assets/$', api.UserAssetsApi.as_view(),
name='user-assets'),
url(r'^v1/user/asset-groups/$', api.UserAssetsGroupsApi.as_view(),
name='user-asset-groups'),
url(r'^v1/user/asset-groups/(?P<pk>[0-9]+)/assets/$', api.UserAssetsGroupAssetsApi.as_view(),
name='user-asset-groups-assets'),
]
......@@ -34,7 +34,6 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
return super(AssetPermissionListView, self).get_context_data(**kwargs)
def get_queryset(self):
# Todo: Default order by lose asset connection num
self.queryset = super(AssetPermissionListView, self).get_queryset()
self.keyword = keyword = self.request.GET.get('keyword', '')
self.sort = sort = self.request.GET.get('sort', '-date_created')
......
......@@ -34,7 +34,7 @@ th a {
}
.select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #1ab394;
background-color: #1ab394 !important;
color: white;
}
......
......@@ -283,9 +283,10 @@ jumpserver.initDataTable = function (options) {
var ele = options.ele || $('.dataTable');
var columnDefs = [
{
targets: 0, orderable: false,
targets: 0,
orderable: false,
createdCell: function(td) {
$(td).html('<div class="checkbox checkbox-default"><input type="checkbox" class="ipt_check"><label></label></div>');
$(td).html('<input type="checkbox" class="ipt_check">');
}
},
{className: 'text-center', targets: '_all'}
......
......@@ -33,15 +33,19 @@
<div class="" id="content_start">
{% block content_left_head %} {% endblock %}
{% block table_search %}
<form id="search_form" method="get" action="" class="pull-right mail-search">
<form id="search_form" method="get" action="" class="pull-right mail-search form-inline">
{% block search_form %}
<div class="input-group">
<input type="text" class="form-control input-sm" name="keyword" placeholder="Search" value="{{ keyword }}">
</div>
<div class="input-group">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
搜索
</button>
</div>
</div>
{% endblock %}
</form>
{% endblock %}
{% block tags_list %}{% endblock %}
......
......@@ -34,7 +34,7 @@
</li>
</ul>
</li>
<li id="">
<li id="terminal">
<a href="{% url 'terminal:terminal-list' %}">
<i class="fa fa-desktop"></i><span class="nav-label">{% trans 'Terminal' %}</span><span class="label label-info pull-right"></span>
</a>
......
......@@ -5,7 +5,7 @@ from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIV
from rest_framework.views import APIView, Response
from rest_framework.permissions import AllowAny
from common.utils import unsign, get_object_or_none
from common.utils import signer, get_object_or_none
from .models import Terminal, TerminalHeatbeat
from .serializers import TerminalSerializer, TerminalHeatbeatSerializer
from .hands import IsSuperUserOrTerminalUser
......@@ -17,7 +17,7 @@ class TerminalCreateListApi(ListCreateAPIView):
permission_classes = (AllowAny,)
def post(self, request, *args, **kwargs):
name = unsign(request.data.get('name', ''))
name = signer.unsign(request.data.get('name', ''))
if name:
terminal = get_object_or_none(Terminal, name=name)
if terminal:
......
......@@ -60,7 +60,7 @@
</div>
{% endblock %}
{% block custom_foot_js %}
<script src="{% static 'js/plugins/datapicker/bootstrap-datepicker.js' %}"></script>
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
<script>
$(document).ready(function () {
$('.select2').select2();
......
# ~*~ coding: utf-8 ~*~
#
from django.shortcuts import get_object_or_404
import base64
from django.shortcuts import get_object_or_404
from django.core.cache import cache
from django.conf import settings
from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_bulk import ListBulkCreateUpdateDestroyAPIView
from rest_framework import authentication
from common.mixins import BulkDeleteApiMixin
from common.utils import get_logger
from .utils import check_user_valid, token_gen
from .models import User, UserGroup
from .serializers import UserDetailSerializer, UserAndGroupSerializer, \
GroupDetailSerializer, UserPKUpdateSerializer, UserBulkUpdateSerializer, GroupBulkUpdateSerializer
......@@ -113,21 +119,25 @@ class DeleteUserFromGroupApi(generics.DestroyAPIView):
instance.users.remove(user)
class AppUserRegisterApi(generics.CreateAPIView):
"""App send a post request to register a app user
request params contains `username_signed`, You can unsign it,
username = unsign(username_signed), if you get the username,
It's present it's a valid request, or return (401, Invalid request),
then your should check if the user exist or not. If exist,
return (200, register success), If not, you should be save it, and
notice admin user, The user default is not active before admin user
unblock it.
Save fields:
username:
name: name + request.ip
email: username + '@app.org'
role: App
"""
pass
class UserTokenApi(APIView):
permission_classes = ()
expiration = settings.CONFIG.TOKEN_EXPIRATION or 3600
def post(self, request, *args, **kwargs):
username = request.data.get('username', '')
password = request.data.get('password', '')
public_key = request.data.get('public_key', '')
remote_addr = request.META.get('REMOTE_ADDR', '')
remote_addr = base64.b64encode(remote_addr).replace('=', '')
user = check_user_valid(username=username, password=password, public_key=public_key)
if user:
token = cache.get('%s_%s' % (user.id, remote_addr))
if not token:
token = token_gen(user)
cache.set(token, user.id, self.expiration)
cache.set('%s_%s' % (user.id, remote_addr), token, self.expiration)
return Response({'token': token, 'id': user.id, 'username': user.username, 'name': user.name})
else:
return Response({'msg': 'Invalid password or public key or user is not active or expired'})
# -*- coding: utf-8 -*-
#
import base64
from django.core.cache import cache
from django.conf import settings
from django.utils.translation import ugettext as _
from rest_framework import authentication, exceptions, permissions
from rest_framework.compat import is_authenticated
from django.utils.translation import ugettext as _
from common.utils import unsign, get_object_or_none
from common.utils import signer, get_object_or_none
from .hands import Terminal
from .models import User
class TerminalAuthentication(authentication.BaseAuthentication):
......@@ -35,7 +39,7 @@ class TerminalAuthentication(authentication.BaseAuthentication):
return self.authenticate_credentials(sign)
def authenticate_credentials(self, sign):
name = unsign(sign, max_age=300)
name = signer.unsign(sign)
if name:
terminal = get_object_or_none(self.model, name=name)
else:
......@@ -47,6 +51,46 @@ class TerminalAuthentication(authentication.BaseAuthentication):
return terminal, None
class AccessTokenAuthentication(authentication.BaseAuthentication):
keyword = 'Token'
model = User
expiration = settings.CONFIG.TOKEN_EXPIRATION or 3600
def authenticate(self, request):
auth = authentication.get_authorization_header(request).split()
if not auth or auth[0].lower() != self.keyword.lower().encode():
return None
if len(auth) == 1:
msg = _('Invalid token header. No credentials provided.')
raise exceptions.AuthenticationFailed(msg)
elif len(auth) > 2:
msg = _('Invalid token header. Sign string should not contain spaces.')
raise exceptions.AuthenticationFailed(msg)
try:
token = auth[1].decode()
except UnicodeError:
msg = _('Invalid token header. Sign string should not contain invalid characters.')
raise exceptions.AuthenticationFailed(msg)
return self.authenticate_credentials(token, request)
def authenticate_credentials(self, token, request):
user_id = cache.get(token)
user = get_object_or_none(User, id=user_id)
if not user:
return None
remote_addr = request.META.get('REMOTE_ADDR', '')
remote_addr = base64.b16encode(remote_addr).replace('=', '')
cache.set(token, user_id, self.expiration)
cache.set('%s_%s' % (user.id, remote_addr), token, self.expiration)
return user, None
class IsValidUser(permissions.IsAuthenticated, permissions.BasePermission):
"""Allows access to valid user, is active and not expired"""
......
......@@ -27,6 +27,7 @@ class UserCreateForm(forms.ModelForm):
]
help_texts = {
'username': '* required',
'name': '* required',
'email': '* required',
}
widgets = {
......@@ -107,7 +108,7 @@ class UserPrivateAssetPermissionForm(forms.ModelForm):
def save(self, commit=True):
self.instance = super(UserPrivateAssetPermissionForm, self).save(commit=commit)
self.instance.private_for = 'U'
# self.instance.private_for = 'U'
self.instance.users = [self.user]
self.instance.save()
return self.instance
......@@ -115,7 +116,7 @@ class UserPrivateAssetPermissionForm(forms.ModelForm):
class Meta:
model = AssetPermission
fields = [
'assets', 'asset_groups', 'system_users', 'private_for', 'name',
'assets', 'asset_groups', 'system_users', 'name',
]
widgets = {
'assets': forms.SelectMultiple(attrs={'class': 'select2',
......
......@@ -15,7 +15,7 @@ from django.shortcuts import reverse
from rest_framework.authtoken.models import Token
from common.utils import encrypt, decrypt, date_expired_default
from common.utils import signer, date_expired_default
from common.mixins import NoDeleteModelMixin
......@@ -72,7 +72,7 @@ class User(AbstractUser):
)
username = models.CharField(max_length=20, unique=True, verbose_name=_('Username'))
name = models.CharField(max_length=20, blank=True, verbose_name=_('Name'))
name = models.CharField(max_length=20, verbose_name=_('Name'))
email = models.EmailField(max_length=30, unique=True, verbose_name=_('Email'))
groups = models.ManyToManyField(UserGroup, related_name='users', blank=True, verbose_name=_('User group'))
role = models.CharField(choices=ROLE_CHOICES, default='User', max_length=10, blank=True, verbose_name=_('Role'))
......@@ -120,19 +120,19 @@ class User(AbstractUser):
@property
def private_key(self):
return decrypt(self._private_key)
return signer.unsign(self._private_key)
@private_key.setter
def private_key(self, private_key_raw):
self._private_key = encrypt(private_key_raw)
self._private_key = signer.sign(private_key_raw)
@property
def public_key(self):
return decrypt(self._public_key)
return signer.unsign(self._public_key)
@public_key.setter
def public_key(self, public_key_raw):
self._public_key = encrypt(public_key_raw)
self._public_key = signer.sign(public_key_raw)
@property
def is_superuser(self):
......@@ -193,13 +193,18 @@ class User(AbstractUser):
return True
return False
def check_public_key(self, public_key):
if self.public_key == public_key:
return True
return False
def generate_reset_token(self):
return signing.dumps({'reset': self.id, 'email': self.email})
return signer.sign_t({'reset': self.id, 'email': self.email}, expires_in=3600)
@classmethod
def validate_reset_token(cls, token, max_age=3600):
def validate_reset_token(cls, token):
try:
data = signing.loads(token, max_age=max_age)
data = signer.unsign_t(token)
user_id = data.get('reset', None)
user_email = data.get('email', '')
user = cls.objects.get(id=user_id, email=user_email)
......@@ -270,10 +275,10 @@ def 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
# @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
......@@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin
from common.utils import unsign
from common.utils import signer
from .models import User, UserGroup
......@@ -84,14 +84,3 @@ class GroupBulkUpdateSerializer(BulkSerializerMixin, serializers.ModelSerializer
def get_user_amount(obj):
return obj.users.count()
class AppUserRegisterSerializer(serializers.Serializer):
username = serializers.CharField(max_length=20)
def create(self, validated_data):
sign = validated_data('username', '')
username = unsign(sign)
pass
def update(self, instance, validated_data):
pass
......@@ -32,8 +32,8 @@
{% csrf_token %}
<h3>{% trans 'Account' %}</h3>
{% block username %} {% endblock %}
{{ form.email|bootstrap_horizontal }}
{{ form.name|bootstrap_horizontal }}
{{ form.email|bootstrap_horizontal }}
{{ form.groups|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
......@@ -79,7 +79,7 @@
</div>
{% endblock %}
{% block custom_foot_js %}
<script src="{% static 'js/plugins/datapicker/bootstrap-datepicker.js' %}"></script>
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
<script>
$(document).ready(function () {
$('.select2').select2();
......
......@@ -21,7 +21,8 @@ div.dataTables_wrapper div.dataTables_filter {
<thead>
<tr>
<th class="text-center">
<div class="checkbox checkbox-default"><input id="" type="checkbox" class="ipt_check_all"><label></label></div>
{# <div><input id="" type="checkbox" class="ipt_check_all"><label></label></div>#}
<input id="" type="checkbox" class="ipt_check_all">
</th>
<th class="text-center">{% trans 'Name' %}</th>
<th class="text-center">{% trans 'Username' %}</th>
......
......@@ -36,6 +36,7 @@ urlpatterns = [
urlpatterns += [
url(r'^v1/users/$', api.UserListUpdateApi.as_view(), name='user-bulk-update-api'),
url(r'^v1/users/token/$', api.UserTokenApi.as_view(), name='user-token-api'),
url(r'^v1/users/(?P<pk>\d+)/$', api.UserDetailApi.as_view(), name='user-patch-api'),
url(r'^v1/users/(?P<pk>\d+)/reset-password/$', api.UserResetPasswordApi.as_view(), name='user-reset-password-api'),
url(r'^v1/users/(?P<pk>\d+)/reset-pk/$', api.UserResetPKApi.as_view(), name='user-reset-pk-api'),
......
......@@ -4,6 +4,7 @@ from __future__ import unicode_literals
import logging
import os
import re
import uuid
from django.conf import settings
from django.contrib.auth.mixins import UserPassesTestMixin
......@@ -206,18 +207,20 @@ def validate_ssh_pk(text):
return startState([n.strip() for n in text.splitlines()])
def check_user_is_valid(**kwargs):
def check_user_valid(**kwargs):
password = kwargs.pop('password', None)
public_key = kwargs.pop('public_key', None)
user = get_object_or_none(User, **kwargs)
if password and not user.check_password(password):
user = None
if user is None or not user.is_valid:
return None
if password and user.check_password(password):
return user
if public_key and user.public_key == public_key:
return user
return None
if public_key and not user.public_key == public_key:
user = None
if user and user.is_valid:
return user
def token_gen(*args, **kwargs):
return uuid.uuid4().get_hex()
return None
......@@ -10,6 +10,7 @@
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
LOG_DIR = os.path.join(BASE_DIR, 'logs')
class Config:
......@@ -23,7 +24,6 @@ class Config:
# 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]
# Todo: May be use :method: get_current_site more grace, bug restful api unknown ok or not
SITE_URL = 'http://localhost'
# Django security setting, if your disable debug model, you should setting that
......@@ -53,13 +53,21 @@ class Config:
# 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 = '0.0.0.0'
HTTP_BIND_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 = ''
REDIS_PASSWORD = ''
BROKER_URL = 'redis://%(password)s%(host)s:%(port)s/3' % {
'password': REDIS_PASSWORD,
'host': REDIS_HOST,
'port': REDIS_PORT,
}
# Api token expiration when create
TOKEN_EXPIRATION = 3600
# Email SMTP setting, we only support smtp send mail
# EMAIL_HOST = 'smtp.qq.com'
......@@ -70,10 +78,6 @@ class Config:
# EMAIL_USE_TLS = False # If port is 587, set True
# EMAIL_SUBJECT_PREFIX = '[Jumpserver] '
# SSH use password or public key for auth
SSH_PASSWORD_AUTH = False
SSH_PUBLIC_KEY_AUTH = True
def __init__(self):
pass
......@@ -86,6 +90,14 @@ class DevelopmentConfig(Config):
DISPLAY_PER_PAGE = 20
DB_ENGINE = 'sqlite'
DB_NAME = os.path.join(BASE_DIR, 'db.sqlite3')
EMAIL_HOST = 'smtp.exmail.qq.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'ask@jumpserver.org'
EMAIL_HOST_PASSWORD = 'xfDf4x1n'
EMAIL_USE_SSL = True # If port is 465, set True
EMAIL_USE_TLS = False # If port is 587, set True
EMAIL_SUBJECT_PREFIX = '[Jumpserver] '
SITE_URL = 'http://localhost:8080'
class ProductionConfig(Config):
......@@ -106,3 +118,4 @@ config = {
}
env = 'development'
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