diff --git a/api/logics.py b/api/logics.py index 9d908efb..7b181d6b 100644 --- a/api/logics.py +++ b/api/logics.py @@ -184,11 +184,19 @@ class Logics: @classmethod def take(cls, order, user, amount=None): is_penalized, time_out = cls.is_penalized(user) + take_order = TakeOrder.objects.filter( + taker=user, order=order, expires_at__gt=timezone.now() + ) if is_penalized: return False, { "bad_request", f"You need to wait {time_out} seconds to take an order", } + elif take_order.exists(): + order.log( + f"Order already Pre-Taken by Robot({user.robot.id},{user.username}) for {order.amount} fiat units" + ) + return True, None else: take_order = TakeOrder.objects.create( taker=user, @@ -202,7 +210,7 @@ class Logics: take_order.save(update_fields=["amount"]) order.log( - f"Taken by Robot({user.robot.id},{user.username}) for {order.amount} fiat units" + f"Pre-Taken by Robot({user.robot.id},{user.username}) for {order.amount} fiat units" ) return True, None diff --git a/api/views.py b/api/views.py index 162849e3..3f2e9945 100644 --- a/api/views.py +++ b/api/views.py @@ -244,17 +244,12 @@ class OrderView(viewsets.ViewSet): data["penalty"] = request.user.robot.penalty_expiration # Add booleans if user is maker, taker, partipant, buyer or seller + is_pretaker = TakeOrder.objects.filter( + taker=request.user, order=order, expires_at__gt=timezone.now() + ).exists() data["is_maker"] = order.maker == request.user - data["is_taker"] = order.taker == request.user - data["is_pretaker"] = ( - not data["is_taker"] - and TakeOrder.objects.filter( - taker=request.user, order=order, expires_at__gt=timezone.now() - ).exists() - ) - data["is_participant"] = ( - data["is_maker"] or data["is_taker"] or data["is_pretaker"] - ) + data["is_taker"] = order.taker == request.user or is_pretaker + data["is_participant"] = data["is_maker"] or data["is_taker"] # 3.a) If not a participant and order is not public, forbid. if ( @@ -369,11 +364,8 @@ class OrderView(viewsets.ViewSet): return Response(context, status.HTTP_400_BAD_REQUEST) # 6) If status is 'Public' and user is PRETAKER, reply with a TAKER hold invoice. - elif ( - order.status == Order.Status.PUB - and data["is_pretaker"] - and not data["is_taker"] - ): + elif order.status == Order.Status.PUB and is_pretaker and not data["is_taker"]: + data["status"] = Order.Status.TAK data["total_secs_exp"] = order.t_to_expire(Order.Status.TAK) valid, context = Logics.gen_taker_hold_invoice(order, request.user)