user: add command to fix storage of first_name/last_name attributes (#31937)
This commit is contained in:
parent
b72b11cb83
commit
1079ac2e00
|
@ -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)
|
||||
|
||||
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue