Projet

Général

Profil

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

Benjamin Dauvergne, 11 mars 2019 09:59

Télécharger (6,78 ko)

Voir les différences:

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

 passerelle/contrib/mdph13/models.py | 94 +++++++++++++++++++----------
 tests/test_mdph13.py                | 13 ++++
 2 files changed, 76 insertions(+), 31 deletions(-)
passerelle/contrib/mdph13/models.py
234 234
        if not self.EMAIL_RE.match(email):
235 235
            raise APIError('email is not valid', http_status=400)
236 236
        with transaction.atomic():
237
            link, created = Link.objects.get_or_create(
237
            link, created, updated = Link.create_or_update(
238 238
                resource=self,
239
                name_id=NameID,
239
                NameID=NameID,
240 240
                file_number=file_number,
241
                defaults={
242
                    'secret': secret,
243
                    'dob': dob
244
                })
245
            updated = False
246
            if not created:
247
                if link.secret != secret or link.dob != dob:
248
                    link.secret = secret
249
                    link.dob = dob
250
                    updated = True
251
            # email is necessary for audit purpose
252
            link.get_file(email=email)
253
            if updated:
254
                link.save()
241
                secret=secret,
242
                dob=dob,
243
                email=email)
255 244
        return {'link_id': link.pk, 'created': created, 'updated': updated}
256 245

  
257 246
    @endpoint(name='unlink',
......
282 271
        qs.delete()
283 272
        return {'deleted': count}
284 273

  
285
    @classmethod
286
    def _make_display_name(cls, mdph_file):
287
        prenom = mdph_file.get('beneficiaire', {}).get('prenom')
288
        nom = mdph_file.get('beneficiaire', {}).get('nom')
289
        numero = mdph_file['numero']
290
        parts = []
291
        if prenom:
292
            parts.append(prenom)
293
        if nom:
294
            parts.append(nom)
295
        parts.append(u'#%s' % numero)
296
        return ' '.join(parts)
297

  
298 274
    @endpoint(name='dossiers',
299 275
              description=_('Get datas for all links, or for a specified one'),
300 276
              perm='can_access',
......
342 318
                file_data.update(to_json().err_to_response(e))
343 319
            else:
344 320
                file_data.update({
345
                    'text': self._make_display_name(mdph_file),
346 321
                    'dossier': mdph_file,
347 322
                })
323
            file_data['text'] = six.text_type(link)
348 324
            data.append(file_data)
349 325
        if link_id:
350 326
            return {'data': data[0] if data else None}
351 327
        return {'data': data}
352 328

  
353 329

  
330
@six.python_2_unicode_compatible
354 331
class Link(models.Model):
355 332
    resource = models.ForeignKey(
356 333
        MDPH13Resource,
......
369 346
    created = models.DateTimeField(
370 347
        verbose_name=_('Creation date'),
371 348
        auto_now_add=True)
349
    display_name = models.CharField(
350
        verbose_name=_('Display name'),
351
        max_length=128,
352
        blank=True)
372 353

  
373 354
    def get_file(self, email=None):
374 355
        # email is necessary for audit purpose
375
        return self.resource.call_situation_dossier(
356
        mdph_file = self.resource.call_situation_dossier(
376 357
            file_number=self.file_number,
377 358
            secret=self.secret,
378 359
            dob=self.dob,
379 360
            email=email)
361
        display_name = self._make_display_name(mdph_file)
362
        if self.display_name != display_name:
363
            self.display_name = display_name
364
            self.save()
365
        return mdph_file
366

  
367
    @classmethod
368
    def create_or_update(self, resource, NameID, file_number, secret, dob, email=None):
369
        # email is necessary for audit purpose
370
        mdph_file = resource.call_situation_dossier(
371
            file_number=file_number,
372
            secret=secret,
373
            dob=dob,
374
            email=email)
375
        display_name = self._make_display_name(mdph_file)
376

  
377
        link, created = Link.objects.get_or_create(
378
            resource=resource,
379
            name_id=NameID,
380
            file_number=file_number,
381
            defaults={
382
                'secret': secret,
383
                'dob': dob,
384
                'display_name': display_name,
385
            })
386

  
387
        updated = False
388
        if not created:
389
            if link.secret != secret or link.dob != dob or link.display_name != display_name:
390
                link.secret = secret
391
                link.dob = dob
392
                link.display_name = display_name
393
                link.save()
394
                updated = True
395
        return link, created, updated
396

  
397
    @classmethod
398
    def _make_display_name(cls, mdph_file):
399
        prenom = mdph_file.get('beneficiaire', {}).get('prenom')
400
        nom = mdph_file.get('beneficiaire', {}).get('nom')
401
        numero = mdph_file['numero']
402
        parts = []
403
        if prenom:
404
            parts.append(prenom)
405
        if nom:
406
            parts.append(nom)
407
        parts.append(u'#%s' % numero)
408
        return ' '.join(parts)
409

  
410
    def __str__(self):
411
        return self.display_name or u'#%s' % self.file_number
380 412

  
381 413
    class Meta:
382 414
        unique_together = (
tests/test_mdph13.py
466 466
        secret=SECRET,
467 467
        dob=DOB)
468 468
    mock_http.add_response(VALID_RESPONSE)
469
    VALID_RESPONSE2 = json.loads(VALID_RESPONSE).copy()
470
    VALID_RESPONSE2['data']['numero'] = FILE_NUMBER + '2'
471
    mock_http.add_response(json.dumps(VALID_RESPONSE2))
472
    # test that display_name is updated if changed after any access
473
    link2.refresh_from_db()
474
    assert not link2.display_name
475
    response = mdph13.dossiers(None, NAME_ID, EMAIL)
476
    link2.refresh_from_db()
477
    assert link2.display_name
478
    mock_http.add_response(VALID_RESPONSE)
469 479
    mock_http.add_response({'status_code': 500, 'content': ''})
470 480
    response = mdph13.dossiers(None, NAME_ID, EMAIL)
471 481
    assert response['data']
472 482
    assert response['data'][0]['id'] == str(link1.pk)
473 483
    assert response['data'][0]['err'] == 0
484
    assert response['data'][0]['text'] == 'Alfonso Martini #' + FILE_NUMBER
474 485
    assert response['data'][1]['id'] == str(link2.pk)
475 486
    assert response['data'][1]['err'] == 1
487
    # verify display_name is returned even in case of failure
488
    assert response['data'][1]['text'] == 'Alfonso Martini #' + FILE_NUMBER + '2'
476 489

  
477 490

  
478 491
def test_dossier_bad_date(mdph13, mock_http):
479
-