diff --git a/backend/apps/accounts/serializers.py b/backend/apps/accounts/serializers.py index 59c1599..a596c36 100644 --- a/backend/apps/accounts/serializers.py +++ b/backend/apps/accounts/serializers.py @@ -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) diff --git a/backend/apps/accounts/tests_account_admin.py b/backend/apps/accounts/tests_account_admin.py index e6c2752..3472d2f 100644 --- a/backend/apps/accounts/tests_account_admin.py +++ b/backend/apps/accounts/tests_account_admin.py @@ -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", diff --git a/backend/apps/accounts/tests_user_login.py b/backend/apps/accounts/tests_user_login.py index 9e4e399..0e2a2fd 100644 --- a/backend/apps/accounts/tests_user_login.py +++ b/backend/apps/accounts/tests_user_login.py @@ -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") diff --git a/backend/apps/accounts/views.py b/backend/apps/accounts/views.py index 9962402..4331bfd 100644 --- a/backend/apps/accounts/views.py +++ b/backend/apps/accounts/views.py @@ -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: diff --git a/backend/apps/farms/tests_feed_in_button.py b/backend/apps/farms/tests_feed_in_button.py index 6965d95..2fd6a10 100644 --- a/backend/apps/farms/tests_feed_in_button.py +++ b/backend/apps/farms/tests_feed_in_button.py @@ -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), )