Authenticate login API with user_login.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
5a58dba347
commit
4f0abceb20
5 files changed
+49
-21
No files matched your search
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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")
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in new issue
Block a user