Commit 8acbcb2e authored by xiaokong1937@gmail.com's avatar xiaokong1937@gmail.com

Merge branch 'master' of code.simcu.com:jumpserver/jumpserver

parents 04151b99 4db352f5
...@@ -45,14 +45,36 @@ class AssetGroupForm(forms.ModelForm): ...@@ -45,14 +45,36 @@ class AssetGroupForm(forms.ModelForm):
fields = [ fields = [
"name", "comment" "name", "comment"
] ]
help_texts = {
'name': '* required',
}
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 IdcForm(forms.ModelForm):
class Meta: class Meta:
model = IDC model = IDC
fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'network', 'comment'] fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'network', 'comment']
widgets = { widgets = {
'name': forms.TextInput(attrs={'placeholder': 'Name'}), 'name': forms.TextInput(attrs={'placeholder': _('Name')}),
'network': forms.Textarea( 'network': forms.Textarea(
attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'}) attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'})
} }
"""
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 @@ ...@@ -2,19 +2,10 @@
from __future__ import unicode_literals, absolute_import from __future__ import unicode_literals, absolute_import
from django.db import models from django.db import models
import logging
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
logger = logging.getLogger(__name__)
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'
class IDC(models.Model): class IDC(models.Model):
...@@ -24,7 +15,7 @@ class IDC(models.Model): ...@@ -24,7 +15,7 @@ class IDC(models.Model):
phone = models.CharField(max_length=32, blank=True, verbose_name=_('Phone')) phone = models.CharField(max_length=32, blank=True, verbose_name=_('Phone'))
address = models.CharField(max_length=128, blank=True, verbose_name=_("Address")) address = models.CharField(max_length=128, blank=True, verbose_name=_("Address"))
network = models.TextField(blank=True, verbose_name=_('Network')) 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')) operator = models.CharField(max_length=32, blank=True, verbose_name=_('Operator'))
created_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by')) created_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by'))
comment = models.TextField(blank=True, verbose_name=_('Comment')) comment = models.TextField(blank=True, verbose_name=_('Comment'))
...@@ -47,7 +38,7 @@ class AssetExtend(models.Model): ...@@ -47,7 +38,7 @@ class AssetExtend(models.Model):
return self.name return self.name
class Meta: class Meta:
db_table = 'assetextend' db_table = 'asset_extend'
class AdminUser(models.Model): class AdminUser(models.Model):
...@@ -65,10 +56,10 @@ class AdminUser(models.Model): ...@@ -65,10 +56,10 @@ class AdminUser(models.Model):
return self.name return self.name
class Meta: class Meta:
db_table = 'adminuser' db_table = 'admin_user'
class SysUser(models.Model): class SystemUser(models.Model):
PROTOCOL_CHOICES = ( PROTOCOL_CHOICES = (
('ssh', 'ssh'), ('ssh', 'ssh'),
('telnet', 'telnet'), ('telnet', 'telnet'),
...@@ -94,7 +85,44 @@ class SysUser(models.Model): ...@@ -94,7 +85,44 @@ class SysUser(models.Model):
return self.name return self.name
class Meta: 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): class Asset(models.Model):
...@@ -106,9 +134,9 @@ class Asset(models.Model): ...@@ -106,9 +134,9 @@ class Asset(models.Model):
groups = models.ManyToManyField(AssetGroup, related_name='assets', verbose_name=_('Asset groups')) 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')) 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")) 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")) admin_user = models.ForeignKey(AdminUser, null=True, on_delete=models.SET_NULL, verbose_name=_("Admin user"))
sys_user = models.ManyToManyField(SysUser, null=True, blank=True, verbose_name=_("System User")) system_user = models.ManyToManyField(SystemUser, blank=True, verbose_name=_("System User"))
idc = models.ForeignKey(IDC, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('IDC')) 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")) 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')) 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')) cpu = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('CPU'))
...@@ -137,6 +165,25 @@ class Asset(models.Model): ...@@ -137,6 +165,25 @@ class Asset(models.Model):
db_table = 'asset' db_table = 'asset'
index_together = ('ip', 'port') 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): class Label(models.Model):
key = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('KEY')) key = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('KEY'))
......
...@@ -27,22 +27,10 @@ ...@@ -27,22 +27,10 @@
</div> </div>
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<form method="post" id="userForm" class="form-horizontal" action="" > <form method="post" class="form-horizontal" action="" >
{% csrf_token %} {% csrf_token %}
{{ form.name|bootstrap_horizontal }} {{ form.name|bootstrap_horizontal }}
{{ form.assets|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 }} {{ form.comment|bootstrap_horizontal }}
<div class="form-group"> <div class="form-group">
......
{% 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 %}
\ No newline at end of file
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
</a> </a>
</td> </td>
<td class="text-center">{{ asset_group.assets.count }}</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"> <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-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> <a href="{% url 'assets:asset-group-delete' pk=asset_group.id %}" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>
......
{% 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>
\ No newline at end of file
{% 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 %}
\ No newline at end of file
{% 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 = [ ...@@ -16,12 +16,17 @@ urlpatterns = [
url(r'^asset$', views.AssetListView.as_view(), name='asset-list'), url(r'^asset$', views.AssetListView.as_view(), name='asset-list'),
url(r'^asset/create$', views.AssetCreateView.as_view(), name='asset-create'), 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]+)$', 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/(?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$', 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/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]+)$', 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]+)/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'^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)), # url(r'^api/v1.0/', include(router.urls)),
] ]
...@@ -6,13 +6,15 @@ from django.shortcuts import get_object_or_404 ...@@ -6,13 +6,15 @@ from django.shortcuts import get_object_or_404
from django.views.generic import TemplateView, ListView from django.views.generic import TemplateView, ListView
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView 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 import TemplateView, ListView
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView
from django.urls import reverse_lazy 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 .models import Asset, AssetGroup, IDC, AssetExtend
from .forms import AssetForm, AssetGroupForm from .forms import AssetForm, AssetGroupForm, IDCForm
from .utils import AdminUserRequiredMixin from .utils import AdminUserRequiredMixin
...@@ -54,6 +56,8 @@ class AssetGroupCreateView(CreateView): ...@@ -54,6 +56,8 @@ class AssetGroupCreateView(CreateView):
template_name = 'assets/asset_group_create.html' template_name = 'assets/asset_group_create.html'
success_url = reverse_lazy('assets:asset-group-list') 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): def get_context_data(self, **kwargs):
context = { context = {
'app': _('Assets'), 'app': _('Assets'),
...@@ -70,20 +74,52 @@ class AssetGroupCreateView(CreateView): ...@@ -70,20 +74,52 @@ class AssetGroupCreateView(CreateView):
class AssetGroupListView(ListView): class AssetGroupListView(ListView):
model = AssetGroup model = AssetGroup
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
context_object_name = 'asset_group_list' context_object_name = 'asset_group_list'
template_name = 'assets/asset_group_list.html' template_name = 'assets/asset_group_list.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
'app': _('Assets'), 'app': _('Assets'),
'action': _('Asset group list') 'action': _('Asset group list'),
'keyword': self.request.GET.get('keyword', '')
} }
kwargs.update(context) kwargs.update(context)
return super(AssetGroupListView, self).get_context_data(**kwargs) 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): if keyword:
pass 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): class AssetGroupUpdateView(UpdateView):
...@@ -103,4 +139,62 @@ class AssetGroupUpdateView(UpdateView): ...@@ -103,4 +139,62 @@ class AssetGroupUpdateView(UpdateView):
class AssetGroupDeleteView(DeleteView): 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 pass
...@@ -8,7 +8,7 @@ msgid "" ...@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jumpserver 0.3.3\n" "Project-Id-Version: Jumpserver 0.3.3\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: Jumpserver team<ibuler@qq.com>\n" "Language-Team: Jumpserver team<ibuler@qq.com>\n"
...@@ -21,7 +21,7 @@ msgstr "" ...@@ -21,7 +21,7 @@ msgstr ""
msgid "Select asset groups" msgid "Select asset groups"
msgstr "添加到资产组" 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" msgid "Asset"
msgstr "资产" msgstr "资产"
...@@ -29,67 +29,79 @@ msgstr "资产" ...@@ -29,67 +29,79 @@ msgstr "资产"
msgid "Select assets" msgid "Select assets"
msgstr "选择资产" msgstr "选择资产"
#: assets/models.py:9 assets/models.py:21 assets/models.py:54 #: assets/models.py:12 assets/models.py:48 assets/models.py:81
#: assets/models.py:76 assets/templates/assets/asset_group_list.html:12 #: assets/models.py:103 assets/templates/assets/asset_group_detail.html:63
#: users/models.py:60 users/models.py:107 #: assets/templates/assets/asset_group_list.html:12 users/models.py:60
#: users/templates/users/user_detail.html:69 #: users/models.py:107 users/templates/users/user_detail.html:69
#: users/templates/users/user_list.html:12 #: users/templates/users/user_list.html:12
msgid "Name" msgid "Name"
msgstr "名称" msgstr "名称"
#: assets/models.py:10 assets/models.py:29 assets/models.py:42 #: assets/models.py:13 assets/models.py:56 assets/models.py:69
#: assets/models.py:61 assets/models.py:90 assets/models.py:125 #: assets/models.py:88 assets/models.py:117 assets/models.py:152
#: assets/models.py:145 users/models.py:122 #: assets/models.py:172 users/models.py:122
#: users/templates/users/user_detail.html:101 #: users/templates/users/user_detail.html:101
msgid "Created by" msgid "Created by"
msgstr "创建者" msgstr "创建者"
#: assets/models.py:11 assets/models.py:30 assets/models.py:44 #: assets/models.py:14 assets/models.py:54 assets/models.py:154
#: assets/models.py:62 assets/models.py:91 assets/models.py:128 msgid "Date added"
#: assets/models.py:147 assets/templates/assets/asset_group_list.html:14 msgstr "加入日期"
#: users/models.py:61 users/models.py:118
#: users/templates/users/user_detail.html:113 #: 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" msgid "Comment"
msgstr "备注" 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" msgid "Bandwidth"
msgstr "带宽" msgstr "带宽"
#: assets/models.py:23 #: assets/models.py:50
msgid "Contact" msgid "Contact"
msgstr "联系人" msgstr "联系人"
#: assets/models.py:24 users/models.py:113 #: assets/models.py:51 users/models.py:113
#: users/templates/users/user_detail.html:82 #: users/templates/users/user_detail.html:82
msgid "Phone" msgid "Phone"
msgstr "手机" msgstr "手机"
#: assets/models.py:25 #: assets/models.py:52
msgid "Address" msgid "Address"
msgstr "地址" msgstr "地址"
#: assets/models.py:26 #: assets/models.py:53
msgid "Network" msgid "Network"
msgstr "网络" msgstr "网络"
#: assets/models.py:27 assets/models.py:127 #: assets/models.py:55
msgid "Date added"
msgstr "加入日期"
#: assets/models.py:28
msgid "Operator" msgid "Operator"
msgstr "运营商" msgstr "运营商"
#: assets/models.py:40 assets/models.py:142 #: assets/models.py:67 assets/models.py:169
msgid "KEY" msgid "KEY"
msgstr "KEY" msgstr "KEY"
#: assets/models.py:41 assets/models.py:143 #: assets/models.py:68 assets/models.py:170
msgid "VALUE" msgid "VALUE"
msgstr "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/models.py:106 users/templates/users/login.html:53
#: users/templates/users/user_detail.html:73 #: users/templates/users/user_detail.html:73
#: users/templates/users/user_list.html:13 #: users/templates/users/user_list.html:13
...@@ -97,7 +109,7 @@ msgstr "VALUE" ...@@ -97,7 +109,7 @@ msgstr "VALUE"
msgid "Username" msgid "Username"
msgstr "用户名" 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/login.html:56
#: users/templates/users/reset_password.html:52 #: users/templates/users/reset_password.html:52
#: users/templates/users/user_create.html:8 #: users/templates/users/user_create.html:8
...@@ -107,149 +119,151 @@ msgstr "用户名" ...@@ -107,149 +119,151 @@ msgstr "用户名"
msgid "Password" msgid "Password"
msgstr "密码" msgstr "密码"
#: assets/models.py:57 assets/models.py:80 #: assets/models.py:84 assets/models.py:107
msgid "SSH private key" msgid "SSH private key"
msgstr "ssh密钥" msgstr "ssh密钥"
#: assets/models.py:58 assets/models.py:82 #: assets/models.py:85 assets/models.py:109
msgid "As default" msgid "As default"
msgstr "默认使用" msgstr "默认使用"
#: assets/models.py:59 assets/models.py:84 #: assets/models.py:86 assets/models.py:111
msgid "Auto update pass/key" msgid "Auto update pass/key"
msgstr "自动更新密码/密钥" msgstr "自动更新密码/密钥"
#: assets/models.py:79 #: assets/models.py:106
msgid "Protocol" msgid "Protocol"
msgstr "协议" msgstr "协议"
#: assets/models.py:81 #: assets/models.py:108
msgid "SSH public key" msgid "SSH public key"
msgstr "ssh公钥" msgstr "ssh公钥"
#: assets/models.py:83 #: assets/models.py:110
msgid "Auto push" msgid "Auto push"
msgstr "自动推送" msgstr "自动推送"
#: assets/models.py:85 #: assets/models.py:112
msgid "Sudo" msgid "Sudo"
msgstr "Sudo" msgstr "Sudo"
#: assets/models.py:86 #: assets/models.py:113
msgid "Shell" msgid "Shell"
msgstr "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" msgid "Home"
msgstr "仪表盘" msgstr "仪表盘"
#: assets/models.py:88 #: assets/models.py:115
msgid "Uid" msgid "Uid"
msgstr "Uid" msgstr "Uid"
#: assets/models.py:101 #: assets/models.py:128
msgid "IP" msgid "IP"
msgstr "IP" msgstr "IP"
#: assets/models.py:102 #: assets/models.py:129
msgid "Other IP" msgid "Other IP"
msgstr "其它IP" msgstr "其它IP"
#: assets/models.py:103 #: assets/models.py:130
msgid "Remote card IP" msgid "Remote card IP"
msgstr "远控卡IP" msgstr "远控卡IP"
#: assets/models.py:104 #: assets/models.py:131
msgid "Hostname" msgid "Hostname"
msgstr "用户名" msgstr "用户名"
#: assets/models.py:105 #: assets/models.py:132
msgid "Port" msgid "Port"
msgstr "端口" msgstr "端口"
#: assets/models.py:106 #: assets/models.py:133
msgid "Asset groups" msgid "Asset groups"
msgstr "用户组" 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" msgid "Admin user"
msgstr "管理用户" msgstr "管理用户"
#: assets/models.py:108 #: assets/models.py:135
msgid "Admin password" msgid "Admin password"
msgstr "管理员密码" msgstr "管理员密码"
#: assets/models.py:110 #: assets/models.py:137
msgid "System User" msgid "System User"
msgstr "系统用户" msgstr "系统用户"
#: assets/models.py:111 templates/_nav.html:23 #: assets/models.py:138 templates/_nav.html:23
msgid "IDC" msgid "IDC"
msgstr "机房" msgstr "机房"
#: assets/models.py:112 #: assets/models.py:139
msgid "Mac address" msgid "Mac address"
msgstr "Mac地址" msgstr "Mac地址"
#: assets/models.py:113 #: assets/models.py:140
msgid "Brand" msgid "Brand"
msgstr "品牌" msgstr "品牌"
#: assets/models.py:114 #: assets/models.py:141
msgid "CPU" msgid "CPU"
msgstr "CPU" msgstr "CPU"
#: assets/models.py:115 #: assets/models.py:142
msgid "Memory" msgid "Memory"
msgstr "内存" msgstr "内存"
#: assets/models.py:116 #: assets/models.py:143
msgid "Disk" msgid "Disk"
msgstr "硬盘" msgstr "硬盘"
#: assets/models.py:117 #: assets/models.py:144
msgid "OS" msgid "OS"
msgstr "操作系统" msgstr "操作系统"
#: assets/models.py:118 #: assets/models.py:145
msgid "Cabinet number" msgid "Cabinet number"
msgstr "机柜编号" msgstr "机柜编号"
#: assets/models.py:119 #: assets/models.py:146
msgid "Cabinet position" msgid "Cabinet position"
msgstr "机柜层号" msgstr "机柜层号"
#: assets/models.py:120 #: assets/models.py:147
msgid "Asset number" msgid "Asset number"
msgstr "资产编号" msgstr "资产编号"
#: assets/models.py:121 #: assets/models.py:148
msgid "Asset status" msgid "Asset status"
msgstr "资产状态" msgstr "资产状态"
#: assets/models.py:122 #: assets/models.py:149
msgid "Asset type" msgid "Asset type"
msgstr "系统类型" msgstr "系统类型"
#: assets/models.py:123 #: assets/models.py:150
msgid "Asset environment" msgid "Asset environment"
msgstr "资产环境" msgstr "资产环境"
#: assets/models.py:124 #: assets/models.py:151
msgid "Serial number" msgid "Serial number"
msgstr "序列号" msgstr "序列号"
#: assets/models.py:126 #: assets/models.py:153
msgid "Is active" msgid "Is active"
msgstr "是否激活" msgstr "是否激活"
#: assets/templates/assets/asset_group_create.html:16 #: assets/templates/assets/asset_group_create.html:16
#: assets/templates/assets/asset_group_list.html:5 assets/views.py:60 #: assets/templates/assets/asset_group_list.html:5 assets/views.py:62
#: assets/views.py:98 #: assets/views.py:117
msgid "Create asset group" msgid "Create asset group"
msgstr "创建资产组" msgstr "创建资产组"
#: assets/templates/assets/asset_group_create.html:50 #: 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.html:70
#: users/templates/users/user_detail.html:162 #: users/templates/users/user_detail.html:162
#: users/templates/users/user_detail.html:170 #: users/templates/users/user_detail.html:170
...@@ -264,6 +278,65 @@ msgstr "重置" ...@@ -264,6 +278,65 @@ msgstr "重置"
msgid "Submit" msgid "Submit"
msgstr "提交" 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 #: assets/templates/assets/asset_group_list.html:13
#: users/templates/users/user_list.html:16 #: users/templates/users/user_list.html:16
msgid "Asset num" msgid "Asset num"
...@@ -303,19 +376,20 @@ msgstr "批量导出" ...@@ -303,19 +376,20 @@ msgstr "批量导出"
msgid "Create asset" msgid "Create asset"
msgstr "创建资产" 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 #: templates/_nav.html:18
msgid "Assets" msgid "Assets"
msgstr "资产管理" msgstr "资产管理"
#: assets/views.py:79 #: assets/views.py:82
msgid "Asset group list" msgid "Asset group list"
msgstr "资产组列表" msgstr "资产组列表"
#: templates/_header_bar.html:8 users/templates/users/user_detail.html:29
msgid "Search"
msgstr "搜索"
#: templates/_header_bar.html:14 #: templates/_header_bar.html:14
msgid "Welcome to use Jumpserver system" msgid "Welcome to use Jumpserver system"
msgstr "欢迎使用Jumpserver开源跳板机系统" msgstr "欢迎使用Jumpserver开源跳板机系统"
...@@ -333,8 +407,8 @@ msgstr "注销登录" ...@@ -333,8 +407,8 @@ msgstr "注销登录"
msgid "Login" msgid "Login"
msgstr "登录" msgstr "登录"
#: templates/_nav.html:9 users/views.py:50 users/views.py:63 users/views.py:103 #: templates/_nav.html:9 users/views.py:92 users/views.py:105
#: users/views.py:120 users/views.py:145 users/views.py:158 #: users/views.py:145 users/views.py:162 users/views.py:187 users/views.py:200
msgid "Users" msgid "Users"
msgstr "用户管理" msgstr "用户管理"
...@@ -342,12 +416,6 @@ msgstr "用户管理" ...@@ -342,12 +416,6 @@ msgstr "用户管理"
msgid "User" msgid "User"
msgstr "用户" 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 #: templates/_nav.html:22
msgid "Asset group" msgid "Asset group"
msgstr "资产组" msgstr "资产组"
...@@ -408,11 +476,6 @@ msgstr "" ...@@ -408,11 +476,6 @@ msgstr ""
msgid "Captcha" msgid "Captcha"
msgstr "验证码" 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 #: users/models.py:102 users/models.py:225
msgid "Administrator" msgid "Administrator"
msgstr "管理员" msgstr "管理员"
...@@ -459,7 +522,7 @@ msgid "System" ...@@ -459,7 +522,7 @@ msgid "System"
msgstr "系统" msgstr "系统"
#: users/templates/users/_user.html:17 users/templates/users/user_list.html:5 #: users/templates/users/_user.html:17 users/templates/users/user_list.html:5
#: users/views.py:63 #: users/views.py:105
msgid "Create user" msgid "Create user"
msgstr "创建用户" msgstr "创建用户"
...@@ -484,11 +547,6 @@ msgstr "输入您的邮箱, 将会发一封重置短信邮件到您的邮箱中" ...@@ -484,11 +547,6 @@ msgstr "输入您的邮箱, 将会发一封重置短信邮件到您的邮箱中"
msgid "Captcha invalid" msgid "Captcha invalid"
msgstr "验证码错误" 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 #: users/templates/users/reset_password.html:55
msgid "Password again" msgid "Password again"
msgstr "再次输入密码" msgstr "再次输入密码"
...@@ -501,11 +559,7 @@ msgstr "设置" ...@@ -501,11 +559,7 @@ msgstr "设置"
msgid "Reset link will be generated and sent to the user. " msgid "Reset link will be generated and sent to the user. "
msgstr "生成重置密码连接,通过邮件发送给用户" msgstr "生成重置密码连接,通过邮件发送给用户"
#: users/templates/users/user_delete_confirm.html:6 #: users/templates/users/user_detail.html:18 users/views.py:162
msgid "Confirm delete"
msgstr "确认删除"
#: users/templates/users/user_detail.html:18 users/views.py:120
msgid "User detail" msgid "User detail"
msgstr "用户详情" msgstr "用户详情"
...@@ -525,19 +579,7 @@ msgstr "创建日期" ...@@ -525,19 +579,7 @@ msgstr "创建日期"
msgid "Last login" msgid "Last login"
msgstr "最后登录" msgstr "最后登录"
#: users/templates/users/user_detail.html:124 #: users/templates/users/user_group_create.html:16 users/views.py:200
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
msgid "Create user group" msgid "Create user group"
msgstr "创建用户组" msgstr "创建用户组"
...@@ -546,18 +588,10 @@ msgstr "创建用户组" ...@@ -546,18 +588,10 @@ msgstr "创建用户组"
msgid "Active" msgid "Active"
msgstr "激活" 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" msgid "Update user"
msgstr "编辑用户" msgstr "编辑用户"
#: users/urls.py:23
msgid "Logout success"
msgstr "退出登录成功"
#: users/urls.py:24
msgid "Logout success, return login page"
msgstr "退出登录成功,返回到登录页面"
#: users/utils.py:47 #: users/utils.py:47
msgid "Begin to generate ssh private key ..." msgid "Begin to generate ssh private key ..."
msgstr "开始生成ssh密钥" msgstr "开始生成ssh密钥"
...@@ -659,45 +693,53 @@ msgstr "" ...@@ -659,45 +693,53 @@ msgstr ""
" </br>\n" " </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" msgid "User list"
msgstr "用户列表" msgstr "用户列表"
#: users/views.py:59 #: users/views.py:101
#, python-format #, python-format
msgid "Create user <a href=\"%s\">%s</a> success." msgid "Create user <a href=\"%s\">%s</a> success."
msgstr "创建用户 <a href=\"%s\">%s</a> 成功" msgstr "创建用户 <a href=\"%s\">%s</a> 成功"
#: users/views.py:145 #: users/views.py:187
msgid "User group list" msgid "User group list"
msgstr "用户组列表" msgstr "用户组列表"
#: users/views.py:190 #: users/views.py:232
msgid "Email address invalid, input again" msgid "Email address invalid, input again"
msgstr "邮箱地址错误,重新输入" msgstr "邮箱地址错误,重新输入"
#: users/views.py:201 #: users/views.py:243
msgid "Send reset password message" msgid "Send reset password message"
msgstr "发送重置密码邮件" msgstr "发送重置密码邮件"
#: users/views.py:202 #: users/views.py:244
msgid "Send reset password mail success, login your mail box and follow it " msgid "Send reset password mail success, login your mail box and follow it "
msgstr "" msgstr ""
"发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)" "发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)"
#: users/views.py:214 #: users/views.py:256
msgid "Reset password success" msgid "Reset password success"
msgstr "重置密码成功" msgstr "重置密码成功"
#: users/views.py:215 #: users/views.py:257
msgid "Reset password success, return to login page" msgid "Reset password success, return to login page"
msgstr "重置密码成功,返回到登录页面" msgstr "重置密码成功,返回到登录页面"
#: users/views.py:231 users/views.py:244 #: users/views.py:273 users/views.py:286
msgid "Token invalid or expired" msgid "Token invalid or expired"
msgstr "Token错误或失效" msgstr "Token错误或失效"
#: users/views.py:240 #: users/views.py:282
msgid "Password not same" msgid "Password not same"
msgstr "密码不一致" msgstr "密码不一致"
......
...@@ -38,6 +38,7 @@ th a { ...@@ -38,6 +38,7 @@ th a {
color: white; color: white;
} }
.select2-selection--single,
.select2-selection--multiple { .select2-selection--multiple {
border: 1px solid #e5e6e7 !important; border: 1px solid #e5e6e7 !important;
cursor: text !important; cursor: text !important;
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
<div class="ibox-content"> <div class="ibox-content">
<div class=""> <div class="">
{# left button add #}
{% block content_left_head %} {% endblock %} {% block content_left_head %} {% endblock %}
<form id="search_form" method="get" action="" class="pull-right mail-search"> <form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group"> <div class="input-group">
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<ul class="nav nav-second-level"> <ul class="nav nav-second-level">
<li id="asset"><a href="{% url 'assets:asset-list' %}">{% trans 'Asset' %}</a></li> <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="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="admin-user"><a href="">{% trans 'Admin user' %}</a></li>
<li id="system-user"><a href="">{% trans 'System user' %}</a></li> <li id="system-user"><a href="">{% trans 'System user' %}</a></li>
<li id=""><a href="">{% trans 'Label' %}</a></li> <li id=""><a href="">{% trans 'Label' %}</a></li>
......
...@@ -34,11 +34,6 @@ ...@@ -34,11 +34,6 @@
</div> </div>
{% endif %} {% endif %}
<script> <script>
{# function sleep(n) { //n表示的毫秒数#}
{# var start = new Date().getTime();#}
{# while (true) if (new Date().getTime() - start > n) break;#}
{# }#}
$(document).ready(function () { $(document).ready(function () {
$('.page').click(function () { $('.page').click(function () {
var searchStr = location.search; var searchStr = location.search;
......
"""
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 @@ ...@@ -28,7 +28,7 @@
</div> </div>
</div> </div>
<div class="ibox-content"> <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 %} {% csrf_token %}
<h3>{% trans 'Account' %}</h3> <h3>{% trans 'Account' %}</h3>
{% block username %} {% endblock %} {% block username %} {% endblock %}
......
...@@ -19,19 +19,6 @@ ...@@ -19,19 +19,6 @@
</li> </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 assets' %}</a></li>
<li><a href="" class="text-center"><i class="fa fa-bar-chart-o"></i> {% trans 'User log' %}</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> </ul>
</div> </div>
<div class="tab-content"> <div class="tab-content">
...@@ -118,7 +105,7 @@ ...@@ -118,7 +105,7 @@
</div> </div>
</div> </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 panel-primary">
<div class="panel-heading"> <div class="panel-heading">
<i class="fa fa-info-circle"></i> {% trans 'Quick modify' %} <i class="fa fa-info-circle"></i> {% trans 'Quick modify' %}
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
</div> </div>
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<form method="post" id="userForm" class="form-horizontal" action="" > <form method="post" class="form-horizontal" action="" >
{% csrf_token %} {% csrf_token %}
{{ form.name|bootstrap_horizontal }} {{ form.name|bootstrap_horizontal }}
......
...@@ -16,6 +16,7 @@ urlpatterns = [ ...@@ -16,6 +16,7 @@ urlpatterns = [
name='reset-password-success'), name='reset-password-success'),
url(r'^user$', views.UserListView.as_view(), name='user-list'), 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]+)$', 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/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]+)/update$', views.UserUpdateView.as_view(), name='user-update'),
url(r'^user/(?P<pk>[0-9]+)/delete$', views.UserDeleteView.as_view(), name='user-delete'), url(r'^user/(?P<pk>[0-9]+)/delete$', views.UserDeleteView.as_view(), name='user-delete'),
......
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