diff --git a/account/migrations/0014_user_raw_password.py b/account/migrations/0014_user_raw_password.py new file mode 100644 index 0000000..616dd27 --- /dev/null +++ b/account/migrations/0014_user_raw_password.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.6 on 2025-05-09 13:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0013_alter_user_session_keys_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='raw_password', + field=models.CharField(blank=True, max_length=20, null=True, verbose_name='明文密码'), + ), + ] diff --git a/account/models.py b/account/models.py index 4716d26..db3ba85 100644 --- a/account/models.py +++ b/account/models.py @@ -41,6 +41,9 @@ class User(AbstractBaseUser): open_api = models.BooleanField(default=False) open_api_appkey = models.TextField(null=True) is_disabled = models.BooleanField(default=False) + raw_password = models.CharField( + max_length=20, null=True, blank=True, verbose_name="明文密码" + ) USERNAME_FIELD = "username" REQUIRED_FIELDS = [] @@ -64,6 +67,11 @@ class User(AbstractBaseUser): contest.created_by == self or self.admin_type == AdminType.SUPER_ADMIN ) + def set_password(self, raw_password): + super().set_password(raw_password) + self.raw_password = raw_password + self.save() + class Meta: db_table = "user" diff --git a/account/serializers.py b/account/serializers.py index 0f88ec7..2ba68eb 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -66,11 +66,18 @@ class UserAdminSerializer(serializers.ModelSerializer): "two_factor_auth", "open_api", "is_disabled", + "raw_password", ] def get_real_name(self, obj): return obj.userprofile.real_name + def to_representation(self, instance): + data = super().to_representation(instance) + if instance.admin_type != AdminType.REGULAR_USER: + data.pop("raw_password", None) + return data + class UserSerializer(serializers.ModelSerializer): class Meta: diff --git a/account/views/admin.py b/account/views/admin.py index 2237a1a..1b970bb 100644 --- a/account/views/admin.py +++ b/account/views/admin.py @@ -39,6 +39,7 @@ class UserAdminAPI(APIView): username=user_data[0], password=make_password(user_data[1]), email=user_data[2], + raw_password=user_data[1], ) )