fix(database): fix pydantic warnings

This commit is contained in:
MingxuanGame
2025-08-10 04:30:06 +00:00
parent bee0befc26
commit 36b59ac853
4 changed files with 33 additions and 64 deletions

View File

@@ -7,7 +7,7 @@ from app.models.score import MODE_TO_INT, GameMode
from .beatmap_playcounts import BeatmapPlaycounts from .beatmap_playcounts import BeatmapPlaycounts
from .beatmapset import Beatmapset, BeatmapsetResp from .beatmapset import Beatmapset, BeatmapsetResp
from sqlalchemy import DECIMAL, Column, DateTime from sqlalchemy import Column, DateTime
from sqlmodel import VARCHAR, Field, Relationship, SQLModel, col, func, select from sqlmodel import VARCHAR, Field, Relationship, SQLModel, col, func, select
from sqlmodel.ext.asyncio.session import AsyncSession from sqlmodel.ext.asyncio.session import AsyncSession
@@ -27,9 +27,7 @@ class BeatmapBase(SQLModel):
url: str url: str
mode: GameMode mode: GameMode
beatmapset_id: int = Field(foreign_key="beatmapsets.id", index=True) beatmapset_id: int = Field(foreign_key="beatmapsets.id", index=True)
difficulty_rating: float = Field( difficulty_rating: float = Field(default=0.0)
default=0.0, sa_column=Column(DECIMAL(precision=10, scale=6))
)
total_length: int total_length: int
user_id: int user_id: int
version: str version: str
@@ -41,17 +39,11 @@ class BeatmapBase(SQLModel):
# TODO: failtimes, owners # TODO: failtimes, owners
# BeatmapExtended # BeatmapExtended
ar: float = Field(default=0.0, sa_column=Column(DECIMAL(precision=10, scale=2))) ar: float = Field(default=0.0)
cs: float = Field(default=0.0, sa_column=Column(DECIMAL(precision=10, scale=2))) cs: float = Field(default=0.0)
drain: float = Field( drain: float = Field(default=0.0) # hp
default=0.0, accuracy: float = Field(default=0.0) # od
sa_column=Column(DECIMAL(precision=10, scale=2)), bpm: float = Field(default=0.0)
) # hp
accuracy: float = Field(
default=0.0,
sa_column=Column(DECIMAL(precision=10, scale=2)),
) # od
bpm: float = Field(default=0.0, sa_column=Column(DECIMAL(precision=10, scale=2)))
count_circles: int = Field(default=0) count_circles: int = Field(default=0)
count_sliders: int = Field(default=0) count_sliders: int = Field(default=0)
count_spinners: int = Field(default=0) count_spinners: int = Field(default=0)

View File

