add asset amdin|sys user model

pull/530/head
wangyong 2016-09-04 17:43:03 +08:00
parent d96ac56460
commit 426c3c4062
10 changed files with 234 additions and 215 deletions

View File

@ -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.

View File

@ -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"
] ]

View File

@ -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'

View File

@ -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 %}

View File

@ -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)),
] ]

View File

@ -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

View File

@ -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

View File

@ -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',

View File

@ -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'),
),
]

View File

@ -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)