use uv & make lint happy
This commit is contained in:
191
app/utils.py
191
app/utils.py
@@ -1,48 +1,68 @@
|
||||
from typing import Dict, List, Optional
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from app.models import *
|
||||
from app.database import User as DBUser, LazerUserStatistics, LazerUserProfile, LazerUserCountry, LazerUserKudosu, LazerUserCounts, LazerUserAchievement
|
||||
|
||||
from app.database import User as DBUser
|
||||
from app.models import (
|
||||
Country,
|
||||
Cover,
|
||||
DailyChallengeStats,
|
||||
GameMode,
|
||||
GradeCounts,
|
||||
Kudosu,
|
||||
Level,
|
||||
Page,
|
||||
PlayStyle,
|
||||
RankHighest,
|
||||
RankHistory,
|
||||
Statistics,
|
||||
Team,
|
||||
User,
|
||||
UserAchievement,
|
||||
)
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
|
||||
def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_session: Session = None) -> User:
|
||||
def convert_db_user_to_api_user(
|
||||
db_user: DBUser, ruleset: str = "osu", db_session: Session | None = None
|
||||
) -> User:
|
||||
"""将数据库用户模型转换为API用户模型(使用 Lazer 表)"""
|
||||
|
||||
|
||||
# 从db_user获取基本字段值
|
||||
user_id = getattr(db_user, 'id')
|
||||
user_name = getattr(db_user, 'name')
|
||||
user_country = getattr(db_user, 'country')
|
||||
user_id = getattr(db_user, "id")
|
||||
user_name = getattr(db_user, "name")
|
||||
user_country = getattr(db_user, "country")
|
||||
user_country_code = user_country # 在User模型中,country字段就是country_code
|
||||
|
||||
|
||||
# 获取 Lazer 用户资料
|
||||
profile = db_user.lazer_profile
|
||||
if not profile:
|
||||
# 如果没有 lazer 资料,使用默认值
|
||||
profile = create_default_profile(db_user)
|
||||
|
||||
|
||||
# 获取指定模式的统计信息
|
||||
user_stats = None
|
||||
for stat in db_user.lazer_statistics:
|
||||
if stat.mode == ruleset:
|
||||
user_stats = stat
|
||||
break
|
||||
|
||||
|
||||
if not user_stats:
|
||||
# 如果没有找到指定模式的统计,创建默认统计
|
||||
user_stats = create_default_lazer_statistics(ruleset)
|
||||
|
||||
|
||||
# 获取国家信息
|
||||
country = Country(
|
||||
code=db_user.country_code,
|
||||
name=get_country_name(db_user.country_code)
|
||||
code=user_country_code, name=get_country_name(user_country_code)
|
||||
)
|
||||
|
||||
|
||||
# 获取 Kudosu 信息
|
||||
kudosu = Kudosu(available=0, total=0)
|
||||
|
||||
|
||||
# 获取计数信息
|
||||
counts = create_default_counts()
|
||||
|
||||
|
||||
# 转换统计信息
|
||||
statistics = Statistics(
|
||||
count_100=user_stats.count_100,
|
||||
@@ -50,8 +70,7 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
count_50=user_stats.count_50,
|
||||
count_miss=user_stats.count_miss,
|
||||
level=Level(
|
||||
current=user_stats.level_current,
|
||||
progress=user_stats.level_progress
|
||||
current=user_stats.level_current, progress=user_stats.level_progress
|
||||
),
|
||||
global_rank=user_stats.global_rank,
|
||||
global_rank_exp=user_stats.global_rank_exp,
|
||||
@@ -71,12 +90,12 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
ssh=user_stats.grade_ssh,
|
||||
s=user_stats.grade_s,
|
||||
sh=user_stats.grade_sh,
|
||||
a=user_stats.grade_a
|
||||
a=user_stats.grade_a,
|
||||
),
|
||||
country_rank=user_stats.country_rank,
|
||||
rank={"country": user_stats.country_rank} if user_stats.country_rank else None
|
||||
rank={"country": user_stats.country_rank} if user_stats.country_rank else None,
|
||||
)
|
||||
|
||||
|
||||
# 转换所有模式的统计信息
|
||||
statistics_rulesets = {}
|
||||
for stat in db_user.statistics:
|
||||
@@ -104,35 +123,36 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
ssh=stat.grade_ssh,
|
||||
s=stat.grade_s,
|
||||
sh=stat.grade_sh,
|
||||
a=stat.grade_a
|
||||
)
|
||||
a=stat.grade_a,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
# 转换国家信息
|
||||
country = Country(
|
||||
code=user_country_code,
|
||||
name=get_country_name(user_country_code)
|
||||
)
|
||||
|
||||
country = Country(code=user_country_code, name=get_country_name(user_country_code))
|
||||
|
||||
# 转换封面信息
|
||||
cover_url = profile.cover_url if profile and profile.cover_url else "https://assets.ppy.sh/user-profile-covers/default.jpeg"
|
||||
cover = Cover(
|
||||
custom_url=profile.cover_url if profile else None,
|
||||
url=str(cover_url),
|
||||
id=None
|
||||
cover_url = (
|
||||
profile.cover_url
|
||||
if profile and profile.cover_url
|
||||
else "https://assets.ppy.sh/user-profile-covers/default.jpeg"
|
||||
)
|
||||
|
||||
cover = Cover(
|
||||
custom_url=profile.cover_url if profile else None, url=str(cover_url), id=None
|
||||
)
|
||||
|
||||
# 转换 Kudosu 信息
|
||||
kudosu = Kudosu(available=0, total=0)
|
||||
|
||||
|
||||
# 转换成就信息
|
||||
user_achievements = []
|
||||
if db_user.lazer_achievements:
|
||||
for achievement in db_user.lazer_achievements:
|
||||
user_achievements.append(UserAchievement(
|
||||
achieved_at=achievement.achieved_at,
|
||||
achievement_id=achievement.achievement_id
|
||||
))
|
||||
user_achievements.append(
|
||||
UserAchievement(
|
||||
achieved_at=achievement.achieved_at,
|
||||
achievement_id=achievement.achievement_id,
|
||||
)
|
||||
)
|
||||
|
||||
# 转换排名历史
|
||||
rank_history = None
|
||||
@@ -141,10 +161,10 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
if rh.mode == ruleset:
|
||||
rank_history_data = rh.rank_data
|
||||
break
|
||||
|
||||
|
||||
if rank_history_data:
|
||||
rank_history = RankHistory(mode=ruleset, data=rank_history_data)
|
||||
|
||||
|
||||
# 转换每日挑战统计
|
||||
daily_challenge_stats = None
|
||||
if db_user.daily_challenge_stats:
|
||||
@@ -159,17 +179,17 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
top_50p_placements=dcs.top_50p_placements,
|
||||
user_id=dcs.user_id,
|
||||
weekly_streak_best=dcs.weekly_streak_best,
|
||||
weekly_streak_current=dcs.weekly_streak_current
|
||||
weekly_streak_current=dcs.weekly_streak_current,
|
||||
)
|
||||
|
||||
|
||||
# 转换最高排名
|
||||
rank_highest = None
|
||||
if user_stats.rank_highest:
|
||||
rank_highest = RankHighest(
|
||||
rank=user_stats.rank_highest,
|
||||
updated_at=user_stats.rank_highest_updated_at or datetime.utcnow()
|
||||
updated_at=user_stats.rank_highest_updated_at or datetime.utcnow(),
|
||||
)
|
||||
|
||||
|
||||
# 转换团队信息
|
||||
team = None
|
||||
if db_user.team_membership:
|
||||
@@ -178,39 +198,43 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
flag_url=team_member.team.flag_url or "",
|
||||
id=team_member.team.id,
|
||||
name=team_member.team.name,
|
||||
short_name=team_member.team.short_name
|
||||
short_name=team_member.team.short_name,
|
||||
)
|
||||
|
||||
|
||||
# 创建用户对象
|
||||
# 从db_user获取基本字段值
|
||||
user_id = getattr(db_user, 'id')
|
||||
user_name = getattr(db_user, 'name')
|
||||
user_country = getattr(db_user, 'country')
|
||||
|
||||
user_id = getattr(db_user, "id")
|
||||
user_name = getattr(db_user, "name")
|
||||
user_country = getattr(db_user, "country")
|
||||
|
||||
# 获取用户头像URL
|
||||
avatar_url = None
|
||||
|
||||
# 首先检查 profile 中的 avatar_url
|
||||
if profile and hasattr(profile, 'avatar_url') and profile.avatar_url:
|
||||
if profile and hasattr(profile, "avatar_url") and profile.avatar_url:
|
||||
avatar_url = str(profile.avatar_url)
|
||||
|
||||
|
||||
# 然后检查是否有关联的头像记录
|
||||
if avatar_url is None and hasattr(db_user, 'avatar') and db_user.avatar is not None:
|
||||
if avatar_url is None and hasattr(db_user, "avatar") and db_user.avatar is not None:
|
||||
if db_user.avatar.r2_game_url:
|
||||
# 优先使用游戏用的头像URL
|
||||
avatar_url = str(db_user.avatar.r2_game_url)
|
||||
elif db_user.avatar.r2_original_url:
|
||||
# 其次使用原始头像URL
|
||||
avatar_url = str(db_user.avatar.r2_original_url)
|
||||
|
||||
|
||||
# 如果还是没有找到,通过查询获取
|
||||
if db_session and avatar_url is None:
|
||||
try:
|
||||
# 导入UserAvatar模型
|
||||
from app.database import UserAvatar
|
||||
|
||||
|
||||
# 尝试查找用户的头像记录
|
||||
avatar_record = db_session.query(UserAvatar).filter_by(user_id=user_id, is_active=True).first()
|
||||
avatar_record = (
|
||||
db_session.query(UserAvatar)
|
||||
.filter_by(user_id=user_id, is_active=True)
|
||||
.first()
|
||||
)
|
||||
if avatar_record is not None:
|
||||
if avatar_record.r2_game_url is not None:
|
||||
# 优先使用游戏用的头像URL
|
||||
@@ -223,7 +247,7 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
print(f"最终头像URL: {avatar_url}")
|
||||
# 如果仍然没有找到头像URL,则使用默认URL
|
||||
if avatar_url is None:
|
||||
avatar_url = f"https://a.gu-osu.gmoe.cc/api/users/avatar/1"
|
||||
avatar_url = "https://a.gu-osu.gmoe.cc/api/users/avatar/1"
|
||||
|
||||
user = User(
|
||||
id=user_id,
|
||||
@@ -248,21 +272,25 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
location=profile.location if profile else None,
|
||||
max_blocks=profile.max_blocks if profile else 100,
|
||||
max_friends=profile.max_friends if profile else 500,
|
||||
|
||||
occupation=None, # 职业字段,默认为 None #待修改
|
||||
|
||||
#playmode=GameMode(db_user.playmode),
|
||||
playmode=GameMode("osu"), #待修改
|
||||
|
||||
playstyle=[PlayStyle.MOUSE, PlayStyle.KEYBOARD, PlayStyle.TABLET], #待修改
|
||||
|
||||
# playmode=GameMode(db_user.playmode),
|
||||
playmode=GameMode("osu"), # 待修改
|
||||
playstyle=[PlayStyle.MOUSE, PlayStyle.KEYBOARD, PlayStyle.TABLET], # 待修改
|
||||
post_count=0,
|
||||
profile_hue=None,
|
||||
profile_order= ['me', 'recent_activity', 'top_ranks', 'medals', 'historical', 'beatmaps', 'kudosu'],
|
||||
profile_order=[
|
||||
"me",
|
||||
"recent_activity",
|
||||
"top_ranks",
|
||||
"medals",
|
||||
"historical",
|
||||
"beatmaps",
|
||||
"kudosu",
|
||||
],
|
||||
title=None,
|
||||
title_url=None,
|
||||
twitter=None,
|
||||
website='https://gmoe.cc',
|
||||
website="https://gmoe.cc",
|
||||
session_verified=True,
|
||||
support_level=0,
|
||||
country=country,
|
||||
@@ -295,7 +323,7 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
daily_challenge_user_stats=None,
|
||||
groups=[],
|
||||
monthly_playcounts=[],
|
||||
#page=Page(html=db_user.page_html, raw=db_user.page_raw),
|
||||
# page=Page(html=db_user.page_html, raw=db_user.page_raw),
|
||||
page=Page(), # Provide a default Page object
|
||||
previous_usernames=[],
|
||||
rank_highest=rank_highest,
|
||||
@@ -303,9 +331,9 @@ def convert_db_user_to_api_user(db_user: DBUser, ruleset: str = "osu", db_sessio
|
||||
rankHistory=rank_history, # 兼容性别名
|
||||
replays_watched_counts=[],
|
||||
team=team,
|
||||
user_achievements=user_achievements
|
||||
user_achievements=user_achievements,
|
||||
)
|
||||
|
||||
|
||||
return user
|
||||
|
||||
|
||||
@@ -329,6 +357,7 @@ def get_country_name(country_code: str) -> str:
|
||||
|
||||
def create_default_profile(db_user: DBUser):
|
||||
"""创建默认的用户资料"""
|
||||
|
||||
class MockProfile:
|
||||
def __init__(self):
|
||||
self.is_active = True
|
||||
@@ -340,7 +369,7 @@ def create_default_profile(db_user: DBUser):
|
||||
self.session_verified = False
|
||||
self.has_supported = False
|
||||
self.pm_friends_only = False
|
||||
self.default_group = 'default'
|
||||
self.default_group = "default"
|
||||
self.last_visit = None
|
||||
self.join_date = db_user.join_date
|
||||
self.profile_colour = None
|
||||
@@ -355,19 +384,20 @@ def create_default_profile(db_user: DBUser):
|
||||
self.interests = None
|
||||
self.location = None
|
||||
self.occupation = None
|
||||
self.playmode = 'osu'
|
||||
self.playmode = "osu"
|
||||
self.support_level = 0
|
||||
self.max_blocks = 100
|
||||
self.max_friends = 500
|
||||
self.post_count = 0
|
||||
self.page_html = None
|
||||
self.page_raw = None
|
||||
|
||||
|
||||
return MockProfile()
|
||||
|
||||
|
||||
def create_default_lazer_statistics(mode: str):
|
||||
"""创建默认的 Lazer 统计信息"""
|
||||
|
||||
class MockLazerStatistics:
|
||||
def __init__(self, mode: str):
|
||||
self.mode = mode
|
||||
@@ -398,32 +428,35 @@ def create_default_lazer_statistics(mode: str):
|
||||
self.country_rank = None
|
||||
self.rank_highest = None
|
||||
self.rank_highest_updated_at = None
|
||||
|
||||
|
||||
return MockLazerStatistics(mode)
|
||||
|
||||
|
||||
def create_default_country(country_code: str):
|
||||
"""创建默认的国家信息"""
|
||||
|
||||
class MockCountry:
|
||||
def __init__(self, code: str):
|
||||
self.code = code
|
||||
self.name = get_country_name(code)
|
||||
|
||||
|
||||
return MockCountry(country_code)
|
||||
|
||||
|
||||
def create_default_kudosu():
|
||||
"""创建默认的 Kudosu 信息"""
|
||||
|
||||
class MockKudosu:
|
||||
def __init__(self):
|
||||
self.available = 0
|
||||
self.total = 0
|
||||
|
||||
|
||||
return MockKudosu()
|
||||
|
||||
|
||||
def create_default_counts():
|
||||
"""创建默认的计数信息"""
|
||||
|
||||
class MockCounts:
|
||||
def __init__(self):
|
||||
self.beatmap_playcounts_count = 0
|
||||
@@ -443,5 +476,5 @@ def create_default_counts():
|
||||
self.scores_first_count = 0
|
||||
self.scores_pinned_count = 0
|
||||
self.scores_recent_count = 0
|
||||
|
||||
|
||||
return MockCounts()
|
||||
|
||||
Reference in New Issue
Block a user