diff --git a/apps/assets/forms.py b/apps/assets/forms.py
index 8b1f625ac..30e48a443 100644
--- a/apps/assets/forms.py
+++ b/apps/assets/forms.py
@@ -34,7 +34,7 @@ class AssetCreateForm(forms.ModelForm):
return self.cleaned_data['admin_user']
-class AssetUpdateForm(AssetCreateForm):
+class AssetUpdateForm(forms.ModelForm):
class Meta:
model = Asset
fields = [
@@ -55,6 +55,23 @@ class AssetUpdateForm(AssetCreateForm):
}
+class AssetBulkUpdateForm(forms.ModelForm):
+ class Meta:
+ model = Asset
+ fields = [
+ 'port', 'groups', 'admin_user', 'idc',
+ 'type', 'env', 'status',
+ ]
+ widgets = {
+ 'groups': forms.SelectMultiple(
+ attrs={'class': 'select2',
+ 'data-placeholder': _('Select asset groups')}),
+ 'admin_user': forms.Select(
+ attrs={'class': 'select2',
+ 'data-placeholder': _('Select asset admin user')}),
+ }
+
+
class AssetGroupForm(forms.ModelForm):
# See AdminUserForm comment same it
assets = forms.ModelMultipleChoiceField(
diff --git a/apps/assets/templates/assets/_asset_bulk_update_modal.html b/apps/assets/templates/assets/_asset_bulk_update_modal.html
deleted file mode 100644
index 57cd98317..000000000
--- a/apps/assets/templates/assets/_asset_bulk_update_modal.html
+++ /dev/null
@@ -1,66 +0,0 @@
-{% extends '_modal.html' %}
-{% load i18n %}
-{% block modal_id %}asset_bulk_update_modal{% endblock %}
-{% block modal_class %}modal-lg{% endblock %}
-{% block modal_title%}{% trans "Update Asset" %}{% endblock %}
-{% block modal_body %}
-{% load bootstrap3 %}
-
{% trans "Hint: only change the field you want to update." %}
-
-
-{% endblock %}
-{% block modal_confirm_id %}btn_asset_bulk_update{% endblock %}
\ No newline at end of file
diff --git a/apps/assets/templates/assets/asset_bulk_update.html b/apps/assets/templates/assets/asset_bulk_update.html
new file mode 100644
index 000000000..44951778e
--- /dev/null
+++ b/apps/assets/templates/assets/asset_bulk_update.html
@@ -0,0 +1,115 @@
+{% extends '_base_create_update.html' %}
+{% load static %}
+{% load bootstrap3 %}
+{% load i18n %}
+
+{% block form %}
+
+{% if errors %}
+
+ {{ errors }}
+
+{% endif %}
+
+{% 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 c8333eff3..3bfa068c1 100644
--- a/apps/assets/templates/assets/asset_list.html
+++ b/apps/assets/templates/assets/asset_list.html
@@ -5,12 +5,12 @@
-
+{##}
{% endblock %}
{% block content_left_head %}{% endblock %}
@@ -64,7 +64,7 @@
{% include 'assets/_asset_import_modal.html' %}
-{% include 'assets/_asset_bulk_update_modal.html' %}
+{#{% include 'assets/_asset_bulk_update_modal.html' %}#}
{% endblock %}
{% block custom_foot_js %}
diff --git a/apps/assets/templates/assets/asset_modal_update.html b/apps/assets/templates/assets/asset_modal_update.html
deleted file mode 100644
index c518e5602..000000000
--- a/apps/assets/templates/assets/asset_modal_update.html
+++ /dev/null
@@ -1,210 +0,0 @@
-{% extends '_base_create_update.html' %}
-{% load static %}
-{% load bootstrap3 %}
-{% load i18n %}
-
-{% block form %}
-
-
- {% bootstrap_field form.port layout="horizontal" %}
- {% bootstrap_field form.type layout="horizontal" %}
- {% bootstrap_field form.idc layout="horizontal" %}
- {% bootstrap_field form.groups layout="horizontal" %}
- {% bootstrap_field form.admin_user layout="horizontal" %}
- {% bootstrap_field form.system_users layout="horizontal" %}
- {% bootstrap_field form.brand layout="horizontal" %}
- {% bootstrap_field form.cpu layout="horizontal" %}
- {% bootstrap_field form.memory layout="horizontal" %}
- {% bootstrap_field form.disk layout="horizontal" %}
- {% bootstrap_field form.os layout="horizontal" %}
- {% bootstrap_field form.cabinet_no layout="horizontal" %}
- {% bootstrap_field form.cabinet_pos layout="horizontal" %}
- {% bootstrap_field form.status layout="horizontal" %}
- {% bootstrap_field form.env layout="horizontal" %}
- {% bootstrap_field form.tags layout="horizontal" %}
- {% bootstrap_field form.comment layout="horizontal" %}
-
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
-
-{% block custom_foot_js %}
-
-{% endblock %}
diff --git a/apps/assets/urls/views_urls.py b/apps/assets/urls/views_urls.py
index 4d3499821..353d4a290 100644
--- a/apps/assets/urls/views_urls.py
+++ b/apps/assets/urls/views_urls.py
@@ -15,7 +15,7 @@ urlpatterns = [
url(r'^asset/(?P[0-9]+)/update/$', views.AssetUpdateView.as_view(), name='asset-update'),
url(r'^asset/(?P[0-9]+)/delete/$', views.AssetDeleteView.as_view(), name='asset-delete'),
url(r'^asset-modal$', views.AssetModalListView.as_view(), name='asset-modal-list'),
- url(r'^asset-modal-update$', views.AssetModalCreateView.as_view(), name='asset-modal-update'),
+ url(r'^asset/update/$', views.AssetBulkUpdateView.as_view(), name='asset-bulk-update'),
# User asset view
url(r'^user-asset/$', views.UserAssetListView.as_view(), name='user-asset-list'),
diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py
index 5c83bf85d..39ce7e0dd 100644
--- a/apps/assets/views/asset.py
+++ b/apps/assets/views/asset.py
@@ -6,6 +6,7 @@ import json
import uuid
import codecs
from io import StringIO
+from collections import defaultdict
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
@@ -30,7 +31,7 @@ from ..tasks import update_assets_hardware_info
__all__ = ['AssetListView', 'AssetCreateView', 'AssetUpdateView',
- 'UserAssetListView', 'AssetModalCreateView', 'AssetDetailView',
+ 'UserAssetListView', 'AssetBulkUpdateView', 'AssetDetailView',
'AssetModalListView', 'AssetDeleteView', 'AssetExportView',
'BulkImportAssetView',
]
@@ -45,6 +46,7 @@ class AssetListView(AdminUserRequiredMixin, TemplateView):
'action': 'asset list',
'groups': AssetGroup.objects.all(),
'system_users': SystemUser.objects.all(),
+ # 'form': forms.AssetBulkUpdateForm(),
}
kwargs.update(context)
return super(AssetListView, self).get_context_data(**kwargs)
@@ -89,32 +91,102 @@ class AssetCreateView(AdminUserRequiredMixin, CreateView):
return super(AssetCreateView, self).get_success_url()
-class AssetModalCreateView(AdminUserRequiredMixin, ListView):
+class AssetModalListView(AdminUserRequiredMixin, ListView):
+ paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
model = Asset
- form_class = forms.AssetCreateForm
- template_name = 'assets/asset_modal_update.html'
- success_url = reverse_lazy('assets:asset-list')
-
- def get_queryset(self):
- self.queryset = super(AssetModalCreateView,self).get_queryset()
- self.s = self.request.GET.get('plain_id_lists')
- if "," in str(self.s):
- self.plain_id_lists = [int(x) for x in self.s.split(',')]
- else:
- self.plain_id_lists = [self.s]
- return self.queryset
+ context_object_name = 'asset_modal_list'
+ template_name = 'assets/asset_modal_list.html'
def get_context_data(self, **kwargs):
- asset_on_list = Asset.objects.filter(id__in = self.plain_id_lists)
+ assets = Asset.objects.all()
+ assets_id = self.request.GET.get('assets_id', '')
+ assets_id_list = [i for i in assets_id.split(',') if i.isdigit()]
context = {
- 'app': 'Assets',
- 'action': 'Bulk Update asset',
- 'assets_on_list': asset_on_list,
- 'assets_count': len(asset_on_list),
- 'plain_id_lists':self.s,
+ 'all_assets': assets_id_list,
+ 'assets': assets
}
kwargs.update(context)
- return super(AssetModalCreateView, self).get_context_data(**kwargs)
+ return super(AssetModalListView, self).get_context_data(**kwargs)
+
+
+class AssetBulkUpdateView(AdminUserRequiredMixin, ListView):
+ model = Asset
+ form_class = forms.AssetBulkUpdateForm
+ template_name = 'assets/asset_bulk_update.html'
+ success_url = reverse_lazy('assets:asset-list')
+
+ def get(self, request, *args, **kwargs):
+ assets_id = self.request.GET.get('assets_id', '')
+ self.assets_id_list = [int(i) for i in assets_id.split(',') if i.isdigit()]
+ self.form = self.form_class()
+ self.errors = kwargs.get('errors')
+ return super(AssetBulkUpdateView, self).get(request, *args, **kwargs)
+
+ def post(self, request, *args, **kwargs):
+ raw_data = request.POST
+ data = {}
+ errors = defaultdict(list)
+ for k in raw_data:
+ if not hasattr(Asset, k) or raw_data.get(k) == '':
+ if k not in ['assets']:
+ continue
+ if k == 'assets':
+ v = Asset.objects.filter(id__in=raw_data.getlist(k))
+ if not v:
+ errors['assets'].append(_('Required'))
+ elif k == 'port':
+ try:
+ v = int(raw_data.get(k))
+ except ValueError:
+ v = None
+ errors['port'].append(_('Integer required'))
+ elif k == 'admin_user':
+ admin_user_id = raw_data.get(k)
+ try:
+ v = int(admin_user_id)
+ except ValueError:
+ v = None
+ errors['admin_user'].append(_('Invalid admin user'))
+ v = get_object_or_none(AdminUser, id=v)
+ elif k == 'groups':
+ groups_id = raw_data.getlist(k)
+ v = [AssetGroup.objects.filter(id__in=groups_id)]
+ elif k == 'idc':
+ idc_id = raw_data.get(k)
+ try:
+ v = int(idc_id)
+ except ValueError:
+ v = None
+ errors['idc'].append(_('Integer required'))
+ v = get_object_or_none(IDC, id=v)
+ else:
+ v = raw_data.get(k)
+ data[k] = v
+
+ if not errors:
+ for asset in data['assets']:
+ for k, v in data.items():
+ if k == 'groups':
+ asset.groups.set(data['groups'])
+ else:
+ setattr(asset, k, v)
+ asset.save()
+ return redirect(reverse_lazy('assets:asset-list'))
+ else:
+ return self.get(request, errors=errors, *args, **kwargs)
+
+ def get_context_data(self, **kwargs):
+ # assets_list = Asset.objects.filter(id__in=self.assets_id_list)
+ context = {
+ 'app': 'Assets',
+ 'action': 'Bulk update asset',
+ 'form': self.form,
+ 'errors': self.errors,
+ 'assets_selected': self.assets_id_list,
+ 'assets': Asset.objects.all(),
+ }
+ kwargs.update(context)
+ return super(AssetBulkUpdateView, self).get_context_data(**kwargs)
class AssetUpdateView(AdminUserRequiredMixin, UpdateView):
@@ -164,44 +236,7 @@ class AssetDetailView(DetailView):
return super(AssetDetailView, self).get_context_data(**kwargs)
-class AssetModalListView(AdminUserRequiredMixin, ListView):
- paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
- model = Asset
- context_object_name = 'asset_modal_list'
- template_name = 'assets/asset_modal_list.html'
- def get_context_data(self, **kwargs):
- group_id = self.request.GET.get('group_id')
- plain_id_lists = self.request.GET.get('plain_id_lists')
- self.s = self.request.GET.get('plain_id_lists')
- assets = Asset.objects.all()
- if "," in str(self.s):
- self.plain_id_lists = [int(x) for x in self.s.split(',')]
- else:
- self.plain_id_lists = [self.s]
-
- if plain_id_lists:
- if "," in str(self.s):
- plain_id_lists = [int(x) for x in self.s.split(',')]
- else:
- plain_id_lists = [int(self.s)]
- context = {
- 'all_assets': plain_id_lists,
- }
- kwargs.update(context)
- if group_id:
- group = AssetGroup.objects.get(id=group_id)
- context = {
- 'all_assets': [x.id for x in group.assets.all()],
- 'assets': assets
- }
- kwargs.update(context)
- else:
- context = {
- 'assets': assets
- }
- kwargs.update(context)
- return super(AssetModalListView, self).get_context_data(**kwargs)
@method_decorator(csrf_exempt, name='dispatch')