diff --git a/ereuse_devicehub/resources/action/schemas.py b/ereuse_devicehub/resources/action/schemas.py index 72d2d025..09c8abcd 100644 --- a/ereuse_devicehub/resources/action/schemas.py +++ b/ereuse_devicehub/resources/action/schemas.py @@ -502,10 +502,20 @@ class Trade(ActionWithMultipleDevices): document_id = SanitizedStr(validate=Length(max=STR_SIZE), data_key='documentID', required=False) date = DateTime(data_key='date', required=False) price = Float(required=False, data_key='price') - user_to_id = SanitizedStr(validate=Length(max=STR_SIZE), data_key='userTo', missing='', - required=False) - user_from_id = SanitizedStr(validate=Length(max=STR_SIZE), data_key='userFrom', missing='', - required=False) + user_to_email = SanitizedStr( + validate=Length(max=STR_SIZE), + data_key='userToEmail', + missing='', + required=False + ) + user_to = NestedOn(s_user.User, dump_only=True, data_key='userTo') + user_from_email = SanitizedStr( + validate=Length(max=STR_SIZE), + data_key='userFromEmail', + missing='', + required=False + ) + user_from = NestedOn(s_user.User, dump_only=True, data_key='userFrom') code = SanitizedStr(validate=Length(max=STR_SIZE), data_key='code', required=False) confirm = Boolean(data_key='confirms', missing=False, description="""If you need confirmation of the user you need actevate this field""") @@ -516,7 +526,7 @@ class Trade(ActionWithMultipleDevices): @validates_schema def validate_lot(self, data: dict): - if not g.user.email in [data['user_from_id'], data['user_to_id']]: + if not g.user.email in [data['user_from_email'], data['user_to_email']]: txt = "you need to be one of the users of involved in the Trade" raise ValidationError(txt) @@ -532,7 +542,7 @@ class Trade(ActionWithMultipleDevices): data['devices'] = data['lot'].devices @validates_schema - def validate_user_to_id(self, data: dict): + def validate_user_to_email(self, data: dict): """ - if user_to exist * confirmation @@ -541,15 +551,14 @@ class Trade(ActionWithMultipleDevices): * without confirmation """ - if data['user_to_id']: - user_to = User.query.filter_by(email=data['user_to_id']).one() - data['user_to_id'] = user_to.id + if data['user_to_email']: + user_to = User.query.filter_by(email=data['user_to_email']).one() data['user_to'] = user_to else: data['confirm'] = False @validates_schema - def validate_user_from_id(self, data: dict): + def validate_user_from_email(self, data: dict): """ - if user_from exist * confirmation @@ -558,13 +567,12 @@ class Trade(ActionWithMultipleDevices): * without confirmation """ - if not (data['user_from_id'] or data['user_to_id']): + if not (data['user_from_email'] or data['user_to_email']): txt = "you need one user from or user to for to do a offer" raise ValidationError(txt) - if data['user_from_id']: - user_from = User.query.filter_by(email=data['user_from_id']).one() - data['user_from_id'] = user_from.id + if data['user_from_email']: + user_from = User.query.filter_by(email=data['user_from_email']).one() data['user_from'] = user_from else: data['confirm'] = False @@ -572,7 +580,7 @@ class Trade(ActionWithMultipleDevices): @validates_schema def validate_code(self, data: dict): """If the user not exist, you need a code to be able to do the traceability""" - if data['user_from_id'] and data['user_to_id']: + if data['user_from_email'] and data['user_to_email']: return if not data.get('code'): diff --git a/ereuse_devicehub/resources/action/views/trade.py b/ereuse_devicehub/resources/action/views/trade.py index 57ecc665..d5aa3d96 100644 --- a/ereuse_devicehub/resources/action/views/trade.py +++ b/ereuse_devicehub/resources/action/views/trade.py @@ -29,6 +29,8 @@ class TradeView(): def __init__(self, data, resource_def, schema): self.schema = schema a = resource_def.schema.load(data) + a.pop('user_to_email', '') + a.pop('user_from_email', '') self.trade = Trade(**a) self.create_phantom_account() db.session.add(self.trade) @@ -36,7 +38,6 @@ class TradeView(): self.create_confirmations() def post(self): - # import pdb; pdb.set_trace() db.session().final_flush() ret = self.schema.jsonify(self.trade) ret.status_code = 201 @@ -57,7 +58,7 @@ class TradeView(): # check than the user than want to do the action is one of the users # involved in the action - assert g.user.id in [self.trade.user_from_id, self.trade.user_to_id] + assert g.user in [self.trade.user_from, self.trade.user_to] confirm_from = Confirm(user=self.trade.user_from, action=self.trade, @@ -78,12 +79,12 @@ class TradeView(): The same if exist to but not from """ - if self.trade.user_from_id and self.trade.user_to_id: + if self.trade.user_from and self.trade.user_to: return - if self.trade.user_from_id and not self.trade.user_to_id: - assert g.user.id == self.trade.user_from_id - email = "{}_{}@dhub.com".format(str(self.trade.user_from_id), self.trade.code) + if self.trade.user_from and not self.trade.user_to: + assert g.user == self.trade.user_from + email = "{}_{}@dhub.com".format(str(self.trade.user_from.id), self.trade.code) users = User.query.filter_by(email=email) if users.first(): user = users.first() @@ -94,8 +95,8 @@ class TradeView(): db.session.add(user) self.trade.user_to = user - if not self.trade.user_from_id and self.trade.user_to_id: - email = "{}_{}@dhub.com".format(str(self.trade.user_to_id), self.trade.code) + if not self.trade.user_from and self.trade.user_to: + email = "{}_{}@dhub.com".format(str(self.trade.user_to.id), self.trade.code) users = User.query.filter_by(email=email) if users.first(): user = users.first() diff --git a/ereuse_devicehub/resources/lot/schemas.py b/ereuse_devicehub/resources/lot/schemas.py index e92de60b..0d584ca7 100644 --- a/ereuse_devicehub/resources/lot/schemas.py +++ b/ereuse_devicehub/resources/lot/schemas.py @@ -4,6 +4,7 @@ from teal.marshmallow import SanitizedStr, URL, EnumField from ereuse_devicehub.marshmallow import NestedOn from ereuse_devicehub.resources.deliverynote import schemas as s_deliverynote from ereuse_devicehub.resources.device import schemas as s_device +from ereuse_devicehub.resources.action import schemas as s_action from ereuse_devicehub.resources.enums import TransferState from ereuse_devicehub.resources.lot import models as m from ereuse_devicehub.resources.models import STR_SIZE @@ -26,4 +27,5 @@ class Lot(Thing): transfer_state = EnumField(TransferState, description=m.Lot.transfer_state.comment) receiver_address = SanitizedStr(validate=f.validate.Length(max=42)) deliverynote = NestedOn(s_deliverynote.Deliverynote, dump_only=True) + trade = NestedOn(s_action.Trade, dump_only=True) is_temporary = f.Boolean(missing=True, data_key='isTemporary') diff --git a/tests/test_action.py b/tests/test_action.py index 0ae1137b..68fcfbb8 100644 --- a/tests/test_action.py +++ b/tests/test_action.py @@ -786,7 +786,7 @@ def test_offer_without_to(user: UserClient): request_post = { 'type': 'Trade', 'devices': [device.id], - 'userFrom': user.email, + 'userFromEmail': user.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -814,7 +814,7 @@ def test_offer_without_to(user: UserClient): request_post = { 'type': 'Trade', 'devices': [device.id], - 'userFrom': user.email, + 'userFromEmail': user.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -837,7 +837,7 @@ def test_offer_without_to(user: UserClient): request_post2 = { 'type': 'Trade', 'devices': [device2.id], - 'userFrom': user.email, + 'userFromEmail': user.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -868,7 +868,7 @@ def test_offer_without_from(user: UserClient, user2: UserClient): request_post = { 'type': 'Trade', 'devices': [device.id], - 'userTo': user2.email, + 'userToEmail': user2.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -878,7 +878,7 @@ def test_offer_without_from(user: UserClient, user2: UserClient): } action, _ = user2.post(res=models.Action, data=request_post, status=422) - request_post['userTo'] = user.email + request_post['userToEmail'] = user.email action, _ = user.post(res=models.Action, data=request_post) trade = models.Trade.query.one() @@ -946,8 +946,8 @@ def test_offer(user: UserClient): request_post = { 'type': 'Trade', 'devices': [], - 'userFrom': user.email, - 'userTo': user2.email, + 'userFromEmail': user.email, + 'userToEmail': user2.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -973,8 +973,8 @@ def test_offer_without_devices(user: UserClient): request_post = { 'type': 'Trade', 'devices': [], - 'userFrom': user.email, - 'userTo': user2.email, + 'userFromEmail': user.email, + 'userToEmail': user2.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -1052,8 +1052,8 @@ def test_endpoint_confirm(user: UserClient, user2: UserClient): request_post = { 'type': 'Trade', 'devices': [device_id], - 'userFrom': user.email, - 'userTo': user2.email, + 'userFromEmail': user.email, + 'userToEmail': user2.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -1093,8 +1093,8 @@ def test_confirm_revoke(user: UserClient, user2: UserClient): request_post = { 'type': 'Trade', 'devices': [device_id], - 'userFrom': user.email, - 'userTo': user2.email, + 'userFromEmail': user.email, + 'userToEmail': user2.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -1172,8 +1172,8 @@ def test_usecase_confirmation(user: UserClient, user2: UserClient): request_post = { 'type': 'Trade', 'devices': [], - 'userFrom': user2.email, - 'userTo': user.email, + 'userFromEmail': user2.email, + 'userToEmail': user.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1', @@ -1183,6 +1183,8 @@ def test_usecase_confirmation(user: UserClient, user2: UserClient): user.post(res=models.Action, data=request_post) trade = models.Trade.query.one() + # l_after, _ = user.get(res=Lot, item=lot['id']) + # import pdb; pdb.set_trace() # the SCRAP confirms 3 of the 10 devices in its outgoing lot request_confirm = { @@ -1360,8 +1362,8 @@ def test_confirmRevoke(user: UserClient, user2: UserClient): request_post = { 'type': 'Trade', 'devices': [], - 'userFrom': user2.email, - 'userTo': user.email, + 'userFromEmail': user2.email, + 'userToEmail': user.email, 'price': 10, 'date': "2020-12-01T02:00:00+00:00", 'documentID': '1',