Skip to content
Snippets Groups Projects
Commit 43bedfa4 authored by Bastien Abadie's avatar Bastien Abadie
Browse files

Merge branch 'username' into 'master'

Add a display_name field to Users

See merge request !1089
parents 1a9d1ad4 be3e5ee5
No related branches found
No related tags found
1 merge request!1089Add a display_name field to Users
......@@ -2,6 +2,7 @@ SELECT "users_user"."id",
"users_user"."password",
"users_user"."last_login",
"users_user"."email",
"users_user"."display_name",
"users_user"."transkribus_email",
"users_user"."is_active",
"users_user"."is_internal",
......
......@@ -65,10 +65,10 @@ class UserAdmin(BaseUserAdmin):
# The fields to be used in displaying the User model.
# These override the definitions on the base UserAdmin
# that reference specific fields on auth.User.
list_display = ('email', 'is_admin')
list_display = ('email', 'display_name', 'is_admin')
list_filter = ('is_admin', 'is_internal')
fieldsets = (
(None, {'fields': ('email', 'verified_email', 'password', 'transkribus_email')}),
(None, {'fields': ('email', 'display_name', 'verified_email', 'password', 'transkribus_email')}),
('Permissions', {'fields': ('is_admin', 'is_internal')}),
)
# add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
......
......@@ -2,14 +2,22 @@ from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
def create_user(self, email, password=None, internal=False):
def create_user(self, email, password=None, display_name=None, internal=False):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError('Users must have an email address')
if not display_name:
# Try to automatically define a display name
try:
display_name = email.split('@')[0].replace('.', ' ').title()
except Exception:
display_name = email
user = self.model(
display_name=display_name,
email=self.normalize_email(email),
is_internal=internal,
)
......@@ -18,12 +26,13 @@ class UserManager(BaseUserManager):
user.save(using=self._db)
return user
def create_superuser(self, email, password):
def create_superuser(self, email, password, display_name=None):
"""
Creates and saves a superuser with the given email and password.
"""
user = self.create_user(
email,
display_name=display_name,
password=password,
)
user.is_admin = True
......
# Generated by Django 3.1.3 on 2020-11-18 15:42
from django.db import migrations, models
def get_name_from_email(apps, schema_editor):
User = apps.get_model('users', 'User')
for user in User.objects.all():
try:
user.display_name = user.email.split('@')[0].replace('.', ' ').title()
except Exception:
user.display_name = user.email
user.save()
class Migration(migrations.Migration):
dependencies = [
('users', '0006_update_group_and_membership'),
]
operations = [
migrations.AddField(
model_name='user',
name='display_name',
field=models.CharField(default='default name', max_length=120),
preserve_default=False,
),
migrations.RunPython(
get_name_from_email,
reverse_code=migrations.RunPython.noop,
elidable=True
)
]
......@@ -14,6 +14,7 @@ class User(AbstractBaseUser):
max_length=255,
unique=True,
)
display_name = models.CharField(max_length=120)
transkribus_email = models.EmailField(
max_length=255,
null=True,
......@@ -35,6 +36,7 @@ class User(AbstractBaseUser):
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['display_name', ]
def __str__(self):
return self.email
......
......@@ -72,6 +72,7 @@ class UserSerializer(serializers.ModelSerializer):
model = User
fields = (
'id',
'display_name',
'email',
'password',
'verified_email',
......@@ -123,6 +124,7 @@ class NewUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (
'display_name',
'email',
'password'
)
......
......@@ -46,9 +46,9 @@ class TestRegistration(FixtureAPITestCase):
self.assertEqual(data['is_admin'], False)
self.assertNotIn('password', data)
def test_update(self):
def test_update_password(self):
self.client.force_login(self.user)
response = self.client.put(
response = self.client.patch(
reverse('api:user-retrieve'),
data={'password': 'N€wP4$5w0Rd'},
format='json',
......@@ -57,6 +57,17 @@ class TestRegistration(FixtureAPITestCase):
self.user.refresh_from_db()
self.assertTrue(self.user.check_password('N€wP4$5w0Rd'))
def test_update_display_name(self):
self.client.force_login(self.user)
response = self.client.patch(
reverse('api:user-retrieve'),
data={'display_name': 'There was a typo in my name'},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.user.refresh_from_db()
self.assertEqual(self.user.display_name, 'There was a typo in my name')
def test_logout(self):
self.client.force_login(self.user)
response = self.client.delete(reverse('api:user-retrieve'))
......@@ -184,10 +195,10 @@ class TestRegistration(FixtureAPITestCase):
response = self.client.get(reverse('api:user-token'))
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_email_only(self):
def test_create_no_password(self):
response = self.client.post(
reverse('api:user-new'),
data={'email': 'newuser@example.com'},
data={'display_name': 'New user', 'email': 'newuser@example.com'},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
......@@ -202,7 +213,7 @@ class TestRegistration(FixtureAPITestCase):
def test_create(self):
response = self.client.post(
reverse('api:user-new'),
data={'email': 'newuser@example.com', 'password': 'myVerySecretPassword'},
data={'display_name': 'New user', 'email': 'newuser@example.com', 'password': 'myVerySecretPassword'},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
......@@ -215,7 +226,7 @@ class TestRegistration(FixtureAPITestCase):
self.assertEqual(mail.outbox[0].to, ['newuser@example.com'])
self.assertTrue(user.check_password('myVerySecretPassword'))
def test_create_wrong_password(self):
def test_register_wrong_password(self):
wrong = {
'P@SsWrD': ['This password is too short. It must contain at least 8 characters.'],
'42133742': ['This password is entirely numeric.'],
......@@ -225,12 +236,29 @@ class TestRegistration(FixtureAPITestCase):
for pwd, messages in wrong.items():
response = self.client.post(
reverse('api:user-new'),
data={'email': 'newuser@example.com', 'password': pwd},
data={'display_name': 'New user', 'email': 'newuser@example.com', 'password': pwd},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), {'password': messages})
def test_register_wrong_fields(self):
response = self.client.post(
reverse('api:user-new'),
data={
'display_name': 'A' * 1024,
'email': '',
'password': ''
},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(response.json(), {
'display_name': ['Ensure this field has no more than 120 characters.'],
'email': ['This field may not be blank.'],
'password': ['This field may not be blank.']
})
@override_settings(ARKINDEX_FEATURES={'signup': False})
def test_create_no_signup(self):
response = self.client.post(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment