views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. from django.shortcuts import render, get_object_or_404, redirect
  2. from django.contrib.auth.decorators import login_required, user_passes_test
  3. from django.contrib import messages
  4. from django.core.mail import EmailMultiAlternatives
  5. from django.conf import settings
  6. from django.template.loader import render_to_string
  7. from django.utils import timezone
  8. from django.core.mail import send_mail
  9. from rest_framework.response import Response
  10. from rest_framework.decorators import api_view
  11. from .serializers import EventoSerializer, ReservaSerializer, ListaEsperaSerializer, NoticiaSerializer
  12. from .models import Evento, Reserva, ListaEspera, Noticia
  13. from .forms import ListaEsperaForm, EventoForm
  14. @login_required
  15. def reservar_evento(request, evento_id):
  16. evento = get_object_or_404(Evento, id=evento_id)
  17. # Verificar si el usuario ya tiene una reserva para este evento
  18. if Reserva.objects.filter(evento=evento, usuario=request.user).exists():
  19. messages.error(request, 'Ya tienes una reserva para este evento.')
  20. return redirect('eventos:lista_eventos')
  21. # Verificar si quedan plazas disponibles
  22. if evento.plazas_restantes() > 0:
  23. Reserva.objects.create(evento=evento, usuario=request.user)
  24. # Enviar un correo con la información del evento
  25. asunto = f'Confirmación de Reserva para {evento.nombre}'
  26. from_email = settings.DEFAULT_FROM_EMAIL
  27. to_email = request.user.email
  28. cc_email = [settings.ADMIN_EMAIL]
  29. texto = f'Hola {request.user.nombre},\n\n' \
  30. f'Te has inscrito correctamente en el evento "{evento.nombre}".\n' \
  31. f'Detalles del evento:\n' \
  32. f'Nombre: {evento.nombre}\n' \
  33. f'Descripción: {evento.descripcion}\n' \
  34. f'Fecha: {evento.fecha.strftime("%d/%b/%y")} a las {evento.hora}\n' \
  35. f'\n¡Gracias por inscribirte!\n\n'
  36. html_content = render_to_string('emails/confirmacion_reserva.html', {'evento': evento, 'usuario': request.user})
  37. # Enviar el correo con el administrador en copia
  38. msg = EmailMultiAlternatives(asunto, texto, from_email, [to_email], cc=cc_email)
  39. msg.attach_alternative(html_content, "text/html")
  40. msg.send()
  41. # Aquí hay que mirar si quedan más de n plazas.
  42. # n es un numero aleatorio entre 2 y el total de plazas
  43. # si es así, y ya hay añadir a dos participantes.
  44. messages.success(request,
  45. f'Reserva realizada para el evento {evento.nombre}.')
  46. else:
  47. messages.error(request, 'Lo sentimos, no quedan plazas disponibles.')
  48. return redirect('eventos:lista_eventos')
  49. @user_passes_test(lambda u: u.is_staff)
  50. def publicar_evento(request, evento_id):
  51. evento = get_object_or_404(Evento, id=evento_id)
  52. if not evento.publicado:
  53. evento.publicado = True
  54. evento.save()
  55. messages.success(request, 'El evento %s ha sido publicado' % evento.nombre)
  56. else:
  57. messages.info(request, 'El evento %s ya está publicado' % evento.nombre)
  58. return redirect('eventos:detalle_evento', evento_id=evento_id)
  59. @login_required
  60. def lista_eventos(request):
  61. # anno_actual = timezone.now().year
  62. # Solo mostrar los eventos publicados a los usuarios normales
  63. if request.user.is_staff:
  64. eventos = Evento.objects.all().order_by('-fecha', '-hora')
  65. else:
  66. eventos = Evento.objects.filter(publicado=True).order_by('-fecha', '-hora')
  67. # eventos = Evento.objects.filter(publicado=True, fecha__year=anno_actual) # Los usuarios ven solo eventos publicados y del año en curso
  68. # Crear un diccionario que mapea cada evento con un booleano indicando si el usuario ya ha reservado
  69. eventos_con_reserva = []
  70. for evento in eventos:
  71. inscrito = Reserva.objects.filter(evento=evento, usuario=request.user).exists() if request.user.is_authenticated else False
  72. if ListaEspera.objects.filter(evento=evento, usuario=request.user).exists():
  73. en_espera = True
  74. else:
  75. en_espera = False
  76. eventos_con_reserva.append({
  77. 'evento': evento,
  78. 'inscrito': inscrito,
  79. 'id': evento.id,
  80. 'nombre': evento.nombre,
  81. 'fecha': evento.fecha,
  82. 'hora': evento.hora,
  83. 'plazas_disponibles': evento.plazas_disponibles,
  84. 'plazas_restantes': evento.plazas_restantes,
  85. 'en_espera': en_espera,
  86. 'usuario': request.user,
  87. 'publicado': evento.publicado,
  88. 'url_imagen': evento.url_imagen
  89. })
  90. return render(request, 'eventos/lista_eventos.html', {'eventos_con_reserva': eventos_con_reserva})
  91. def detalle_noticia(request, noticia_id):
  92. noticia = get_object_or_404(Noticia, id=noticia_id, publicado=True)
  93. return render(request, 'detalle_noticia.html', {'noticia': noticia})
  94. def ayuda(request):
  95. return render(request, 'eventos/help.html')
  96. @login_required
  97. def detalle_evento(request, evento_id):
  98. el_evento = []
  99. evento = get_object_or_404(Evento, pk=evento_id)
  100. reservas = Reserva.objects.filter(evento=evento_id)
  101. inscrito = Reserva.objects.filter(evento=evento, usuario=request.user).exists() if request.user.is_authenticated else False
  102. if ListaEspera.objects.filter(evento=evento, usuario=request.user).exists():
  103. en_espera = True
  104. else:
  105. en_espera = False
  106. lista_espera = ListaEspera.objects.filter(evento=evento_id)
  107. el_evento.append(
  108. {
  109. 'evento': evento,
  110. 'inscrito': inscrito,
  111. 'id': evento.id,
  112. 'nombre': evento.nombre,
  113. 'descripcion': evento.descripcion,
  114. 'fecha': evento.fecha,
  115. 'plazas_disponibles': evento.plazas_disponibles,
  116. 'plazas_restantes': evento.plazas_restantes,
  117. 'en_espera': en_espera,
  118. 'usuario': request.user,
  119. 'publicado': evento.publicado,
  120. 'url_imagen': evento.url_imagen
  121. }
  122. )
  123. return render(request, 'eventos/detalle_evento.html', {'eventos': el_evento, 'reservas': reservas, 'lista': lista_espera})
  124. # Verificar si el usuario es administrador
  125. def es_admin(user):
  126. return user.is_staff
  127. @user_passes_test(es_admin)
  128. def crear_evento(request):
  129. if request.method == 'POST':
  130. form = EventoForm(request.POST)
  131. if form.is_valid():
  132. form.save()
  133. messages.success(request, 'Evento creado exitosamente.')
  134. return redirect('eventos:lista_eventos') # Redirige a la lista de eventos
  135. else:
  136. form = EventoForm()
  137. return render(request, 'eventos/crear_evento.html', {'form': form})
  138. @user_passes_test(lambda u: u.is_staff)
  139. def editar_evento(request, evento_id):
  140. evento = get_object_or_404(Evento, id=evento_id)
  141. if request.method == 'POST':
  142. form = EventoForm(request.POST, instance=evento)
  143. if form.is_valid():
  144. form.save()
  145. return redirect('lista_eventos')
  146. else:
  147. form = EventoForm(instance=evento)
  148. return render(request, 'crear_evento.html', {'form': form, 'evento': evento})
  149. @login_required
  150. def apuntar_lista_espera(request, evento_id):
  151. evento = get_object_or_404(Evento, id=evento_id)
  152. # Verificar si el usuario ya está en la lista de espera
  153. if ListaEspera.objects.filter(evento=evento, usuario=request.user).exists():
  154. messages.error(request, 'Ya estás en la lista de espera para este evento.')
  155. return redirect('eventos:lista_eventos')
  156. # Crear una entrada en la lista de espera
  157. if request.method == 'POST':
  158. form = ListaEsperaForm(request.POST)
  159. if form.is_valid():
  160. ListaEspera.objects.create(evento=evento, usuario=request.user)
  161. messages.success(request, 'Te has apuntado a la lista de espera para este evento.')
  162. return redirect('eventos:lista_eventos')
  163. form = ListaEsperaForm()
  164. return render(request, 'eventos/apuntar_lista_espera.html', {'form': form, 'evento': evento})
  165. #
  166. # API
  167. #
  168. @api_view(['GET'])
  169. def api_lista_eventos(request):
  170. """Devuelve la lista de todos los eventos."""
  171. eventos = Evento.objects.all()
  172. serializer = EventoSerializer(eventos, many=True)
  173. return Response(serializer.data)
  174. @api_view(['GET'])
  175. def api_detalle_evento(request, evento_id):
  176. """Devuelve los detalles de un evento específico."""
  177. try:
  178. evento = Evento.objects.get(id=evento_id)
  179. serializer = EventoSerializer(evento)
  180. return Response(serializer.data)
  181. except Evento.DoesNotExist:
  182. return Response({'error': 'Evento no encontrado'}, status=404)
  183. @api_view(['GET'])
  184. def api_lista_reservas(request):
  185. """Devuelve la lista de todos los reservas."""
  186. reservas = Reserva.objects.all()
  187. serializer = ReservaSerializer(reservas, many=True)
  188. return Response(serializer.data)
  189. @api_view(['GET'])
  190. def api_detalle_reserva(request, reserva_id):
  191. """Devuelve los detalles de un reserva específico."""
  192. try:
  193. reserva = Reserva.objects.get(id=reserva_id)
  194. serializer = ReservaSerializer(reserva)
  195. return Response(serializer.data)
  196. except Reserva.DoesNotExist:
  197. return Response({'error': 'Reserva no encontrado'}, status=404)
  198. @api_view(['GET'])
  199. def api_lista_listaespera(request):
  200. """Devuelve la lista de todos los listaespera."""
  201. listaesperas = ListaEspera.objects.all()
  202. serializer = ListaEsperaSerializer(listaesperas, many=True)
  203. return Response(serializer.data)
  204. @api_view(['GET'])
  205. def api_detalle_listaespera(request, listaespera_id):
  206. """Devuelve los detalles de un listaespera específico."""
  207. try:
  208. listaespera = ListaEspera.objects.get(id=listaespera_id)
  209. serializer = ListaEsperaSerializer(listaespera)
  210. return Response(serializer.data)
  211. except ListaEspera.DoesNotExist:
  212. return Response({'error': 'ListaEspera no encontrado'}, status=404)
  213. @api_view(['GET'])
  214. def api_lista_noticias(request):
  215. """Devuelve la lista de todos los noticias."""
  216. noticias = Noticia.objects.all()
  217. serializer = NoticiaSerializer(noticias, many=True)
  218. return Response(serializer.data)
  219. @api_view(['GET'])
  220. def api_detalle_noticia(request, noticia_id):
  221. """Devuelve los detalles de un noticia específico."""
  222. try:
  223. noticia = Noticia.objects.get(id=noticia_id)
  224. serializer = NoticiaSerializer(noticia)
  225. return Response(serializer.data)
  226. except Noticia.DoesNotExist:
  227. return Response({'error': 'Noticia no encontrado'}, status=404)
  228. # Verifica si el usuario es administrador
  229. def es_admin(user):
  230. return user.is_staff
  231. @user_passes_test(es_admin) # Solo administradores pueden acceder
  232. def enviar_correo_inscritos(request, evento_id):
  233. evento = get_object_or_404(Evento, id=evento_id)
  234. inscritos = Reserva.objects.filter(evento=evento).select_related('usuario')
  235. if not inscritos:
  236. messages.warning(request, "No hay usuarios inscritos en este evento.")
  237. return redirect('detalle_evento', evento_id=evento.id)
  238. destinatarios = [reserva.usuario.email for reserva in inscritos if reserva.usuario.email]
  239. if not destinatarios:
  240. messages.warning(request, "No hay correos disponibles para los inscritos.")
  241. return redirect('detalle_evento', evento_id=evento.id)
  242. asunto = f"Información sobre el evento: {evento.descripcion}"
  243. mensaje = f"""
  244. Hola,
  245. Queremos recordarte que estás inscrito en el evento "{evento.descripcion}".
  246. Fecha y hora: {evento.fecha} - {evento.hora}
  247. Cualquier duda, contáctanos.
  248. Saludos,
  249. El equipo de eventos
  250. """
  251. send_mail(
  252. asunto,
  253. mensaje,
  254. settings.DEFAULT_FROM_EMAIL,
  255. destinatarios,
  256. fail_silently=False
  257. )
  258. messages.success(request, f"Correo enviado a {len(destinatarios)} inscritos.")
  259. return redirect('eventos:detalle_evento', evento_id=evento.id)