| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- from django import forms
- from django.contrib.auth import get_user_model
- from tinymce.widgets import TinyMCE
- from .models import Evento
- from .models import ListaEspera
- from .models import Reserva
- User = get_user_model()
- class ReservaForm(forms.ModelForm):
- acompanante = forms.ModelChoiceField(
- queryset=User.objects.none(),
- required=False,
- label="Acompañante"
- )
- class Meta:
- model = Reserva
- fields = ['acompanante']
- def __init__(self, *args, **kwargs):
- evento = kwargs.pop('evento', None)
- usuario = kwargs.pop('usuario', None)
- super().__init__(*args, **kwargs)
- # Solo permitir elegir acompañante si el evento es para parejas
- if evento and evento.para_parejas:
- # Excluir usuarios que ya tienen reserva o están en lista de espera
- usuarios_excluidos = set(
- Reserva.objects.filter(evento=evento).values_list('usuario_id', flat=True)
- ) | set(
- ListaEspera.objects.filter(evento=evento).values_list('usuario_id', flat=True)
- )
- # Ordenar alfabéticamente por nombre y excluir al propio usuario
- self.fields['acompanante'].queryset = (
- User.objects.exclude(id__in=usuarios_excluidos)
- .exclude(id=usuario.id)
- .filter(is_active=True)
- .order_by('nombre')
- )
- # Mostrar el nombre completo o username en las opciones
- self.fields['acompanante'].label_from_instance = (
- lambda obj: f"{obj.nombre}"
- )
- # Hacer el campo obligatorio
- self.fields['acompanante'].required = True
- else:
- # Si no es evento de parejas, ocultamos el campo
- self.fields.pop('acompanante')
-
- class EventoForm(forms.ModelForm):
- class Meta:
- model = Evento
- fields = ['nombre', 'descripcion', 'fecha', 'hora', 'plazas_disponibles', 'precio', 'publicado', 'para_parejas', 'lugar', 'url_imagen']
- widgets = {
- 'fecha': forms.DateInput(attrs={'type': 'date'}),
- 'hora': forms.TimeInput(attrs={'type': 'time'}),
- 'url_imagen': forms.URLInput(attrs={'class': 'form-control'}),
- }
- class ListaEsperaForm(forms.ModelForm):
- acompanante = forms.ModelChoiceField(
- queryset=User.objects.none(),
- required=False,
- label="Acompañante"
- )
- class Meta:
- model = ListaEspera
- fields = ['acompanante']
- def __init__(self, *args, **kwargs):
- evento = kwargs.pop('evento', None)
- usuario = kwargs.pop('usuario', None)
- super().__init__(*args, **kwargs)
- # Solo permitir elegir acompañante si el evento es para parejas
- if evento and evento.para_parejas:
- # Excluir usuarios que ya tienen reserva o están en lista de espera
- usuarios_excluidos = set(
- Reserva.objects.filter(evento=evento).values_list('usuario_id', flat=True)
- ) | set(
- ListaEspera.objects.filter(evento=evento).values_list('usuario_id', flat=True)
- )
- # Ordenar alfabéticamente por nombre y excluir al propio usuario
- self.fields['acompanante'].queryset = (
- User.objects.exclude(id__in=usuarios_excluidos)
- .exclude(id=usuario.id)
- .filter(is_active=True)
- .order_by('nombre')
- )
- # Mostrar el nombre completo o username en las opciones
- self.fields['acompanante'].label_from_instance = (
- lambda obj: f"{obj.nombre}"
- )
- else:
- # Si no es evento de parejas, ocultamos el campo
- self.fields.pop('acompanante')
- class MensajeCorreoForm(forms.Form):
- asunto = forms.CharField(
- label="Asunto",
- max_length=200,
- required=True,
- widget=forms.TextInput(attrs={'class': 'form-control'})
- )
- mensaje = forms.CharField(
- label="Mensaje",
- widget=TinyMCE(attrs={'cols': 80, 'rows': 25}),
- required=True
- )
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- # Asegurar que los valores iniciales se muestren en los widgets
- if self.initial.get('asunto'):
- self.fields['asunto'].widget.attrs['value'] = self.initial['asunto']
- if self.initial.get('mensaje'):
- self.fields['mensaje'].widget.attrs['value'] = self.initial['mensaje']
|