Projet

Général

Profil

0001-mdph13-keep-computed-display-name-on-Link-31249.patch

Benjamin Dauvergne, 11 mars 2019 11:22

Télécharger (8,03 ko)

Voir les différences:

Subject: [PATCH] mdph13: keep computed display name on Link (#31249)

 .../migrations/0002_link_display_name.py      |  20 ++++
 passerelle/contrib/mdph13/models.py           | 101 +++++++++++-------
 tests/test_mdph13.py                          |  13 +++
 3 files changed, 98 insertions(+), 36 deletions(-)
 create mode 100644 passerelle/contrib/mdph13/migrations/0002_link_display_name.py
passerelle/contrib/mdph13/migrations/0002_link_display_name.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.20 on 2019-03-11 10:05
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('mdph13', '0001_initial'),
12
    ]
13

  
14
    operations = [
15
        migrations.AddField(
16
            model_name='link',
17
            name='display_name',
18
            field=models.CharField(blank=True, max_length=128, verbose_name='Display name'),
19
        ),
20
    ]
passerelle/contrib/mdph13/models.py
214 214
        if not self.EMAIL_RE.match(email):
215 215
            raise APIError('email is not valid', http_status=400)
216 216
        with transaction.atomic():
217
            link, created = Link.objects.get_or_create(
217
            link, created, updated = Link.create_or_update(
218 218
                resource=self,
219
                name_id=NameID,
219
                NameID=NameID,
220 220
                file_number=file_number,
221
                defaults={
222
                    'secret': secret,
223
                    'dob': dob
224
                })
225
            updated = False
226
            if not created:
227
                if link.secret != secret or link.dob != dob:
228
                    link.secret = secret
229
                    link.dob = dob
230
                    updated = True
231
            # email is necessary for audit purpose
232
            link.get_file(email=email)
233
            if updated:
234
                link.save()
221
                secret=secret,
222
                dob=dob,
223
                email=email)
235 224
        return {'link_id': link.pk, 'created': created, 'updated': updated}
236 225

  
237 226
    @endpoint(name='unlink',
......
262 251
        qs.delete()
263 252
        return {'deleted': count}
264 253

  
265
    @classmethod
266
    def _make_display_name(cls, mdph_file):
267
        prenom = mdph_file.get('beneficiaire', {}).get('prenom')
268
        nom = mdph_file.get('beneficiaire', {}).get('nom')
269
        numero = mdph_file['numero']
270
        parts = []
271
        if prenom:
272
            parts.append(prenom)
273
        if nom:
274
            parts.append(nom)
275
        parts.append(u'#%s' % numero)
276
        return ' '.join(parts)
277

  
278 254
    @endpoint(name='dossiers',
279 255
              description=_('Get datas for all links, or for a specified one'),
280 256
              perm='can_access',
......
315 291
                'err': 0,
316 292
            }
317 293
            try:
318
                mdph_file = link.get_file(email=email)
294
                file_data['dossier'] = link.get_file(email=email)
319 295
            except Exception as e:
320 296
                if link_id:
321 297
                    raise
322 298
                file_data.update(to_json().err_to_response(e))
323
            else:
324
                file_data.update({
325
                    'text': self._make_display_name(mdph_file),
326
                    'dossier': mdph_file,
327
                })
299
            # do it later as get_filter() can modify str(link)
300
            file_data['text'] = six.text_type(link)
328 301
            data.append(file_data)
329 302
        if link_id:
330 303
            return {'data': data[0] if data else None}
331 304
        return {'data': data}
332 305

  
333 306

  
307
@six.python_2_unicode_compatible
334 308
class Link(models.Model):
335 309
    resource = models.ForeignKey(
336 310
        MDPH13Resource,
......
349 323
    created = models.DateTimeField(
350 324
        verbose_name=_('Creation date'),
351 325
        auto_now_add=True)
326
    display_name = models.CharField(
327
        verbose_name=_('Display name'),
328
        max_length=128,
329
        blank=True)
352 330

  
353 331
    def get_file(self, email=None):
354 332
        # email is necessary for audit purpose
355
        return self.resource.call_situation_dossier(
333
        mdph_file = self.resource.call_situation_dossier(
356 334
            file_number=self.file_number,
357 335
            secret=self.secret,
358 336
            dob=self.dob,
359 337
            email=email)
338
        display_name = self._make_display_name(mdph_file)
339
        if self.display_name != display_name:
340
            self.display_name = display_name
341
            self.save()
342
        return mdph_file
343

  
344
    @classmethod
345
    def create_or_update(self, resource, NameID, file_number, secret, dob, email=None):
346
        # email is necessary for audit purpose
347
        mdph_file = resource.call_situation_dossier(
348
            file_number=file_number,
349
            secret=secret,
350
            dob=dob,
351
            email=email)
352
        display_name = self._make_display_name(mdph_file)
353

  
354
        link, created = Link.objects.get_or_create(
355
            resource=resource,
356
            name_id=NameID,
357
            file_number=file_number,
358
            defaults={
359
                'secret': secret,
360
                'dob': dob,
361
                'display_name': display_name,
362
            })
363

  
364
        updated = False
365
        if not created:
366
            if link.secret != secret or link.dob != dob or link.display_name != display_name:
367
                link.secret = secret
368
                link.dob = dob
369
                link.display_name = display_name
370
                link.save()
371
                updated = True
372
        return link, created, updated
373

  
374
    @classmethod
375
    def _make_display_name(cls, mdph_file):
376
        prenom = mdph_file.get('beneficiaire', {}).get('prenom')
377
        nom = mdph_file.get('beneficiaire', {}).get('nom')
378
        numero = mdph_file['numero']
379
        parts = []
380
        if prenom:
381
            parts.append(prenom)
382
        if nom:
383
            parts.append(nom)
384
        parts.append(u'#%s' % numero)
385
        return ' '.join(parts)
386

  
387
    def __str__(self):
388
        return self.display_name or u'#%s' % self.file_number
360 389

  
361 390
    class Meta:
362 391
        unique_together = (
tests/test_mdph13.py
475 475
        secret=SECRET,
476 476
        dob=DOB)
477 477
    mock_http.add_response(VALID_RESPONSE)
478
    VALID_RESPONSE2 = json.loads(VALID_RESPONSE).copy()
479
    VALID_RESPONSE2['data']['numero'] = FILE_NUMBER + '2'
480
    mock_http.add_response(json.dumps(VALID_RESPONSE2))
481
    # test that display_name is updated if changed after any access
482
    link2.refresh_from_db()
483
    assert not link2.display_name
484
    response = mdph13.dossiers(None, NAME_ID, EMAIL)
485
    link2.refresh_from_db()
486
    assert link2.display_name
487
    mock_http.add_response(VALID_RESPONSE)
478 488
    mock_http.add_response({'status_code': 500, 'content': ''})
479 489
    response = mdph13.dossiers(None, NAME_ID, EMAIL)
480 490
    assert response['data']
481 491
    assert response['data'][0]['id'] == str(link1.pk)
482 492
    assert response['data'][0]['err'] == 0
493
    assert response['data'][0]['text'] == 'Alfonso Martini #' + FILE_NUMBER
483 494
    assert response['data'][1]['id'] == str(link2.pk)
484 495
    assert response['data'][1]['err'] == 1
496
    # verify display_name is returned even in case of failure
497
    assert response['data'][1]['text'] == 'Alfonso Martini #' + FILE_NUMBER + '2'
485 498

  
486 499

  
487 500
def test_dossier_bad_date(mdph13, mock_http):
488
-