mirror of https://github.com/jumpserver/jumpserver
Merge branch 'master' of code.simcu.com:jumpserver/jumpserver
commit
8acbcb2ed2
|
@ -45,14 +45,36 @@ class AssetGroupForm(forms.ModelForm):
|
|||
fields = [
|
||||
"name", "comment"
|
||||
]
|
||||
help_texts = {
|
||||
'name': '* required',
|
||||
}
|
||||
|
||||
|
||||
class IdcForm(forms.ModelForm):
|
||||
class IDCForm(forms.ModelForm):
|
||||
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
|
||||
label=_('Asset'),
|
||||
required=False,
|
||||
widget=forms.SelectMultiple(
|
||||
attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
if kwargs.get('instance'):
|
||||
initial = kwargs.get('initial', {})
|
||||
initial['assets'] = kwargs['instance'].assets.all()
|
||||
super(IDCForm, self).__init__(*args, **kwargs)
|
||||
|
||||
def _save_m2m(self):
|
||||
super(IDCForm, self)._save_m2m()
|
||||
assets = self.cleaned_data['assets']
|
||||
self.instance.assets.clear()
|
||||
self.instance.assets.add(*tuple(assets))
|
||||
|
||||
class Meta:
|
||||
model = IDC
|
||||
fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'network', 'comment']
|
||||
widgets = {
|
||||
'name': forms.TextInput(attrs={'placeholder': 'Name'}),
|
||||
'name': forms.TextInput(attrs={'placeholder': _('Name')}),
|
||||
'network': forms.Textarea(
|
||||
attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'})
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
"""
|
||||
jumpserver.__app__.hands.py
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
This app depends other apps api, function .. should be import or write mack here.
|
||||
|
||||
Other module of this app shouldn't connect with other app.
|
||||
|
||||
:copyright: (c) 2014-2016 by Jumpserver Team.
|
||||
:license: GPL v2, see LICENSE for more details.
|
||||
"""
|
||||
|
||||
|
||||
|
|
@ -2,19 +2,10 @@
|
|||
from __future__ import unicode_literals, absolute_import
|
||||
|
||||
from django.db import models
|
||||
import logging
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
||||
class AssetGroup(models.Model):
|
||||
name = models.CharField(max_length=64, unique=True, null=True, blank=True, verbose_name=_('Name'))
|
||||
created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by'))
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
db_table = 'asset_group'
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class IDC(models.Model):
|
||||
|
@ -24,7 +15,7 @@ class IDC(models.Model):
|
|||
phone = models.CharField(max_length=32, blank=True, verbose_name=_('Phone'))
|
||||
address = models.CharField(max_length=128, blank=True, verbose_name=_("Address"))
|
||||
network = models.TextField(blank=True, verbose_name=_('Network'))
|
||||
date_created = models.DateField(auto_now=True, null=True, verbose_name=_('Date added'))
|
||||
date_created = models.DateTimeField(auto_now=True, null=True, verbose_name=_('Date added'))
|
||||
operator = models.CharField(max_length=32, blank=True, verbose_name=_('Operator'))
|
||||
created_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by'))
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
|
@ -47,7 +38,7 @@ class AssetExtend(models.Model):
|
|||
return self.name
|
||||
|
||||
class Meta:
|
||||
db_table = 'assetextend'
|
||||
db_table = 'asset_extend'
|
||||
|
||||
|
||||
class AdminUser(models.Model):
|
||||
|
@ -65,10 +56,10 @@ class AdminUser(models.Model):
|
|||
return self.name
|
||||
|
||||
class Meta:
|
||||
db_table = 'adminuser'
|
||||
db_table = 'admin_user'
|
||||
|
||||
|
||||
class SysUser(models.Model):
|
||||
class SystemUser(models.Model):
|
||||
PROTOCOL_CHOICES = (
|
||||
('ssh', 'ssh'),
|
||||
('telnet', 'telnet'),
|
||||
|
@ -94,7 +85,44 @@ class SysUser(models.Model):
|
|||
return self.name
|
||||
|
||||
class Meta:
|
||||
db_table = 'sysuser'
|
||||
db_table = 'system_user'
|
||||
|
||||
|
||||
class AssetGroup(models.Model):
|
||||
name = models.CharField(max_length=64, unique=True, verbose_name=_('Name'))
|
||||
system_users = models.ManyToManyField(SystemUser, related_name='asset_groups', blank=True)
|
||||
created_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by'))
|
||||
date_created = models.DateTimeField(auto_now=True, null=True, verbose_name=_('Date added'))
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
db_table = 'asset_group'
|
||||
|
||||
@classmethod
|
||||
def initial(cls):
|
||||
asset_group = cls(name=_('Default'), commont=_('Default asset group'))
|
||||
asset_group.save()
|
||||
|
||||
@classmethod
|
||||
def generate_fake(cls, count=100):
|
||||
from random import seed
|
||||
import forgery_py
|
||||
from django.db import IntegrityError
|
||||
|
||||
seed()
|
||||
for i in range(count):
|
||||
group = cls(name=forgery_py.name.full_name(),
|
||||
comment=forgery_py.lorem_ipsum.sentence(),
|
||||
created_by='Fake')
|
||||
try:
|
||||
group.save()
|
||||
logger.debug('Generate fake asset group: %s' % group.name)
|
||||
except IntegrityError:
|
||||
print('Error continue')
|
||||
continue
|
||||
|
||||
|
||||
class Asset(models.Model):
|
||||
|
@ -106,9 +134,9 @@ class Asset(models.Model):
|
|||
groups = models.ManyToManyField(AssetGroup, related_name='assets', verbose_name=_('Asset groups'))
|
||||
username = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('Admin user'))
|
||||
password = models.CharField(max_length=256, null=True, blank=True, verbose_name=_("Admin password"))
|
||||
admin_user = models.ForeignKey(AdminUser, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_("Admin user"))
|
||||
sys_user = models.ManyToManyField(SysUser, null=True, blank=True, verbose_name=_("System User"))
|
||||
idc = models.ForeignKey(IDC, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('IDC'))
|
||||
admin_user = models.ForeignKey(AdminUser, null=True, on_delete=models.SET_NULL, verbose_name=_("Admin user"))
|
||||
system_user = models.ManyToManyField(SystemUser, blank=True, verbose_name=_("System User"))
|
||||
idc = models.ForeignKey(IDC, null=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_('IDC'))
|
||||
mac_addr = models.CharField(max_length=20, null=True, blank=True, verbose_name=_("Mac address"))
|
||||
brand = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('Brand'))
|
||||
cpu = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('CPU'))
|
||||
|
@ -137,6 +165,25 @@ class Asset(models.Model):
|
|||
db_table = 'asset'
|
||||
index_together = ('ip', 'port')
|
||||
|
||||
@classmethod
|
||||
def generate_fake(cls, count=100):
|
||||
from random import seed
|
||||
import forgery_py
|
||||
from django.db import IntegrityError
|
||||
|
||||
seed()
|
||||
for i in range(count):
|
||||
asset = cls(ip='%s.%s.%s.%s' % tuple([forgery_py.forgery.basic.text(length=3, digits=True)
|
||||
for i in range(0, 4)]),
|
||||
port=22,
|
||||
created_by='Fake')
|
||||
try:
|
||||
asset.save()
|
||||
logger.debug('Generate fake asset : %s' % asset.ip)
|
||||
except IntegrityError:
|
||||
print('Error continue')
|
||||
continue
|
||||
|
||||
|
||||
class Label(models.Model):
|
||||
key = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('KEY'))
|
||||
|
|
|
@ -27,22 +27,10 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<form method="post" id="userForm" class="form-horizontal" action="" >
|
||||
<form method="post" class="form-horizontal" action="" >
|
||||
{% csrf_token %}
|
||||
{{ form.name|bootstrap_horizontal }}
|
||||
{{ form.assets|bootstrap_horizontal }}
|
||||
|
||||
{# <div class="form-group">#}
|
||||
{# <label for="users" class="col-sm-2 control-label">{% trans 'Asset' %}</label>#}
|
||||
{# <div class="col-sm-9">#}
|
||||
{# <select name="assets" id="assets" data-placeholder="{% trans 'Select asset' %}" class="select2 form-control m-b" multiple tabindex="2">#}
|
||||
{# {% for asset in assets %}#}
|
||||
{# <option value="{{ asset.id }}">{{ asset.ip }}:{{ asset.port }}</option>#}
|
||||
{# {% endfor %}#}
|
||||
{# </select>#}
|
||||
{# </div>#}
|
||||
{# </div>#}
|
||||
|
||||
{{ form.comment|bootstrap_horizontal }}
|
||||
|
||||
<div class="form-group">
|
||||
|
|
|
@ -0,0 +1,231 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load common_tags %}
|
||||
{% load users_tags %}
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block custom_head_css_js %}
|
||||
<link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
|
||||
<script src="{% static "js/plugins/select2/select2.full.min.js" %}"></script>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="wrapper wrapper-content animated fadeInRight">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="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><a href="" class="text-center"><i class="fa fa-bar-chart-o"></i> {% trans 'Asset group perm' %}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tab-content">
|
||||
<div class="col-sm-7" style="padding-left: 0;">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<span class="label"><b>{{ asset_group.name }}</b></span>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
<li><a href="#"></a>
|
||||
</li>
|
||||
<li><a href="#"></a>
|
||||
</li>
|
||||
</ul>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<table class="table">
|
||||
<tbody>
|
||||
<tr class="no-borders-tr">
|
||||
<td>{% trans 'Name' %}:</td>
|
||||
<td><b>{{ asset_group.name }}</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{% trans 'Date created' %}:</td>
|
||||
<td><b>{{ asset_group.date_created }}</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{% trans 'Created by' %}:</td>
|
||||
<td><b>{{ asset_group.created_by }}</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{% trans 'Comment' %}:</td>
|
||||
<td><b>{{ asset_group.comment }}</b></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<span>{% trans 'Asset list of ' %} <b>{{ asset_group.name }}</b></span>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
<li><a href="#"></a>
|
||||
</li>
|
||||
<li><a href="#"></a>
|
||||
</li>
|
||||
</ul>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% trans 'Hostname' %}</th>
|
||||
<th>{% trans 'IP' %}</th>
|
||||
<th>{% trans 'Port' %}</th>
|
||||
<th>{% trans 'Alive' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for asset in page_obj %}
|
||||
<tr>
|
||||
<td>{{ asset.hostname }}</td>
|
||||
<td>{{ asset.ip }}</td>
|
||||
<td>{{ asset.port }}</td>
|
||||
<td>Alive</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="row">
|
||||
{% include '_pagination.html' %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-5" style="padding-left: 0;padding-right: 0">
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-info-circle"></i> {% trans 'Associate asset user(system/admin)' %}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<table class="table">
|
||||
<tbody>
|
||||
<tr class="no-borders-tr">
|
||||
<td width="50%">{% trans 'repush system user' %}:</td>
|
||||
<td>
|
||||
<span style="float: right">
|
||||
<button class="btn btn-danger btn-xs" type="button"><i class="fa fa-refresh"></i></button>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<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 group in groups %}
|
||||
<option value="{{ group.id }}">{{ group.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="no-borders-tr">
|
||||
<td colspan="2">
|
||||
<button type="button" class="btn btn-primary btn-sm">{% trans 'Associate' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
{% for group in user.groups.all %}
|
||||
<tr>
|
||||
<td ><b>{{ group.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 class="panel panel-info">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-info-circle"></i> {% trans 'Add asset to this group' %}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<table class="table">
|
||||
<tbody>
|
||||
<form>
|
||||
<tr class="no-borders-tr">
|
||||
<td colspan="2">
|
||||
<select data-placeholder="{% trans 'Select asset user' %}" class="select2" style="width: 100%" multiple="" tabindex="4">
|
||||
{% for group in groups %}
|
||||
<option value="{{ group.id }}">{{ group.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="no-borders-tr">
|
||||
<td colspan="2">
|
||||
<button type="button" class="btn btn-info btn-sm">{% trans 'Add' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
{% for group in user.groups.all %}
|
||||
<tr>
|
||||
<td ><b>{{ group.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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
{% block custom_foot_js %}
|
||||
<script>
|
||||
function switch_user_status(obj) {
|
||||
var status = $(obj).prop('checked');
|
||||
|
||||
$.ajax({
|
||||
url: "{% url 'users:user-active-api' pk=user.id %}",
|
||||
type: "PUT",
|
||||
data: {
|
||||
'is_active': status
|
||||
},
|
||||
success: function (data, status) {
|
||||
console.log(data)
|
||||
},
|
||||
error: function () {
|
||||
console.log('error')
|
||||
}
|
||||
})
|
||||
}
|
||||
$(document).ready(function () {
|
||||
$('.select2').select2();
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -27,7 +27,7 @@
|
|||
</a>
|
||||
</td>
|
||||
<td class="text-center">{{ asset_group.assets.count }}</td>
|
||||
<td class="text-center">{{ asset_group.comment }}</td>
|
||||
<td class="text-center">{{ asset_group.comment|truncatewords:8 }}</td>
|
||||
<td class="text-center">
|
||||
<a href="{% url 'assets:asset-group-update' pk=asset_group.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
|
||||
<a href="{% url 'assets:asset-group-delete' pk=asset_group.id %}" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
{% load i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>{% trans 'Confirm delete' %}</title>
|
||||
</head>
|
||||
<body>
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
<p>Are you sure you want to delete "{{ object.name }}"?</p>
|
||||
<input type="submit" value="Confirm" />
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,61 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
{% load bootstrap %}
|
||||
{% block custom_head_css_js %}
|
||||
<link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
|
||||
<script src="{% static "js/plugins/select2/select2.full.min.js" %}"></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="wrapper wrapper-content animated fadeInRight">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5>{% trans 'Create idc' %}</h5>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<form method="post" class="form-horizontal" action="" >
|
||||
{% csrf_token %}
|
||||
{{ form.name|bootstrap_horizontal }}
|
||||
{{ form.assets|bootstrap_horizontal }}
|
||||
{{ form.bandwidth|bootstrap_horizontal }}
|
||||
{{ form.operator|bootstrap_horizontal }}
|
||||
{{ form.contact|bootstrap_horizontal }}
|
||||
{{ form.phone|bootstrap_horizontal }}
|
||||
{{ form.address|bootstrap_horizontal }}
|
||||
{{ form.network|bootstrap_horizontal }}
|
||||
{{ form.comment|bootstrap_horizontal }}
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-4 col-sm-offset-2">
|
||||
<button class="btn btn-white" type="reset">{% trans 'Reset' %}</button>
|
||||
<button id="submit_button" class="btn btn-primary" type="submit">{% trans 'Submit' %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block custom_foot_js %}
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('.select2').select2();
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -0,0 +1,35 @@
|
|||
{% extends '_list_base.html' %}
|
||||
{% load i18n %}
|
||||
{% load common_tags %}
|
||||
{% block content_left_head %}
|
||||
<a href="{% url 'assets:idc-create' %}" class="btn btn-sm btn-primary "> {% trans "Create IDC" %} </a>
|
||||
{% endblock %}
|
||||
|
||||
{% block table_head %}
|
||||
<th class="text-center">{% trans 'ID' %}</th>
|
||||
<th class="text-center"><a href="{% url 'assets:idc-list' %}?sort=name">{% trans 'Name' %}</a></th>
|
||||
<th class="text-center">{% trans 'Asset num' %}</th>
|
||||
<th class="text-center">{% trans 'Bandwidth' %}</th>
|
||||
<th class="text-center">{% trans 'Contact' %}</th>
|
||||
<th class="text-center">{% trans 'Phone' %}</th>
|
||||
<th class="text-center">{% trans 'Address' %}</th>
|
||||
<th class="text-center"></th>
|
||||
{% endblock %}
|
||||
|
||||
{% block table_body %}
|
||||
{% for idc in idc_list %}
|
||||
<tr class="gradeX">
|
||||
<td class="text-center">{{ idc.id }}</td>
|
||||
<td class="text-center">{{ idc.name }}</td>
|
||||
<td class="text-center">{{ idc.assets.count }}</td>
|
||||
<td class="text-center">{{ idc.bandwidth }}</td>
|
||||
<td class="text-center">{{ idc.contact }}</td>
|
||||
<td class="text-center">{{ idc.phone }}</td>
|
||||
<td class="text-center">{{ idc.address }}</td>
|
||||
<td class="text-center">
|
||||
<a href="{% url 'assets:idc-update' pk=idc.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
|
||||
<a href="{% url 'assets:idc-delete' pk=idc.id %}" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
|
@ -16,12 +16,17 @@ urlpatterns = [
|
|||
url(r'^asset$', views.AssetListView.as_view(), name='asset-list'),
|
||||
url(r'^asset/create$', views.AssetCreateView.as_view(), name='asset-create'),
|
||||
url(r'^asset/(?P<pk>[0-9]+)$', views.AssetDetailView.as_view(), name='asset-detail'),
|
||||
url(r'^asset/(?P<pk>[0-9]+)$/update', views.AssetUpdateView.as_view(), name='asset-update'),
|
||||
url(r'^asset/(?P<pk>[0-9]+)/update', views.AssetUpdateView.as_view(), name='asset-update'),
|
||||
url(r'^asset/(?P<pk>[0-9]+)/delete$', views.AssetDeleteView.as_view(), name='asset-delete'),
|
||||
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'),
|
||||
url(r'^asset-group/(?P<pk>[0-9]+)$', views.AssetGroupDetailView.as_view(), name='asset-group-detail'),
|
||||
url(r'^asset-group/(?P<pk>[0-9]+)/update$', views.AssetGroupUpdateView.as_view(), name='asset-group-update'),
|
||||
url(r'^asset-group/(?P<pk>[0-9]+)/delete$', views.AssetGroupDeleteView.as_view(), name='asset-group-delete'),
|
||||
url(r'^idc$', views.IDCListView.as_view(), name='idc-list'),
|
||||
url(r'^idc/create$', views.IDCCreateView.as_view(), name='idc-create'),
|
||||
url(r'^idc/(?P<pk>[0-9]+)$', views.IDCDetailView.as_view(), name='idc-detail'),
|
||||
url(r'^idc/(?P<pk>[0-9]+)/update', views.IDCUpdateView.as_view(), name='idc-update'),
|
||||
url(r'^idc/(?P<pk>[0-9]+)/delete$', views.IDCDeleteView.as_view(), name='idc-delete'),
|
||||
# url(r'^api/v1.0/', include(router.urls)),
|
||||
]
|
||||
|
|
|
@ -6,13 +6,15 @@ from django.shortcuts import get_object_or_404
|
|||
from django.views.generic import TemplateView, ListView
|
||||
from django.urls import reverse_lazy
|
||||
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView
|
||||
from django.conf import settings
|
||||
from django.db.models import Q
|
||||
from django.views.generic import TemplateView, ListView
|
||||
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView
|
||||
from django.urls import reverse_lazy
|
||||
from django.views.generic.detail import DetailView
|
||||
from django.views.generic.detail import DetailView, SingleObjectMixin
|
||||
|
||||
from .models import Asset, AssetGroup, IDC, AssetExtend
|
||||
from .forms import AssetForm, AssetGroupForm
|
||||
from .forms import AssetForm, AssetGroupForm, IDCForm
|
||||
from .utils import AdminUserRequiredMixin
|
||||
|
||||
|
||||
|
@ -54,6 +56,8 @@ class AssetGroupCreateView(CreateView):
|
|||
template_name = 'assets/asset_group_create.html'
|
||||
success_url = reverse_lazy('assets:asset-group-list')
|
||||
|
||||
# Todo: Asset group create template select assets so hard, need be resolve next
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {
|
||||
'app': _('Assets'),
|
||||
|
@ -70,20 +74,52 @@ class AssetGroupCreateView(CreateView):
|
|||
|
||||
class AssetGroupListView(ListView):
|
||||
model = AssetGroup
|
||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||
context_object_name = 'asset_group_list'
|
||||
template_name = 'assets/asset_group_list.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {
|
||||
'app': _('Assets'),
|
||||
'action': _('Asset group list')
|
||||
'action': _('Asset group list'),
|
||||
'keyword': self.request.GET.get('keyword', '')
|
||||
}
|
||||
kwargs.update(context)
|
||||
return super(AssetGroupListView, self).get_context_data(**kwargs)
|
||||
|
||||
def get_queryset(self):
|
||||
self.queryset = super(AssetGroupListView, self).get_queryset()
|
||||
self.keyword = keyword = self.request.GET.get('keyword', '')
|
||||
self.sort = sort = self.request.GET.get('sort', '-date_created')
|
||||
|
||||
class AssetGroupDetailView(DetailView):
|
||||
pass
|
||||
if keyword:
|
||||
self.queryset = self.queryset.filter(Q(name__icontains=keyword) |
|
||||
Q(comment__icontains=keyword))
|
||||
|
||||
if sort:
|
||||
self.queryset = self.queryset.order_by(sort)
|
||||
return self.queryset
|
||||
|
||||
|
||||
class AssetGroupDetailView(SingleObjectMixin, ListView):
|
||||
template_name = 'assets/asset_group_detail.html'
|
||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.object = self.get_object(queryset=AssetGroup.objects.all())
|
||||
return super(AssetGroupDetailView, self).get(request, *args, **kwargs)
|
||||
|
||||
def get_queryset(self):
|
||||
return self.object.assets.all()
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {
|
||||
'app': _('Assets'),
|
||||
'action': _('Asset group detail'),
|
||||
'asset_group': self.object,
|
||||
}
|
||||
kwargs.update(context)
|
||||
return super(AssetGroupDetailView, self).get_context_data(**kwargs)
|
||||
|
||||
|
||||
class AssetGroupUpdateView(UpdateView):
|
||||
|
@ -103,4 +139,62 @@ class AssetGroupUpdateView(UpdateView):
|
|||
|
||||
|
||||
class AssetGroupDeleteView(DeleteView):
|
||||
template_name = 'assets/delete_confirm.html'
|
||||
model = AssetGroup
|
||||
success_url = reverse_lazy('assets:asset-group-list')
|
||||
|
||||
|
||||
class IDCListView(ListView):
|
||||
model = IDC
|
||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||
context_object_name = 'idc_list'
|
||||
template_name = 'assets/idc_list.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {
|
||||
'app': _('Assets'),
|
||||
'action': _('IDC list'),
|
||||
'keyword': self.request.GET.get('keyword', '')
|
||||
}
|
||||
kwargs.update(context)
|
||||
return super(IDCListView, self).get_context_data(**kwargs)
|
||||
|
||||
def get_queryset(self):
|
||||
self.queryset = super(IDCListView, self).get_queryset()
|
||||
self.keyword = keyword = self.request.GET.get('keyword', '')
|
||||
self.sort = sort = self.request.GET.get('sort', '-date_created')
|
||||
|
||||
if keyword:
|
||||
self.queryset = self.queryset.filter(Q(name__icontains=keyword) |
|
||||
Q(comment__icontains=keyword))
|
||||
|
||||
if sort:
|
||||
self.queryset = self.queryset.order_by(sort)
|
||||
return self.queryset
|
||||
|
||||
|
||||
class IDCCreateView(CreateView):
|
||||
model = IDC
|
||||
form_class = IDCForm
|
||||
template_name = 'assets/idc_create.html'
|
||||
success_url = reverse_lazy('assets:idc-list')
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {
|
||||
'app': 'assets',
|
||||
'action': 'Create IDC'
|
||||
}
|
||||
kwargs.update(context)
|
||||
return super(IDCCreateView, self).get_context_data(**kwargs)
|
||||
|
||||
|
||||
class IDCUpdateView(UpdateView):
|
||||
pass
|
||||
|
||||
|
||||
class IDCDetailView(DetailView):
|
||||
pass
|
||||
|
||||
|
||||
class IDCDeleteView(DeleteView):
|
||||
pass
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Jumpserver 0.3.3\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-09-06 15:08+0800\n"
|
||||
"POT-Creation-Date: 2016-09-06 19:12+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: ibuler <ibuler@qq.com>\n"
|
||||
"Language-Team: Jumpserver team<ibuler@qq.com>\n"
|
||||
|
@ -21,7 +21,7 @@ msgstr ""
|
|||
msgid "Select asset groups"
|
||||
msgstr "添加到资产组"
|
||||
|
||||
#: assets/forms.py:25 assets/models.py:144 templates/_nav.html:21
|
||||
#: assets/forms.py:25 assets/models.py:171 templates/_nav.html:21
|
||||
msgid "Asset"
|
||||
msgstr "资产"
|
||||
|
||||
|
@ -29,67 +29,79 @@ msgstr "资产"
|
|||
msgid "Select assets"
|
||||
msgstr "选择资产"
|
||||
|
||||
#: assets/models.py:9 assets/models.py:21 assets/models.py:54
|
||||
#: assets/models.py:76 assets/templates/assets/asset_group_list.html:12
|
||||
#: users/models.py:60 users/models.py:107
|
||||
#: users/templates/users/user_detail.html:69
|
||||
#: assets/models.py:12 assets/models.py:48 assets/models.py:81
|
||||
#: assets/models.py:103 assets/templates/assets/asset_group_detail.html:63
|
||||
#: assets/templates/assets/asset_group_list.html:12 users/models.py:60
|
||||
#: users/models.py:107 users/templates/users/user_detail.html:69
|
||||
#: users/templates/users/user_list.html:12
|
||||
msgid "Name"
|
||||
msgstr "名称"
|
||||
|
||||
#: assets/models.py:10 assets/models.py:29 assets/models.py:42
|
||||
#: assets/models.py:61 assets/models.py:90 assets/models.py:125
|
||||
#: assets/models.py:145 users/models.py:122
|
||||
#: assets/models.py:13 assets/models.py:56 assets/models.py:69
|
||||
#: assets/models.py:88 assets/models.py:117 assets/models.py:152
|
||||
#: assets/models.py:172 users/models.py:122
|
||||
#: users/templates/users/user_detail.html:101
|
||||
msgid "Created by"
|
||||
msgstr "创建者"
|
||||
|
||||
#: assets/models.py:11 assets/models.py:30 assets/models.py:44
|
||||
#: assets/models.py:62 assets/models.py:91 assets/models.py:128
|
||||
#: assets/models.py:147 assets/templates/assets/asset_group_list.html:14
|
||||
#: users/models.py:61 users/models.py:118
|
||||
#: users/templates/users/user_detail.html:113
|
||||
#: assets/models.py:14 assets/models.py:54 assets/models.py:154
|
||||
msgid "Date added"
|
||||
msgstr "加入日期"
|
||||
|
||||
#: assets/models.py:15 assets/models.py:57 assets/models.py:71
|
||||
#: assets/models.py:89 assets/models.py:118 assets/models.py:155
|
||||
#: assets/models.py:174 assets/templates/assets/asset_group_detail.html:75
|
||||
#: assets/templates/assets/asset_group_list.html:14 users/models.py:61
|
||||
#: users/models.py:118 users/templates/users/user_detail.html:113
|
||||
msgid "Comment"
|
||||
msgstr "备注"
|
||||
|
||||
#: assets/models.py:22
|
||||
#: assets/models.py:25
|
||||
#, fuzzy
|
||||
#| msgid "As default"
|
||||
msgid "Default"
|
||||
msgstr "默认使用"
|
||||
|
||||
#: assets/models.py:25
|
||||
#, fuzzy
|
||||
#| msgid "Create asset group"
|
||||
msgid "Default asset group"
|
||||
msgstr "创建资产组"
|
||||
|
||||
#: assets/models.py:49
|
||||
msgid "Bandwidth"
|
||||
msgstr "带宽"
|
||||
|
||||
#: assets/models.py:23
|
||||
#: assets/models.py:50
|
||||
msgid "Contact"
|
||||
msgstr "联系人"
|
||||
|
||||
#: assets/models.py:24 users/models.py:113
|
||||
#: assets/models.py:51 users/models.py:113
|
||||
#: users/templates/users/user_detail.html:82
|
||||
msgid "Phone"
|
||||
msgstr "手机"
|
||||
|
||||
#: assets/models.py:25
|
||||
#: assets/models.py:52
|
||||
msgid "Address"
|
||||
msgstr "地址"
|
||||
|
||||
#: assets/models.py:26
|
||||
#: assets/models.py:53
|
||||
msgid "Network"
|
||||
msgstr "网络"
|
||||
|
||||
#: assets/models.py:27 assets/models.py:127
|
||||
msgid "Date added"
|
||||
msgstr "加入日期"
|
||||
|
||||
#: assets/models.py:28
|
||||
#: assets/models.py:55
|
||||
msgid "Operator"
|
||||
msgstr "运营商"
|
||||
|
||||
#: assets/models.py:40 assets/models.py:142
|
||||
#: assets/models.py:67 assets/models.py:169
|
||||
msgid "KEY"
|
||||
msgstr "KEY"
|
||||
|
||||
#: assets/models.py:41 assets/models.py:143
|
||||
#: assets/models.py:68 assets/models.py:170
|
||||
msgid "VALUE"
|
||||
msgstr "VALUE"
|
||||
|
||||
#: assets/models.py:55 assets/models.py:77 users/forms.py:13
|
||||
#: assets/models.py:82 assets/models.py:104 users/forms.py:13
|
||||
#: users/models.py:106 users/templates/users/login.html:53
|
||||
#: users/templates/users/user_detail.html:73
|
||||
#: users/templates/users/user_list.html:13
|
||||
|
@ -97,7 +109,7 @@ msgstr "VALUE"
|
|||
msgid "Username"
|
||||
msgstr "用户名"
|
||||
|
||||
#: assets/models.py:56 assets/models.py:78 users/forms.py:15
|
||||
#: assets/models.py:83 assets/models.py:105 users/forms.py:15
|
||||
#: users/templates/users/login.html:56
|
||||
#: users/templates/users/reset_password.html:52
|
||||
#: users/templates/users/user_create.html:8
|
||||
|
@ -107,149 +119,151 @@ msgstr "用户名"
|
|||
msgid "Password"
|
||||
msgstr "密码"
|
||||
|
||||
#: assets/models.py:57 assets/models.py:80
|
||||
#: assets/models.py:84 assets/models.py:107
|
||||
msgid "SSH private key"
|
||||
msgstr "ssh密钥"
|
||||
|
||||
#: assets/models.py:58 assets/models.py:82
|
||||
#: assets/models.py:85 assets/models.py:109
|
||||
msgid "As default"
|
||||
msgstr "默认使用"
|
||||
|
||||
#: assets/models.py:59 assets/models.py:84
|
||||
#: assets/models.py:86 assets/models.py:111
|
||||
msgid "Auto update pass/key"
|
||||
msgstr "自动更新密码/密钥"
|
||||
|
||||
#: assets/models.py:79
|
||||
#: assets/models.py:106
|
||||
msgid "Protocol"
|
||||
msgstr "协议"
|
||||
|
||||
#: assets/models.py:81
|
||||
#: assets/models.py:108
|
||||
msgid "SSH public key"
|
||||
msgstr "ssh公钥"
|
||||
|
||||
#: assets/models.py:83
|
||||
#: assets/models.py:110
|
||||
msgid "Auto push"
|
||||
msgstr "自动推送"
|
||||
|
||||
#: assets/models.py:85
|
||||
#: assets/models.py:112
|
||||
msgid "Sudo"
|
||||
msgstr "Sudo"
|
||||
|
||||
#: assets/models.py:86
|
||||
#: assets/models.py:113
|
||||
msgid "Shell"
|
||||
msgstr "Shell"
|
||||
|
||||
#: assets/models.py:87 templates/_header_bar.html:41 templates/_nav.html:4
|
||||
#: assets/models.py:114 templates/_header_bar.html:41 templates/_nav.html:4
|
||||
msgid "Home"
|
||||
msgstr "仪表盘"
|
||||
|
||||
#: assets/models.py:88
|
||||
#: assets/models.py:115
|
||||
msgid "Uid"
|
||||
msgstr "Uid"
|
||||
|
||||
#: assets/models.py:101
|
||||
#: assets/models.py:128
|
||||
msgid "IP"
|
||||
msgstr "IP"
|
||||
|
||||
#: assets/models.py:102
|
||||
#: assets/models.py:129
|
||||
msgid "Other IP"
|
||||
msgstr "其它IP"
|
||||
|
||||
#: assets/models.py:103
|
||||
#: assets/models.py:130
|
||||
msgid "Remote card IP"
|
||||
msgstr "远控卡IP"
|
||||
|
||||
#: assets/models.py:104
|
||||
#: assets/models.py:131
|
||||
msgid "Hostname"
|
||||
msgstr "用户名"
|
||||
|
||||
#: assets/models.py:105
|
||||
#: assets/models.py:132
|
||||
msgid "Port"
|
||||
msgstr "端口"
|
||||
|
||||
#: assets/models.py:106
|
||||
#: assets/models.py:133
|
||||
msgid "Asset groups"
|
||||
msgstr "用户组"
|
||||
|
||||
#: assets/models.py:107 assets/models.py:109 templates/_nav.html:24
|
||||
#: assets/models.py:134 assets/models.py:136 templates/_nav.html:24
|
||||
msgid "Admin user"
|
||||
msgstr "管理用户"
|
||||
|
||||
#: assets/models.py:108
|
||||
#: assets/models.py:135
|
||||
msgid "Admin password"
|
||||
msgstr "管理员密码"
|
||||
|
||||
#: assets/models.py:110
|
||||
#: assets/models.py:137
|
||||
msgid "System User"
|
||||
msgstr "系统用户"
|
||||
|
||||
#: assets/models.py:111 templates/_nav.html:23
|
||||
#: assets/models.py:138 templates/_nav.html:23
|
||||
msgid "IDC"
|
||||
msgstr "机房"
|
||||
|
||||
#: assets/models.py:112
|
||||
#: assets/models.py:139
|
||||
msgid "Mac address"
|
||||
msgstr "Mac地址"
|
||||
|
||||
#: assets/models.py:113
|
||||
#: assets/models.py:140
|
||||
msgid "Brand"
|
||||
msgstr "品牌"
|
||||
|
||||
#: assets/models.py:114
|
||||
#: assets/models.py:141
|
||||
msgid "CPU"
|
||||
msgstr "CPU"
|
||||
|
||||
#: assets/models.py:115
|
||||
#: assets/models.py:142
|
||||
msgid "Memory"
|
||||
msgstr "内存"
|
||||
|
||||
#: assets/models.py:116
|
||||
#: assets/models.py:143
|
||||
msgid "Disk"
|
||||
msgstr "硬盘"
|
||||
|
||||
#: assets/models.py:117
|
||||
#: assets/models.py:144
|
||||
msgid "OS"
|
||||
msgstr "操作系统"
|
||||
|
||||
#: assets/models.py:118
|
||||
#: assets/models.py:145
|
||||
msgid "Cabinet number"
|
||||
msgstr "机柜编号"
|
||||
|
||||
#: assets/models.py:119
|
||||
#: assets/models.py:146
|
||||
msgid "Cabinet position"
|
||||
msgstr "机柜层号"
|
||||
|
||||
#: assets/models.py:120
|
||||
#: assets/models.py:147
|
||||
msgid "Asset number"
|
||||
msgstr "资产编号"
|
||||
|
||||
#: assets/models.py:121
|
||||
#: assets/models.py:148
|
||||
msgid "Asset status"
|
||||
msgstr "资产状态"
|
||||
|
||||
#: assets/models.py:122
|
||||
#: assets/models.py:149
|
||||
msgid "Asset type"
|
||||
msgstr "系统类型"
|
||||
|
||||
#: assets/models.py:123
|
||||
#: assets/models.py:150
|
||||
msgid "Asset environment"
|
||||
msgstr "资产环境"
|
||||
|
||||
#: assets/models.py:124
|
||||
#: assets/models.py:151
|
||||
msgid "Serial number"
|
||||
msgstr "序列号"
|
||||
|
||||
#: assets/models.py:126
|
||||
#: assets/models.py:153
|
||||
msgid "Is active"
|
||||
msgstr "是否激活"
|
||||
|
||||
#: assets/templates/assets/asset_group_create.html:16
|
||||
#: assets/templates/assets/asset_group_list.html:5 assets/views.py:60
|
||||
#: assets/views.py:98
|
||||
#: assets/templates/assets/asset_group_list.html:5 assets/views.py:62
|
||||
#: assets/views.py:117
|
||||
msgid "Create asset group"
|
||||
msgstr "创建资产组"
|
||||
|
||||
#: assets/templates/assets/asset_group_create.html:50
|
||||
#: assets/templates/assets/asset_group_detail.html:124
|
||||
#: assets/templates/assets/asset_group_detail.html:132
|
||||
#: users/templates/users/_user.html:70
|
||||
#: users/templates/users/user_detail.html:162
|
||||
#: users/templates/users/user_detail.html:170
|
||||
|
@ -264,6 +278,65 @@ msgstr "重置"
|
|||
msgid "Submit"
|
||||
msgstr "提交"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:18
|
||||
msgid "Detail"
|
||||
msgstr ""
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:20
|
||||
#, fuzzy
|
||||
#| msgid "Asset group list"
|
||||
msgid "Asset group assets"
|
||||
msgstr "资产组列表"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:28
|
||||
#: templates/_header_bar.html:8 users/templates/users/user_detail.html:29
|
||||
msgid "Search"
|
||||
msgstr "搜索"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:67
|
||||
#, fuzzy
|
||||
#| msgid "Date added"
|
||||
msgid "Date create"
|
||||
msgstr "加入日期"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:71
|
||||
#, fuzzy
|
||||
#| msgid "Created by"
|
||||
msgid "Create by"
|
||||
msgstr "创建者"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:86
|
||||
#: users/templates/users/user_detail.html:124
|
||||
msgid "Quick modify"
|
||||
msgstr "快速修改"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:121
|
||||
#: users/templates/users/reset_password.html:45
|
||||
#: users/templates/users/user_detail.html:159 users/utils.py:98
|
||||
msgid "Reset password"
|
||||
msgstr "重置密码"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:129
|
||||
#: users/templates/users/user_detail.html:167
|
||||
msgid "Reset ssh key"
|
||||
msgstr "重置密钥"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:143 templates/_nav.html:13
|
||||
#: users/models.py:109 users/templates/users/user_detail.html:181
|
||||
#: users/templates/users/user_list.html:15
|
||||
msgid "User group"
|
||||
msgstr "用户组"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:151 users/forms.py:34
|
||||
#: users/forms.py:54 users/templates/users/user_detail.html:189
|
||||
msgid "Join user groups"
|
||||
msgstr "添加到用户组"
|
||||
|
||||
#: assets/templates/assets/asset_group_detail.html:160
|
||||
#: users/templates/users/user_detail.html:198
|
||||
msgid "Join"
|
||||
msgstr "加入"
|
||||
|
||||
#: assets/templates/assets/asset_group_list.html:13
|
||||
#: users/templates/users/user_list.html:16
|
||||
msgid "Asset num"
|
||||
|
@ -303,19 +376,20 @@ msgstr "批量导出"
|
|||
msgid "Create asset"
|
||||
msgstr "创建资产"
|
||||
|
||||
#: assets/views.py:59 assets/views.py:78 assets/views.py:97
|
||||
#: assets/templates/assets/delete_confirm.html:6
|
||||
#: users/templates/users/user_delete_confirm.html:6
|
||||
msgid "Confirm delete"
|
||||
msgstr "确认删除"
|
||||
|
||||
#: assets/views.py:61 assets/views.py:81 assets/views.py:116
|
||||
#: templates/_nav.html:18
|
||||
msgid "Assets"
|
||||
msgstr "资产管理"
|
||||
|
||||
#: assets/views.py:79
|
||||
#: assets/views.py:82
|
||||
msgid "Asset group list"
|
||||
msgstr "资产组列表"
|
||||
|
||||
#: templates/_header_bar.html:8 users/templates/users/user_detail.html:29
|
||||
msgid "Search"
|
||||
msgstr "搜索"
|
||||
|
||||
#: templates/_header_bar.html:14
|
||||
msgid "Welcome to use Jumpserver system"
|
||||
msgstr "欢迎使用Jumpserver开源跳板机系统"
|
||||
|
@ -333,8 +407,8 @@ msgstr "注销登录"
|
|||
msgid "Login"
|
||||
msgstr "登录"
|
||||
|
||||
#: templates/_nav.html:9 users/views.py:50 users/views.py:63 users/views.py:103
|
||||
#: users/views.py:120 users/views.py:145 users/views.py:158
|
||||
#: templates/_nav.html:9 users/views.py:92 users/views.py:105
|
||||
#: users/views.py:145 users/views.py:162 users/views.py:187 users/views.py:200
|
||||
msgid "Users"
|
||||
msgstr "用户管理"
|
||||
|
||||
|
@ -342,12 +416,6 @@ msgstr "用户管理"
|
|||
msgid "User"
|
||||
msgstr "用户"
|
||||
|
||||
#: templates/_nav.html:13 users/models.py:109
|
||||
#: users/templates/users/user_detail.html:181
|
||||
#: users/templates/users/user_list.html:15
|
||||
msgid "User group"
|
||||
msgstr "用户组"
|
||||
|
||||
#: templates/_nav.html:22
|
||||
msgid "Asset group"
|
||||
msgstr "资产组"
|
||||
|
@ -408,11 +476,6 @@ msgstr ""
|
|||
msgid "Captcha"
|
||||
msgstr "验证码"
|
||||
|
||||
#: users/forms.py:34 users/forms.py:54
|
||||
#: users/templates/users/user_detail.html:189
|
||||
msgid "Join user groups"
|
||||
msgstr "添加到用户组"
|
||||
|
||||
#: users/models.py:102 users/models.py:225
|
||||
msgid "Administrator"
|
||||
msgstr "管理员"
|
||||
|
@ -459,7 +522,7 @@ msgid "System"
|
|||
msgstr "系统"
|
||||
|
||||
#: users/templates/users/_user.html:17 users/templates/users/user_list.html:5
|
||||
#: users/views.py:63
|
||||
#: users/views.py:105
|
||||
msgid "Create user"
|
||||
msgstr "创建用户"
|
||||
|
||||
|
@ -484,11 +547,6 @@ msgstr "输入您的邮箱, 将会发一封重置短信邮件到您的邮箱中"
|
|||
msgid "Captcha invalid"
|
||||
msgstr "验证码错误"
|
||||
|
||||
#: users/templates/users/reset_password.html:45
|
||||
#: users/templates/users/user_detail.html:159 users/utils.py:98
|
||||
msgid "Reset password"
|
||||
msgstr "重置密码"
|
||||
|
||||
#: users/templates/users/reset_password.html:55
|
||||
msgid "Password again"
|
||||
msgstr "再次输入密码"
|
||||
|
@ -501,11 +559,7 @@ msgstr "设置"
|
|||
msgid "Reset link will be generated and sent to the user. "
|
||||
msgstr "生成重置密码连接,通过邮件发送给用户"
|
||||
|
||||
#: users/templates/users/user_delete_confirm.html:6
|
||||
msgid "Confirm delete"
|
||||
msgstr "确认删除"
|
||||
|
||||
#: users/templates/users/user_detail.html:18 users/views.py:120
|
||||
#: users/templates/users/user_detail.html:18 users/views.py:162
|
||||
msgid "User detail"
|
||||
msgstr "用户详情"
|
||||
|
||||
|
@ -525,19 +579,7 @@ msgstr "创建日期"
|
|||
msgid "Last login"
|
||||
msgstr "最后登录"
|
||||
|
||||
#: users/templates/users/user_detail.html:124
|
||||
msgid "Quick modify"
|
||||
msgstr "快速修改"
|
||||
|
||||
#: users/templates/users/user_detail.html:167
|
||||
msgid "Reset ssh key"
|
||||
msgstr "重置密钥"
|
||||
|
||||
#: users/templates/users/user_detail.html:198
|
||||
msgid "Join"
|
||||
msgstr "加入"
|
||||
|
||||
#: users/templates/users/user_group_create.html:16 users/views.py:158
|
||||
#: users/templates/users/user_group_create.html:16 users/views.py:200
|
||||
msgid "Create user group"
|
||||
msgstr "创建用户组"
|
||||
|
||||
|
@ -546,18 +588,10 @@ msgstr "创建用户组"
|
|||
msgid "Active"
|
||||
msgstr "激活"
|
||||
|
||||
#: users/templates/users/user_update.html:3 users/views.py:103
|
||||
#: users/templates/users/user_update.html:3 users/views.py:145
|
||||
msgid "Update user"
|
||||
msgstr "编辑用户"
|
||||
|
||||
#: users/urls.py:23
|
||||
msgid "Logout success"
|
||||
msgstr "退出登录成功"
|
||||
|
||||
#: users/urls.py:24
|
||||
msgid "Logout success, return login page"
|
||||
msgstr "退出登录成功,返回到登录页面"
|
||||
|
||||
#: users/utils.py:47
|
||||
msgid "Begin to generate ssh private key ..."
|
||||
msgstr "开始生成ssh密钥"
|
||||
|
@ -659,45 +693,53 @@ msgstr ""
|
|||
" </br>\n"
|
||||
" "
|
||||
|
||||
#: users/views.py:50
|
||||
#: users/views.py:62
|
||||
msgid "Logout success"
|
||||
msgstr "退出登录成功"
|
||||
|
||||
#: users/views.py:63
|
||||
msgid "Logout success, return login page"
|
||||
msgstr "退出登录成功,返回到登录页面"
|
||||
|
||||
#: users/views.py:92
|
||||
msgid "User list"
|
||||
msgstr "用户列表"
|
||||
|
||||
#: users/views.py:59
|
||||
#: users/views.py:101
|
||||
#, python-format
|
||||
msgid "Create user <a href=\"%s\">%s</a> success."
|
||||
msgstr "创建用户 <a href=\"%s\">%s</a> 成功"
|
||||
|
||||
#: users/views.py:145
|
||||
#: users/views.py:187
|
||||
msgid "User group list"
|
||||
msgstr "用户组列表"
|
||||
|
||||
#: users/views.py:190
|
||||
#: users/views.py:232
|
||||
msgid "Email address invalid, input again"
|
||||
msgstr "邮箱地址错误,重新输入"
|
||||
|
||||
#: users/views.py:201
|
||||
#: users/views.py:243
|
||||
msgid "Send reset password message"
|
||||
msgstr "发送重置密码邮件"
|
||||
|
||||
#: users/views.py:202
|
||||
#: users/views.py:244
|
||||
msgid "Send reset password mail success, login your mail box and follow it "
|
||||
msgstr ""
|
||||
"发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)"
|
||||
|
||||
#: users/views.py:214
|
||||
#: users/views.py:256
|
||||
msgid "Reset password success"
|
||||
msgstr "重置密码成功"
|
||||
|
||||
#: users/views.py:215
|
||||
#: users/views.py:257
|
||||
msgid "Reset password success, return to login page"
|
||||
msgstr "重置密码成功,返回到登录页面"
|
||||
|
||||
#: users/views.py:231 users/views.py:244
|
||||
#: users/views.py:273 users/views.py:286
|
||||
msgid "Token invalid or expired"
|
||||
msgstr "Token错误或失效"
|
||||
|
||||
#: users/views.py:240
|
||||
#: users/views.py:282
|
||||
msgid "Password not same"
|
||||
msgstr "密码不一致"
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ th a {
|
|||
color: white;
|
||||
}
|
||||
|
||||
.select2-selection--single,
|
||||
.select2-selection--multiple {
|
||||
border: 1px solid #e5e6e7 !important;
|
||||
cursor: text !important;
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
|
||||
<div class="ibox-content">
|
||||
<div class="">
|
||||
{# left button add #}
|
||||
{% block content_left_head %} {% endblock %}
|
||||
<form id="search_form" method="get" action="" class="pull-right mail-search">
|
||||
<div class="input-group">
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<ul class="nav nav-second-level">
|
||||
<li id="asset"><a href="{% url 'assets:asset-list' %}">{% trans 'Asset' %}</a></li>
|
||||
<li id="asset-group"><a href="{% url 'assets:asset-group-list' %}">{% trans 'Asset group' %}</a></li>
|
||||
<li id="idc"><a href="">{% trans 'IDC' %}</a></li>
|
||||
<li id="idc"><a href="{% url 'assets:idc-list' %}">{% trans 'IDC' %}</a></li>
|
||||
<li id="admin-user"><a href="">{% trans 'Admin user' %}</a></li>
|
||||
<li id="system-user"><a href="">{% trans 'System user' %}</a></li>
|
||||
<li id=""><a href="">{% trans 'Label' %}</a></li>
|
||||
|
|
|
@ -34,11 +34,6 @@
|
|||
</div>
|
||||
{% endif %}
|
||||
<script>
|
||||
{# function sleep(n) { //n表示的毫秒数#}
|
||||
{# var start = new Date().getTime();#}
|
||||
{# while (true) if (new Date().getTime() - start > n) break;#}
|
||||
{# }#}
|
||||
|
||||
$(document).ready(function () {
|
||||
$('.page').click(function () {
|
||||
var searchStr = location.search;
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
"""
|
||||
jumpserver.__app__.hands.py
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
This app depends other apps api, function .. should be import or write mack here.
|
||||
|
||||
Other module of this app shouldn't connect with other app.
|
||||
|
||||
:copyright: (c) 2014-2016 by Jumpserver Team.
|
||||
:license: GPL v2, see LICENSE for more details.
|
||||
"""
|
||||
|
||||
|
||||
|
|
@ -28,7 +28,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<form method="post" id="userForm" class="form-horizontal" action="" enctype="multipart/form-data">
|
||||
<form method="post" class="form-horizontal" action="" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
<h3>{% trans 'Account' %}</h3>
|
||||
{% block username %} {% endblock %}
|
||||
|
|
|
@ -19,19 +19,6 @@
|
|||
</li>
|
||||
<li><a href="" class="text-center"><i class="fa fa-bar-chart-o"></i> {% trans 'User assets' %}</a></li>
|
||||
<li><a href="" class="text-center"><i class="fa fa-bar-chart-o"></i> {% trans 'User log' %}</a></li>
|
||||
<div class="" style="float: right">
|
||||
<form id="search_form" method="get" action="" class="pull-right mail-search">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control input-sm" id="keyword" name="keyword"
|
||||
value="{{ keyword }}" placeholder="Search">
|
||||
<div class="input-group-btn">
|
||||
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
|
||||
{% trans 'Search' %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tab-content">
|
||||
|
@ -118,7 +105,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-5" style="padding-left: 0px;">
|
||||
<div class="col-sm-5" style="padding-left: 0;padding-right: 0">
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-info-circle"></i> {% trans 'Quick modify' %}
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<form method="post" id="userForm" class="form-horizontal" action="" >
|
||||
<form method="post" class="form-horizontal" action="" >
|
||||
{% csrf_token %}
|
||||
{{ form.name|bootstrap_horizontal }}
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ urlpatterns = [
|
|||
name='reset-password-success'),
|
||||
url(r'^user$', views.UserListView.as_view(), name='user-list'),
|
||||
url(r'^user/(?P<pk>[0-9]+)$', views.UserDetailView.as_view(), name='user-detail'),
|
||||
url(r'^user/(?P<pk>[0-9]+)/assets-perm$', views.UserDetailView.as_view(), name='user-detail'),
|
||||
url(r'^user/create$', views.UserCreateView.as_view(), name='user-create'),
|
||||
url(r'^user/(?P<pk>[0-9]+)/update$', views.UserUpdateView.as_view(), name='user-update'),
|
||||
url(r'^user/(?P<pk>[0-9]+)/delete$', views.UserDeleteView.as_view(), name='user-delete'),
|
||||
|
|
Loading…
Reference in New Issue