Projet

Général

Profil

0001-manager-use-selected-ou-by-default-in-import-roles-f.patch

Nicolas Roche (absent jusqu'au 3 avril), 22 septembre 2020 12:04

Télécharger (6,22 ko)

Voir les différences:

Subject: [PATCH] manager: use selected ou by default in import roles form
 (#46642)

 src/authentic2/manager/role_views.py          | 20 ++++++++++++++++++-
 .../templates/authentic2/manager/roles.html   |  2 +-
 tests/test_role_manager.py                    |  9 +++++++++
 3 files changed, 29 insertions(+), 2 deletions(-)
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
-