mdph13: keep computed display name on Link (#31249)
This commit is contained in:
parent
fbacbcfcf7
commit
b8b8d140f6
|
@ -0,0 +1,20 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.20 on 2019-03-11 10:05
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mdph13', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='link',
|
||||
name='display_name',
|
||||
field=models.CharField(blank=True, max_length=128, verbose_name='Display name'),
|
||||
),
|
||||
]
|
|
@ -214,24 +214,13 @@ class MDPH13Resource(BaseResource, HTTPResource):
|
|||
if not self.EMAIL_RE.match(email):
|
||||
raise APIError('email is not valid', http_status=400)
|
||||
with transaction.atomic():
|
||||
link, created = Link.objects.get_or_create(
|
||||
link, created, updated = Link.create_or_update(
|
||||
resource=self,
|
||||
name_id=NameID,
|
||||
NameID=NameID,
|
||||
file_number=file_number,
|
||||
defaults={
|
||||
'secret': secret,
|
||||
'dob': dob
|
||||
})
|
||||
updated = False
|
||||
if not created:
|
||||
if link.secret != secret or link.dob != dob:
|
||||
link.secret = secret
|
||||
link.dob = dob
|
||||
updated = True
|
||||
# email is necessary for audit purpose
|
||||
link.get_file(email=email)
|
||||
if updated:
|
||||
link.save()
|
||||
secret=secret,
|
||||
dob=dob,
|
||||
email=email)
|
||||
return {'link_id': link.pk, 'created': created, 'updated': updated}
|
||||
|
||||
@endpoint(name='unlink',
|
||||
|
@ -262,19 +251,6 @@ class MDPH13Resource(BaseResource, HTTPResource):
|
|||
qs.delete()
|
||||
return {'deleted': count}
|
||||
|
||||
@classmethod
|
||||
def _make_display_name(cls, mdph_file):
|
||||
prenom = mdph_file.get('beneficiaire', {}).get('prenom')
|
||||
nom = mdph_file.get('beneficiaire', {}).get('nom')
|
||||
numero = mdph_file['numero']
|
||||
parts = []
|
||||
if prenom:
|
||||
parts.append(prenom)
|
||||
if nom:
|
||||
parts.append(nom)
|
||||
parts.append(u'#%s' % numero)
|
||||
return ' '.join(parts)
|
||||
|
||||
@endpoint(name='dossiers',
|
||||
description=_('Get datas for all links, or for a specified one'),
|
||||
perm='can_access',
|
||||
|
@ -315,22 +291,20 @@ class MDPH13Resource(BaseResource, HTTPResource):
|
|||
'err': 0,
|
||||
}
|
||||
try:
|
||||
mdph_file = link.get_file(email=email)
|
||||
file_data['dossier'] = link.get_file(email=email)
|
||||
except Exception as e:
|
||||
if link_id:
|
||||
raise
|
||||
file_data.update(to_json().err_to_response(e))
|
||||
else:
|
||||
file_data.update({
|
||||
'text': self._make_display_name(mdph_file),
|
||||
'dossier': mdph_file,
|
||||
})
|
||||
# do it later as get_filter() can modify str(link)
|
||||
file_data['text'] = six.text_type(link)
|
||||
data.append(file_data)
|
||||
if link_id:
|
||||
return {'data': data[0] if data else None}
|
||||
return {'data': data}
|
||||
|
||||
|
||||
@six.python_2_unicode_compatible
|
||||
class Link(models.Model):
|
||||
resource = models.ForeignKey(
|
||||
MDPH13Resource,
|
||||
|
@ -349,14 +323,69 @@ class Link(models.Model):
|
|||
created = models.DateTimeField(
|
||||
verbose_name=_('Creation date'),
|
||||
auto_now_add=True)
|
||||
display_name = models.CharField(
|
||||
verbose_name=_('Display name'),
|
||||
max_length=128,
|
||||
blank=True)
|
||||
|
||||
def get_file(self, email=None):
|
||||
# email is necessary for audit purpose
|
||||
return self.resource.call_situation_dossier(
|
||||
mdph_file = self.resource.call_situation_dossier(
|
||||
file_number=self.file_number,
|
||||
secret=self.secret,
|
||||
dob=self.dob,
|
||||
email=email)
|
||||
display_name = self._make_display_name(mdph_file)
|
||||
if self.display_name != display_name:
|
||||
self.display_name = display_name
|
||||
self.save()
|
||||
return mdph_file
|
||||
|
||||
@classmethod
|
||||
def create_or_update(self, resource, NameID, file_number, secret, dob, email=None):
|
||||
# email is necessary for audit purpose
|
||||
mdph_file = resource.call_situation_dossier(
|
||||
file_number=file_number,
|
||||
secret=secret,
|
||||
dob=dob,
|
||||
email=email)
|
||||
display_name = self._make_display_name(mdph_file)
|
||||
|
||||
link, created = Link.objects.get_or_create(
|
||||
resource=resource,
|
||||
name_id=NameID,
|
||||
file_number=file_number,
|
||||
defaults={
|
||||
'secret': secret,
|
||||
'dob': dob,
|
||||
'display_name': display_name,
|
||||
})
|
||||
|
||||
updated = False
|
||||
if not created:
|
||||
if link.secret != secret or link.dob != dob or link.display_name != display_name:
|
||||
link.secret = secret
|
||||
link.dob = dob
|
||||
link.display_name = display_name
|
||||
link.save()
|
||||
updated = True
|
||||
return link, created, updated
|
||||
|
||||
@classmethod
|
||||
def _make_display_name(cls, mdph_file):
|
||||
prenom = mdph_file.get('beneficiaire', {}).get('prenom')
|
||||
nom = mdph_file.get('beneficiaire', {}).get('nom')
|
||||
numero = mdph_file['numero']
|
||||
parts = []
|
||||
if prenom:
|
||||
parts.append(prenom)
|
||||
if nom:
|
||||
parts.append(nom)
|
||||
parts.append(u'#%s' % numero)
|
||||
return ' '.join(parts)
|
||||
|
||||
def __str__(self):
|
||||
return self.display_name or u'#%s' % self.file_number
|
||||
|
||||
class Meta:
|
||||
unique_together = (
|
||||
|
|
|
@ -475,13 +475,26 @@ def test_dossier_partial_failure(mdph13, mock_http):
|
|||
secret=SECRET,
|
||||
dob=DOB)
|
||||
mock_http.add_response(VALID_RESPONSE)
|
||||
VALID_RESPONSE2 = json.loads(VALID_RESPONSE).copy()
|
||||
VALID_RESPONSE2['data']['numero'] = FILE_NUMBER + '2'
|
||||
mock_http.add_response(json.dumps(VALID_RESPONSE2))
|
||||
# test that display_name is updated if changed after any access
|
||||
link2.refresh_from_db()
|
||||
assert not link2.display_name
|
||||
response = mdph13.dossiers(None, NAME_ID, EMAIL)
|
||||
link2.refresh_from_db()
|
||||
assert link2.display_name
|
||||
mock_http.add_response(VALID_RESPONSE)
|
||||
mock_http.add_response({'status_code': 500, 'content': ''})
|
||||
response = mdph13.dossiers(None, NAME_ID, EMAIL)
|
||||
assert response['data']
|
||||
assert response['data'][0]['id'] == str(link1.pk)
|
||||
assert response['data'][0]['err'] == 0
|
||||
assert response['data'][0]['text'] == 'Alfonso Martini #' + FILE_NUMBER
|
||||
assert response['data'][1]['id'] == str(link2.pk)
|
||||
assert response['data'][1]['err'] == 1
|
||||
# verify display_name is returned even in case of failure
|
||||
assert response['data'][1]['text'] == 'Alfonso Martini #' + FILE_NUMBER + '2'
|
||||
|
||||
|
||||
def test_dossier_bad_date(mdph13, mock_http):
|
||||
|
|
Loading…
Reference in New Issue