idac: added "simple" ranking to frontend

This commit is contained in:
Dniel97
2023-11-21 22:51:10 +01:00
parent d1a7b898a7
commit 6ea8cca1a2
10 changed files with 641 additions and 160 deletions

View File

@@ -499,23 +499,20 @@ class IDACItemData(BaseData):
def get_time_trial_best_cars_by_course(
self, version: int, course_id: int, aime_id: Optional[int] = None
) -> Optional[List[Row]]:
subquery = (
select(
trial.c.version,
func.min(trial.c.goal_time).label("min_goal_time"),
trial.c.style_car_id,
)
.where(
and_(
trial.c.version == version,
trial.c.course_id == course_id,
)
subquery = select(
trial.c.version,
func.min(trial.c.goal_time).label("min_goal_time"),
trial.c.style_car_id,
).where(
and_(
trial.c.version == version,
trial.c.course_id == course_id,
)
)
if aime_id is not None:
subquery = subquery.where(trial.c.user == aime_id)
subquery = subquery.group_by(trial.c.style_car_id).subquery()
sql = select(trial).where(
@@ -532,12 +529,45 @@ class IDACItemData(BaseData):
return None
return result.fetchall()
def get_time_trial_ranking_by_course_total(
self,
version: int,
course_id: int,
) -> Optional[List[Row]]:
# count the number of rows returned by the query
subquery = (
select(
trial.c.version,
trial.c.user,
func.min(trial.c.goal_time).label("min_goal_time"),
)
.where(and_(trial.c.version == version, trial.c.course_id == course_id))
.group_by(trial.c.user)
).subquery()
sql = (
select(func.count().label("count"))
.where(
and_(
trial.c.version == subquery.c.version,
trial.c.user == subquery.c.user,
trial.c.goal_time == subquery.c.min_goal_time,
),
)
)
result = self.execute(sql)
if result is None:
return None
return result.fetchone()
def get_time_trial_ranking_by_course(
self,
version: int,
course_id: int,
style_car_id: Optional[int] = None,
limit: Optional[int] = 10,
offset: Optional[int] = 0,
) -> Optional[List[Row]]:
# get the top 10 ranking by goal_time for a given course which is grouped by user
subquery = select(
@@ -546,7 +576,7 @@ class IDACItemData(BaseData):
func.min(trial.c.goal_time).label("min_goal_time"),
).where(and_(trial.c.version == version, trial.c.course_id == course_id))
# if wantd filter only by style_car_id
# if wanted filter only by style_car_id
if style_car_id is not None:
subquery = subquery.where(trial.c.style_car_id == style_car_id)
@@ -568,6 +598,10 @@ class IDACItemData(BaseData):
if limit is not None:
sql = sql.limit(limit)
# offset the result if needed
if offset is not None:
sql = sql.offset(offset)
result = self.execute(sql)
if result is None:
return None
@@ -750,7 +784,9 @@ class IDACItemData(BaseData):
return None
return result.fetchall()
def get_timetrial_event(self, aime_id: int, timetrial_event_id: int) -> Optional[Row]:
def get_timetrial_event(
self, aime_id: int, timetrial_event_id: int
) -> Optional[Row]:
sql = select(timetrial_event).where(
and_(
timetrial_event.c.user == aime_id,
@@ -946,9 +982,7 @@ class IDACItemData(BaseData):
return None
return result.lastrowid
def put_stamp(
self, aime_id: int, stamp_data: Dict
) -> Optional[int]:
def put_stamp(self, aime_id: int, stamp_data: Dict) -> Optional[int]:
stamp_data["user"] = aime_id
sql = insert(stamp).values(**stamp_data)
@@ -956,9 +990,7 @@ class IDACItemData(BaseData):
result = self.execute(conflict)
if result is None:
self.logger.warn(
f"putstamp: Failed to update! aime_id: {aime_id}"
)
self.logger.warn(f"putstamp: Failed to update! aime_id: {aime_id}")
return None
return result.lastrowid