Projet

Général

Profil

0002-manager-add-option-groups-to-role-member-add-field-6.patch

Valentin Deniaud, 05 janvier 2022 15:03

Télécharger (8,24 ko)

Voir les différences:

Subject: [PATCH 2/2] manager: add option groups to role member add field
 (#60271)

 src/authentic2/manager/role_views.py | 34 +++++++++++++----------
 tests/test_role_manager.py           | 40 +++++++++++++++++-----------
 2 files changed, 45 insertions(+), 29 deletions(-)
src/authentic2/manager/role_views.py
836 836
        role_qs = role_qs.exclude(pk__in=children.filter(is_direct=True))
837 837
        role_qs = self.filter_queryset(role_qs, search_term, ['name', 'service__name', 'ou__name'])
838 838

  
839
        role_paginator = Paginator(role_qs, 10)
839
        role_paginator = Paginator(role_qs, 10, allow_empty_first_page=False)
840 840
        try:
841 841
            role_page = role_paginator.page(page_number)
842 842
        except EmptyPage:
......
844 844
            has_next = False
845 845
        else:
846 846
            has_next = role_page.has_next()
847
            role_page = [self.get_role_choice(role) for role in role_page]
848
            if page_number == 1:
849
                role_page = [{'text': _('Roles'), 'children': role_page}]
847 850

  
848 851
        user_page = []
849 852
        if not has_next:
......
853 856
                user_qs, search_term, ['username', 'first_name', 'last_name', 'email']
854 857
            )
855 858

  
856
            page_number = page_number - role_paginator.num_pages + 1
857
            user_paginator = Paginator(user_qs, 10)
859
            if role_paginator.num_pages != 0:
860
                page_number = page_number - role_paginator.num_pages + 1
861
            user_paginator = Paginator(user_qs, 10, allow_empty_first_page=False)
858 862
            try:
859 863
                user_page = user_paginator.page(page_number)
860 864
            except EmptyPage:
861 865
                has_next = False
862 866
            else:
863 867
                has_next = user_page.has_next()
868
                user_page = [self.get_user_choice(user) for user in user_page]
869
                if page_number == 1:
870
                    user_page = [{'text': _('Users'), 'children': user_page}]
864 871

  
865 872
        return JsonResponse(
866 873
            {
867
                "results": [self.get_choice(obj) for obj in list(role_page) + list(user_page)],
874
                "results": role_page + user_page,
868 875
                "more": has_next,
869 876
            }
870 877
        )
......
876 883
            lookups &= reduce(Q.__or__, (Q(**{'%s__icontains' % field: term}) for field in search_fields))
877 884
        return qs.filter(lookups)
878 885

  
879
    def get_choice(self, obj):
880
        if isinstance(obj, Role):
881
            text = str(obj)
882
            if obj.ou and get_ou_count() > 1:
883
                text = f'{obj.ou} - {obj}'
884
            key = 'role-%s'
885
        elif isinstance(obj, User):
886
            text = label_from_user(obj)
887
            key = 'user-%s'
888
        return {'id': key % obj.pk, 'text': text}
886
    def get_role_choice(self, role):
887
        text = str(role)
888
        if role.ou and get_ou_count() > 1:
889
            text = f'{role.ou} - {role}'
890
        return {'id': 'role-%s' % role.pk, 'text': text}
891

  
892
    def get_user_choice(self, user):
893
        text = label_from_user(user)
894
        return {'id': 'user-%s' % user.pk, 'text': text}
889 895

  
890 896

  
891 897
user_or_role_select2 = UserOrRoleSelect2View.as_view()
tests/test_role_manager.py
495 495
    resp = login(app, superuser, url)
496 496

  
497 497
    select2_json = request_select2(app, resp)
498
    assert len(select2_json['results']) == 10
498
    assert len(select2_json['results']) == 1
499
    assert select2_json['results'][0]['text'] == 'Roles'
500
    assert len(select2_json['results'][0]['children']) == 10
499 501
    assert select2_json['more'] is True
500 502

  
501 503
    select2_json = request_select2(app, resp, fetch_all=True)
502
    assert len(select2_json['results']) == 17
503
    choices = [x['text'] for x in select2_json['results']]
504
    choices = [x['text'] for k in select2_json['results'] for x in k.get('children') or (k,)]
