Prechádzať zdrojové kódy

Se da la posibilidad de enviar los códigos de invitación por email

Tino 3 mesiacov pred
rodič
commit
2c2608f680

+ 47 - 2
src/accounts/admin.py

@@ -1,15 +1,29 @@
 from django.contrib import admin
-from django.utils.html import format_html
+from django import forms
+from django.core.mail import send_mail
+from django.conf import settings
+from django.template.loader import render_to_string
+from django.urls import path
+from django.shortcuts import render
 from .models import InvitationCode
 
 
+class EmailForm(forms.Form):
+    email = forms.EmailField(label='Email del invitado')
+
+
 @admin.register(InvitationCode)
 class InvitationCodeAdmin(admin.ModelAdmin):
     list_display = ['code', 'created_at', 'expires_at', 'is_used', 'used_by']
     list_filter = ['is_used', 'created_at']
     search_fields = ['code']
     readonly_fields = ['code', 'created_at']
-    actions = ['create_invitations']
+    actions = ['create_invitations', 'send_invitation_emails']
+
+    def get_urls(self):
+        urls = super().get_urls()
+        urls.insert(0, path('send_invitation/', self.admin_site.admin_view(self.send_invitation_view), name='send_invitation'))
+        return urls
 
     def create_invitations(self, request, queryset):
         for _ in range(5):
@@ -17,6 +31,37 @@ class InvitationCodeAdmin(admin.ModelAdmin):
         self.message_user(request, 'Se crearon 5 códigos de invitación.')
     create_invitations.short_description = 'Crear 5 códigos de invitación'
 
+    def send_invitation_emails(self, request, queryset):
+        if 'apply' in request.POST:
+            form = EmailForm(request.POST)
+            if form.is_valid():
+                email = form.cleaned_data['email']
+                invitation = InvitationCode.create_invitation(created_by=request.user)
+                domain = settings.ALLOWED_HOSTS[0].replace('.','')
+                signup_url = f"https://jugaralpadel.es/accounts/signup/?code={invitation.code}"
+                context = {'invitation_code': invitation.code, 'signup_url': signup_url}
+                html_message = render_to_string('emails/invitacion.html', context)
+                send_mail(
+                    'Invitación a Jugar al Pádel',
+                    '',
+                    settings.DEFAULT_FROM_EMAIL,
+                    [email],
+                    html_message=html_message
+                )
+                self.message_user(request, f'Invitación enviada a {email}.')
+                return None
+        else:
+            form = EmailForm()
+        return render(request, 'admin/send_invitation.html', {
+            'items': queryset,
+            'form': form,
+            'title': 'Enviar invitación por email'
+        })
+    send_invitation_emails.short_description = 'Enviar invitación por email'
+
+    def send_invitation_view(self, request):
+        return self.send_invitation_emails(request, InvitationCode.objects.none())
+
     def get_queryset(self, request):
         qs = super().get_queryset(request)
         qs = qs.select_related('used_by', 'created_by')

+ 9 - 0
src/templates/admin/send_invitation.html

@@ -0,0 +1,9 @@
+{% extends "admin/base_site.html" %}
+{% block content %}
+<h1>{{ title }}</h1>
+<form method="post">
+    {% csrf_token %}
+    {{ form.as_p }}
+    <button type="submit" name="apply" class="button">Enviar invitación</button>
+</form>
+{% endblock %}

+ 20 - 0
src/templates/emails/invitacion.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <style>
+        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
+    </style>
+</head>
+<body>
+    <h1>Invitación a Jugar al Pádel</h1>
+    <p>Hola,</p>
+    <p>Has recibido una invitación para registrarte en <strong>Jugar al Pádel Entre Amigos</strong>.</p>
+    <p>Usa el siguiente código de invitación para crear tu cuenta:</p>
+    <p style="font-size: 1.5em; font-weight: bold;">{{ invitation_code }}</p>
+    <p>O haz clic en este enlace:</p>
+    <p><a href="{{ signup_url }}">{{ signup_url }}</a></p>
+    <p>Este código caduca en 24 horas.</p>
+    <p>¡Nos vemos en la pista!</p>
+</body>
+</html>