0001-manager-group-roles-by-OU-on-user-page-24397.patch
src/authentic2/manager/templates/authentic2/manager/user_detail.html | ||
---|---|---|
65 | 65 | |
66 | 66 |
{% block other_actions %}{{ block.super }}{% endblock %} |
67 | 67 | |
68 | 68 |
{% if roles_by_ou or can_change_roles %} |
69 | 69 |
<div class="user-roles"> |
70 | 70 |
<h3>{% trans "Roles" %}</h3> |
71 | 71 |
<ul> |
72 | 72 |
{% for ou, ou_roles in roles_by_ou.items %} |
73 |
{% if multiple_ou %} |
|
73 |
{% if have_roles_on_multiple_ou %}
|
|
74 | 74 |
<li>{% if ou %}{{ ou }}{% else %}{% trans "All organizational units" %}{% endif %} |
75 | 75 |
<ul> |
76 | 76 |
{% endif %} |
77 | 77 |
{% for role in ou_roles %} |
78 | 78 |
<li {% if role.description %}title="{{ role.description }}"{% endif %}> |
79 | 79 |
<a href="{% url "a2-manager-role-members" pk=role.pk %}">{{ role }}</a></li> |
80 | 80 |
{% endfor %} |
81 |
{% if multiple_ou %} |
|
81 |
{% if have_roles_on_multiple_ou %}
|
|
82 | 82 |
</ul> |
83 | 83 |
</li> |
84 | 84 |
{% endif %} |
85 | 85 |
{% endfor %} |
86 | 86 |
</ul> |
87 | 87 | |
88 | 88 |
{% if can_change_roles %} |
89 | 89 |
<button onclick="window.location.href = '{% url "a2-manager-user-roles" pk=object.pk %}?search-ou={% firstof object.ou.pk default_ou.pk %}'; return false">{% trans "Modify roles" %}</button> |
src/authentic2/manager/user_views.py | ||
---|---|---|
336 | 336 |
def get_context_data(self, **kwargs): |
337 | 337 |
kwargs['default_ou'] = get_default_ou |
338 | 338 |
roles = self.object.roles_and_parents().order_by('ou__name', 'name') |
339 | 339 |
roles_by_ou = collections.OrderedDict() |
340 | 340 |
for role in roles: |
341 | 341 |
roles_by_ou.setdefault(role.ou.name if role.ou else '', []).append(role) |
342 | 342 |
kwargs['roles'] = roles |
343 | 343 |
kwargs['roles_by_ou'] = roles_by_ou |
344 |
kwargs['have_roles_on_multiple_ou'] = len(roles_by_ou.keys()) > 1 |
|
344 | 345 |
# show modify roles button only if something is possible |
345 | 346 |
kwargs['can_change_roles'] = self.has_perm_on_roles(self.request.user, self.object) |
346 | 347 |
user_data = [] |
347 | 348 |
user_data += [data for datas in hooks.call_hooks('manager_user_data', self, self.object) |
348 | 349 |
for data in datas] |
349 | 350 |
kwargs['user_data'] = user_data |
350 | 351 |
ctx = super(UserDetailView, self).get_context_data(**kwargs) |
351 | 352 |
return ctx |
tests/test_manager.py | ||
---|---|---|
127 | 127 |
resp = app.get('/logout/').maybe_follow() |
128 | 128 |
resp = app.get(relative_url, status=200) |
129 | 129 |
resp.form.set('new_password1', '1234==aA') |
130 | 130 |
resp.form.set('new_password2', '1234==aA') |
131 | 131 |
resp = resp.form.submit().follow() |
132 | 132 |
assert str(app.session['_auth_user_id']) == str(simple_user.pk) |
133 | 133 | |
134 | 134 | |
135 |
def test_manager_user_detail_by_uuid(app, superuser, simple_user): |
|
135 |
def test_manager_user_detail_by_uuid(app, superuser, simple_user, simple_role): |
|
136 |
simple_user.roles.add(simple_role) |
|
136 | 137 |
url = reverse('a2-manager-user-by-uuid-detail', kwargs={'slug': simple_user.uuid}) |
137 | 138 |
resp = login(app, superuser, url) |
138 | 139 |
assert '<h3>Actions</h3>' in resp.text |
139 | 140 |
assert simple_user.first_name.encode('utf-8') in resp.content |
141 |
assert 'simple role' in resp.html.find('div', {'class': 'user-roles'}).ul.li.text |
|
142 | ||
143 |
# if user has roles on multiple, roles are grouped by OU |
|
144 |
simple_user.roles.add(Role.objects.create(name='global role', slug='global-role', ou=None)) |
|
145 |
resp = app.get(url) |
|
146 |
html_roles = resp.html.find('div', {'class': 'user-roles'}) |
|
147 |
assert 'Default organizational unit' in html_roles.ul.find_all('li', recursive=False)[0].next |
|
148 |
assert 'simple role' in html_roles.ul.find_all('li', recursive=False)[0].ul.li.text |
|
149 |
assert 'All organizational units' in html_roles.ul.find_all('li', recursive=False)[1].next |
|
150 |
assert 'global role' in html_roles.ul.find_all('li', recursive=False)[1].ul.li.text |
|
140 | 151 | |
141 | 152 | |
142 | 153 |
def test_manager_user_edit_by_uuid(app, superuser, simple_user): |
143 | 154 |
url = reverse('a2-manager-user-by-uuid-edit', kwargs={'slug': simple_user.uuid}) |
144 | 155 |
resp = login(app, superuser, url) |
145 | 156 |
assert '<h3>Actions</h3>' not in resp.text |
146 | 157 |
assert simple_user.first_name.encode('utf-8') in resp.content |
147 | 158 | |
148 |
- |