migrated to modern-rest

This commit is contained in:
straitz 2026-06-03 05:40:35 +09:00
parent d9a92569f0
commit 8e44c4501a
11 changed files with 1014 additions and 572 deletions

View file

@ -18,17 +18,19 @@ class TelemetryConsumer(AsyncWebsocketConsumer):
async def receive(self, text_data):
from .serializers import TelemetryPacketSerializer
from pydantic import ValidationError
from .dtos import TelemetryIn
if not self.write_enabled:
await self.send(text_data=json.dumps({"error": "Read-only mode"}))
return
data = json.loads(text_data)
serializer = TelemetryPacketSerializer(data=data)
if not serializer.is_valid():
await self.send(text_data=json.dumps({"error": serializer.errors}))
try:
TelemetryIn(**data)
except ValidationError as exc:
await self.send(text_data=json.dumps({"error": json.loads(exc.json())}))
return
saved_data = await self.save_telemetry(data)
@ -51,15 +53,6 @@ class TelemetryConsumer(AsyncWebsocketConsumer):
async def telemetry_message(self, event):
await self.send(text_data=json.dumps(event["data"]))
@database_sync_to_async
def get_user_from_token(self, token_key, Token):
from rest_framework.authtoken.models import Token
User = get_user_model()
try:
token = Token.objects.select_related("user").get(key=token_key)
return token.user
except Token.DoesNotExist:
return None
@database_sync_to_async
def save_telemetry(self, data):
@ -99,12 +92,20 @@ class StationTelemetryConsumer(TelemetryConsumer):
write_enabled = True
async def connect(self):
from rest_framework.authtoken.models import Token
from django.conf import settings
from dmr.security.jwt.token import JWToken
token_key = self.scope["query_string"].decode().split("token=")[-1]
try:
token = await database_sync_to_async(Token.objects.select_related("user").get)(key=token_key)
self.scope["user"] = token.user
except Token.DoesNotExist:
decoded = JWToken.decode(
encoded_token=token_key,
secret=settings.SECRET_KEY,
algorithm='HS256',
)
self.scope["user"] = await database_sync_to_async(
get_user_model().objects.get
)(pk=decoded.sub)
except Exception:
await self.close()
return