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
|
||||
|
||||
|
||||
get_permissions_for_user_lazy = lazy(UserPermissions.get_for_user, UserPermissions)
|
||||
|
||||
|
||||
class UserSpaceAccess(models.Model):
|
||||
"""
|
||||
User Authorities
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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),
|
||||
})
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue