diff --git a/apps/assets/forms.py b/apps/assets/forms.py index dec1b0876..8b5262714 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -1,7 +1,7 @@ # coding:utf-8 from django import forms -from .models import IDC, Asset, AssetGroup +from .models import IDC, Asset, AssetGroup, AdminUser, SystemUser from django.utils.translation import gettext_lazy as _ @@ -11,7 +11,7 @@ class AssetForm(forms.ModelForm): fields = [ "ip", "other_ip", "remote_card_ip", "hostname", "port", "groups", "username", "password", - "idc", "mac_addr", "brand", "cpu", "memory", "disk", "os", "cabinet_no", "cabinet_pos", + "idc", "mac_address", "brand", "cpu", "memory", "disk", "os", "cabinet_no", "cabinet_pos", "number", "status", "type", "env", "sn", "is_active", "comment" ] @@ -78,3 +78,54 @@ class IDCForm(forms.ModelForm): 'network': forms.Textarea( attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'}) } + + +class AdminUserForm(forms.ModelForm): + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) + password = forms.CharField(widget=forms.PasswordInput, max_length=100, min_length=8, strip=True, + help_text=_('If also set private key, use that first'), required=False) + private_key_file = forms.FileField(required=False) + + def __init__(self, *args, **kwargs): + if kwargs.get('instance'): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].assets.all() + super(AdminUserForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + super(AdminUserForm, self)._save_m2m() + assets = self.cleaned_data['assets'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + + def save(self, commit=True): + admin_user = super(AdminUserForm, self).save(commit=commit) + password = self.cleaned_data['password'] + private_key_file = self.cleaned_data['private_key_file'] + + if password: + admin_user.password = password + print(password) + if private_key_file: + print(private_key_file) + admin_user.private_key = private_key_file.read() + admin_user.save() + return self.instance + + class Meta: + model = AdminUser + fields = ['name', 'username', 'password', 'private_key_file', 'as_default', 'comment'] + widgets = { + 'name': forms.TextInput(attrs={'placeholder': _('Name')}), + 'username': forms.TextInput(attrs={'placeholder': _('Username')}), + } + help_texts = { + 'name': '* required', + 'username': '* required', + } + diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py index 94a2908dd..a63d3d984 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-09-07 15:11 +# Generated by Django 1.10 on 2016-09-08 03:02 from __future__ import unicode_literals from django.db import migrations, models @@ -18,15 +18,15 @@ class Migration(migrations.Migration): name='AdminUser', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=128, null=True, unique=True, verbose_name='Name')), - ('username', models.CharField(blank=True, max_length=16, null=True, 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=True, verbose_name='As default')), - ('auto_update', models.BooleanField(default=True, verbose_name='Auto update pass/key')), - ('date_created', models.DateTimeField(auto_now=True, null=True)), - ('create_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), + ('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, verbose_name='Password')), + ('_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')), + ('as_default', models.BooleanField(default=False, verbose_name='As default')), ('comment', models.TextField(blank=True, verbose_name='Comment')), + ('date_created', models.DateTimeField(auto_now=True, null=True)), + ('created_by', models.CharField(max_length=32, null=True, verbose_name='Created by')), ], options={ 'db_table': 'admin_user', @@ -142,7 +142,7 @@ class Migration(migrations.Migration): ('home', models.CharField(blank=True, max_length=64, verbose_name='Home')), ('uid', models.IntegerField(blank=True, verbose_name='Uid')), ('date_created', models.DateTimeField(auto_now=True, null=True)), - ('create_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), ('comment', models.CharField(blank=True, max_length=128, verbose_name='Comment')), ], options={ diff --git a/apps/assets/models.py b/apps/assets/models.py index f968f05b0..213a49822 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -68,15 +68,15 @@ class AssetExtend(models.Model): 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')) - _public_key = models.CharField(max_length=4096, null=True, blank=True, verbose_name=_('SSH public key')) - as_default = models.BooleanField(default=True, verbose_name=_('As default')) + name = models.CharField(max_length=128, unique=True, verbose_name=_('Name')) + username = models.CharField(max_length=16, verbose_name=_('Username')) + _password = models.CharField(max_length=256, blank=True, verbose_name=_('Password')) + _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')) + as_default = models.BooleanField(default=False, verbose_name=_('As default')) comment = models.TextField(blank=True, verbose_name=_('Comment')) - date_created = models.DateTimeField(auto_now=True, null=True, blank=True) - created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) + date_created = models.DateTimeField(auto_now=True, null=True) + created_by = models.CharField(max_length=32, null=True, verbose_name=_('Created by')) def __unicode__(self): return self.name @@ -110,7 +110,7 @@ class AdminUser(models.Model): @classmethod def generate_fake(cls, count=100): - from random import seed, choice + from random import seed import forgery_py from django.db import IntegrityError @@ -204,10 +204,11 @@ class Asset(models.Model): groups = models.ManyToManyField(AssetGroup, related_name='assets', 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, on_delete=models.SET_NULL, verbose_name=_("Admin user")) + admin_user = models.ForeignKey(AdminUser, null=True, related_name='assets', + on_delete=models.SET_NULL, verbose_name=_("Admin user")) system_user = models.ManyToManyField(SystemUser, blank=True, verbose_name=_("System User")) idc = models.ForeignKey(IDC, null=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_('IDC')) - mac_addr = models.CharField(max_length=20, null=True, blank=True, verbose_name=_("Mac address")) + mac_address = 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')) diff --git a/apps/assets/templates/assets/admin_user_create_update.html b/apps/assets/templates/assets/admin_user_create_update.html new file mode 100644 index 000000000..b340b7c3a --- /dev/null +++ b/apps/assets/templates/assets/admin_user_create_update.html @@ -0,0 +1,64 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} +{% load bootstrap %} +{% block custom_head_css_js %} + + +{% endblock %} + +{% block content %} +
+
+
+
+
+
{% trans 'Create asset group' %}
+ +
+
+
+ {% csrf_token %} + {{ form.name|bootstrap_horizontal }} + {{ form.username|bootstrap_horizontal }} + {{ form.password|bootstrap_horizontal }} + {{ form.private_key_file|bootstrap_horizontal }} +
+ +
+ {{ form.as_default}} +
+
+ {{ form.assets|bootstrap_horizontal }} + {{ form.comment|bootstrap_horizontal }} + +
+
+ + +
+
+
+
+
+
+
+
+{% endblock %} +{% block custom_foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/admin_user_detail.html b/apps/assets/templates/assets/admin_user_detail.html new file mode 100644 index 000000000..12a108f6c --- /dev/null +++ b/apps/assets/templates/assets/admin_user_detail.html @@ -0,0 +1,220 @@ +{% extends 'base.html' %} +{% load common_tags %} +{% load users_tags %} +{% load static %} +{% load i18n %} + +{% block custom_head_css_js %} + + +{% endblock %} +{% block content %} +
+
+
+
+ +
+
+
+
+ {{ admin_user.name }} +
+ + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
{% trans 'Name' %}:{{ admin_user.name }}
{% trans 'Username' %}:{{ admin_user.username }}
{% trans 'Date created' %}:{{ admin_user.date_created }}
{% trans 'Created by' %}:{{ asset_group.created_by }}
{% trans 'Comment' %}:{{ admin_user.comment }}
+
+
+ +
+
+ {% trans 'Asset list of ' %} {{ admin_user.name }} +
+ + + + + + + + + + +
+
+
+ + + + + + + + + + + {% for asset in page_obj %} + + + + + + + {% endfor %} + +
{% trans 'Hostname' %}{% trans 'IP' %}{% trans 'Port' %}{% trans 'Alive' %}
{{ asset.hostname }}{{ asset.ip }}{{ asset.port }}Alive
+
+ {% include '_pagination.html' %} +
+
+
+
+
+
+
+ {% trans 'Quick update' %} +
+
+ + + + + + + + + + + + + + + + + +
{% trans 'Get install script' %}: + + + +
{% trans 'Retest asset connectivity' %}: + + + +
{% trans 'Reset private key' %}: + + + +
+
+
+ +
+
+ {% trans 'Replace asset admin user with this' %} +
+
+ + + + + + + + + + + +
+ +
+ +
+
+
+
+
+
+
+
+
+ + +{% endblock %} +{% block custom_foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/admin_user_list.html b/apps/assets/templates/assets/admin_user_list.html index d7aae75aa..eeb4587bd 100644 --- a/apps/assets/templates/assets/admin_user_list.html +++ b/apps/assets/templates/assets/admin_user_list.html @@ -20,7 +20,7 @@ {{ admin_user.id }} - + {{ admin_user.name }} diff --git a/apps/assets/templates/assets/asset_group_detail.html b/apps/assets/templates/assets/asset_group_detail.html index 08272a04f..4c48867b9 100644 --- a/apps/assets/templates/assets/asset_group_detail.html +++ b/apps/assets/templates/assets/asset_group_detail.html @@ -69,7 +69,7 @@
- {% trans 'Asset list of ' %} {{ asset_group.name }} + {% trans 'Asset list of ' %} {{ asset_group.name }}
@@ -118,7 +118,7 @@
- {% trans 'Associate asset user(system/admin)' %} + {% trans 'Associate system user' %}
@@ -207,23 +207,23 @@ {% endblock %} {% block custom_foot_js %}