manager: add roles export (fixes #29162)

This commit is contained in:
Benjamin Dauvergne 2018-12-18 12:27:33 +01:00
parent a26417bb76
commit 6f2b7f63bc
4 changed files with 42 additions and 2 deletions

View File

@ -1,3 +1,5 @@
import json
from django.core.exceptions import PermissionDenied
from django.utils.translation import ugettext_lazy as _
from django.views.generic import ListView, FormView, TemplateView
@ -15,7 +17,7 @@ from django_rbac.utils import get_role_model, get_permission_model, \
get_role_parenting_model, get_ou_model
from authentic2.utils import redirect
from authentic2 import hooks
from authentic2 import hooks, data_transfer
from . import tables, views, resources, forms, app_settings
@ -51,6 +53,7 @@ class RolesView(views.HideOUColumnMixin, RolesMixin, views.BaseTableView):
search_form_class = forms.RoleSearchForm
permissions = ['a2_rbac.search_role']
title = _('Roles')
formats = ['csv', 'json']
def get_queryset(self):
qs = super(RolesView, self).get_queryset()
@ -92,6 +95,18 @@ add = RoleAddView.as_view()
class RolesExportView(views.ExportMixin, RolesView):
resource_class = resources.RoleResource
def get(self, request, *args, **kwargs):
export_format = kwargs['format'].lower()
if export_format == 'json':
export = data_transfer.export_site(
data_transfer.ExportContext(
role_qs=self.get_table_data(),
export_roles=True,
export_ous=False))
return self.export_response(json.dumps(export), 'application/json', 'json')
return super(RolesExportView, self).get(request, *args, **kwargs)
export = RolesExportView.as_view()

View File

@ -60,7 +60,7 @@ urlpatterns = required(
name='a2-manager-roles'),
url(r'^roles/add/$', role_views.add,
name='a2-manager-role-add'),
url(r'^roles/export/(?P<format>csv)/$',
url(r'^roles/export/(?P<format>csv|json)/$',
role_views.export, name='a2-manager-roles-export'),
url(r'^roles/(?P<pk>\d+)/$', role_views.members,
name='a2-manager-role-members'),

View File

@ -363,6 +363,9 @@ class ExportMixin(object):
raise Http404('unknown format')
content = getattr(self.get_dataset(), export_format)
content_type = content_types[export_format]
return self.export_response(content, content_type, export_format)
def export_response(self, content, content_type, export_format):
response = HttpResponse(content, content_type=content_type)
filename = '%s%s.%s' % (self.get_export_prefix(), now().isoformat(),
export_format)

View File

@ -0,0 +1,22 @@
from utils import login
def test_manager_role_export(app, admin, ou1, role_ou1, ou2, role_ou2):
response = login(app, admin, 'a2-manager-roles')
export_response = response.click('JSON')
export = export_response.json
assert export.keys() == ['roles']
assert len(export['roles']) == 2
assert set([role['slug'] for role in export['roles']]) == set(['role_ou1', 'role_ou2'])
response.form.set('search-text', 'role_ou1')
search_response = response.form.submit()
export_response = search_response.click('JSON')
export = export_response.json
assert export.keys() == ['roles']
assert len(export['roles']) == 1
assert export['roles'][0]['slug'] == 'role_ou1'