api_views: publik compliant return form for find_duplicates api (#47351)

This commit is contained in:
Valentin Deniaud 2020-10-05 16:21:37 +02:00
parent d0f26f3cb0
commit 29e7b8e49d
3 changed files with 25 additions and 20 deletions

View File

@ -525,6 +525,7 @@ class BaseUserSerializer(serializers.ModelSerializer):
class DuplicateUserSerializer(BaseUserSerializer): class DuplicateUserSerializer(BaseUserSerializer):
duplicate_distance = serializers.FloatField(required=True, source='dist') duplicate_distance = serializers.FloatField(required=True, source='dist')
text = serializers.CharField(required=True, source='get_full_name')
class SlugFromNameDefault: class SlugFromNameDefault:
@ -810,8 +811,9 @@ class UsersAPI(api_mixins.GetOrCreateMixinView, HookMixin, ExceptionHandlerMixin
serializer = self.get_serializer(data=request.query_params, partial=True) serializer = self.get_serializer(data=request.query_params, partial=True)
if not serializer.is_valid(): if not serializer.is_valid():
response = { response = {
'results': [], 'data': [],
'errors': serializer.errors 'err': 1,
'err_desc': serializer.errors
} }
return Response(response, status.HTTP_400_BAD_REQUEST) return Response(response, status.HTTP_400_BAD_REQUEST)
data = serializer.validated_data data = serializer.validated_data
@ -820,8 +822,9 @@ class UsersAPI(api_mixins.GetOrCreateMixinView, HookMixin, ExceptionHandlerMixin
last_name = data.get('last_name') last_name = data.get('last_name')
if not (first_name and last_name): if not (first_name and last_name):
response = { response = {
'results': [], 'data': [],
'errors': 'first_name and last_name parameters are mandatory.', 'err': 1,
'err_desc': 'first_name and last_name parameters are mandatory.',
} }
return Response(response, status.HTTP_400_BAD_REQUEST) return Response(response, status.HTTP_400_BAD_REQUEST)
@ -830,7 +833,8 @@ class UsersAPI(api_mixins.GetOrCreateMixinView, HookMixin, ExceptionHandlerMixin
qs = User.objects.find_duplicates(first_name, last_name, birthdate=birthdate) qs = User.objects.find_duplicates(first_name, last_name, birthdate=birthdate)
return Response({ return Response({
'results': DuplicateUserSerializer(qs, many=True).data, 'data': DuplicateUserSerializer(qs, many=True).data,
'err': 0,
}) })

View File

@ -1854,23 +1854,24 @@ def test_find_duplicates(app, admin, settings):
'last_name': last_name, 'last_name': last_name,
} }
resp = app.get('/api/users/find_duplicates/', params=exact_match) resp = app.get('/api/users/find_duplicates/', params=exact_match)
assert resp.json['results'][0]['id'] == user.id assert resp.json['data'][0]['id'] == user.id
assert resp.json['results'][0]['duplicate_distance'] == 0 assert resp.json['data'][0]['duplicate_distance'] == 0
assert resp.json['data'][0]['text'] == 'Jean-Kévin Du Château'
typo = { typo = {
'first_name': 'Jean Kévin', 'first_name': 'Jean Kévin',
'last_name': 'Du Châtau', 'last_name': 'Du Châtau',
} }
resp = app.get('/api/users/find_duplicates/', params=typo) resp = app.get('/api/users/find_duplicates/', params=typo)
assert resp.json['results'][0]['id'] == user.id assert resp.json['data'][0]['id'] == user.id
assert resp.json['results'][0]['duplicate_distance'] > 0 assert resp.json['data'][0]['duplicate_distance'] > 0
typo = { typo = {
'first_name': 'Jean Kévin', 'first_name': 'Jean Kévin',
'last_name': 'Château', 'last_name': 'Château',
} }
resp = app.get('/api/users/find_duplicates/', params=typo) resp = app.get('/api/users/find_duplicates/', params=typo)
assert resp.json['results'][0]['id'] == user.id assert resp.json['data'][0]['id'] == user.id
other_person = { other_person = {
'first_name': 'Jean-Kévin', 'first_name': 'Jean-Kévin',
@ -1878,14 +1879,14 @@ def test_find_duplicates(app, admin, settings):
} }
user = User.objects.create(first_name='Éléonore', last_name='âêîôû') user = User.objects.create(first_name='Éléonore', last_name='âêîôû')
resp = app.get('/api/users/find_duplicates/', params=other_person) resp = app.get('/api/users/find_duplicates/', params=other_person)
assert len(resp.json['results']) == 0 assert len(resp.json['data']) == 0
other_person = { other_person = {
'first_name': 'Pierre', 'first_name': 'Pierre',
'last_name': 'Du Château', 'last_name': 'Du Château',
} }
resp = app.get('/api/users/find_duplicates/', params=other_person) resp = app.get('/api/users/find_duplicates/', params=other_person)
assert len(resp.json['results']) == 0 assert len(resp.json['data']) == 0
def test_find_duplicates_unaccent(app, admin, settings): def test_find_duplicates_unaccent(app, admin, settings):
@ -1895,7 +1896,7 @@ def test_find_duplicates_unaccent(app, admin, settings):
user = User.objects.create(first_name='Éléonore', last_name='âêîôû') user = User.objects.create(first_name='Éléonore', last_name='âêîôû')
resp = app.get('/api/users/find_duplicates/', params={'first_name': 'Eleonore', 'last_name': 'aeiou'}) resp = app.get('/api/users/find_duplicates/', params={'first_name': 'Eleonore', 'last_name': 'aeiou'})
assert resp.json['results'][0]['id'] == user.id assert resp.json['data'][0]['id'] == user.id
def test_find_duplicates_birthdate(app, admin, settings): def test_find_duplicates_birthdate(app, admin, settings):
@ -1914,14 +1915,14 @@ def test_find_duplicates_birthdate(app, admin, settings):
'last_name': 'Dupont', 'last_name': 'Dupont',
} }
resp = app.get('/api/users/find_duplicates/', params=params) resp = app.get('/api/users/find_duplicates/', params=params)
assert len(resp.json['results']) == 2 assert len(resp.json['data']) == 2
params['birthdate'] = '1980-01-2', params['birthdate'] = '1980-01-2',
resp = app.get('/api/users/find_duplicates/', params=params) resp = app.get('/api/users/find_duplicates/', params=params)
assert len(resp.json['results']) == 2 assert len(resp.json['data']) == 2
assert resp.json['results'][0]['id'] == user.pk assert resp.json['data'][0]['id'] == user.pk
params['birthdate'] = '1980-01-3', params['birthdate'] = '1980-01-3',
resp = app.get('/api/users/find_duplicates/', params=params) resp = app.get('/api/users/find_duplicates/', params=params)
assert len(resp.json['results']) == 2 assert len(resp.json['data']) == 2
assert resp.json['results'][0]['id'] == homonym.pk assert resp.json['data'][0]['id'] == homonym.pk

View File

@ -75,7 +75,7 @@ def test_large_userbase_find_duplicates(large_userbase, app, admin):
for i in range(100): for i in range(100):
resp = app.get('/api/users/find_duplicates/', params=params) resp = app.get('/api/users/find_duplicates/', params=params)
assert len(resp.json['results']) >= 1 assert len(resp.json['data']) >= 1
def test_large_userbase_find_duplicates_with_birthdate(large_userbase, app, admin): def test_large_userbase_find_duplicates_with_birthdate(large_userbase, app, admin):
@ -90,4 +90,4 @@ def test_large_userbase_find_duplicates_with_birthdate(large_userbase, app, admi
for i in range(100): for i in range(100):
resp = app.get('/api/users/find_duplicates/', params=params) resp = app.get('/api/users/find_duplicates/', params=params)
assert len(resp.json['results']) >= 1 assert len(resp.json['data']) >= 1