Projet

Général

Profil

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

Paul Marillonnet, 17 octobre 2022 15:10

Télécharger (3,16 ko)

Voir les différences:

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

 src/authentic2/custom_user/managers.py | 19 +++++++++++++++++++
 tests/api/test_all.py                  | 23 +++++++++++++++++++++++
 2 files changed, 42 insertions(+)
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
......
80 82
            if qs.exists():
81 83
                return wrap_qs(qs)
82 84

  
85
        default_country = settings.PHONE_COUNTRY_CODES[settings.DEFAULT_COUNTRY_CODE]
86
        try:
87
            pn = phonenumbers.parse(search)
88
        except phonenumbers.NumberParseException:
89
            try:
90
                pn = phonenumbers.parse(search, default_country)
91
            except phonenumbers.NumberParseException:
92
                pass
93
            else:
94
                phone_number = phonenumbers.format_number(pn, phonenumbers.PhoneNumberFormat.E164)
95
                attribute_values = AttributeValue.objects.filter(
96
                    search_vector=SearchQuery(phone_number), attribute__kind='phone_number'
97
                )
98
                qs = self.filter(attribute_values__in=attribute_values).order_by('last_name', 'first_name')
99
                if qs.exists():
100
                    return wrap_qs(qs)
101

  
83 102
        try:
84 103
            date = parse_date(search)
85 104
        except ValueError:
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=0612345678')
2251
    assert len(resp.json['results']) == 1
2252
    assert resp.json['results'][0]['id'] == simple_user.id
2253

  
2254
    # erroneous data must still be searchable
2255
    simple_user.attributes.phone = '0xf00d'
2256
    simple_user.save()
2257

  
2258
    resp = app.get('/api/users/?q=0xf00d')
2259
    assert len(resp.json['results']) == 1
2260
    assert resp.json['results'][0]['id'] == simple_user.id
2261

  
2262

  
2240 2263
def test_find_duplicates(app, admin, settings):
2241 2264
    settings.LANGUAGE_CODE = 'fr'
2242 2265
    app.authorization = ('Basic', (admin.username, admin.username))
2243
-