Projet

Général

Profil

0002-maelis-add-cache-on-family-data-48477.patch

Nicolas Roche, 26 novembre 2020 13:58

Télécharger (4,98 ko)

Voir les différences:

Subject: [PATCH 2/2] maelis: add cache on family data (#48477)

 passerelle/apps/maelis/models.py |  5 ++++
 tests/test_maelis.py             | 41 ++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)
passerelle/apps/maelis/models.py
133 133
            return self.link_set.get(name_id=name_id)
134 134
        except Link.DoesNotExist:
135 135
            raise APIError('User not linked to family', err_code='not-found')
136 136

  
137 137
    def get_family_data(self, family_id, school_year=None):
138 138
        if not school_year:
139 139
            # fallback to current year if not provided
140 140
            school_year = utils.get_default_school_year()
141
        family_data = self.get_from_2keys_cache('family', family_id, school_year)
142
        if family_data:
143
            return family_data
141 144
        family_data = serialize_object(self.call('FamilyService?wsdl',
142 145
                                                 'readFamily',
143 146
                                                 dossierNumber=family_id,
144 147
                                                 schoolYear=school_year))
145 148
        for child in family_data['childInfoList']:
146 149
            utils.normalize_person(child)
150
        self.set_to_2keys_cache('family', family_id, school_year, family_data)
147 151
        return family_data
148 152

  
149 153
    def get_invoices(self, regie_id, name_id):
150 154
        family_id = self.get_link(name_id).family_id
151 155
        return [utils.normalize_invoice(i) for i in self.call(
152 156
            'InvoiceService?wsdl', 'readInvoices',
153 157
            numDossier=family_id, codeRegie=regie_id)]
154 158

  
......
293 297
        for contact_param in ('phone', 'mobile', 'mail'):
294 298
            if contact_param in post_data:
295 299
                params['contact'][contact_param] = post_data[contact_param]
296 300

  
297 301
        r = self.call('FamilyService?wsdl', 'updateCoordinate',
298 302
                      numDossier=link.family_id,
299 303
                      numPerson=personID,
300 304
                      **params)
305
        self.invalidate_2keys_cache('family', link.family_id)
301 306
        return serialize_object(r)
302 307

  
303 308
    @endpoint(
304 309
        display_category=_('Invoices'),
305 310
        display_order=1,
306 311
        name='regie',
307 312
        perm='can_access',
308 313
        pattern=r'^(?P<regie_id>[\w-]+)/invoices/?$',
tests/test_maelis.py
193 193
                                         status_code=200,
194 194
                                         headers={'Content-Type': 'text/xml'}
195 195
                                         )
196 196
    Link.objects.create(resource=connector, family_id='3264', name_id='local')
197 197
    resp = app.get('/maelis/test/regie/1/invoice/3264-53186?NameID=local')
198 198
    assert resp.json['data']
199 199
    assert resp.json['data']['label'] == 'FACTURATION SEPTEMBRE 2014'
200 200
    assert resp.json['data']['display_id'] == '53186'
201

  
202

  
203
@mock.patch('passerelle.utils.Request.get')
204
@mock.patch('passerelle.utils.Request.post')
205
def test_family_cache(mocked_post, mocked_get, family_service_wsdl,
206
                      connector, app):
207
    mocked_get.return_value = mock.Mock(content=family_service_wsdl)
208
    mocked_post.side_effect = (
209
        utils.FakedResponse(content=get_xml_file('readFamily.xml'),
210
                            status_code=200,
211
                            headers={'Content-Type': 'text/xml'}),
212
        utils.FakedResponse(content=get_xml_file('updateCoordinatesResponse.xml'),
213
                            status_code=200,
214
                            headers={'Content-Type': 'text/xml'}),
215
        utils.FakedResponse(content=get_xml_file('readFamily.xml'),
216
                            status_code=200,
217
                            headers={'Content-Type': 'text/xml'}),
218
    )
219

  
220
    assert Link.objects.count() == 0
221
    Link.objects.create(resource=connector, family_id='3264', name_id='local')
222
    resp = app.get('/maelis/test/family-info?NameID=local')
223
    assert not resp.json['err']
224
    family_data = resp.json['data']
225
    assert mocked_post.call_count == 1
226

  
227
    # cached data
228
    resp = app.get('/maelis/test/family-info?NameID=local')
229
    assert family_data == resp.json['data']
230
    assert mocked_post.call_count == 1
231

  
232
    # invalidate cache
233
    resp = app.post_json('/maelis/test/update-coordinates?NameID=local&personID=21293',
234
                         params={'mail': 'foo@example.com'}
235
                         )
236
    assert resp.content is not None
237
    assert mocked_post.call_count == 2
238

  
239
    # no more cached data
240
    resp = app.get('/maelis/test/family-info?NameID=local')
241
    assert mocked_post.call_count == 3
201
-