Browse Source

Gestión de lista de espera y gitignore

politica
Celestino Rey 1 year ago
parent
commit
df4326fa77
8 changed files with 114 additions and 43 deletions
  1. +4
    -2
      JugarAlPadel/.dockerignore
  2. +2
    -0
      JugarAlPadel/.gitignore
  3. +7
    -0
      JugarAlPadel/gestion_reservas/eventos/forms.py
  4. +25
    -0
      JugarAlPadel/gestion_reservas/eventos/migrations/0003_listaespera.py
  5. +9
    -0
      JugarAlPadel/gestion_reservas/eventos/models.py
  6. +1
    -1
      JugarAlPadel/gestion_reservas/eventos/urls.py
  7. +31
    -40
      JugarAlPadel/gestion_reservas/eventos/views.py
  8. +35
    -0
      JugarAlPadel/gestion_reservas/templates/eventos/apuntar_lista_espera.html

+ 4
- 2
JugarAlPadel/.dockerignore View File

@ -1,5 +1,7 @@
Dockerfile Dockerfile
Makefile Makefile
volcadossql/
venv/ venv/
reymota/lyrics/management/
eventos/migrations/*
reymotausers/migrations/*
gestion_reservas/db.sqlite

+ 2
- 0
JugarAlPadel/.gitignore View File

@ -0,0 +1,2 @@
db.sqlite3
*initial*

+ 7
- 0
JugarAlPadel/gestion_reservas/eventos/forms.py View File

@ -1,6 +1,7 @@
from django import forms from django import forms
from .models import Evento from .models import Evento
from .models import ListaEspera
class EventoForm(forms.ModelForm): class EventoForm(forms.ModelForm):
@ -12,3 +13,9 @@ class EventoForm(forms.ModelForm):
'fecha': forms.DateInput(attrs={'type': 'date'}), 'fecha': forms.DateInput(attrs={'type': 'date'}),
'hora': forms.TimeInput(attrs={'type': 'time'}), # Widget para seleccionar la hora 'hora': forms.TimeInput(attrs={'type': 'time'}), # Widget para seleccionar la hora
} }
class ListaEsperaForm(forms.ModelForm):
class Meta:
model = ListaEspera
fields = []

+ 25
- 0
JugarAlPadel/gestion_reservas/eventos/migrations/0003_listaespera.py View File

@ -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)),
],
),
]

+ 9
- 0
JugarAlPadel/gestion_reservas/eventos/models.py View File

@ -26,3 +26,12 @@ class Reserva(models.Model):
def __str__(self): def __str__(self):
return f'{self.usuario.nombre} - {self.evento.nombre}' 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}'

+ 1
- 1
JugarAlPadel/gestion_reservas/eventos/urls.py View File

@ -6,7 +6,7 @@ app_name = 'eventos'
urlpatterns = [ urlpatterns = [
path('eventos/', views.lista_eventos, name='lista_eventos'), path('eventos/', views.lista_eventos, name='lista_eventos'),
path('eventos/<int:evento_id>/', views.detalle_evento, name='detalle_evento'), path('eventos/<int:evento_id>/', views.detalle_evento, name='detalle_evento'),
path('eventos/anular_reserva/<int:evento_id>/', views.anular_reserva, name='anular_reserva'),
path('eventos/apuntar_lista_espera/<int:evento_id>/', views.apuntar_lista_espera, name='apuntar_lista_espera'),
path('eventos/ayuda/', views.ayuda, name='ayuda'), path('eventos/ayuda/', views.ayuda, name='ayuda'),
path('eventos/crear/', views.crear_evento, name='crear_evento'), # URL para crear un evento path('eventos/crear/', views.crear_evento, name='crear_evento'), # URL para crear un evento


+ 31
- 40
JugarAlPadel/gestion_reservas/eventos/views.py View File

@ -4,9 +4,8 @@ from django.contrib import messages
from django.core.mail import send_mail from django.core.mail import send_mail
from django.conf import settings 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 @login_required
@ -51,42 +50,6 @@ def reservar_evento(request, evento_id):
return redirect('eventos:lista_eventos') 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 @login_required
def lista_eventos(request): def lista_eventos(request):
eventos = Evento.objects.all() eventos = Evento.objects.all()
@ -96,6 +59,11 @@ def lista_eventos(request):
for evento in eventos: for evento in eventos:
inscrito = Reserva.objects.filter(evento=evento, usuario=request.user).exists() if request.user.is_authenticated else False 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({ eventos_con_reserva.append({
'evento': evento, 'evento': evento,
'inscrito': inscrito, 'inscrito': inscrito,
@ -103,7 +71,9 @@ def lista_eventos(request):
'nombre': evento.nombre, 'nombre': evento.nombre,
'fecha': evento.fecha, 'fecha': evento.fecha,
'plazas_disponibles': evento.plazas_disponibles, '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}) return render(request, 'eventos/lista_eventos.html', {'eventos_con_reserva': eventos_con_reserva})
@ -146,3 +116,24 @@ def crear_evento(request):
form = EventoForm() form = EventoForm()
return render(request, 'eventos/crear_evento.html', {'form': form}) 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})

+ 35
- 0
JugarAlPadel/gestion_reservas/templates/eventos/apuntar_lista_espera.html View File

@ -0,0 +1,35 @@
{% extends 'base.html' %}
{% block menuapp %}
{% endblock menuapp %}
{% block content %}
<div class="container-xl">
<div class="row g-3 mb-4 align-items-center justify-content-between">
<div class="col-auto">
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
</div>
</div>
<div class="row g-3 mb-4 align-items-center justify-content-between">
<div class="col-auto">
<h1 class="app-page-title mb-0">Lista de espera para {{ evento.nombre }}</h1>
<p>Este evento está completo, pero puedes apuntarte a la lista de espera.</p>
<form method="post">
{% csrf_token %}
<button type="submit">Apuntarse a la Lista de Espera</button>
</form>
<a href="{% url 'eventos:lista_eventos' %}">Volver a la lista de eventos</a>
</div>
</div><!--//row-->
</div><!--//container-fluid-->
{% endblock %}

Loading…
Cancel
Save