Skip to content

Commit

Permalink
loan: update request pickup location
Browse files Browse the repository at this point in the history
* Adds route to update request pickup location.

Co-Authored-by: Alicia Zangger <alicia.zangger@rero.ch>
  • Loading branch information
Alicia Zangger committed Apr 27, 2020
1 parent 6b8ab98 commit 9cdb57d
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
21 changes: 21 additions & 0 deletions rero_ils/modules/items/api_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ def decorated_view(*args, **kwargs):
'action_applied': action_applied
})
except CirculationException as error:
print('-----> error: ', error)
abort(403)
except NotFound as error:
raise(error)
Expand Down Expand Up @@ -164,9 +165,29 @@ def automatic_checkin(item, data):
@jsonify_action
def cancel_loan(item, params):
"""HTTP request for cancel action."""
# TODO: manage transitions for complex cases
return item.cancel_loan(**params)


@api_blueprint.route("/update_loan_pickup_location", methods=['POST'])
@check_authentication
def update_loan_pickup_location():
"""HTTP request for update loan pickup location."""
# for now request pickup location update allowed for pending requests only
# TODO: manage case 'at desk' and 'in transit' (needs PO feedback)
data = flask_request.get_json()
loan_pid = data.get('loan_pid')
pickup_location_pid = data.get('pickup_location_pid')
if not loan_pid or not pickup_location_pid:
return jsonify({'status': 'error: Bad request'}), 400
loan = Loan.get_record_by_pid(loan_pid)
loan['pickup_location_pid'] = pickup_location_pid
if not loan.get('state') == 'PENDING':
return jsonify({'status': 'error: Forbidden'}), 403
new_loan = loan.update(loan, dbcommit=True, reindex=True)
return new_loan


@api_blueprint.route("/lose", methods=['POST'])
@check_authentication
@jsonify_action
Expand Down
80 changes: 80 additions & 0 deletions tests/api/test_items_rest_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -670,3 +670,83 @@ def test_checkout_cancel_old_loan(
# loan will be canclled if a librarian decided to checkout the item anyway.
item, actions = item_lib_fully.prior_checkout_actions(action_params)
assert 'cancel' in actions


def test_update_loan_pickup_location(
client, librarian_martigny_no_email,
patron_martigny_no_email, loc_public_martigny, loc_public_saxon,
item3_lib_martigny, circulation_policies):
"""Test loan pickup location change."""
login_user_via_session(client, librarian_martigny_no_email.user)
item_pid = item3_lib_martigny.pid
first_loc_pid = loc_public_saxon.pid
new_loc_pid = loc_public_martigny.pid
# request an item by a librarian
res, req_data = postdata(
client,
'api_item.librarian_request',
dict(
item_pid=item_pid,
pickup_location_pid=first_loc_pid,
patron_pid=patron_martigny_no_email.pid
)
)
assert res.status_code == 200
# Update pickup location of the request, no loan pid
loan_pid = req_data.get('action_applied')[LoanAction.REQUEST].get('pid')
res, data = postdata(
client,
'api_item.update_loan_pickup_location',
dict(
item_pid=item_pid,
pickup_location_pid=new_loc_pid
)
)
assert res.status_code == 400
# Update pickup location of the request, no pickup location pid
res, data = postdata(
client,
'api_item.update_loan_pickup_location',
dict(
item_pid=item_pid,
loan_pid=loan_pid
)
)
assert res.status_code == 400
# Update pickup location of the request
res, data = postdata(
client,
'api_item.update_loan_pickup_location',
dict(
item_pid=item_pid,
pickup_location_pid=new_loc_pid,
loan_pid=loan_pid
)
)
assert res.status_code == 200
assert data.get('pickup_location_pid') == new_loc_pid
# Change loan state to 'ITEM_AT_DESK'
loans = Item.get_loans_by_item_pid(item_pid)
for loan in loans:
if loan.get('state') == 'ITEM_ON_LOAN':
res, _ = postdata(
client,
'api_item.checkin',
dict(
item_pid=item_pid,
pid=loan.get('pid')
),
)
assert res.status_code == 200
# Update pickup location of the request:
# loan state different from 'pending'
res, data = postdata(
client,
'api_item.update_loan_pickup_location',
dict(
item_pid=item_pid,
pickup_location_pid=new_loc_pid,
loan_pid=loan_pid
)
)
assert res.status_code == 403

0 comments on commit 9cdb57d

Please sign in to comment.