From e90bfa3de090dbce31299443edbc0a3fc0728765 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 18 Dec 2018 12:27:33 +0100 Subject: [PATCH 4/5] manager: add roles export (fixes #29162) --- src/authentic2/manager/role_views.py | 17 ++++++++++++++++- src/authentic2/manager/urls.py | 2 +- src/authentic2/manager/views.py | 3 +++ tests/test_role_manager.py | 22 ++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/test_role_manager.py diff --git a/src/authentic2/manager/role_views.py b/src/authentic2/manager/role_views.py index 00996213..44c9f8e8 100644 --- a/src/authentic2/manager/role_views.py +++ b/src/authentic2/manager/role_views.py @@ -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() diff --git a/src/authentic2/manager/urls.py b/src/authentic2/manager/urls.py index 6149bc88..0c1df367 100644 --- a/src/authentic2/manager/urls.py +++ b/src/authentic2/manager/urls.py @@ -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/(?Pcsv)/$', + url(r'^roles/export/(?Pcsv|json)/$', role_views.export, name='a2-manager-roles-export'), url(r'^roles/(?P\d+)/$', role_views.members, name='a2-manager-role-members'), diff --git a/src/authentic2/manager/views.py b/src/authentic2/manager/views.py index 56ef47d9..59567aa9 100644 --- a/src/authentic2/manager/views.py +++ b/src/authentic2/manager/views.py @@ -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) diff --git a/tests/test_role_manager.py b/tests/test_role_manager.py new file mode 100644 index 00000000..691db56a --- /dev/null +++ b/tests/test_role_manager.py @@ -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, '/manage/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' -- 2.18.0