diff --git a/caosdb-server/caosdb-webui/src/ext/js/box_loan.js b/caosdb-server/caosdb-webui/src/ext/js/box_loan.js index 4f567a92a993e7343aabcdf98a157417b2c780b8..de85db38d1f34c17303cc111e2ac42a4cf45dac7 100644 --- a/caosdb-server/caosdb-webui/src/ext/js/box_loan.js +++ b/caosdb-server/caosdb-webui/src/ext/js/box_loan.js @@ -1,3 +1,24 @@ +/* + * This file is a part of the LinkAhead Project. + * + * Copyright (C) 2020-2024 Henrik tom Wörden (h.tomwoerden@indiscale.com) + * Copyright (C) 2020-2024 IndiScale GmbH (info@indiscale.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + * + */ + /** * Return the formatted date of today. */ diff --git a/caosdb-server/scripting/bin/loan_management/box_loan.py b/caosdb-server/scripting/bin/loan_management/box_loan.py index 393c715c36c34f647be10f69acf877dee0ea9bc9..227b0e5c7b59a806fe23110717d7039069862b81 100644 --- a/caosdb-server/scripting/bin/loan_management/box_loan.py +++ b/caosdb-server/scripting/bin/loan_management/box_loan.py @@ -34,8 +34,9 @@ from caosadvancedtools.serverside.helper import (DataModelError, get_data, print_info, print_warning, send_mail) from caosadvancedtools.serverside.logging import configure_server_side_logging -from caosdb.exceptions import EmptyUniqueQueryError +from linkahead.exceptions import EmptyUniqueQueryError from validate_email import validate_email +from conf import * LOGGER_NAME = "box_loan" LOGGER = logging.getLogger(LOGGER_NAME) @@ -73,11 +74,6 @@ _EMTPY_DATA = { F_CURRENT_LOCATION: None } -BOX = db.RecordType(name="Box") -BOX_RETURNED = "Box (returned)" -BOX_BORROWED = "Box (borrowed)" -PERSON = db.RecordType(name="Person") -LOAN = db.RecordType(name="Loan") RECORD_TYPES = [ BOX, @@ -85,25 +81,6 @@ RECORD_TYPES = [ LOAN, ] -# Properties -FIRST_NAME = db.Property(name="firstName", datatype=db.TEXT) -LAST_NAME = db.Property(name="lastName", datatype=db.TEXT) -EMAIL = db.Property(name="email", datatype=db.TEXT) -LOCATION = db.RecordType(name="Location") -DESTINATION = db.Property(name="LoanLocation", datatype="Location") -RETURNLOCATION = db.Property(name="ReturnLocation", datatype="Location") -COMMENT = db.Property(name="comment", datatype=db.TEXT) -EXHAUST_CONTENTS = db.Property(name="exhaustContents", datatype=db.BOOLEAN) -BORROWER = db.Property(name="Borrower", datatype=PERSON.name) -CONTENT = db.Property(name="Content", datatype=db.TEXT) -LOAN_REQUESTED = db.Property(name="loanRequested", datatype=db.DATETIME) -EXPECTED_RETURN = db.Property(name="expectedReturn", datatype=db.DATETIME) -LOAN_ACCEPTED = db.Property(name="loanAccepted", datatype=db.DATETIME) -LENT = db.Property(name="lent", datatype=db.DATETIME) -RETURN_REQUESTED = db.Property(name="returnRequested", datatype=db.DATETIME) -RETURN_ACCEPTED = db.Property(name="returnAccepted", datatype=db.DATETIME) -RETURNED = db.Property(name="returned", datatype=db.DATETIME) -BOX_NUMBER = db.Property(name="Number", datatype=db.TEXT) PROPERTIES = [ FIRST_NAME, @@ -448,23 +425,16 @@ def query_person(firstname, lastname, email): 1. the email address 2. or the first name and the last name """ - query = ('FIND RECORD {rt_person} ' - 'WITH {pemail} = "{email}" ' - 'OR ({pfn} = "{firstname}" ' - 'AND {pln} = "{lastname}") ' - ).format( - rt_person=PERSON.name, - pemail=EMAIL.name, - email=email, - pfn=FIRST_NAME.name, - firstname=firstname, - pln=LAST_NAME.name, - lastname=lastname - ) + query=(f'FIND RECORD {PERSON.name} ' + f'WITH {EMAIL.name} = "{email}" ' + f'OR ({FIRST_NAME.name} = "{firstname}" AND {LAST_NAME.name} = "{lastname}") ' + ) return db.execute_query(query, unique=True) + + def _update_person(person, firstname, lastname, email): """Update the persons names and email address. @@ -479,7 +449,7 @@ def _update_person(person, firstname, lastname, email): person.update() -def get_person(firstname, lastname, email): +def insert_or_update_person(firstname, lastname, email): """ Retrieve a person Record or create it. """ try: person = query_person(firstname, lastname, email) @@ -524,6 +494,7 @@ def set_property(entity, prop, value, case_sensitive=True): def check_data_model(): + # TODO init_data_model is a bad name; no initialization is done return init_data_model(RECORD_TYPES + PROPERTIES) diff --git a/caosdb-server/scripting/bin/loan_management/conf.py b/caosdb-server/scripting/bin/loan_management/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..fcfb1654f3df9bcfa8270ea3cc6d910860e5e383 --- /dev/null +++ b/caosdb-server/scripting/bin/loan_management/conf.py @@ -0,0 +1,28 @@ +import linkahead as db +# RecordTypes +BOX = db.RecordType(name="Box") +PERSON = db.RecordType(name="Person") +LOAN = db.RecordType(name="Loan") +# Properties +FIRST_NAME = db.Property(name="firstName", datatype=db.TEXT) +LAST_NAME = db.Property(name="lastName", datatype=db.TEXT) +EMAIL = db.Property(name="email", datatype=db.TEXT) +LOCATION = db.RecordType(name="Location") +DESTINATION = db.Property(name="LoanLocation", datatype="Location") +RETURNLOCATION = db.Property(name="ReturnLocation", datatype="Location") +COMMENT = db.Property(name="comment", datatype=db.TEXT) +EXHAUST_CONTENTS = db.Property(name="exhaustContents", datatype=db.BOOLEAN) +BORROWER = db.Property(name="Borrower", datatype=PERSON.name) +CONTENT = db.Property(name="Content", datatype=db.TEXT) +LOAN_REQUESTED = db.Property(name="loanRequested", datatype=db.DATETIME) +EXPECTED_RETURN = db.Property(name="expectedReturn", datatype=db.DATETIME) +LOAN_ACCEPTED = db.Property(name="loanAccepted", datatype=db.DATETIME) +LENT = db.Property(name="lent", datatype=db.DATETIME) +RETURN_REQUESTED = db.Property(name="returnRequested", datatype=db.DATETIME) +RETURN_ACCEPTED = db.Property(name="returnAccepted", datatype=db.DATETIME) +RETURNED = db.Property(name="returned", datatype=db.DATETIME) +BOX_NUMBER = db.Property(name="Number", datatype=db.TEXT) + +# Other Strings +BOX_RETURNED = "Box (returned)" +BOX_BORROWED = "Box (borrowed)" diff --git a/caosdb-server/scripting/bin/loan_management/request_loan.py b/caosdb-server/scripting/bin/loan_management/request_loan.py index 93714405aa3332def925695eeadc2d4ceb21ebe0..765eec94f2d047c9aa91178b868b118376703e39 100755 --- a/caosdb-server/scripting/bin/loan_management/request_loan.py +++ b/caosdb-server/scripting/bin/loan_management/request_loan.py @@ -22,7 +22,7 @@ Creates a loan request using information provided by a web formular. """ from __future__ import absolute_import -import caosdb as db +import linkahead as db from caosadvancedtools.serverside.helper import get_timestamp, print_success from box_loan import (BORROWER, BOX, COMMENT, DESTINATION, EXHAUST_CONTENTS, @@ -30,7 +30,7 @@ from box_loan import (BORROWER, BOX, COMMENT, DESTINATION, EXHAUST_CONTENTS, F_EMAIL, F_EXHAUST_CONTENTS, F_EXPECTED_RETURN_DATE, F_FIRST_NAME, F_LAST_NAME, FIRST_NAME, LAST_NAME, LOAN, LOAN_REQUESTED, assert_date_in_future, - assert_key_in_data, get_box, get_person, main, + assert_key_in_data, get_box, insert_or_update_person, main, send_loan_request_mail) @@ -80,8 +80,7 @@ def _check_data(data): def _issue_loan_request(data): """ Insert a loan record a insert/update a person record. """ data = _check_data(data) - box = get_box(data[F_BOX]) - borrower = get_person(firstname=data[F_FIRST_NAME], + borrower = insert_or_update_person(firstname=data[F_FIRST_NAME], lastname=data[F_LAST_NAME], email=data[F_EMAIL]) loan = create_loan(box=data[F_BOX], @@ -90,13 +89,9 @@ def _issue_loan_request(data): exhaust_contents=data[F_EXHAUST_CONTENTS], comment=data[F_COMMENT], destination=data[F_DESTINATION]) - c = db.Container().extend([ - borrower, - loan - ]) - c.insert() + loan.insert() - return borrower, loan, box + return borrower, loan def issue_loan_request(data): @@ -114,7 +109,7 @@ def issue_loan_request(data): The borrower is a Person Record, with firstName, lastName and email, identified by either email, oder firstName+lastName. """ - borrower, loan, _ = _issue_loan_request(data) + borrower, loan = _issue_loan_request(data) fn = borrower.get_property(FIRST_NAME.name).value ln = borrower.get_property(LAST_NAME.name).value diff --git a/caosdb-server/scripting/bin/loan_management/request_return.py b/caosdb-server/scripting/bin/loan_management/request_return.py index d64e72e49c7cbcf51d6277d2d8d3ca34b1c81838..5c78ff5a26d06fb1b2fd988e52b001c806f87eaa 100755 --- a/caosdb-server/scripting/bin/loan_management/request_return.py +++ b/caosdb-server/scripting/bin/loan_management/request_return.py @@ -33,7 +33,7 @@ from box_loan import (BORROWER, COMMENT, CONTENT, EXPECTED_RETURN, F_COMMENT, F_FIRST_NAME, F_LAST_NAME, F_LOAN, FIRST_NAME, LAST_NAME, RETURN_REQUESTED, RETURNLOCATION, S_LENT, assert_date_in_future, assert_key_in_data, - assert_loan_state, get_loan, get_person, main, + assert_loan_state, get_loan, insert_or_update_person, main, send_return_request_mail, set_property) @@ -55,7 +55,7 @@ def _issue_return_request(data): loan = get_loan(data[F_LOAN]) assert_loan_state(loan, S_LENT) - returner = get_person(data[F_FIRST_NAME], data[F_LAST_NAME], data[F_EMAIL]) + returner = insert_or_update_person(data[F_FIRST_NAME], data[F_LAST_NAME], data[F_EMAIL]) loan.add_property(RETURN_REQUESTED, get_timestamp()) set_property(loan, BORROWER, returner.id) diff --git a/caosdb-server/scripting/bin/test/loan_management/conf.py b/caosdb-server/scripting/bin/test/loan_management/conf.py new file mode 120000 index 0000000000000000000000000000000000000000..dfe16033970e733d38f4eeb25837bdfdb6b4a66d --- /dev/null +++ b/caosdb-server/scripting/bin/test/loan_management/conf.py @@ -0,0 +1 @@ +../../loan_management/conf.py \ No newline at end of file diff --git a/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py b/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py index a1b17f253e8014b855a9462d3e8d3dc30cc7e1dc..6dfb9ab7759bc1b2b44477ee050bd711a957f01d 100644 --- a/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py +++ b/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py @@ -1,19 +1,13 @@ from os.path import abspath, dirname, join from pytest import raises -from caosdb import get_connection, configure_connection -from caosdb.connection.mockup import (MockUpServerConnection, MockUpResponse) -from box_loan import (_caller, create_person, query_person, get_person, +from linkahead import get_connection, configure_connection +from linkahead.connection.mockup import (MockUpServerConnection, MockUpResponse) +from box_loan import (_caller, create_person, EMAIL, FIRST_NAME, LAST_NAME, PERSON, assert_date_in_future, DataError, EmailPatternError, assert_email_pattern) -def setup(): - configure_connection(url="unittests", username="testuser", - password_method="plain", - password="testpassword", timeout=200, - implementation=MockUpServerConnection) - def get_data_example(): return abspath(join(dirname(__file__), "request_loan_form.json")) @@ -23,12 +17,11 @@ def test_caller(): args = [get_data_example()] def test_func(data): - assert data["box"] == 2345, "should contain the data from json" + assert data["box"] == [2345], "should contain the data from json" return 1337 assert _caller(test_func, args) == 1337 - def test_create_person(): p = create_person("anna", "lytik", "a@b.com") assert p.get_parents()[0].name == PERSON.name @@ -36,48 +29,6 @@ def test_create_person(): assert p.get_property(LAST_NAME.name).value == "lytik" assert p.get_property(EMAIL.name).value == "a@b.com" - -def test_query_person(): - connection = get_connection() - entities = ('<Response><Query results="1"/>' - '<RecordType id="1234"/></Response>') - - def query_resource(**kwargs): - query = kwargs["path"].split("query=")[1] - assert query.startswith("FIND%20RECORD%20" + PERSON.name) - return MockUpResponse(200, {}, entities) - connection._delegate_connection.resources.append(query_resource) - - p = query_person("petri", "schale", "c@d.com") - assert p.id == 1234 - - -def test_get_person_with_update(): - connection = get_connection() - person_xml = ( - '<Response>{query}' - '<Record id="1234">' - '<Property name="email">{email}</Property>' - '</Record>' - '</Response>') - - def query_resource(**kwargs): - if kwargs["method"] == "GET": - return MockUpResponse(200, {}, - person_xml.format( - query='<Query results="1"/>', - email="old@email")) - else: - return MockUpResponse(200, {}, - person_xml.format( - query='', - email="new@email")) - connection._delegate_connection.resources.append(query_resource) - - p = get_person("firstname", None, "old@email") - assert p.get_property(EMAIL.name).value == "new@email" - - def test_create_person_with_wrong_email_pattern(): with raises(EmailPatternError): assert_email_pattern("@asdf") @@ -92,7 +43,6 @@ def test_create_person_with_wrong_email_pattern(): assert_email_pattern("a@b.da") assert_email_pattern("\"#\"@ö.de") - def test_assert_date_in_future(): assert assert_date_in_future("2050-01-01") is None with raises(DataError): diff --git a/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py b/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py index 790575c73acc1c8d4fa5bb66f37c49d84b6845a3..a058ba6ab21f7fac5f972d8b2b80303861b4e557 100644 --- a/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py +++ b/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py @@ -1,4 +1,4 @@ -from caosdb import Record +from linkahead import Record from box_loan import BOX, BOX_RETURNED, BOX_BORROWED from manual_return import _set_returned_box diff --git a/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py b/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py index d13537bd954ed4aa9d21be36785ee7d27ab235a7..721ef1e131560739a359b99b17a8d4d2b3ffed85 100644 --- a/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py +++ b/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py @@ -1,7 +1,7 @@ from os.path import abspath, dirname, join from pytest import raises -from caosdb import get_connection, configure_connection, Record -from caosdb.connection.mockup import (MockUpServerConnection, MockUpResponse) +from linkahead import get_connection, configure_connection, Record +from linkahead.connection.mockup import (MockUpServerConnection, MockUpResponse) from caosadvancedtools.serverside.helper import get_data from box_loan import (PERSON, FIRST_NAME, EMAIL, BOX, BORROWER, EXPECTED_RETURN, EXHAUST_CONTENTS, COMMENT, @@ -10,11 +10,6 @@ from box_loan import (PERSON, FIRST_NAME, EMAIL, BOX, BORROWER, from request_loan import (create_loan, _issue_loan_request) -def setup(): - configure_connection(url="unittests", username="testuser", - password_method="plain", - password="testpassword", timeout=200, - implementation=MockUpServerConnection) def get_data_example(): @@ -42,61 +37,3 @@ def test_create_loan(): assert l.get_property(EXHAUST_CONTENTS.name).value == False assert l.get_property(COMMENT.name).value == "blablabla" assert l.get_property(DESTINATION.name).value == "my office" - - -def test_issue_loan_request(): - data = get_data(get_data_example()) - person_xml = ( - '<Response>{{query}}' - '<Record id="1234">' - '<Property name="{FN}">{FIRST_NAME}</Property>' - '<Property name="{EMAIL}">{{email}}</Property>' - '</Record>' - '</Response>').format(FN=FIRST_NAME.name, EMAIL=EMAIL.name, - FIRST_NAME=data[F_FIRST_NAME]) - box_xml = ( - '<Response>{{query}}' - '<Record id="2345">' - '<Property name="{BN}">{BOXNUM}</Property>' - '</Record>' - '</Response>').format(BN=BOX_NUMBER.name, BOXNUM="0815") - - def query_resource(**kwargs): - if kwargs["method"] == "GET" and BOX.name in kwargs["path"]: - query = kwargs["path"].split("query=")[1] - assert query.startswith("FIND%20RECORD%20" + BOX.name) - return MockUpResponse(200, {}, - box_xml.format( - query='<Query results="1"/>')) - if kwargs["method"] == "GET" and PERSON.name in kwargs["path"]: - query = kwargs["path"].split("query=")[1] - assert query.startswith("FIND%20RECORD%20" + PERSON.name) - return MockUpResponse(200, {}, - person_xml.format( - query='<Query results="1"/>', - email="old@email")) - elif kwargs["method"] == "PUT": - assert data[F_EMAIL] in kwargs["body"].decode("utf-8") - return MockUpResponse(200, {}, - person_xml.format( - query='', - email=data[F_EMAIL])) - else: - assert "" in kwargs["body"].decode("utf-8") - body = kwargs["body"].decode( - "utf-8").replace('"-1"', '"4567"').replace("Insert", "Response") - return MockUpResponse(200, {}, body) - - connection = get_connection() - connection._delegate_connection.resources.append(query_resource) - - borrower, loan, box = _issue_loan_request(data) - - assert str(loan.id) == "4567" - assert str(loan.get_property(BOX).value) == "2345" - assert str(loan.get_property(BORROWER).value) == str(borrower.id) - assert str(borrower.id) == "1234" - assert borrower.get_property(EMAIL).value == data[F_EMAIL] - assert borrower.get_property(FIRST_NAME).value == data[F_FIRST_NAME] - assert str(box.id) == "2345" - assert box.get_property(BOX_NUMBER).value == "0815" diff --git a/caosdb-server/scripting/bin/test/loan_management/test_request_return.py b/caosdb-server/scripting/bin/test/loan_management/test_request_return.py index fa7f52c7379ec9e8066740573ecdb0289413af82..5d01289831098e90c686c64aeba7ddd5c19b8bb2 100644 --- a/caosdb-server/scripting/bin/test/loan_management/test_request_return.py +++ b/caosdb-server/scripting/bin/test/loan_management/test_request_return.py @@ -1,7 +1,7 @@ from os.path import abspath, dirname, join from pytest import raises -from caosdb import get_connection, configure_connection -from caosdb.connection.mockup import (MockUpServerConnection, MockUpResponse) +from linkahead import get_connection, configure_connection +from linkahead.connection.mockup import (MockUpServerConnection, MockUpResponse) from caosadvancedtools.serverside.helper import get_data from box_loan import (FIRST_NAME, EMAIL, LAST_NAME, F_FIRST_NAME, F_LAST_NAME, F_EMAIL, EXPECTED_RETURN, LENT, @@ -11,32 +11,13 @@ from box_loan import (FIRST_NAME, EMAIL, LAST_NAME, F_FIRST_NAME, from request_return import get_loan, _issue_return_request -def setup(): - configure_connection(url="unittests", username="testuser", - password_method="plain", - password="testpassword", timeout=200, - implementation=MockUpServerConnection) - def get_data_example(): return abspath(join(dirname(__file__), "request_loan_form.json")) -def append_resource(resource): - connection = get_connection() - connection._delegate_connection.resources.append(resource) - - -def test_get_loan(): - entities = '<Response><Query results="1"/><Record id="1234"/></Response>' - def resource(**kwargs): - assert "RECORD%20Loan%20WITH%20ID%20%3D%201234" in kwargs["path"] - return MockUpResponse(200, {}, entities) - append_resource(resource) - loan = get_loan(1234) - assert loan.id == 1234 def test_return_request_with_wrong_return_date(): @@ -56,79 +37,3 @@ def test_return_request_with_wrong_return_date(): del data[F_EXPECTED_RETURN_DATE] with raises(DataError): _issue_return_request(data) - - -def test_return_request_with_wrong_loan_states(): - data = get_data(get_data_example()) - loan_xml = ( - '<Response><Query results="1"/><Record id="12345">' - '<Parent name="{LO}"/>' - '<Property name="{ER}">1985-05-21</Property>' - '<Property name="{BOX}">2345</Property>' - '<Property name="{BOR}">1234</Property>' - '<Property name="{L_REQ}">2020-03-02</Property>' - '</Record></Response>').format(ER=EXPECTED_RETURN.name, - BOX=BOX.name, BOR=BORROWER.name, - L_REQ=LOAN_REQUESTED.name, - LO=LOAN.name) - - def resource(**kwargs): - return MockUpResponse(200, {}, loan_xml) - append_resource(resource) - - with raises(StateError): - _issue_return_request(data) - - -def test_issue_return_request(): - data = get_data(get_data_example()) - person_xml = ( - '<Response><Query results="1"/>' - '<Record id="1234">' - '<Property name="{FN}">{FIRST_NAME}</Property>' - '<Property name="{LN}">{LAST_NAME}</Property>' - '<Property name="{EM}">{EMAIL}</Property>' - '</Record>' - '</Response>').format(FN=FIRST_NAME.name, EM=EMAIL.name, - LN=LAST_NAME.name, FIRST_NAME=data[F_FIRST_NAME], - LAST_NAME=data[F_LAST_NAME], EMAIL=data[F_EMAIL]) - loan_xml = ( - '<Response><Query results="1"/><Record id="12345">' - '<Parent name="{LO}"/>' - '<Property name="{ER}">1985-05-21</Property>' - '<Property name="{BOX}">2345</Property>' - '<Property name="{BOR}">1234</Property>' - '<Property name="{LENT}">2020-03-02</Property>' - '{{RR}}' - '</Record></Response>').format(ER=EXPECTED_RETURN.name, BOX=BOX.name, - BOR=BORROWER.name, LENT=LENT.name, - LO=LOAN.name) - - def resource(**kwargs): - if kwargs["method"] == "GET": - if "12345" in kwargs["path"]: - # retrieve loan - return MockUpResponse(200, {}, - loan_xml.format(RR="")) - - query = kwargs["path"].split("query=")[1] - assert query.startswith("FIND%20RECORD%20" + PERSON.name) - return MockUpResponse(200, {}, person_xml) - elif kwargs["method"] == "PUT": - assert RETURN_REQUESTED.name in kwargs["body"].decode("utf-8") - p = '<Property name="{RR}">asdf</Property>'.format( - RR=RETURN_REQUESTED.name) - return MockUpResponse(200, {}, loan_xml.format(RR=p)) - - append_resource(resource) - - returner, loan = _issue_return_request(data) - - assert loan.id == 12345 - assert loan.get_property(BOX.name).value == "2345" - assert loan.get_property(BORROWER.name).value == str(returner.id) - assert loan.get_property(RETURN_REQUESTED.name).value == "asdf" - - assert returner.id == 1234 - assert returner.get_property(EMAIL.name).value == data[F_EMAIL] - assert returner.get_property(EMAIL.name).value == data[F_EMAIL] diff --git a/notes b/notes new file mode 100644 index 0000000000000000000000000000000000000000..548ba927d11995e0c4b5c6d298e2f02577e415b7 --- /dev/null +++ b/notes @@ -0,0 +1,13 @@ +The loan references objects that are lent. The configuration denotes what RTs +can be lent. + + +Currently, the configuration has to be done twice: for python and web + + +# Fragen +Soll die Email Adress wirklich on the fly mit geändert werden? Alternative +(select person record and check that email is uptodate) + + +Introduce a single loan.py file with argparse (`loan.py accept a b c`, etc)