diff --git a/IMMEX/serializers.py b/IMMEX/serializers.py index 9845e56..b7330fc 100644 --- a/IMMEX/serializers.py +++ b/IMMEX/serializers.py @@ -1,4 +1,6 @@ from rest_framework import serializers +from django.contrib.auth import get_user_model +from allauth.account.models import EmailAddress from .models import ClientesA24 class ClientesA24Serailizer(serializers.ModelSerializer): @@ -8,4 +10,38 @@ class ClientesA24Serailizer(serializers.ModelSerializer): class SerialiazerA24(serializers.ModelSerializer): - pass \ No newline at end of file + pass + +User = get_user_model() + +class SignupSerializer(serializers.Serializer): + password = serializers.CharField(write_only=True) + password2 = serializers.CharField(write_only=True) + class Meta: + model = User + fields = ['username', 'password', 'email', 'first_name', 'last_name'] + def validate(self, data): + print(f'DATA {data}') + if data['password'] != data['password2']: + raise serializers.ValidationError("Las contraseñas no coinciden.") + return data + + def create(self, validated_data): + print(f'CREATE {validated_data}') + password2 = validated_data.get('password2') + if password2: + validated_data.pop('password2') + + # Asegurarse de tener el campo 'username' en validated_data + username = self.context['request'].data.get('username') + email = self.context['request'].data.get('email') + first_name = self.context['request'].data.get('first_name') + last_name = self.context['request'].data.get('last_name') + if not username: + raise serializers.ValidationError("El campo 'username' es requerido.") + + # Crear el usuario con los datos validados + user = User.objects.create_user(username=username, password=validated_data['password'], email=email, first_name=first_name, last_name= last_name) + # Crea el objeto Email asociado al usuario + EmailAddress.objects.create(user=user, email=user.email, primary=True, verified=False) + return user \ No newline at end of file diff --git a/IMMEX/urls.py b/IMMEX/urls.py index 4d2932d..1741e68 100644 --- a/IMMEX/urls.py +++ b/IMMEX/urls.py @@ -7,6 +7,5 @@ urlpatterns = [ path('create_Cliente/', views.ClientesIMMEX_CreateView.as_view(), name='ClientesIMMEX_Create'), path('checkRfcA24/', views.Check_IMMEX_RFC.as_view(), name='checkRfcA24' ), path('api/registro/', views.RegistroUsuarios.as_view(), name='api_registro'), - - + path('api/login/', views.LoginIMMEX.as_view(), name='api_login'), ] \ No newline at end of file diff --git a/IMMEX/views.py b/IMMEX/views.py index 216a973..c7cbd45 100644 --- a/IMMEX/views.py +++ b/IMMEX/views.py @@ -1,7 +1,11 @@ from django.shortcuts import render -from allauth.account.views import SignupView + +from allauth.account.models import EmailConfirmation, EmailAddress + from django.http import JsonResponse -from django.urls import reverse_lazy +from django.urls import reverse_lazy, reverse +from django.core.mail import send_mail + from Sistemas.models import Sistema, BitacoraErrores from .models import Sistemas_por_cliente_A24, ClientesA24 from django.views.generic.edit import CreateView @@ -16,8 +20,11 @@ from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from rest_framework.permissions import IsAuthenticated +from .serializers import SignupSerializer from Sistemas.permissions import ItsAdminToken, HasAuthorizationHeader +from django.utils import timezone + import urllib.parse import traceback @@ -70,20 +77,47 @@ class ClientesIMMEX_CreateView(CreateView): return response """---------API VIEWS---------""" +class LoginIMMEX(APIView): + pass class RegistroUsuarios(APIView): permission_classes = [ItsAdminToken] + def post(self,request, *args, **kwargs): try: - signup_view = SignupView(request=request) + print(request.data) - response = signup_view.dispatch(request) - if response.status_code == 302: - return Response({'message': 'Registro exitoso'}) - else: - return Response({'message': 'Error de registro', 'errors': response.context_data['form'].errors}) - except Exception as E: - return Response({'Error':f'Error al registro con datos del usuario {E}', 'isError':True}) + serializer = SignupSerializer(data=request.data,context={'request':request}) + if serializer.is_valid(): + user = serializer.save() + # Generar la confirmación de correo electrónico + email_address = EmailAddress.objects.get(user=user, email=user.email) + email_confirmation = EmailConfirmation.create(email_address) + self.send_email_confirmation(request, email_confirmation) + + return Response({'message': 'Registro exitoso'}) + else: + print(f'SERIALIZER ERROR {serializer.errors}') + return Response({'message': 'Error de validación', 'errors': serializer.errors}) + except Exception as E: + print(f'ERROR {E}') + return Response({'Error':f'Error al registro con datos del usuario {E}', 'isError':True}) + def send_email_confirmation(self, request, email_confirmation): + email_address = email_confirmation.email_address + email = email_address.email + + email_confirmation.sent = timezone.now() + email_confirmation.save() + + email_confirmation_url = request.build_absolute_uri(reverse('account_confirm_email', args=[email_confirmation.key])) + message = f"Por favor, confirma tu correo electrónico en el siguiente enlace: {email_confirmation_url}" + + send_mail( + subject='Confirmación de correo electrónico', + message=message, + from_email='aduanasoftpruebas@gmail.com', + recipient_list=[email], + ) class Check_IMMEX_RFC(APIView): """Verifica que el cliente pueda Timbrar""" permission_classes = [IsAuthenticated,ItsAdminToken]