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: except User.DoesNotExist:
return User.objects.create(email=token.email) return User.objects.create(email=token.email)
def get_user(self, email): def get_user(self, user_id):
try: try:
return User.objects.get(email=email) return User.objects.get(pk=user_id)
except User.DoesNotExist: 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): class User(models.Model):
id = models.BigAutoField(primary_key=True) id = models.BigAutoField(primary_key=True)
# email = models.EmailField(primary_key=True)
email = models.EmailField(unique=True) email = models.EmailField(unique=True)
REQUIRED_FIELDS = [] REQUIRED_FIELDS = []
USERNAME_FIELD = "email" USERNAME_FIELD = "email"
is_anonymous = False
is_authenticated = True is_authenticated = True
is_anonymous =False

View File

@@ -47,10 +47,10 @@ class GetUserTest(TestCase):
def test_gets_user_by_uuid(self): def test_gets_user_by_uuid(self):
User.objects.create(email="fantaman@example.com") User.objects.create(email="fantaman@example.com")
desired_user = User.objects.create(email="discoman@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) self.assertEqual(found_user, desired_user)
def test_returns_None_if_no_user_with_that_email(self): def test_returns_None_if_no_user_with_that_email(self):
self.assertIsNone( 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 django.test import TestCase
from unittest import mock from unittest import mock
from ..models import Token from ..models import Token, User
class SendLoginEmailViewTest(TestCase): class SendLoginEmailViewTest(TestCase):
def test_redirects_to_home_page(self): def test_redirects_to_home_page(self):
@@ -58,3 +59,14 @@ class LoginViewTest(TestCase):
def test_redirects_to_home_page(self): def test_redirects_to_home_page(self):
response = self.client.get("/apps/lyric/login?token=abc123") response = self.client.get("/apps/lyric/login?token=abc123")
self.assertRedirects(response, "/") 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.core.mail import send_mail
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse from django.urls import reverse
from .models import Token from .models import Token, User
from ..dashboard.forms import ItemForm from ..dashboard.forms import ItemForm
def send_login_email(request): def send_login_email(request):
@@ -25,4 +26,13 @@ def send_login_email(request):
return redirect("/") return redirect("/")
def login(request): 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("/") return redirect("/")