mirror of https://github.com/jumpserver/jumpserver
[Change] 添加翻译,并添加用户登陆页面
parent
a4ad9b49b9
commit
4e7b665ea8
|
@ -11,7 +11,7 @@ from django.shortcuts import get_object_or_404
|
|||
|
||||
from common.mixins import IDInFilterMixin
|
||||
from common.utils import get_object_or_none, signer
|
||||
from .hands import IsSuperUser, IsAppUser
|
||||
from .hands import IsSuperUser, IsAppUser, IsValidUser, get_user_granted_assets
|
||||
from .models import AssetGroup, Asset, IDC, SystemUser, AdminUser
|
||||
from . import serializers
|
||||
|
||||
|
@ -20,10 +20,13 @@ class AssetViewSet(IDInFilterMixin, BulkModelViewSet):
|
|||
"""API endpoint that allows Asset to be viewed or edited."""
|
||||
queryset = Asset.objects.all()
|
||||
serializer_class = serializers.AssetSerializer
|
||||
permission_classes = (IsSuperUser,)
|
||||
permission_classes = (IsValidUser,)
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = super(AssetViewSet, self).get_queryset()
|
||||
if self.request.user.is_superuser:
|
||||
queryset = super(AssetViewSet, self).get_queryset()
|
||||
else:
|
||||
queryset = get_user_granted_assets(self.request.user)
|
||||
idc_id = self.request.query_params.get('idc_id', '')
|
||||
system_users_id = self.request.query_params.get('system_user_id', '')
|
||||
asset_group_id = self.request.query_params.get('asset_group_id', '')
|
||||
|
|
|
@ -12,5 +12,6 @@
|
|||
|
||||
|
||||
from users.utils import AdminUserRequiredMixin
|
||||
from users.permissions import IsAppUser, IsSuperUser
|
||||
from users.permissions import IsAppUser, IsSuperUser, IsValidUser
|
||||
from users.models import User, UserGroup
|
||||
from perms.utils import get_user_granted_assets
|
|
@ -99,7 +99,12 @@ class Asset(models.Model):
|
|||
return False, warning
|
||||
|
||||
def to_json(self):
|
||||
pass
|
||||
return {
|
||||
'id': self.id,
|
||||
'hostname': self.hostname,
|
||||
'ip': self.ip,
|
||||
'port': self.port,
|
||||
}
|
||||
|
||||
def _to_secret_json(self):
|
||||
"""Ansible use it create inventory"""
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<div class="panel-options">
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active">
|
||||
<a href="" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Asset detail' %} </a>
|
||||
<a href="{% url 'assets:asset-detail' %}" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Asset detail' %} </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>
|
||||
|
|
|
@ -0,0 +1,266 @@
|
|||
{% extends '_base_list.html' %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
{% block custom_head_css_js %}
|
||||
<link href="{% static 'css/plugins/select2/select2.min.css' %}" rel="stylesheet">
|
||||
<script src="{% static 'js/plugins/select2/select2.full.min.js' %}"></script>
|
||||
|
||||
<style>
|
||||
.custom{
|
||||
margin-right:5px;
|
||||
}
|
||||
#modal .modal-body { max-height: 200px; }
|
||||
</style>
|
||||
{% endblock %}
|
||||
{% block content_left_head %}{% endblock %}
|
||||
|
||||
{% block table_search %}
|
||||
{# <div class="html5buttons">#}
|
||||
{# <div class="dt-buttons btn-group">#}
|
||||
{# <a class="btn btn-default btn_export" tabindex="0">#}
|
||||
{# <span>{% trans "Export" %}</span>#}
|
||||
{# </a>#}
|
||||
{# </div>#}
|
||||
{# </div>#}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block table_container %}
|
||||
<table class="table table-striped table-bordered table-hover " id="asset_list_table" >
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-center"><input type="checkbox" class="ipt_check_all"></th>
|
||||
<th class="text-center">{% trans 'Hostname' %}</th>
|
||||
<th class="text-center">{% trans 'IP' %}</th>
|
||||
<th class="text-center">{% trans 'Port' %}</th>
|
||||
<th class="text-center">{% trans 'Type' %}</th>
|
||||
<th class="text-center">{% trans 'Env' %}</th>
|
||||
<th class="text-center">{% trans 'Hardware' %}</th>
|
||||
<th class="text-center">{% trans 'Valid' %}</th>
|
||||
<th class="text-center">{% trans 'Alive' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
</tbody>
|
||||
</table>
|
||||
{% include 'assets/_asset_import_modal.html' %}
|
||||
{% include 'assets/_asset_bulk_update_modal.html' %}
|
||||
{% endblock %}
|
||||
|
||||
{% block custom_foot_js %}
|
||||
<script src="{% static 'js/jquery.form.min.js' %}"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
var options = {
|
||||
ele: $('#asset_list_table'),
|
||||
columnDefs: [
|
||||
{targets: 1, createdCell: function (td, cellData, rowData) {
|
||||
var detail_btn = '<a href="{% url "assets:asset-detail" pk=99991937 %}">' + cellData + '</a>';
|
||||
$(td).html(detail_btn.replace('99991937', rowData.id));
|
||||
}},
|
||||
{targets: 7, 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: 8, createdCell: function (td, cellData) {
|
||||
if (!cellData) {
|
||||
$(td).html('<i class="fa fa-circle text-danger"></i>')
|
||||
} else {
|
||||
$(td).html('<i class="fa fa-circle text-navy"></i>')
|
||||
}
|
||||
}}
|
||||
],
|
||||
ajax_url: '{% url "api-assets:asset-list" %}',
|
||||
columns: [{data: "id"}, {data: "hostname" }, {data: "ip" }, {data: "port" },
|
||||
{data: "get_type_display" }, {data: "get_env_display"}, {data: "hardware"},
|
||||
{data: "is_active" }, {data: "is_active"}],
|
||||
};
|
||||
var table = jumpserver.initDataTable(options);
|
||||
$('.btn_export').click(function () {
|
||||
var assets = [];
|
||||
var rows = table.rows('.selected').data();
|
||||
$.each(rows, function (index, obj) {
|
||||
assets.push(obj.id)
|
||||
});
|
||||
console.log(assets);
|
||||
$.ajax({
|
||||
url: "{% url "assets:asset-export" %}",
|
||||
method: 'POST',
|
||||
data: JSON.stringify({assets_id: assets}),
|
||||
dataType: "json",
|
||||
success: function (data, textStatus) {
|
||||
window.open(data.redirect)
|
||||
},
|
||||
error: function () {
|
||||
toastr.error('Export failed');
|
||||
}
|
||||
})
|
||||
});
|
||||
$('#btn_asset_import').click(function() {
|
||||
var $form = $('#fm_asset_import');
|
||||
$form.find('.help-block').remove();
|
||||
function success (data) {
|
||||
if (data.valid === false) {
|
||||
$('<span />', {class: 'help-block text-danger'}).html(data.msg).insertAfter($('#id_assets'));
|
||||
} else {
|
||||
$('#id_created').html(data.created_info);
|
||||
$('#id_created_detail').html(data.created.join(', '));
|
||||
$('#id_updated').html(data.updated_info);
|
||||
$('#id_updated_detail').html(data.updated.join(', '));
|
||||
$('#id_failed').html(data.failed_info);
|
||||
$('#id_failed_detail').html(data.failed.join(', '));
|
||||
var $data_table = $('#asset_list_table').DataTable();
|
||||
$data_table.ajax.reload();
|
||||
}
|
||||
}
|
||||
$form.ajaxSubmit({success: success});
|
||||
})
|
||||
})
|
||||
|
||||
.on('click', '.btn_asset_delete', function () {
|
||||
var $this = $(this);
|
||||
var name = $(this).closest("tr").find(":nth-child(2)").children('a').html();
|
||||
var uid = $this.data('uid');
|
||||
var the_url = '{% url "api-assets:asset-detail" pk=99991937 %}'.replace('99991937', uid);
|
||||
objectDelete($this, name, the_url);
|
||||
})
|
||||
|
||||
.on('click', '#btn_bulk_update', function () {
|
||||
var action = $('#slct_bulk_update').val();
|
||||
var $data_table = $('#asset_list_table').DataTable();
|
||||
var id_list = [];
|
||||
var plain_id_list = [];
|
||||
$data_table.rows({selected: true}).every(function(){
|
||||
id_list.push({id: this.data().id});
|
||||
plain_id_list.push(this.data().id);
|
||||
});
|
||||
if (plain_id_list.length == 0) {
|
||||
return false;
|
||||
}
|
||||
var the_url = "{% url 'api-assets:asset-list' %}";
|
||||
function doDeactive() {
|
||||
var body = $.each(id_list, function(index, asset_object) {
|
||||
asset_object['is_active'] = false;
|
||||
});
|
||||
APIUpdateAttr({url: the_url, method: 'PATCH', body: JSON.stringify(body)});
|
||||
$data_table.ajax.reload();
|
||||
jumpserver.checked = false;
|
||||
}
|
||||
function doActive() {
|
||||
var body = $.each(id_list, function(index, asset_object) {
|
||||
asset_object['is_active'] = true;
|
||||
});
|
||||
APIUpdateAttr({url: the_url, method: 'PATCH', body: JSON.stringify(body)});
|
||||
$data_table.ajax.reload();
|
||||
jumpserver.checked = false;
|
||||
}
|
||||
function doDelete() {
|
||||
swal({
|
||||
title: "{% trans 'Are you sure?' %}",
|
||||
text: "{% trans 'This will delete the selected assets !!!' %}",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: "#DD6B55",
|
||||
confirmButtonText: "{% trans 'Confirm' %}",
|
||||
closeOnConfirm: false
|
||||
}, function() {
|
||||
var success = function() {
|
||||
var msg = "{% trans 'Asset Deleted.' %}";
|
||||
swal("{% trans 'Asset Delete' %}", msg, "success");
|
||||
$('#asset_list_table').DataTable().ajax.reload();
|
||||
};
|
||||
var fail = function() {
|
||||
var msg = "{% trans 'Asset Deleting failed.' %}";
|
||||
swal("{% trans 'Asset Delete' %}", msg, "error");
|
||||
};
|
||||
var url_delete = the_url + '?id__in=' + JSON.stringify(plain_id_list);
|
||||
APIUpdateAttr({url: url_delete, method: 'DELETE', success: success, error: fail});
|
||||
$data_table.ajax.reload();
|
||||
jumpserver.checked = false;
|
||||
});
|
||||
}
|
||||
function doUpdate() {
|
||||
$('#asset_bulk_update_modal').modal('show');
|
||||
}
|
||||
switch(action) {
|
||||
case 'deactive':
|
||||
doDeactive();
|
||||
break;
|
||||
case 'delete':
|
||||
doDelete();
|
||||
break;
|
||||
case 'update':
|
||||
doUpdate();
|
||||
break;
|
||||
case 'active':
|
||||
doActive();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
})
|
||||
|
||||
.on('click', '#btn_asset_bulk_update', function () {
|
||||
var json_data = $("#fm_asset_bulk_update").serializeObject();
|
||||
var body = {};
|
||||
body.enable_otp = (json_data.enable_otp === 'on')? true: false;
|
||||
if (json_data.type != '') {
|
||||
body.type = json_data.type;
|
||||
}
|
||||
if (json_data.groups != undefined) {
|
||||
body.groups = json_data.groups;
|
||||
}
|
||||
if (typeof body.groups === 'string') {
|
||||
body.groups = [parseInt(body.groups)]
|
||||
} else if(typeof body.groups === 'array') {
|
||||
var new_groups = body.groups.map(Number);
|
||||
body.groups = new_groups;
|
||||
}
|
||||
|
||||
if (json_data.system_users != undefined) {
|
||||
body.system_users = json_data.system_users;
|
||||
}
|
||||
if (typeof body.system_users === 'string') {
|
||||
body.system_users = [parseInt(body.system_users)]
|
||||
} else if(typeof body.system_users === 'array') {
|
||||
var new_users = body.system_users.map(Number);
|
||||
body.system_users = new_users;
|
||||
}
|
||||
|
||||
if (json_data.tags != undefined) {
|
||||
body.tags = json_data.tags;
|
||||
}
|
||||
if (typeof body.tags == 'string') {
|
||||
body.tags = [parseInt(body.tags)];
|
||||
} else if (typeof body.tags === 'array') {
|
||||
var new_tags = body.tags.map(Number);
|
||||
body.tags = new_tags;
|
||||
}
|
||||
|
||||
var $data_table = $('#asset_list_table').DataTable();
|
||||
var post_list = [];
|
||||
$data_table.rows({selected: true}).every(function(){
|
||||
var content = Object.assign({id: this.data().id}, body);
|
||||
post_list.push(content);
|
||||
});
|
||||
if (post_list === []) {
|
||||
return false
|
||||
}
|
||||
var the_url = "{% url 'api-assets:asset-list' %}";
|
||||
var success = function() {
|
||||
var msg = "{% trans 'The selected assets has been updated successfully.' %}";
|
||||
swal("{% trans 'Asset Updated' %}", msg, "success");
|
||||
$('#asset_list_table').DataTable().ajax.reload();
|
||||
jumpserver.checked = false;
|
||||
};
|
||||
console.log(JSON.stringify(post_list));
|
||||
console.log(the_url);
|
||||
{# APIUpdateAttr({url: the_url, method: 'PATCH', body: JSON.stringify(post_list), success: success});#}
|
||||
$('#asset_bulk_update_modal').modal('hide');
|
||||
});
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -17,6 +17,9 @@ urlpatterns = [
|
|||
url(r'^asset-modal$', views.AssetModalListView.as_view(), name='asset-modal-list'),
|
||||
url(r'^asset-modal-update$', views.AssetModalCreateView.as_view(), name='asset-modal-update'),
|
||||
|
||||
# User asset view
|
||||
url(r'^user-asset/$', views.UserAssetListView.as_view(), name='user-asset-list'),
|
||||
|
||||
# Resource asset group url
|
||||
url(r'^asset-group/$', views.AssetGroupListView.as_view(), name='asset-group-list'),
|
||||
url(r'^asset-group/create/$', views.AssetGroupCreateView.as_view(), name='asset-group-create'),
|
||||
|
|
|
@ -44,6 +44,19 @@ class AssetListView(AdminUserRequiredMixin, TemplateView):
|
|||
return super(AssetListView, self).get_context_data(**kwargs)
|
||||
|
||||
|
||||
class UserAssetListView(TemplateView):
|
||||
template_name = 'assets/user_asset_list.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {
|
||||
'app': 'Assets',
|
||||
'action': 'asset list',
|
||||
'system_users': SystemUser.objects.all(),
|
||||
}
|
||||
kwargs.update(context)
|
||||
return super(UserAssetListView, self).get_context_data(**kwargs)
|
||||
|
||||
|
||||
class AssetCreateView(AdminUserRequiredMixin, CreateView):
|
||||
model = Asset
|
||||
form_class = forms.AssetCreateForm
|
||||
|
|
|
@ -2391,45 +2391,33 @@ msgid "Create by"
|
|||
msgstr "创建者"
|
||||
|
||||
#: users/templates/users/user_group_detail.html:89
|
||||
#, fuzzy
|
||||
#| msgid "User"
|
||||
msgid "Add user"
|
||||
msgstr "用户"
|
||||
msgstr "创建用户"
|
||||
|
||||
#: users/templates/users/user_group_list.html:5
|
||||
#, fuzzy
|
||||
#| msgid "Asset group"
|
||||
msgid "Add User Group"
|
||||
msgstr "资产组"
|
||||
msgstr "创建用户组"
|
||||
|
||||
#: users/templates/users/user_group_list.html:13
|
||||
#, fuzzy
|
||||
#| msgid "User group"
|
||||
msgid "User Amount"
|
||||
msgstr "用户组"
|
||||
msgstr "用户数量"
|
||||
|
||||
#: users/templates/users/user_group_list.html:95
|
||||
#, fuzzy
|
||||
#| msgid "User group list"
|
||||
msgid "UserGroups Deleted."
|
||||
msgstr "用户组列表"
|
||||
msgstr "用户组删除"
|
||||
|
||||
#: users/templates/users/user_group_list.html:96
|
||||
#: users/templates/users/user_group_list.html:101
|
||||
#, fuzzy
|
||||
#| msgid "User group list"
|
||||
msgid "UserGroups Delete"
|
||||
msgstr "用户组列表"
|
||||
msgstr "用户组删除"
|
||||
|
||||
#: users/templates/users/user_group_list.html:100
|
||||
msgid "UserGroup Deleting failed."
|
||||
msgstr ""
|
||||
msgstr "用户组删除失败"
|
||||
|
||||
#: users/templates/users/user_list.html:42
|
||||
#, fuzzy
|
||||
#| msgid "Deactive selected"
|
||||
msgid "Active selected"
|
||||
msgstr "禁用所选"
|
||||
msgstr "激活所选"
|
||||
|
||||
#: users/templates/users/user_list.html:167
|
||||
msgid "This will delete the selected users !!!"
|
||||
|
@ -2438,51 +2426,37 @@ msgstr ""
|
|||
# msgid "Deleted!"
|
||||
# msgstr "删除"
|
||||
#: users/templates/users/user_list.html:175
|
||||
#, fuzzy
|
||||
#| msgid "has been deleted."
|
||||
msgid "User Deleted."
|
||||
msgstr "已被删除"
|
||||
|
||||
#: users/templates/users/user_list.html:176
|
||||
#: users/templates/users/user_list.html:181
|
||||
#, fuzzy
|
||||
#| msgid "Delete"
|
||||
msgid "User Delete"
|
||||
msgstr "删除"
|
||||
|
||||
#: users/templates/users/user_list.html:180
|
||||
#, fuzzy
|
||||
#| msgid "User detail"
|
||||
msgid "User Deleting failed."
|
||||
msgstr "用户详情"
|
||||
msgstr "用户删除失败"
|
||||
|
||||
#: users/templates/users/user_list.html:240
|
||||
msgid "The selected users has been updated successfully."
|
||||
msgstr ""
|
||||
|
||||
#: users/templates/users/user_list.html:241
|
||||
#, fuzzy
|
||||
#| msgid "Update"
|
||||
msgid "User Updated"
|
||||
msgstr "更新"
|
||||
|
||||
#: users/templates/users/user_profile.html:98
|
||||
#, fuzzy
|
||||
#| msgid "SSH private key"
|
||||
msgid "Update Public Key"
|
||||
msgstr "ssh密钥"
|
||||
msgstr "更新公钥"
|
||||
|
||||
#: users/templates/users/user_profile.html:109
|
||||
#, fuzzy
|
||||
#| msgid "SSH private key"
|
||||
msgid "Paste your SSH Public Key here"
|
||||
msgstr "ssh密钥"
|
||||
msgstr "复制公钥到这里"
|
||||
|
||||
#: users/templates/users/user_profile.html:131
|
||||
#, fuzzy
|
||||
#| msgid "SSH private key"
|
||||
msgid "Failed to update SSH public key."
|
||||
msgstr "ssh密钥"
|
||||
msgstr "更新公钥失败"
|
||||
|
||||
#: users/templates/users/user_update.html:3 users/views/user.py:102
|
||||
msgid "Update user"
|
||||
|
|
|
@ -194,6 +194,32 @@ class MyGrantedAssetsGroupsApi(APIView):
|
|||
|
||||
|
||||
class MyAssetGroupAssetsApi(ListAPIView):
|
||||
permission_classes = (IsValidUser,)
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
asset_groups = {}
|
||||
# asset_group = {1: {'id': 1, 'name': 'hello', 'assets': set(),
|
||||
# 'assets_id': set()}, 2: {}}
|
||||
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]['assets'].add(asset.to_json())
|
||||
else:
|
||||
asset_groups[asset_group.id] = {
|
||||
'id': asset_group.id,
|
||||
'name': asset_group.name,
|
||||
'comment': asset_group.comment,
|
||||
'assets': {asset.to_json()},
|
||||
}
|
||||
asset_groups_json = asset_groups.values()
|
||||
return Response(asset_groups_json, status=200)
|
||||
|
||||
|
||||
class MyAssetGroupOfAssetsApi(ListAPIView):
|
||||
"""授权用户资产组下的资产列表, 非该资产组的所有资产,而是被授权的"""
|
||||
permission_classes = (IsValidUser,)
|
||||
serializer_class = AssetGrantedSerializer
|
||||
|
|
|
@ -20,8 +20,11 @@ urlpatterns = [
|
|||
api.MyGrantedAssetsGroupsApi.as_view(),
|
||||
name='my-asset-groups'),
|
||||
url(r'^v1/user/my/asset-group/(?P<pk>[0-9]+)/assets/$',
|
||||
api.MyAssetGroupOfAssetsApi.as_view(),
|
||||
name='my-asset-group-of-assets'),
|
||||
url(r'^v1/user/my/asset-group-assets/$',
|
||||
api.MyAssetGroupAssetsApi.as_view(),
|
||||
name='user-my-asset-group-assets'),
|
||||
name='my-asset-group-assets'),
|
||||
|
||||
# 查询某个用户授权的资产和资产组
|
||||
url(r'^v1/user/(?P<pk>[0-9]+)/assets/$',
|
||||
|
|
|
@ -1,25 +1,22 @@
|
|||
{% load i18n %}
|
||||
<li id="index">
|
||||
<a href="">
|
||||
<i class="fa fa-dashboard"></i> <span class="nav-label">仪表盘</span><span class="label label-info pull-right"></span>
|
||||
<i class="fa fa-dashboard"></i><span class="nav-label">{% trans 'Dashboard' %}</span><span class="label label-info pull-right"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li id="">
|
||||
<a href="">
|
||||
<i class="fa fa-files-o"></i><span class="nav-label">我的资产</span><span class="label label-info pull-right"></span>
|
||||
<li id="assets">
|
||||
<a href="{% url 'assets:user-asset-list' %}">
|
||||
<i class="fa fa-files-o"></i><span class="nav-label">{% trans 'My assets' %}</span><span class="label label-info pull-right"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li id="">
|
||||
<a href="#">
|
||||
<i class="fa fa-download"></i> <span class="nav-label">上传下载</span><span class="fa arrow"></span>
|
||||
<li id="users">
|
||||
<a href="{% url 'users:user-profile' %}">
|
||||
<i class="fa fa-user" ></i> <span class="nav-label">{% trans 'Profile' %}</span><span class="label label-info pull-right"></span>
|
||||
</a>
|
||||
<ul class="nav nav-second-level">
|
||||
<li class="upload"><a href="">文件上传</a></li>
|
||||
<li class="download"><a href="">文件下载</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li id="">
|
||||
<a href="">
|
||||
<i class="fa fa-gears"></i> <span class="nav-label">用户信息</span><span class="label label-info pull-right"></span>
|
||||
<li id="applications">
|
||||
<a href="{% url 'users:user-profile' %}">
|
||||
<i class="fa fa-user" ></i> <span class="nav-label">{% trans 'Terminal' %}</span><span class="label label-info pull-right"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="special_link">
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
</a>
|
||||
<ul class="dropdown-menu animated fadeInRight m-t-xs">
|
||||
<li><a value="">{% trans 'Profile' %}</a></li>
|
||||
<li><a value="">{% trans 'Profile settings' %}</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="">{% trans 'Logout' %}</a></li>
|
||||
</ul>
|
||||
|
|
|
@ -9,109 +9,125 @@
|
|||
{% block content %}
|
||||
<div class="wrapper wrapper-content animated fadeInRight">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="col-sm-12">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<span class="label label-primary"><b>{{ user.name }}</b></span>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
<div class="panel-options">
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active">
|
||||
<a href="" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Profile' %} </a>
|
||||
</li>
|
||||
<li class="pull-right">
|
||||
<a class="btn btn-outline btn-default" href=""><i class="fa fa-edit"></i>{% trans 'Settings' %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tab-content">
|
||||
<div class="col-sm-7">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<span class="label label-primary"><b>{{ user.name }}</b></span>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<div class="text-left">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<td class="text-navy">用户名</td>
|
||||
<td>{{ user.username }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">姓名</td>
|
||||
<td>{{ user.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">权限</td>
|
||||
<td>{{ user.get_role_display }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">Email</td>
|
||||
<td>{{ user.email }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">激活</td>
|
||||
<td>{{ user.is_active|yesno:"Yes,No,Unkown" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">添加日期</td>
|
||||
<td>{{ user.date_joined|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">最后登录</td>
|
||||
<td>{{ user.last_login|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">所在用户组</td>
|
||||
<td>
|
||||
{% for group in user.groups.all %}
|
||||
<span class="simple-tag with-link">
|
||||
<a href="{% url 'users:user-group-detail' group.id %}">{{ group.name }}</a>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">授权主机数量</td>
|
||||
<td>{{ assets | length }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">授权主机组</td>
|
||||
<td>
|
||||
{% for group in asset_groups %}
|
||||
<span class="simple-tag with-link">
|
||||
<a href="{% url 'assets:asset-group-detail' group.id %}">{{ group.name }}</a>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">授权规则</td>
|
||||
<td>
|
||||
{% for perm in permissions %}
|
||||
<span class="simple-tag with-link">
|
||||
<a href="{% url 'perms:asset-permission-detail' perm.id %}">{{ perm.name }}</a>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<div class="text-left">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<td class="text-navy">用户名</td>
|
||||
<td>{{ user.username }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">姓名</td>
|
||||
<td>{{ user.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">权限</td>
|
||||
<td>{{ user.get_role_display }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">Email</td>
|
||||
<td>{{ user.email }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">激活</td>
|
||||
<td>{{ user.is_active }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">添加日期</td>
|
||||
<td>{{ user.date_joined|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">最后登录</td>
|
||||
<td>{{ user.last_login|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">所在用户组</td>
|
||||
<td>
|
||||
{% for group in user.groups.all %}
|
||||
<span class="simple-tag with-link">
|
||||
<a href="{% url 'users:user-group-detail' group.id %}">{{ group.name }}</a>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">授权主机数量</td>
|
||||
<td>{{ assets | length }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">授权主机组</td>
|
||||
<td>
|
||||
{% for group in asset_groups %}
|
||||
<span class="simple-tag with-link">
|
||||
<a href="{% url 'assets:asset-group-detail' group.id %}">{{ group.name }}</a>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">授权规则</td>
|
||||
<td>
|
||||
{% for perm in permissions %}
|
||||
<span class="simple-tag with-link">
|
||||
<a href="{% url 'perms:asset-permission-detail' perm.id %}">{{ perm.name }}</a>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="col-sm-5">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<span class="label label-primary"><b>{% trans "Update Public Key" %}</b></span>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<p>{% trans "Paste your SSH Public Key here" %}</p>
|
||||
<textarea id="txt_pk" class="form-control" cols="30" rows="10" placeholder="ssh-rsa AAAAB3NzaC1yc2EAA....."></textarea>
|
||||
<button id="btn_update_pk" class="btn btn-primary m-t-15">{% trans 'Update' %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<span class="label label-primary"><b>{% trans "Update Public Key" %}</b></span>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<p>{% trans "Paste your SSH Public Key here" %}</p>
|
||||
<textarea id="txt_pk" class="form-control" cols="30" rows="10" placeholder="ssh-rsa AAAAB3NzaC1yc2EAA....."></textarea>
|
||||
<button id="btn_update_pk" class="btn btn-primary m-t-15">{% trans 'Update' %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
Loading…
Reference in New Issue