Authenticate login API with user_login.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alberto-AudrixandCursor committed 2026-09-08 15:52:30 +07:00
1 parent 5a58dba347
commit 4f0abceb20
5 files changed
+49 -21

No files matched your search

+5 -3
View File
@@ -30,6 +30,7 @@ class UserSerializer(PkAsIdMixin, serializers.ModelSerializer):
model = User
fields = [
"id",
"user_login",
"user_name",
"status",
"is_superuser",
@@ -74,6 +75,7 @@ class UserWriteSerializer(PkAsIdMixin, serializers.ModelSerializer):
model = User
fields = [
"id",
"user_login",
"user_name",
"status",
"is_superuser",
@@ -134,9 +136,9 @@ class UserWriteSerializer(PkAsIdMixin, serializers.ModelSerializer):
def create(self, validated_data):
password = validated_data.pop("password")
user_name = validated_data.pop("user_name")
user_login = validated_data.pop("user_login")
return User.objects.create_user(
user_name=user_name, password=password, **validated_data
user_login=user_login, password=password, **validated_data
)
def update(self, instance, validated_data):
@@ -159,7 +161,7 @@ class SetPasswordSerializer(serializers.Serializer):
class LoginSerializer(serializers.Serializer):
user_name = serializers.CharField(max_length=30)
user_login = serializers.CharField(max_length=30)
password = serializers.CharField(write_only=True)
+15 -11
View File
@@ -8,7 +8,7 @@ from apps.accounts.models import User
class AccountAdminModelTests(TestCase):
def test_account_admin_flags_and_executive(self):
user = User.objects.create_user(
user_name="acct1",
user_login="acct1",
password="secret",
status=User.STATUS_ACCOUNT_ADMIN,
)
@@ -18,7 +18,7 @@ class AccountAdminModelTests(TestCase):
def test_inactive_clears_flags(self):
user = User.objects.create_user(
user_name="acct2",
user_login="acct2",
password="secret",
status=User.STATUS_ACCOUNT_ADMIN,
)
@@ -30,7 +30,7 @@ class AccountAdminModelTests(TestCase):
def test_director_admin_is_not_superuser(self):
user = User.objects.create_user(
user_name="diradmin1",
user_login="diradmin1",
password="secret",
status=User.STATUS_DIRECTOR_ADMIN,
)
@@ -42,21 +42,21 @@ class AccountAdminApiTests(TestCase):
def setUp(self):
self.client = APIClient()
self.account_admin = User.objects.create_user(
user_name="acctadmin",
user_login="acctadmin",
password="acct123",
status=User.STATUS_ACCOUNT_ADMIN,
)
self.gm = User.objects.create_user(
user_name="gm1", password="gm123", status=User.STATUS_GM
user_login="gm1", password="gm123", status=User.STATUS_GM
)
self.buh = User.objects.create_user(
user_name="buh1", password="buh123", status=User.STATUS_BUH
user_login="buh1", password="buh123", status=User.STATUS_BUH
)
self.director = User.objects.create_user(
user_name="dir1", password="dir123", status=User.STATUS_DIRECTOR
user_login="dir1", password="dir123", status=User.STATUS_DIRECTOR
)
self.superuser = User.objects.create_superuser(
user_name="admin1",
user_login="admin1",
password="admin123",
)
self.assertTrue(self.superuser.is_superuser)
@@ -67,6 +67,7 @@ class AccountAdminApiTests(TestCase):
response = self.client.post(
"/api/v1/users/",
{
"user_login": "newgm",
"user_name": "newgm",
"status": User.STATUS_GM,
"password": "temp-pass",
@@ -84,7 +85,7 @@ class AccountAdminApiTests(TestCase):
self.client.force_authenticate(self.account_admin)
response = self.client.post(
"/api/v1/users/",
{"user_name": "nopass", "status": User.STATUS_GM},
{"user_login": "nopass", "user_name": "nopass", "status": User.STATUS_GM},
format="json",
)
self.assertEqual(response.status_code, 400)
@@ -95,6 +96,7 @@ class AccountAdminApiTests(TestCase):
response = self.client.post(
"/api/v1/users/",
{
"user_login": "blocked",
"user_name": "blocked",
"status": User.STATUS_GM,
"password": "x",
@@ -153,6 +155,7 @@ class AccountAdminApiTests(TestCase):
response = self.client.post(
"/api/v1/users/",
{
"user_login": "breakglass",
"user_name": "breakglass",
"status": User.STATUS_BUH,
"password": "bg-pass",
@@ -188,7 +191,7 @@ class AccountAdminApiTests(TestCase):
def test_peer_account_admin_can_deactivate_other_account_admin(self):
peer = User.objects.create_user(
user_name="acctadmin2",
user_login="acctadmin2",
password="acct123",
status=User.STATUS_ACCOUNT_ADMIN,
)
@@ -204,7 +207,7 @@ class AccountAdminApiTests(TestCase):
self.assertFalse(peer.is_active)
def test_superuser_hidden_from_user_list(self):
User.objects.create_superuser(user_name="hidden_su", password="x")
User.objects.create_superuser(user_login="hidden_su", password="x")
self.client.force_authenticate(self.account_admin)
response = self.client.get("/api/v1/users/")
self.assertEqual(response.status_code, 200)
@@ -217,6 +220,7 @@ class AccountAdminApiTests(TestCase):
response = self.client.post(
"/api/v1/users/",
{
"user_login": "bad_su",
"user_name": "bad_su",
"status": User.STATUS_SUPERUSER,
"password": "x",
+23 -1
View File
@@ -1,5 +1,5 @@
from django.contrib.auth import authenticate
from django.test import TestCase
from django.test import Client, TestCase
from apps.accounts.models import User
@@ -21,3 +21,25 @@ class UserLoginFieldTests(TestCase):
user = User.objects.create_user(user_login="solo", password="x")
self.assertEqual(user.user_login, "solo")
self.assertEqual(user.user_name, "solo")
class LoginApiUserLoginTests(TestCase):
def test_login_accepts_user_login(self):
User.objects.create_user(
user_login="gm.login",
password="gm123",
user_name="gm",
status=User.STATUS_GM,
)
client = Client()
client.get("/api/v1/auth/csrf/")
token = client.cookies["csrftoken"].value
response = client.post(
"/api/v1/auth/login/",
{"user_login": "gm.login", "password": "gm123"},
content_type="application/json",
HTTP_X_CSRFTOKEN=token,
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.json()["user_login"], "gm.login")
self.assertEqual(response.json()["user_name"], "gm")
+1 -1
View File
@@ -235,7 +235,7 @@ class LoginView(APIView):
serializer.is_valid(raise_exception=True)
user = authenticate(
request,
username=serializer.validated_data["user_name"],
username=serializer.validated_data["user_login"],
password=serializer.validated_data["password"],
)
if user is None:
+5 -5
View File
@@ -6,14 +6,14 @@ from apps.farms.models import Kandang, Site
class KandangFeedInButtonUrlTests(TestCase):
def setUp(self):
self.owner = User.objects.create_user(user_name="owner", password="secret")
self.owner = User.objects.create_user(user_login="owner", password="secret")
self.admin = User.objects.create_user(
user_name="admin",
user_login="admin",
password="admin123",
status=User.STATUS_DIRECTOR_ADMIN,
)
self.staff = User.objects.create_user(
user_name="staff",
user_login="staff",
password="staff123",
status=User.STATUS_GM,
)
@@ -27,11 +27,11 @@ class KandangFeedInButtonUrlTests(TestCase):
token = client.cookies["csrftoken"].value
return {"HTTP_X_CSRFTOKEN": token}
def _login(self, client: Client, user_name: str, password: str) -> None:
def _login(self, client: Client, user_login: str, password: str) -> None:
client.get("/api/v1/auth/csrf/")
response = client.post(
"/api/v1/auth/login/",
{"user_name": user_name, "password": password},
{"user_login": user_login, "password": password},
content_type="application/json",
**self._csrf_headers(client),
)