mirror of
https://github.com/RoboSats/robosats.git
synced 2025-07-18 08:43:14 +00:00
Fix last_login for tokeauth, replace maker/taker_last seen for last_login
This commit is contained in:
@ -157,8 +157,6 @@ class Order(models.Model):
|
|||||||
default=None,
|
default=None,
|
||||||
blank=True,
|
blank=True,
|
||||||
) # unique = True, a taker can only take one order
|
) # unique = True, a taker can only take one order
|
||||||
maker_last_seen = models.DateTimeField(null=True, default=None, blank=True)
|
|
||||||
taker_last_seen = models.DateTimeField(null=True, default=None, blank=True)
|
|
||||||
|
|
||||||
# When collaborative cancel is needed and one partner has cancelled.
|
# When collaborative cancel is needed and one partner has cancelled.
|
||||||
maker_asked_cancel = models.BooleanField(default=False, null=False)
|
maker_asked_cancel = models.BooleanField(default=False, null=False)
|
||||||
|
16
api/views.py
16
api/views.py
@ -256,20 +256,12 @@ class OrderView(viewsets.ViewSet):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# WRITE Update last_seen for maker and taker.
|
# WRITE Update last_seen for maker and taker.
|
||||||
# Note down that the taker/maker was here recently, so counterpart knows if the user is paying attention.
|
|
||||||
data["maker_nick"] = str(order.maker)
|
data["maker_nick"] = str(order.maker)
|
||||||
if order.maker == request.user:
|
|
||||||
order.maker_last_seen = timezone.now()
|
|
||||||
order.save()
|
|
||||||
if order.taker == request.user:
|
|
||||||
order.taker_last_seen = timezone.now()
|
|
||||||
order.save()
|
|
||||||
|
|
||||||
# Add activity status of participants based on last_seen
|
# Add activity status of participants based on last_seen
|
||||||
if order.taker_last_seen is not None:
|
data["maker_status"] = Logics.user_activity_status(order.maker.last_login)
|
||||||
data["taker_status"] = Logics.user_activity_status(order.taker_last_seen)
|
if order.taker is not None:
|
||||||
if order.maker_last_seen is not None:
|
data["taker_status"] = Logics.user_activity_status(order.taker.last_login)
|
||||||
data["maker_status"] = Logics.user_activity_status(order.maker_last_seen)
|
|
||||||
|
|
||||||
# 3.b) Non participants can view details (but only if PUB)
|
# 3.b) Non participants can view details (but only if PUB)
|
||||||
if not data["is_participant"] and order.status == Order.Status.PUB:
|
if not data["is_participant"] and order.status == Order.Status.PUB:
|
||||||
@ -904,7 +896,7 @@ class BookView(ListAPIView):
|
|||||||
data["satoshis_now"] = Logics.satoshis_now(order)
|
data["satoshis_now"] = Logics.satoshis_now(order)
|
||||||
# Compute current premium for those orders that are explicitly priced.
|
# Compute current premium for those orders that are explicitly priced.
|
||||||
data["price"], data["premium"] = Logics.price_and_premium_now(order)
|
data["price"], data["premium"] = Logics.price_and_premium_now(order)
|
||||||
data["maker_status"] = Logics.user_activity_status(order.maker_last_seen)
|
data["maker_status"] = Logics.user_activity_status(order.maker.last_login)
|
||||||
for key in (
|
for key in (
|
||||||
"status",
|
"status",
|
||||||
"taker",
|
"taker",
|
||||||
|
@ -72,7 +72,7 @@ class ChatView(viewsets.ViewSet):
|
|||||||
|
|
||||||
# Poor idea: is_peer_connected() mockup. Update connection status based on last time a GET request was sent
|
# Poor idea: is_peer_connected() mockup. Update connection status based on last time a GET request was sent
|
||||||
if chatroom.maker == request.user:
|
if chatroom.maker == request.user:
|
||||||
chatroom.taker_connected = order.taker_last_seen > (
|
chatroom.taker_connected = order.taker.last_login > (
|
||||||
timezone.now() - timedelta(minutes=1)
|
timezone.now() - timedelta(minutes=1)
|
||||||
)
|
)
|
||||||
chatroom.maker_connected = True
|
chatroom.maker_connected = True
|
||||||
@ -80,7 +80,7 @@ class ChatView(viewsets.ViewSet):
|
|||||||
peer_connected = chatroom.taker_connected
|
peer_connected = chatroom.taker_connected
|
||||||
peer_public_key = order.taker.robot.public_key
|
peer_public_key = order.taker.robot.public_key
|
||||||
elif chatroom.taker == request.user:
|
elif chatroom.taker == request.user:
|
||||||
chatroom.maker_connected = order.maker_last_seen > (
|
chatroom.maker_connected = order.maker.last_login > (
|
||||||
timezone.now() - timedelta(minutes=1)
|
timezone.now() - timedelta(minutes=1)
|
||||||
)
|
)
|
||||||
chatroom.taker_connected = True
|
chatroom.taker_connected = True
|
||||||
|
@ -308,7 +308,7 @@ const OrderDetails = ({
|
|||||||
<ListItem>
|
<ListItem>
|
||||||
<ListItemIcon sx={{ position: 'relative', left: '0.3em' }}>
|
<ListItemIcon sx={{ position: 'relative', left: '0.3em' }}>
|
||||||
<SendReceiveIcon
|
<SendReceiveIcon
|
||||||
sx={{ transform: 'scaleX(-1)', width: '0.9em', opacity: 0.7 }}
|
sx={{ transform: 'scaleX(-1)', width: '0.9em', opacity: 0.9 }}
|
||||||
color='secondary'
|
color='secondary'
|
||||||
/>
|
/>
|
||||||
</ListItemIcon>
|
</ListItemIcon>
|
||||||
@ -318,7 +318,7 @@ const OrderDetails = ({
|
|||||||
<ListItem>
|
<ListItem>
|
||||||
<ListItemIcon sx={{ position: 'relative', left: '0.3em' }}>
|
<ListItemIcon sx={{ position: 'relative', left: '0.3em' }}>
|
||||||
<SendReceiveIcon
|
<SendReceiveIcon
|
||||||
sx={{ left: '0.1em', width: '0.9em', opacity: 0.7 }}
|
sx={{ left: '0.1em', width: '0.9em', opacity: 0.9 }}
|
||||||
color='primary'
|
color='primary'
|
||||||
/>
|
/>
|
||||||
</ListItemIcon>
|
</ListItemIcon>
|
||||||
|
@ -76,6 +76,7 @@ const EncryptedSocketChat: React.FC<Props> = ({
|
|||||||
// On component unmount close reconnecting-websockets
|
// On component unmount close reconnecting-websockets
|
||||||
return () => {
|
return () => {
|
||||||
connection?.close();
|
connection?.close();
|
||||||
|
setConnection(undefined);
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ const EncryptedTurtleChat: React.FC<Props> = ({
|
|||||||
order_id: orderId,
|
order_id: orderId,
|
||||||
offset: lastIndex,
|
offset: lastIndex,
|
||||||
},
|
},
|
||||||
robot.tokenSHA256,
|
{ tokenSHA256: robot.tokenSHA256 },
|
||||||
)
|
)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
|
@ -4,7 +4,7 @@ from pathlib import Path
|
|||||||
from channels.db import database_sync_to_async
|
from channels.db import database_sync_to_async
|
||||||
from channels.middleware import BaseMiddleware
|
from channels.middleware import BaseMiddleware
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import AnonymousUser, User
|
from django.contrib.auth.models import AnonymousUser, User, update_last_login
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
from rest_framework.authtoken.models import Token
|
from rest_framework.authtoken.models import Token
|
||||||
from rest_framework.exceptions import AuthenticationFailed
|
from rest_framework.exceptions import AuthenticationFailed
|
||||||
@ -64,7 +64,8 @@ class RobotTokenSHA256AuthenticationMiddleWare:
|
|||||||
|
|
||||||
# Check if it is an existing robot.
|
# Check if it is an existing robot.
|
||||||
try:
|
try:
|
||||||
Token.objects.get(key=token_sha256_b91)
|
token = Token.objects.get(key=token_sha256_b91)
|
||||||
|
update_last_login(None, token.user)
|
||||||
|
|
||||||
except Token.DoesNotExist:
|
except Token.DoesNotExist:
|
||||||
# If we get here the user does not have a robot on this coordinator
|
# If we get here the user does not have a robot on this coordinator
|
||||||
|
Reference in New Issue
Block a user