diff --git a/frontend/src/api/account.js b/frontend/src/api/account.js index 39e5f77b9..c5c8dcc09 100644 --- a/frontend/src/api/account.js +++ b/frontend/src/api/account.js @@ -6,6 +6,9 @@ export default { getMe() { return repository.get(`/${resource}/me/`) }, + updateMe(data) { + return repository.put(`/${resource}/me/`, data) + }, checkPassword(value) { return repository.post(`/${resource}/me/password/`, { password: value }) }, diff --git a/frontend/src/stores/auth.store.js b/frontend/src/stores/auth.store.js index 5b65a4e7e..f12d707fc 100644 --- a/frontend/src/stores/auth.store.js +++ b/frontend/src/stores/auth.store.js @@ -163,7 +163,7 @@ export const useAuthStore = defineStore('auth', () => { } async function updateAccount(data) { - return accountsApi.patch(authUser.value.pk, data).then((response) => { + return accountApi.updateMe(data).then((response) => { const newAuthUser = { ...authUser.value, ...response.data } delete newAuthUser.password authUser.value = { ...newAuthUser } diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index f2d2a33bf..303b96076 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -398,6 +398,20 @@ class AccountMeSerializer(v1_serializers.AccountSerializer): return [f"{p.content_type.app_label}.{p.codename}" for p in permissions] +class AccountMeUpdateSerializer(serializers.ModelSerializer): + """Update serializer for connected user.""" + + class Meta: + model = core_models.User + fields = ( + "first_name", + "last_name", + "language", + "phone_number", + "secondary_email", + ) + + class AccountSerializer(v1_serializers.AccountSerializer): """Add support for user resources.""" diff --git a/modoboa/core/api/v2/tests.py b/modoboa/core/api/v2/tests.py index 23d866851..87efccf89 100644 --- a/modoboa/core/api/v2/tests.py +++ b/modoboa/core/api/v2/tests.py @@ -196,6 +196,18 @@ class AccountViewSetTestCase(ModoAPITestCase): me = resp.json() self.assertEqual(me["username"], "admin") + def test_update_me(self): + url = reverse("v2:account-me") + data = { + "first_name": "First name", + "secondary_email": "toto@iti.com", + "language": "fr", + } + resp = self.client.put(url, data, format="json") + self.assertEqual(resp.status_code, 200) + me = resp.json() + self.assertEqual(me["secondary_email"], data["secondary_email"]) + def test_me_password(self, password_ko="Toto1234", password_ok="password"): url = reverse("v2:account-check-me-password") resp = self.client.post(url, {"password": password_ko}, format="json") diff --git a/modoboa/core/api/v2/viewsets.py b/modoboa/core/api/v2/viewsets.py index ef80c673f..643848234 100644 --- a/modoboa/core/api/v2/viewsets.py +++ b/modoboa/core/api/v2/viewsets.py @@ -48,11 +48,22 @@ def create_static_tokens(request): class AccountViewSet(core_v1_viewsets.AccountViewSet): """Account viewset.""" - @extend_schema(responses=admin_v2_serializers.AccountMeSerializer) - @action(methods=["get"], detail=False) + @extend_schema( + responses=admin_v2_serializers.AccountMeSerializer, + request=admin_v2_serializers.AccountMeUpdateSerializer, + ) + @action(methods=["get", "put"], detail=False) def me(self, request): """Return information about connected user.""" - serializer = admin_v1_serializers.AccountSerializer(request.user) + if request.method == "PUT": + serializer = admin_v2_serializers.AccountMeUpdateSerializer( + data=request.data, instance=request.user + ) + serializer.is_valid(raise_exception=True) + instance = serializer.save() + serializer = admin_v1_serializers.AccountSerializer(instance) + else: + serializer = admin_v1_serializers.AccountSerializer(request.user) return response.Response(serializer.data) @action(