Projet

Général

Profil

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

Benjamin Dauvergne, 11 mars 2019 10:30

Télécharger (6,81 ko)

Voir les différences:

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

 passerelle/contrib/mdph13/models.py | 95 +++++++++++++++++++----------
 tests/test_mdph13.py                | 13 ++++
 2 files changed, 77 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),
321
                    'err': 0,
346 322
                    'dossier': mdph_file,
347 323
                })
324
            file_data['text'] = six.text_type(link)
348 325
            data.append(file_data)
349 326
        if link_id:
350 327
            return {'data': data[0] if data else None}
351 328
        return {'data': data}
352 329

  
353 330

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

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

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

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

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

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

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

  
381 414
    class Meta:
382 415
        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
-