refactory in delete_from_trade function

This commit is contained in:
Cayo Puigdefabregas 2021-11-11 17:06:26 +01:00
parent 9dc79a59dc
commit 54977d432d
3 changed files with 62 additions and 71 deletions

View File

@ -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():

View File

@ -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

View File

@ -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()