diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 90283c37a..1338a7449 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -6,7 +6,6 @@ from django.utils.translation import gettext_lazy as _ class AssetForm(forms.ModelForm): - class Meta: model = Asset @@ -22,6 +21,25 @@ class AssetForm(forms.ModelForm): class AssetGroupForm(forms.ModelForm): + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) + + def __init__(self, *args, **kwargs): + if kwargs.get('instance'): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].assets.all() + super(AssetGroupForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + super(AssetGroupForm, self)._save_m2m() + assets = self.cleaned_data['assets'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + class Meta: model = AssetGroup fields = [ diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py new file mode 100644 index 000000000..37308e5b0 --- /dev/null +++ b/apps/assets/migrations/0001_initial.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-09-04 11:52 +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='AdminUser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), + ('username', models.CharField(max_length=16, verbose_name='Username')), + ('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='Password')), + ('private_key', models.CharField(blank=True, max_length=4096, null=True, verbose_name='SSH private key')), + ('is_default', models.BooleanField(default=False, 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, verbose_name='Date added')), + ('create_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), + ('comment', models.TextField(blank=True, verbose_name='Comment')), + ], + options={ + 'db_table': 'adminuser', + }, + ), + migrations.CreateModel( + name='Asset', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ip', models.CharField(max_length=32, verbose_name='IP')), + ('other_ip', models.CharField(blank=True, max_length=255, verbose_name='Other IP')), + ('remote_card_ip', models.CharField(blank=True, max_length=16, verbose_name='Remote card IP')), + ('hostname', models.CharField(blank=True, max_length=128, unique=True, verbose_name='Hostname')), + ('port', models.IntegerField(default=22, verbose_name='Port')), + ('username', models.CharField(blank=True, max_length=16, verbose_name='Admin user')), + ('password', models.CharField(blank=True, max_length=256, verbose_name='Admin password')), + ('mac_addr', models.CharField(blank=True, max_length=20, verbose_name='Mac address')), + ('brand', models.CharField(blank=True, max_length=64, verbose_name='Brand')), + ('cpu', models.CharField(blank=True, max_length=64, verbose_name='CPU')), + ('memory', models.CharField(blank=True, max_length=128, verbose_name='Memory')), + ('disk', models.CharField(blank=True, max_length=1024, verbose_name='Disk')), + ('os', models.CharField(blank=True, max_length=128, verbose_name='OS')), + ('cabinet_no', models.CharField(blank=True, max_length=32, verbose_name='Cabinet number')), + ('cabinet_pos', models.IntegerField(blank=True, verbose_name='Cabinet position')), + ('number', models.CharField(blank=True, max_length=32, unique=True, verbose_name='Asset number')), + ('sn', models.CharField(blank=True, max_length=128, unique=True, verbose_name='Serial number')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('is_active', models.BooleanField(default=True, verbose_name='Is active')), + ('date_added', models.DateTimeField(auto_now=True, null=True, verbose_name='Date added')), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='Comment')), + ('admin_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.AdminUser', verbose_name='Admin User')), + ], + options={ + 'db_table': 'asset', + }, + ), + migrations.CreateModel( + name='AssetExtend', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=64, verbose_name='KEY')), + ('value', models.CharField(max_length=64, verbose_name='VALUE')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('date_added', models.DateTimeField(auto_now=True, null=True, verbose_name='Date added')), + ('comment', models.TextField(blank=True, verbose_name='Comment')), + ], + options={ + 'db_table': 'assetextend', + }, + ), + 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, verbose_name='Name')), + ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), + ('comment', models.TextField(blank=True, null=True, verbose_name='Comment')), + ], + 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='Name')), + ('bandwidth', models.CharField(blank=True, max_length=32, verbose_name='Bandwidth')), + ('contact', models.CharField(blank=True, max_length=16, verbose_name='Contact')), + ('phone', models.CharField(blank=True, max_length=32, verbose_name='Phone')), + ('address', models.CharField(blank=True, max_length=128, 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(blank=True, max_length=32, verbose_name='Operator')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('comment', models.TextField(blank=True, verbose_name='Comment')), + ], + options={ + 'db_table': 'idc', + }, + ), + migrations.CreateModel( + name='Label', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=64, verbose_name='KEY')), + ('value', models.CharField(max_length=64, verbose_name='VALUE')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('date_added', models.DateTimeField(auto_now=True, null=True, verbose_name='Date added')), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='Comment')), + ('asset', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.Asset', verbose_name='Asset')), + ], + options={ + 'db_table': 'label', + }, + ), + migrations.CreateModel( + name='SysUser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, verbose_name='Name')), + ('username', models.CharField(max_length=16, verbose_name='Username')), + ('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='Password')), + ('protocol', models.CharField(default='ssh', max_length=16, verbose_name='Protocol')), + ('private_key', models.CharField(blank=True, max_length=4096, verbose_name='SSH private key')), + ('public_key', models.CharField(blank=True, max_length=4096, verbose_name='SSH public key')), + ('is_default', models.BooleanField(default=False, 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(blank=True, max_length=4096, verbose_name='Sudo')), + ('shell', models.CharField(blank=True, max_length=64, verbose_name='Shell')), + ('home', models.CharField(blank=True, max_length=64, verbose_name='Home')), + ('uid', models.IntegerField(blank=True, verbose_name='Uid')), + ('date_added', models.DateTimeField(auto_now=True, null=True, verbose_name='Date added')), + ('create_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='Comment')), + ], + options={ + 'db_table': 'sysuser', + }, + ), + migrations.AddField( + model_name='asset', + name='env', + field=models.ManyToManyField(related_name='asset_env_extend', to='assets.AssetExtend', verbose_name='Asset environment'), + ), + migrations.AddField( + model_name='asset', + name='groups', + field=models.ManyToManyField(to='assets.AssetGroup', verbose_name='Asset groups'), + ), + 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='IDC'), + ), + migrations.AddField( + model_name='asset', + name='status', + field=models.ManyToManyField(related_name='asset_status_extend', to='assets.AssetExtend', verbose_name='Asset status'), + ), + migrations.AddField( + model_name='asset', + name='sys_user', + field=models.ManyToManyField(to='assets.SysUser', verbose_name='Sys User'), + ), + migrations.AddField( + model_name='asset', + name='type', + field=models.ManyToManyField(related_name='asset_type_extend', to='assets.AssetExtend', verbose_name='Asset type'), + ), + ] diff --git a/apps/assets/models.py b/apps/assets/models.py index 5c69d0a53..36ca9bffd 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -14,7 +14,7 @@ class AssetGroup(models.Model): return self.name class Meta: - db_table = 'assetgroup' + db_table = 'asset_group' class IDC(models.Model): @@ -128,10 +128,14 @@ class Asset(models.Model): comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment')) def __unicode__(self): - return self.ip + return '%(ip)s:%(port)d' % {'ip': self.ip, 'port': self.port} + + def initial(self): + pass class Meta: db_table = 'asset' + index_together = ('ip', 'port') class Label(models.Model): diff --git a/apps/assets/templates/assets/asset_add.html b/apps/assets/templates/assets/asset_create.html similarity index 84% rename from apps/assets/templates/assets/asset_add.html rename to apps/assets/templates/assets/asset_create.html index 0b3fad140..ccbc25372 100644 --- a/apps/assets/templates/assets/asset_add.html +++ b/apps/assets/templates/assets/asset_create.html @@ -40,24 +40,9 @@ {{ form.port|bootstrap_horizontal }} -{#