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 |
... | ... | |
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 |
- |