diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 101ad854b..9af1896ae 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -12,11 +12,13 @@ class AssetForm(forms.ModelForm): fields = [ "ip", "other_ip", "remote_card_ip", "hostname", "port", "groups", "username", "password", "idc", "mac_address", "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", "admin_user", "system_user" ] widgets = { - 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Select asset groups')}), + 'groups': forms.SelectMultiple(attrs={'class': 'select2-groups', 'data-placeholder': _('Select asset groups')}), + 'system_user': forms.SelectMultiple(attrs={'class': 'select2-system-user', 'data-placeholder': _('Select asset system user')}), + # 'admin_user': forms.SelectMultiple(attrs={'class': 'select2-admin-user', 'data-placeholder': _('Select asset admin user')}), } diff --git a/apps/assets/models.py b/apps/assets/models.py index 010b8b20e..52c11fb8c 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -7,18 +7,6 @@ from django.utils.translation import ugettext_lazy as _ from common.utils import encrypt, decrypt - -class AssetGroup(models.Model): - name = models.CharField(max_length=64, unique=True, verbose_name=_('Name')) - created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) - comment = models.TextField(null=True, blank=True, verbose_name=_('Comment')) - - def __unicode__(self): - return self.name - - class Meta: - db_table = 'asset_group' - logger = logging.getLogger(__name__) @@ -66,8 +54,8 @@ class IDC(models.Model): class AssetExtend(models.Model): - key = models.CharField(max_length=64, verbose_name=_('KEY')) - value = models.CharField(max_length=64, verbose_name=_('VALUE')) + 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_created = models.DateTimeField(auto_now=True, null=True, blank=True) comment = models.TextField(blank=True, verbose_name=_('Comment')) @@ -272,14 +260,14 @@ class Asset(models.Model): 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, related_name='assets', verbose_name=_('Asset groups')) + port = models.IntegerField(default=22, null=True, blank=True, verbose_name=_('Port')) + groups = models.ManyToManyField(AssetGroup, blank=True, 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, related_name='assets', + admin_user = models.ForeignKey(AdminUser, null=True, blank=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_("Admin user")) system_user = models.ManyToManyField(SystemUser, blank=True, related_name='assets', verbose_name=_("System User")) - idc = models.ForeignKey(IDC, null=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_('IDC')) + idc = models.ForeignKey(IDC, null=True, blank=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_('IDC')) 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')) @@ -288,15 +276,15 @@ class Asset(models.Model): 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, blank=True, verbose_name=_('Asset number')) - status = models.ForeignKey(AssetExtend, null=True, blank=True, - related_name="asset_status_extend", verbose_name=_('Asset status')) - type = models.ForeignKey(AssetExtend, null=True, blank=True, - related_name="asset_type_extend", verbose_name=_('Asset type')) - env = models.ForeignKey(AssetExtend, null=True, blank=True, - related_name="asset_env_extend", verbose_name=_('Asset environment')) - sn = models.CharField(max_length=128, blank=True, verbose_name=_('Serial number')) - created_by = models.CharField(max_length=32, blank=True, verbose_name=_('Created by')) + number = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Asset number')) + status = models.ForeignKey(AssetExtend, null=True, blank=True, related_name="asset_status_extend", + verbose_name=_('Asset status')) + type = models.ForeignKey(AssetExtend, null=True, blank=True, related_name="asset_type_extend", + verbose_name=_('Asset type')) + env = models.ForeignKey(AssetExtend, null=True, blank=True, related_name="asset_env_extend", + verbose_name=_('Asset environment')) + sn = models.CharField(max_length=128, null=True, blank=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_created = 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')) @@ -332,15 +320,15 @@ class Asset(models.Model): class Label(models.Model): - key = models.CharField(max_length=64, verbose_name=_('KEY')) - value = models.CharField(max_length=64, verbose_name=_('VALUE')) + 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_created = models.DateTimeField(auto_now=True, null=True) comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment')) def __unicode__(self): - return self.name + return self.key class Meta: db_table = 'label' @@ -348,4 +336,4 @@ class Label(models.Model): def generate_fake(): for cls in (Asset, AssetGroup, IDC): - cls.generate_fake() + cls.generate_fake() \ No newline at end of file diff --git a/apps/assets/templates/assets/asset_create.html b/apps/assets/templates/assets/asset_create.html index ccbc25372..f47cfb880 100644 --- a/apps/assets/templates/assets/asset_create.html +++ b/apps/assets/templates/assets/asset_create.html @@ -27,67 +27,68 @@
-
-
-
-
- {% csrf_token %} -

