Tesis 1.0.0
Loading...
Searching...
No Matches
views.py
Go to the documentation of this file.
1from rest_framework.views import APIView
2from rest_framework.response import Response
3from rest_framework.permissions import IsAuthenticated
4from .models import DetallePedido, Pedido, Carrito
5from appFOOD.models import Producto
6from datetime import date, datetime
7from .serializers import DetallePedidoSerializer, ModificarCantidadSerializer
8from asgiref.sync import sync_to_async
9from appUSERS.models import Usuario
10from rest_framework import status
11from asgiref.sync import sync_to_async
12from appUSERS.models import Usuario
13from rest_framework import status
14
16 permission_classes = [IsAuthenticated]
17
18 def post(self, request, producto_id):
19
20 producto = Producto.objects.get(pk=producto_id)
21 cantidad = int(request.data.get('cantidad'))
22 id_usuario = request.user.id_usuario
23 direccion = request.data.get('direccion')
24
25 current_time = datetime.now().time()
26 pedido, created = Pedido.objects.get_or_create(id_usuario_id=id_usuario, estado="Pendiente")
27
28 # Si el usuario envía una dirección, actualizarla en su perfil
29 if direccion:
30 request.user.direccion = direccion
31 request.user.save()
32 # Actualizar la dirección de entrega en todos los detalles del pedido pendiente
33 if not created:
34 DetallePedido.objects.filter(id_pedido=pedido).update(direccion_entrega=direccion)
35 # Si no hay dirección en la petición, intentar usar la del perfil
36 elif request.user.direccion:
37 direccion = request.user.direccion
38 # Si no hay dirección en ninguna parte, usar valor por defecto
39 else:
40 direccion = 'Sin especificar'
41
42 if cantidad > producto.stock:
43 return Response({'error': 'Stock insuficiente'}, status=400)
44
45 # Actualizar dirección de entrega siempre
46 pedido.direccion_entrega = direccion
47 pedido.save()
48 # Actualizar la dirección de entrega en todos los detalles del pedido (incluido el nuevo)
49 DetallePedido.objects.filter(id_pedido=pedido).update(direccion_entrega=direccion)
50
51 if created:
52 pedido.hora_pedido = current_time
53 pedido.fecha_pedido = date.today()
54 pedido.save()
55
56 carrito, carritoCreated = Carrito.objects.get_or_create(producto_id=producto.id_producto, usuario_id=id_usuario, id_pedido_id=pedido.id_pedidos)
57 if carritoCreated:
58 carrito.cantidad = cantidad
59 carrito.save()
60 else:
61 carrito.cantidad += cantidad
62 carrito.save()
63
64 detallePedido, detalleCreated = DetallePedido.objects.get_or_create(
65 precio_producto=producto.precio, id_pedido_id=pedido.id_pedidos, id_producto_id=producto.id_producto)
66
67 if detalleCreated:
68 detallePedido.cantidad_productos = cantidad
69 detallePedido.subtotal = detallePedido.cantidad_productos * detallePedido.precio_producto
70 detallePedido.save()
71 else:
72 detallePedido.cantidad_productos += cantidad
73 detallePedido.subtotal = detallePedido.cantidad_productos * detallePedido.precio_producto
74 detallePedido.save()
75
76 # Ahora sí, actualizar la dirección en todos los detalles del pedido (incluido el nuevo)
77 DetallePedido.objects.filter(id_pedido=pedido).update(direccion_entrega=pedido.direccion_entrega)
78
79 producto.stock -= cantidad
80 producto.save()
81 return Response({'message': 'Producto agregado al carrito'})
82
83class VerCarrito(APIView):
84 permission_classes = [IsAuthenticated]
85
86 def get(self, request):
87 usuario = request.user
88 id_usuario = usuario.id_usuario
89
90 detalles_carrito = Carrito.objects.select_related("id_pedido").all().filter(usuario_id=id_usuario)
91 carrito_data = [
92 {
93 "id": detalle.id,
94 'producto': detalle.producto.nombre_producto,
95 'cantidad': detalle.cantidad,
96 "precio": detalle.producto.precio,
97 "imageURL": detalle.producto.imageURL
98 } for detalle in detalles_carrito]
99
100 return Response(carrito_data)
101
102class ConfirmarPedido(APIView):
103 permission_classes = [IsAuthenticated]
104
105 def post(self, request):
106 try:
107 usuario = request.user
108 id_usuario = usuario.id_usuario
109
110 detalles_carrito = Carrito.objects.filter(usuario_id=id_usuario)
111 pedido = Pedido.objects.get(id_usuario_id=id_usuario, estado="Pendiente")
112
113 if not detalles_carrito.exists():
114 return Response({'error': 'El carrito está vacío'}, status=400)
115
116 # Verificar que el pedido tenga dirección de entrega
117 if not pedido.direccion_entrega or pedido.direccion_entrega == 'Sin especificar':
118 if usuario.direccion:
119 pedido.direccion_entrega = usuario.direccion
120
121 detalles_carrito.delete()
122 pedido.estado = "Aprobado"
123 pedido.save()
124
125 return Response({'message': 'Pedido confirmado'})
126 except Carrito.DoesNotExist:
127 return Response({"error": "El carrito está vacio."}, status=status.HTTP_404_NOT_FOUND)
128 except Pedido.DoesNotExist:
129 return Response({"error": "El carrito está vacio."}, status=status.HTTP_404_NOT_FOUND)
130
132 permission_classes = [IsAuthenticated]
133
134 def delete(self, request, carrito_id):
135
136 try:
137
138 carrito_item = Carrito.objects.get(pk=carrito_id)
139
140 detalle_item = DetallePedido.objects.get(id_producto_id=carrito_item.producto.id_producto, id_pedido_id = carrito_item.id_pedido)
141
142 producto = carrito_item.producto
143 producto.stock += carrito_item.cantidad
144 producto.save()
145 carrito_item.delete()
146 detalle_item.delete()
147 return Response({'message': 'Producto eliminado del carrito'})
148 except Carrito.DoesNotExist:
149 return Response({"error": "No existe un producto en el carrito con ese id de carrito."}, status=status.HTTP_404_NOT_FOUND)
150
151class VerDashboard(APIView):
152 permission_classes = [IsAuthenticated]
153
154 def get(self, request):
155 usuario = request.user
156 id_usuario = usuario.id_usuario
157 vistaPedidos = Pedido.objects.prefetch_related('detalles').all().filter(id_usuario_id=id_usuario)
158 # Eliminar print innecesario
159
160 carrito_data = []
161 for pedido in vistaPedidos:
162 # Obtener dirección del pedido, o usar la del usuario, o usar valor por defecto
163 direccion_entrega = pedido.direccion_entrega
164 if not direccion_entrega or direccion_entrega == 'Sin especificar':
165 direccion_entrega = usuario.direccion if usuario.direccion else 'Sin especificar'
166
167 # Si estamos usando la dirección del usuario, actualizar también el pedido
168 if direccion_entrega != 'Sin especificar' and direccion_entrega != pedido.direccion_entrega:
169 pedido.direccion_entrega = direccion_entrega
170 pedido.save()
171
172 carrito_data.append({
173 "id_pedidos": pedido.id_pedidos,
174 "fecha_pedido": pedido.fecha_pedido,
175 "direccion_entrega": direccion_entrega,
176 "estado": pedido.estado,
177 "detalles": DetallePedidoSerializer(pedido.detalles.all(), many=True).data
178 })
179
180 return Response({"results": carrito_data})
181
183 permission_classes = [IsAuthenticated]
184
185 def put(self, request, carrito_id):
186 serializer = ModificarCantidadSerializer(data=request.data)
187 if serializer.is_valid():
188 nueva_cantidad = serializer.validated_data['cantidad']
189 try:
190 carrito_item = Carrito.objects.get(pk=carrito_id)
191 producto = carrito_item.producto
192
193 if nueva_cantidad > producto.stock + carrito_item.cantidad:
194 return Response({'error': 'Stock insuficiente'}, status=400)
195
196 diferencia_cantidad = nueva_cantidad - carrito_item.cantidad
197 carrito_item.cantidad = nueva_cantidad
198 carrito_item.save()
199
200 producto.stock -= diferencia_cantidad
201 producto.save()
202
203 detalle_item = DetallePedido.objects.get(id_producto_id=carrito_item.producto.id_producto, id_pedido_id=carrito_item.id_pedido)
204 detalle_item.cantidad_productos = nueva_cantidad
205 detalle_item.subtotal = detalle_item.cantidad_productos * detalle_item.precio_producto
206 detalle_item.save()
207
208 return Response({'message': 'Cantidad de producto actualizada en el carrito'})
209 except Carrito.DoesNotExist:
210 return Response({"error": "No existe un producto en el carrito con ese id de carrito."}, status=status.HTTP_404_NOT_FOUND)
211 except DetallePedido.DoesNotExist:
212 return Response({"error": "No existe un detalle de pedido para este producto en el carrito."}, status=status.HTTP_404_NOT_FOUND)
213 else:
214 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
215
216class VerDetallePedido(APIView):
217 permission_classes = [IsAuthenticated]
218
219 def get(self, request, pedido_id):
220 try:
221 usuario = request.user
222 pedido = Pedido.objects.prefetch_related('detalles').get(
223 id_pedidos=pedido_id, id_usuario=usuario.id_usuario
224 )
225
226 # Obtener los detalles del pedido
227 detalles = DetallePedido.objects.filter(id_pedido=pedido)
228
229 # Calcular monto total
230 monto_total = sum(detalle.subtotal for detalle in detalles)
231
232 # Verificar la dirección de entrega
233 direccion_entrega = pedido.direccion_entrega
234 if not direccion_entrega or direccion_entrega == 'Sin especificar':
235 direccion_entrega = usuario.direccion if usuario.direccion else 'Sin especificar'
236
237 # Crear respuesta con información completa
238 respuesta = {
239 'pedido': {
240 'id_pedidos': pedido.id_pedidos,
241 'fecha_pedido': pedido.fecha_pedido,
242 'hora_pedido': pedido.hora_pedido,
243 'direccion_entrega': direccion_entrega,
244 'estado': pedido.estado,
245 'monto_total': monto_total
246 },
247 'detalles': [
248 {
249 'producto': detalle.id_producto.nombre_producto,
250 'cantidad': detalle.cantidad_productos,
251 'precio_unitario': detalle.precio_producto,
252 'subtotal': detalle.subtotal,
253 'imagen': detalle.id_producto.imageURL if hasattr(detalle.id_producto, 'imageURL') else None
254 } for detalle in detalles
255 ]
256 }
257
258 return Response(respuesta)
259 except Pedido.DoesNotExist:
260 return Response({"error": "Pedido no encontrado"}, status=status.HTTP_404_NOT_FOUND)
261
262class EntregarPedido(APIView):
263 permission_classes = [IsAuthenticated]
264
265 def put(self, request):
266 id_pedidos = request.data.get('id_pedidos')
267 if not id_pedidos:
268 return Response({'error': 'Falta el id del pedido'}, status=400)
269 try:
270 pedido = Pedido.objects.get(id_pedidos=id_pedidos, id_usuario=request.user.id_usuario)
271 if pedido.estado != 'Aprobado':
272 return Response({'error': 'Solo se pueden entregar pedidos aprobados'}, status=400)
273 pedido.estado = 'Entregado'
274 pedido.save()
275 return Response({'message': 'Pedido entregado correctamente'})
276 except Pedido.DoesNotExist:
277 return Response({'error': 'Pedido no encontrado'}, status=404)
278
post(self, request, producto_id)
Definition views.py:18
delete(self, request, carrito_id)
Definition views.py:134
get(self, request)
Definition views.py:86
get(self, request)
Definition views.py:154
get(self, request, pedido_id)
Definition views.py:219