Add user_login field and migrate existing credentials.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alberto-AudrixandCursor committed 2026-09-08 15:46:09 +07:00
1 parent b54624be96
commit 5a58dba347
3 files changed
+65 -8

No files matched your search

@@ -0,0 +1,32 @@
from django.db import migrations, models
def copy_user_name_to_user_login(apps, schema_editor):
User = apps.get_model("accounts", "User")
for user in User.objects.all():
user.user_login = user.user_name
user.save(update_fields=["user_login"])
def noop_reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
("accounts", "0011_superuser_status"),
]
operations = [
migrations.AddField(
model_name="user",
name="user_login",
field=models.CharField(max_length=30, null=True),
),
migrations.RunPython(copy_user_name_to_user_login, noop_reverse),
migrations.AlterField(
model_name="user",
name="user_login",
field=models.CharField(max_length=30, unique=True),
),
]
+10 -8
View File
@@ -9,21 +9,22 @@ from django.utils import timezone
class UserManager(BaseUserManager):
def create_user(self, user_name: str, password: str | None = None, **extra_fields):
if not user_name:
raise ValueError("user_name is required")
def create_user(self, user_login: str, password: str | None = None, **extra_fields):
if not user_login:
raise ValueError("user_login is required")
extra_fields.setdefault("status", User.STATUS_GM)
extra_fields.setdefault("is_superuser", False)
user = self.model(user_name=user_name, **extra_fields)
extra_fields.setdefault("user_name", user_login)
user = self.model(user_login=user_login, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, user_name: str, password: str | None = None, **extra_fields):
def create_superuser(self, user_login: str, password: str | None = None, **extra_fields):
"""Break-glass: status=superuser (ops + user management). Hidden from user lists."""
extra_fields["status"] = User.STATUS_SUPERUSER
extra_fields["is_superuser"] = True
return self.create_user(user_name, password, **extra_fields)
return self.create_user(user_login, password, **extra_fields)
class User(AbstractBaseUser, PermissionsMixin):
@@ -75,6 +76,7 @@ class User(AbstractBaseUser, PermissionsMixin):
)
user_id = models.BigAutoField(primary_key=True)
user_login = models.CharField(max_length=30, unique=True)
user_name = models.CharField(max_length=30, unique=True)
status = models.CharField(max_length=30, choices=STATUS_CHOICES, default=STATUS_GM)
# BUH who manages this GM / GM Admin (unused for director / buh themselves).
@@ -102,8 +104,8 @@ class User(AbstractBaseUser, PermissionsMixin):
objects = UserManager()
USERNAME_FIELD = "user_name"
REQUIRED_FIELDS: list[str] = []
USERNAME_FIELD = "user_login"
REQUIRED_FIELDS: list[str] = ["user_name"]
class Meta:
db_table = "user_access"
+23
View File
@@ -0,0 +1,23 @@
from django.contrib.auth import authenticate
from django.test import TestCase
from apps.accounts.models import User
class UserLoginFieldTests(TestCase):
def test_authenticate_uses_user_login_not_user_name(self):
User.objects.create_user(
user_login="gm.login",
password="gm123",
user_name="gm",
status=User.STATUS_GM,
)
self.assertIsNotNone(
authenticate(username="gm.login", password="gm123")
)
self.assertIsNone(authenticate(username="gm", password="gm123"))
def test_create_user_defaults_user_name_to_login(self):
user = User.objects.create_user(user_login="solo", password="x")
self.assertEqual(user.user_login, "solo")
self.assertEqual(user.user_name, "solo")