From df4326fa7793df491c5504cc4cc9e4731881ecfd Mon Sep 17 00:00:00 2001 From: Celestino Rey Date: Thu, 3 Oct 2024 12:52:55 +0200 Subject: [PATCH] =?UTF-8?q?Gesti=C3=B3n=20de=20lista=20de=20espera=20y=20g?= =?UTF-8?q?itignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JugarAlPadel/.dockerignore | 6 +- JugarAlPadel/.gitignore | 2 + .../gestion_reservas/eventos/forms.py | 7 ++ .../eventos/migrations/0003_listaespera.py | 25 +++++++ .../gestion_reservas/eventos/models.py | 9 +++ JugarAlPadel/gestion_reservas/eventos/urls.py | 2 +- .../gestion_reservas/eventos/views.py | 71 ++++++++----------- .../eventos/apuntar_lista_espera.html | 35 +++++++++ 8 files changed, 114 insertions(+), 43 deletions(-) create mode 100644 JugarAlPadel/.gitignore create mode 100644 JugarAlPadel/gestion_reservas/eventos/migrations/0003_listaespera.py create mode 100644 JugarAlPadel/gestion_reservas/templates/eventos/apuntar_lista_espera.html diff --git a/JugarAlPadel/.dockerignore b/JugarAlPadel/.dockerignore index 9e55a94..e1fc6a9 100644 --- a/JugarAlPadel/.dockerignore +++ b/JugarAlPadel/.dockerignore @@ -1,5 +1,7 @@ Dockerfile Makefile -volcadossql/ venv/ -reymota/lyrics/management/ +eventos/migrations/* +reymotausers/migrations/* +gestion_reservas/db.sqlite + diff --git a/JugarAlPadel/.gitignore b/JugarAlPadel/.gitignore new file mode 100644 index 0000000..e2dcc33 --- /dev/null +++ b/JugarAlPadel/.gitignore @@ -0,0 +1,2 @@ +db.sqlite3 +*initial* \ No newline at end of file diff --git a/JugarAlPadel/gestion_reservas/eventos/forms.py b/JugarAlPadel/gestion_reservas/eventos/forms.py index 19785d2..6aadaa3 100644 --- a/JugarAlPadel/gestion_reservas/eventos/forms.py +++ b/JugarAlPadel/gestion_reservas/eventos/forms.py @@ -1,6 +1,7 @@ from django import forms from .models import Evento +from .models import ListaEspera class EventoForm(forms.ModelForm): @@ -12,3 +13,9 @@ class EventoForm(forms.ModelForm): 'fecha': forms.DateInput(attrs={'type': 'date'}), 'hora': forms.TimeInput(attrs={'type': 'time'}), # Widget para seleccionar la hora } + + +class ListaEsperaForm(forms.ModelForm): + class Meta: + model = ListaEspera + fields = [] diff --git a/JugarAlPadel/gestion_reservas/eventos/migrations/0003_listaespera.py b/JugarAlPadel/gestion_reservas/eventos/migrations/0003_listaespera.py new file mode 100644 index 0000000..514ec40 --- /dev/null +++ b/JugarAlPadel/gestion_reservas/eventos/migrations/0003_listaespera.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2 on 2024-10-03 09:44 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('eventos', '0002_initial'), + ] + + operations = [ + migrations.CreateModel( + name='ListaEspera', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fecha_apuntado', models.DateTimeField(auto_now_add=True)), + ('evento', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lista_espera', to='eventos.evento')), + ('usuario', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/JugarAlPadel/gestion_reservas/eventos/models.py b/JugarAlPadel/gestion_reservas/eventos/models.py index 4210bba..f8109ad 100644 --- a/JugarAlPadel/gestion_reservas/eventos/models.py +++ b/JugarAlPadel/gestion_reservas/eventos/models.py @@ -26,3 +26,12 @@ class Reserva(models.Model): def __str__(self): return f'{self.usuario.nombre} - {self.evento.nombre}' + + +class ListaEspera(models.Model): + evento = models.ForeignKey(Evento, on_delete=models.CASCADE, related_name="lista_espera") + usuario = models.ForeignKey(ReyMotaUser, on_delete=models.CASCADE) + fecha_apuntado = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f'{self.usuario.username} en lista de espera para {self.evento.nombre}' \ No newline at end of file diff --git a/JugarAlPadel/gestion_reservas/eventos/urls.py b/JugarAlPadel/gestion_reservas/eventos/urls.py index 9fa53a7..093f2d3 100644 --- a/JugarAlPadel/gestion_reservas/eventos/urls.py +++ b/JugarAlPadel/gestion_reservas/eventos/urls.py @@ -6,7 +6,7 @@ app_name = 'eventos' urlpatterns = [ path('eventos/', views.lista_eventos, name='lista_eventos'), path('eventos//', views.detalle_evento, name='detalle_evento'), - path('eventos/anular_reserva//', views.anular_reserva, name='anular_reserva'), + path('eventos/apuntar_lista_espera//', views.apuntar_lista_espera, name='apuntar_lista_espera'), path('eventos/ayuda/', views.ayuda, name='ayuda'), path('eventos/crear/', views.crear_evento, name='crear_evento'), # URL para crear un evento diff --git a/JugarAlPadel/gestion_reservas/eventos/views.py b/JugarAlPadel/gestion_reservas/eventos/views.py index 0b644f0..7957772 100644 --- a/JugarAlPadel/gestion_reservas/eventos/views.py +++ b/JugarAlPadel/gestion_reservas/eventos/views.py @@ -4,9 +4,8 @@ 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 +from .models import Evento, Reserva, ListaEspera +from .forms import ListaEsperaForm, EventoForm @login_required @@ -51,42 +50,6 @@ def reservar_evento(request, evento_id): 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() @@ -96,6 +59,11 @@ def lista_eventos(request): for evento in eventos: inscrito = Reserva.objects.filter(evento=evento, usuario=request.user).exists() if request.user.is_authenticated else False + if ListaEspera.objects.filter(evento=evento, usuario=request.user).exists(): + en_espera = True + else: + en_espera = False + eventos_con_reserva.append({ 'evento': evento, 'inscrito': inscrito, @@ -103,7 +71,9 @@ def lista_eventos(request): 'nombre': evento.nombre, 'fecha': evento.fecha, 'plazas_disponibles': evento.plazas_disponibles, - 'plazas_restantes': evento.plazas_restantes + 'plazas_restantes': evento.plazas_restantes, + 'en_espera': en_espera, + 'usuario': request.user }) return render(request, 'eventos/lista_eventos.html', {'eventos_con_reserva': eventos_con_reserva}) @@ -146,3 +116,24 @@ def crear_evento(request): form = EventoForm() return render(request, 'eventos/crear_evento.html', {'form': form}) + + +@login_required +def apuntar_lista_espera(request, evento_id): + evento = get_object_or_404(Evento, id=evento_id) + + # Verificar si el usuario ya está en la lista de espera + if ListaEspera.objects.filter(evento=evento, usuario=request.user).exists(): + messages.error(request, 'Ya estás en la lista de espera para este evento.') + return redirect('eventos:lista_eventos') + + # Crear una entrada en la lista de espera + if request.method == 'POST': + form = ListaEsperaForm(request.POST) + if form.is_valid(): + ListaEspera.objects.create(evento=evento, usuario=request.user) + messages.success(request, 'Te has apuntado a la lista de espera para este evento.') + return redirect('eventos:lista_eventos') + + form = ListaEsperaForm() + return render(request, 'eventos/apuntar_lista_espera.html', {'form': form, 'evento': evento}) \ No newline at end of file diff --git a/JugarAlPadel/gestion_reservas/templates/eventos/apuntar_lista_espera.html b/JugarAlPadel/gestion_reservas/templates/eventos/apuntar_lista_espera.html new file mode 100644 index 0000000..9134d30 --- /dev/null +++ b/JugarAlPadel/gestion_reservas/templates/eventos/apuntar_lista_espera.html @@ -0,0 +1,35 @@ +{% extends 'base.html' %} + +{% block menuapp %} + +{% endblock menuapp %} + +{% block content %} +
+
+
+ {% if messages %} +
    + {% for message in messages %} + {{ message }} + {% endfor %} +
+ {% endif %} +
+
+ +
+
+

Lista de espera para {{ evento.nombre }}

+

Este evento está completo, pero puedes apuntarte a la lista de espera.

+ +
+ {% csrf_token %} + +
+ + Volver a la lista de eventos +
+
+
+{% endblock %}