migrations run for lyric models; authentication & views & their tests now account more fully for uuid over email as pk

This commit is contained in:
Disco DeDisco
2026-01-30 21:33:30 -05:00
parent f002cc5c84
commit ae63861adb
6 changed files with 60 additions and 10 deletions

View File

@@ -15,9 +15,9 @@ class PasswordlessAuthenticationBackend:
except User.DoesNotExist:
return User.objects.create(email=token.email)
def get_user(self, email):
def get_user(self, user_id):
try:
return User.objects.get(email=email)
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None # might also just pass (which = return None)
return None # could also pass (which = return None)

View File

@@ -0,0 +1,28 @@
# Generated by Django 6.0 on 2026-01-31 01:03
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0002_token'),
]
operations = [
migrations.RemoveField(
model_name='token',
name='id',
),
migrations.AlterField(
model_name='token',
name='uid',
field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='user',
name='id',
field=models.BigAutoField(primary_key=True, serialize=False),
),
]

View File

@@ -7,10 +7,10 @@ class Token(models.Model):
class User(models.Model):
id = models.BigAutoField(primary_key=True)
# email = models.EmailField(primary_key=True)
email = models.EmailField(unique=True)
REQUIRED_FIELDS = []
USERNAME_FIELD = "email"
is_anonymous = False
is_authenticated = True
is_anonymous =False

View File

@@ -47,10 +47,10 @@ class GetUserTest(TestCase):
def test_gets_user_by_uuid(self):
User.objects.create(email="fantaman@example.com")
desired_user = User.objects.create(email="discoman@example.com")
found_user = PasswordlessAuthenticationBackend().get_user("discoman@example.com")
found_user = PasswordlessAuthenticationBackend().get_user(desired_user.id)
self.assertEqual(found_user, desired_user)
def test_returns_None_if_no_user_with_that_email(self):
self.assertIsNone(
PasswordlessAuthenticationBackend().get_user("discoman@example.com")
PasswordlessAuthenticationBackend().get_user(999)
)

View File

@@ -1,6 +1,7 @@
from django.contrib import auth
from django.test import TestCase
from unittest import mock
from ..models import Token
from ..models import Token, User
class SendLoginEmailViewTest(TestCase):
def test_redirects_to_home_page(self):
@@ -58,3 +59,14 @@ class LoginViewTest(TestCase):
def test_redirects_to_home_page(self):
response = self.client.get("/apps/lyric/login?token=abc123")
self.assertRedirects(response, "/")
def test_logs_in_if_given_valid_token(self):
anon_user = auth.get_user(self.client)
self.assertEqual(anon_user.is_authenticated, False)
token = Token.objects.create(email="discoman@example.com")
self.client.get(f"/apps/lyric/login?token={token.uid}", follow=True)
user = auth.get_user(self.client)
self.assertEqual(user.is_authenticated, True)
self.assertEqual(user.email, "discoman@example.com")

View File

@@ -1,8 +1,9 @@
from django.contrib import messages
from django.contrib import auth, messages
from django.core.exceptions import ValidationError
from django.core.mail import send_mail
from django.shortcuts import redirect
from django.urls import reverse
from .models import Token
from .models import Token, User
from ..dashboard.forms import ItemForm
def send_login_email(request):
@@ -25,4 +26,13 @@ def send_login_email(request):
return redirect("/")
def login(request):
uid = request.GET.get("token")
if not uid:
return redirect("/")
user = auth.authenticate(request, uid=uid)
if user is not None:
user.backend = "apps.lyric.authentication.PasswordlessAuthenticationBackend"
auth.login(request, user)
return redirect("/")