From 24e31a69cb582fe7d5ba223886381039e3f501b3 Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 20 Sep 2016 00:39:33 +0800 Subject: [PATCH] finish asset --- apps/assets/forms.py | 18 +++-- apps/assets/models.py | 34 +++++--- ...t_create_update.html => asset_create.html} | 0 .../assets/templates/assets/asset_detail.html | 74 +++++++---------- apps/assets/templates/assets/asset_list.html | 8 +- .../assets/templates/assets/asset_update.html | 81 +++++++++++++++++++ apps/assets/views.py | 46 ++++++++--- 7 files changed, 182 insertions(+), 79 deletions(-) rename apps/assets/templates/assets/{asset_create_update.html => asset_create.html} (100%) create mode 100644 apps/assets/templates/assets/asset_update.html diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 398f8841d..48df3fb48 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -24,16 +24,16 @@ from django.utils.translation import gettext_lazy as _ class AssetCreateForm(forms.ModelForm): tags = forms.CharField(label=_('Tags'), widget=forms.TextInput(attrs={'id': 'tags'}), - help_text='Use `,` split') + required=False, help_text='Use `,` split') def __init__(self, *args, **kwargs): - instance = kwargs.get('instance') + instance = kwargs.get('instance', None) if instance: initial = kwargs.get('initial', {}) - tags = Tag.objects.filter(asset=instance) - tags_value = ','.join([tag.value for tag in tags]) - initial['tags'] = tags_value + tags = instance.tags.all() + initial['tags'] = ",".join([tag.value for tag in tags]) + print(kwargs.get('initial')) super(AssetCreateForm, self).__init__(*args, **kwargs) def _save_m2m(self): @@ -43,14 +43,16 @@ class AssetCreateForm(forms.ModelForm): value_list = tags.split(',') self.instance.tags.all().delete() Tag.objects.bulk_create( - [Tag(value=value) for value in value_list] + [Tag(value=value, asset=self.instance) for value in value_list] ) class Meta: model = Asset fields = [ - 'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups' + 'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups', + 'other_ip', 'remote_card_ip', 'mac_address', 'brand', 'cpu', 'memory', 'disk', 'os', 'cabinet_no', + 'cabinet_pos', 'number', 'status', 'env', 'sn', ] widgets = { 'groups': forms.SelectMultiple(attrs={'class': 'select2', @@ -75,7 +77,7 @@ class AssetGroupForm(forms.ModelForm): ) def __init__(self, *args, **kwargs): - if kwargs.get('instance'): + if kwargs.get('instance', None): initial = kwargs.get('initial', {}) initial['assets'] = kwargs['instance'].assets.all() super(AssetGroupForm, self).__init__(*args, **kwargs) diff --git a/apps/assets/models.py b/apps/assets/models.py index e0cb5dd2a..1abe6c58c 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -277,7 +277,10 @@ class AssetGroup(models.Model): def get_default_extend(key, value): - return AssetExtend.objects.get_or_create(key=key, value=value)[0] + try: + return AssetExtend.objects.get_or_create(key=key, value=value)[0] + except: + return None def get_default_idc(): @@ -295,8 +298,8 @@ class Asset(models.Model): on_delete=models.SET_NULL, verbose_name=_("Admin user")) system_users = 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'), - default=get_default_idc) + on_delete=models.SET_NULL, verbose_name=_('IDC'),) + # default=get_default_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')) @@ -307,14 +310,14 @@ class Asset(models.Model): cabinet_pos = models.IntegerField(null=True, blank=True, verbose_name=_('Cabinet position')) number = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Asset number')) status = models.ForeignKey(AssetExtend, null=True, blank=True, - related_name="status_asset", verbose_name=_('Asset status'), - default=functools.partial(get_default_extend, 'status', 'In use')) + related_name="status_asset", verbose_name=_('Asset status'),) + # default=functools.partial(get_default_extend, 'status', 'In use')) type = models.ForeignKey(AssetExtend, null=True, limit_choices_to={'key': 'type'}, - related_name="type_asset", verbose_name=_('Asset type'), - default=functools.partial(get_default_extend, 'type','Server')) - env = models.ForeignKey(AssetExtend, null=True, limit_choices_to={'key': 'env'}, - related_name="env_asset", verbose_name=_('Asset environment'), - default=functools.partial(get_default_extend, 'env', 'Production')) + related_name="type_asset", verbose_name=_('Asset type'),) + # default=functools.partial(get_default_extend, 'type','Server')) + env = models.ForeignKey(AssetExtend, blank=True, null=True, limit_choices_to={'key': 'env'}, + related_name="env_asset", verbose_name=_('Asset environment'),) + # default=functools.partial(get_default_extend, 'env', 'Production')) 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')) @@ -324,8 +327,13 @@ class Asset(models.Model): def __unicode__(self): return '%(ip)s:%(port)s' % {'ip': self.ip, 'port': self.port} - def initial(self): - pass + def is_valid(self): + warning = '' + if not self.is_active: + warning += ' inactive' + else: + return True, '' + return False, warning class Meta: db_table = 'asset' @@ -367,7 +375,7 @@ class Tag(models.Model): unique_together = ('value', 'asset') -def initial(): +def init_all_models(): for cls in (AssetExtend, AssetGroup): cls.initial() diff --git a/apps/assets/templates/assets/asset_create_update.html b/apps/assets/templates/assets/asset_create.html similarity index 100% rename from apps/assets/templates/assets/asset_create_update.html rename to apps/assets/templates/assets/asset_create.html diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html index 16ce7e32c..fcb04d049 100644 --- a/apps/assets/templates/assets/asset_detail.html +++ b/apps/assets/templates/assets/asset_detail.html @@ -16,10 +16,12 @@
@@ -45,11 +47,6 @@ -{# #} - - @@ -85,20 +82,10 @@ - - - {% for label in asset.label_set.all %} - - {% endfor %} - - - - - @@ -163,36 +150,30 @@ - - - - - + - + + + + + +
#} -{# #} -{#
{% trans 'Hostname' %}: {{ asset.hostname }}
{% 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 'Enable OTP' %}: -
-
- - -
-
-
{% trans 'Reset password' %}:{% trans 'Rrefresh hardware' %}: - +
{% trans 'Reset ssh key' %}:{% trans 'Test admin user' %}: - +
{% trans 'Test system users' %}: + + + +
@@ -200,7 +181,7 @@
- {% trans 'Asset group' %} + {% trans 'Asset groups' %}
@@ -208,25 +189,25 @@ - {% for group in asset.groups.all %} + {% for asset_group in asset_groups %} - + {% endfor %} @@ -243,5 +224,8 @@ {% endblock %} {% block custom_foot_js %} {% endblock %} diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index ec7853e6e..12dfbf726 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -25,7 +25,7 @@ @@ -34,10 +34,10 @@
- + {% for asset_group in asset_groups_remain %} + {% endfor %}
- +
{{ group.name }}{{ asset_group.name }} - +
- + {{ asset.hostname }} {{ asset.type }} {{ asset.cpu }} {{ asset.memory }} {{ asset.disk }} - {% if asset.is_expired %} - - {% else %} + {% if asset.is_valid.0 %} + {% else %} + {% endif %} diff --git a/apps/assets/templates/assets/asset_update.html b/apps/assets/templates/assets/asset_update.html new file mode 100644 index 000000000..8aaac8880 --- /dev/null +++ b/apps/assets/templates/assets/asset_update.html @@ -0,0 +1,81 @@ +{% extends '_base_create_update.html' %} +{% load static %} +{% load bootstrap %} +{% load i18n %} + +{% block custom_head_css_js_create %} + + +{% endblock %} + +{% block form %} +
+ {% csrf_token %} +

{% trans 'Basic' %}

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

{% trans 'Group' %}

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

{% trans 'Asset user' %}

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

{% trans 'Hardware' %}

+ {{ form.sn|bootstrap_horizontal }} + {{ form.brand|bootstrap_horizontal }} + {{ form.cpu|bootstrap_horizontal }} + {{ form.memory|bootstrap_horizontal }} + {{ form.disk|bootstrap_horizontal }} + {{ form.mac_address|bootstrap_horizontal }} + +
+

{% trans 'Configuration' %}

+ {{ form.number|bootstrap_horizontal }} + {{ form.other_ip|bootstrap_horizontal }} + {{ form.remote_card_ip|bootstrap_horizontal }} + {{ form.os|bootstrap_horizontal }} + +
+

{% trans 'Location' %}

+ {{ form.cabinet_no|bootstrap_horizontal }} + {{ form.cabinet_pos|bootstrap_horizontal }} + +
+

{% trans 'Other' %}

+ {{ form.status|bootstrap_horizontal }} + {{ form.env|bootstrap_horizontal }} + {{ form.tags|bootstrap_horizontal }} + {{ form.comment|bootstrap_horizontal }} + +
+
+
+ + +
+
+ +
+{% endblock %} + +{% block custom_foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/views.py b/apps/assets/views.py index 91be7b673..c0f0afccd 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -17,7 +17,7 @@ from .forms import AssetCreateForm, AssetGroupForm, IDCForm, AdminUserForm, Syst from .hands import AdminUserRequiredMixin -class AssetListView(ListView): +class AssetListView(AdminUserRequiredMixin, ListView): paginate_by = settings.CONFIG.DISPLAY_PER_PAGE model = Asset context_object_name = 'asset_list' @@ -25,9 +25,15 @@ class AssetListView(ListView): def get_queryset(self): queryset = super(AssetListView, self).get_queryset() - queryset = sorted(queryset, key=lambda asset: int_seq(asset.ip.split('.'))) + queryset = sorted(queryset, key=self.sorted_by_valid_and_ip) return queryset + @staticmethod + def sorted_by_valid_and_ip(asset): + ip_list = int_seq(asset.ip.split('.')) + ip_list.insert(0, asset.is_valid()[0]) + return ip_list + def get_context_data(self, **kwargs): context = { 'app': 'Assets', @@ -40,13 +46,12 @@ class AssetListView(ListView): class AssetCreateView(AdminUserRequiredMixin, CreateView): model = Asset form_class = AssetCreateForm - template_name = 'assets/asset_create_update.html' + template_name = 'assets/asset_create.html' success_url = reverse_lazy('assets:asset-list') - # def form_valid(self, form): - # asset = form.save() - # print(self.request.POST.get('tags')) - # return super(AssetCreateView, self).form_valid(form) + def form_invalid(self, form): + print(form.errors) + return super(AssetCreateView, self).form_invalid(form) def get_context_data(self, **kwargs): context = { @@ -57,8 +62,19 @@ class AssetCreateView(AdminUserRequiredMixin, CreateView): return super(AssetCreateView, self).get_context_data(**kwargs) -class AssetUpdateView(UpdateView): - pass +class AssetUpdateView(AdminUserRequiredMixin, UpdateView): + model = Asset + form_class = AssetCreateForm + template_name = 'assets/asset_update.html' + success_url = reverse_lazy('assets:asset-list') + + def get_context_data(self, **kwargs): + context = { + 'app': 'Assets', + 'action': 'Update asset', + } + kwargs.update(context) + return super(AssetUpdateView, self).get_context_data(**kwargs) class AssetDeleteView(DeleteView): @@ -72,6 +88,18 @@ class AssetDetailView(DetailView): context_object_name = 'asset' template_name = 'assets/asset_detail.html' + def get_context_data(self, **kwargs): + asset_groups = self.object.groups.all() + context = { + 'app': 'Assets', + 'action': 'Asset detail', + 'asset_groups_remain': [asset_group for asset_group in AssetGroup.objects.all() + if asset_group not in asset_groups], + 'asset_groups': asset_groups, + } + kwargs.update(context) + return super(AssetDetailView, self).get_context_data(**kwargs) + class AssetGroupCreateView(AdminUserRequiredMixin, CreateView): model = AssetGroup