Compare commits

..

1 Commits

Author SHA1 Message Date
Yann Weber b918664701 manager: make agenda's groups foldable (#85616)
gitea/chrono/pipeline/head Something is wrong with the build of this commit Details
2024-04-10 17:42:33 +02:00
5 changed files with 17 additions and 65 deletions

View File

@ -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')),
]

View File

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

View File

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

View File

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

View File

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