mirror of https://github.com/jumpserver/jumpserver
add asset amdin|sys user model
parent
d96ac56460
commit
426c3c4062
|
@ -22,7 +22,8 @@ class IDCSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = IDC
|
model = IDC
|
||||||
#fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
|
#fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
|
||||||
|
|
||||||
|
|
||||||
class AssetGroupViewSet(viewsets.ModelViewSet):
|
class AssetGroupViewSet(viewsets.ModelViewSet):
|
||||||
"""
|
"""
|
||||||
API endpoint that allows AssetGroup to be viewed or edited.
|
API endpoint that allows AssetGroup to be viewed or edited.
|
||||||
|
@ -30,6 +31,7 @@ class AssetGroupViewSet(viewsets.ModelViewSet):
|
||||||
queryset = AssetGroup.objects.all()
|
queryset = AssetGroup.objects.all()
|
||||||
serializer_class = AssetGroupSerializer
|
serializer_class = AssetGroupSerializer
|
||||||
|
|
||||||
|
|
||||||
class AssetViewSet(viewsets.ModelViewSet):
|
class AssetViewSet(viewsets.ModelViewSet):
|
||||||
"""
|
"""
|
||||||
API endpoint that allows Asset to be viewed or edited.
|
API endpoint that allows Asset to be viewed or edited.
|
||||||
|
@ -37,6 +39,7 @@ class AssetViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Asset.objects.all()
|
queryset = Asset.objects.all()
|
||||||
serializer_class = AssetSerializer
|
serializer_class = AssetSerializer
|
||||||
|
|
||||||
|
|
||||||
class IDCViewSet(viewsets.ModelViewSet):
|
class IDCViewSet(viewsets.ModelViewSet):
|
||||||
"""
|
"""
|
||||||
API endpoint that allows IDC to be viewed or edited.
|
API endpoint that allows IDC to be viewed or edited.
|
||||||
|
|
|
@ -10,8 +10,8 @@ class AssetForm(forms.ModelForm):
|
||||||
model = Asset
|
model = Asset
|
||||||
|
|
||||||
fields = [
|
fields = [
|
||||||
"ip", "other_ip", "hostname", "port", "group", "username", "password", "idc", "mac_addr",
|
"ip", "other_ip", "remote_card_ip", "hostname", "port", "group", "username", "password",
|
||||||
"remote_card_ip", "brand", "cpu", "memory", "disk", "os", "cabinet_no", "cabinet_pos",
|
"idc", "mac_addr", "brand", "cpu", "memory", "disk", "os", "cabinet_no", "cabinet_pos",
|
||||||
"number", "status", "type", "env", "sn", "is_active", "comment"
|
"number", "status", "type", "env", "sn", "is_active", "comment"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -33,44 +33,54 @@ class IDC(models.Model):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'idc'
|
db_table = 'idc'
|
||||||
verbose_name = u"IDC机房"
|
|
||||||
verbose_name_plural = verbose_name
|
|
||||||
|
|
||||||
|
|
||||||
class AssetExtend(models.Model):
|
class AssetExtend(models.Model):
|
||||||
pass
|
key = models.CharField(max_length=64, null=True, blank=True, verbose_name=u'key')
|
||||||
|
value = models.CharField(max_length=64, null=True, blank=True, verbose_name=u'value')
|
||||||
|
created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者")
|
||||||
|
date_added = models.DateTimeField(auto_now=True, null=True, blank=True)
|
||||||
|
comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注")
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'assetextend'
|
||||||
|
|
||||||
|
|
||||||
class Asset(models.Model):
|
class Asset(models.Model):
|
||||||
ip = models.CharField(max_length=32, blank=True, verbose_name="资产IP")
|
ip = models.CharField(max_length=32, null=True, blank=True, verbose_name="资产IP")
|
||||||
other_ip = models.CharField(max_length=255, blank=True, verbose_name="其他IP")
|
other_ip = models.CharField(max_length=255, null=True, blank=True, verbose_name="其他IP")
|
||||||
remote_card_ip = models.CharField(max_length=16, blank=True, verbose_name=u'远控卡IP')
|
remote_card_ip = models.CharField(max_length=16, null=True, blank=True, verbose_name=u'远控卡IP')
|
||||||
hostname = models.CharField(max_length=128, unique=True, blank=True, verbose_name=u"主机名")
|
hostname = models.CharField(max_length=128, unique=True, null=True, blank=True, verbose_name=u"主机名")
|
||||||
port = models.IntegerField(blank=True, verbose_name=u"端口")
|
port = models.IntegerField(null=True, blank=True, verbose_name=u"端口")
|
||||||
group = models.ManyToManyField(AssetGroup, blank=True, verbose_name=u"所属主机组")
|
group = models.ManyToManyField(AssetGroup, null=True, blank=True, verbose_name=u"所属主机组")
|
||||||
username = models.CharField(max_length=16, blank=True, verbose_name=u"管理用户名")
|
admin_user = models.ForeignKey(AdminUser, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=u'管理用户')
|
||||||
password = models.CharField(max_length=256, blank=True, verbose_name=u"密码")
|
sys_user = models.ManyToManyField(AssetExtend, null=True, blank=True, verbose_name="系统用户")
|
||||||
idc = models.ForeignKey(IDC, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=u'机房')
|
username = models.CharField(max_length=16, null=True, blank=True, verbose_name=u"管理用户名")
|
||||||
mac_addr = models.CharField(max_length=20, blank=True, unique=True, verbose_name=u"MAC地址")
|
password = models.CharField(max_length=256, null=True, blank=True, verbose_name=u"密码")
|
||||||
brand = models.CharField(max_length=64, blank=True, verbose_name=u'硬件厂商型号')
|
idc = models.ForeignKey(IDC, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=u'机房')
|
||||||
cpu = models.CharField(max_length=64, blank=True, verbose_name=u'CPU')
|
mac_addr = models.CharField(max_length=20, null=True, blank=True, verbose_name=u"MAC地址")
|
||||||
memory = models.CharField(max_length=128, blank=True, verbose_name=u'内存')
|
brand = models.CharField(max_length=64, null=True, blank=True, verbose_name=u'硬件厂商型号')
|
||||||
disk = models.CharField(max_length=1024, blank=True, verbose_name=u'硬盘')
|
cpu = models.CharField(max_length=64, null=True, blank=True, verbose_name=u'CPU')
|
||||||
os = models.CharField(max_length=128, blank=True, verbose_name=u'系统信息')
|
memory = models.CharField(max_length=128, null=True, blank=True, verbose_name=u'内存')
|
||||||
cabinet_no = models.CharField(max_length=32, blank=True, verbose_name=u'机柜号')
|
disk = models.CharField(max_length=1024, null=True, blank=True, verbose_name=u'硬盘')
|
||||||
|
os = models.CharField(max_length=128, null=True, blank=True, verbose_name=u'系统信息')
|
||||||
|
cabinet_no = models.CharField(max_length=32, null=True, blank=True, verbose_name=u'机柜号')
|
||||||
cabinet_pos = models.IntegerField(null=True, blank=True, verbose_name=u'资产位置')
|
cabinet_pos = models.IntegerField(null=True, blank=True, verbose_name=u'资产位置')
|
||||||
number = models.CharField(max_length=32, blank=True, unique=True, verbose_name=u'资产编号')
|
number = models.CharField(max_length=32, null=True, blank=True, verbose_name=u'资产编号')
|
||||||
status = models.ManyToManyField(AssetExtend, blank=True,
|
status = models.ManyToManyField(AssetExtend, null=True, blank=True,
|
||||||
related_name="asset_status_extend", verbose_name="资产状态")
|
related_name="asset_status_extend", verbose_name="资产状态")
|
||||||
type = models.ManyToManyField(AssetExtend, blank=True,
|
type = models.ManyToManyField(AssetExtend, null=True, blank=True,
|
||||||
related_name="asset_type_extend", verbose_name="资产类型")
|
related_name="asset_type_extend", verbose_name="资产类型")
|
||||||
env = models.ManyToManyField(AssetExtend, blank=True,
|
env = models.ManyToManyField(AssetExtend, null=True, blank=True,
|
||||||
related_name="asset_env_extend", verbose_name="所属主机组环境")
|
related_name="asset_env_extend", verbose_name="资产环境")
|
||||||
sn = models.CharField(max_length=128, blank=True, unique=True, verbose_name=u"SN编号")
|
sn = models.CharField(max_length=128, null=True, blank=True, verbose_name=u"SN编号")
|
||||||
created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者")
|
created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=u"创建者")
|
||||||
is_active = models.BooleanField(default=True, verbose_name=u"是否激活")
|
is_active = models.BooleanField(default=True, verbose_name=u"是否激活")
|
||||||
date_added = models.DateTimeField(auto_now=True, null=True)
|
date_added = models.DateTimeField(auto_now=True, null=True, blank=True)
|
||||||
comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注")
|
comment = models.CharField(max_length=128, null=True, blank=True, verbose_name=u"备注")
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.ip
|
return self.ip
|
||||||
|
@ -79,12 +89,59 @@ class Asset(models.Model):
|
||||||
db_table = 'asset'
|
db_table = 'asset'
|
||||||
|
|
||||||
|
|
||||||
|
class Label(models.Model):
|
||||||
|
key = models.CharField(max_length=64, null=True, blank=True, verbose_name=u'key')
|
||||||
|
value = models.CharField(max_length=64, null=True, blank=True, verbose_name=u'value')
|
||||||
|
asset = models.ForeignKey(Asset, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=u'label')
|
||||||
|
created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者")
|
||||||
|
date_added = models.DateTimeField(auto_now=True, null=True, blank=True)
|
||||||
|
comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注")
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'label'
|
||||||
|
|
||||||
|
|
||||||
|
class AdminUser(models.Model):
|
||||||
|
name = models.CharField(max_length=128, unique=True, null=True, blank=True, verbose_name=u"用户名称")
|
||||||
|
username = models.CharField(max_length=16, null=True, blank=True, verbose_name=u"用户名")
|
||||||
|
password = models.CharField(max_length=256, null=True, blank=True, verbose_name=u"密码")
|
||||||
|
private_key = models.CharField(max_length=4096, null=True, blank=True, verbose_name=u"私钥")
|
||||||
|
is_default = models.BooleanField(default=True, verbose_name=u"是否默认")
|
||||||
|
auto_update = models.BooleanField(default=True, verbose_name=u"自动更新")
|
||||||
|
date_added = models.DateTimeField(auto_now=True, null=True, blank=True)
|
||||||
|
create_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=u"创建者")
|
||||||
|
comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注")
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'adminuser'
|
||||||
|
|
||||||
|
|
||||||
|
class SysUser(models.Model):
|
||||||
|
name = models.CharField(max_length=128, unique=True, null=True, blank=True, verbose_name=u"用户名称")
|
||||||
|
username = models.CharField(max_length=16, null=True, blank=True, verbose_name=u"用户名")
|
||||||
|
password = models.CharField(max_length=256, null=True, blank=True, verbose_name=u"密码")
|
||||||
|
protocol = models.CharField(max_length=16, null=True, blank=True, verbose_name=u"协议")
|
||||||
|
private_key = models.CharField(max_length=4096, null=True, blank=True, verbose_name=u"私钥")
|
||||||
|
public_key = models.CharField(max_length=4096, null=True, blank=True, verbose_name=u"公钥")
|
||||||
|
is_default = models.BooleanField(default=True, verbose_name=u"是否显示")
|
||||||
|
auto_push = models.BooleanField(default=True, verbose_name=u"自动推送")
|
||||||
|
auto_update = models.BooleanField(default=True, verbose_name=u"自动更新")
|
||||||
|
sudo = models.CharField(max_length=4096, null=True, blank=True, verbose_name=u"私钥")
|
||||||
|
shell = models.CharField(max_length=64, null=True, blank=True, verbose_name=u"shell环境")
|
||||||
|
home = models.CharField(max_length=64, null=True, blank=True, verbose_name=u"home目录")
|
||||||
|
uid = models.IntegerField(null=True, blank=True, verbose_name=u"uid")
|
||||||
|
date_added = models.DateTimeField(auto_now=True, null=True, blank=True)
|
||||||
|
create_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=u"创建者")
|
||||||
|
comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注")
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'sysuser'
|
||||||
|
|
||||||
|
|
|
@ -24,45 +24,33 @@
|
||||||
<div class="panel blank-panel">
|
<div class="panel blank-panel">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div id="tab-1" class="ibox float-e-margins tab-pane active">
|
<div id="tab-1" class="ibox float-e-margins tab-pane active"></div>
|
||||||
{% if error %}
|
|
||||||
<div class="alert alert-warning text-center">{{ error }}</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if msg %}
|
|
||||||
<div class="alert alert-success text-center">{{ msg }}</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<form id="assetForm" method="post" class="form-horizontal">
|
<form id="assetForm" method="post" class="form-horizontal">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<h2 class="widget-head-color-box">基本信息</h2>
|
<h3 class="widget-head-color-box">基本信息</h3>
|
||||||
|
|
||||||
{{ form.hostname|bootstrap_horizontal }}
|
{{ form.hostname|bootstrap_horizontal }}
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
|
||||||
{{ form.ip|bootstrap_horizontal }}
|
{{ form.ip|bootstrap_horizontal }}
|
||||||
{# <p class="col-sm-offset-2">Tips: 如果IP地址不填写, IP默认会设置与主机名一致</p>#}
|
|
||||||
|
|
||||||
<div class="form-group" id="id_port">
|
<div class="form-group" id="id_port">
|
||||||
<div class="hr-line-dashed"></div>
|
|
||||||
<label class="col-sm-2 control-label">端口</label>
|
<label class="col-sm-2 control-label">端口</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<input type="text" placeholder="" name="port" class="form-control">
|
<input type="text" placeholder="" name="port" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# <div class="form-group" id="id_type">#}
|
<div class="form-group" id="id_type">
|
||||||
{# <div class="hr-line-dashed"></div>#}
|
<label class="col-sm-2 control-label">资产类型</label>
|
||||||
{# <label class="col-sm-2 control-label">资产类型</label>#}
|
<div class="col-sm-9">
|
||||||
{# <div class="col-sm-9">#}
|
<input type="text" placeholder="" name="type" class="form-control">
|
||||||
{# <input type="text" placeholder="" name="type" class="form-control">#}
|
</div>
|
||||||
{# </div>#}
|
</div>
|
||||||
{# </div>#}
|
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
|
||||||
{{ form.comment|bootstrap_horizontal }}
|
{{ form.comment|bootstrap_horizontal }}
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<h2>关联资产用户</h2>
|
<h3>关联资产用户</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="j_group" class="col-sm-2 control-label">管理用户</label>
|
<label for="j_group" class="col-sm-2 control-label">管理用户</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
|
@ -73,7 +61,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group" id="id_port">
|
<div class="form-group" id="id_manager_user">
|
||||||
<div class="col-sm-offset-2 col-sm-9">
|
<div class="col-sm-offset-2 col-sm-9">
|
||||||
<input type="text" placeholder="请选择管理用户" name="manager_user" class="form-control">
|
<input type="text" placeholder="请选择管理用户" name="manager_user" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
@ -81,7 +69,6 @@
|
||||||
<p class="col-sm-offset-2">Tips: 管理用户是服务器存在的root或拥有sudo的用户,用来推送系统用户</p>
|
<p class="col-sm-offset-2">Tips: 管理用户是服务器存在的root或拥有sudo的用户,用来推送系统用户</p>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="hr-line-dashed"></div>
|
|
||||||
<label for="system_user" class="col-sm-2 control-label">系统用户</label>
|
<label for="system_user" class="col-sm-2 control-label">系统用户</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<input type="text" placeholder="" name="system_user" class="form-control">
|
<input type="text" placeholder="" name="system_user" class="form-control">
|
||||||
|
@ -89,14 +76,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<h2>所属</h2>
|
<h3>所属</h3>
|
||||||
{{ form.idc|bootstrap_horizontal }}
|
{{ form.idc|bootstrap_horizontal }}
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
|
||||||
{{ form.group|bootstrap_horizontal }}
|
{{ form.group|bootstrap_horizontal }}
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<h2>标签</h2>
|
<h3>标签</h3>
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
@ -118,84 +104,84 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block self_footer_js %}
|
{% block self_footer_js %}
|
||||||
<script>
|
{#<script>#}
|
||||||
$('document').ready(function(){
|
{# $('document').ready(function(){#}
|
||||||
var check_default = "{{ default_setting.name }}";
|
{# var check_default = "{{ default_setting.name }}";#}
|
||||||
console.log(check_default);
|
{# console.log(check_default);#}
|
||||||
if (check_default != 'default'){
|
{# if (check_default != 'default'){#}
|
||||||
$('#id_use_default_auth').attr('disabled', true);
|
{# $('#id_use_default_auth').attr('disabled', true);#}
|
||||||
$('#id_use_default_auth').attr('checked', false);
|
{# $('#id_use_default_auth').attr('checked', false);#}
|
||||||
$('#admin_account').css('display', 'block');
|
{# $('#admin_account').css('display', 'block');#}
|
||||||
} else {
|
{# } else {#}
|
||||||
$('#id_use_default_auth').click(function(){
|
{# $('#id_use_default_auth').click(function(){#}
|
||||||
if ($(this).is(':checked')){
|
{# if ($(this).is(':checked')){#}
|
||||||
$('#admin_account').css('display', 'none');
|
{# $('#admin_account').css('display', 'none');#}
|
||||||
}
|
{# }#}
|
||||||
else {
|
{# else {#}
|
||||||
$('#admin_account').css('display', 'block');
|
{# $('#admin_account').css('display', 'block');#}
|
||||||
}
|
{# }#}
|
||||||
})
|
{# })#}
|
||||||
}
|
{# }#}
|
||||||
|
{##}
|
||||||
});
|
{# });#}
|
||||||
|
{##}
|
||||||
var required_fields = ["id_ip", "id_hostname", "id_port"];
|
{# var required_fields = ["id_ip", "id_hostname", "id_port"];#}
|
||||||
required_fields.forEach(function(field) {
|
{# required_fields.forEach(function(field) {#}
|
||||||
$('label[for="' + field + '"]').parent().addClass("required");
|
{# $('label[for="' + field + '"]').parent().addClass("required");#}
|
||||||
});
|
{# });#}
|
||||||
|
{##}
|
||||||
$('#assetForm').validator({
|
{# $('#assetForm').validator({#}
|
||||||
timely: 2,
|
{# timely: 2,#}
|
||||||
theme: "yellow_right_effect",
|
{# theme: "yellow_right_effect",#}
|
||||||
rules: {
|
{# rules: {#}
|
||||||
check_ip: [/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/, 'ip地址不正确'],
|
{# check_ip: [/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/, 'ip地址不正确'],#}
|
||||||
check_port: [/^\d{1,5}$/, '端口号不正确'],
|
{# check_port: [/^\d{1,5}$/, '端口号不正确'],#}
|
||||||
use_default_auth: function() {
|
{# use_default_auth: function() {#}
|
||||||
var str1 = $("#id_use_default_auth").is(":checked");
|
{# var str1 = $("#id_use_default_auth").is(":checked");#}
|
||||||
if (str1 == true){
|
{# if (str1 == true){#}
|
||||||
var decide = false;
|
{# var decide = false;#}
|
||||||
} else {
|
{# } else {#}
|
||||||
var decide = true;
|
{# var decide = true;#}
|
||||||
}
|
{# }#}
|
||||||
return decide}
|
{# return decide}#}
|
||||||
},
|
{# },#}
|
||||||
fields: {
|
{# fields: {#}
|
||||||
"ip": {
|
{# "ip": {#}
|
||||||
rule: "check_ip;",
|
{# rule: "check_ip;",#}
|
||||||
tip: "输入IP",
|
{# tip: "输入IP",#}
|
||||||
ok: "",
|
{# ok: "",#}
|
||||||
msg: {required: "必须填写!"}
|
{# msg: {required: "必须填写!"}#}
|
||||||
},
|
{# },#}
|
||||||
"hostname": {
|
{# "hostname": {#}
|
||||||
rule: "required;length[0~53]",
|
{# rule: "required;length[0~53]",#}
|
||||||
tip: "填写主机名",
|
{# tip: "填写主机名",#}
|
||||||
ok: "",
|
{# ok: "",#}
|
||||||
msg: {required: "必须填写!"}
|
{# msg: {required: "必须填写!"}#}
|
||||||
},
|
{# },#}
|
||||||
"port": {
|
{# "port": {#}
|
||||||
rule: "required",
|
{# rule: "required",#}
|
||||||
tip: "输入端口号",
|
{# tip: "输入端口号",#}
|
||||||
ok: "",
|
{# ok: "",#}
|
||||||
msg: {required: "必须填写!"}
|
{# msg: {required: "必须填写!"}#}
|
||||||
},
|
{# },#}
|
||||||
"username": {
|
{# "username": {#}
|
||||||
rule: "required(use_default_auth)",
|
{# rule: "required(use_default_auth)",#}
|
||||||
tip: "输入用户名",
|
{# tip: "输入用户名",#}
|
||||||
ok: "",
|
{# ok: "",#}
|
||||||
msg: {required: "必须填写!"}
|
{# msg: {required: "必须填写!"}#}
|
||||||
},
|
{# },#}
|
||||||
"password": {
|
{# "password": {#}
|
||||||
rule: "required(use_default_auth);length[0~64]",
|
{# rule: "required(use_default_auth);length[0~64]",#}
|
||||||
tip: "输入密码",
|
{# tip: "输入密码",#}
|
||||||
ok: "",
|
{# ok: "",#}
|
||||||
msg: {required: "必须填写!"}
|
{# msg: {required: "必须填写!"}#}
|
||||||
}
|
{# }#}
|
||||||
},
|
{# },#}
|
||||||
valid: function(form) {
|
{# valid: function(form) {#}
|
||||||
form.submit();
|
{# form.submit();#}
|
||||||
}
|
{# }#}
|
||||||
});
|
{# });#}
|
||||||
|
{##}
|
||||||
</script>
|
{#</script>#}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -1,20 +1,20 @@
|
||||||
# coding:utf-8
|
# coding:utf-8
|
||||||
from django.conf.urls import url,include
|
from django.conf.urls import url, include
|
||||||
from .views import *
|
from .views import *
|
||||||
from .api import (
|
# from .api import (
|
||||||
AssetGroupViewSet,AssetViewSet,IDCViewSet
|
# AssetGroupViewSet, AssetViewSet, IDCViewSet
|
||||||
)
|
# )
|
||||||
from rest_framework import routers
|
# from rest_framework import routers
|
||||||
router = routers.DefaultRouter()
|
# router = routers.DefaultRouter()
|
||||||
router.register(r'assetgroup', AssetGroupViewSet)
|
# router.register(r'assetgroup', AssetGroupViewSet)
|
||||||
router.register(r'asset', AssetViewSet)
|
# router.register(r'asset', AssetViewSet)
|
||||||
router.register(r'idc', IDCViewSet)
|
# router.register(r'idc', IDCViewSet)
|
||||||
app_name = 'assets'
|
app_name = 'assets'
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^add/$', AssetAddView.as_view(), name='asset-add'),
|
url(r'^assets/add/$', AssetAddView.as_view(), name='asset-add'),
|
||||||
url(r'^$', AssetListView.as_view(), name='asset-list'),
|
url(r'^$', AssetListView.as_view(), name='asset-list'),
|
||||||
url(r'^(?P<pk>[0-9]+)/delete/$', AssetDeleteView.as_view(), name='asset-list'),
|
url(r'^(?P<pk>[0-9]+)/delete/$', AssetDeleteView.as_view(), name='asset-delete'),
|
||||||
url(r'^(?P<pk>[0-9]+)/detail/$', AssetDetailView.as_view(), name='asset-detail'),
|
url(r'^(?P<pk>[0-9]+)/detail/$', AssetDetailView.as_view(), name='asset-detail'),
|
||||||
url(r'^api/v1.0/', include(router.urls)),
|
# url(r'^api/v1.0/', include(router.urls)),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,2 +1,23 @@
|
||||||
# ~*~ coding: utf-8 ~*~
|
# ~*~ coding: utf-8 ~*~
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from django.contrib.auth.mixins import UserPassesTestMixin
|
||||||
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
|
from common.tasks import send_mail_async
|
||||||
|
from common.utils import reverse
|
||||||
|
from users.models import User
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
import cStringIO as StringIO
|
||||||
|
except ImportError:
|
||||||
|
import StringIO
|
||||||
|
|
||||||
|
|
||||||
|
class AdminUserRequiredMixin(UserPassesTestMixin):
|
||||||
|
login_url = reverse_lazy('users:login')
|
||||||
|
|
||||||
|
def test_func(self):
|
||||||
|
return self.request.user.is_staff
|
||||||
|
|
||||||
|
|
|
@ -1,38 +1,25 @@
|
||||||
from django.views.generic import (
|
from django.views.generic import TemplateView, ListView
|
||||||
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.detail import DetailView
|
||||||
|
from .models import Asset, AssetGroup, IDC, AssetExtend
|
||||||
|
from .forms import AssetForm
|
||||||
|
|
||||||
|
from .utils import AdminUserRequiredMixin
|
||||||
|
|
||||||
|
|
||||||
from django.views.generic.edit import (
|
class AssetAddView(AdminUserRequiredMixin, CreateView):
|
||||||
CreateView, DeleteView, FormView, UpdateView
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
from django.views.generic.detail import (
|
|
||||||
DetailView
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
from .models import (
|
|
||||||
Asset, AssetGroup, IDC, AssetExtend
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
from .forms import (
|
|
||||||
AssetForm,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class AssetAddView(CreateView):
|
|
||||||
model = Asset
|
model = Asset
|
||||||
form_class = AssetForm
|
form_class = AssetForm
|
||||||
template_name = 'assets/asset_add.html'
|
template_name = 'assets/asset_add.html'
|
||||||
success_url = reverse_lazy('assets:asset-list')
|
success_url = reverse_lazy('assets:asset-list')
|
||||||
|
|
||||||
|
def form_invalid(self, form):
|
||||||
|
print(form.errors)
|
||||||
|
return super(AssetAddView, self).form_invalid(form)
|
||||||
|
|
||||||
class AssetEdit():
|
|
||||||
|
class AssetEditView():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ else:
|
||||||
|
|
||||||
# Password validation
|
# Password validation
|
||||||
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
|
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
|
||||||
|
#
|
||||||
AUTH_PASSWORD_VALIDATORS = [
|
AUTH_PASSWORD_VALIDATORS = [
|
||||||
{
|
{
|
||||||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Generated by Django 1.10 on 2016-08-21 09:54
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0003_auto_20160814_1758'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='email',
|
|
||||||
field=models.EmailField(max_length=30, unique=True, verbose_name='\u90ae\u4ef6'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='groups',
|
|
||||||
field=models.ManyToManyField(to='users.UserGroup', verbose_name='\u7528\u6237\u7ec4'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='name',
|
|
||||||
field=models.CharField(max_length=20, verbose_name='\u59d3\u540d'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='username',
|
|
||||||
field=models.CharField(max_length=20, unique=True, verbose_name='\u7528\u6237\u540d'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -19,8 +19,8 @@ apps_dir = os.path.join(BASE_DIR, 'apps')
|
||||||
|
|
||||||
|
|
||||||
def start_django():
|
def start_django():
|
||||||
http_host = CONFIG.HTTP_BIND_HOST or 'locahost'
|
http_host = CONFIG.HTTP_LISTEN_HOST or 'locahost'
|
||||||
http_port = CONFIG.HTTP_LISTEN_HOST or '8080'
|
http_port = CONFIG.HTTP_LISTEN_PORT or '8080'
|
||||||
os.chdir(apps_dir)
|
os.chdir(apps_dir)
|
||||||
print('start django')
|
print('start django')
|
||||||
subprocess.call('python ./manage.py runserver %s:%s' % (http_host, http_port), shell=True)
|
subprocess.call('python ./manage.py runserver %s:%s' % (http_host, http_port), shell=True)
|
||||||
|
|
Loading…
Reference in New Issue