0002-base_adresse-add-lat-lon-type-to-address-id-to-get-b.patch
passerelle/apps/base_adresse/migrations/0019_auto_20210712_1233.py | ||
---|---|---|
1 |
# Generated by Django 2.2.19 on 2021-07-12 10:33 |
|
2 | ||
3 |
from django.db import migrations, models |
|
4 | ||
5 | ||
6 |
class Migration(migrations.Migration): |
|
7 | ||
8 |
dependencies = [ |
|
9 |
('base_adresse', '0018_text_to_jsonb'), |
|
10 |
] |
|
11 | ||
12 |
operations = [ |
|
13 |
migrations.AlterField( |
|
14 |
model_name='addresscachemodel', |
|
15 |
name='api_id', |
|
16 |
field=models.CharField(max_length=128, unique=True), |
|
17 |
), |
|
18 |
] |
passerelle/apps/base_adresse/models.py | ||
---|---|---|
87 | 87 |
value = value[len(house_number) :].strip() |
88 | 88 |
result['address']['road'] = value |
89 | 89 |
elif prop == 'id': |
90 |
result['id'] = value |
|
90 |
result['ban_id'] = value |
|
91 |
result['id'] = '%s~%s~%s' % (value, result['lat'], result['lon']) |
|
92 |
result['id'] = '%s~%s' % (result['id'], result['text']) |
|
91 | 93 |
return result |
92 | 94 | |
93 | 95 |
@endpoint( |
... | ... | |
117 | 119 |
self, request, id=None, q=None, zipcode='', citycode=None, lat=None, lon=None, page_limit=5 |
118 | 120 |
): |
119 | 121 |
if id is not None: |
120 |
return self.get_by_id(request, id=id) |
|
122 |
return self.get_by_id(request, id=id, citycode=citycode)
|
|
121 | 123 | |
122 | 124 |
if not q: |
123 | 125 |
return {'data': []} |
... | ... | |
162 | 164 | |
163 | 165 |
return {'data': result} |
164 | 166 | |
165 |
def get_by_id(self, request, id): |
|
167 |
def get_by_id(self, request, id, citycode=None): |
|
168 |
try: |
|
169 |
ban_id, lat, lon, q = id.split('~', 4) |
|
170 |
except ValueError: # retrocompatibility with raw BAN id |
|
171 |
ban_id = id |
|
172 |
lat, lon, q = None, None, None |
|
173 |
# Try cache |
|
166 | 174 |
try: |
167 | 175 |
address = AddressCacheModel.objects.get(api_id=id) |
168 | 176 |
except AddressCacheModel.DoesNotExist: |
177 |
pass |
|
178 |
else: |
|
179 |
address.update_timestamp() |
|
180 |
return {'data': [address.data]} |
|
181 |
# Use search with label as q and lat/lon as geographic hint |
|
182 |
if q and lat and lon: |
|
183 |
results = self.addresses(request, q=q, lat=lat, lon=lon, citycode=citycode)['data'] |
|
184 |
for result in results: # match by id if possible |
|
185 |
if result['ban_id'] == ban_id: |
|
186 |
return {'data': [result]} |
|
187 |
return results |
|
188 |
else: # retrocompatibility with raw BAN id |
|
169 | 189 |
return {'err': _('Address ID not found')} |
170 |
address.update_timestamp() |
|
171 |
return {'data': [address.data]} |
|
172 | 190 | |
173 | 191 |
@endpoint( |
174 | 192 |
pattern='(?P<q>.+)?$', |
... | ... | |
640 | 658 | |
641 | 659 | |
642 | 660 |
class AddressCacheModel(models.Model): |
643 |
api_id = models.CharField(max_length=30, unique=True)
|
|
661 |
api_id = models.CharField(max_length=128, unique=True)
|
|
644 | 662 |
data = JSONField() |
645 | 663 |
timestamp = models.DateTimeField(auto_now=True) |
646 | 664 |
tests/test_base_adresse.py | ||
---|---|---|
797 | 797 |
assert data['lon'] == '-0.593775' |
798 | 798 |
assert data['display_name'] == 'Rue Roger Halope 49000 Angers' |
799 | 799 |
assert data['text'] == 'Rue Roger Halope 49000 Angers' |
800 |
assert data['id'] == '49007_6950_be54bd' |
|
800 |
assert data['id'] == '49007_6950_be54bd~47.474633~-0.593775~Rue Roger Halope 49000 Angers'
|
|
801 | 801 |
assert data['address']['city'] == 'Angers' |
802 | 802 |
assert data['address']['postcode'] == '49000' |
803 | 803 |
assert data['address']['citycode'] == '49007' |
... | ... | |
851 | 851 | |
852 | 852 |
resp = app.get('/base-adresse/%s/addresses?q=plop' % base_adresse.slug) |
853 | 853 |
assert AddressCacheModel.objects.count() == 1 # no new object has been created |
854 |
assert mock_api_adresse_data_gouv_fr_search.call['count'] == 2 |
|
855 | ||
856 |
# no cache |
|
857 |
AddressCacheModel.objects.all().delete() |
|
858 |
resp = app.get('/base-adresse/%s/addresses?id=%s' % (base_adresse.slug, api_id)) |
|
859 |
assert AddressCacheModel.objects.count() == 1 |
|
860 |
assert mock_api_adresse_data_gouv_fr_search.call['count'] == 3 |
|
861 |
assert data['text'] == 'Rue Roger Halope 49000 Angers' |
|
862 |
assert 'address' in data |
|
854 | 863 | |
855 | 864 | |
856 | 865 |
def test_base_adresse_addresses_cache_err(app, base_adresse, mock_api_adresse_data_gouv_fr_search): |
... | ... | |
882 | 891 |
assert AddressCacheModel.objects.count() == 1 |
883 | 892 | |
884 | 893 |
freezer.move_to(datetime.timedelta(hours=1, seconds=1)) |
885 |
resp = app.get('/base-adresse/%s/addresses?id=%s' % (base_adresse.slug, '49007_6950_be54bd')) |
|
894 |
resp = app.get( |
|
895 |
'/base-adresse/%s/addresses?id=%s' |
|
896 |
% (base_adresse.slug, '49007_6950_be54bd~47.474633~-0.593775~Rue%20Roger%20Halope%2049000%20Angers') |
|
897 |
) |
|
886 | 898 |
call_command('cron', 'hourly') |
887 | 899 |
assert AddressCacheModel.objects.count() == 1 |
888 | 900 | |
889 |
- |