]> git.ipfire.org Git - pbs.git/commitdiff
distros: Release the strong relationship to releases
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 21 Jan 2025 14:47:00 +0000 (14:47 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 21 Jan 2025 14:47:00 +0000 (14:47 +0000)
We don't want to fetch all releases every time we access the
distribution.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/distros.py
src/buildservice/releases.py

index 57da79cdaa037a3a722ddeb0b04410ebb043953c..b70b59e76046beeb0db8ec046176c44784598737 100644 (file)
@@ -303,8 +303,41 @@ class Distro(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # Releases
 
-       releases = sqlalchemy.orm.relationship("Release", back_populates="distro",
-               order_by="Release.published_at", lazy="selectin")
+       async def get_releases(self, limit=None, offset=None):
+               """
+                       Fetches all releases of this distribution
+               """
+               stmt = (
+                       sqlalchemy
+                       .select(
+                               releases.Release,
+                       )
+                       .where(
+                               releases.Release.deleted_at == None,
+                               releases.Release.distro == self,
+                       )
+                       .order_by(
+                               releases.Release.published_at.desc(),
+                               releases.Release.created_at.desc(),
+                       )
+               )
+
+               return await self.db.fetch_as_list(stmt)
+
+       async def get_release(self, slug):
+               stmt = (
+                       sqlalchemy
+                       .select(
+                               releases.Release,
+                       )
+                       .where(
+                               releases.Release.deleted_at == None,
+                               releases.Release.distro == self,
+                               releases.Release.slug == slug,
+                       )
+               )
+
+               return await self.db.fetch_one(stmt)
 
        # Latest Release
 
@@ -330,23 +363,6 @@ class Distro(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
                return await self.db.fetch_one(stmt)
 
-       # Releases
-
-       def get_release(self, slug):
-               return self.backend.distros.releases._get_release("""
-                       SELECT
-                               *
-                       FROM
-                               releases
-                       WHERE
-                               distro_id = %s
-                       AND
-                               slug = %s
-                       AND
-                               deleted_at IS NULL
-                       """, self.id, slug,
-               )
-
        async def create_release(self, name, user, stable=False):
                """
                        Creates a new release
index 1e410a771be6c0ffc399ab2053047f71769f136d..92aed353d448e12dede8410a827f7d4c7d9d3c4c 100644 (file)
@@ -50,7 +50,7 @@ class Release(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # Distro
 
-       distro = sqlalchemy.orm.relationship("Distro", back_populates="releases", lazy="selectin")
+       distro = sqlalchemy.orm.relationship("Distro", lazy="selectin")
 
        # Name