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 @@
#}
-{# | #}
- ||
{% trans 'Hostname' %}: | {{ asset.hostname }} | {% trans 'Disk' %}: | {{ asset.disk }} | -
{% trans 'Label' %}: | - {% for label in asset.label_set.all %} -{{ label.key }} - {{ label.value }} | - {% endfor %} -|
{% trans 'OS' %}: | {{ asset.os }} | |
{% trans 'Mac address' %}: | -{{ asset.mac_addr }} | -|
{% trans 'Asset status' %}: | {{ asset.status }} | @@ -163,36 +150,30 @@|
{% trans 'Enable OTP' %}: | -
-
-
-
-
-
-
- |
- |
{% trans 'Reset password' %}: | +{% trans 'Rrefresh hardware' %}: | - + |
{% trans 'Reset ssh key' %}: | +{% trans 'Test admin user' %}: | - + |
{% trans 'Test system users' %}: | ++ + + + | +
{{ group.name }} | +{{ asset_group.name }} | - + | - + {{ asset.hostname }} | @@ -34,10 +34,10 @@{{ 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 %} + +{% 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 |