[core] Address SQLAlchemy deprecations

This commit is contained in:
2024-11-18 10:49:41 +07:00
parent 58a5177a30
commit c11aae58a6
6 changed files with 156 additions and 79 deletions

View File

@ -1,7 +1,7 @@
from typing import Dict, List, Optional
from sqlalchemy import Column, Table, UniqueConstraint
from sqlalchemy.engine import Row
from sqlalchemy.engine import Row, RowMapping
from sqlalchemy.sql import func
from sqlalchemy.sql.schema import ForeignKey
from sqlalchemy.types import BIGINT, TIMESTAMP, VARCHAR, Boolean, Integer, String
@ -12,7 +12,11 @@ aime_card: Table = Table(
"aime_card",
metadata,
Column("id", Integer, primary_key=True, nullable=False),
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
Column(
"user",
ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"),
nullable=False,
),
Column("access_code", String(20), nullable=False, unique=True),
Column("idm", String(16), unique=True),
Column("chip_id", BIGINT, unique=True),
@ -28,27 +32,29 @@ aime_card: Table = Table(
class CardData(BaseData):
moble_os_codes = set([0x06, 0x07, 0x10, 0x12, 0x13, 0x14, 0x15, 0x17, 0x18])
card_os_codes = set([0x20, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7])
card_os_codes = set([0x20, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7])
async def get_card_by_access_code(self, access_code: str) -> Optional[Row]:
sql = aime_card.select(aime_card.c.access_code == access_code)
async def get_card_by_access_code(self, access_code: str) -> Optional[RowMapping]:
sql = aime_card.select().where(aime_card.c.access_code == access_code)
result = await self.execute(sql)
if result is None:
return None
return result.fetchone()
return result.mappings().fetchone()
async def get_card_by_id(self, card_id: int) -> Optional[Row]:
sql = aime_card.select(aime_card.c.id == card_id)
async def get_card_by_id(self, card_id: int) -> Optional[RowMapping]:
sql = aime_card.select().where(aime_card.c.id == card_id)
result = await self.execute(sql)
if result is None:
return None
return result.fetchone()
return result.mappings().fetchone()
async def update_access_code(self, old_ac: str, new_ac: str) -> None:
sql = aime_card.update(aime_card.c.access_code == old_ac).values(
access_code=new_ac
sql = (
aime_card.update()
.where(aime_card.c.access_code == old_ac)
.values(access_code=new_ac)
)
result = await self.execute(sql)
@ -65,7 +71,7 @@ class CardData(BaseData):
if card is None:
return None
return int(card["user"])
return int(card.user)
async def get_card_banned(self, access_code: str) -> Optional[bool]:
"""
@ -74,10 +80,10 @@ class CardData(BaseData):
card = await self.get_card_by_access_code(access_code)
if card is None:
return None
if card["is_banned"]:
if card.is_banned:
return True
return False
async def get_card_locked(self, access_code: str) -> Optional[bool]:
"""
Given a 20 digit access code as a string, check if the card is locked
@ -85,26 +91,26 @@ class CardData(BaseData):
card = await self.get_card_by_access_code(access_code)
if card is None:
return None
if card["is_locked"]:
if card.is_locked:
return True
return False
async def delete_card(self, card_id: int) -> None:
sql = aime_card.delete(aime_card.c.id == card_id)
sql = aime_card.delete().where(aime_card.c.id == card_id)
result = await self.execute(sql)
if result is None:
self.logger.error(f"Failed to delete card with id {card_id}")
async def get_user_cards(self, aime_id: int) -> Optional[List[Row]]:
async def get_user_cards(self, aime_id: int) -> Optional[List[RowMapping]]:
"""
Returns all cards owned by a user
"""
sql = aime_card.select(aime_card.c.user == aime_id)
sql = aime_card.select().where(aime_card.c.user == aime_id)
result = await self.execute(sql)
if result is None:
return None
return result.fetchall()
return result.mappings().fetchall()
async def create_card(self, user_id: int, access_code: str) -> Optional[int]:
"""
@ -117,41 +123,67 @@ class CardData(BaseData):
return result.lastrowid
async def update_card_last_login(self, access_code: str) -> None:
sql = aime_card.update(aime_card.c.access_code == access_code).values(
last_login_date=func.now()
sql = (
aime_card.update()
.where(aime_card.c.access_code == access_code)
.values(last_login_date=func.now())
)
result = await self.execute(sql)
if result is None:
self.logger.warn(f"Failed to update last login time for {access_code}")
async def get_card_by_idm(self, idm: str) -> Optional[Row]:
result = await self.execute(aime_card.select(aime_card.c.idm == idm))
async def get_card_by_idm(self, idm: str) -> Optional[RowMapping]:
result = await self.execute(aime_card.select().where(aime_card.c.idm == idm))
if result:
return result.fetchone()
return result.mappings().fetchone()
async def get_card_by_chip_id(self, chip_id: int) -> Optional[Row]:
result = await self.execute(aime_card.select(aime_card.c.chip_id == chip_id))
result = await self.execute(
aime_card.select().where(aime_card.c.chip_id == chip_id)
)
if result:
return result.fetchone()
async def set_chip_id_by_access_code(self, access_code: str, chip_id: int) -> Optional[Row]:
result = await self.execute(aime_card.update(aime_card.c.access_code == access_code).values(chip_id=chip_id))
async def set_chip_id_by_access_code(
self, access_code: str, chip_id: int
) -> Optional[Row]:
result = await self.execute(
aime_card.update()
.where(aime_card.c.access_code == access_code)
.values(chip_id=chip_id)
)
if not result:
self.logger.error(f"Failed to update chip ID to {chip_id} for {access_code}")
self.logger.error(
f"Failed to update chip ID to {chip_id} for {access_code}"
)
async def set_idm_by_access_code(self, access_code: str, idm: str) -> Optional[Row]:
result = await self.execute(aime_card.update(aime_card.c.access_code == access_code).values(idm=idm))
result = await self.execute(
aime_card.update()
.where(aime_card.c.access_code == access_code)
.values(idm=idm)
)
if not result:
self.logger.error(f"Failed to update IDm to {idm} for {access_code}")
async def set_access_code_by_access_code(self, old_ac: str, new_ac: str) -> None:
result = await self.execute(aime_card.update(aime_card.c.access_code == old_ac).values(access_code=new_ac))
result = await self.execute(
aime_card.update()
.where(aime_card.c.access_code == old_ac)
.values(access_code=new_ac)
)
if not result:
self.logger.error(f"Failed to change card access code from {old_ac} to {new_ac}")
self.logger.error(
f"Failed to change card access code from {old_ac} to {new_ac}"
)
async def set_memo_by_access_code(self, access_code: str, memo: str) -> None:
result = await self.execute(aime_card.update(aime_card.c.access_code == access_code).values(memo=memo))
result = await self.execute(
aime_card.update()
.where(aime_card.c.access_code == access_code)
.values(memo=memo)
)
if not result:
self.logger.error(f"Failed to add memo to card {access_code}")