change model action_trade_documents

This commit is contained in:
Cayo Puigdefabregas 2021-06-24 11:41:14 +02:00
parent f85a0f5ef4
commit 77000882f5
4 changed files with 147 additions and 16 deletions

View File

@ -117,5 +117,6 @@ def upgrade():
def downgrade(): def downgrade():
op.drop_table('action_trade_document', schema=f'{get_inv()}')
op.drop_table('trade_document', schema=f'{get_inv()}') op.drop_table('trade_document', schema=f'{get_inv()}')

View File

@ -296,9 +296,9 @@ class ActionDevice(db.Model):
primary_key=True) primary_key=True)
class ActionWithMultipleTradeDocuments(ActionWithMultipleDevices): class ActionWithMultipleTradeDocuments(Action):
documents = relationship(TradeDocument, documents = relationship(TradeDocument,
backref=backref('actions_multiple_docs', lazy=True, **_sorted_actions), backref=backref('actions_docs', lazy=True, **_sorted_actions),
secondary=lambda: ActionTradeDocument.__table__, secondary=lambda: ActionTradeDocument.__table__,
order_by=lambda: TradeDocument.id, order_by=lambda: TradeDocument.id,
collection_class=OrderedSet) collection_class=OrderedSet)
@ -1447,8 +1447,36 @@ class Reserve(Organize):
class CancelReservation(Organize): class CancelReservation(Organize):
"""The act of cancelling a reservation.""" """The act of cancelling a reservation."""
class ConfirmDocument(JoinedTableMixin, ActionWithMultipleTradeDocuments):
"""Users confirm the one action trade this confirmation it's link to trade
and the document that confirm
"""
user_id = db.Column(UUID(as_uuid=True),
db.ForeignKey(User.id),
nullable=False,
default=lambda: g.user.id)
user = db.relationship(User, primaryjoin=user_id == User.id)
user_comment = """The user that accept the offer."""
action_id = db.Column(UUID(as_uuid=True),
db.ForeignKey('action.id'),
nullable=False)
action = db.relationship('Action',
backref=backref('acceptances_document',
uselist=True,
lazy=True,
order_by=lambda: Action.end_time,
collection_class=list),
primaryjoin='Confirm.action_id == Action.id')
class Confirm(JoinedTableMixin, ActionWithMultipleTradeDocuments): def __repr__(self) -> str:
if self.action.t in ['Trade']:
origin = 'To'
if self.user == self.action.user_from:
origin = 'From'
return '<{0.t} {0.id} accepted by {1}>'.format(self, origin)
class Confirm(JoinedTableMixin, ActionWithMultipleDevices):
"""Users confirm the one action trade this confirmation it's link to trade """Users confirm the one action trade this confirmation it's link to trade
and the devices that confirm and the devices that confirm
""" """
@ -1488,7 +1516,7 @@ class ConfirmRevoke(Confirm):
return '<{0.t} {0.id} accepted by {0.user}>'.format(self) return '<{0.t} {0.id} accepted by {0.user}>'.format(self)
class Trade(JoinedTableMixin, ActionWithMultipleTradeDocuments): class Trade(JoinedTableMixin, ActionWithMultipleDevices):
"""Trade actions log the political exchange of devices between users. """Trade actions log the political exchange of devices between users.
Every time a trade action is performed, the old user looses its Every time a trade action is performed, the old user looses its
political possession, for example ownership, in favor of another political possession, for example ownership, in favor of another

View File

