0001-api-add-a-full_known_users-option-to-synchronization.patch
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 |
- |