基本信息

+
+ + {% csrf_token %} +

基本信息

- {{ form.hostname|bootstrap_horizontal }} + {{ form.hostname|bootstrap_horizontal }} - {{ form.ip|bootstrap_horizontal }} + {{ form.ip|bootstrap_horizontal }} - {{ form.port|bootstrap_horizontal }} + {{ form.port|bootstrap_horizontal }} - {{ form.type|bootstrap_horizontal }} + {{ form.type|bootstrap_horizontal }} - {{ form.comment|bootstrap_horizontal }} -
-

关联资产用户

-
- -
-
- - -
-
+ {{ form.comment|bootstrap_horizontal }} + +
+

关联资产用户

+
+ +
+
+ +
- -
-
- -
-
-

Tips: 管理用户是服务器存在的root或拥有sudo的用户,用来推送系统用户

- -
- -
- -
-
- -
-

所属

- {{ form.idc|bootstrap_horizontal }} - - {{ form.groups|bootstrap_horizontal }} - -
-

标签

- -
-
-
- - -
-
- +
-
+ + {{ form.admin_user|bootstrap_horizontal }} +

Tips: 管理用户是服务器存在的root或拥有sudo的用户,用来推送系统用户

+ +
+ {{ form.system_user|bootstrap_horizontal }} + +
+

所属

+ {{ form.idc|bootstrap_horizontal }} + + {{ form.groups|bootstrap_horizontal }} + +
+

标签

