make request.user_data only evaluate once
This commit is contained in:
parent
8fc88168d5
commit
79fb026363
4 changed files with 19 additions and 9 deletions
|
@ -130,9 +130,6 @@ class UserPermissions(models.Model):
|
||||||
return settings.ENABLE_MESH and self.mesh_control
|
return settings.ENABLE_MESH and self.mesh_control
|
||||||
|
|
||||||
|
|
||||||
get_permissions_for_user_lazy = lazy(UserPermissions.get_for_user, UserPermissions)
|
|
||||||
|
|
||||||
|
|
||||||
class UserSpaceAccess(models.Model):
|
class UserSpaceAccess(models.Model):
|
||||||
"""
|
"""
|
||||||
User Authorities
|
User Authorities
|
||||||
|
|
|
@ -125,7 +125,7 @@ def fetch_updates(request, response: HttpResponse):
|
||||||
}
|
}
|
||||||
if cross_origin is None:
|
if cross_origin is None:
|
||||||
result.update({
|
result.update({
|
||||||
'user_data': get_user_data(request),
|
'user_data': request.user_data,
|
||||||
})
|
})
|
||||||
|
|
||||||
if cross_origin is not None:
|
if cross_origin is not None:
|
||||||
|
|
|
@ -10,6 +10,9 @@ from c3nav.mapdata.schemas.models import DataOverlaySchema
|
||||||
|
|
||||||
|
|
||||||
def get_user_data(request):
|
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()
|
permissions = AccessPermission.get_for_request(request) - AccessRestriction.get_all_public()
|
||||||
result = {
|
result = {
|
||||||
'logged_in': bool(request.user.is_authenticated),
|
'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}
|
if request.user.is_superuser or key in request.user_permissions.quests}
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
request.user_data = result
|
||||||
return 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):
|
def can_access_editor(request):
|
||||||
|
|
|
@ -276,7 +276,7 @@ def close_response(request):
|
||||||
# todo: use a better way to recognize this
|
# todo: use a better way to recognize this
|
||||||
ajax = request.headers.get('x-requested-with') == 'XMLHttpRequest' or 'ajax' in request.GET
|
ajax = request.headers.get('x-requested-with') == 'XMLHttpRequest' or 'ajax' in request.GET
|
||||||
if ajax:
|
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')
|
content_type='text/plain')
|
||||||
redirect_path = request.GET['next'] if request.GET.get('next', '').startswith('/') else reverse('site.index')
|
redirect_path = request.GET['next'] if request.GET.get('next', '').startswith('/') else reverse('site.index')
|
||||||
return redirect(redirect_path)
|
return redirect(redirect_path)
|
||||||
|
@ -774,7 +774,6 @@ def report_detail(request, pk, secret=None):
|
||||||
def position_list(request):
|
def position_list(request):
|
||||||
return render(request, 'site/position_list.html', {
|
return render(request, 'site/position_list.html', {
|
||||||
'positions': Position.objects.filter(owner=request.user),
|
'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 redirect(reverse('site.api_secret_list'))
|
||||||
return render(request, 'site/api_secret_list.html', {
|
return render(request, 'site/api_secret_list.html', {
|
||||||
'api_secrets': Secret.objects.filter(user=request.user).order_by('-created'),
|
'api_secrets': Secret.objects.filter(user=request.user).order_by('-created'),
|
||||||
'user_data_json': json.dumps(get_user_data(request), cls=DjangoJSONEncoder),
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue