diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py
index c6784a4ac..1f8bae05e 100644
--- a/apps/assets/migrations/0001_initial.py
+++ b/apps/assets/migrations/0001_initial.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-08-14 08:12
+# Generated by Django 1.10 on 2016-08-21 09:52
from __future__ import unicode_literals
from django.db import migrations, models
@@ -19,26 +19,26 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ip', models.CharField(blank=True, max_length=32, verbose_name='\u4e3b\u673aIP')),
- ('other_ip', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5176\u4ed6IP')),
- ('remote_card_ip', models.CharField(blank=True, max_length=16, null=True, verbose_name='\u8fdc\u63a7\u5361IP')),
- ('hostname', models.CharField(max_length=128, unique=True, verbose_name='\u4e3b\u673a\u540d')),
- ('port', models.IntegerField(blank=True, null=True, verbose_name='\u7aef\u53e3\u53f7')),
- ('username', models.CharField(blank=True, max_length=16, null=True, verbose_name='\u7ba1\u7406\u7528\u6237\u540d')),
- ('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='\u5bc6\u7801')),
- ('mac_addr', models.CharField(blank=True, max_length=20, null=True, verbose_name='MAC\u5730\u5740')),
- ('brand', models.CharField(blank=True, max_length=64, null=True, verbose_name='\u786c\u4ef6\u5382\u5546\u578b\u53f7')),
- ('cpu', models.CharField(blank=True, max_length=64, null=True, verbose_name='CPU')),
- ('memory', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5185\u5b58')),
- ('disk', models.CharField(blank=True, max_length=1024, null=True, verbose_name='\u786c\u76d8')),
- ('os', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u7cfb\u7edf\u4fe1\u606f')),
- ('cabinet_no', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u673a\u67dc\u53f7')),
- ('cabinet_pos', models.IntegerField(blank=True, null=True, verbose_name='\u673a\u5668\u4f4d\u7f6e')),
- ('number', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u8d44\u4ea7\u7f16\u53f7')),
- ('sn', models.CharField(blank=True, max_length=128, null=True, verbose_name='SN\u7f16\u53f7')),
- ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')),
+ ('other_ip', models.CharField(blank=True, max_length=255, verbose_name='\u5176\u4ed6IP')),
+ ('remote_card_ip', models.CharField(blank=True, max_length=16, verbose_name='\u8fdc\u63a7\u5361IP')),
+ ('hostname', models.CharField(blank=True, max_length=128, unique=True, verbose_name='\u4e3b\u673a\u540d')),
+ ('port', models.IntegerField(blank=True, verbose_name='\u7aef\u53e3\u53f7')),
+ ('username', models.CharField(blank=True, max_length=16, verbose_name='\u7ba1\u7406\u7528\u6237\u540d')),
+ ('password', models.CharField(blank=True, max_length=256, verbose_name='\u5bc6\u7801')),
+ ('mac_addr', models.CharField(blank=True, max_length=20, unique=True, verbose_name='MAC\u5730\u5740')),
+ ('brand', models.CharField(blank=True, max_length=64, verbose_name='\u786c\u4ef6\u5382\u5546\u578b\u53f7')),
+ ('cpu', models.CharField(blank=True, max_length=64, verbose_name='CPU')),
+ ('memory', models.CharField(blank=True, max_length=128, verbose_name='\u5185\u5b58')),
+ ('disk', models.CharField(blank=True, max_length=1024, verbose_name='\u786c\u76d8')),
+ ('os', models.CharField(blank=True, max_length=128, verbose_name='\u7cfb\u7edf\u4fe1\u606f')),
+ ('cabinet_no', models.CharField(blank=True, max_length=32, verbose_name='\u673a\u67dc\u53f7')),
+ ('cabinet_pos', models.IntegerField(blank=True, verbose_name='\u673a\u5668\u4f4d\u7f6e')),
+ ('number', models.CharField(blank=True, max_length=32, unique=True, verbose_name='\u8d44\u4ea7\u7f16\u53f7')),
+ ('sn', models.CharField(blank=True, max_length=128, unique=True, verbose_name='SN\u7f16\u53f7')),
+ ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')),
('is_active', models.BooleanField(default=True, verbose_name='\u662f\u5426\u6fc0\u6d3b')),
('date_added', models.DateTimeField(auto_now=True, null=True)),
- ('comment', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5907\u6ce8')),
+ ('comment', models.CharField(blank=True, max_length=128, verbose_name='\u5907\u6ce8')),
],
options={
'db_table': 'asset',
@@ -55,7 +55,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=64, unique=True)),
- ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')),
+ ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')),
('comment', models.CharField(blank=True, max_length=128, null=True)),
],
options={
@@ -67,15 +67,15 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=32, verbose_name='\u673a\u623f\u540d\u79f0')),
- ('bandwidth', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u673a\u623f\u5e26\u5bbd')),
- ('contact', models.CharField(blank=True, default='', max_length=16, null=True, verbose_name='\u8054\u7cfb\u4eba')),
- ('phone', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u8054\u7cfb\u7535\u8bdd')),
- ('address', models.CharField(blank=True, default='', max_length=128, null=True, verbose_name='\u673a\u623f\u5730\u5740')),
- ('network', models.TextField(blank=True, default='', null=True, verbose_name='IP\u5730\u5740\u6bb5')),
+ ('bandwidth', models.CharField(blank=True, max_length=32, verbose_name='\u673a\u623f\u5e26\u5bbd')),
+ ('contact', models.CharField(blank=True, max_length=16, verbose_name='\u8054\u7cfb\u4eba')),
+ ('phone', models.CharField(blank=True, max_length=32, verbose_name='\u8054\u7cfb\u7535\u8bdd')),
+ ('address', models.CharField(blank=True, max_length=128, verbose_name='\u673a\u623f\u5730\u5740')),
+ ('network', models.TextField(blank=True, verbose_name='IP\u5730\u5740\u6bb5')),
('date_added', models.DateField(auto_now=True, null=True)),
- ('operator', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u8fd0\u8425\u5546')),
- ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')),
- ('comment', models.CharField(blank=True, default='', max_length=128, null=True, verbose_name='\u5907\u6ce8')),
+ ('operator', models.CharField(blank=True, max_length=32, verbose_name='\u8fd0\u8425\u5546')),
+ ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')),
+ ('comment', models.CharField(blank=True, max_length=128, verbose_name='\u5907\u6ce8')),
],
options={
'db_table': 'idc',
diff --git a/apps/assets/migrations/0002_auto_20160821_1757.py b/apps/assets/migrations/0002_auto_20160821_1757.py
new file mode 100644
index 000000000..e22966fd8
--- /dev/null
+++ b/apps/assets/migrations/0002_auto_20160821_1757.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-08-21 09:57
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('assets', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='asset',
+ name='cabinet_pos',
+ field=models.IntegerField(blank=True, max_length=4, verbose_name='\u673a\u5668\u4f4d\u7f6e'),
+ ),
+ ]
diff --git a/apps/assets/migrations/0003_auto_20160821_1759.py b/apps/assets/migrations/0003_auto_20160821_1759.py
new file mode 100644
index 000000000..e5c49bcd5
--- /dev/null
+++ b/apps/assets/migrations/0003_auto_20160821_1759.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-08-21 09:59
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('assets', '0002_auto_20160821_1757'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='asset',
+ name='cabinet_pos',
+ field=models.IntegerField(blank=True, max_length=4, null=True, verbose_name='\u673a\u5668\u4f4d\u7f6e'),
+ ),
+ ]
diff --git a/apps/assets/models.py b/apps/assets/models.py
index 66612e7b4..d3a09d5ae 100644
--- a/apps/assets/models.py
+++ b/apps/assets/models.py
@@ -6,7 +6,7 @@ from django.db import models
class AssetGroup(models.Model):
name = models.CharField(max_length=64, unique=True)
- created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者")
+ created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者")
comment = models.CharField(max_length=128, blank=True, null=True)
def __unicode__(self):
@@ -18,15 +18,15 @@ class AssetGroup(models.Model):
class IDC(models.Model):
name = models.CharField(max_length=32, verbose_name=u'机房名称')
- bandwidth = models.CharField(max_length=32, blank=True, null=True, default='', verbose_name=u'机房带宽')
- contact = models.CharField(max_length=16, blank=True, null=True, default='', verbose_name=u'联系人')
- phone = models.CharField(max_length=32, blank=True, null=True, default='', verbose_name=u'联系电话')
- address = models.CharField(max_length=128, blank=True, null=True, default='', verbose_name=u"机房地址")
- network = models.TextField(blank=True, null=True, default='', verbose_name=u"IP地址段")
+ bandwidth = models.CharField(max_length=32, blank=True, verbose_name=u'机房带宽')
+ contact = models.CharField(max_length=16, blank=True, verbose_name=u'联系人')
+ phone = models.CharField(max_length=32, blank=True, verbose_name=u'联系电话')
+ address = models.CharField(max_length=128, blank=True, verbose_name=u"机房地址")
+ network = models.TextField(blank=True, verbose_name=u"IP地址段")
date_added = models.DateField(auto_now=True, null=True)
- operator = models.CharField(max_length=32, blank=True, default='', null=True, verbose_name=u"运营商")
- created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者")
- comment = models.CharField(max_length=128, blank=True, default='', null=True, verbose_name=u"备注")
+ operator = models.CharField(max_length=32, blank=True, verbose_name=u"运营商")
+ created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者")
+ comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注")
def __unicode__(self):
return self.name
@@ -43,31 +43,34 @@ class AssetExtend(models.Model):
class Asset(models.Model):
ip = models.CharField(max_length=32, blank=True, verbose_name="主机IP")
- other_ip = models.CharField(max_length=255, blank=True, null=True, verbose_name="其他IP")
- remote_card_ip = models.CharField(max_length=16, blank=True, null=True, verbose_name=u'远控卡IP')
- hostname = models.CharField(unique=True, max_length=128, verbose_name=u"主机名")
- port = models.IntegerField(blank=True, null=True, verbose_name=u"端口号")
+ other_ip = models.CharField(max_length=255, blank=True, verbose_name="其他IP")
+ remote_card_ip = models.CharField(max_length=16, blank=True, verbose_name=u'远控卡IP')
+ hostname = models.CharField(max_length=128, unique=True, blank=True, verbose_name=u"主机名")
+ port = models.IntegerField(blank=True, verbose_name=u"端口号")
group = models.ManyToManyField(AssetGroup, blank=True, verbose_name=u"所属主机组")
- username = models.CharField(max_length=16, blank=True, null=True, verbose_name=u"管理用户名")
- password = models.CharField(max_length=256, blank=True, null=True, verbose_name=u"密码")
- idc = models.ForeignKey(IDC, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=u'机房')
- mac_addr = models.CharField(max_length=20, blank=True, null=True, verbose_name=u"MAC地址")
- brand = models.CharField(max_length=64, blank=True, null=True, verbose_name=u'硬件厂商型号')
- cpu = models.CharField(max_length=64, blank=True, null=True, verbose_name=u'CPU')
- memory = models.CharField(max_length=128, blank=True, null=True, verbose_name=u'内存')
- disk = models.CharField(max_length=1024, blank=True, null=True, verbose_name=u'硬盘')
- os = models.CharField(max_length=128, blank=True, null=True, verbose_name=u'系统信息')
- cabinet_no = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'机柜号')
- cabinet_pos = models.IntegerField(blank=True, null=True, verbose_name=u'机器位置')
- number = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'资产编号')
- status = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_status_extend", verbose_name="机器状态")
- type = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_type_extend", verbose_name="机器类型")
- env = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_env_extend", verbose_name="所属主机组环境")
- sn = models.CharField(max_length=128, blank=True, null=True, verbose_name=u"SN编号")
- created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者")
+ username = models.CharField(max_length=16, blank=True, verbose_name=u"管理用户名")
+ password = models.CharField(max_length=256, blank=True, verbose_name=u"密码")
+ idc = models.ForeignKey(IDC, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=u'机房')
+ mac_addr = models.CharField(max_length=20, blank=True, unique=True, verbose_name=u"MAC地址")
+ brand = models.CharField(max_length=64, blank=True, verbose_name=u'硬件厂商型号')
+ cpu = models.CharField(max_length=64, blank=True, verbose_name=u'CPU')
+ memory = models.CharField(max_length=128, blank=True, verbose_name=u'内存')
+ disk = models.CharField(max_length=1024, blank=True, verbose_name=u'硬盘')
+ os = models.CharField(max_length=128, blank=True, verbose_name=u'系统信息')
+ cabinet_no = models.CharField(max_length=32, blank=True, verbose_name=u'机柜号')
+ cabinet_pos = models.IntegerField(max_length=4, null=True, blank=True, verbose_name=u'机器位置')
+ number = models.CharField(max_length=32, blank=True, unique=True, verbose_name=u'资产编号')
+ status = models.ManyToManyField(AssetExtend, blank=True,
+ related_name="asset_status_extend", verbose_name="机器状态")
+ type = models.ManyToManyField(AssetExtend, blank=True,
+ related_name="asset_type_extend", verbose_name="机器类型")
+ env = models.ManyToManyField(AssetExtend, blank=True,
+ related_name="asset_env_extend", verbose_name="所属主机组环境")
+ sn = models.CharField(max_length=128, blank=True, unique=True, verbose_name=u"SN编号")
+ created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者")
is_active = models.BooleanField(default=True, verbose_name=u"是否激活")
date_added = models.DateTimeField(auto_now=True, null=True)
- comment = models.CharField(max_length=128, blank=True, null=True, verbose_name=u"备注")
+ comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注")
def __unicode__(self):
return self.ip
diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html
new file mode 100644
index 000000000..5d8a48db9
--- /dev/null
+++ b/apps/assets/templates/assets/asset_detail.html
@@ -0,0 +1,374 @@
+{% extends 'base.html' %}
+{% block content %}
+
+
+
+
+
+
+
主机详细信息
+ 此主机详细信息.
+
+
+
+
+
+
+ 主机名 |
+ {{ asset.hostname|default_if_none:"" }} |
+
+
+ IP |
+ {{ asset.ip|default_if_none:"" }} |
+
+
+ 其他IP |
+
+
+ {% if asset.other_ip %}
+ {% for ip in asset.other_ip %}
+
+ {{ ip }} |
+
+ {% endfor %}
+ {% endif %}
+
+ |
+
+
+ 远控IP |
+ {{ asset.remote_ip|default_if_none:"" }} |
+
+
+ 端口 |
+ {{ asset.port|default_if_none:"" }} |
+
+
+
+ 主机组 |
+
+
+ {% for asset_group in asset.group.all %}
+
+ {{ asset_group.name|default_if_none:"" }} |
+
+ {% endfor %}
+
+ |
+
+
+ 使用默认管理账号 |
+{# {{ asset.use_default_auth|bool2str }} | #}
+{# {{ asset.use_default_auth|bool2str }} {% if not asset.use_default_auth %} {{ asset.username }} {% endif %} | #}
+
+
+ 机房 |
+ {{ asset.idc.name|default_if_none:"" }} |
+
+
+ 硬件厂商型号 |
+ {{ asset.brand|default_if_none:"" }} |
+
+
+ CPU |
+ {{ asset.cpu|default_if_none:"" }} |
+
+
+ 内存 |
+ {{ asset.memory|default_if_none:"" }}{% if asset.memory %}G{% endif %} |
+
+
+ 硬盘 |
+
+
+ {% if asset.disk %}
+ {% for disk, value in asset.disk %}
+
+ {{ disk|default_if_none:"" }}     {{ value|default_if_none:"" }} |
+
+ {% endfor %}
+ {% endif %}
+
+ |
+
+
+ 资产编号 |
+ {{ asset.number|default_if_none:"" }} |
+
+
+ SN |
+ {{ asset.sn|default_if_none:"" }} |
+
+
+ 主机类型 |
+ {{ asset.get_asset_type_display|default_if_none:"" }} |
+
+
+ 系统版本 |
+ {{ asset.system_type|default_if_none:"" }} {{ asset.system_version|default_if_none:"" }} |
+
+
+ 系统平台 |
+ {{ asset.system_arch|default_if_none:"" }} |
+
+
+ 运行环境 |
+ {{ asset.get_env_display|default_if_none:"" }} |
+
+
+ 机器状态 |
+ {{ asset.get_status_display|default_if_none:"" }} |
+
+
+ 机柜号 |
+ {{ asset.cabinet|default_if_none:"" }} |
+
+
+ 机柜位置 |
+ {{ asset.position|default_if_none:"" }} |
+
+
+ 激活 |
+ {{ asset.is_active }} |
+
+
+ 添加日期 |
+ {{ asset.date_added|date:"Y-m-d H:i:s" }} |
+
+
+ 备注 |
+ {{ asset.comment|default_if_none:"" }} |
+
+
+
+
+
+
+
+
+
+
+
+
主机所有授权的信息
+ 包含了此主机所有授权的信息.
+
+
+
+
+ {% if perm_info %}
+ {% if user_perm %}
+
+ 授权用户信息
+ 授权用户 |
+ 关联用户 |
+ {% for perm in user_perm %}
+
+ {{ perm.0 }} |
+
+
+ {% if perm.1 %}
+ {% for role in perm.1 %}
+
+ {{ role }} |
+
+ {% endfor %}
+ {% endif %}
+
+ |
+
+ {% endfor %}
+
+ {% endif %}
+ {% if user_group_perm %}
+
+ 授权用户组信息
+ 授权用户组 |
+ 组详情 |
+ {% for user_group in user_group_perm %}
+
+ {{ user_group }} |
+ 详情 |
+
+ {% endfor %}
+
+ {% endif %}
+
+ {% if user_rule_perm %}
+
+ 授权规则信息
+ 授权规则 |
+ 详情 |
+ {% for rule in user_rule_perm %}
+
+ {{ rule }} |
+ 详情 |
+
+ {% endfor %}
+
+ {% endif %}
+ {% else %}
+
(暂无)
+ {% endif %}
+
+
+
+
+
+
主机修改记录
+ 包含了此主机所有历史修改记录.
+
+
+
+ {% if asset_record %}
+{# {% for r in asset_record %}#}
+{#
#}
+{#
#}
+{#
{{ r.alert_time|naturaltime }}#}
+{#
{{ r.username }}#}
+{# {% for i in r.content|str_to_list %}#}
+{#
{{ i.0 }} 由 {{ i.1|str_to_code }} 改为 {{ i.2|str_to_code }}
#}
+{# {% endfor %}#}
+{#
{{ r.alert_time }}#}
+{#
#}
+{#
#}
+{# {% endfor %}#}
+ {% else %}
+
(暂无)
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
最近一周登录记录
+ 此主机最近一周用户登录信息.
+
+
+ {% if log %}
+ {% for l in log %}
+
+
+
+
+ {{ l.user }}
+
+
+
+
详细信息
+
来源IP: {{ l.remote_ip }}
+
开始: {{ l.start_time |date:"Y-m-d H:i:s" }}
+
结束: {{ l.end_time |date:"Y-m-d H:i:s" }}
+
+
+
+ {% endfor %}
+
+
+
+ {% for l in log_more %}
+
+
+
+
+ {{ l.user }}
+
+
+
+
详细信息
+
来源IP: {{ l.remote_ip }}
+
开始: {{ l.start_time |date:"Y-m-d H:i:s" }}
+
结束: {{ l.end_time |date:"Y-m-d H:i:s" }}
+
+
+
+ {% endfor %}
+ {% else %}
+
(暂无)
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html
index 53288cb83..da5f2156f 100644
--- a/apps/assets/templates/assets/asset_list.html
+++ b/apps/assets/templates/assets/asset_list.html
@@ -119,7 +119,7 @@
|
- {{ asset.hostname|default_if_none:"" }} |
+ {{ asset.hostname|default_if_none:"" }} |
{{ asset.ip|default_if_none:"" }} |
{{ asset.idc.name|default_if_none:"" }} |
{# {{ asset.group.all|group_str2 }} | #}
diff --git a/apps/users/migrations/0004_auto_20160821_1754.py b/apps/users/migrations/0004_auto_20160821_1754.py
new file mode 100644
index 000000000..9c252ca0b
--- /dev/null
+++ b/apps/users/migrations/0004_auto_20160821_1754.py
@@ -0,0 +1,35 @@
+# -*- 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'),
+ ),
+ ]