From 3953603b066f977106762b1b743a4897ea831ea4 Mon Sep 17 00:00:00 2001 From: Francisco Sandoval Date: Mon, 17 Jul 2023 15:43:15 -0400 Subject: [PATCH] validaciones se realiza a nivel de model --- project/api/models.py | 24 ++++++++++++++++++++++++ project/api/views/auth.py | 11 ++++++----- project/api/views/persona.py | 15 ++++++++++++--- project/api/views/usuario.py | 18 +----------------- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/project/api/models.py b/project/api/models.py index 8e59245..3e75113 100644 --- a/project/api/models.py +++ b/project/api/models.py @@ -5,7 +5,10 @@ # * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table # Feel free to rename the models, but don't rename db_table values or field names. +from typing import Collection, Optional from django.db import models +from .validaciones import rut_valido +import logging class Aplicacion(models.Model): @@ -218,6 +221,14 @@ class Persona(models.Model): managed = False db_table = 'persona' + def save(self, *args, **kwargs): + # validacion se realiza solo si se esta creando el registro + if self._state.adding: + rut_completo = f'{self.rut}-{self.dv}' + if not rut_valido(rut_completo): + raise Exception(f'RUT {rut_completo}, no es valido!') + + super().save(*args, **kwargs) class Region(models.Model): id_region = models.IntegerField(primary_key=True) @@ -316,6 +327,19 @@ class Usuario(models.Model): managed = False db_table = 'usuario' + def save(self, *args, **kwargs): + # validacion se realiza solo si se esta creando el registro + if self._state.adding: + condition = models.Q(login=self.login) | models.Q(rut=self.rut) + usuario = Usuario.objects.filter(condition).first() + if usuario: + if usuario.login == self.login: + raise Exception(f"Usuario [{self.login}] ya existe!") + else: + raise Exception(f"Usuario con RUT [{self.rut}] ya existe!") + + super().save(*args, **kwargs) + class UsuarioRol(models.Model): login = models.ForeignKey(Usuario, models.DO_NOTHING, db_column='login', blank=True, null=True) diff --git a/project/api/views/auth.py b/project/api/views/auth.py index 320043b..6e32ba9 100644 --- a/project/api/views/auth.py +++ b/project/api/views/auth.py @@ -33,17 +33,18 @@ def jwt_login(request): usuario = { 'login': '0', 'clave': '0' } if not usuario: - return HttpResponse('Acceso no valido', status = 400) + return HttpResponse('Acceso no valido', status=400) if usuario['clave'] != password: - return HttpResponse('Acceso no valido', status = 400) + return HttpResponse('Acceso no valido', status=400) ahora = datetime.utcnow() - # manana = ahora + timedelta(days=1) - # manana = manana.replace(hour=0, minute=0, second=0, microsecond=0) + manana = ahora + timedelta(days=1) + manana = manana.replace(hour=0, minute=0, second=0, microsecond=0) payload = { - 'exp': ahora + timedelta(minutes=60), + 'iat': ahora, + 'exp': manana, # ahora + timedelta(minutes=60), 'login': usuario['login'] } token = jwt.encode(payload, private_key, algorithm="HS256") diff --git a/project/api/views/persona.py b/project/api/views/persona.py index bd1b498..9586002 100644 --- a/project/api/views/persona.py +++ b/project/api/views/persona.py @@ -1,11 +1,20 @@ -from rest_framework import viewsets, mixins -from rest_framework.response import Response +from rest_framework import viewsets from .. import models, serializers from django.http import HttpResponse +import logging class PersonaViewSet(viewsets.ModelViewSet): queryset = models.Persona.objects.all() serializer_class = serializers.PersonaSerializer def destroy(self, request, pk=None): - return HttpResponse('No permitido eliminar', status=405) \ No newline at end of file + return HttpResponse('No permitido eliminar', status=405) + + def create(self, request): + try: + super().create(request) + except Exception as e: + # logging.warning(e.detail['rut'][0]) + if e.detail['rut']: + return HttpResponse(e.detail['rut'][0], status=400) + return HttpResponse(e, status=400) \ No newline at end of file diff --git a/project/api/views/usuario.py b/project/api/views/usuario.py index fd7730b..f06c08b 100644 --- a/project/api/views/usuario.py +++ b/project/api/views/usuario.py @@ -1,15 +1,11 @@ from django.db import transaction from django.http import HttpResponse -from django.http import JsonResponse -from django.core.serializers import serialize from rest_framework import viewsets from rest_framework.response import Response -from rest_framework.decorators import action, api_view, schema from .. import models, schemas, serializers -from ..validaciones import rut_valido import json class UsuarioViewSet(viewsets.ModelViewSet): @@ -18,27 +14,15 @@ class UsuarioViewSet(viewsets.ModelViewSet): schema = schemas.UsuarioSchema() def retrieve(self, request, pk=None): - print({ 'pk': pk }) data = super().retrieve(request, pk) - print({ 'data': data }) return data def create(self, request): try: with transaction.atomic(): input = json.loads(request.body) - rut_completo = f"{input['rut']}-{input.get('dv','?')}" - if not rut_valido(rut_completo): - raise ValueError(f"RUT [{input['rut']}] no valido!") - - usuario = models.Usuario.objects.filter(login = input['login']).first() - if usuario: - raise ValueError(f"Usuario [{input['login']}] ya existe!") - - usuario = models.Usuario.objects.filter(rut = input['rut']).first() - if usuario: - raise ValueError(f"Usuario con RUT [{input['rut']}] ya existe!") + # validaciones se realiza a nivel del model persona = models.Persona.objects.filter(rut = input['rut']).first() id_tipo_tratamiento = input.get('id_tipo_tratamiento',None)