0002-maelis-add-cache-on-family-data-48477.patch
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 |
- |