Properly cache User.place and User.score constants (#1525)

* Cache accesses of `User.place` and `User.score` in the user attrs wrapper via Jinja
This commit is contained in:
Kevin Chung
2020-06-30 18:36:56 -04:00
committed by GitHub
parent f65766c5ff
commit d22f1a1705
4 changed files with 57 additions and 20 deletions

View File

@@ -30,14 +30,31 @@ def clear_standings():
from CTFd.utils.scores import get_standings, get_team_standings, get_user_standings
from CTFd.api.v1.scoreboard import ScoreboardDetail, ScoreboardList
from CTFd.api import api
from CTFd.utils.user import (
get_user_score,
get_user_place,
get_team_score,
get_team_place,
)
# Clear out the bulk standings functions
cache.delete_memoized(get_standings)
cache.delete_memoized(get_team_standings)
cache.delete_memoized(get_user_standings)
# Clear out the individual helpers for accessing score via the model
cache.delete_memoized(Users.get_score)
cache.delete_memoized(Users.get_place)
cache.delete_memoized(Teams.get_score)
cache.delete_memoized(Teams.get_place)
# Clear the Jinja Attrs constants
cache.delete_memoized(get_user_score)
cache.delete_memoized(get_user_place)
cache.delete_memoized(get_team_score)
cache.delete_memoized(get_team_place)
# Clear out HTTP request responses
cache.delete(make_cache_key(path="scoreboard.listing"))
cache.delete(make_cache_key(path=api.name + "." + ScoreboardList.endpoint))
cache.delete(make_cache_key(path=api.name + "." + ScoreboardDetail.endpoint))

View File

@@ -29,21 +29,15 @@ class _TeamAttrsWrapper:
@property
def place(self):
from CTFd.utils.user import get_current_team
from CTFd.utils.user import get_team_place
team = get_current_team()
if team:
return team.place
return None
return get_team_place(team_id=self.id)
@property
def score(self):
from CTFd.utils.user import get_current_team
from CTFd.utils.user import get_team_score
team = get_current_team()
if team:
return team.score
return None
return get_team_score(team_id=self.id)
Team = _TeamAttrsWrapper()

View File

@@ -31,21 +31,15 @@ class _UserAttrsWrapper:
@property
def place(self):
from CTFd.utils.user import get_current_user
from CTFd.utils.user import get_user_place
user = get_current_user()
if user:
return user.place
return None
return get_user_place(user_id=self.id)
@property
def score(self):
from CTFd.utils.user import get_current_user
from CTFd.utils.user import get_user_score
user = get_current_user()
if user:
return user.score
return None
return get_user_score(user_id=self.id)
User = _UserAttrsWrapper()

View File

@@ -52,6 +52,38 @@ def get_user_attrs(user_id):
return None
@cache.memoize(timeout=300)
def get_user_place(user_id):
user = Users.query.filter_by(id=user_id).first()
if user:
return user.account.place
return None
@cache.memoize(timeout=300)
def get_user_score(user_id):
user = Users.query.filter_by(id=user_id).first()
if user:
return user.account.score
return None
@cache.memoize(timeout=300)
def get_team_place(team_id):
team = Teams.query.filter_by(id=team_id).first()
if team:
return team.place
return None
@cache.memoize(timeout=300)
def get_team_score(team_id):
team = Teams.query.filter_by(id=team_id).first()
if team:
return team.score
return None
def get_current_team():
if authed():
user = get_current_user()