refactory in delete_from_trade function
This commit is contained in:
parent
9dc79a59dc
commit
54977d432d
|
@ -215,73 +215,12 @@ class RevokeView(ConfirmMixin):
|
||||||
def validate(self, data):
|
def validate(self, data):
|
||||||
"""All devices need to have the status of DoubleConfirmation."""
|
"""All devices need to have the status of DoubleConfirmation."""
|
||||||
|
|
||||||
### check ###
|
devices = data['devices']
|
||||||
if not data['devices']:
|
if not devices:
|
||||||
raise ValidationError('Devices not exist.')
|
raise ValidationError('Devices not exist.')
|
||||||
|
|
||||||
lot = data['action'].lot
|
lot = data['action'].lot
|
||||||
|
self.model = delete_from_trade(lot, devices)
|
||||||
revokeConfirmed = []
|
|
||||||
for dev in data['devices']:
|
|
||||||
if dev.trading(lot) == 'RevokeConfirmed':
|
|
||||||
# this device is revoked before
|
|
||||||
revokeConfirmed.append(dev)
|
|
||||||
### End check ###
|
|
||||||
|
|
||||||
devices = {d for d in data['devices'] if d not in revokeConfirmed}
|
|
||||||
# self.model = delete_from_trade(lot, devices)
|
|
||||||
# TODO @cayop we dont need delete_from_trade
|
|
||||||
|
|
||||||
drop_of_lot = []
|
|
||||||
# import pdb; pdb.set_trace()
|
|
||||||
for dev in devices:
|
|
||||||
# import pdb; pdb.set_trace()
|
|
||||||
if dev.trading_for_web(lot) in ['NeedConfirmation', 'Confirm', 'NeedConfirmRevoke']:
|
|
||||||
drop_of_lot.append(dev)
|
|
||||||
dev.reset_owner()
|
|
||||||
|
|
||||||
self.model = Revoke(action=lot.trade, user=g.user, devices=devices)
|
|
||||||
db.session.add(self.model)
|
|
||||||
lot.devices.difference_update(OrderedSet(drop_of_lot))
|
|
||||||
|
|
||||||
|
|
||||||
# class ConfirmRevokeView(ConfirmMixin):
|
|
||||||
# """Handler for manager the Confirmation register from post
|
|
||||||
|
|
||||||
# request_confirm_revoke = {
|
|
||||||
# 'type': 'ConfirmRevoke',
|
|
||||||
# 'action': action_revoke.id,
|
|
||||||
# 'devices': [device_id]
|
|
||||||
# }
|
|
||||||
|
|
||||||
# """
|
|
||||||
|
|
||||||
# Model = ConfirmRevoke
|
|
||||||
|
|
||||||
# def validate(self, data):
|
|
||||||
# """All devices need to have the status of revoke."""
|
|
||||||
|
|
||||||
# if not data['action'].type == 'Revoke':
|
|
||||||
# txt = 'Error: this action is not a revoke action'
|
|
||||||
# ValidationError(txt)
|
|
||||||
|
|
||||||
# lot = data['action'].lot
|
|
||||||
# for dev in data['devices']:
|
|
||||||
# if not dev.trading(lot) == 'Revoke':
|
|
||||||
# txt = 'Some of devices do not have revoke to confirm'
|
|
||||||
# ValidationError(txt)
|
|
||||||
|
|
||||||
# devices = OrderedSet(data['devices'])
|
|
||||||
# data['devices'] = devices
|
|
||||||
|
|
||||||
# # Change the owner for every devices
|
|
||||||
# # data['action'] == 'Revoke'
|
|
||||||
|
|
||||||
# trade = data['action'].action
|
|
||||||
# for dev in devices:
|
|
||||||
# dev.reset_owner()
|
|
||||||
|
|
||||||
# trade.lot.devices.difference_update(devices)
|
|
||||||
|
|
||||||
|
|
||||||
class ConfirmDocumentMixin():
|
class ConfirmDocumentMixin():
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import pathlib
|
import pathlib
|
||||||
import copy
|
import copy
|
||||||
|
import time
|
||||||
from flask import g
|
from flask import g
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from fractions import Fraction
|
from fractions import Fraction
|
||||||
|
@ -337,6 +338,7 @@ class Device(Thing):
|
||||||
user_from_revoke = False
|
user_from_revoke = False
|
||||||
user_to_revoke = False
|
user_to_revoke = False
|
||||||
status = 0
|
status = 0
|
||||||
|
last_action = {'confirm': 0, 'revoke': 0}
|
||||||
|
|
||||||
if not hasattr(trade, 'acceptances'):
|
if not hasattr(trade, 'acceptances'):
|
||||||
return Status[status]
|
return Status[status]
|
||||||
|
@ -351,19 +353,29 @@ class Device(Thing):
|
||||||
if ac.t == 'Confirm' and ac.action == trade:
|
if ac.t == 'Confirm' and ac.action == trade:
|
||||||
if ac.user == user_from:
|
if ac.user == user_from:
|
||||||
user_from_confirm = True
|
user_from_confirm = True
|
||||||
|
# import pdb; pdb.set_trace()
|
||||||
|
last_action['confirm'] = time.mktime(ac.created.timetuple())
|
||||||
|
user_from_revoke, user_to_revoke = False, False
|
||||||
elif ac.user == user_to:
|
elif ac.user == user_to:
|
||||||
user_to_confirm = True
|
user_to_confirm = True
|
||||||
|
last_action['confirm'] = time.mktime(ac.created.timetuple())
|
||||||
|
user_from_revoke, user_to_revoke = False, False
|
||||||
|
|
||||||
if ac.t == 'Revoke' and ac.action == trade:
|
if ac.t == 'Revoke' and ac.action == trade:
|
||||||
if ac.user == user_from:
|
if ac.user == user_from:
|
||||||
user_from_revoke = True
|
user_from_revoke = True
|
||||||
|
last_action['revoke'] = time.mktime(ac.created.timetuple())
|
||||||
|
user_from_confirm, user_to_confirm = False, False
|
||||||
elif ac.user == user_to:
|
elif ac.user == user_to:
|
||||||
user_to_revoke = True
|
user_to_revoke = True
|
||||||
|
last_action['revoke'] = time.mktime(ac.created.timetuple())
|
||||||
|
user_from_confirm, user_to_confirm = False, False
|
||||||
|
|
||||||
confirms = [user_from_confirm, user_to_confirm]
|
confirms = [user_from_confirm, user_to_confirm]
|
||||||
revokes = [user_from_revoke, user_to_revoke]
|
revokes = [user_from_revoke, user_to_revoke]
|
||||||
|
|
||||||
if any(confirms):
|
confirm_vs_revoke = 'confirm' if last_action['confirm'] > last_action['revoke'] else 'revoke'
|
||||||
|
if any(confirms) and confirm_vs_revoke == 'confirm':
|
||||||
status = 1
|
status = 1
|
||||||
if user_to_confirm and user_from == g.user:
|
if user_to_confirm and user_from == g.user:
|
||||||
status = 2
|
status = 2
|
||||||
|
@ -373,7 +385,7 @@ class Device(Thing):
|
||||||
if all(confirms):
|
if all(confirms):
|
||||||
status = 3
|
status = 3
|
||||||
|
|
||||||
if any(revokes):
|
if any(revokes) and confirm_vs_revoke == 'revoke':
|
||||||
status = 4
|
status = 4
|
||||||
if user_to_revoke and user_from == g.user:
|
if user_to_revoke and user_from == g.user:
|
||||||
status = 5
|
status = 5
|
||||||
|
@ -550,8 +562,7 @@ class Device(Thing):
|
||||||
# search the automatic Confirm
|
# search the automatic Confirm
|
||||||
for ac in actions:
|
for ac in actions:
|
||||||
if ac.type == 'Trade':
|
if ac.type == 'Trade':
|
||||||
# import pdb; pdb.set_trace()
|
action_device = [x for x in ac.actions_device if x.device == self][0]
|
||||||
action_device = [x.device for x in ac.actions_device if x.device == self][0]
|
|
||||||
if action_device.author:
|
if action_device.author:
|
||||||
return action_device.author
|
return action_device.author
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import uuid
|
import uuid
|
||||||
|
from sqlalchemy.util import OrderedSet
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Dict, List, Set, Union
|
from typing import Dict, List, Set, Union
|
||||||
|
@ -246,7 +247,8 @@ class LotDeviceView(LotBaseChildrenView):
|
||||||
return
|
return
|
||||||
|
|
||||||
if lot.trade:
|
if lot.trade:
|
||||||
return delete_from_trade(lot, ids)
|
devices = Device.query.filter(Device.id.in_(ids)).all()
|
||||||
|
return delete_from_trade(lot, devices)
|
||||||
|
|
||||||
if not g.user == lot.owner:
|
if not g.user == lot.owner:
|
||||||
txt = 'This is not your lot'
|
txt = 'This is not your lot'
|
||||||
|
@ -258,7 +260,46 @@ class LotDeviceView(LotBaseChildrenView):
|
||||||
lot.devices.difference_update(devices)
|
lot.devices.difference_update(devices)
|
||||||
|
|
||||||
|
|
||||||
def delete_from_trade(lot: Lot, ids: Set[int]):
|
def delete_from_trade(lot: Lot, devices: List):
|
||||||
|
users = [lot.trade.user_from.id, lot.trade.user_to.id]
|
||||||
|
if g.user.id not in users:
|
||||||
|
# theoretically this case is impossible
|
||||||
|
txt = 'This is not your trade'
|
||||||
|
raise ma.ValidationError(txt)
|
||||||
|
|
||||||
|
drop_of_lot = []
|
||||||
|
without_confirms = []
|
||||||
|
for dev in devices:
|
||||||
|
if dev.trading_for_web(lot) in ['NeedConfirmation', 'Confirm', 'NeedConfirmRevoke']:
|
||||||
|
drop_of_lot.append(dev)
|
||||||
|
dev.reset_owner()
|
||||||
|
|
||||||
|
if lot.trade.confirm:
|
||||||
|
drop_of_lot.append(dev)
|
||||||
|
without_confirms.append(dev)
|
||||||
|
dev.reset_owner()
|
||||||
|
|
||||||
|
|
||||||
|
revoke = Revoke(action=lot.trade, user=g.user, devices=set(devices))
|
||||||
|
db.session.add(revoke)
|
||||||
|
|
||||||
|
if without_confirms:
|
||||||
|
phantom = lot.trade.user_to
|
||||||
|
if lot.trade.user_to == g.user:
|
||||||
|
phantom = lot.trade.user_from
|
||||||
|
|
||||||
|
phantom_revoke = Revoke(
|
||||||
|
action=lot.trade,
|
||||||
|
user=phantom,
|
||||||
|
devices=set(without_confirms)
|
||||||
|
)
|
||||||
|
db.session.add(phantom_revoke)
|
||||||
|
|
||||||
|
lot.devices.difference_update(OrderedSet(drop_of_lot))
|
||||||
|
return revoke
|
||||||
|
|
||||||
|
|
||||||
|
def delete_from_trade2(lot: Lot, ids: Set[int]):
|
||||||
users = [lot.trade.user_from.id, lot.trade.user_to.id]
|
users = [lot.trade.user_from.id, lot.trade.user_to.id]
|
||||||
if not g.user.id in users:
|
if not g.user.id in users:
|
||||||
# theoretically this case is impossible
|
# theoretically this case is impossible
|
||||||
|
@ -280,7 +321,7 @@ def delete_from_trade(lot: Lot, ids: Set[int]):
|
||||||
# then can be revoked and deleted of the lot
|
# then can be revoked and deleted of the lot
|
||||||
# Confirm of dev.trading mean that there are only one confirmation
|
# Confirm of dev.trading mean that there are only one confirmation
|
||||||
# and the first user than put this device in trade is the actual g.user
|
# and the first user than put this device in trade is the actual g.user
|
||||||
if dev.trading(lot) == 'Confirm':
|
if dev.trading(lot) == 'Confirm':
|
||||||
without_confirms.add(dev)
|
without_confirms.add(dev)
|
||||||
dev.reset_owner()
|
dev.reset_owner()
|
||||||
|
|
||||||
|
|
Reference in New Issue