Commit d323c9df authored by ibuler's avatar ibuler

Modify asset create

parent acfe8950
# coding:utf-8
from django import forms
from .models import IDC, Asset, AssetGroup, AdminUser, SystemUser
from .models import IDC, Asset, AssetGroup, AdminUser, SystemUser, Tag
from django.utils.translation import gettext_lazy as _
......@@ -23,13 +23,35 @@ 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')
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance')
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
super(AssetCreateForm, self).__init__(*args, **kwargs)
def _save_m2m(self):
tags = self.cleaned_data['tags']
if tags:
value_list = tags.split(',')
self.instance.tags.all().delete()
Tag.objects.bulk_create(
[Tag(value=value) for value in value_list]
)
class Meta:
model = Asset
fields = [
'hostname', 'ip', 'port', 'type', 'zone', 'comment', 'admin_user', 'system_users', 'idc', 'groups'
'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups'
]
widgets = {
'groups': forms.SelectMultiple(attrs={'class': 'select2',
'data-placeholder': _('Select asset groups')}),
......
# coding:utf-8
from __future__ import unicode_literals, absolute_import
import functools
from django.db import models
import logging
from django.utils.translation import ugettext_lazy as _
......@@ -25,6 +26,10 @@ class IDC(models.Model):
def __unicode__(self):
return self.name
@classmethod
def initial(cls):
return cls.objects.get_or_create(name=_('Default'), created_by=_('System'), comment=_('Default IDC'))[0]
class Meta:
db_table = 'idc'
......@@ -77,13 +82,12 @@ class AssetExtend(models.Model):
(_('env'), _('Production')),
(_('env'), _('Development')),
(_('env'), _('Testing')),
(_('zone'), _('Default')),
):
cls.objects.create(key=k, value=v, created_by='System')
class Meta:
db_table = 'asset_extend'
index_together = ('key', 'value')
unique_together = ('key', 'value')
class AdminUser(models.Model):
......@@ -272,12 +276,16 @@ class AssetGroup(models.Model):
continue
class Asset(models.Model):
STATUS_DEFAULT = AssetExtend.objects.get_or_create(key='status', value=_('In use'))
TYPE_DEFAULT = AssetExtend.objects.get_or_create(key='type', value=_('Server'))
ZONE_DEFAULT = AssetExtend.objects.get_or_create(key='zone', value=_('Default'))
def get_default_extend(key, value):
return AssetExtend.objects.get_or_create(key=key, value=value)[0]
def get_default_idc():
return IDC.initial()
ip = models.CharField(max_length=32, verbose_name=_('IP'))
class Asset(models.Model):
ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP'))
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, blank=True, verbose_name=_('Hostname'))
......@@ -286,7 +294,9 @@ class Asset(models.Model):
admin_user = models.ForeignKey(AdminUser, null=True, blank=True, related_name='assets',
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'))
idc = models.ForeignKey(IDC, null=True, related_name='assets',
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'))
......@@ -296,14 +306,15 @@ class Asset(models.Model):
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, null=True, blank=True, verbose_name=_('Asset number'))
status = models.ForeignKey(AssetExtend, null=True, blank=True, related_name="status_asset",
default=STATUS_DEFAULT, verbose_name=_('Asset status'))
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'))
type = models.ForeignKey(AssetExtend, null=True, limit_choices_to={'key': 'type'},
default=TYPE_DEFAULT, related_name="type_asset", verbose_name=_('Asset 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'))
zone = models.ForeignKey(AssetExtend, null=True, limit_choices_to={'key': 'zone'}, default=ZONE_DEFAULT,
related_name="zone_asset", verbose_name=_('Asset zone'))
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'))
......@@ -318,7 +329,7 @@ class Asset(models.Model):
class Meta:
db_table = 'asset'
index_together = ('ip', 'port')
unique_together = ('ip', 'port')
@classmethod
def generate_fake(cls, count=100):
......@@ -345,17 +356,15 @@ class Asset(models.Model):
class Tag(models.Model):
key = models.CharField(max_length=64, blank=True, verbose_name=_('KEY'))
value = models.CharField(max_length=64, 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)
asset = models.ForeignKey(Asset, related_name='tags', on_delete=models.CASCADE, verbose_name=_('Asset'))
def __unicode__(self):
return self.key
return self.value
class Meta:
db_table = 'label'
db_table = 'tag'
unique_together = ('value', 'asset')
def initial():
......@@ -366,3 +375,8 @@ def initial():
def generate_fake():
for cls in (AssetGroup, IDC, AdminUser, SystemUser, Asset):
cls.generate_fake()
def flush_all():
for cls in (AssetGroup, AssetExtend, IDC, AdminUser, SystemUser, Asset):
cls.objects.all().delete()
......@@ -16,7 +16,6 @@
{{ form.ip|bootstrap_horizontal }}
{{ form.port|bootstrap_horizontal }}
{{ form.type|bootstrap_horizontal }}
{{ form.zone|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
<h3>{% trans 'Group' %}</h3>
......@@ -30,13 +29,14 @@
<div class="hr-line-dashed"></div>
<h3>{% trans 'Other' %}</h3>
<div class="form-group">
<label for="tags" class="col-sm-2 control-label">Tags</label>
<div class="col-sm-9 col-lg-9 " style="background-color: #fff">
<input id="tags" name="tags" type="text" class="form-control">
<p class="help-block" >{% trans 'Tips: Use `,` split' %}</p>
</div>
</div>
{# <div class="form-group">#}
{# <label for="tags" class="col-sm-2 control-label">Tags</label>#}
{# <div class="col-sm-9 col-lg-9 " style="background-color: #fff">#}
{# <input id="tags" name="tags" type="text" class="form-control">#}
{# <p class="help-block" >{% trans 'Tips: Use `,` split' %}</p>#}
{# </div>#}
{# </div>#}
{{ form.tags|bootstrap_horizontal }}
{{ form.comment|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
......
......@@ -41,8 +41,8 @@
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'assets:asset-update' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
<a href="{% url 'assets:asset-delete' pk=user.id %}" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>-
<a href="{% url 'assets:asset-update' pk=asset.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
<a href="{% url 'assets:asset-delete' pk=asset.id %}" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>-
{# <a href="{% url '' %}">{% trans 'Delete' %}</a>#}
</td>
</tr>
......
......@@ -10,6 +10,8 @@ from django.urls import reverse_lazy
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.detail import DetailView, SingleObjectMixin
from common.utils import int_seq
from .models import Asset, AssetGroup, IDC, AssetExtend, AdminUser, SystemUser, Tag
from .forms import AssetCreateForm, AssetGroupForm, IDCForm, AdminUserForm, SystemUserForm
from .hands import AdminUserRequiredMixin
......@@ -21,6 +23,11 @@ class AssetListView(ListView):
context_object_name = 'asset_list'
template_name = 'assets/asset_list.html'
def get_queryset(self):
queryset = super(AssetListView, self).get_queryset()
queryset = sorted(queryset, key=lambda asset: int_seq(asset.ip.split('.')))
return queryset
def get_context_data(self, **kwargs):
context = {
'app': 'Assets',
......@@ -36,12 +43,10 @@ class AssetCreateView(AdminUserRequiredMixin, CreateView):
template_name = 'assets/asset_create_update.html'
success_url = reverse_lazy('assets:asset-list')
def form_valid(self, form):
asset = form.save(commit=False)
key = self.request.POST.get('key', '')
value = self.request.POST.get('value', '')
asset.save()
return super(AssetCreateView, self).form_valid(form)
# def form_valid(self, form):
# asset = form.save()
# print(self.request.POST.get('tags'))
# return super(AssetCreateView, self).form_valid(form)
def get_context_data(self, **kwargs):
context = {
......@@ -58,6 +63,7 @@ class AssetUpdateView(UpdateView):
class AssetDeleteView(DeleteView):
model = Asset
template_name = 'assets/delete_confirm.html'
success_url = reverse_lazy('assets:asset-list')
......
......@@ -100,3 +100,10 @@ def search_object_attr(obj, value='', attr_list=None, ignore_case=False):
def get_logger(name=None):
return logging.getLogger('jumpserver.%s' % name)
def int_seq(seq):
try:
return map(int, seq)
except ValueError:
return seq
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment