소스 검색

Quito códigos de invitación

Tino 3 달 전
부모
커밋
29291aa678

+ 1 - 1
K8S/.current_version

@@ -1 +1 @@
-alpine-9
+alpine-11

+ 1 - 1
K8S/.version

@@ -1 +1 @@
-alpine-10
+alpine-12

+ 0 - 37
src/accounts/admin.py

@@ -1,38 +1 @@
 from django.contrib import admin
-from django.core.mail import EmailMultiAlternatives
-from django.conf import settings
-from django.template.loader import render_to_string
-from django.shortcuts import redirect, render
-from django.contrib import messages
-from .models import InvitationCode
-import logging
-
-logger = logging.getLogger(__name__)
-
-
-@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']
-
-    def add_view(self, request, form_url='', extra_context=None):
-        if request.method == 'POST':
-            email = request.POST.get('email')
-            logger.info(f"POST email: {email}")
-            if email:
-                invitation = InvitationCode.create_invitation(created_by=request.user)
-                signup_url = f"https://jugaralpadel.es/accounts/signup/?code={invitation.code}"
-                html_content = render_to_string('emails/invitacion.html', {'invitation_code': invitation.code, 'signup_url': signup_url})
-                texto = f'Invitación Jugar al Pádel. Código: {invitation.code}. Enlace: {signup_url}'
-                msg = EmailMultiAlternatives('Invitación a Jugar al Pádel', texto, settings.DEFAULT_FROM_EMAIL, [email])
-                msg.attach_alternative(html_content, "text/html")
-                msg.send()
-                logger.info(f"Email enviado a {email}")
-                self.message_user(request, f'Código enviado a {email}', messages.SUCCESS)
-                return redirect('admin:accounts_invitationcode_changelist')
-        return render(request, 'admin/invitationcode/add.html')
-
-    def get_queryset(self, request):
-        return super().get_queryset(request).select_related('used_by', 'created_by')

+ 0 - 59
src/accounts/models.py

@@ -1,61 +1,2 @@
 from django.db import models
 from django.utils import timezone
-import secrets
-
-
-class InvitationCode(models.Model):
-    code = models.CharField(max_length=32, unique=True, default='')
-    created_at = models.DateTimeField(auto_now_add=True)
-    expires_at = models.DateTimeField()
-    is_used = models.BooleanField(default=False)
-    used_by = models.OneToOneField(
-        'reymotausers.ReyMotaUser',
-        on_delete=models.SET_NULL,
-        null=True,
-        blank=True,
-        related_name='used_invitation'
-    )
-    created_by = models.ForeignKey(
-        'reymotausers.ReyMotaUser',
-        on_delete=models.SET_NULL,
-        null=True,
-        related_name='created_invitations'
-    )
-
-    class Meta:
-        verbose_name = "Código de Invitación"
-        verbose_name_plural = "Códigos de Invitación"
-
-    def save(self, *args, **kwargs):
-        if not self.code:
-            self.code = self.generate_code()
-        super().save(*args, **kwargs)
-
-    def __str__(self):
-        return f"{self.code} (expira: {self.expires_at:%d/%m/%Y %H:%M})"
-
-    @classmethod
-    def generate_code(cls):
-        while True:
-            code = secrets.token_urlsafe(24)[:32]
-            if not cls.objects.filter(code=code).exists():
-                return code
-
-    @classmethod
-    def create_invitation(cls, created_by=None, hours_valid=24):
-        expires_at = timezone.now() + timezone.timedelta(hours=hours_valid)
-        return cls.objects.create(
-            code=cls.generate_code(),
-            expires_at=expires_at,
-            created_by=created_by
-        )
-
-    def is_valid(self):
-        if self.is_used or self.expires_at is None:
-            return False
-        return timezone.now() < self.expires_at
-
-    def mark_as_used(self, user):
-        self.is_used = True
-        self.used_by = user
-        self.save()

+ 0 - 32
src/accounts/views.py

@@ -1,42 +1,10 @@
 from django.urls import reverse_lazy
 from django.views.generic import CreateView
-from django.shortcuts import get_object_or_404
-from django.contrib import messages
 
 from reymotausers.forms import ReyMotaUserCreationForm
-from accounts.models import InvitationCode
 
 
 class SignUpView(CreateView):
     form_class = ReyMotaUserCreationForm
     success_url = reverse_lazy("login")
     template_name = "registration/signup.html"
-
-    def get_initial(self):
-        initial = super().get_initial()
-        code = self.request.GET.get('code')
-        if code:
-            initial['invitation_code'] = code
-        return initial
-
-    def get_context_data(self, **kwargs):
-        context = super().get_context_data(**kwargs)
-        code = self.request.GET.get('code')
-        if code:
-            try:
-                invitation = get_object_or_404(InvitationCode, code=code)
-                if invitation.is_used:
-                    messages.warning(self.request, 'Este código ya ha sido utilizado.')
-                    context['invitation_valid'] = False
-                elif not invitation.is_valid():
-                    messages.warning(self.request, 'El código ha expirado.')
-                    context['invitation_valid'] = False
-                else:
-                    context['invitation_valid'] = True
-            except Exception:
-                context['invitation_valid'] = False
-                messages.error(self.request, 'El código no es válido.')
-        else:
-            context['invitation_valid'] = False
-            messages.error(self.request, 'Se requiere un código de invitación.')
-        return context

+ 2 - 41
src/reymotausers/forms.py

@@ -1,58 +1,19 @@
 from django import forms
 from django.contrib.auth.forms import UserCreationForm, UserChangeForm
-from django.core.exceptions import ValidationError
 
 from .models import ReyMotaUser
-from accounts.models import InvitationCode
 
 
 class ReyMotaUserCreationForm(UserCreationForm):
-    invitation_code = forms.CharField(
-        max_length=32,
-        label="Código de Invitación",
-        help_text="Introduce el código que has recibido"
-    )
 
     class Meta:
         model = ReyMotaUser
-        fields = ("email", "nombre", "foto", "invitation_code")
+        fields = ("email", "nombre", "foto")
         labels = {'email': 'Dirección de correo'}
 
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-        code = self.initial.get('invitation_code')
-        if code:
-            self.fields['invitation_code'].initial = code
-
-    def clean_invitation_code(self):
-        code = self.cleaned_data.get('invitation_code')
-        if not code:
-            raise ValidationError("El código de invitación es obligatorio.")
-
-        try:
-            invitation = InvitationCode.objects.get(code=code)
-            if not invitation.is_valid():
-                if invitation.is_used:
-                    raise ValidationError("Este código ya ha sido utilizado.")
-                else:
-                    raise ValidationError("El código ha expirado.")
-        except InvitationCode.DoesNotExist:
-            raise ValidationError("El código no es válido.")
-
-        return code
-
-    def save(self, commit=True):
-        user = super().save(commit=False)
-        if commit:
-            user.save()
-            code = self.cleaned_data.get('invitation_code')
-            invitation = InvitationCode.objects.get(code=code)
-            invitation.mark_as_used(user)
-        return user
-
 
 class ReyMotaUserChangeForm(UserChangeForm):
 
     class Meta:
         model = ReyMotaUser
-        fields = ("email", "foto")
+        fields = ("email", "foto")

+ 0 - 12
src/templates/admin/crear_enviar.html

@@ -1,12 +0,0 @@
-{% extends "admin/base_site.html" %}
-{% block content %}
-<h1>Crear y enviar invitación</h1>
-<p>Genera un nuevo código de invitación y envíalo por email al nuevo usuario.</p>
-<form method="get">
-    <div style="margin-bottom: 10px;">
-        <label for="email">Email del nuevo usuario:</label><br>
-        <input type="email" name="email" id="email" required style="width: 300px;">
-    </div>
-    <button type="submit" class="button default">Crear y enviar invitación</button>
-</form>
-{% endblock %}

+ 0 - 11
src/templates/admin/enviar_invitacion.html

@@ -1,11 +0,0 @@
-{% extends "admin/base_site.html" %}
-{% block content %}
-<h1>Enviar invitación por email</h1>
-<form method="get">
-    <div style="margin-bottom: 10px;">
-        <label for="email">Email del invitado:</label><br>
-        <input type="email" name="email" id="email" value="{{ email }}" required style="width: 300px;">
-    </div>
-    <button type="submit" class="button">Enviar invitación</button>
-</form>
-{% endblock %}

+ 0 - 17
src/templates/admin/invitationcode/add.html

@@ -1,17 +0,0 @@
-{% extends "admin/base.html" %}
-{% block content %}
-<div class="container">
-    <h1>Crear invitación</h1>
-    <p>Genera un código de invitación y envíalo por email al nuevo usuario.</p>
-    <form method="post">
-        {% csrf_token %}
-        <div class="form-row">
-            <label for="email">Email del nuevo usuario:</label>
-            <input type="email" name="email" id="email" required>
-        </div>
-        <div class="submit-row">
-            <input type="submit" value="Crear y enviar" class="default">
-        </div>
-    </form>
-</div>
-{% endblock %}

+ 0 - 13
src/templates/admin/invitationcode/change_list.html

@@ -1,13 +0,0 @@
-{% extends "admin/change_list.html" %}
-{% block content %}
-<h1>Crear y enviar invitación</h1>
-<p>Genera un nuevo código de invitación y envíalo por email al nuevo usuario.</p>
-<form method="post">
-    {% csrf_token %}
-    <div style="margin-bottom: 10px;">
-        <label for="email">Email del nuevo usuario:</label><br>
-        <input type="email" name="email" id="email" required style="width: 300px;">
-    </div>
-    <button type="submit" class="button default">Crear y enviar invitación</button>
-</form>
-{% endblock %}

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

@@ -1,9 +0,0 @@
-{% 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 %}

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

@@ -1,20 +0,0 @@
-<!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>