export csv

pull/530/head
ibuler 2016-11-23 19:09:11 +08:00
parent 7dfde3a3c5
commit 5af97c969b
3 changed files with 55 additions and 20 deletions

View File

@ -5,8 +5,8 @@
<div class="dt-buttons btn-group"> <div class="dt-buttons btn-group">
<a class="btn btn-default buttons-pdf" tabindex="0" href="#"> <a class="btn btn-default buttons-pdf" tabindex="0" href="#">
<span>PDF</span></a> <span>PDF</span></a>
<a class="btn btn-default buttons-excel" tabindex="0" href="#"> <a class="btn btn-default buttons-csv" tabindex="0" href="#">
<span>Excel</span> <span>CSV</span>
</a> </a>
</div> </div>
</div> </div>
@ -88,13 +88,24 @@ $(document).ready(function(){
}; };
var table = jumpserver.initDataTable(options); var table = jumpserver.initDataTable(options);
$('.buttons-pdf').click(function () { $('.buttons-csv').click(function () {
var users = []; var users = [];
var rows = table.rows('.selected').data(); var rows = table.rows('.selected').data();
$.each(rows, function (index, obj) { $.each(rows, function (index, obj) {
users.push(obj.id) 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(){ }).on('click', '#btn_bulk_update', function(){

View File

@ -40,5 +40,5 @@ urlpatterns = [
name='user-group-asset-permission-create'), name='user-group-asset-permission-create'),
url(r'^user-group/(?P<pk>[0-9]+)/assets', views.UserGroupGrantedAssetView.as_view(), url(r'^user-group/(?P<pk>[0-9]+)/assets', views.UserGroupGrantedAssetView.as_view(),
name='user-group-granted-asset'), 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'),
] ]

View File

@ -1,22 +1,25 @@
# ~*~ coding: utf-8 ~*~ # ~*~ coding: utf-8 ~*~
from __future__ import unicode_literals from __future__ import unicode_literals
from io import BytesIO import json
import uuid
import unicodecsv as csv import unicodecsv as csv
from django import forms from django import forms
from django.utils import timezone 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 import login as auth_login, logout as auth_logout
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.core.files.storage import default_storage 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.shortcuts import reverse, redirect
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.views import View
from django.views.decorators.cache import never_cache 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.decorators.debug import sensitive_post_parameters
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from django.views.generic.list import ListView from django.views.generic.list import ListView
@ -33,6 +36,7 @@ from .hands import write_login_log_async
from . import forms from . import forms
logger = get_logger(__name__) logger = get_logger(__name__)
@ -533,16 +537,36 @@ class BulkImportUserView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
return self.render_json_response(data) return self.render_json_response(data)
def down_csv(request): @method_decorator(csrf_exempt, name='dispatch')
response = HttpResponse(content_type='application/csv') class ExportUserCsvView(View):
response['Content-Disposition'] = 'attachment; filename="users-%s.csv"' % \ def get(self, request, *args, **kwargs):
timezone.localtime(timezone.now()).strftime('%Y-%m-%d') spm = request.GET.get('spm', '')
writer = csv.writer(response) print(spm)
header = [u"你好", 'username', 'email', users_id = cache.get(spm)
_('user group'), _('role'), _('phone'), _('wechat'), _('comment')] if not users_id and not isinstance(users_id, list):
writer.writerow(header) return HttpResponse('May be expired', status=404)
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
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})