+
+ +
+ +
+
+ +
+
+
+ 添加 +
+ +
+
+
+ + +
+
+
@@ -100,7 +101,9 @@ {% block custom_foot_js %} {% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html index 51be7b1db..16ce7e32c 100644 --- a/apps/assets/templates/assets/asset_detail.html +++ b/apps/assets/templates/assets/asset_detail.html @@ -1,374 +1,247 @@ {% extends 'base.html' %} +{% load common_tags %} +{% load static %} +{% load i18n %} + +{% block custom_head_css_js %} + + + + +{% endblock %} {% block content %}
-
+
-
- {{ asset.ip }} - + -
-

主机详细信息

- 此主机详细信息. -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -{# #} -{# #} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
主机名{{ asset.hostname|default_if_none:"" }}
IP{{ asset.ip|default_if_none:"" }}
其他IP - - {% if asset.other_ip %} - {% for ip in asset.other_ip %} - - - - {% endfor %} - {% endif %} -
{{ ip }}
-
远控IP{{ asset.remote_ip|default_if_none:"" }}
端口{{ asset.port|default_if_none:"" }}
主机组 - - {% for asset_group in asset.group.all %} - - - - {% endfor %} -
{{ asset_group.name|default_if_none:"" }}
-
使用默认管理账号{{ 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 %} - - - - {% endfor %} - {% endif %} -
{{ disk|default_if_none:"" }}     {{ value|default_if_none:"" }}
-
资产编号{{ 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_created|date:"Y-m-d H:i:s" }}
备注{{ asset.comment|default_if_none:"" }}
+
+
+
+
+ {{ asset.hostname }} +
+ + + + + + + + + + +
+
+
+ + + +{# #} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for label in asset.label_set.all %} + + {% endfor %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#} +{# #} +{#
{% trans 'Hostname' %}:{{ asset.hostname }}
{% trans 'IP' %}:{{ asset.ip }}
{% trans 'Other IP' %}:{{ asset.other_ip }}
{% trans 'Remote card IP' %}:{{ asset.remote_card_ip }}
{% trans 'Port' %}:{{ asset.port }}
{% trans 'Mac address' %}:{{ asset.mac_addr }}
{% trans 'CPU' %}:{{ asset.cpu }}
{% trans 'Memory' %}:{{ asset.memory }}
{% trans 'Disk' %}:{{ asset.disk }}
{% trans 'Label' %}:{{ label.key }} - {{ label.value }}
{% trans 'OS' %}:{{ asset.os }}
{% trans 'Mac address' %}:{{ asset.mac_addr }}
{% trans 'Asset status' %}:{{ asset.status }}
{% trans 'Is active' %}:{{ asset.is_active }}
{% trans 'Asset type' %}:{{ asset.type }}
{% trans 'Asset environment' %}:{{ asset.env }}
{% trans 'Serial number' %}:{{ asset.sn }}
{% trans 'Asset number' %}:{{ asset.number }}
{% trans 'Created by' %}:{{ asset.created_by }}
{% trans 'Date joined' %}:{{ asset.date_joined|date:"Y-m-j H:i:s" }}
{% trans 'Comment' %}:{{ asset.comment }}
+
-
-
-
-
-
-
-
拥有权限的用户
-
- - - - - - - - - - -
-
-
-

主机所有授权的信息

- 包含了此主机所有授权的信息. -
-
-
-
- {% if perm_info %} - {% if user_perm %} - -

授权用户信息

- - - {% for perm in user_perm %} +
+
+
+ {% trans 'Quick modify' %} +
+
+
授权用户关联用户
+ + + + + + + + + + + + + + + + + + +
{% trans 'Active' %}: +
+
+ + +
+
+
{% trans 'Enable OTP' %}: +
+
+ + +
+
+
{% trans 'Reset password' %}: + + + +
{% trans 'Reset ssh key' %}: + + + +
+
+
+ +
+
+ {% trans 'Asset group' %} +
+
+ + + - - - {% endfor %} -
{{ perm.0 }} - - {% if perm.1 %} - {% for role in perm.1 %} - - - - {% endfor %} - {% endif %} -
{{ role }}
+
+
- {% endif %} - {% if user_group_perm %} - -

授权用户组信息

- - - {% for user_group in user_group_perm %} - - - - - {% endfor %} -
授权用户组组详情
{{ user_group }}详情
- {% endif %} + + + + + + - {% if user_rule_perm %} - -

授权规则信息

- - - {% for rule in user_rule_perm %} - - - - - {% endfor %} -
授权规则详情
{{ rule }}详情
- {% endif %} - {% else %} -

(暂无)

- {% endif %} + {% for group in asset.groups.all %} + + {{ group.name }} + + + + + {% endfor %} + + +
-
-
主机修改记录
-{#     点击修改#} -
- - - - - - - - - - -
-
-
-

主机修改记录

- 包含了此主机所有历史修改记录. -
-
-
- {% 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 %} - -
-
- +{% endblock %} +{% block custom_foot_js %} - - -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index 4895f454c..ca3feca9b 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -117,7 +117,7 @@ - {{ asset.hostname }} + {{ asset.hostname }} {{ asset.ip }} {{ asset.system_type }} {{ asset.cpu }} | {{ asset.memory }} | {{ asset.disk }} diff --git a/apps/assets/views.py b/apps/assets/views.py index 797366408..ec953f028 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -10,22 +10,31 @@ from django.urls import reverse_lazy from django.contrib.messages.views import SuccessMessageMixin from django.views.generic.detail import DetailView, SingleObjectMixin -from .models import Asset, AssetGroup, IDC, AssetExtend, AdminUser, SystemUser +from .models import Asset, AssetGroup, IDC, AssetExtend, AdminUser, SystemUser, Label from .forms import AssetForm, AssetGroupForm, IDCForm, AdminUserForm, SystemUserForm from .hands import AdminUserRequiredMixin -class AssetCreateView(CreateView): +class AssetCreateView(AdminUserRequiredMixin, CreateView): model = Asset form_class = AssetForm template_name = 'assets/asset_create.html' success_url = reverse_lazy('assets:asset-list') - def form_invalid(self, form): + def form_valid(self, form): asset = form.save(commit=False) - asset.is_active = 1 + key = self.request.POST.get('key', '') + value = self.request.POST.get('value', '') asset.save() - return super(AssetCreateView, self).form_invalid(form) + Label.objects.create(key=key, value=value, asset=asset) + return super(AssetCreateView, self).form_valid(form) + + def get_context_data(self, **kwargs): + context = super(AssetCreateView, self).get_context_data(**kwargs) + context.update({'admin_users': AdminUser.objects.all()}) + assert isinstance(context, object) + print(context) + return context class AssetUpdateView(UpdateView): diff --git a/apps/static/css/style.css b/apps/static/css/style.css index fb30bde06..4fb38fa03 100644 --- a/apps/static/css/style.css +++ b/apps/static/css/style.css @@ -1,5 +1,7 @@ +/* @import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); @import url("https://fonts.googleapis.com/css?family=Roboto:400,300,500,700"); +*/ /* * * INSPINIA - Responsive Admin Theme