@@ -1,13 +1,13 @@
from datetime import datetime from datetime import datetime
from typing import TYPE_CHECKING, TypedDict, cast from typing import TYPE_CHECKING, NotRequired, TypedDict
from app.models.beatmap import BeatmapRankStatus, Genre, Language from app.models.beatmap import BeatmapRankStatus, Genre, Language
from app.models.score import GameMode from app.models.score import GameMode
from .lazer_user import BASE_INCLUDES, User, UserResp from .lazer_user import BASE_INCLUDES, User, UserResp
from pydantic import BaseModel, model_serializer from pydantic import BaseModel
from sqlalchemy import DECIMAL, JSON, Column, DateTime, Text from sqlalchemy import JSON, Column, DateTime, Text
from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy.ext.asyncio import AsyncAttrs
from sqlmodel import Field, Relationship, SQLModel, col, func, select from sqlmodel import Field, Relationship, SQLModel, col, func, select
from sqlmodel.ext.asyncio.session import AsyncSession from sqlmodel.ext.asyncio.session import AsyncSession
@@ -19,41 +19,19 @@ if TYPE_CHECKING:
from .favourite_beatmapset import FavouriteBeatmapset from .favourite_beatmapset import FavouriteBeatmapset
class BeatmapCovers(SQLModel): BeatmapCovers = TypedDict(
cover: str "BeatmapCovers",
card: str {
list: str "cover": str,
slimcover: str "card": str,
cover_2_x: str | None = Field(default=None, alias="cover@2x") "list": str,
card_2_x: str | None = Field(default=None, alias="card@2x") "slimcover": str,
list_2_x: str | None = Field(default=None, alias="list@2x") "cover@2x": NotRequired[str | None],
slimcover_2_x: str | None = Field(default=None, alias="slimcover@2x") "card@2x": NotRequired[str | None],
"list@2x": NotRequired[str | None],
@model_serializer "slimcover@2x": NotRequired[str | None],
def _(self) -> dict[str, str | None]: },
self = cast(dict[str, str | None] | BeatmapCovers, self) )
if isinstance(self, dict):
return {
"cover": self["cover"],
"card": self["card"],
"list": self["list"],
"slimcover": self["slimcover"],
"cover@2x": self.get("cover@2x"),
"card@2x": self.get("card@2x"),
"list@2x": self.get("list@2x"),
"slimcover@2x": self.get("slimcover@2x"),
}
else:
return {
"cover": self.cover,
"card": self.card,
"list": self.list,
"slimcover": self.slimcover,
"cover@2x": self.cover_2_x,
"card@2x": self.card_2_x,
"list@2x": self.list_2_x,
"slimcover@2x": self.slimcover_2_x,
}
class BeatmapHype(BaseModel): class BeatmapHype(BaseModel):
@@ -75,12 +53,12 @@ class BeatmapNomination(TypedDict):
beatmapset_id: int beatmapset_id: int
reset: bool reset: bool
user_id: int user_id: int
rulesets: list[GameMode] | None rulesets: NotRequired[list[GameMode] | None]
class BeatmapDescription(SQLModel): class BeatmapDescription(TypedDict):
bbcode: str | None = None bbcode: NotRequired[str | None]
description: str | None = None description: NotRequired[str | None]
class BeatmapTranslationText(BaseModel): class BeatmapTranslationText(BaseModel):
@@ -122,7 +100,7 @@ class BeatmapsetBase(SQLModel):
track_id: int | None = Field(default=None) # feature artist? track_id: int | None = Field(default=None) # feature artist?
# BeatmapsetExtended # BeatmapsetExtended
bpm: float = Field(default=0.0, sa_column=Column(DECIMAL(10, 2))) bpm: float = Field(default=0.0)
can_be_hyped: bool = Field(default=False) can_be_hyped: bool = Field(default=False)
discussion_locked: bool = Field(default=False) discussion_locked: bool = Field(default=False)
last_updated: datetime = Field(sa_column=Column(DateTime)) last_updated: datetime = Field(sa_column=Column(DateTime))

View File

@@ -528,9 +528,7 @@ class MultiplayerQueue:
item.validate_playlist_item_mods() item.validate_playlist_item_mods()
item.owner_id = user.user_id item.owner_id = user.user_id
item.star_rating = float( item.star_rating = beatmap.difficulty_rating
beatmap.difficulty_rating
) # FIXME: beatmap use decimal
await Playlist.add_to_db(item, self.room.room_id, session) await Playlist.add_to_db(item, self.room.room_id, session)
self.room.playlist.append(item) self.room.playlist.append(item)
await self.hub.playlist_added(self.server_room, item) await self.hub.playlist_added(self.server_room, item)

View File

@@ -2,6 +2,7 @@ from __future__ import annotations
from datetime import datetime from datetime import datetime
from enum import Enum from enum import Enum
from typing import NotRequired, TypedDict
from .model import UTCBaseModel from .model import UTCBaseModel
@@ -83,9 +84,9 @@ class RankHistory(BaseModel):
data: list[int] data: list[int]
class Page(BaseModel): class Page(TypedDict):
html: str = "" html: NotRequired[str]
raw: str = "" raw: NotRequired[str]
class BeatmapsetType(str, Enum): class BeatmapsetType(str, Enum):