migrations run for lyric models; authentication & views & their tests now account more fully for uuid over email as pk
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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("/")
|
||||
|
||||
Reference in New Issue
Block a user