504 505
    assert choices == [
505 506
        'Default organizational unit - Managers of role "simple role"',
506 507
        'Default organizational unit - Roles - Default organizational unit',
......
522 523
    ]
523 524

  
524 525
    select2_json = request_select2(app, resp, term='user')
525
    choices = [x['text'] for x in select2_json['results']]
526
    assert choices == [
526
    assert len(select2_json['results']) == 2
527
    assert select2_json['results'][0]['text'] == 'Roles'
528
    role_choices = [x['text'] for x in select2_json['results'][0]['children']]
529
    assert role_choices == [
527 530
        'Default organizational unit - Users - Default organizational unit',
528 531
        'OU1 - Users - OU1',
529 532
        'Manager of users',
533
    ]
534
    assert select2_json['results'][1]['text'] == 'Users'
535
    user_choices = [x['text'] for x in select2_json['results'][1]['children']]
536
    assert user_choices == [
530 537
        'Jôhn Dôe - user@example.net - user',
531 538
        'super user - superuser@example.net - superuser',
532 539
    ]
533 540
    assert select2_json['more'] is False
534 541

  
535 542
    select2_json = request_select2(app, resp, term='Manager')
536
    assert len(select2_json['results']) == 8
543
    assert len(select2_json['results'][0]['children']) == 8
537 544
    select2_json = request_select2(app, resp, term='Manager of')
538
    assert len(select2_json['results']) == 7
545
    assert len(select2_json['results'][0]['children']) == 7
539 546
    select2_json = request_select2(app, resp, term='Manager of serv')
540
    assert len(select2_json['results']) == 1
547
    assert len(select2_json['results'][0]['children']) == 1
541 548

  
542 549
    for i in range(25):
543 550
        Role.objects.create(name=f'test_role_{i}')
544 551
    select2_json = request_select2(app, resp, term='test_role_', fetch_all=True)
545
    assert len(select2_json['results']) == 25
552
    flat_results = [x for k in select2_json['results'] for x in k.get('children') or (k,)]
553
    assert len(flat_results) == 25
546 554

  
547 555
    for i in range(25):
548 556
        User.objects.create(username=f'test_user_{i}')
549 557
    select2_json = request_select2(app, resp, term='test_user_', fetch_all=True)
550
    assert len(select2_json['results']) == 25
558
    flat_results = [x for k in select2_json['results'] for x in k.get('children') or (k,)]
559
    assert len(flat_results) == 25
551 560

  
552 561
    for i in range(10):
553 562
        Role.objects.create(name=f'test_xxx_{i}')
554 563
    User.objects.create(username='test_xxx_10')
555 564
    select2_json = request_select2(app, resp, term='test_xxx_')
556
    assert len(select2_json['results']) == 11
565
    flat_results = [x for k in select2_json['results'] for x in k.get('children') or (k,)]
566
    assert len(flat_results) == 11
557 567

  
558 568

  
559 569
def test_role_members_user_role_add_remove(app, superuser, settings, simple_role, simple_user, role_ou1):
......
561 571
    resp = login(app, superuser, url)
562 572

  
563 573
    select2_json = request_select2(app, resp, term='Jôhn')
564
    assert len(select2_json['results']) == 1
574
    assert len(select2_json['results'][0]['children']) == 1
565 575
    form = resp.forms['add-member']
566
    form['user_or_role'].force_value(select2_json['results'][0]['id'])
576
    form['user_or_role'].force_value(select2_json['results'][0]['children'][0]['id'])
567 577
    resp = form.submit().follow()
568 578
    assert 'Jôhn Dôe' in resp.text
569 579

  
......
576 586
    assert data_pk_args == ['user_or_role']
577 587

  
578 588
    select2_json = request_select2(app, resp, term='role_ou1')
579
    assert len(select2_json['results']) == 1
589
    assert len(select2_json['results'][0]['children']) == 1
580 590
    form = resp.forms['add-member']
581
    form['user_or_role'].force_value(select2_json['results'][0]['id'])
591
    form['user_or_role'].force_value(select2_json['results'][0]['children'][0]['id'])
582 592
    resp = form.submit().follow()
583 593
    assert 'role_ou1' in resp.text
584 594

  
585
-