0001-manager-use-selected-ou-by-default-in-import-roles-f.patch
src/authentic2/manager/role_views.py | ||
---|---|---|
12 | 12 |
# GNU Affero General Public License for more details. |
13 | 13 |
# |
14 | 14 |
# You should have received a copy of the GNU Affero General Public License |
15 | 15 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | 16 | |
17 | 17 |
import json |
18 | 18 | |
19 | 19 |
from django.core.exceptions import PermissionDenied, ValidationError |
20 |
from django.http import QueryDict |
|
20 | 21 |
from django.utils.translation import ugettext_lazy as _ |
21 | 22 |
from django.urls import reverse |
22 | 23 |
from django.views.generic import FormView, TemplateView |
23 | 24 |
from django.views.generic.detail import SingleObjectMixin |
24 | 25 |
from django.contrib import messages |
25 | 26 |
from django.contrib.contenttypes.models import ContentType |
26 | 27 |
from django.db import transaction |
27 | 28 |
from django.db.models.query import Q, Prefetch |
... | ... | |
31 | 32 |
from django_rbac.utils import get_role_model, get_permission_model, get_ou_model |
32 | 33 | |
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 | |
40 |
# https://github.com/MongoEngine/django-mongoengine/blob/master/django_mongoengine/views/edit.py |
|
41 |
import django.views.generic.edit |
|
42 | ||
43 |
try: |
|
44 |
FormMixin = django.views.generic.edit.FormMixinBase |
|
45 |
except AttributeError: |
|
46 |
# django >= 1.10 |
|
47 |
FormMixin = django.views.generic.edit.FormMixin |
|
48 | ||
39 | 49 | |
40 | 50 |
class RolesMixin(object): |
41 | 51 |
service_roles = True |
42 | 52 |
admin_roles = False |
43 | 53 | |
44 | 54 |
def get_queryset(self): |
45 | 55 |
qs = super(RolesMixin, self).get_queryset() |
46 | 56 |
qs = qs.select_related('ou') |
... | ... | |
509 | 519 |
hooks.call_hooks('event', name='remove-remove-admin-role-user', user=self.request.user, |
510 | 520 |
role=self.object, admin=self.user) |
511 | 521 |
return redirect(self.request, self.success_url) |
512 | 522 | |
513 | 523 |
remove_admin_user = RoleRemoveAdminUserView.as_view() |
514 | 524 | |
515 | 525 | |
516 | 526 |
class RolesImportView(views.PermissionMixin, views.TitleMixin, views.MediaMixin, views.FormNeedsRequest, |
517 |
FormView): |
|
527 |
FormView, FormMixin):
|
|
518 | 528 |
form_class = forms.RolesImportForm |
519 | 529 |
model = get_role_model() |
520 | 530 |
template_name = 'authentic2/manager/import_form.html' |
521 | 531 |
title = _('Roles Import') |
522 | 532 | |
533 |
def get_initial(self): |
|
534 |
result = super().get_initial() |
|
535 |
query_dict = QueryDict(self.request.environ.get('QUERY_STRING')) |
|
536 |
selected_ou = query_dict.get('search-ou') |
|
537 |
if selected_ou: |
|
538 |
result.update({'ou': selected_ou}) |
|
539 |
return result |
|
540 | ||
523 | 541 |
def post(self, request, *args, **kwargs): |
524 | 542 |
if not self.can_add: |
525 | 543 |
raise PermissionDenied |
526 | 544 |
return super().post(request, *args, **kwargs) |
527 | 545 | |
528 | 546 |
def form_valid(self, form): |
529 | 547 |
self.ou = form.cleaned_data['ou'] |
530 | 548 |
try: |
src/authentic2/manager/templates/authentic2/manager/roles.html | ||
---|---|---|
10 | 10 |
{% if view.can_add %} |
11 | 11 |
<a href="{% url "a2-manager-role-add" %}" rel="popup">{% trans "Add role" %}</a> |
12 | 12 |
{% else %} |
13 | 13 |
<a href="#" class="disabled" rel="popup">{% trans "Add role" %}</a> |
14 | 14 |
{% endif %} |
15 | 15 |
<ul class="extra-actions-menu"> |
16 | 16 |
<li><a download href="{% url 'a2-manager-roles-export' format="json" %}?{{ request.GET.urlencode }}">{% trans 'Export' %}</a></li> |
17 | 17 |
{% if view.can_add %} |
18 |
<li><a href="{% url 'a2-manager-roles-import' %}" rel="popup">{% trans 'Import' %}</a></li> |
|
18 |
<li><a href="{% url 'a2-manager-roles-import' %}?{{ request.GET.urlencode }}" rel="popup">{% trans 'Import' %}</a></li>
|
|
19 | 19 |
{% endif %} |
20 | 20 |
</ul> |
21 | 21 |
</span> |
22 | 22 |
{% endblock %} |
23 | 23 | |
24 | 24 |
{% block sidebar %} |
25 | 25 |
<aside id="sidebar"> |
26 | 26 |
{% include "authentic2/manager/search_form.html" %} |
tests/test_role_manager.py | ||
---|---|---|
156 | 156 |
assert Role.objects.filter(ou=ou1).count() == 4 |
157 | 157 | |
158 | 158 |
# in case ous are present in export file, they must not be imported |
159 | 159 |
export['ous'] = [{ |
160 | 160 |
"uuid": "27255f404cb140df9a577da76b59f285", |
161 | 161 |
"slug": "should_not_exist", |
162 | 162 |
"name": "should_not_exist", |
163 | 163 |
}] |
164 |
resp = app.get('/manage/roles/') # unselect ou1 |
|
164 | 165 |
resp = resp.click('Import') |
165 | 166 |
resp.form['site_json'] = Upload('export.json', json.dumps(export).encode(), 'application/json') |
166 | 167 |
resp = resp.form.submit().follow() |
167 | 168 | |
168 | 169 |
assert not OrganizationalUnit.objects.filter(slug="should_not_exist").exists() |
169 | 170 | |
170 | 171 | |
171 | 172 |
def test_manager_role_import_single_ou(app, admin, simple_role): |
... | ... | |
183 | 184 |
assert not 'Organizational unit' in resp.text |
184 | 185 |
assert resp.form['ou'].attrs['type'] == 'hidden' |
185 | 186 | |
186 | 187 |
resp.form['site_json'] = Upload('export.json', json.dumps(export).encode(), 'application/json') |
187 | 188 |
resp = resp.form.submit().follow() |
188 | 189 | |
189 | 190 |
imported_role = Role.objects.get(slug=simple_role.slug) |
190 | 191 |
assert imported_role.ou == simple_role.ou |
192 | ||
193 | ||
194 |
def test_manager_role_import_selected_ou(app, admin, ou1, ou2): |
|
195 |
response = login(app, admin, 'a2-manager-roles') |
|
196 |
response.form.set('search-ou', ou2.pk) |
|
197 |
response = response.form.submit() |
|
198 |
response = response.click('Import') |
|
199 |
assert response.pyquery.find('select#id_ou option[selected]')[0].text == 'OU2' |
|
191 |
- |