41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
"""Tokens API Viewset"""
|
|
from uuid import UUID
|
|
|
|
from django.http.response import Http404
|
|
from rest_framework.decorators import action
|
|
from rest_framework.request import Request
|
|
from rest_framework.response import Response
|
|
from rest_framework.serializers import ModelSerializer
|
|
from rest_framework.viewsets import ModelViewSet
|
|
|
|
from passbook.audit.models import Event, EventAction
|
|
from passbook.core.models import Token
|
|
|
|
|
|
class TokenSerializer(ModelSerializer):
|
|
"""Token Serializer"""
|
|
|
|
class Meta:
|
|
|
|
model = Token
|
|
fields = ["pk", "identifier", "intent", "user", "description"]
|
|
|
|
|
|
class TokenViewSet(ModelViewSet):
|
|
"""Token Viewset"""
|
|
|
|
lookup_field = "identifier"
|
|
queryset = Token.filter_not_expired()
|
|
serializer_class = TokenSerializer
|
|
|
|
@action(detail=True)
|
|
# pylint: disable=invalid-name
|
|
def view_key(self, request: Request, pk: UUID) -> Response:
|
|
"""Return token key and log access"""
|
|
tokens = Token.filter_not_expired(pk=pk)
|
|
if not tokens.exists():
|
|
raise Http404
|
|
token = tokens.first()
|
|
Event.new(EventAction.TOKEN_VIEW, token=token).from_http(request)
|
|
return Response({"key": token.key})
|