Sistema_Gestion_Transporte/project/api/views.py

74 lines
2.4 KiB
Python
Raw Normal View History

2023-06-24 13:35:17 -04:00
from rest_framework import viewsets
2023-06-26 16:52:08 -04:00
from rest_framework.decorators import action, api_view, schema
from rest_framework.schemas import AutoSchema
2023-06-25 22:41:07 -04:00
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.http import JsonResponse
from .models import Usuario, Persona
2023-06-24 13:35:17 -04:00
from .models import Aplicacion
2023-06-25 22:41:07 -04:00
from .serializers import UsuarioSerializer, PersonaSerializer
2023-06-26 16:52:08 -04:00
from .serializers import AplicacionSerializer, AuthSerializer
2023-06-25 22:41:07 -04:00
import json
import jwt
import datetime
2023-06-26 16:52:08 -04:00
import coreapi
2023-06-25 22:41:07 -04:00
from decouple import config
private_key = config('SECRET_JWT')
2023-06-24 13:35:17 -04:00
# Create your views here.
class AplicacionViewSet(viewsets.ModelViewSet):
queryset = Aplicacion.objects.all()
2023-06-25 22:41:07 -04:00
serializer_class = AplicacionSerializer
2023-06-26 16:52:08 -04:00
ordering_fields = '__all__'
2023-06-25 22:41:07 -04:00
class PersonaViewSet(viewsets.ModelViewSet):
queryset = Persona.objects.all()
serializer_class = PersonaSerializer
class UsuarioViewSet(viewsets.ModelViewSet):
queryset = Usuario.objects.all()
serializer_class = UsuarioSerializer
2023-06-26 16:52:08 -04:00
class CustomAuthSchema(AutoSchema):
manual_fields = []
def get_manual_fields(self, path, method):
custom_fields = []
if method.lower() == 'post':
custom_fields = [
coreapi.Field('username', required=True, location='form', description='Usuario'),
coreapi.Field('password', required=True, location='form', description='Contraseña'),
]
return self._manual_fields + custom_fields
2023-06-25 22:41:07 -04:00
# Views jwt
@csrf_exempt
@action(detail=False, methods=['post','get'])
2023-06-26 16:52:08 -04:00
@api_view(['GET','POST'])
@schema(CustomAuthSchema())
2023-06-25 22:41:07 -04:00
def jwt_login(request):
if request.method == 'POST':
# validar username y password
json_data = json.loads(request.body)
username = json_data['username']
password = json_data['password']
usuario = Usuario.objects.filter(login = username, vigente = True).values().first()
if not usuario:
return HttpResponse('Acceso no valido', status = 400)
if usuario['clave'] != password:
return HttpResponse('Acceso no valido', status = 400)
now = datetime.datetime.utcnow()
payload = {
'exp': now + datetime.timedelta(minutes=60),
'login': usuario['login']
}
token = jwt.encode(payload, private_key, algorithm="HS256")
return JsonResponse({ 'token': token })
elif request.method == 'GET':
return JsonResponse(request.jwt_info)