0001-manager-allow-role-slug-edition-46656.patch
src/authentic2/manager/forms.py | ||
---|---|---|
610 | 610 | |
611 | 611 |
class RoleEditForm(SlugMixin, HideOUFieldMixin, LimitQuerysetFormMixin, CssClass, |
612 | 612 |
forms.ModelForm): |
613 | 613 |
ou = forms.ModelChoiceField(queryset=get_ou_model().objects, |
614 | 614 |
required=True, label=_('Organizational unit')) |
615 | 615 | |
616 | 616 |
class Meta: |
617 | 617 |
model = get_role_model() |
618 |
fields = ('name', 'ou', 'description') |
|
618 |
fields = ('name', 'slug', 'ou', 'description')
|
|
619 | 619 | |
620 | 620 | |
621 | 621 |
class OUEditForm(SlugMixin, CssClass, forms.ModelForm): |
622 | 622 |
def __init__(self, *args, **kwargs): |
623 | 623 |
super(OUEditForm, self).__init__(*args, **kwargs) |
624 | 624 |
self.fields['name'].label = _('label').title() |
625 | 625 | |
626 | 626 |
class Meta: |
src/authentic2/manager/role_views.py | ||
---|---|---|
25 | 25 |
from django.contrib.contenttypes.models import ContentType |
26 | 26 |
from django.db import transaction |
27 | 27 |
from django.db.models.query import Q, Prefetch |
28 | 28 |
from django.db.models import Count, F |
29 | 29 |
from django.contrib.auth import get_user_model |
30 | 30 | |
31 | 31 |
from django_rbac.utils import get_role_model, get_permission_model, get_ou_model |
32 | 32 | |
33 |
from authentic2.forms.profile import modelform_factory |
|
33 | 34 |
from authentic2.utils import redirect |
34 | 35 |
from authentic2 import hooks, data_transfer |
35 | 36 | |
36 | 37 |
from . import tables, views, resources, forms, app_settings |
37 | 38 |
from .utils import has_show_username |
38 | 39 | |
39 | 40 | |
40 | 41 |
class RolesMixin(object): |
... | ... | |
81 | 82 |
listing = RolesView.as_view() |
82 | 83 | |
83 | 84 | |
84 | 85 |
class RoleAddView(views.BaseAddView): |
85 | 86 |
template_name = 'authentic2/manager/role_add.html' |
86 | 87 |
model = get_role_model() |
87 | 88 |
title = _('Add role') |
88 | 89 |
success_view_name = 'a2-manager-role-members' |
90 |
exclude_fields = ('slug',) |
|
89 | 91 | |
90 | 92 |
def get_form_class(self): |
91 |
return forms.get_role_form_class() |
|
93 |
form = forms.get_role_form_class() |
|
94 |
fields = [x for x in form.base_fields.keys() if x not in self.exclude_fields] |
|
95 |
return modelform_factory(self.model, form=form, fields=fields) |
|
92 | 96 | |
93 | 97 |
def form_valid(self, form): |
94 | 98 |
response = super(RoleAddView, self).form_valid(form) |
95 | 99 |
hooks.call_hooks('event', name='manager-add-role', user=self.request.user, |
96 | 100 |
instance=form.instance, form=form) |
97 | 101 |
return response |
98 | 102 | |
99 | 103 |
src/authentic2/manager/tables.py | ||
---|---|---|
110 | 110 |
accessor='name', verbose_name=_('label')) |
111 | 111 |
ou = tables.Column() |
112 | 112 |
member_count = tables.Column(verbose_name=_('Direct member count'), |
113 | 113 |
orderable=False) |
114 | 114 | |
115 | 115 |
class Meta: |
116 | 116 |
model = get_role_model() |
117 | 117 |
attrs = {'class': 'main', 'id': 'role-table'} |
118 |
fields = ('name', 'ou', 'member_count') |
|
118 |
fields = ('name', 'slug', 'ou', 'member_count')
|
|
119 | 119 | |
120 | 120 | |
121 | 121 |
class PermissionTable(tables.Table): |
122 | 122 |
operation = tables.Column() |
123 | 123 |
scope = tables.Column() |
124 | 124 |
target = tables.Column() |
125 | 125 | |
126 | 126 |
class Meta: |
tests/test_manager.py | ||
---|---|---|
79 | 79 |
def test_manager_create_role(superuser_or_admin, app): |
80 | 80 |
non_admin_roles = Role.objects.exclude(slug__startswith='_') |
81 | 81 | |
82 | 82 |
ou_add = login(app, superuser_or_admin, reverse('a2-manager-role-add')) |
83 | 83 |
form = ou_add.form |
84 | 84 |
assert 'name' in form.fields |
85 | 85 |
assert 'description' in form.fields |
86 | 86 |
assert 'ou' not in form.fields |
87 |
assert 'slug' not in form.fields |
|
87 | 88 |
form.set('name', 'New role') |
88 | 89 |
response = form.submit().follow() |
89 | 90 |
assert non_admin_roles.count() == 1 |
90 | 91 |
role = non_admin_roles.get() |
91 | 92 |
assert response.request.path == reverse('a2-manager-role-members', kwargs={'pk': role.pk}) |
92 | 93 |
role_list = app.get(reverse('a2-manager-roles')) |
93 | 94 |
assert 'New role' in role_list |
94 | 95 | |
... | ... | |
110 | 111 |
assert 'description' in form.fields |
111 | 112 |
assert 'ou' in form.fields |
112 | 113 |
options = [o[2] for o in form.fields['ou'][0].options] |
113 | 114 |
assert len(options) == 3 |
114 | 115 |
assert '---------' in options |
115 | 116 |
assert 'New OU' in options |
116 | 117 | |
117 | 118 | |
119 |
def test_manager_edit_role_slug(superuser_or_admin, app, simple_role): |
|
120 |
assert Role.objects.get(name='simple role').slug == 'simple-role' |
|
121 |
resp = login(app, superuser_or_admin, |
|
122 |
reverse('a2-manager-role-edit', kwargs={'pk': simple_role.pk})) |
|
123 |
form = resp.form |
|
124 |
assert 'slug' in form.fields |
|
125 |
form.set('slug', 'new-simple-role-slug') |
|
126 |
form.submit().follow() |
|
127 |
assert Role.objects.get(name='simple role').slug == 'new-simple-role-slug' |
|
128 | ||
129 | ||
118 | 130 |
def test_manager_user_password_reset(app, superuser, simple_user): |
119 | 131 |
resp = login(app, superuser, |
120 | 132 |
reverse('a2-manager-user-detail', kwargs={'pk': simple_user.pk})) |
121 | 133 |
assert len(mail.outbox) == 0 |
122 | 134 |
resp = resp.forms['object-actions'].submit('password_reset') |
123 | 135 |
assert 'A mail was sent to' in resp |
124 | 136 |
assert len(mail.outbox) == 1 |
125 | 137 |
url = get_link_from_mail(mail.outbox[0]) |
... | ... | |
361 | 373 |
# admin enroled only in the Manager role, other roles are inherited |
362 | 374 |
assert len(q('table tbody tr td.via')) == 6 |
363 | 375 |
assert len(q('table tbody tr td.via:empty')) == 2 |
364 | 376 |
for elt in q('table tbody td.name a'): |
365 | 377 |
assert 'Manager' in elt.text or elt.text == 'simple role' |
366 | 378 | |
367 | 379 |
# test role listing |
368 | 380 |
response = app.get('/manage/roles/') |
381 |
assert [x.text for x in response.pyquery('td.slug')] == ['simple-role'] |
|
369 | 382 |
assert 'search-ou' not in response.form.fields |
370 | 383 |
q = response.pyquery.remove_namespaces() |
371 | 384 |
assert len(q('table tbody tr')) == 1 |
372 | 385 |
assert q('table tbody td.name').text() == u'simple role' |
373 | 386 | |
374 | 387 |
response.form.set('search-internals', True) |
375 | 388 |
response = response.form.submit() |
376 | 389 |
q = response.pyquery.remove_namespaces() |
377 |
- |