0001-api-let-free-text-search-accept-local-phone-numbers-.patch
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 |
- |