diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html index 36401db06..d8ba6c7af 100644 --- a/apps/users/templates/users/user_list.html +++ b/apps/users/templates/users/user_list.html @@ -5,8 +5,8 @@
PDF - - Excel + + CSV
@@ -88,13 +88,24 @@ $(document).ready(function(){ }; var table = jumpserver.initDataTable(options); - $('.buttons-pdf').click(function () { + $('.buttons-csv').click(function () { var users = []; var rows = table.rows('.selected').data(); $.each(rows, function (index, obj) { users.push(obj.id) }); - console.log(users) + $.ajax({ + url: "{% url "users:export-user-csv" %}", + method: 'POST', + data: JSON.stringify({users_id: users}), + dataType: "json", + success: function (data, textStatus) { + window.open(data.redirect) + }, + error: function () { + toastr.error('Export failed'); + } + }) }); }).on('click', '#btn_bulk_update', function(){ diff --git a/apps/users/urls/views_urls.py b/apps/users/urls/views_urls.py index cae740665..a80b33d38 100644 --- a/apps/users/urls/views_urls.py +++ b/apps/users/urls/views_urls.py @@ -40,5 +40,5 @@ urlpatterns = [ name='user-group-asset-permission-create'), url(r'^user-group/(?P[0-9]+)/assets', views.UserGroupGrantedAssetView.as_view(), name='user-group-granted-asset'), - url(r'down-csv/', views.down_csv), + url(r'^export/user/csv/', views.ExportUserCsvView.as_view(), name='export-user-csv'), ] diff --git a/apps/users/views.py b/apps/users/views.py index 0057d9f61..2f206fc8b 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -1,22 +1,25 @@ # ~*~ coding: utf-8 ~*~ from __future__ import unicode_literals -from io import BytesIO +import json +import uuid import unicodecsv as csv from django import forms from django.utils import timezone +from django.core.cache import cache from django.contrib.auth import login as auth_login, logout as auth_logout from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.messages.views import SuccessMessageMixin from django.core.files.storage import default_storage -from django.http import HttpResponseRedirect, HttpResponse +from django.http import HttpResponseRedirect, HttpResponse, JsonResponse from django.shortcuts import reverse, redirect from django.utils.decorators import method_decorator from django.utils.translation import ugettext as _ from django.urls import reverse_lazy +from django.views import View from django.views.decorators.cache import never_cache -from django.views.decorators.csrf import csrf_protect +from django.views.decorators.csrf import csrf_protect, csrf_exempt from django.views.decorators.debug import sensitive_post_parameters from django.views.generic.base import TemplateView from django.views.generic.list import ListView @@ -33,6 +36,7 @@ from .hands import write_login_log_async from . import forms + logger = get_logger(__name__) @@ -533,16 +537,36 @@ class BulkImportUserView(AdminUserRequiredMixin, JSONResponseMixin, FormView): return self.render_json_response(data) -def down_csv(request): - response = HttpResponse(content_type='application/csv') - response['Content-Disposition'] = 'attachment; filename="users-%s.csv"' % \ - timezone.localtime(timezone.now()).strftime('%Y-%m-%d') - writer = csv.writer(response) - header = [u"你好", 'username', 'email', - _('user group'), _('role'), _('phone'), _('wechat'), _('comment')] - writer.writerow(header) - for user in User.objects.all(): - writer.writerow([user.name, user.username, user.email, ','.join([group.name for group in user.groups.all()]), - user.role, user.phone, user.wechat, user.comment]) - return response +@method_decorator(csrf_exempt, name='dispatch') +class ExportUserCsvView(View): + def get(self, request, *args, **kwargs): + spm = request.GET.get('spm', '') + print(spm) + users_id = cache.get(spm) + if not users_id and not isinstance(users_id, list): + return HttpResponse('May be expired', status=404) + users = User.objects.filter(id__in=users_id) + filename = 'users-%s.csv' % timezone.localtime(timezone.now()).strftime('%Y-%m-%d_%H:%M:%D') + response = HttpResponse(content_type='application/csv') + response['Content-Disposition'] = 'attachment; filename="%s"' % filename + writer = csv.writer(response, delimiter=str(","), lineterminator='\n', + quoting=csv.QUOTE_ALL, dialect='excel') + header = [_("name"), _('username'), _('email'), _('user group'), + _('role'), _('phone'), _('wechat'), _('comment')] + writer.writerow(header) + for user in users: + writer.writerow([user.name, user.username, user.email, ','.join([group.name for group in user.groups.all()]), + user.role, user.phone, user.wechat, user.comment]) + return response + + def post(self, request, *args, **kwargs): + try: + print(request.body) + users_id = json.loads(request.body).get('users_id', []) + except ValueError: + return HttpResponse('Json object not valid', status=400) + spm = uuid.uuid4().get_hex() + cache.set(spm, users_id, 300) + url = reverse('users:export-user-csv') + '?spm=%s' % spm + return JsonResponse({'redirect': url})