Tesis 1.0.0
Loading...
Searching...
No Matches
views.py
Go to the documentation of this file.
1from rest_framework import generics, authentication, permissions, status
2from appCART.models import Carrito, Pedido
3from appUSERS.serializers import UsuarioSerializer, AuthTokenSerializer
4from rest_framework.views import APIView
5from rest_framework.response import Response
6from rest_framework_simplejwt.tokens import RefreshToken
7
8
9class CreateUsuarioView(generics.CreateAPIView):
10 serializer_class = UsuarioSerializer
11
12 def create(self, request, *args, **kwargs):
13 # Obtener el correo electrónico del nuevo registro
14 email = request.data.get('email')
15
16 if email: # Buscar si existe un usuario inactivo con este mismo correo como último correo
17 from appUSERS.models import Usuario
18 try:
19 # Usar filter en vez de get para manejar el caso de múltiples usuarios con el mismo email
20 inactive_users = Usuario.objects.filter(last_email=email, is_active=False)
21
22 if inactive_users.exists():
23 # Tomar el primer usuario inactivo encontrado (o podríamos usar el más reciente)
24 inactive_user = inactive_users.first()
25
26 # Si lo encontramos, vamos a reactivar al usuario y actualizar sus datos
27 inactive_user.is_active = True
28 inactive_user.email = email # Restauramos el email original
29
30 # Actualizamos los datos con la nueva información
31 if 'nombre' in request.data:
32 inactive_user.nombre = request.data['nombre']
33 if 'apellido' in request.data:
34 inactive_user.apellido = request.data['apellido']
35 if 'telefono' in request.data:
36 inactive_user.telefono = request.data['telefono']
37 if 'direccion' in request.data:
38 inactive_user.direccion = request.data['direccion']
39 if 'imagen_perfil_url' in request.data:
40 inactive_user.imagen_perfil_url = request.data['imagen_perfil_url']
41
42 # Si hay contraseña, la actualizamos
43 if 'password' in request.data:
44 inactive_user.set_password(request.data['password'])
45
46 # Guardamos los cambios
47 inactive_user.save()
48
49 # Serializamos el usuario reactivado para devolverlo
50 serializer = self.get_serializer(inactive_user)
51 return Response(serializer.data, status=status.HTTP_201_CREATED)
52
53 except Usuario.DoesNotExist:
54 # Si no existe un usuario inactivo con ese email, continuamos normal
55 pass
56
57 # Proceso normal si no hay reactivación
58 return super().create(request, *args, **kwargs)
59
60
61class RetrieveUpdateUsuarioView(generics.RetrieveUpdateAPIView):
62 serializer_class = UsuarioSerializer
63 authentication_classes = [authentication.TokenAuthentication]
64 permission_classes = [permissions.IsAuthenticated]
65
66 def get_object(self):
67 return self.request.user
68
69
70
71class CreateTokenView(APIView):
72 serializer_class = AuthTokenSerializer
73
74 def post(self, request, *args, **kwargs):
75 serializer = self.serializer_class(data=request.data, context={'request': request})
76 serializer.is_valid(raise_exception=True)
77 user = serializer.validated_data['user']
78 refresh = RefreshToken.for_user(user)
79 access_token = refresh.access_token
80 return Response({
81 'email': user.email,
82 'user_id': user.pk,
83 'refresh': str(refresh),
84 'access': str(access_token),
85 'nombre': user.nombre,
86 'apellido': user.apellido,
87 'telefono': user.telefono,
88 'direccion': user.direccion,
89 'admin': user.is_superuser,
90 'imagen_perfil_url': user.imagen_perfil_url
91 }, status=status.HTTP_200_OK)
92
93class LogoutView(APIView):
94 permission_classes = [permissions.IsAuthenticated]
95
96 def post(self, request):
97 try:
98 return Response({"detalle": "Logout Satisfactorio."}, status=status.HTTP_200_OK)
99 except Exception as e:
100
101 return Response({"detalle": "Error inesperado."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
102
103class UpdateProfileView(APIView):
104 permission_classes = [permissions.IsAuthenticated]
105
106 def put(self, request):
107 user = request.user
108 serializer = UsuarioSerializer(user, data=request.data, partial=True)
109 if serializer.is_valid():
110 serializer.save()
111 return Response(serializer.data, status=status.HTTP_200_OK)
112 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
113
114class DeleteProfileView(APIView):
115 permission_classes = [permissions.IsAuthenticated]
116
117 def delete(self, request):
118 user = request.user
119
120 # Guardamos el email original para referencia futura
121 original_email = user.email
122
123 # En lugar de eliminar físicamente, desactivamos la cuenta (borrado lógico)
124 user.is_active = False
125
126 # Guardar el email original en un campo adicional para una posible reactivación
127 user.last_email = original_email
128
129 # Cambiamos el email actual para permitir nuevos registros con ese mismo email
130 user.email = f"deleted_{user.id_usuario}@example.com" # Evitar conflictos al registrarse de nuevo
131
132 # Opcional: podemos limpiar algunos datos sensibles pero manteniendo el registro
133 # user.nombre = "Usuario"
134 # user.apellido = "Eliminado"
135 # user.telefono = ""
136 # user.direccion = ""
137 # user.imagen_perfil_url = ""
138
139 # Guardamos los cambios
140 user.save()
141
142 return Response({
143 "detalle": "Cuenta desactivada correctamente. Puedes volver a registrarte en cualquier momento.",
144 "email_original": original_email
145 }, status=status.HTTP_200_OK)
146
148 permission_classes = [permissions.IsAuthenticated]
149
150 def post(self, request):
151 user = request.user
152
153 # Verificar si se proporcionó una URL de imagen
154 if 'imagen_perfil_url' not in request.data:
155 return Response({"error": "No se proporcionó ninguna URL de imagen"}, status=status.HTTP_400_BAD_REQUEST)
156
157 # Actualizar solo el campo de imagen_perfil_url
158 serializer = UsuarioSerializer(user, data={'imagen_perfil_url': request.data['imagen_perfil_url']}, partial=True)
159
160 if serializer.is_valid():
161 serializer.save()
162
163 # Devolvemos los datos actualizados incluida la URL de la imagen
164 return Response({
165 'mensaje': 'URL de imagen de perfil actualizada correctamente',
166 'imagen_perfil_url': user.imagen_perfil_url
167 }, status=status.HTTP_200_OK)
168
169 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
170
171class PerfilUsuarioView(APIView):
172 permission_classes = [permissions.IsAuthenticated]
173
174 def get(self, request):
175 serializer = UsuarioSerializer(request.user)
176 return Response(serializer.data)
post(self, request, *args, **kwargs)
Definition views.py:74
create(self, request, *args, **kwargs)
Definition views.py:12
post(self, request)
Definition views.py:96