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:
|
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)
|
||||||
|
|
||||||
@@ -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):
|
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
|
||||||
|
|||||||
@@ -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)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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("/")
|
||||||
|
|||||||
Reference in New Issue
Block a user