Commit d1c96cd4 authored by ibuler's avatar ibuler

Merge branch 'cmdb' of code.simcu.com:jumpserver/jumpserver into cmdb

parents 154783a9 fa07f4ee
...@@ -22,7 +22,8 @@ class IDCSerializer(serializers.ModelSerializer): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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", "groups", "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"
] ]
......
...@@ -6,9 +6,9 @@ from django.utils.translation import ugettext_lazy as _ ...@@ -6,9 +6,9 @@ from django.utils.translation import ugettext_lazy as _
class AssetGroup(models.Model): class AssetGroup(models.Model):
name = models.CharField(max_length=64, unique=True, verbose_name=_('Name')) name = models.CharField(max_length=64, unique=True, null=True, blank=True, verbose_name=_('Name'))
created_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by')) created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by'))
comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment')) comment = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Comment'))
def __unicode__(self): def __unicode__(self):
return self.name return self.name
...@@ -34,44 +34,97 @@ class IDC(models.Model): ...@@ -34,44 +34,97 @@ class IDC(models.Model):
class Meta: class Meta:
db_table = 'idc' db_table = 'idc'
verbose_name = _('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"Created by")
date_added = models.DateTimeField(auto_now=True, null=True, blank=True)
comment = models.CharField(max_length=128, blank=True, verbose_name=u"Comment")
def __unicode__(self):
return self.name
class Meta:
db_table = 'assetextend'
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'
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=_('Other IP')) other_ip = models.CharField(max_length=255, null=True, blank=True, verbose_name=_('Other IP'))
remote_card_ip = models.CharField(max_length=16, blank=True, verbose_name=_('Remote card IP')) remote_card_ip = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('Remote card IP'))
hostname = models.CharField(max_length=128, unique=True, blank=True, verbose_name=_('Hostname')) hostname = models.CharField(max_length=128, unique=True, null=True, blank=True, verbose_name=_('Hostname'))
port = models.IntegerField(blank=True, verbose_name=_('Port')) port = models.IntegerField(null=True, blank=True, verbose_name=_('Port'))
groups = models.ManyToManyField(AssetGroup, blank=True, verbose_name=_('Asset groups')) groups = models.ManyToManyField(AssetGroup, null=True, blank=True, verbose_name=_('Asset groups'))
username = models.CharField(max_length=16, 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, blank=True, verbose_name=_("Admin password")) password = models.CharField(max_length=256, null=True, blank=True, verbose_name=_("Admin password"))
idc = models.ForeignKey(IDC, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=_('IDC')) admin_user = models.ForeignKey(AdminUser, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_("Admin User"))
mac_addr = models.CharField(max_length=20, blank=True, verbose_name=_("Mac address")) sys_user = models.ManyToManyField(SysUser, null=True, blank=True, verbose_name=_("Sys User"))
brand = models.CharField(max_length=64, blank=True, verbose_name=_('Brand')) idc = models.ForeignKey(IDC, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('IDC'))
cpu = models.CharField(max_length=64, blank=True, verbose_name=_('CPU')) mac_addr = models.CharField(max_length=20, null=True, blank=True, verbose_name=_("Mac address"))
memory = models.CharField(max_length=128, blank=True, verbose_name=_('Memory')) brand = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('Brand'))
disk = models.CharField(max_length=1024, blank=True, verbose_name=_('Disk')) cpu = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('CPU'))
os = models.CharField(max_length=128, blank=True, verbose_name=_('OS')) memory = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Memory'))
cabinet_no = models.CharField(max_length=32, blank=True, verbose_name=_('Cabinet number')) disk = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('Disk'))
os = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('OS'))
cabinet_no = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Cabinet number'))
cabinet_pos = models.IntegerField(null=True, blank=True, verbose_name=_('Cabinet position')) cabinet_pos = models.IntegerField(null=True, blank=True, verbose_name=_('Cabinet position'))
number = models.CharField(max_length=32, blank=True, unique=True, verbose_name=_('Asset number')) number = models.CharField(max_length=32, null=True, blank=True, unique=True, verbose_name=_('Asset number'))
status = models.ManyToManyField(AssetExtend, blank=True, status = models.ManyToManyField(AssetExtend, null=True, blank=True,
related_name="asset_status_extend", verbose_name=_('Asset status')) related_name="asset_status_extend", verbose_name=_('Asset status'))
type = models.ManyToManyField(AssetExtend, blank=True, type = models.ManyToManyField(AssetExtend, null=True, blank=True,
related_name="asset_type_extend", verbose_name=_('Asset type')) related_name="asset_type_extend", verbose_name=_('Asset type'))
env = models.ManyToManyField(AssetExtend, blank=True, env = models.ManyToManyField(AssetExtend, null=True, blank=True,
related_name="asset_env_extend", verbose_name=_('Asset environment')) related_name="asset_env_extend", verbose_name=_('Asset environment'))
sn = models.CharField(max_length=128, blank=True, unique=True, verbose_name=_('Serial number')) sn = models.CharField(max_length=128, null=True, blank=True, unique=True, verbose_name=_('Serial number'))
created_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by')) created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by'))
is_active = models.BooleanField(default=True, verbose_name=_('Is active')) is_active = models.BooleanField(default=True, verbose_name=_('Is active'))
date_added = models.DateTimeField(auto_now=True, null=True, verbose_name=_('Date added')) date_added = models.DateTimeField(auto_now=True, null=True, blank=True, verbose_name=_('Date added'))
comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment')) comment = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Comment'))
def __unicode__(self): def __unicode__(self):
return self.ip return self.ip
...@@ -79,3 +132,19 @@ class Asset(models.Model): ...@@ -79,3 +132,19 @@ class Asset(models.Model):
class Meta: class Meta:
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=_("Created by"))
date_added = models.DateTimeField(auto_now=True, null=True, blank=True)
comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment'))
def __unicode__(self):
return self.name
class Meta:
db_table = 'label'
...@@ -24,45 +24,33 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 %}
\ No newline at end of file
# coding:utf-8 # coding:utf-8
from django.conf.urls import url, include
from .views import *
# from .api import (
# AssetGroupViewSet, AssetViewSet, IDCViewSet
# )
from django.conf.urls import url,include from django.conf.urls import url,include
import views import views
# from rest_framework import routers # from rest_framework import routers
...@@ -9,6 +14,9 @@ import views ...@@ -9,6 +14,9 @@ import views
app_name = 'assets' app_name = 'assets'
urlpatterns = [ urlpatterns = [
url(r'^$', AssetListView.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'^asset', views.AssetListView.as_view(), name='asset-list'), url(r'^asset', views.AssetListView.as_view(), name='asset-list'),
url(r'^asset/add$', views.AssetAddView.as_view(), name='asset-add'), url(r'^asset/add$', views.AssetAddView.as_view(), name='asset-add'),
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'),
......
# ~*~ 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
# coding:utf-8
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
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.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
...@@ -7,6 +12,8 @@ from django.views.generic.detail import DetailView ...@@ -7,6 +12,8 @@ from django.views.generic.detail import DetailView
from .models import Asset, AssetGroup, IDC, AssetExtend from .models import Asset, AssetGroup, IDC, AssetExtend
from .forms import AssetForm from .forms import AssetForm
from .utils import AdminUserRequiredMixin
class AssetAddView(CreateView): class AssetAddView(CreateView):
model = Asset model = Asset
...@@ -14,6 +21,10 @@ class AssetAddView(CreateView): ...@@ -14,6 +21,10 @@ class AssetAddView(CreateView):
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 AssetEditView(UpdateView): class AssetEditView(UpdateView):
pass pass
......
...@@ -132,7 +132,7 @@ else: ...@@ -132,7 +132,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',
......
# -*- 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'),
),
]
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