From 1078800db491c09d52d0db8a4789597c5d1f88bf Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 18 Sep 2020 08:54:48 +0200 Subject: [PATCH] nanterre: ignore invalid dates during free text search (#45320) --- tests/test_nanterre.py | 13 +++++++++++-- zoo/zoo_nanterre/utils.py | 25 ++++++++++++++++++------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/tests/test_nanterre.py b/tests/test_nanterre.py index 86f8c94..edcecf2 100644 --- a/tests/test_nanterre.py +++ b/tests/test_nanterre.py @@ -27,8 +27,7 @@ def test_person_search(db, rsu): assert rsu[0].id == found[0].id assert found[0].similarity == 1.0 - found = list(search.search_query(rsu[0].content['prenoms'] + ' ' + - rsu[0].content['nom_de_naissance'])) + found = list(search.search_query(rsu[0].content['prenoms'] + ' ' + rsu[0].content['nom_de_naissance'])) assert rsu[0].id == found[0].id assert found[0].similarity == 1.0 @@ -49,6 +48,16 @@ def test_person_search(db, rsu): found = list(search.search_identifier('%d' % rsu[0].id)) assert found[0].id == rsu[0].id + # check that a valid date restrain the scope of the search + found = list(search.search_email(rsu[0].content['email']).search_birthdate('01/01/1919')) + assert len(found) == 0 + + # check that an invalid date is ignored + found = list(search.search_email(rsu[0].content['email']).search_birthdate('99/01/1919')) + assert len(found) == 1 + found = list(search.search_email(rsu[0].content['email']).search_birthdate('99/1919')) + assert len(found) == 1 + def test_person_search_api(app, db, rsu): url = reverse('rsu-api-search') diff --git a/zoo/zoo_nanterre/utils.py b/zoo/zoo_nanterre/utils.py index a44a5cd..7737cbb 100644 --- a/zoo/zoo_nanterre/utils.py +++ b/zoo/zoo_nanterre/utils.py @@ -300,15 +300,26 @@ class PersonSearch(object): year += 2000 birthdate['year'] = str(year) if birthdate['day']: - before = after = datetime.date( - int(birthdate['year']), int(birthdate['month']), int(birthdate['day'])) + try: + before = after = datetime.date( + int(birthdate['year']), + int(birthdate['month']), + int(birthdate['day'])) + except ValueError: + return self elif birthdate['month']: - after = datetime.date(int(birthdate['year']), int(birthdate['month']), 1) - before = ((after + datetime.timedelta(days=31)).replace(day=1) - - datetime.timedelta(days=1)) + try: + after = datetime.date(int(birthdate['year']), int(birthdate['month']), 1) + before = ((after + datetime.timedelta(days=31)).replace(day=1) + - datetime.timedelta(days=1)) + except ValueError: + return self else: - after = datetime.date(int(birthdate['year']), 1, 1) - before = datetime.date(int(birthdate['year']), 12, 31) + try: + after = datetime.date(int(birthdate['year']), 1, 1) + before = datetime.date(int(birthdate['year']), 12, 31) + except ValueError: + return self first_january_same_year = None if before == after and window_days is not None: -- 2.28.0