user: add command to fix storage of first_name/last_name attributes (#31937)

This commit is contained in:
Benjamin Dauvergne 2019-04-03 16:07:02 +02:00
parent b72b11cb83
commit 1079ac2e00
2 changed files with 82 additions and 0 deletions

View File

@ -0,0 +1,58 @@
from __future__ import unicode_literals, print_function
from django.core.management.base import BaseCommand
from authentic2.custom_user.models import User
class Command(BaseCommand):
help = "Fix user attributes"
requires_system_checks = False
def handle(self, *args, **options):
user_ids = User.objects.values_list('id', flat=True)
i = 0
while True:
batch = user_ids[i * 100:i * 100 + 100]
if not batch:
break
users = User.objects.prefetch_related('attribute_values__attribute').filter(
id__in=batch)
count = 0
for user in users:
try:
atv_first_name = [
atv for atv in user.attribute_values.all() if atv.attribute.name == 'first_name'
][0]
except IndexError:
atv_first_name = None
try:
atv_last_name = [
atv for atv in user.attribute_values.all() if atv.attribute.name == 'last_name'
][0]
except IndexError:
atv_last_name = None
save = False
fixed = True
if not atv_first_name:
fixed = True
user.attributes.first_name = user.first_name
elif atv_first_name.content != user.first_name:
user.first_name = atv_first_name.content
save = True
if not atv_last_name:
fixed = True
user.attributes.last_name = user.last_name
elif atv_last_name.content != user.last_name:
user.last_name = atv_last_name.content
save = True
if save:
user.save()
if save or fixed:
count += 1
i += 1
print('Fixed %d users.' % count)

View File

@ -17,6 +17,7 @@
import pytest
from django.core.exceptions import ValidationError
from django.core import management
from authentic2.custom_user.models import User
from authentic2.models import Attribute, AttributeValue
@ -164,3 +165,26 @@ def test_save_does_not_reset_verified_attributes_last_name(db):
assert user.is_verified.last_name
assert user.verified_attributes.last_name == 'John'
assert user.attributes.last_name == 'John'
def test_fix_attributes(db):
first_name_attribute = Attribute.objects.get(name='first_name')
user = User.objects.create(first_name='john', last_name='Doe')
user.attribute_values.all().delete()
first_name_attribute.set_value(user, 'John', verified=True)
user.refresh_from_db()
assert user.first_name == 'john'
assert user.attributes.first_name == 'John'
assert user.verified_attributes.first_name == 'John'
assert user.attribute_values.count() == 1
assert user.attribute_values.all()[0].content == 'John'
management.call_command('fix-attributes')
user.refresh_from_db()
assert user.attribute_values.count() == 2
assert user.first_name == 'John'
assert user.verified_attributes.first_name == 'John'
assert user.verified_attributes.last_name is None
assert user.last_name == 'Doe'
assert user.attributes.last_name == 'Doe'