diff --git a/apps/users/migrations/0048_wechat_phone_encrypt.py b/apps/users/migrations/0048_wechat_phone_encrypt.py new file mode 100644 index 000000000..7db87e09e --- /dev/null +++ b/apps/users/migrations/0048_wechat_phone_encrypt.py @@ -0,0 +1,45 @@ +# Generated by Django 4.1.10 on 2023-10-10 06:57 + +from django.db import migrations + +import common.db.fields + +users_bulked = [] + + +def get_encrypt_fields_value(apps, *args): + global users_bulked + user_model = apps.get_model('users', 'User') + bulk_size = 2000 + users = user_model.objects.all() + users_bulked = [ + users[i:i + bulk_size] + for i in range(0, users.count(), bulk_size) + ] + + +def migrate_encrypt_fields(apps, *args): + user_model = apps.get_model('users', 'User') + for _users in users_bulked: + user_model.objects.bulk_update(_users, ['phone', 'wechat']) + + +class Migration(migrations.Migration): + dependencies = [ + ('users', '0047_user_date_api_key_last_used'), + ] + + operations = [ + migrations.RunPython(get_encrypt_fields_value), + migrations.AlterField( + model_name='user', + name='wechat', + field=common.db.fields.EncryptCharField(blank=True, max_length=128, verbose_name='Wechat'), + ), + migrations.AlterField( + model_name='user', + name='phone', + field=common.db.fields.EncryptCharField(blank=True, max_length=128, null=True, verbose_name='Phone'), + ), + migrations.RunPython(migrate_encrypt_fields), + ] diff --git a/apps/users/models/user.py b/apps/users/models/user.py index adac178a7..15054aa4f 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -805,11 +805,11 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, JSONFilterMixin, Abstract avatar = models.ImageField( upload_to="avatar", null=True, verbose_name=_('Avatar') ) - wechat = models.CharField( + wechat = fields.EncryptCharField( max_length=128, blank=True, verbose_name=_('Wechat') ) - phone = models.CharField( - max_length=20, blank=True, null=True, verbose_name=_('Phone') + phone = fields.EncryptCharField( + max_length=128, blank=True, null=True, verbose_name=_('Phone') ) mfa_level = models.SmallIntegerField( default=0, choices=MFAMixin.MFA_LEVEL_CHOICES, verbose_name=_('MFA')