toulouse-maelis: accept unlinked user on reading endpoints (87549)
gitea/passerelle/pipeline/head This commit looks good Details

This commit is contained in:
Nicolas Roche 2024-02-27 18:18:13 +01:00
parent 668ddf08e5
commit 0f0ca5059e
2 changed files with 162 additions and 79 deletions

View File

@ -57,6 +57,11 @@ class UpdateError(Exception):
pass
class UnlinkedUser(APIError):
def __init__(self):
super().__init__('User not linked to family')
class ToulouseMaelis(BaseResource, HTTPResource):
# noqa pylint: disable=too-many-public-methods
@ -457,7 +462,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
try:
return self.link_set.get(name_id=NameID)
except Link.DoesNotExist:
raise APIError('User not linked to family')
raise UnlinkedUser
def get_family_raw(self, family_id, **kwargs):
return self.call('Family', 'readFamily', dossierNumber=family_id, **kwargs)
@ -1404,7 +1409,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def read_family(self, request, NameID=None, family_id=None, income_year=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
data = self.get_family(family_id, incomeYear=income_year)
data['family_id'] = family_id
return {'data': data}
@ -1430,7 +1438,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
text_template='{{ lastname }} {{ firstname }}',
income_year=None,
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
return {'data': list(self.read_rl_list_raw(family_id, text_template))}
@endpoint(
@ -1448,7 +1459,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
def read_person_list(
self, request, NameID=None, family_id=None, text_template='{{ lastname }} {{ firstname }}'
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
result = self.get_family_raw(family_id)
data = []
for item in result['emergencyPersonList']:
@ -1474,7 +1488,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
def read_child_list(
self, request, NameID=None, family_id=None, text_template='{{ lastname }} {{ firstname }}'
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
return {'data': list(self.read_child_list_raw(family_id, text_template))}
@endpoint(
@ -1500,7 +1517,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
rl_text_template='{{ lastname }} {{ firstname }}',
child_text_template='{{ lastname }} {{ firstname }}',
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
return {
'data': list(self.read_rl_list_raw(family_id, rl_text_template))
+ list(self.read_child_list_raw(family_id, child_text_template))
@ -1527,7 +1547,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
family_id=None,
text_template='{{ personInfo.lastname }} {{ personInfo.firstname }}',
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
result = self.get_child_raw(family_id, child_id)
data = []
for item in result['authorizedPersonList']:
@ -1557,7 +1580,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
family_id=None,
income_year=None,
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
data = self.get_rl(family_id, rl_id, incomeYear=income_year)
data['family_id'] = family_id
return {'data': data}
@ -1573,7 +1599,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def read_person(self, request, person_id, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
data = self.get_person(family_id, person_id)
data['family_id'] = family_id
return {'data': data}
@ -1589,7 +1618,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def read_child(self, request, child_id, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
data = self.get_child(family_id, child_id)
data['family_id'] = family_id
return {'data': data}
@ -1606,7 +1638,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def read_child_person(self, request, child_id, person_id, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
data = self.get_child_person(family_id, child_id, person_id)
data['family_id'] = family_id
return {'data': data}
@ -1655,7 +1690,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
def read_subscribe_activity_list(
self, request, person_id, NameID=None, family_id=None, nature=None, type_ids=None, school_year=None
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
result = self.get_rl_or_child_raw(family_id, person_id)
if str(nature).lower() == 'perisco':
nature_filter_codes = self.get_perisco_nature_codes()
@ -2338,7 +2376,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
def read_supplied_document_validity(
self, request, code, NameID=None, family_id=None, person_id=None, ref_date=None
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
self.assert_key_in_referential('Document', code, 'code parameter')
response = self.call(
@ -2458,7 +2499,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def read_person_agenda(self, request, person_id, start_date, end_date, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
start_date, end_date, reference_year = self.get_start_and_end_dates(start_date, end_date)
bookings = self.get_bookings(family_id, person_id, start_date, end_date)
return {
@ -2600,7 +2644,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def get_recurrent_week(self, request, person_id, activity_id, ref_date, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
self.get_rl_or_child_raw(family_id, person_id)
payload = {
@ -2746,7 +2793,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def get_rl1_direct_debit_order(self, request, codeRegie, dateRef, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
family = self.get_family_raw(family_id)
payload = {
@ -2886,7 +2936,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def read_child_school_informations(self, request, child_id, level, year, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
data = {'numDossier': family_id, 'numPerson': child_id, 'schoolYear': year, 'level': level}
response = self.call(
@ -3084,7 +3137,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
end_date=None,
text_template='{{ activity.libelle2|default:activity.libelle1 }}',
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
reference_year = None
if start_date and end_date:
start_date, end_date, reference_year = self.get_start_and_end_dates(start_date, end_date)
@ -3131,7 +3187,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
end_date=None,
text_template='{{ libelle }}',
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
reference_year = None
if start_date and end_date:
start_date, end_date, reference_year = self.get_start_and_end_dates(start_date, end_date)
@ -3186,7 +3245,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
end_date=None,
text_template='{{ place.lib2|default:place.lib1 }}',
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
reference_year = None
if start_date and end_date:
start_date, end_date, reference_year = self.get_start_and_end_dates(start_date, end_date)
@ -3257,7 +3319,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
unit_id=None,
place_id=None,
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
reference_year = None
if start_date and end_date:
start_date, end_date, reference_year = self.get_start_and_end_dates(start_date, end_date)
@ -3456,7 +3521,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
family_id=None,
ref_date=None,
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
if ref_date:
try:
ref_date = parse_date(ref_date)
@ -3809,7 +3877,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
def read_activity_agenda(
self, request, person_id, activity_id, start_date, end_date, NameID=None, family_id=None
):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
if start_date > end_date:
raise APIError('start_date should be before end_date', http_status=400)
bookings = self.get_activity_bookings(family_id, person_id, activity_id, start_date, end_date)
@ -3929,7 +4000,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def get_baskets(self, request, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
baskets = self.get_baskets_raw(family_id)
for item in baskets:
item['text'] = self.get_referential_value('Regie', item['codeRegie'])
@ -4331,6 +4405,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def invoices(self, request, regie_id, NameID=None, family_id=None):
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
family_id = family_id or self.get_link(NameID).family_id
data = []
qs = self.get_invoices(family_id, regie_id)
@ -4354,7 +4432,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
},
)
def invoices_history(self, request, regie_id, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
invoices = [
i.format_content()
for i in self.get_invoices(family_id, regie_id)
@ -4469,12 +4550,15 @@ class ToulouseMaelis(BaseResource, HTTPResource):
'invoice_id': {'description': 'Identifiant de facture', 'example_value': 'IDFAM-42'},
},
)
def invoice_pdf(self, request, regie_id, invoice_id, NameID=None, family_id=None):
def invoice_pdf(self, request, regie_id, invoice_id, NameID=None, family_id=None, **kwargs):
try:
self.assert_key_in_referential('Regie', regie_id, 'regie_id parameter')
family_id = family_id or self.get_link(NameID).family_id
except APIError:
raise Http404('Fichier PDF non trouvé')
try:
family_id = family_id or self.get_link(NameID).family_id
except UnlinkedUser:
return {'data': None}
real_invoice_id = invoice_id.split('-')[-1]
if invoice_id[: -(len(real_invoice_id) + 1)] != family_id:

View File

@ -1545,8 +1545,8 @@ def test_read_rl_list_not_linked_error(con, app):
url = get_endpoint('read-rl-list')
resp = app.get(url + '?NameID=local')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_rl_and_child_list(family_service, con, app):
@ -1587,8 +1587,8 @@ def test_read_rl_and_child_list_not_linked_error(con, app):
url = get_endpoint('read-rl-list')
resp = app.get(url + '?NameID=local')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_person_list(family_service, con, app):
@ -1609,8 +1609,8 @@ def test_read_person_list_not_linked_error(con, app):
url = get_endpoint('read-person-list')
resp = app.get(url + '?NameID=local')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_child_list(family_service, con, app):
@ -1639,8 +1639,8 @@ def test_read_child_list_not_linked_error(con, app):
url = get_endpoint('read-child-list')
resp = app.get(url + '?NameID=local')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_child_person_list(family_service, con, app):
@ -1663,8 +1663,8 @@ def test_read_child_person_list_not_linked_error(con, app):
url = get_endpoint('read-child-person-list')
resp = app.get(url + '?NameID=local&child_id=613880')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_child_person_list_not_exists_error(family_service, con, app):
@ -2126,8 +2126,8 @@ def test_read_family_not_linked_error(con, app):
url = get_endpoint('read-family')
resp = app.get(url + '?NameID=')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_family_not_found(family_service, con, app):
@ -2337,8 +2337,8 @@ def test_read_rl_not_linked_error(con, app):
url = get_endpoint('read-rl')
resp = app.get(url + '?NameID=local&rl_id=613879')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_rl_not_found(family_service, con, app):
@ -2438,8 +2438,8 @@ def test_read_subscribe_activity_list_not_linked_error(con, app):
url = get_endpoint('read-subscribe-activity-list')
resp = app.get(url + '?NameID=local&person_id=613880')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_subscribe_activity_list_not_found(family_service, con, app):
@ -2468,8 +2468,8 @@ def test_read_person_not_linked_error(con, app):
url = get_endpoint('read-person')
resp = app.get(url + '?NameID=local&person_id=614059')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_person_not_found(family_service, con, app):
@ -2514,8 +2514,8 @@ def test_read_child_not_linked_error(con, app):
url = get_endpoint('read-child')
resp = app.get(url + '?NameID=local&child_id=613880')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_child_not_found(family_service, con, app):
@ -2545,8 +2545,8 @@ def test_read_child_person_not_linked_error(con, app):
url = get_endpoint('read-child-person')
resp = app.get(url + '?NameID=local&child_id=613880&person_id=614719')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_child_person_no_child_error(family_service, con, app):
@ -5022,8 +5022,8 @@ def test_read_supplied_document_validity_not_linked_error(con, app):
}
resp = app.get(url + '?NameID=local', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_supplied_document_validity_wrong_referential_key_error(con, app):
@ -5191,8 +5191,8 @@ def test_get_rl1_direct_debit_order_not_linked_error(con, app):
}
resp = app.get(url + '?NameID=local', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_get_rl1_direct_debit_order_soap_error(family_service, invoice_service, con, app):
@ -5876,8 +5876,8 @@ def test_read_person_agenda_not_linked_error(con, app):
url = get_endpoint('read-person-agenda')
resp = app.get(url + '?NameID=local&person_id=613880&start_date=2022-09-01&end_date=2023-08-31')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_person_agenda_date_error(con, app):
@ -6256,8 +6256,8 @@ def test_get_recurrent_week_not_linked_error(con, app):
'ref_date': '2023-04-01',
}
resp = app.get(url + '?NameID=local', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_get_recurrent_week_person_not_found(family_service, con, app):
@ -7047,8 +7047,8 @@ def test_get_person_activity_list_not_linked_error(con, app):
'end_date': '2023-08-31',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_get_person_activity_list_date_error(con, app):
@ -7172,8 +7172,8 @@ def test_get_person_unit_list_not_linked_error(con, app):
'end_date': '2023-08-31',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_get_person_unit_list_date_error(con, app):
@ -7307,8 +7307,8 @@ def test_get_person_place_list_not_linked_error(con, app):
'end_date': '2023-08-31',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_get_person_place_list_date_error(con, app):
@ -7544,8 +7544,8 @@ def test_get_person_catalog_geojson_not_linked_error(con, app):
'person_id': '246423',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_get_person_catalog_geojson_date_error(con, app):
@ -8381,8 +8381,8 @@ def test_get_person_subscription_info_not_linked_error(con, app):
'ref_date': '2023-01-22',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_get_person_subscription_info_date_error(con, app):
@ -9588,8 +9588,8 @@ def test_read_activity_agenda_not_linked_error(con, app):
url
+ '?NameID=local&person_id=261768&activity_id=A10049354913&start_date=2023-05-01&end_date=2023-05-31'
)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_read_activity_agenda_date_error(con, app):
@ -10049,8 +10049,8 @@ def test_get_baskets_having_wcs_demand_without_family(family_service, activity_s
def test_get_baskets_not_linked_error(con, app):
url = get_endpoint('get-baskets')
resp = app.get(url + '?NameID=local')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_get_baskets_no_basket(activity_service, con, app):
@ -11261,8 +11261,8 @@ def test_invoices_cache(mocked_get, con, app):
def test_invoices_not_linked_error(con, app):
url = get_endpoint('regie/102/invoices')
resp = app.get(url + '?NameID=local')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_invoices_wrong_referential_key_error(con, app):
@ -11358,8 +11358,8 @@ def test_invoices_history(invoice_service, con, app):
def test_invoices_history_not_linked_error(con, app):
url = get_endpoint('regie/102/invoices/history')
resp = app.get(url + '?NameID=local')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_invoices_history_wrong_referential_key_error(con, app):
@ -11992,10 +11992,9 @@ def test_invoice_pdf(invoice_service, con, app):
def test_invoice_pdf_not_linked_error(con, app):
url = get_endpoint('regie/102/invoice/1312-8/pdf')
resp = app.get(url, status=404)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'django.http.response.Http404'
assert resp.json['err_desc'] == 'Fichier PDF non trouvé'
resp = app.get(url + '?email=')
assert resp.json['err'] == 0
assert resp.json['data'] is None
def test_invoice_pdf_wrong_referential_key_error(con, app):