custom_user: perform implicit writes on redundant phone fields (#65173)

This commit is contained in:
Paul Marillonnet 2022-09-19 14:23:40 +02:00
parent 34215788c5
commit d3e64bd82e
2 changed files with 63 additions and 2 deletions

View File

@ -104,7 +104,7 @@ class Attributes:
)
update_fields = ['modified']
if name in ['first_name', 'last_name']:
if name in ['first_name', 'last_name', 'phone']:
if getattr(self.owner, name) != value:
setattr(self.owner, name, value)
update_fields.append(name)
@ -487,7 +487,7 @@ class User(AbstractBaseUser):
def save(self, *args, **kwargs):
update_fields = kwargs.get('update_fields')
super().save(*args, **kwargs)
if not update_fields or not set(update_fields).isdisjoint({'first_name', 'last_name'}):
if not update_fields or not set(update_fields).isdisjoint({'first_name', 'last_name', 'phone'}):
try:
self.attributes.first_name
except AttributeError:
@ -503,6 +503,14 @@ class User(AbstractBaseUser):
if self.attributes.last_name != self.last_name:
self.attributes.last_name = self.last_name
try:
self.attributes.phone
except AttributeError:
pass
else:
if self.attributes.phone != self.phone:
self.attributes.phone = self.phone
def can_change_password(self):
return True

View File

@ -89,6 +89,19 @@ def test_sync_first_name(db, settings):
assert user.attributes.first_name == 'John Paul'
def test_sync_phone(db, settings):
Attribute.objects.get_or_create(name='phone', defaults={'label': 'Phone', 'kind': 'phone_number'})
user = User(username='john.doe', email='john.doe2@example.net')
user.save()
user.phone = '+33123456789'
user.save()
assert user.attributes.phone == '+33123456789'
user.attributes.phone = '+43876543210'
assert user.attributes.phone == '+43876543210'
def test_save_does_not_reset_verified_attributes_first_name(db):
user = User.objects.create()
user.verified_attributes.first_name = 'John'
@ -167,6 +180,46 @@ def test_save_does_not_reset_verified_attributes_last_name(db):
assert user.attributes.last_name == 'John'
def test_save_does_not_reset_verified_attributes_phone(db):
Attribute.objects.get_or_create(name='phone', defaults={'label': 'Phone', 'kind': 'phone_number'})
user = User.objects.create()
user.verified_attributes.phone = '+33123456789'
user = User.objects.get()
assert user.phone == '+33123456789'
assert user.is_verified.phone
assert user.verified_attributes.phone == '+33123456789'
assert user.attributes.phone == '+33123456789'
user.save()
user = User.objects.get()
assert user.phone == '+33123456789'
assert user.is_verified.phone
assert user.verified_attributes.phone == '+33123456789'
assert user.attributes.phone == '+33123456789'
user.phone = '+43876543210'
user.save()
assert not user.is_verified.phone
assert user.verified_attributes.phone is None
assert user.attributes.phone == '+43876543210'
user = User.objects.get()
assert user.phone == '+43876543210'
assert not user.is_verified.phone
assert user.verified_attributes.phone is None
assert user.attributes.phone == '+43876543210'
user.verified_attributes.phone = '+33123456789'
assert user.is_verified.phone
assert user.verified_attributes.phone == '+33123456789'
assert user.attributes.phone == '+33123456789'
user = User.objects.get()
assert user.phone == '+33123456789'
assert user.is_verified.phone
assert user.verified_attributes.phone == '+33123456789'
assert user.attributes.phone == '+33123456789'
def test_fix_attributes(db):
first_name_attribute = Attribute.objects.get(name='first_name')
user = User.objects.create(first_name='john', last_name='Doe')