from django.shortcuts import render, get_object_or_404, redirect from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib import messages from django.core.mail import send_mail from django.conf import settings from .models import Evento, Reserva from .forms import EventoForm from reymotausers.models import ReyMotaUser @login_required def reservar_evento(request, evento_id): evento = get_object_or_404(Evento, id=evento_id) # Verificar si el usuario ya tiene una reserva para este evento if Reserva.objects.filter(evento=evento, usuario=request.user).exists(): messages.error(request, 'Ya tienes una reserva para este evento.') print("Ya tienes una reserva para este evento.") return redirect('eventos:lista_eventos') # Verificar si quedan plazas disponibles if evento.plazas_restantes() > 0: Reserva.objects.create(evento=evento, usuario=request.user) # Enviar un correo con la información del evento asunto = f'Confirmación de Reserva para {evento.nombre}' mensaje = f'Hola {request.user.nombre},\n\n' \ f'Te has inscrito correctamente en el evento "{evento.nombre}".\n' \ f'Detalles del evento:\n' \ f'Nombre: {evento.nombre}\n' \ f'Descripción: {evento.descripcion}\n' \ f'Fecha: {evento.fecha.strftime("%d/%b/%y")} a las {evento.hora.hour}\n' \ f'\n¡Gracias por inscribirte!\n\n' send_mail( asunto, mensaje, settings.DEFAULT_FROM_EMAIL, [request.user.email], fail_silently=False, ) messages.success(request, f'Reserva realizada para el evento {evento.nombre}.') else: messages.error(request, 'Lo sentimos, no quedan plazas disponibles.') print("Lo sentimos, no quedan plazas disponibles.") return redirect('eventos:lista_eventos') @login_required def anular_reserva(request, evento_id): evento = get_object_or_404(Evento, id=evento_id) # Verificar si el usuario ya tiene una reserva para este evento if Reserva.objects.filter(evento=evento, usuario=request.user).exists(): messages.error(request, 'Vamos a solicitar la baja.') admin = ReyMotaUser.objects.filter(is_staff=True) for i in admin: if i.nombre == "Tino": # Enviar un correo con la información del evento asunto = f'Solicitud de cancelación en {evento.nombre}' mensaje = f'Hola,\n\n' \ f'{request.user.nombre} ha solicitado la baja en el "{evento.nombre}".\n' \ f'Detalles del evento:\n' \ f'Nombre: {evento.nombre}\n' \ f'Descripción: {evento.descripcion}\n' \ f'Fecha: {evento.fecha.strftime("%d/%b/%y")} a las {evento.hora.hour}\n' \ f'\n{request.user.nombre}, recuerda que si no encontramos a nadie y la plaza queda\n' \ f'desierta el coste de tu plaza en el pozo lo tienes que abonar tú\n\n' send_mail( asunto, mensaje, settings.DEFAULT_FROM_EMAIL, [request.user.email, i.email], fail_silently=False, ) return redirect('eventos:lista_eventos') return redirect('eventos:lista_eventos') @login_required def lista_eventos(request): eventos = Evento.objects.all() # Crear un diccionario que mapea cada evento con un booleano indicando si el usuario ya ha reservado eventos_con_reserva = [] for evento in eventos: inscrito = Reserva.objects.filter(evento=evento, usuario=request.user).exists() if request.user.is_authenticated else False eventos_con_reserva.append({ 'evento': evento, 'inscrito': inscrito, 'id': evento.id, 'nombre': evento.nombre, 'fecha': evento.fecha, 'plazas_disponibles': evento.plazas_disponibles, 'plazas_restantes': evento.plazas_restantes }) return render(request, 'eventos/lista_eventos.html', {'eventos_con_reserva': eventos_con_reserva}) def principal(request): return render(request, 'eventos/lista_eventos.html') def ayuda(request): return render(request, 'eventos/help.html') @login_required def detalle_evento(request, evento_id): evento = get_object_or_404(Evento, pk=evento_id) reservas = Reserva.objects.filter(evento=evento_id) for i in reservas: print("Reserva: ", i.usuario.nombre) return render(request, 'eventos/detalle_evento.html', {'evento': evento, 'reservas': reservas}) # Verificar si el usuario es administrador def es_admin(user): return user.is_staff @user_passes_test(es_admin) def crear_evento(request): if request.method == 'POST': form = EventoForm(request.POST) if form.is_valid(): form.save() messages.success(request, 'Evento creado exitosamente.') return redirect('eventos:lista_eventos') # Redirige a la lista de eventos else: form = EventoForm() return render(request, 'eventos/crear_evento.html', {'form': form})