From 2aa9aafdf6a263a0ba37501f7b61a280e18004ee Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 11 Apr 2017 17:29:53 +0800 Subject: [PATCH] [Change] Bulk update asset --- apps/assets/forms.py | 19 +- .../assets/_asset_bulk_update_modal.html | 66 ------ .../templates/assets/asset_bulk_update.html | 115 ++++++++++ apps/assets/templates/assets/asset_list.html | 14 +- .../templates/assets/asset_modal_update.html | 210 ------------------ apps/assets/urls/views_urls.py | 2 +- apps/assets/views/asset.py | 151 ++++++++----- 7 files changed, 234 insertions(+), 343 deletions(-) delete mode 100644 apps/assets/templates/assets/_asset_bulk_update_modal.html create mode 100644 apps/assets/templates/assets/asset_bulk_update.html delete mode 100644 apps/assets/templates/assets/asset_modal_update.html 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." %}

-
-
-

- - 三年质保(0) - -

-
-
-
-
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
-
-
- -
-
-
- -
-{% 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 %} +
+

选择需要修改属性

+
+ 全选 + {% for field in form %} + {{ field.label }} + {% endfor %} +
+
+{% if errors %} +
+ {{ errors }} +
+{% endif %} +
+ {% csrf_token %} +
+ +
+ + * required +
+
+ {% bootstrap_form form layout="horizontal" %} +
+
+ + +
+
+
+{% 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 %} - - -
-
-
- -
-
- {% for asset in assets_on_list %} - - {% endfor %} -

- {% for asset in assets_on_list %} - - {% endfor %} -

-
-
-
-
-
-
-

选择需要修改属性

- -
- - -
-
- {% csrf_token %} - - -
-
- - -
-
-
- - -{% 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')