Normalize notification email frequency preferences

This commit is contained in:
lizerk 2026-04-11 00:06:14 +03:00
parent 3ddcabbbbc
commit 6132261d69
2 changed files with 64 additions and 3 deletions

View File

@ -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:

View File

@ -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"