Projet

Général

Profil

0001-api-let-free-text-search-accept-local-phone-numbers-.patch

Paul Marillonnet, 19 octobre 2022 12:44

Télécharger (3,5 ko)

Voir les différences:

Subject: [PATCH] api: let free text search accept local phone numbers (#69906)

 src/authentic2/custom_user/managers.py | 22 +++++++++++++++++---
 tests/api/test_all.py                  | 28 ++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 3 deletions(-)
src/authentic2/custom_user/managers.py
17 17
import unicodedata
18 18
import uuid
19 19

  
20
import phonenumbers
21
from django.conf import settings
20 22
from django.contrib.auth.models import BaseUserManager
21 23
from django.contrib.contenttypes.models import ContentType
22 24
from django.contrib.postgres.search import SearchQuery, TrigramDistance
......
68 70
        else:
69 71
            return wrap_qs(self.filter(uuid=guid.hex))
70 72

  
73
        default_country = settings.PHONE_COUNTRY_CODES[settings.DEFAULT_COUNTRY_CODE]
74
        phone_number = None
71 75
        try:
72
            phone_number = clean_number(search)
73
        except ValidationError:
74
            pass
76
            phone_number = phonenumbers.parse(search)
77
        except phonenumbers.NumberParseException:
78
            try:
79
                phone_number = phonenumbers.parse(search, default_country)
80
            except phonenumbers.NumberParseException:
81
                pass
82

  
83
        if phone_number:
84
            phone_number = phonenumbers.format_number(phone_number, phonenumbers.PhoneNumberFormat.E164)
75 85
        else:
86
            try:
87
                phone_number = clean_number(search)
88
            except ValidationError:
89
                pass
90

  
91
        if phone_number:
76 92
            attribute_values = AttributeValue.objects.filter(
77 93
                search_vector=SearchQuery(phone_number), attribute__kind='phone_number'
78 94
            )
tests/api/test_all.py
2237 2237
    assert resp.json['results'][0]['id'] == user.id
2238 2238

  
2239 2239

  
2240
def test_free_text_search_local_phone(app, admin, simple_user, settings):
2241
    app.authorization = ('Basic', (admin.username, admin.username))
2242
    settings.DEFAULT_COUNTRY_CODE = '33'
2243
    Attribute.objects.create(
2244
        kind='phone_number', name='phone', label='Phone', required=False, searchable=True
2245
    )
2246

  
2247
    simple_user.attributes.phone = '+33612345678'
2248
    simple_user.save()
2249

  
2250
    resp = app.get('/api/users/?q=+33612345678')
2251
    assert len(resp.json['results']) == 1
2252
    assert resp.json['results'][0]['id'] == simple_user.id
2253

  
2254
    # non globally-unique phone number still resolvable from DEFAULT_COUNTRY_CODE prefix
2255
    resp = app.get('/api/users/?q=0612345678')
2256
    assert len(resp.json['results']) == 1
2257
    assert resp.json['results'][0]['id'] == simple_user.id
2258

  
2259
    # additionnaly, erroneous data must still be searchable
2260
    simple_user.attributes.phone = '0xf00d'
2261
    simple_user.save()
2262

  
2263
    resp = app.get('/api/users/?q=0xf00d')
2264
    assert len(resp.json['results']) == 1
2265
    assert resp.json['results'][0]['id'] == simple_user.id
2266

  
2267

  
2240 2268
def test_find_duplicates(app, admin, settings):
2241 2269
    settings.LANGUAGE_CODE = 'fr'
2242 2270
    app.authorization = ('Basic', (admin.username, admin.username))
2243
-