]> git.ipfire.org Git - pbs.git/commitdiff
repos: Move Repo class to SQLModel
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Jun 2025 18:22:54 +0000 (18:22 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Jun 2025 18:22:54 +0000 (18:22 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/repos.py

index d12d5a52b28ab31c05f16ebd5babe77181cb1b71..fbaefc891ed9386a35aaa5b04f101a48b3e0b8d6 100644 (file)
@@ -9,8 +9,9 @@ import io
 import logging
 import os.path
 import shutil
-
 import sqlalchemy
+import sqlmodel
+
 from sqlalchemy import Column, ForeignKey
 from sqlalchemy import Boolean, DateTime, Integer, Text
 
@@ -194,7 +195,7 @@ class Repos(base.Object):
                        await repo.write()
 
 
-class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin):
+class Repo(sqlmodel.SQLModel, database.BackendMixin, database.SoftDeleteMixin, table=True):
        __tablename__ = "repositories"
 
        def __str__(self):
@@ -206,36 +207,22 @@ class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
                return NotImplemented
 
-       def to_json(self):
-               ret = {
-                       "name"        : self.name,
-                       "slug"        : self.slug,
-                       "description" : self.description,
-                       "created_at"  : self.created_at.isoformat(),
-
-                       # Distribution
-                       "distro"      : self.distro.slug,
-               }
-
-               if self.owner:
-                       ret["owner"] = self.owner.to_json()
+       # ID
 
-               return ret
+       id : int = sqlmodel.Field(primary_key=True, exclude=True)
 
-       # ID
+       # Distro ID
 
-       id = Column(Integer, primary_key=True)
+       distro_id : int = sqlmodel.Field(foreign_key="distributions.id", exclude=True)
 
        # Distro
 
-       distro_id = Column(Integer, ForeignKey("distributions.id"), nullable=False)
-
-       distro = sqlalchemy.orm.relationship("Distro", lazy="selectin")
+       distro: "Distro" = sqlmodel.Relationship()
 
        # 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")}
        )
 
        # Repo Types
@@ -257,15 +244,15 @@ class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # Priority
 
-       priority = Column(Integer, nullable=False)
+       priority: int
 
        # Owner ID
 
-       owner_id = Column(Integer, ForeignKey("users.id"))
+       owner_id: int = sqlmodel.Field(foreign_key="users.id", exclude=True)
 
        # Owner
 
-       owner = sqlalchemy.orm.relationship("User", lazy="selectin")
+       owner: "User" = sqlmodel.Relationship()
 
        def has_perm(self, user):
                """
@@ -288,7 +275,7 @@ class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # Slug
 
-       slug = Column(Text, unique=True, nullable=False)
+       slug: str = sqlmodel.Field(unique=True)
 
        @property
        def path(self):
@@ -394,19 +381,19 @@ class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # Name
 
-       name = Column(Text, nullable=False)
+       name: str
 
        # Description
 
-       description = Column(Text, nullable=False, default="")
+       description: str = sqlmodel.Field(default="")
 
        # Key ID
 
-       key_id = Column(Integer, ForeignKey("keys.id"))
+       key_id: int = sqlmodel.Field(foreign_key="keys.id", exclude=True)
 
        # Key
 
-       key = sqlalchemy.orm.relationship("Key", foreign_keys=[key_id], lazy="joined")
+       key: "Key" = sqlmodel.Relationship()
 
        # Architectures
 
@@ -416,11 +403,11 @@ class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # Mirrored
 
-       mirrored = Column(Boolean, nullable=False, default=False)
+       mirrored: bool = sqlmodel.Field(default=False)
 
        # Listed
 
-       listed = Column(Boolean, nullable=False, default=False)
+       listed: bool = sqlmodel.Field(default=False)
 
        # Sibling repositories