Skip to content

Commit ee109ec

Browse files
committed
feature: Use @ttl_cache for ratings
1 parent 69779ab commit ee109ec

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

webapp/managers.py

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
TaskStatusRepository,
3232
VariantRepository
3333
)
34+
from webapp.utils import ttl_cache
3435

3536

3637
class AppConfigManager:
@@ -138,6 +139,7 @@ def get_group_statuses(self, group_id: int, hide_pending: bool) -> GroupDto:
138139
dtos.append(dto)
139140
return GroupDto(group, tasks, dtos)
140141

142+
@ttl_cache(duration=15, maxsize=1)
141143
def get_group_rating(self) -> dict[int, list[GroupInRatingDto]]:
142144
def key(info: tuple[Group, int]):
143145
group, _ = info
@@ -154,6 +156,7 @@ def key(info: tuple[Group, int]):
154156
places[earned].append(GroupInRatingDto(group, earned))
155157
return dict(sorted(places.items(), reverse=True))
156158

159+
@ttl_cache(duration=15, maxsize=1)
157160
def get_rating(self) -> dict[int, list[StudentInRatingDto]]:
158161
def key(info: tuple[Group, TaskStatus]):
159162
_, status = info

webapp/utils.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import functools
12
import json
23
import os
34
import sys
5+
import time
46
import traceback
57
from datetime import datetime
68
from functools import wraps
@@ -11,12 +13,23 @@
1113

1214
from flask import Request, redirect
1315

14-
from webapp.managers import AppConfigManager
1516
from webapp.models import Student
1617
from webapp.repositories import StudentRepository
1718

1819

19-
def logout(config: AppConfigManager, path: str, auth_redirect=True):
20+
def ttl_cache(duration: int, maxsize=128, typed=False):
21+
def decorator(func):
22+
@functools.lru_cache(maxsize=maxsize, typed=typed)
23+
def cached(*args, __time, **kwargs):
24+
return func(*args, **kwargs)
25+
@functools.wraps(func)
26+
def wrapper(*args, **kwargs):
27+
return cached(*args, **kwargs, __time=int(time.time() / duration))
28+
return wrapper
29+
return decorator
30+
31+
32+
def logout(config, path, auth_redirect=True):
2033
def wrapper(function):
2134
@wraps(function)
2235
def decorator(*args, **kwargs):

0 commit comments

Comments
 (0)