Compare commits
1 Commits
758ef73ae8
...
b918664701
Author | SHA1 | Date |
---|---|---|
Yann Weber | b918664701 |
|
@ -156,5 +156,5 @@ urlpatterns = [
|
|||
path('statistics/', views.statistics_list, name='api-statistics-list'),
|
||||
path('statistics/bookings/', views.bookings_statistics, name='api-statistics-bookings'),
|
||||
path('ants/', include('chrono.apps.ants_hub.api_urls')),
|
||||
path('user_preferences/', include('chrono.apps.user_preferences.api_urls')),
|
||||
path('user-preferences/', include('chrono.apps.user_preferences.api_urls')),
|
||||
]
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
import json
|
||||
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.http import HttpResponse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
@ -25,28 +26,24 @@ from . import models
|
|||
|
||||
|
||||
@csrf_exempt
|
||||
@login_required
|
||||
def save_preference(request):
|
||||
'''Save a user preference
|
||||
|
||||
Given a JSON with a single boolean value identified by a str, save the
|
||||
key <-> value association in UserPreference
|
||||
'''
|
||||
if not request.user or not request.user.is_authenticated:
|
||||
raise PermissionDenied()
|
||||
user_pref = models.UserPreferences.objects.get_or_create(user=request.user)[0]
|
||||
# Expect a request with a json dict of len 1 as body { str: bool }
|
||||
user_pref, dummy = models.UserPreferences.objects.get_or_create(user=request.user)
|
||||
|
||||
if len(request.body) > 1000:
|
||||
return HttpResponse(_('Payload is too large').encode(), status=400)
|
||||
bad_fmt_response = HttpResponse(_('Bad format').encode(), status=400)
|
||||
return HttpResponse(_('Payload is too large'), status=400)
|
||||
bad_fmt_response = HttpResponse(_('Bad format'), status=400)
|
||||
try:
|
||||
prefs = json.loads(request.body)
|
||||
except json.JSONDecodeError:
|
||||
return bad_fmt_response
|
||||
if not isinstance(prefs, dict) or len(prefs) != 1:
|
||||
return bad_fmt_response
|
||||
name, value = list(prefs.items())[0]
|
||||
if not isinstance(name, str) or not isinstance(value, bool):
|
||||
value = list(prefs.values())[0]
|
||||
if not isinstance(value, bool):
|
||||
return bad_fmt_response
|
||||
|
||||
user_pref.update_preference(name, value)
|
||||
return HttpResponse(b'', status=204)
|
||||
user_pref.preferences.update(prefs)
|
||||
user_pref.save()
|
||||
return HttpResponse('', status=204)
|
||||
|
|
|
@ -39,5 +39,7 @@ def human_date_range(date_start, date_end):
|
|||
def get_preference(user, pref_name):
|
||||
if not user:
|
||||
return None
|
||||
user_preferences, _ = UserPreferences.objects.get_or_create(user=user)
|
||||
return user_preferences.get_preference(pref_name) if user_preferences else None
|
||||
user_preferences, dummy = UserPreferences.objects.get_or_create(user=user)
|
||||
if not user_preferences:
|
||||
return None
|
||||
return user_preferences.preferences.get(pref_name) or False
|
||||
|
|
|
@ -10,7 +10,6 @@ pytestmark = pytest.mark.django_db
|
|||
|
||||
|
||||
def test_user_preferences_api_ok(app, admin_user):
|
||||
UserPreferences.objects.all().delete()
|
||||
login(app)
|
||||
|
||||
fake_id = 'fake-id-1'
|
||||
|
@ -18,42 +17,29 @@ def test_user_preferences_api_ok(app, admin_user):
|
|||
app.post_json(url, params={fake_id: True}, status=204)
|
||||
|
||||
user_pref = UserPreferences.objects.get(user=admin_user)
|
||||
assert user_pref
|
||||
assert fake_id in user_pref.preferences
|
||||
assert user_pref.preferences[fake_id] is True
|
||||
|
||||
app.post_json(url, params={fake_id: False}, status=204)
|
||||
|
||||
user_pref = UserPreferences.objects.get(user=admin_user)
|
||||
assert user_pref
|
||||
assert fake_id in user_pref.preferences
|
||||
assert user_pref.preferences[fake_id] is False
|
||||
|
||||
fake_id2 = 'fake-id-2'
|
||||
app.post_json(url, params={fake_id2: False}, status=204)
|
||||
|
||||
user_pref = UserPreferences.objects.get(user=admin_user)
|
||||
assert user_pref
|
||||
assert fake_id in user_pref.preferences
|
||||
assert fake_id2 in user_pref.preferences
|
||||
assert user_pref.preferences[fake_id] is False
|
||||
assert user_pref.preferences[fake_id2] is False
|
||||
|
||||
app.post_json(url, params={fake_id2: False}, status=204)
|
||||
|
||||
user_pref = UserPreferences.objects.get(user=admin_user)
|
||||
assert user_pref
|
||||
assert fake_id in user_pref.preferences
|
||||
assert fake_id2 in user_pref.preferences
|
||||
assert user_pref.preferences[fake_id] is False
|
||||
assert user_pref.preferences[fake_id2] is False
|
||||
|
||||
app.post_json(url, params={fake_id2: True}, status=204)
|
||||
|
||||
user_pref = UserPreferences.objects.get(user=admin_user)
|
||||
assert user_pref
|
||||
assert fake_id in user_pref.preferences
|
||||
assert fake_id2 in user_pref.preferences
|
||||
assert user_pref.preferences[fake_id] is False
|
||||
assert user_pref.preferences[fake_id2] is True
|
||||
|
||||
|
@ -82,4 +68,4 @@ def test_user_preferences_api_large_payload(app, admin_user):
|
|||
|
||||
def test_user_preferences_api_unauthorized(app):
|
||||
url = reverse('api-user-preferences')
|
||||
app.post(url, params={'toto': True}, status=403)
|
||||
app.post(url, params={'toto': True}, status=302)
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
import pytest
|
||||
from django.template import Context, Template
|
||||
|
||||
from chrono.apps.user_preferences.models import UserPreferences
|
||||
from tests.utils import login
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
||||
def context(user):
|
||||
return Context({'user': user})
|
||||
|
||||
|
||||
def test_manager_templatetags_get_preference(app, simple_user):
|
||||
t = Template('{% load chrono %}{% if user|get_preference:\'fake-id-1\' %}OK{% else %}KO{% endif %}')
|
||||
|
||||
res = t.render(Context())
|
||||
assert res == 'KO'
|
||||
|
||||
login(app, 'user', 'user')
|
||||
|
||||
res = t.render(context(simple_user))
|
||||
assert res == 'KO'
|
||||
|
||||
user_prefs = UserPreferences.objects.get_or_create(user=simple_user)[0]
|
||||
user_prefs.update_preference('fake-id-1', False)
|
||||
|
||||
res = t.render(context(simple_user))
|
||||
assert res == 'KO'
|
||||
|
||||
user_prefs.update_preference('fake-id-1', True)
|
||||
res = t.render(context(simple_user))
|
||||
assert res == 'OK'
|
Loading…
Reference in New Issue