diff --git a/rero_ils/modules/notifications/dispatcher.py b/rero_ils/modules/notifications/dispatcher.py index 2726a2d068..2eeb757b39 100644 --- a/rero_ils/modules/notifications/dispatcher.py +++ b/rero_ils/modules/notifications/dispatcher.py @@ -183,6 +183,10 @@ def not_yet_implemented(*args): request_loan['patron_pid']) ctx_data['request_patron'] = \ request_patron.replace_refs().dumps() + pickup_location = Location.get_record_by_pid( + request_loan['pickup_location_pid']) + ctx_data['request_pickup_name'] = \ + pickup_location['pickup_name'] documents_data['item'] = { 'barcode': item_data['barcode'] } diff --git a/rero_ils/modules/notifications/templates/email/booking/eng.txt b/rero_ils/modules/notifications/templates/email/booking/eng.txt index 1147766caa..83f7df97dd 100644 --- a/rero_ils/modules/notifications/templates/email/booking/eng.txt +++ b/rero_ils/modules/notifications/templates/email/booking/eng.txt @@ -10,7 +10,7 @@ Call number: {% if document.item.call_number %}{{ document.item.call_number }}{% {%- if document.item.call_number and document.item.second_call_number %} / {{ document.item.second_call_number }}{%-endif %} {%- endif %} {% endif %} -Pick up location: {{ pickup_name }} +Pick up location: {{ request_pickup_name }} Patron: {{ request_patron.first_name }} {{ request_patron.last_name }} {%- if request_patron.patron.barcode %} - {% for barcode in request_patron.patron.barcode %}{{ ', ' if not loop.last else '' }}{{ barcode }}{% endfor %} {%- endif %} diff --git a/rero_ils/modules/notifications/templates/email/booking/fre.txt b/rero_ils/modules/notifications/templates/email/booking/fre.txt index 1eca67137b..3aff94d5fb 100644 --- a/rero_ils/modules/notifications/templates/email/booking/fre.txt +++ b/rero_ils/modules/notifications/templates/email/booking/fre.txt @@ -10,7 +10,7 @@ Cote: {% if document.item.call_number %}{{ document.item.call_number }}{% endif {%- if document.item.call_number and document.item.second_call_number %} / {{ document.item.second_call_number }}{%-endif %} {%- endif %} {% endif %} -Lieu de retrait: {{ pickup_name }} +Lieu de retrait: {{ request_pickup_name }} Lecteur: {{ request_patron.first_name }} {{ request_patron.last_name }} {%- if request_patron.patron.barcode %} - {% for barcode in request_patron.patron.barcode %}{{ ', ' if not loop.last else '' }}{{ barcode }}{% endfor %} {%- endif %} diff --git a/rero_ils/modules/notifications/templates/email/booking/ger.txt b/rero_ils/modules/notifications/templates/email/booking/ger.txt index e603374295..651ca79793 100644 --- a/rero_ils/modules/notifications/templates/email/booking/ger.txt +++ b/rero_ils/modules/notifications/templates/email/booking/ger.txt @@ -10,7 +10,7 @@ Signatur: {% if document.item.call_number %}{{ document.item.call_number }}{% en {%- if document.item.call_number and document.item.second_call_number %} / {{ document.item.second_call_number }}{%-endif %} {%- endif %} {% endif %} -Abholort: {{ pickup_name }} +Abholort: {{ request_pickup_name }} Leser: {{ request_patron.first_name }} {{ request_patron.last_name }} {%- if request_patron.patron.barcode %} - {% for barcode in request_patron.patron.barcode %}{{ ', ' if not loop.last else '' }}{{ barcode }}{% endfor %} {%- endif %} diff --git a/rero_ils/modules/notifications/templates/email/booking/ita.txt b/rero_ils/modules/notifications/templates/email/booking/ita.txt index 206a47eef9..f399b660a3 100644 --- a/rero_ils/modules/notifications/templates/email/booking/ita.txt +++ b/rero_ils/modules/notifications/templates/email/booking/ita.txt @@ -10,7 +10,7 @@ Segnatura: {% if document.item.call_number %}{{ document.item.call_number }}{% e {%- if document.item.call_number and document.item.second_call_number %} / {{ document.item.second_call_number }}{%-endif %} {%- endif %} {% endif %} -Punto di ritiro: {{ pickup_name }} +Punto di ritiro: {{ request_pickup_name }} Lettore: {{ request_patron.first_name }} {{ request_patron.last_name }} {%- if request_patron.patron.barcode %} - {% for barcode in request_patron.patron.barcode %}{{ ', ' if not loop.last else '' }}{{ barcode }}{% endfor %} {%- endif %} diff --git a/tests/api/notifications/test_notifications_rest.py b/tests/api/notifications/test_notifications_rest.py index c089b9a3ad..f5c1fbca5c 100644 --- a/tests/api/notifications/test_notifications_rest.py +++ b/tests/api/notifications/test_notifications_rest.py @@ -27,6 +27,7 @@ from utils import VerifyRecordPermissionPatch, flush_index, get_json, \ postdata, to_relative_url +from rero_ils.modules.items.models import ItemStatus from rero_ils.modules.libraries.api import email_notification_type from rero_ils.modules.loans.api import Loan, LoanAction, LoanState from rero_ils.modules.notifications.api import Notification, \ @@ -784,6 +785,114 @@ def test_request_notifications(client, patron_martigny, patron_sion, mailbox.clear() +def test_multiple_request_booking_notifications( + client, + patron_martigny, patron2_martigny, patron4_martigny, + librarian_martigny, librarian_sion, librarian_saxon, + loc_public_martigny, loc_public_sion, loc_public_saxon, + lib_martigny, lib_sion, lib_saxon, + item_lib_martigny, circulation_policies, mailbox +): + """Test multiple requests booking notifications.""" + # request 1 + login_user_via_session(client, librarian_martigny.user) + res, data = postdata( + client, + 'api_item.librarian_request', + dict( + item_pid=item_lib_martigny.pid, + pickup_location_pid=loc_public_martigny.pid, + patron_pid=patron_martigny.pid, + transaction_library_pid=lib_martigny.pid, + transaction_user_pid=librarian_martigny.pid + ) + ) + assert res.status_code == 200 + # request 2 + login_user_via_session(client, librarian_sion.user) + res, data = postdata( + client, + 'api_item.librarian_request', + dict( + item_pid=item_lib_martigny.pid, + pickup_location_pid=loc_public_sion.pid, + patron_pid=patron2_martigny.pid, + transaction_library_pid=lib_sion.pid, + transaction_user_pid=librarian_sion.pid + ) + ) + assert res.status_code == 200 + # request 3 + login_user_via_session(client, librarian_saxon.user) + res, data = postdata( + client, + 'api_item.librarian_request', + dict( + item_pid=item_lib_martigny.pid, + pickup_location_pid=loc_public_saxon.pid, + patron_pid=patron4_martigny.pid, + transaction_library_pid=lib_saxon.pid, + transaction_user_pid=librarian_saxon.pid + ) + ) + assert res.status_code == 200 + + # checkout for patron1 + params = { + 'patron_pid': patron_martigny.pid, + 'transaction_location_pid': loc_public_martigny.pid, + 'transaction_user_pid': librarian_martigny.pid + } + loan, actions = item_lib_martigny.checkout(**params) + assert actions.get(LoanAction.CHECKOUT) + assert f'Lieu de retrait: {loc_public_martigny.get("code")}'\ + in mailbox[-1].body + params = { + 'transaction_location_pid': loc_public_sion.pid, + 'transaction_user_pid': librarian_sion.pid + } + # checkin at the request pickup of patron2 + _, actions = item_lib_martigny.checkin(**params) + assert actions.get(LoanAction.CHECKIN) + assert f'Lieu de retrait: {loc_public_sion.get("code")}'\ + in mailbox[-1].body + + # checkout for patron2 + params = { + 'patron_pid': patron2_martigny.pid, + 'transaction_location_pid': loc_public_sion.pid, + 'transaction_user_pid': librarian_sion.pid + } + loan, actions = item_lib_martigny.checkout(**params) + assert actions.get(LoanAction.CHECKOUT) + params = { + 'transaction_location_pid': loc_public_saxon.pid, + 'transaction_user_pid': librarian_saxon.pid + } + # checkin at the request pickup of patron3 + _, actions = item_lib_martigny.checkin(**params) + assert actions.get(LoanAction.CHECKIN) + assert f'Lieu de retrait: {loc_public_saxon.get("code")}'\ + in mailbox[-1].body + + # checkout for patron3 + params = { + 'patron_pid': patron4_martigny.pid, + 'transaction_location_pid': loc_public_saxon.pid, + 'transaction_user_pid': librarian_saxon.pid + } + loan, actions = item_lib_martigny.checkout(**params) + assert actions.get(LoanAction.CHECKOUT) + params = { + 'transaction_location_pid': loc_public_martigny.pid, + 'transaction_user_pid': librarian_martigny.pid + } + # checkin at the request pickup of patron3 + _, actions = item_lib_martigny.checkin(**params) + assert actions.get(LoanAction.CHECKIN) + assert item_lib_martigny.status == ItemStatus.ON_SHELF + + def test_booking_notifications(client, patron_martigny, patron_sion, lib_martigny, lib_fully, librarian_fully,