diff --git a/rero_ils/modules/notifications/api.py b/rero_ils/modules/notifications/api.py index 05a4149a8a..7b749ae26f 100644 --- a/rero_ils/modules/notifications/api.py +++ b/rero_ils/modules/notifications/api.py @@ -127,6 +127,12 @@ def replace_pids_and_refs(self): elif self.transaction_location: data['loan']['pickup_name'] = \ data['loan']['transaction_library']['name'] + data['loan']['pickup_location'] = \ + data['loan']['transaction_location'] + data['loan']['pickup_location_pid'] = \ + data['loan']['transaction_location']['pid'] + data['loan']['pickup_library'] = \ + data['loan']['transaction_library'] document = self.document.replace_refs().dumps() data['loan']['document'] = document diff --git a/rero_ils/modules/notifications/dispatcher.py b/rero_ils/modules/notifications/dispatcher.py index 2f5504cf38..d9aec7658b 100644 --- a/rero_ils/modules/notifications/dispatcher.py +++ b/rero_ils/modules/notifications/dispatcher.py @@ -238,8 +238,14 @@ def _process_notification(cls, notification, resend, aggregated): 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'] + if pickup_location: + ctx_data['request_pickup_name'] = \ + pickup_location['pickup_name'] + else: + transaction_location = Location.get_record_by_pid( + request_loan['transaction_location_pid']) + ctx_data['request_pickup_name'] = \ + transaction_location['name'] documents_data['item'] = { 'barcode': item_data['barcode'], diff --git a/tests/api/notifications/test_notifications_rest.py b/tests/api/notifications/test_notifications_rest.py index 3abbfb19cb..5df2fa525f 100644 --- a/tests/api/notifications/test_notifications_rest.py +++ b/tests/api/notifications/test_notifications_rest.py @@ -979,8 +979,39 @@ def test_booking_notifications(client, patron_martigny, patron_sion, # pickup loan = Loan.get_record_by_pid(request_loan_pid) assert loan.state == LoanState.ITEM_IN_TRANSIT_FOR_PICKUP - assert mailbox[-1].recipients == [ + assert mailbox[0].recipients == [ lib_fully.get('notification_settings')[4].get('email')] # the patron information is the patron request assert patron_martigny['patron']['barcode'][0] in mailbox[0].body mailbox.clear() + + +def test_missing_pickup_location( + loan2_validated_martigny, loc_restricted_martigny, mailbox): + """Test availability notification with missing pickup location.""" + mailbox.clear() + loan = loan2_validated_martigny + assert loan.is_notified(notification_type=NotificationType.AVAILABILITY) + notification = get_notification( + loan, + notification_type=NotificationType.AVAILABILITY + ) + data = notification.replace_pids_and_refs() + assert data['loan']['pickup_location']['pid'] == \ + loc_restricted_martigny.pid + # after deleting the pickup location the notification should use + # the transaction location. + loc_restricted_martigny.delete(dbcommit=True, delindex=True) + notification = get_notification( + loan, + notification_type=NotificationType.AVAILABILITY + ) + data = notification.replace_pids_and_refs() + assert data['loan']['pickup_location'] == \ + data['loan']['transaction_location'] + assert data['loan']['pickup_library'] == \ + data['loan']['transaction_library'] + for notification_type in NotificationType.ALL_NOTIFICATIONS: + process_notifications(notification_type) + assert len(mailbox) + mailbox.clear() diff --git a/tests/fixtures/circulation.py b/tests/fixtures/circulation.py index b356f7ae70..3abcc595cf 100644 --- a/tests/fixtures/circulation.py +++ b/tests/fixtures/circulation.py @@ -488,6 +488,7 @@ def loan2_validated_martigny( document, item3_lib_martigny, loc_public_martigny, + loc_restricted_martigny, item_type_standard_martigny, librarian_martigny, patron_martigny, @@ -498,12 +499,17 @@ def loan2_validated_martigny( """ transaction_date = datetime.now(timezone.utc).isoformat() + # delete old loans + for loan in item3_lib_martigny.get_loans_by_item_pid( + item_pid=item3_lib_martigny.pid): + loan.delete(dbcommit=True, delindex=True) + item3_lib_martigny.request( patron_pid=patron_martigny.pid, transaction_location_pid=loc_public_martigny.pid, transaction_user_pid=librarian_martigny.pid, transaction_date=transaction_date, - pickup_location_pid=loc_public_martigny.pid, + pickup_location_pid=loc_restricted_martigny.pid, document_pid=extracted_data_from_ref( item3_lib_martigny.get('document')) ) @@ -513,13 +519,14 @@ def loan2_validated_martigny( loan = list(item3_lib_martigny.get_loans_by_item_pid( item_pid=item3_lib_martigny.pid))[0] + item3_lib_martigny.validate_request( pid=loan.pid, patron_pid=patron_martigny.pid, transaction_location_pid=loc_public_martigny.pid, transaction_user_pid=librarian_martigny.pid, transaction_date=transaction_date, - pickup_location_pid=loc_public_martigny.pid, + pickup_location_pid=loc_restricted_martigny.pid, document_pid=extracted_data_from_ref( item3_lib_martigny.get('document')) )