@ -55,6 +55,11 @@ class Action(Thing):
class ActionWithOneDevice(Action): class ActionWithOneDevice(Action):
__doc__ = m.ActionWithOneDevice.__doc__
doc = NestedOn(s_document.TradeDocument, only_query='id')
class ActionWithOneDocument(Action):
__doc__ = m.ActionWithOneDevice.__doc__ __doc__ = m.ActionWithOneDevice.__doc__
device = NestedOn(s_device.Device, only_query='id') device = NestedOn(s_device.Device, only_query='id')
@ -68,14 +73,6 @@ class ActionWithMultipleDevices(Action):
collection_class=OrderedSet) collection_class=OrderedSet)
class ActionWithMultipleTradeDocuments(ActionWithMultipleDevices):
documents = NestedOn(s_document.TradeDocument,
many=True,
required=False,
only_query='id',
collection_class=OrderedSet)
class Add(ActionWithOneDevice): class Add(ActionWithOneDevice):
__doc__ = m.Add.__doc__ __doc__ = m.Add.__doc__
@ -466,7 +463,7 @@ class CancelReservation(Organize):
__doc__ = m.CancelReservation.__doc__ __doc__ = m.CancelReservation.__doc__
class Confirm(ActionWithMultipleTradeDocuments): class Confirm(ActionWithMultipleDevices):
__doc__ = m.Confirm.__doc__ __doc__ = m.Confirm.__doc__
action = NestedOn('Action', only_query='id') action = NestedOn('Action', only_query='id')
@ -478,6 +475,13 @@ class Confirm(ActionWithMultipleTradeDocuments):
txt = "Device {} not exist in the trade".format(dev.devicehub_id) txt = "Device {} not exist in the trade".format(dev.devicehub_id)
raise ValidationError(txt) raise ValidationError(txt)
class ConfirmDocument(ActionWithOneDocument):
__doc__ = m.Confirm.__doc__
action = NestedOn('Action', only_query='id')
@validates_schema
def validate_revoke(self, data: dict):
for doc in data.get('documents', []): for doc in data.get('documents', []):
# if document not exist in the Trade, then this query is wrong # if document not exist in the Trade, then this query is wrong
if not doc in data['action'].documents: if not doc in data['action'].documents:
@ -526,7 +530,7 @@ class Confirm(ActionWithMultipleTradeDocuments):
raise ValidationError(txt) raise ValidationError(txt)
class Revoke(ActionWithMultipleTradeDocuments): class Revoke(ActionWithMultipleDevices):
__doc__ = m.Revoke.__doc__ __doc__ = m.Revoke.__doc__
action = NestedOn('Action', only_query='id') action = NestedOn('Action', only_query='id')
@ -576,7 +580,51 @@ class Revoke(ActionWithMultipleTradeDocuments):
raise ValidationError(txt) raise ValidationError(txt)
class ConfirmRevoke(ActionWithMultipleTradeDocuments): class RevokeDocument(ActionWithOneDocument):
__doc__ = m.Revoke.__doc__
action = NestedOn('Action', only_query='id')
@validates_schema
def validate_revoke(self, data: dict):
for doc in data.get('documents', []):
# if document not exist in the Trade, then this query is wrong
if not doc in data['action'].documents:
txt = "Document {} not exist in the trade".format(doc.file_name)
raise ValidationError(txt)
@validates_schema
def validate_documents(self, data):
"""Check if there are or no one before confirmation,
This is not checked in the view becouse the list of documents is inmutable
"""
if not data['devices'] == OrderedSet():
return
documents = []
for doc in data['documents']:
actions = copy.copy(doc.actions)
actions.reverse()
for ac in actions:
if ac == data['action']:
# data['action'] is a Trade action, if this is the first action
# to find mean that this document don't have a confirmation
break
if ac.t == 'Revoke' and ac.user == g.user:
# this doc is confirmation jet
break
if ac.t == Confirm.t and ac.user == g.user:
documents.append(doc)
break
if not documents:
txt = 'No there are documents to revoke'
raise ValidationError(txt)
class ConfirmRevoke(ActionWithMultipleDevices):
__doc__ = m.ConfirmRevoke.__doc__ __doc__ = m.ConfirmRevoke.__doc__
action = NestedOn('Action', only_query='id') action = NestedOn('Action', only_query='id')
@ -636,6 +684,60 @@ class ConfirmRevoke(ActionWithMultipleTradeDocuments):
raise ValidationError(txt) raise ValidationError(txt)
class ConfirmRevokeDocument(ActionWithOneDocument):
__doc__ = m.ConfirmRevoke.__doc__
action = NestedOn('Action', only_query='id')
@validates_schema
def validate_revoke(self, data: dict):
for doc in data.get('documents', []):
# if document not exist in the Trade, then this query is wrong
if not doc in data['action'].documents:
txt = "Document {} not exist in the trade".format(doc.file_name)
raise ValidationError(txt)
@validates_schema
def validate_docs(self, data):
"""Check if there are or no one before confirmation,
This is not checked in the view becouse the list of documents is inmutable
"""
if not data['devices'] == OrderedSet():
return
documents = []
for doc in data['documents']:
actions = copy.copy(doc.actions)
actions.reverse()
for ac in actions:
if ac == data['action']:
# If document have the last action the action for confirm
documents.append(doc)
break
if ac.t == 'Revoke' and not ac.user == g.user:
# If document is revoke before you can Confirm now
# and revoke is an action of one other user
documents.append(doc)
break
if ac.t == ConfirmRevoke.t and ac.user == g.user:
# If document is confirmed we don't need confirmed again
break
if ac.t == Confirm.t:
# if onwer of trade confirm again before than this user Confirm the
# revoke, then is not possible confirm the revoke
#
# If g.user confirm the trade before do a ConfirmRevoke
# then g.user can not to do the ConfirmRevoke more
break
if not documents:
txt = 'No there are documents with revoke for confirm'
raise ValidationError(txt)
class Trade(ActionWithMultipleDevices): class Trade(ActionWithMultipleDevices):
__doc__ = m.Trade.__doc__ __doc__ = m.Trade.__doc__
date = DateTime(data_key='date', required=False) date = DateTime(data_key='date', required=False)

View File

@ -87,7 +87,7 @@ class TradeDocument(Thing):
Actions are returned by descending ``created`` time. Actions are returned by descending ``created`` time.
""" """
return sorted(self.actions_multiple_docs, key=lambda x: x.created) return sorted(self.actions_docs, key=lambda x: x.created)
@property @property
def trading(self): def trading(self):