From: Michael Tremer Date: Mon, 16 Jun 2025 15:22:20 +0000 (+0000) Subject: users: Migrate to SQLModel X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1cab91fe71a43358ab0cbb098703aee834d23198;p=pbs.git users: Migrate to SQLModel Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/users.py b/src/buildservice/users.py index dbf3fe64..c7c7a938 100644 --- a/src/buildservice/users.py +++ b/src/buildservice/users.py @@ -22,6 +22,7 @@ import pickle import struct import threading import time +import typing import urllib.parse import tornado.locale @@ -30,6 +31,10 @@ import sqlalchemy from sqlalchemy import BigInteger, Boolean, Column, DateTime, ForeignKey, Integer from sqlalchemy import Interval, LargeBinary, Text, UUID +import sqlmodel + +from uuid import UUID + from . import base from . import bugtracker from . import builds @@ -485,7 +490,7 @@ class Users(base.Object): return key.decode() -class User(database.Base, database.BackendMixin, database.SoftDeleteMixin): +class User(sqlmodel.SQLModel, database.BackendMixin, database.SoftDeleteMixin, table=True): __tablename__ = "users" def __str__(self): @@ -510,11 +515,11 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin): # ID - id = Column(Integer, primary_key=True) + id : int = sqlmodel.Field(primary_key=True) # Name - name = Column(Text, nullable=False) + name : str # Link @@ -585,7 +590,7 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin): # Admin - admin = Column(Boolean, nullable=False, default=False) + admin : bool = sqlmodel.Field(default=False) # Admin? @@ -628,13 +633,9 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin): # No permission return False - # Sessions - - sessions = sqlalchemy.orm.relationship("Session", back_populates="user") - # Bugzilla API Key - bugzilla_api_key = Column(Text) + bugzilla_api_key : str # Bugzilla @@ -658,7 +659,7 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin): # Build Quota - daily_build_quota = Column(Interval) + daily_build_quota : datetime.timedelta | None # Build Times @@ -685,7 +686,7 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin): # Storage Quota - storage_quota = Column(BigInteger) + storage_quota : int # TODO Ensure this is a BIGINT async def has_exceeded_storage_quota(self, size=None): """ @@ -1029,46 +1030,51 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin): return True -class UserPushSubscription(database.Base, database.BackendMixin): +class UserPushSubscription(sqlmodel.SQLModel, database.BackendMixin, table=True): __tablename__ = "user_push_subscriptions" # ID - id = Column(Integer, primary_key=True) + id : int = sqlmodel.Field(primary_key=True) # User ID - user_id = Column(Integer, ForeignKey("users.id"), nullable=False) + user_id : int = sqlmodel.Field(foreign_key="users.id") # User - user = sqlalchemy.orm.relationship("User", lazy="joined", innerjoin=True) + user : "User" = sqlmodel.Relationship() # UUID - uuid = Column(UUID, unique=True, nullable=False, - server_default=sqlalchemy.func.gen_random_uuid()) + uuid: UUID = sqlmodel.Field( + unique = True, + sa_column_kwargs = { + "server_default" : sqlalchemy.text("gen_random_uuid()"), + }, + ) # Created At - created_at = Column(DateTime(timezone=False), nullable=False, - server_default=sqlalchemy.func.current_timestamp()) + created_at : datetime.datetime = sqlmodel.Field( + sa_column_kwargs = {"server_default" : sqlalchemy.text("CURRENT_TIMESTAMP")} + ) # User Agent - user_agent = Column(Text) + user_agent : str | None # Endpoint - endpoint = Column(Text, nullable=False) + endpoint : str # P256DH - p256dh = Column(LargeBinary, nullable=False) + p256dh : bytes # Auth - auth = Column(LargeBinary, nullable=False) + auth : bytes @property def vapid_private_key(self):