from django import forms from django.contrib.auth import get_user_model 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'}), } 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=forms.Textarea(attrs={'class': 'form-control', 'rows': 25, 'style': 'min-height: 400px;'}), 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']