]> git.ipfire.org Git - pbs.git/commitdiff
sources: Migrate to SQLModel
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 2 Jul 2025 15:00:11 +0000 (15:00 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 2 Jul 2025 15:00:11 +0000 (15:00 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/sources.py

index 117116d31b027aafbabd3ac0952e9882820ac924..a5ddc4f2f91b4dc3e6500a741dc4f976945f808e 100644 (file)
@@ -8,11 +8,9 @@ import logging
 import os
 import re
 import sqlalchemy
+import sqlmodel
 import tempfile
 
-from sqlalchemy import Column, ForeignKey
-from sqlalchemy import DateTime, Integer, Text
-
 from . import base
 from . import database
 from . import config
@@ -145,7 +143,7 @@ class Sources(base.Object):
                        await job.run()
 
 
-class Source(database.Base, database.BackendMixin, database.SoftDeleteMixin):
+class Source(sqlmodel.SQLModel, database.BackendMixin, database.SoftDeleteMixin, table=True):
        __tablename__ = "sources"
 
        def __str__(self):
@@ -153,44 +151,45 @@ class Source(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # ID
 
-       id = Column(Integer, primary_key=True)
+       id: int = sqlmodel.Field(primary_key=True, exclude=True)
 
        # Name
 
-       name = Column(Text, nullable=False)
+       name: str
 
        # Slug
 
-       slug = Column(Text, unique=True, nullable=False)
+       # XXX Must be unique
+       slug: str
 
        # URL
 
-       url = Column(Text, nullable=False)
+       url: str
 
        # Gitweb
 
-       gitweb = Column(Text)
+       gitweb: str | None = None
 
        # Revision
 
-       revision = Column(Text)
+       revision: str | None = None
 
        # Branch
 
-       branch = Column(Text, nullable=False)
+       branch: str
 
        # Last Fetched At
 
-       last_fetched_at = Column(DateTime(timezone=False))
+       last_fetched_at: datetime.datetime | None = None
 
        # Repo ID
 
-       repo_id = Column(Integer, ForeignKey("repositories.id"), nullable=False)
+       repo_id: int = sqlmodel.Field(foreign_key="repositories.id", exclude=True)
 
        # Repo
 
-       repo = sqlalchemy.orm.relationship(
-               "Repo", foreign_keys=[repo_id], lazy="joined", innerjoin=True,
+       repo: "Repo" = sqlmodel.Relationship(
+               sa_relationship_kwargs={ "lazy" : "joined" },
        )
 
        # Distro
@@ -201,27 +200,28 @@ class Source(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # 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")}
+       )
 
        # Created By ID
 
-       created_by_id = Column(Integer, ForeignKey("users.id"))
+       created_by_id: int = sqlmodel.Field(foreign_key="users.id", exclude=True)
 
        # Created By
 
-       created_by = sqlalchemy.orm.relationship(
-               "User", foreign_keys=[created_by_id], lazy="joined", innerjoin=True,
+       created_by: "User" = sqlmodel.Relationship(
+               sa_relationship_kwargs={ "foreign_keys" : "[Source.created_by_id]" },
        )
 
        # Deleted By ID
 
-       deleted_by_id = Column(Integer, ForeignKey("users.id"))
+       deleted_by_id: int = sqlmodel.Field(foreign_key="users.id", exclude=True)
 
        # Deleted By
 
-       deleted_by = sqlalchemy.orm.relationship(
-               "User", foreign_keys=[deleted_by_id], lazy="joined",
+       deleted_by: "User" = sqlmodel.Relationship(
+               sa_relationship_kwargs={ "foreign_keys" : "[Source.deleted_by_id]" },
        )
 
        # Path
@@ -389,7 +389,7 @@ class Source(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                self.last_fetched_at = sqlalchemy.func.current_timestamp()
 
 
-class SourceCommit(database.Base, database.BackendMixin, database.SoftDeleteMixin):
+class SourceCommit(sqlmodel.SQLModel, database.BackendMixin, database.SoftDeleteMixin, table=True):
        __tablename__ = "source_commits"
 
        def __str__(self):
@@ -397,41 +397,41 @@ class SourceCommit(database.Base, database.BackendMixin, database.SoftDeleteMixi
 
        # ID
 
-       id = Column(Integer, primary_key=True)
+       id: int = sqlmodel.Field(primary_key=True, exclude=True)
 
        # Source ID
 
-       source_id = Column(Integer, ForeignKey("sources.id"), nullable=False)
+       source_id: int = sqlmodel.Field(foreign_key="sources.id")
 
        # Source
 
-       source = sqlalchemy.orm.relationship(
-               "Source", foreign_keys=[source_id], lazy="joined",
+       source: "Source" = sqlmodel.Relationship(
+               sa_relationship_kwargs={ "lazy" : "selectin" },
        )
 
        # Revision
 
-       revision = Column(Text, nullable=False)
+       revision: str
 
        # Author
 
-       author = Column(Text, nullable=False)
+       author: str
 
        # Committer
 
-       committer = Column(Text, nullable=False)
+       committer: str
 
        # Date
 
-       date = Column(DateTime(timezone=False), nullable=False)
+       date: datetime.datetime
 
        # Subject
 
-       subject = Column(Text, nullable=False)
+       subject: str
 
        # Body
 
-       body = Column(Text, nullable=False)
+       body: str
 
        @functools.cached_property
        def message(self):
@@ -545,12 +545,12 @@ class SourceCommit(database.Base, database.BackendMixin, database.SoftDeleteMixi
 
        # Build Group ID
 
-       build_group_id = Column(Integer, ForeignKey("build_groups.id"))
+       build_group_id: int = sqlmodel.Field(foreign_key="build_groups.id", exclude=True)
 
        # Build Group
 
-       builds = sqlalchemy.orm.relationship(
-               "BuildGroup", foreign_keys=[build_group_id], lazy="selectin",
+       builds: "BuildGroup" = sqlmodel.Relationship(
+               sa_relationship_kwargs={ "lazy" : "selectin" },
        )
 
        # Jobs
@@ -600,38 +600,38 @@ class SourceCommit(database.Base, database.BackendMixin, database.SoftDeleteMixi
                self.finished_at = sqlalchemy.func.current_timestamp()
 
 
-class SourceJob(database.Base, database.BackendMixin):
+class SourceJob(sqlmodel.SQLModel, database.BackendMixin, table=True):
        __tablename__ = "source_commit_jobs"
 
        # ID
 
-       id = Column(Integer, primary_key=True)
+       id: int = sqlmodel.Field(primary_key=True, exclude=True)
 
        # Commit ID
 
-       commit_id = Column(Integer, ForeignKey("source_commits.id"), nullable=False)
+       commit_id: int = sqlmodel.Field(foreign_key="source_commits.id", exclude=True)
 
        # Commit
 
-       commit = sqlalchemy.orm.relationship(
-               "SourceCommit", foreign_keys=[commit_id], lazy="joined",
+       commit: "SourceCommit" = sqlmodel.Relationship(
+               sa_relationship_kwargs={ "lazy" : "joined" },
        )
 
        # Action
 
-       action = Column(Text, nullable=False)
+       action: str
 
        # Name
 
-       name = Column(Text, nullable=False)
+       name: str
 
        # Finished At
 
-       finished_at = Column(DateTime(timezone=False))
+       finished_at: datetime.datetime
 
        # Error
 
-       error = Column(Text)
+       error: str = ""
 
        # Status