Projet

Général

Profil

0001-api-add-a-full_known_users-option-to-synchronization.patch

Paul Marillonnet, 27 octobre 2021 10:37

Télécharger (4,07 ko)

Voir les différences:

Subject: [PATCH] api: add a full_known_users option to /synchronization/
 endpoint (#57567)

 src/authentic2/api_views.py | 15 +++++++++++++--
 tests/test_api.py           | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 2 deletions(-)
src/authentic2/api_views.py
795 795

  
796 796
    class SynchronizationSerializer(serializers.Serializer):
797 797
        known_uuids = serializers.ListField(child=serializers.CharField())
798
        full_known_users = serializers.BooleanField(required=False)
798 799

  
799 800
    def check_uuids(self, uuids):
800 801
        User = get_user_model()
801 802
        known_uuids = User.objects.filter(uuid__in=uuids).values_list('uuid', flat=True)
802
        return set(uuids) - set(known_uuids)
803
        return (known_uuids, set(uuids) - set(known_uuids))
804

  
805
    def get_users_from_uuids(self, known_uuids):
806
        User = get_user_model()
807
        known_users = User.objects.filter(uuid__in=known_uuids)
808
        return [BaseUserSerializer(user).data for user in known_users]
803 809

  
804 810
    @action(detail=False, methods=['post'], permission_classes=(DjangoPermission('custom_user.search_user'),))
805 811
    def synchronization(self, request):
......
808 814
            response = {'result': 0, 'errors': serializer.errors}
809 815
            return Response(response, status.HTTP_400_BAD_REQUEST)
810 816
        hooks.call_hooks('api_modify_serializer_after_validation', self, serializer)
811
        unknown_uuids = self.check_uuids(serializer.validated_data.get('known_uuids', []))
817
        known_uuids, unknown_uuids = self.check_uuids(serializer.validated_data.get('known_uuids', []))
818
        full_known_users = serializer.validated_data.get('full_known_users', None)
812 819
        data = {
813 820
            'result': 1,
814 821
            'unknown_uuids': unknown_uuids,
815 822
        }
823
        if full_known_users:
824
            if len(known_uuids) > 1000:
825
                known_uuids = known_uuids[:1000]
826
            data['known_users'] = self.get_users_from_uuids(known_uuids)
816 827
        hooks.call_hooks('api_modify_response', self, 'synchronization', data)
817 828
        return Response(data)
818 829

  
tests/test_api.py
1150 1150
    assert set(response.json['unknown_uuids']) == set(unknown_uuids)
1151 1151

  
1152 1152

  
1153
def test_user_synchronization_full(app, admin):
1154
    headers = basic_authorization_header(admin)
1155
    uuids = []
1156
    for _ in range(100):
1157
        user = User.objects.create(first_name='jim', last_name='jam')
1158
        uuids.append(user.uuid)
1159
    unknown_uuids = [uuid.uuid4().hex for i in range(100)]
1160
    url = reverse('a2-api-users-synchronization')
1161
    content = {
1162
        'known_uuids': uuids + unknown_uuids,
1163
        'full_known_users': 1,
1164
    }
1165
    random.shuffle(content['known_uuids'])
1166
    response = app.post_json(url, params=content, headers=headers)
1167
    assert response.json['result'] == 1
1168

  
1169
    # known users returned as part of api's full mode:
1170
    assert len(response.json['known_users']) == 100
1171
    for user_dict in response.json['known_users']:
1172
        assert user_dict['first_name'] == 'jim'
1173
        assert user_dict['last_name'] == 'jam'
1174
        assert {
1175
            'uuid',
1176
            'email',
1177
            'is_staff',
1178
            'is_superuser',
1179
            'email_verified',
1180
            'ou',
1181
            'is_active',
1182
            'deactivation',
1183
            'modified',
1184
        }.issubset(set(user_dict.keys()))
1185

  
1186

  
1153 1187
def test_api_drf_authentication_class(app, admin, user_ou1, oidc_client):
1154 1188
    url = '/api/users/%s/' % user_ou1.uuid
1155 1189
    # test invalid client
1156
-