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