mirror of https://github.com/jumpserver/jumpserver
asset:update tag
parent
0c611b6429
commit
b99b88a30f
|
@ -40,6 +40,7 @@ class AssetCreateForm(forms.ModelForm):
|
||||||
self.instance.tags.clear()
|
self.instance.tags.clear()
|
||||||
self.instance.tags.add(*tuple(tags))
|
self.instance.tags.add(*tuple(tags))
|
||||||
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Asset
|
model = Asset
|
||||||
|
|
||||||
|
@ -53,7 +54,8 @@ class AssetCreateForm(forms.ModelForm):
|
||||||
'groups': forms.SelectMultiple(attrs={'class': 'select2',
|
'groups': forms.SelectMultiple(attrs={'class': 'select2',
|
||||||
'data-placeholder': _('Select asset groups')}),
|
'data-placeholder': _('Select asset groups')}),
|
||||||
'tags': forms.SelectMultiple(attrs={'class': 'select2',
|
'tags': forms.SelectMultiple(attrs={'class': 'select2',
|
||||||
'data-placeholder': _('Select asset groups')}),
|
'id':'tags',
|
||||||
|
'data-placeholder': _('Select asset tags')}),
|
||||||
'system_users': forms.SelectMultiple(attrs={'class': 'select2',
|
'system_users': forms.SelectMultiple(attrs={'class': 'select2',
|
||||||
'data-placeholder': _('Select asset system users')}),
|
'data-placeholder': _('Select asset system users')}),
|
||||||
'admin_user': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select asset admin user')}),
|
'admin_user': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select asset admin user')}),
|
||||||
|
@ -264,3 +266,36 @@ class SystemUserForm(forms.ModelForm):
|
||||||
'auth_push': 'Auto push system user to asset',
|
'auth_push': 'Auto push system user to asset',
|
||||||
'auth_update': 'Auto update system user ssh key',
|
'auth_update': 'Auto update system user ssh key',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class AssetTagForm(forms.ModelForm):
|
||||||
|
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
|
||||||
|
label=_('Asset'),
|
||||||
|
required=False,
|
||||||
|
widget=forms.SelectMultiple(
|
||||||
|
attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
if kwargs.get('instance', None):
|
||||||
|
initial = kwargs.get('initial', {})
|
||||||
|
initial['assets'] = kwargs['instance'].asset_set.all()
|
||||||
|
super(AssetTagForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def _save_m2m(self):
|
||||||
|
super(AssetTagForm, self)._save_m2m()
|
||||||
|
assets = self.cleaned_data['assets']
|
||||||
|
self.instance.asset_set.clear()
|
||||||
|
self.instance.asset_set.add(*tuple(assets))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Tag
|
||||||
|
fields = [
|
||||||
|
"name",
|
||||||
|
]
|
||||||
|
widgets = {
|
||||||
|
'name' : forms.TextInput(attrs={}),
|
||||||
|
|
||||||
|
}
|
||||||
|
help_texts = {
|
||||||
|
'name': '* required',
|
||||||
|
}
|
|
@ -365,7 +365,7 @@ class Asset(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Tag(models.Model):
|
class Tag(models.Model):
|
||||||
name = models.CharField('标签名', max_length=64)
|
name = models.CharField('标签名', max_length=64,unique=True)
|
||||||
created_time = models.DateTimeField('创建时间', auto_now_add=True)
|
created_time = models.DateTimeField('创建时间', auto_now_add=True)
|
||||||
created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by'))
|
created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by'))
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,6 @@
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<h3>{% trans 'Other' %}</h3>
|
<h3>{% trans 'Other' %}</h3>
|
||||||
{{ form.tags|bootstrap_horizontal }}
|
{{ form.tags|bootstrap_horizontal }}
|
||||||
|
|
||||||
|
|
||||||
{{ form.comment|bootstrap_horizontal }}
|
{{ form.comment|bootstrap_horizontal }}
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
|
|
|
@ -37,7 +37,7 @@ div.dataTables_wrapper div.dataTables_filter,
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div id="tab-1" class="ibox float-e-margins tab-pane active"></div>
|
<div id="tab-1" class="ibox float-e-margins tab-pane active"></div>
|
||||||
<form id="IDCForm" method="post" class="form-horizontal">
|
<form id="groupForm" method="post" class="form-horizontal">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<h3 class="widget-head-color-box">资产组信息</h3>
|
<h3 class="widget-head-color-box">资产组信息</h3>
|
||||||
{{ form.name|bootstrap_horizontal }}
|
{{ form.name|bootstrap_horizontal }}
|
||||||
|
|
|
@ -42,8 +42,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
<a href="{% url 'assets:asset-update' pk=asset.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</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 'assets:asset-delete' pk=asset.id %}" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>
|
||||||
{# <a href="{% url '' %}">{% trans 'Delete' %}</a>#}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for asset in asset_modal_list %}
|
{% for asset in asset_modal_list %}
|
||||||
{% if asset.id in group_assets %}
|
{% if asset.id in all_assets %}
|
||||||
<tr name="oAssets" class="odd selected">
|
<tr name="oAssets" class="odd selected">
|
||||||
<td class="text-center" ><input type="checkbox" name="checked" value="{{ asset.id }}" checked="checked" ></td>
|
<td class="text-center" ><input type="checkbox" name="checked" value="{{ asset.id }}" checked="checked" ></td>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -47,7 +47,6 @@
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
//$(window).load(function (){
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
|
|
||||||
var table = $('#editable').DataTable({
|
var table = $('#editable').DataTable({
|
||||||
|
@ -68,7 +67,7 @@ $(document).ready(function(){
|
||||||
{data: "dp"}
|
{data: "dp"}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
//讲ID列隐藏
|
//将ID列隐藏
|
||||||
table.column('1').visible(false);
|
table.column('1').visible(false);
|
||||||
|
|
||||||
$('#editable tbody').on( 'click', 'tr', function () {
|
$('#editable tbody').on( 'click', 'tr', function () {
|
||||||
|
@ -82,6 +81,9 @@ $(document).ready(function(){
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#close-btn').on('click',function(){
|
||||||
|
$('#modal').modal('hide');
|
||||||
|
});
|
||||||
$('#save-btn').on('click',function(){
|
$('#save-btn').on('click',function(){
|
||||||
// alert( table.rows('.selected').data().length +' row(s) selected' );
|
// alert( table.rows('.selected').data().length +' row(s) selected' );
|
||||||
var d = table.rows('.selected').data();
|
var d = table.rows('.selected').data();
|
||||||
|
|
|
@ -70,12 +70,10 @@
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$('.select2').select2();
|
$('.select2').select2();
|
||||||
{# $('#tags').inputTags({#}
|
$("#tags").select2({
|
||||||
{# tags: [{% for tag in form.tags.value %} {{ tag|safe }}, {% endfor %}]#}
|
tags: true,
|
||||||
{# });#}
|
maximumSelectionLength: 8 //最多能够选择的个数
|
||||||
$('#tags').inputTags(
|
});
|
||||||
|
|
||||||
);
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -28,7 +28,13 @@ urlpatterns = [
|
||||||
url(r'^asset-group/(?P<pk>[0-9]+)$', views.AssetGroupDetailView.as_view(), name='asset-group-detail'),
|
url(r'^asset-group/(?P<pk>[0-9]+)$', views.AssetGroupDetailView.as_view(), name='asset-group-detail'),
|
||||||
url(r'^asset-group/(?P<pk>[0-9]+)/update$', views.AssetGroupUpdateView.as_view(), name='asset-group-update'),
|
url(r'^asset-group/(?P<pk>[0-9]+)/update$', views.AssetGroupUpdateView.as_view(), name='asset-group-update'),
|
||||||
url(r'^asset-group/(?P<pk>[0-9]+)/delete$', views.AssetGroupDeleteView.as_view(), name='asset-group-delete'),
|
url(r'^asset-group/(?P<pk>[0-9]+)/delete$', views.AssetGroupDeleteView.as_view(), name='asset-group-delete'),
|
||||||
url(r'^asset-tag/(?P<tag_id>[0-9]+)$', views.TagView.as_view(), name='asset-tags'),
|
|
||||||
|
url(r'^tags$', views.TagsListView.as_view(), name='asset-tag-list'),
|
||||||
|
url(r'^asset-by-tag/(?P<tag_id>[0-9]+)$', views.TagView.as_view(), name='asset-tags'),
|
||||||
|
url(r'^tags/create$', views.AssetTagCreateView.as_view(), name='asset-tag-create'),
|
||||||
|
url(r'^asset-tag/(?P<pk>[0-9]+)$', views.AssetTagDetailView.as_view(), name='asset-tag-detail'),
|
||||||
|
url(r'^asset-tag/(?P<pk>[0-9]+)/update$', views.AssetTagUpdateView.as_view(), name='asset-tag-update'),
|
||||||
|
url(r'^asset-tag/(?P<pk>[0-9]+)/delete$', views.AssetTagDeleteView.as_view(), name='asset-tag-delete'),
|
||||||
|
|
||||||
# Resource idc url
|
# Resource idc url
|
||||||
url(r'^idc$', views.IDCListView.as_view(), name='idc-list'),
|
url(r'^idc$', views.IDCListView.as_view(), name='idc-list'),
|
||||||
|
|
|
@ -13,7 +13,7 @@ from django.shortcuts import get_object_or_404, reverse, redirect
|
||||||
|
|
||||||
from common.utils import int_seq
|
from common.utils import int_seq
|
||||||
from .models import Asset, AssetGroup, IDC, AssetExtend, AdminUser, SystemUser, Tag
|
from .models import Asset, AssetGroup, IDC, AssetExtend, AdminUser, SystemUser, Tag
|
||||||
from .forms import AssetCreateForm, AssetGroupForm, IDCForm, AdminUserForm, SystemUserForm
|
from .forms import *
|
||||||
from .hands import AdminUserRequiredMixin
|
from .hands import AdminUserRequiredMixin
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,12 +53,14 @@ class AssetCreateView(AdminUserRequiredMixin, CreateView):
|
||||||
success_url = reverse_lazy('assets:asset-list')
|
success_url = reverse_lazy('assets:asset-list')
|
||||||
|
|
||||||
def form_invalid(self, form):
|
def form_invalid(self, form):
|
||||||
|
|
||||||
|
#tags = form.cleaned_data['tags']
|
||||||
print(form.errors)
|
print(form.errors)
|
||||||
return super(AssetCreateView, self).form_invalid(form)
|
return super(AssetCreateView, self).form_invalid(form)
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
tag_name_list = form.cleaned_data['tags']
|
tag_name_list = form.cleaned_data['tags']
|
||||||
print self.tag_type,tag_name_list
|
# print self.tag_type,tag_name_list
|
||||||
return super(AssetCreateView, self).form_valid(form)
|
return super(AssetCreateView, self).form_valid(form)
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,6 +88,11 @@ class AssetUpdateView(AdminUserRequiredMixin, UpdateView):
|
||||||
kwargs.update(context)
|
kwargs.update(context)
|
||||||
return super(AssetUpdateView, self).get_context_data(**kwargs)
|
return super(AssetUpdateView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
|
def form_invalid(self, form):
|
||||||
|
print(form.errors)
|
||||||
|
print "jsf"
|
||||||
|
return super(AssetUpdateView, self).form_invalid(form)
|
||||||
|
|
||||||
|
|
||||||
class AssetDeleteView(DeleteView):
|
class AssetDeleteView(DeleteView):
|
||||||
model = Asset
|
model = Asset
|
||||||
|
@ -119,10 +126,17 @@ class AssetModalListView(AdminUserRequiredMixin, ListView):
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
group_id = self.request.GET.get('group_id')
|
group_id = self.request.GET.get('group_id')
|
||||||
|
tag_id = self.request.GET.get('tag_id')
|
||||||
if group_id:
|
if group_id:
|
||||||
group = AssetGroup.objects.get(id=group_id)
|
group = AssetGroup.objects.get(id=group_id)
|
||||||
context = {
|
context = {
|
||||||
'group_assets':[x.id for x in group.assets.all()]
|
'all_assets':[x.id for x in group.assets.all()]
|
||||||
|
}
|
||||||
|
kwargs.update(context)
|
||||||
|
if tag_id:
|
||||||
|
tag = Tag.objects.get(id=tag_id)
|
||||||
|
context = {
|
||||||
|
'all_assets':[x.id for x in tag.asset_set.all()]
|
||||||
}
|
}
|
||||||
kwargs.update(context)
|
kwargs.update(context)
|
||||||
return super(AssetModalListView, self).get_context_data(**kwargs)
|
return super(AssetModalListView, self).get_context_data(**kwargs)
|
||||||
|
@ -150,7 +164,6 @@ class AssetGroupCreateView(AdminUserRequiredMixin, CreateView):
|
||||||
asset_group = form.save()
|
asset_group = form.save()
|
||||||
assets_id_list = self.request.POST.getlist('assets', [])
|
assets_id_list = self.request.POST.getlist('assets', [])
|
||||||
assets = [get_object_or_404(Asset, id=int(asset_id)) for asset_id in assets_id_list]
|
assets = [get_object_or_404(Asset, id=int(asset_id)) for asset_id in assets_id_list]
|
||||||
print assets
|
|
||||||
asset_group.created_by = self.request.user.username or 'Admin'
|
asset_group.created_by = self.request.user.username or 'Admin'
|
||||||
asset_group.assets.add(*tuple(assets))
|
asset_group.assets.add(*tuple(assets))
|
||||||
asset_group.save()
|
asset_group.save()
|
||||||
|
@ -161,6 +174,7 @@ class AssetGroupListView(AdminUserRequiredMixin, ListView):
|
||||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||||
context_object_name = 'asset_group_list'
|
context_object_name = 'asset_group_list'
|
||||||
template_name = 'assets/asset_group_list.html'
|
template_name = 'assets/asset_group_list.html'
|
||||||
|
ordering = '-id'
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = {
|
context = {
|
||||||
|
@ -569,3 +583,94 @@ class TagView(ListView):
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
kwargs['tag_list'] = [(i.id,i.name,i.asset_set.all().count() )for i in Tag.objects.all().order_by('name')]
|
kwargs['tag_list'] = [(i.id,i.name,i.asset_set.all().count() )for i in Tag.objects.all().order_by('name')]
|
||||||
return super(TagView, self).get_context_data(**kwargs)
|
return super(TagView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class TagsListView(AdminUserRequiredMixin, ListView):
|
||||||
|
model = Tag
|
||||||
|
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||||
|
context_object_name = 'asset_tags_list'
|
||||||
|
template_name = 'assets/asset_tags_list.html'
|
||||||
|
ordering = '-id'
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = {
|
||||||
|
'app': _('Tag'),
|
||||||
|
'action': _('Asset Tags list'),
|
||||||
|
'keyword': self.request.GET.get('keyword', '')
|
||||||
|
}
|
||||||
|
kwargs.update(context)
|
||||||
|
return super(TagsListView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
|
class AssetTagCreateView(AdminUserRequiredMixin, CreateView):
|
||||||
|
model = Tag
|
||||||
|
form_class = AssetTagForm
|
||||||
|
template_name = 'assets/asset_tag_create.html'
|
||||||
|
success_url = reverse_lazy('assets:asset-tag-list')
|
||||||
|
#ordering = '-id'
|
||||||
|
|
||||||
|
# Todo: Asset group create template select assets so hard, need be resolve next
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = {
|
||||||
|
'app': _('Tag'),
|
||||||
|
'action': _('Asset Tags list'),
|
||||||
|
'assets_count': 0,
|
||||||
|
}
|
||||||
|
kwargs.update(context)
|
||||||
|
return super(AssetTagCreateView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
asset_tag = form.save()
|
||||||
|
assets_id_list = self.request.POST.getlist('assets', [])
|
||||||
|
assets = [get_object_or_404(Asset, id=int(asset_id)) for asset_id in assets_id_list]
|
||||||
|
asset_tag.created_by = self.request.user.username or 'Admin'
|
||||||
|
asset_tag.asset_set.add(*tuple(assets))
|
||||||
|
asset_tag.save()
|
||||||
|
return super(AssetTagCreateView, self).form_valid(form)
|
||||||
|
|
||||||
|
class AssetTagDetailView(SingleObjectMixin, AdminUserRequiredMixin, ListView):
|
||||||
|
template_name = 'assets/asset_tag_detail.html'
|
||||||
|
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
self.object = self.get_object(queryset=Tag.objects.all())
|
||||||
|
return super(AssetTagDetailView, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return self.object.asset_set.all()
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = {
|
||||||
|
'app': _('Tag'),
|
||||||
|
'action': _('Asset Tags detail'),
|
||||||
|
'asset_tag': self.object,
|
||||||
|
}
|
||||||
|
kwargs.update(context)
|
||||||
|
return super(AssetTagDetailView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
|
class AssetTagUpdateView(AdminUserRequiredMixin, UpdateView):
|
||||||
|
model = Tag
|
||||||
|
form_class = AssetTagForm
|
||||||
|
template_name = 'assets/asset_tag_create.html'
|
||||||
|
success_url = reverse_lazy('assets:asset-tag-list')
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
self.object = self.get_object(queryset=Tag.objects.all())
|
||||||
|
return super(AssetTagUpdateView, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = {
|
||||||
|
'app': _('Tag'),
|
||||||
|
'action': _('Asset Tags detail'),
|
||||||
|
'assets_count': self.object.asset_set.all().count(),
|
||||||
|
'tag_id':self.object.id,
|
||||||
|
}
|
||||||
|
kwargs.update(context)
|
||||||
|
return super(AssetTagUpdateView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class AssetTagDeleteView(AdminUserRequiredMixin, DeleteView):
|
||||||
|
template_name = 'assets/delete_confirm.html'
|
||||||
|
model = Tag
|
||||||
|
success_url = reverse_lazy('assets:asset-tag-list')
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
<li id="idc"><a href="{% url 'assets:idc-list' %}">{% trans 'IDC' %}</a></li>
|
<li id="idc"><a href="{% url 'assets:idc-list' %}">{% trans 'IDC' %}</a></li>
|
||||||
<li id="admin-user"><a href="{% url 'assets:admin-user-list' %}">{% trans 'Admin user' %}</a></li>
|
<li id="admin-user"><a href="{% url 'assets:admin-user-list' %}">{% trans 'Admin user' %}</a></li>
|
||||||
<li id="system-user"><a href="{% url 'assets:system-user-list' %}">{% trans 'System user' %}</a></li>
|
<li id="system-user"><a href="{% url 'assets:system-user-list' %}">{% trans 'System user' %}</a></li>
|
||||||
<li id=""><a href="">{% trans 'Label' %}</a></li>
|
<li id="asset-tag"><a href="{% url 'assets:asset-tag-list' %}">{% trans 'Label' %}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li id="perms">
|
<li id="perms">
|
||||||
|
|
Loading…
Reference in New Issue