diff --git a/apps/__init__.py b/apps/__init__.py index 597573362..f93d0bec7 100644 --- a/apps/__init__.py +++ b/apps/__init__.py @@ -1,7 +1,7 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# - - -if __name__ == '__main__': - pass +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# + + +if __name__ == '__main__': + pass diff --git a/apps/assets/api.py b/apps/assets/api.py index e1e1900e8..27539eb09 100644 --- a/apps/assets/api.py +++ b/apps/assets/api.py @@ -22,7 +22,8 @@ class IDCSerializer(serializers.ModelSerializer): class Meta: model = IDC #fields = ('id', 'title', 'code', 'linenos', 'language', 'style') - + + class AssetGroupViewSet(viewsets.ModelViewSet): """ API endpoint that allows AssetGroup to be viewed or edited. @@ -30,6 +31,7 @@ class AssetGroupViewSet(viewsets.ModelViewSet): queryset = AssetGroup.objects.all() serializer_class = AssetGroupSerializer + class AssetViewSet(viewsets.ModelViewSet): """ API endpoint that allows Asset to be viewed or edited. @@ -37,6 +39,7 @@ class AssetViewSet(viewsets.ModelViewSet): queryset = Asset.objects.all() serializer_class = AssetSerializer + class IDCViewSet(viewsets.ModelViewSet): """ API endpoint that allows IDC to be viewed or edited. diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 0c6ac66e4..90283c37a 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -2,6 +2,7 @@ from django import forms from .models import IDC, Asset, AssetGroup +from django.utils.translation import gettext_lazy as _ class AssetForm(forms.ModelForm): @@ -10,11 +11,15 @@ class AssetForm(forms.ModelForm): model = Asset fields = [ - "ip", "other_ip", "hostname", "port", "group", "username", "password", "idc", "mac_addr", - "remote_card_ip", "brand", "cpu", "memory", "disk", "os", "cabinet_no", "cabinet_pos", + "ip", "other_ip", "remote_card_ip", "hostname", "port", "groups", "username", "password", + "idc", "mac_addr", "brand", "cpu", "memory", "disk", "os", "cabinet_no", "cabinet_pos", "number", "status", "type", "env", "sn", "is_active", "comment" ] + widgets = { + 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join assetgroups')}), + } + class AssetGroupForm(forms.ModelForm): class Meta: diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py new file mode 100644 index 000000000..dc20ec9f1 --- /dev/null +++ b/apps/assets/migrations/0001_initial.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-09-03 14:30 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Asset', + 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='\u8d44\u4ea7IP')), + ('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')), + ('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, null=True, verbose_name='\u8d44\u4ea7\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, verbose_name='\u5907\u6ce8')), + ], + options={ + 'db_table': 'asset', + }, + ), + migrations.CreateModel( + name='AssetExtend', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='AssetGroup', + 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, verbose_name='\u521b\u5efa\u8005')), + ('comment', models.CharField(blank=True, max_length=128, null=True)), + ], + options={ + 'db_table': 'assetgroup', + }, + ), + migrations.CreateModel( + name='IDC', + 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, 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, 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', + 'verbose_name': 'IDC\u673a\u623f', + 'verbose_name_plural': 'IDC\u673a\u623f', + }, + ), + migrations.AddField( + model_name='asset', + name='env', + field=models.ManyToManyField(blank=True, related_name='asset_env_extend', to='assets.AssetExtend', verbose_name='\u6240\u5c5e\u4e3b\u673a\u7ec4\u73af\u5883'), + ), + migrations.AddField( + model_name='asset', + name='group', + field=models.ManyToManyField(blank=True, to='assets.AssetGroup', verbose_name='\u6240\u5c5e\u4e3b\u673a\u7ec4'), + ), + migrations.AddField( + model_name='asset', + name='idc', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.IDC', verbose_name='\u673a\u623f'), + ), + migrations.AddField( + model_name='asset', + name='status', + field=models.ManyToManyField(blank=True, related_name='asset_status_extend', to='assets.AssetExtend', verbose_name='\u8d44\u4ea7\u72b6\u6001'), + ), + migrations.AddField( + model_name='asset', + name='type', + field=models.ManyToManyField(blank=True, related_name='asset_type_extend', to='assets.AssetExtend', verbose_name='\u8d44\u4ea7\u7c7b\u578b'), + ), + ] 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..5098e052c 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -1,13 +1,14 @@ # coding:utf-8 -from __future__ import unicode_literals +from __future__ import unicode_literals, absolute_import from django.db import models +from django.utils.translation import ugettext_lazy as _ 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"创建者") - comment = models.CharField(max_length=128, blank=True, null=True) + name = models.CharField(max_length=64, unique=True, null=True, blank=True, verbose_name=_('Name')) + created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) + comment = models.TextField(blank=True, verbose_name=_('Comment')) def __unicode__(self): return self.name @@ -17,71 +18,137 @@ 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地址段") - 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"备注") + name = models.CharField(max_length=32, verbose_name=_('Name')) + bandwidth = models.CharField(max_length=32, blank=True, verbose_name=_('Bandwidth')) + contact = models.CharField(max_length=16, blank=True, verbose_name=_('Contact')) + phone = models.CharField(max_length=32, blank=True, verbose_name=_('Phone')) + address = models.CharField(max_length=128, blank=True, verbose_name=_("Address")) + network = models.TextField(blank=True, verbose_name=_('Network')) + date_added = models.DateField(auto_now=True, null=True, verbose_name=_('Date added')) + operator = models.CharField(max_length=32, blank=True, verbose_name=_('Operator')) + created_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by')) + comment = models.TextField(blank=True, verbose_name=_('Comment')) def __unicode__(self): return self.name class Meta: db_table = 'idc' - verbose_name = u"IDC机房" - verbose_name_plural = verbose_name class AssetExtend(models.Model): - pass + key = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('KEY')) + value = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('VALUE')) + 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.TextField(blank=True, verbose_name=_('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=_('Name')) + username = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('Username')) + password = models.CharField(max_length=256, null=True, blank=True, verbose_name=_('Password')) + private_key = models.CharField(max_length=4096, null=True, blank=True, verbose_name=_('SSH private key')) + is_default = models.BooleanField(default=True, verbose_name=_('As default')) + auto_update = models.BooleanField(default=True, verbose_name=_('Auto update pass/key')) + date_added = models.DateTimeField(auto_now=True, null=True, blank=True) + create_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) + comment = models.TextField(blank=True, verbose_name=_('Comment')) + + def __unicode__(self): + return self.name + + class Meta: + db_table = 'adminuser' + + +class SysUser(models.Model): + PROTOCOL_CHOICES = ( + ('ssh', 'ssh'), + ('telnet', 'telnet'), + ) + name = models.CharField(max_length=128, unique=True, verbose_name=_('Name')) + username = models.CharField(max_length=16, blank=True, verbose_name=_('Username')) + password = models.CharField(max_length=256, blank=True, verbose_name=_('Password')) + protocol = models.CharField(max_length=16, default='ssh', verbose_name=_('Protocol')) + private_key = models.CharField(max_length=4096, blank=True, verbose_name=_('SSH private key')) + public_key = models.CharField(max_length=4096, blank=True, verbose_name=_('SSH public key')) + is_default = models.BooleanField(default=True, verbose_name=_('As default')) + auto_push = models.BooleanField(default=True, verbose_name=_('Auto push')) + auto_update = models.BooleanField(default=True, verbose_name=_('Auto update pass/key')) + sudo = models.TextField(max_length=4096, blank=True, verbose_name=_('Sudo')) + shell = models.CharField(max_length=64, blank=True, verbose_name=_('Shell')) + home = models.CharField(max_length=64, blank=True, verbose_name=_('Home')) + uid = models.IntegerField(blank=True, verbose_name=_('Uid')) + date_added = models.DateTimeField(auto_now=True, null=True) + create_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by')) + comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment')) + + def __unicode__(self): + return self.name + + class Meta: + db_table = 'sysuser' 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"端口号") - 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"创建者") - 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"备注") + ip = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('IP')) + other_ip = models.CharField(max_length=255, null=True, blank=True, verbose_name=_('Other 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, null=True, blank=True, verbose_name=_('Hostname')) + port = models.IntegerField(null=True, blank=True, verbose_name=_('Port')) + groups = models.ManyToManyField(AssetGroup, null=True, blank=True, verbose_name=_('Asset groups')) + username = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('Admin user')) + password = models.CharField(max_length=256, null=True, blank=True, verbose_name=_("Admin password")) + admin_user = models.ForeignKey(AdminUser, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_("Admin User")) + sys_user = models.ManyToManyField(SysUser, null=True, blank=True, verbose_name=_("Sys User")) + idc = models.ForeignKey(IDC, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('IDC')) + mac_addr = models.CharField(max_length=20, null=True, blank=True, verbose_name=_("Mac address")) + brand = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('Brand')) + cpu = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('CPU')) + memory = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Memory')) + 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')) + number = models.CharField(max_length=32, null=True, blank=True, unique=True, verbose_name=_('Asset number')) + status = models.ManyToManyField(AssetExtend, related_name="asset_status_extend", verbose_name=_('Asset status')) + type = models.ManyToManyField(AssetExtend, related_name="asset_type_extend", verbose_name=_('Asset type')) + env = models.ManyToManyField(AssetExtend, related_name="asset_env_extend", verbose_name=_('Asset environment')) + sn = models.CharField(max_length=128, null=True, blank=True, unique=True, verbose_name=_('Serial number')) + 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')) + date_added = models.DateTimeField(auto_now=True, null=True, blank=True, verbose_name=_('Date added')) + comment = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Comment')) def __unicode__(self): return self.ip + def initial(self): + pass + class Meta: db_table = 'asset' + index_together = ('ip', 'port') +class Label(models.Model): + key = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('KEY')) + value = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('VALUE')) + asset = models.ForeignKey(Asset, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('Asset')) + created_by = models.CharField(max_length=32, blank=True, verbose_name=_("Created by")) + date_added = models.DateTimeField(auto_now=True, null=True) + comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment')) + def __unicode__(self): + return self.name - - - - - - + class Meta: + db_table = 'label' diff --git a/apps/assets/templates/assets/asset_add.html b/apps/assets/templates/assets/asset_add.html index f42a06c9f..5a265253d 100644 --- a/apps/assets/templates/assets/asset_add.html +++ b/apps/assets/templates/assets/asset_add.html @@ -1,12 +1,17 @@ {% extends 'base.html' %} +{% load static %} {% load bootstrap %} +{% block custom_head_css_js %} + + +{% endblock %} {% block content %}