]> git.ipfire.org Git - pbs.git/commitdiff
users: Migrate to SQLModel
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 16 Jun 2025 15:22:20 +0000 (15:22 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 16 Jun 2025 15:22:20 +0000 (15:22 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/users.py

index dbf3fe64d247c2625cec5c5588a982f14f3eb025..c7c7a938e8d217c86665c2f6a97a7f49785ba29c 100644 (file)
@@ -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):