]> git.ipfire.org Git - pbs.git/commitdiff
builds: Relax relationship between test groups
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 23 Jan 2025 11:28:34 +0000 (11:28 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 23 Jan 2025 11:28:34 +0000 (11:28 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builds.py
src/buildservice/events.py
src/database.sql
src/templates/builds/show.html

index d09e725955f2eea7bb842b485f2e98dec3eaed6e..7ff5e26cfb43629f0748818e4aca801c0d721c3f 100644 (file)
@@ -465,8 +465,22 @@ class Build(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        # Group
 
-       group = sqlalchemy.orm.relationship("BuildGroup", back_populates="builds",
-               foreign_keys=[build_group_id], lazy="selectin")
+       async def get_group(self):
+               """
+                       Returns the build group this build is in
+               """
+               stmt = (
+                       sqlalchemy
+                       .select(
+                               BuildGroup,
+                       )
+                       .where(
+                               BuildGroup.deleted_at == None,
+                               BuildGroup.id == self.build_group_id,
+                       )
+               )
+
+               return await self.db.fetch_one(stmt)
 
        # Severity
 
@@ -1081,11 +1095,6 @@ class Build(database.Base, database.BackendMixin, database.SoftDeleteMixin):
        def is_test(self):
                return self.test
 
-       @functools.cached_property
-       def test_build_for(self):
-               if self.group:
-                       return self.group.tested_build
-
        # Disable Test Builds?
 
        disable_test_builds = Column(Boolean, nullable=False, default=False)
@@ -1152,18 +1161,27 @@ class Build(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                        await self._send_email("builds/messages/test-builds-failed.txt",
                                build=self, test_builds=self.test_builds)
 
-       # Test Group ID
+       # Tests
 
-       test_group_id = Column(Integer, ForeignKey("build_groups.id"))
-
-       # Test Group
+       async def get_tests(self):
+               """
+                       Returns the test group
+               """
+               stmt = (
+                       sqlalchemy
+                       .select(
+                               BuildGroup,
+                       )
+                       .where(
+                               BuildGroup.deleted_at == None,
+                               BuildGroup.tested_build == self,
+                       )
+               )
 
-       test_group = sqlalchemy.orm.relationship(
-               "BuildGroup", foreign_keys=[test_group_id], lazy="joined",
-       )
+               return await self.db.fetch_one(stmt)
 
 
-class BuildGroup(database.Base, database.BackendMixin, database.SoftDeleteMixin):
+class BuildGroup(database.Base, database.SoftDeleteMixin):
        __tablename__ = "build_groups"
 
        def __str__(self):
@@ -1206,8 +1224,9 @@ class BuildGroup(database.Base, database.BackendMixin, database.SoftDeleteMixin)
 
        # Builds
 
-       builds = sqlalchemy.orm.relationship("Build", back_populates="group",
-               foreign_keys=[Build.build_group_id], lazy="selectin")
+       builds = sqlalchemy.orm.relationship(
+               "Build", foreign_keys=[Build.build_group_id], lazy="selectin",
+       )
 
        @staticmethod
        def _sort_builds(build):
@@ -1243,8 +1262,9 @@ class BuildGroup(database.Base, database.BackendMixin, database.SoftDeleteMixin)
 
        # Tested Build
 
-       tested_build = sqlalchemy.orm.relationship("Build",
-               foreign_keys=[tested_build_id], lazy="joined")
+       tested_build = sqlalchemy.orm.relationship(
+               "Build", foreign_keys=[tested_build_id], lazy="joined",
+       )
 
        # Test?
 
index b5c18d4b8cae9b7beb03b21411956cc48f91be8c..a759ee3e0fd3e15f589e3956e8f4350365aa4385 100644 (file)
@@ -415,11 +415,10 @@ class Events(base.Object):
                                # Build Group ID
                                builds.BuildGroup.id.label("build_group_id"),
                        )
-                       .select_from(builds.BuildGroup)
+                       .select_from(builds.Build)
                        .join(
-                               builds.Build,
-                               builds.Build.test_group_id == builds.BuildGroup.id,
-                               isouter=True,
+                               builds.BuildGroup,
+                               builds.BuildGroup.tested_build_id == builds.Build.id,
                        )
                        .where(
                                builds.BuildGroup.deleted_at == None,
index 123c14b3b2a420615fef6eda295cde0aef869938..444da994146d7c8038c0f75acabc44a86a0301eb 100644 (file)
@@ -251,7 +251,6 @@ CREATE TABLE public.builds (
     deprecating_build_id integer,
     deprecated_at timestamp without time zone,
     deprecated_by_id integer,
-    test_group_id integer,
     test boolean DEFAULT false NOT NULL,
     disable_test_builds boolean DEFAULT false NOT NULL,
     points integer DEFAULT 0 NOT NULL,
@@ -2125,14 +2124,6 @@ ALTER TABLE ONLY public.builds
     ADD CONSTRAINT builds_pkg_id FOREIGN KEY (pkg_id) REFERENCES public.packages(id);
 
 
---
--- Name: builds builds_test_group_id; Type: FK CONSTRAINT; Schema: public; Owner: -
---
-
-ALTER TABLE ONLY public.builds
-    ADD CONSTRAINT builds_test_group_id FOREIGN KEY (test_group_id) REFERENCES public.build_groups(id);
-
-
 --
 -- Name: job_packages job_packages_job_id; Type: FK CONSTRAINT; Schema: public; Owner: -
 --
index 023b88ea5e68d0726a404dc844abeb5a75944dbe..b538d8858d85a0b5a841815f3793b8d806cc5ab1 100644 (file)
@@ -12,6 +12,9 @@
 {% block title %}{{ _("Build") }} - {{ build }}{% endblock %}
 
 {% block body %}
+       {# Fetch the group #}
+       {% set group = build.get_group() %}
+
        <section class="hero
                {% if build.is_successful() %}
                        is-success
@@ -44,8 +47,8 @@
                                                        <h6 class="subtitle is-6">
                                                                <span class="tag is-warning">{{ _("Test Build") }}</span>
 
-                                                               <a href="/builds/{{ build.test_build_for.uuid }}">
-                                                                       {{ build.test_build_for }}
+                                                               <a href="/builds/{{ group.tested_build.uuid }}">
+                                                                       {{ group.tested_build }}
                                                                </a>
                                                        </h6>
                                                {% else %}
                                </div>
                        </div>
                </section>
-       {% elif build.test_group %}
-               <section class="section">
-                       <div class="container">
-                               <h5 class="title is-5">{{ _("Test Builds")}}</h5>
+       {% else %}
+               {# Fetch all tests #}
+               {% set tests = build.get_tests() %}
 
-                               {{ BuildGroupList(build.test_group, limit=8) }}
-                       </div>
-               </section>
+               {% if tests %}
+                       <section class="section">
+                               <div class="container">
+                                       <h5 class="title is-5">{{ _("Test Builds")}}</h5>
+
+                                       {{ BuildGroupList(tests, limit=8) }}
+                               </div>
+                       </section>
+               {% endif %}
        {% endif %}
 
        {# Log #}