admin.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from django.contrib import admin
  2. from django import forms
  3. from django.core.mail import send_mail
  4. from django.conf import settings
  5. from django.template.loader import render_to_string
  6. from django.urls import path
  7. from django.shortcuts import render
  8. from .models import InvitationCode
  9. import logging
  10. logger = logging.getLogger(__name__)
  11. class EmailForm(forms.Form):
  12. email = forms.EmailField(label='Email del invitado')
  13. @admin.register(InvitationCode)
  14. class InvitationCodeAdmin(admin.ModelAdmin):
  15. list_display = ['code', 'created_at', 'expires_at', 'is_used', 'used_by']
  16. list_filter = ['is_used', 'created_at']
  17. search_fields = ['code']
  18. readonly_fields = ['code', 'created_at']
  19. actions = ['create_invitations', 'send_invitation_emails']
  20. def get_urls(self):
  21. urls = super().get_urls()
  22. urls.insert(0, path('send_invitation/', self.admin_site.admin_view(self.send_invitation_view), name='send_invitation'))
  23. return urls
  24. def create_invitations(self, request, queryset):
  25. for _ in range(5):
  26. InvitationCode.create_invitation(created_by=request.user)
  27. self.message_user(request, 'Se crearon 5 códigos de invitación.')
  28. create_invitations.short_description = 'Crear 5 códigos de invitación'
  29. def send_invitation_emails(self, request, queryset):
  30. logger.info(f"Iniciando envio de invitacion, query={queryset}")
  31. if 'apply' in request.POST:
  32. form = EmailForm(request.POST)
  33. logger.info(f"Form data: {request.POST}")
  34. if form.is_valid():
  35. email = form.cleaned_data['email']
  36. logger.info(f"Email válido: {email}")
  37. invitation = InvitationCode.create_invitation(created_by=request.user)
  38. logger.info(f"Created invitation code: {invitation.code}")
  39. domain = settings.ALLOWED_HOSTS[0].replace('.','')
  40. signup_url = f"https://jugaralpadel.es/accounts/signup/?code={invitation.code}"
  41. logger.info(f"Signup URL: {signup_url}")
  42. context = {'invitation_code': invitation.code, 'signup_url': signup_url}
  43. html_message = render_to_string('emails/invitacion.html', context)
  44. logger.info(f"Rendered email template")
  45. send_mail(
  46. 'Invitación a Jugar al Pádel',
  47. '',
  48. settings.DEFAULT_FROM_EMAIL,
  49. [email],
  50. html_message=html_message
  51. )
  52. logger.info(f"Email enviado a {email}")
  53. self.message_user(request, f'Invitación enviada a {email}.')
  54. return None
  55. else:
  56. form = EmailForm()
  57. logger.info("Mostrando formulario de invitación")
  58. return render(request, 'admin/send_invitation.html', {
  59. 'items': queryset,
  60. 'form': form,
  61. 'title': 'Enviar invitación por email'
  62. })
  63. send_invitation_emails.short_description = 'Enviar invitación por email'
  64. def send_invitation_view(self, request):
  65. return self.send_invitation_emails(request, InvitationCode.objects.none())
  66. def get_queryset(self, request):
  67. qs = super().get_queryset(request)
  68. qs = qs.select_related('used_by', 'created_by')
  69. return qs