change model action_trade_documents
This commit is contained in:
parent
f85a0f5ef4
commit
77000882f5
|
@ -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()}')
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Reference in New Issue