Sistema_Gestion_Transporte/project/api/views.py

113 lines
3.5 KiB
Python
Raw Normal View History

2023-06-11 15:27:18 -04:00
# models
2023-06-06 21:04:01 -04:00
from django.contrib.auth.models import User
2023-06-11 15:27:18 -04:00
from .models import Project, Agency, Route
# serializers
2023-06-03 17:19:58 -04:00
from .serializers import ProjectSerializer, AgencySerializer, RouteSerializer
2023-06-10 08:35:22 -04:00
from .serializers import UserSerializer, AuthSerializer
from .exceptions import NotAuthorized, JWTExpired
2023-06-11 15:27:18 -04:00
# others
import jwt
import datetime
from decouple import config
from rest_framework.response import Response
from rest_framework import viewsets
from rest_framework.decorators import action
2023-06-03 17:19:58 -04:00
# Create your views here.
2023-06-03 17:19:58 -04:00
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
class AgencyViewSet(viewsets.ModelViewSet):
queryset = Agency.objects.all()
serializer_class = AgencySerializer
class RouteViewSet(viewsets.ModelViewSet):
queryset = Route.objects.all()
2023-06-06 21:04:01 -04:00
serializer_class = RouteSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
2023-06-10 08:35:22 -04:00
serializer_class = UserSerializer
"""
Metodos de generacion de jwt en forma manual
"""
2023-06-11 15:27:18 -04:00
private_key = config('SECRET_JWT','palabrasecreta')
# @csrf_exempt
2023-06-10 08:35:22 -04:00
class AuthViewSet(viewsets.ViewSet):
serializer_class = AuthSerializer
def list(self, request):
return Response()
def create(self, request):
username = request.data.get('username')
password = request.data.get('password')
2023-06-10 08:35:22 -04:00
user = User.objects.filter(username = username).first()
if not user:
raise NotAuthorized
is_correct = user.check_password(password)
if not is_correct:
raise NotAuthorized
2023-06-11 15:27:18 -04:00
now = datetime.datetime.utcnow()
2023-06-10 08:35:22 -04:00
payload = {
'exp': now + datetime.timedelta(minutes=1),
2023-06-11 15:27:18 -04:00
'user_id': user.id
2023-06-10 08:35:22 -04:00
}
token = jwt.encode(payload, private_key, algorithm="HS256")
response = Response({ 'token': token })
# response.set_cookie('token', token)
return response
2023-06-11 15:27:18 -04:00
@action(detail=False, methods=['get'])
2023-06-11 15:27:18 -04:00
def info(self, request, pk=None):
token = request.COOKIES.get('token')
if not token:
return Response(data = None, content_type = 'application/json')
try:
decode = jwt.decode(token, private_key, algorithms= ["HS256"])
2023-06-13 10:27:15 -04:00
except jwt.ExpiredSignatureError:
raise JWTExpired
user = User.objects.filter(id = decode.get('user_id')).values().first()
if (not user):
raise NotAuthorized
return Response({
'id': user.get('id'),
'username': user.get('username'),
'first_name': user.get('first_name'),
'last_name': user.get('last_name'),
'email': user.get('email'),
'token': token,
})
@action(detail=False, methods=['post'])
def set_token(self, request, pk=None):
2023-06-11 15:27:18 -04:00
token = request.data.get('token')
decode = jwt.decode(token, private_key, algorithms= ["HS256"])
user = User.objects.filter(id = decode.get('user_id')).values().first()
if (not user):
raise NotAuthorized
2023-06-11 15:27:18 -04:00
return Response({
'id': user.get('id'),
'username': user.get('username'),
'first_name': user.get('first_name'),
'last_name': user.get('last_name'),
'email': user.get('email'),
'token': token,
})
@action(detail=False, methods=['post'])
def logout(self, request, pk=None):
response = Response()
response.delete_cookie('token')
return response