Fix/comments with UUID user (#7216)

* Add UUID primary key to EmailUser

* Convert pks to strings when being used as dictionary keys for commenting, to prevent custom primary key fields on user model causing serialization to fail
pull/7227/head
Jacob Topp-Mugglestone 2021-05-28 16:46:45 +01:00 zatwierdzone przez GitHub
rodzic a56143b90b
commit afff4d451a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
9 zmienionych plików z 34 dodań i 47 usunięć

Wyświetl plik

@ -867,7 +867,6 @@ class CommentPanel(EditHandler):
}
user = getattr(self.request, 'user', None)
authors = {user.pk: user_data(user)} if user else {}
user_pks = {user.pk}
serialized_comments = []
bound = self.form.is_bound
@ -888,7 +887,7 @@ class CommentPanel(EditHandler):
data['replies'] = replies
serialized_comments.append(data)
authors = {user.pk: user_data(user) for user in get_user_model().objects.filter(pk__in=user_pks)}
authors = {str(user.pk): user_data(user) for user in get_user_model().objects.filter(pk__in=user_pks)}
comments_data = {
'comments': serialized_comments,

Wyświetl plik

@ -9,6 +9,7 @@ from django.contrib.auth.models import AnonymousUser
from django.core import checks
from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured
from django.test import RequestFactory, TestCase, override_settings
from django.utils.html import json_script
from freezegun import freeze_time
from pytz import utc
@ -1100,8 +1101,13 @@ class TestCommentPanel(TestCase, WagtailTestUtils):
self.assertEqual(data['comments'][0]['replies'][0]['user'], self.reply_1.user.pk)
self.assertEqual(data['comments'][0]['replies'][1]['user'], self.reply_2.user.pk)
self.assertIn(self.commenting_user.pk, data['authors'])
self.assertIn(self.other_user.pk, data['authors'])
self.assertIn(str(self.commenting_user.pk), data['authors'])
self.assertIn(str(self.other_user.pk), data['authors'])
try:
json_script(data, 'comments-data')
except TypeError:
self.fail("Failed to serialize comments data. This is likely due to a custom user model using an unsupported field.")
def test_form(self):
"""

Wyświetl plik

@ -1,6 +1,6 @@
[
{
"pk": 1,
"pk": "00000000-0000-0000-0000-000000000001",
"model": "emailuser.emailuser",
"fields": {
"first_name": "",
@ -16,7 +16,7 @@
}
},
{
"pk": 2,
"pk": "00000000-0000-0000-0000-000000000002",
"model": "emailuser.emailuser",
"fields": {
"first_name": "",
@ -33,7 +33,7 @@
}
},
{
"pk": 3,
"pk": "00000000-0000-0000-0000-000000000003",
"model": "emailuser.emailuser",
"fields": {
"first_name": "",
@ -50,7 +50,7 @@
}
},
{
"pk": 4,
"pk": "00000000-0000-0000-0000-000000000004",
"model": "emailuser.emailuser",
"fields": {
"first_name": "",
@ -67,7 +67,7 @@
}
},
{
"pk": 5,
"pk": "00000000-0000-0000-0000-000000000005",
"model": "emailuser.emailuser",
"fields": {
"first_name": "",
@ -84,7 +84,7 @@
}
},
{
"pk": 6,
"pk": "00000000-0000-0000-0000-000000000006",
"model": "emailuser.emailuser",
"fields": {
"first_name": "",
@ -101,7 +101,7 @@
}
},
{
"pk": 7,
"pk": "00000000-0000-0000-0000-000000000007",
"model": "emailuser.emailuser",
"fields": {
"first_name": "",

Wyświetl plik

@ -1,6 +1,6 @@
[
{
"pk": 1,
"pk": "00000000-0000-0000-0000-000000000001",
"model": "emailuser.emailuser",
"fields": {
"first_name": "Clark",
@ -16,7 +16,7 @@
}
},
{
"pk": 2,
"pk": "00000000-0000-0000-0000-000000000002",
"model": "emailuser.emailuser",
"fields": {
"first_name": "Jane",
@ -33,7 +33,7 @@
}
},
{
"pk": 3,
"pk": "00000000-0000-0000-0000-000000000003",
"model": "emailuser.emailuser",
"fields": {
"first_name": "Bob",
@ -50,7 +50,7 @@
}
},
{
"pk": 4,
"pk": "00000000-0000-0000-0000-000000000004",
"model": "emailuser.emailuser",
"fields": {
"first_name": "Sam",
@ -68,7 +68,7 @@
}
},
{
"pk": 5,
"pk": "00000000-0000-0000-0000-000000000005",
"model": "emailuser.emailuser",
"fields": {
"first_name": "Mary",
@ -86,7 +86,7 @@
}
},
{
"pk": 6,
"pk": "00000000-0000-0000-0000-000000000006",
"model": "emailuser.emailuser",
"fields": {
"first_name": "Josh",

Wyświetl plik

@ -1,6 +1,6 @@
[
{
"pk": 1,
"pk": "00000000-0000-0000-0000-000000000001",
"model": "emailuser.emailuser",
"fields": {
"first_name": "",

Wyświetl plik

@ -1,6 +1,7 @@
# Generated by Django 3.1 on 2020-08-13 21:28
# Generated by Django 3.2.3 on 2021-05-25 13:26
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
@ -15,17 +16,17 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='EmailUser',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('uuid', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('email', models.EmailField(max_length=255, unique=True)),
('is_staff', models.BooleanField(default=True)),
('is_active', models.BooleanField(default=True)),
('first_name', models.CharField(blank=True, max_length=50)),
('last_name', models.CharField(blank=True, max_length=50)),
('is_superuser', models.BooleanField(default=False)),
('groups', models.ManyToManyField(blank=True, related_name='_emailuser_groups_+', to='auth.Group')),
('user_permissions', models.ManyToManyField(blank=True, related_name='_emailuser_user_permissions_+', to='auth.Permission')),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
],
options={
'abstract': False,

Wyświetl plik

@ -1,24 +0,0 @@
# Generated by Django 3.1 on 2020-08-13 23:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
('emailuser', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='emailuser',
name='groups',
field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'),
),
migrations.AlterField(
model_name='emailuser',
name='user_permissions',
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
),
]

Wyświetl plik

@ -1,3 +1,5 @@
import uuid
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models
@ -25,6 +27,7 @@ class EmailUserManager(BaseUserManager):
class EmailUser(AbstractBaseUser, PermissionsMixin):
uuid = models.UUIDField(default=uuid.uuid4, primary_key=True)
email = models.EmailField(max_length=255, unique=True)
is_staff = models.BooleanField(default=True)
is_active = models.BooleanField(default=True)

Wyświetl plik

@ -153,6 +153,7 @@ class TestUserIndexView(TestCase, WagtailTestUtils):
self.assertTemplateUsed(response, 'wagtailusers/users/index.html')
self.assertContains(response, 'testuser')
@unittest.skipIf(settings.AUTH_USER_MODEL == 'emailuser.EmailUser', 'Negative UUID not possible')
def test_allows_negative_ids(self):
# see https://github.com/wagtail/wagtail/issues/565
self.create_user('guardian', 'guardian@example.com', 'gu@rd14n', pk=-1)
@ -658,7 +659,8 @@ class TestUserEditView(TestCase, WagtailTestUtils):
self.assertContains(response, 'Password confirmation:')
def test_nonexistant_redirect(self):
self.assertEqual(self.get(user_id=100000).status_code, 404)
invalid_id = '99999999-9999-9999-9999-999999999999' if settings.AUTH_USER_MODEL == 'emailuser.EmailUser' else 100000
self.assertEqual(self.get(user_id=invalid_id).status_code, 404)
def test_simple_post(self):
response = self.post({