make request.user_data only evaluate once

This commit is contained in:
Laura Klünder 2025-03-07 21:06:32 +01:00
parent 8fc88168d5
commit 79fb026363
4 changed files with 19 additions and 9 deletions

View file

@ -130,9 +130,6 @@ class UserPermissions(models.Model):
return settings.ENABLE_MESH and self.mesh_control
get_permissions_for_user_lazy = lazy(UserPermissions.get_for_user, UserPermissions)
class UserSpaceAccess(models.Model):
"""
User Authorities

View file

@ -125,7 +125,7 @@ def fetch_updates(request, response: HttpResponse):
}
if cross_origin is None:
result.update({
'user_data': get_user_data(request),
'user_data': request.user_data,
})
if cross_origin is not None:

View file

@ -10,6 +10,9 @@ from c3nav.mapdata.schemas.models import DataOverlaySchema
def get_user_data(request):
"""
Don't use this unless needed. Use request.user_data to get this cached.
"""
permissions = AccessPermission.get_for_request(request) - AccessRestriction.get_all_public()
result = {
'logged_in': bool(request.user.is_authenticated),
@ -46,11 +49,23 @@ def get_user_data(request):
if request.user.is_superuser or key in request.user_permissions.quests}
),
})
request.user_data = result
return result
get_user_data_lazy = lazy(get_user_data, dict)
class CachedGetUserData:
def __init__(self, request):
self.request = request
self.cached = None
def __call__(self) -> dict:
if self.cached is None:
self.cached = get_user_data(self.request)
return self.cached
def get_user_data_lazy(request):
return lazy(CachedGetUserData(request), dict)()
def can_access_editor(request):

View file

@ -276,7 +276,7 @@ def close_response(request):
# todo: use a better way to recognize this
ajax = request.headers.get('x-requested-with') == 'XMLHttpRequest' or 'ajax' in request.GET
if ajax:
return HttpResponse(json.dumps(get_user_data(request), cls=DjangoJSONEncoder).encode(),
return HttpResponse(json.dumps(request.user_data, cls=DjangoJSONEncoder).encode(),
content_type='text/plain')
redirect_path = request.GET['next'] if request.GET.get('next', '').startswith('/') else reverse('site.index')
return redirect(redirect_path)
@ -774,7 +774,6 @@ def report_detail(request, pk, secret=None):
def position_list(request):
return render(request, 'site/position_list.html', {
'positions': Position.objects.filter(owner=request.user),
'user_data_json': json.dumps(get_user_data(request), cls=DjangoJSONEncoder),
})
@ -866,7 +865,6 @@ def api_secret_list(request):
return redirect(reverse('site.api_secret_list'))
return render(request, 'site/api_secret_list.html', {
'api_secrets': Secret.objects.filter(user=request.user).order_by('-created'),
'user_data_json': json.dumps(get_user_data(request), cls=DjangoJSONEncoder),
})