Projet

Général

Profil

0002-base_adresse-add-lat-lon-type-to-address-id-to-get-b.patch

Benjamin Dauvergne, 12 juillet 2021 14:58

Télécharger (5,93 ko)

Voir les différences:

Subject: [PATCH 2/2] base_adresse: add lat/lon/type to address'id to get by id
 through reverse (#55522)

 .../migrations/0019_auto_20210712_1233.py     | 18 +++++++++++
 passerelle/apps/base_adresse/models.py        | 30 +++++++++++++++----
 tests/test_base_adresse.py                    | 16 ++++++++--
 3 files changed, 56 insertions(+), 8 deletions(-)
 create mode 100644 passerelle/apps/base_adresse/migrations/0019_auto_20210712_1233.py
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
-