forms.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from django import forms
  2. from django.contrib.auth import get_user_model
  3. from .models import Evento
  4. from .models import ListaEspera
  5. from .models import Reserva
  6. User = get_user_model()
  7. class ReservaForm(forms.ModelForm):
  8. acompanante = forms.ModelChoiceField(
  9. queryset=User.objects.none(),
  10. required=False,
  11. label="Acompañante"
  12. )
  13. class Meta:
  14. model = Reserva
  15. fields = ['acompanante']
  16. def __init__(self, *args, **kwargs):
  17. evento = kwargs.pop('evento', None)
  18. usuario = kwargs.pop('usuario', None)
  19. super().__init__(*args, **kwargs)
  20. # Solo permitir elegir acompañante si el evento es para parejas
  21. if evento and evento.para_parejas:
  22. # Excluir usuarios que ya tienen reserva o están en lista de espera
  23. usuarios_excluidos = set(
  24. Reserva.objects.filter(evento=evento).values_list('usuario_id', flat=True)
  25. ) | set(
  26. ListaEspera.objects.filter(evento=evento).values_list('usuario_id', flat=True)
  27. )
  28. # Ordenar alfabéticamente por nombre y excluir al propio usuario
  29. self.fields['acompanante'].queryset = (
  30. User.objects.exclude(id__in=usuarios_excluidos)
  31. .exclude(id=usuario.id)
  32. .filter(is_active=True)
  33. .order_by('nombre')
  34. )
  35. # Mostrar el nombre completo o username en las opciones
  36. self.fields['acompanante'].label_from_instance = (
  37. lambda obj: f"{obj.nombre}"
  38. )
  39. # Hacer el campo obligatorio
  40. self.fields['acompanante'].required = True
  41. else:
  42. # Si no es evento de parejas, ocultamos el campo
  43. self.fields.pop('acompanante')
  44. class EventoForm(forms.ModelForm):
  45. class Meta:
  46. model = Evento
  47. fields = ['nombre', 'descripcion', 'fecha', 'hora', 'plazas_disponibles', 'precio', 'publicado', 'para_parejas', 'lugar', 'url_imagen']
  48. widgets = {
  49. 'fecha': forms.DateInput(attrs={'type': 'date'}),
  50. 'hora': forms.TimeInput(attrs={'type': 'time'}),
  51. }
  52. class ListaEsperaForm(forms.ModelForm):
  53. acompanante = forms.ModelChoiceField(
  54. queryset=User.objects.none(),
  55. required=False,
  56. label="Acompañante"
  57. )
  58. class Meta:
  59. model = ListaEspera
  60. fields = ['acompanante']
  61. def __init__(self, *args, **kwargs):
  62. evento = kwargs.pop('evento', None)
  63. usuario = kwargs.pop('usuario', None)
  64. super().__init__(*args, **kwargs)
  65. # Solo permitir elegir acompañante si el evento es para parejas
  66. if evento and evento.para_parejas:
  67. # Excluir usuarios que ya tienen reserva o están en lista de espera
  68. usuarios_excluidos = set(
  69. Reserva.objects.filter(evento=evento).values_list('usuario_id', flat=True)
  70. ) | set(
  71. ListaEspera.objects.filter(evento=evento).values_list('usuario_id', flat=True)
  72. )
  73. # Ordenar alfabéticamente por nombre y excluir al propio usuario
  74. self.fields['acompanante'].queryset = (
  75. User.objects.exclude(id__in=usuarios_excluidos)
  76. .exclude(id=usuario.id)
  77. .filter(is_active=True)
  78. .order_by('nombre')
  79. )
  80. # Mostrar el nombre completo o username en las opciones
  81. self.fields['acompanante'].label_from_instance = (
  82. lambda obj: f"{obj.nombre}"
  83. )
  84. else:
  85. # Si no es evento de parejas, ocultamos el campo
  86. self.fields.pop('acompanante')
  87. class MensajeCorreoForm(forms.Form):
  88. asunto = forms.CharField(
  89. label="Asunto",
  90. max_length=200,
  91. required=True,
  92. widget=forms.TextInput(attrs={'class': 'form-control'})
  93. )
  94. mensaje = forms.CharField(
  95. label="Mensaje",
  96. widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 25, 'style': 'min-height: 400px;'}),
  97. required=True
  98. )
  99. def __init__(self, *args, **kwargs):
  100. super().__init__(*args, **kwargs)
  101. # Asegurar que los valores iniciales se muestren en los widgets
  102. if self.initial.get('asunto'):
  103. self.fields['asunto'].widget.attrs['value'] = self.initial['asunto']
  104. if self.initial.get('mensaje'):
  105. self.fields['mensaje'].widget.attrs['value'] = self.initial['mensaje']