Projet

Général

Profil

0004-manager-add-roles-export-fixes-29162.patch

Benjamin Dauvergne, 18 décembre 2018 15:56

Télécharger (4,48 ko)

Voir les différences:

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
src/authentic2/manager/role_views.py
1
import json
2

  
1 3
from django.core.exceptions import PermissionDenied
2 4
from django.utils.translation import ugettext_lazy as _
3 5
from django.views.generic import ListView, FormView, TemplateView
......
15 17
    get_role_parenting_model, get_ou_model
16 18

  
17 19
from authentic2.utils import redirect
18
from authentic2 import hooks
20
from authentic2 import hooks, data_transfer
19 21

  
20 22
from . import tables, views, resources, forms, app_settings
21 23

  
......
51 53
    search_form_class = forms.RoleSearchForm
52 54
    permissions = ['a2_rbac.search_role']
53 55
    title = _('Roles')
56
    formats = ['csv', 'json']
54 57

  
55 58
    def get_queryset(self):
56 59
        qs = super(RolesView, self).get_queryset()
......
92 95
class RolesExportView(views.ExportMixin, RolesView):
93 96
    resource_class = resources.RoleResource
94 97

  
98
    def get(self, request, *args, **kwargs):
99
        export_format = kwargs['format'].lower()
100
        if export_format == 'json':
101
            export = data_transfer.export_site(
102
                data_transfer.ExportContext(
103
                    role_qs=self.get_table_data(),
104
                    export_roles=True,
105
                    export_ous=False))
106
            return self.export_response(json.dumps(export), 'application/json', 'json')
107
        return super(RolesExportView, self).get(request, *args, **kwargs)
108

  
109

  
95 110
export = RolesExportView.as_view()
96 111

  
97 112

  
src/authentic2/manager/urls.py
60 60
            name='a2-manager-roles'),
61 61
        url(r'^roles/add/$', role_views.add,
62 62
            name='a2-manager-role-add'),
63
        url(r'^roles/export/(?P<format>csv)/$',
63
        url(r'^roles/export/(?P<format>csv|json)/$',
64 64
            role_views.export, name='a2-manager-roles-export'),
65 65
        url(r'^roles/(?P<pk>\d+)/$', role_views.members,
66 66
            name='a2-manager-role-members'),
src/authentic2/manager/views.py
363 363
            raise Http404('unknown format')
364 364
        content = getattr(self.get_dataset(), export_format)
365 365
        content_type = content_types[export_format]
366
        return self.export_response(content, content_type, export_format)
367

  
368
    def export_response(self, content, content_type, export_format):
366 369
        response = HttpResponse(content, content_type=content_type)
367 370
        filename = '%s%s.%s' % (self.get_export_prefix(), now().isoformat(),
368 371
                                export_format)
tests/test_role_manager.py
1
from utils import login
2

  
3

  
4
def test_manager_role_export(app, admin, ou1, role_ou1, ou2, role_ou2):
5
    response = login(app, admin, '/manage/roles/')
6

  
7
    export_response = response.click('JSON')
8
    export = export_response.json
9

  
10
    assert export.keys() == ['roles']
11
    assert len(export['roles']) == 2
12
    assert set([role['slug'] for role in export['roles']]) == set(['role_ou1', 'role_ou2'])
13

  
14
    response.form.set('search-text', 'role_ou1')
15
    search_response = response.form.submit()
16

  
17
    export_response = search_response.click('JSON')
18
    export = export_response.json
19

  
20
    assert export.keys() == ['roles']
21
    assert len(export['roles']) == 1
22
    assert export['roles'][0]['slug'] == 'role_ou1'
0
-