diff --git a/loanpy/src/loan/accept_loan_request.py b/loanpy/src/loan/accept_loan_request.py index 7e57f94c979e6d439531f2a8d0c44d01500969a4..fd39bd5ff83cff3ffa67a9d29c3c07f91125a961 100755 --- a/loanpy/src/loan/accept_loan_request.py +++ b/loanpy/src/loan/accept_loan_request.py @@ -28,30 +28,23 @@ from .box_loan import (main, get_loan, F_LOAN, assert_loan_state, get_borrower_names, set_property) -def _accept_loan_request(data): - """Update a loan Record and add the `accepted` Property.""" - loan = get_loan(data[F_LOAN]) +def _accept_loan_request(loan): + """Update a loan Record: add the `accepted` Property.""" assert_loan_state(loan, S_LOAN_REQUESTED) # This changes the state from "loan_requested" to "loan_accepted". set_property(loan, LOAN_ACCEPTED, get_timestamp()) - # To be sure that it worked: - assert_loan_state(loan, S_LOAN_ACCEPTED) - - db.Container().extend([ - loan - ]).update() - - return loan + db.Container().extend([loan]).update() def accept_loan_request(data): """Accept a loan request. - I.e. update the `Loan` Record and add the `accepted` Property. + I.e. add the `accepted` Property to the `Loan` Record. """ - loan = _accept_loan_request(data) + loan = get_loan(data[F_LOAN]) + _accept_loan_request(loan) fn, ln = get_borrower_names(loan) print_success('Thank you for accepting the loan request by {fn} {ln}. See ' diff --git a/loanpy/src/loan/accept_return_request.py b/loanpy/src/loan/accept_return_request.py index 05619d9d5d6b524f15e981b4742cbeb72750c1e9..ba91d876787a0d2124f48702f2b646f88159f3b0 100755 --- a/loanpy/src/loan/accept_return_request.py +++ b/loanpy/src/loan/accept_return_request.py @@ -27,41 +27,36 @@ from caosadvancedtools.serverside.helper import print_success, get_timestamp from .box_loan import (BOX_BORROWED, CONTENT, main, get_loan, set_property, F_LOAN, assert_loan_state, RETURN_ACCEPTED, RETURNLOCATION, S_RETURN_ACCEPTED, S_RETURN_REQUESTED, - get_borrower_names, set_location) + get_borrower_names, set_location_of_borrowed_items) -def _accept_return_request(data): +def _accept_return_request(loan): """Update a loan Record and add the `accepted` Property.""" - loan = get_loan(data[F_LOAN]) assert_loan_state(loan, S_RETURN_REQUESTED) # This changes the state from "return_requested" to "return_accepted". set_property(loan, RETURN_ACCEPTED, get_timestamp()) - # To be sure that it worked: - assert_loan_state(loan, S_RETURN_ACCEPTED) - box = set_location(loan, RETURNLOCATION, update=False) + items = set_location_of_borrowed_items(loan, RETURNLOCATION) if loan.get_property(CONTENT) is not None and loan.get_property(CONTENT).value: - if box.get_property(CONTENT) is not None: - box.get_property(CONTENT).value = loan.get_property(CONTENT).value - else: - box.add_property(id=CONTENT.retrieve().id, - value=loan.get_property(CONTENT).value) - - db.Container().extend([ - box, - loan - ]).update() + for item in items: + if item.get_property(CONTENT) is not None: + item.get_property(CONTENT).value = loan.get_property(CONTENT).value + else: + item.add_property(id=CONTENT.retrieve().id, + value=loan.get_property(CONTENT).value) - return loan + items.append(loan) + items.update() def accept_return_request(data): """Accept a return request. - I.e. update the `Loan` Record and add the `returnAccepted` Property. + I.e.add the `returnAccepted` Property to the `Loan` Record. """ - loan = _accept_return_request(data) + loan = get_loan(data[F_LOAN]) + _accept_return_request(loan) fn, ln = get_borrower_names(loan) box_id = loan.get_property(BOX_BORROWED).value.split("@")[0] diff --git a/loanpy/src/loan/box_loan.py b/loanpy/src/loan/box_loan.py index b6dbad3e2760915d29c44eb0dac9d089c18163a6..08bcac6ab299cd235e9086e228ba02ed30e17e4a 100644 --- a/loanpy/src/loan/box_loan.py +++ b/loanpy/src/loan/box_loan.py @@ -515,23 +515,44 @@ def _caller(func, args): return func(data) +def get_borrowed_items_from(loan)-> db.Container: + """Retrieves and returns the Records of items that were borrowed -def set_location(loan, kind, update=True): - """Set the location of the box to a location of the loan. + Paramters + --------- + loan: db.Record, borrowed items of this loan are retrieved and returned - kind can be RETURNLOCATION or DESTINATION + Returns + ------- + db.Container, borrowed items referenced by the given loan. Return value is a container with + one element, even if only one item is referenced and the property value is not a list. """ - # @review Timm Fitschen 2022-03-16 + borrowed = loan.get_property(BOX_BORROWED) + if borrowed is None: + raise RuntimeError( + f"Loan has no reference to a borrowed item. {BOX_BORROWED} property is missing." + f"Loan ID: {loan.id}") + elif not isinstance(borrowed.value, list): + borrowed = [borrowed.value] + else: + borrowed = borrowed.value + recs = db.Container().extend([db.Record(id=rec_id.split("@")[0]) for rec_id in borrowed]) + return recs.retrieve() - if loan.get_property(kind) is not None: - box_id = loan.get_property(BOX_BORROWED).value.split("@")[0] - box = db.Record(id=box_id).retrieve() - set_property(box, LOCATION, loan.get_property(kind).value) - if update: - box.update() - else: - return box +def set_location_of_borrowed_items(loan, kind)-> list(db.Record): + """Retrieve Records of borrowed items, sets the location and returns the container + Parameters + ---------- + kind: db.Property, should be RETURNLOCATION or DESTINATION + """ + if loan.get_property(kind) is None: + raise RuntimeError( + f"Cannot set {kind} because the loan does not have one. Loan ID: {laon.id}") + borrowed = get_borrowed_items_from(loan) + for item in borrowed: + set_property(item, LOCATION, loan.get_property(kind).value) + return borrowed def main(func, args=None): # configure_server_side_logging(LOGGER_NAME) diff --git a/loanpy/src/loan/confirm_loan.py b/loanpy/src/loan/confirm_loan.py index f503f8ee56fcd7b41c26bcbc14d6d4e206497fea..dd0ac89e7028f94fbd7509b91b7b803b662a19b1 100755 --- a/loanpy/src/loan/confirm_loan.py +++ b/loanpy/src/loan/confirm_loan.py @@ -27,7 +27,7 @@ from caosadvancedtools.serverside.helper import get_timestamp, print_success from .box_loan import (BOX, BOX_BORROWED, DESTINATION, F_LOAN, LENT, S_LENT, S_LOAN_ACCEPTED, assert_loan_state, get_borrower_names, - get_loan, main, set_location, set_property) + get_loan, main, set_location_of_borrowed_items, set_property) def _set_lent_box(loan): @@ -43,7 +43,8 @@ def _set_lent_box(loan): def set_loan_location(loan): """Set the location of the box to the return location of the loan. """ - set_location(loan, DESTINATION) + items = set_location_of_borrowed_items(loan, DESTINATION) + items.update() def _confirm_loan(data): diff --git a/loanpy/src/loan/manual_return.py b/loanpy/src/loan/manual_return.py index 06fec359759e810c8e705ce7ab5fdb4130295238..02003259e05e96293f3d614c2b2ad7b682327edf 100755 --- a/loanpy/src/loan/manual_return.py +++ b/loanpy/src/loan/manual_return.py @@ -28,7 +28,7 @@ from caosadvancedtools.serverside.helper import get_timestamp, print_success from .box_loan import (BOX, BOX_BORROWED, BOX_RETURNED, CONTENT, F_LOAN, RETURNED, RETURNLOCATION, S_RETURN_ACCEPTED, S_RETURNED, assert_loan_state, get_borrower_names, get_loan, main, - set_location, set_property) + set_location_of_borrowed_items, set_property) def _set_returned_box(loan): @@ -45,7 +45,8 @@ def _set_returned_box(loan): def set_return_location(loan): """Set the location of the box to the return location of the loan. """ - set_location(loan, RETURNLOCATION) + items = set_location_of_borrowed_items(loan, RETURNLOCATION) + items.update() def set_content(loan):