diff --git a/backend/notifications/api/views.py b/backend/notifications/api/views.py index a434b453..ab024c50 100644 --- a/backend/notifications/api/views.py +++ b/backend/notifications/api/views.py @@ -446,11 +446,18 @@ def channel_preferences(request): user=request.user ) + def _normalize_email_frequency(value): + if value == 'disabled': + return 'never' + return value + if request.method == 'GET': data = { 'web_enabled': prefs.web_enabled, 'email_enabled': prefs.email_enabled, - 'email_frequency': prefs.email_frequency, + 'email_frequency': _normalize_email_frequency( + prefs.email_frequency + ), 'push_enabled': prefs.push_enabled, 'dnd_enabled': prefs.dnd_enabled, 'dnd_start_time': _format_time_or_none(prefs.dnd_start_time), @@ -468,8 +475,10 @@ def channel_preferences(request): prefs.email_enabled = request.data.get('email_enabled') if 'email_frequency' in request.data: - frequency = request.data.get('email_frequency') - if frequency in ['instant', 'daily', 'weekly', 'disabled']: + frequency = _normalize_email_frequency( + request.data.get('email_frequency') + ) + if frequency in ['instant', 'daily', 'weekly', 'never']: prefs.email_frequency = frequency if 'push_enabled' in request.data: diff --git a/backend/tests/api/v1/notifications/test_notifications_api.py b/backend/tests/api/v1/notifications/test_notifications_api.py index 2da9bba0..0d0f4e59 100644 --- a/backend/tests/api/v1/notifications/test_notifications_api.py +++ b/backend/tests/api/v1/notifications/test_notifications_api.py @@ -3,6 +3,7 @@ from unittest.mock import patch import pytest from notifications.models import Notification +from notifications.models import UserChannelPreferences pytestmark = pytest.mark.django_db @@ -106,3 +107,54 @@ class TestNotificationRealtimeEvents: args, kwargs = send_event.call_args assert args == (user.id, [matching.id]) assert kwargs == {"category": "Заявки"} + + +class TestNotificationPreferencesApi: + def test_get_preferences_returns_never_frequency( + self, api_client, user_factory + ): + user = user_factory() + UserChannelPreferences.objects.create( + user=user, + email_enabled=True, + email_frequency="never", + ) + + api_client.force_authenticate(user=user) + response = api_client.get("/api/v1/notifications/preferences/") + + assert response.status_code == 200 + assert response.data["email_frequency"] == "never" + + def test_put_preferences_accepts_legacy_disabled_alias( + self, api_client, user_factory + ): + user = user_factory() + api_client.force_authenticate(user=user) + + response = api_client.put( + "/api/v1/notifications/preferences/", + {"email_enabled": True, "email_frequency": "disabled"}, + format="json", + ) + + assert response.status_code == 200 + prefs = UserChannelPreferences.objects.get(user=user) + assert prefs.email_enabled is True + assert prefs.email_frequency == "never" + + def test_put_preferences_accepts_never( + self, api_client, user_factory + ): + user = user_factory() + api_client.force_authenticate(user=user) + + response = api_client.put( + "/api/v1/notifications/preferences/", + {"email_frequency": "never"}, + format="json", + ) + + assert response.status_code == 200 + prefs = UserChannelPreferences.objects.get(user=user) + assert prefs.email_frequency == "never"