forms.py 4.5 KB

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