]> git.ipfire.org Git - pbs.git/commitdiff
builds: Add tag for deprecation
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 25 Oct 2022 12:27:37 +0000 (12:27 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 25 Oct 2022 12:27:37 +0000 (12:27 +0000)
This is required because we sometimes might deprecate a build without
having a new one (when it is being deleted in the source repository).

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 8082f390264f77cfe3d8640bdbd819f89ae36276..41494fba0ca0dd162a9b9270e63537c50e745591 100644 (file)
@@ -715,37 +715,59 @@ class Build(base.DataObject):
 
                        -- Exclude everything that is already deprecated
                        AND
-                               builds.deprecated_by IS NULL
+                               builds.deprecated_at IS NULL
                        """, self.id,
                )
 
                # Deprecate all builds
                for build in builds:
-                       build.deprecate(self)
+                       build.deprecate(build=self)
 
-       def deprecate(self, build):
+       def deprecate(self, build=None, user=None):
                """
                        Called when a build needs to be deprecated
                """
-               log.debug("Deprecating %s by %s" % (self, build))
+               if build:
+                       log.debug("Deprecating %s by %s" % (self, build))
+               else:
+                       log.debug("Deprecating %s" % self)
+
+               # Set user from build if not set
+               if user is None:
+                       user = build.owner
 
                # Mark as deprecated
-               self.deprecated_by = build
+               self._set_attribute_now("deprecated_at")
+               if user:
+                       self._set_attribute("deprecated_by", user)
+
+               # Store the build
+               if build:
+                       self.deprecating_build = build
+
+       @property
+       def deprecated_at(self):
+               return self.data.deprecated_at
 
        def is_deprecated(self):
-               if self.data.deprecated_by:
+               if self.deprecated_at:
                        return True
 
                return False
 
-       def get_deprecated_by(self):
+       @lazy_property
+       def deprecated_by(self):
                if self.data.deprecated_by:
-                       return self.backend.builds.get_by_id(self.data.deprecated_by)
+                       return self.backend.users.get_by_id(self.data.deprecated_by)
+
+       def get_deprecating_build(self):
+               if self.data.deprecating_build_id:
+                       return self.backend.builds.get_by_id(self.data.deprecating_build_id)
 
-       def set_deprecated_by(self, build):
-               self._set_attribute("deprecated_by", build)
+       def set_deprecating_build(self, build):
+               self._set_attribute("deprecating_build_id", build)
 
-       deprecated_by = lazy_property(get_deprecated_by, set_deprecated_by)
+       deprecating_build = lazy_property(get_deprecating_build, set_deprecating_build)
 
        @lazy_property
        def deprecated_builds(self):
index b37a15d3ec9d638b7c5ba845129270643d029df8..1b36f1b32414193749463e3a5fa930b30a1e6fa1 100644 (file)
@@ -107,23 +107,19 @@ EVENTS_VIEW = """
 
                SELECT
                        'build-deprecated' AS type,
-                       deprecated_builds.created_at AS t,
+                       builds.deprecated_at AS t,
                        4 AS priority,
                        builds.id AS build,
-                       builds.deprecated_by AS by_build,
+                       builds.deprecating_build_id AS by_build,
                        NULL AS build_comment,
                        NULL AS user,
-                       builds.owner_id AS by_user
+                       builds.deprecated_by AS by_user
                FROM
                        builds
-               LEFT JOIN
-                       builds deprecated_builds ON builds.deprecated_by = deprecated_builds.id
                WHERE
                        builds.deleted_at IS NULL
                AND
-                       deprecated_builds.deleted_at IS NULL
-               AND
-                       builds.deprecated_by IS NOT NULL
+                       builds.deprecated_at IS NOT NULL
 
                UNION ALL
 
index 5fc5172acb23871fc1238957453d8f3ed9233a8f..417c78e854dd70ef452e6a2ca228d82bd4597ed9 100644 (file)
@@ -206,6 +206,8 @@ CREATE TABLE public.builds (
     deleted_at timestamp without time zone,
     deleted_by integer,
     build_group_id integer,
+    deprecating_build_id integer,
+    deprecated_at timestamp without time zone,
     deprecated_by integer
 );
 
@@ -1507,10 +1509,10 @@ CREATE INDEX builds_deleted ON public.builds USING btree (deleted_at) WHERE (del
 
 
 --
--- Name: builds_deprecated_by; Type: INDEX; Schema: public; Owner: -
+-- Name: builds_deprecating_build_id; Type: INDEX; Schema: public; Owner: -
 --
 
-CREATE INDEX builds_deprecated_by ON public.builds USING btree (deprecated_by) WHERE (deleted_at IS NULL);
+CREATE INDEX builds_deprecating_build_id ON public.builds USING btree (deprecating_build_id) WHERE ((deleted_at IS NULL) AND (deprecated_at IS NOT NULL));
 
 
 --
@@ -1827,7 +1829,15 @@ ALTER TABLE ONLY public.builds
 --
 
 ALTER TABLE ONLY public.builds
-    ADD CONSTRAINT builds_deprecated_by FOREIGN KEY (deprecated_by) REFERENCES public.builds(id);
+    ADD CONSTRAINT builds_deprecated_by FOREIGN KEY (deprecated_by) REFERENCES public.users(id);
+
+
+--
+-- Name: builds builds_deprecating_build_id; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.builds
+    ADD CONSTRAINT builds_deprecating_build_id FOREIGN KEY (deprecating_build_id) REFERENCES public.builds(id);
 
 
 --
index b5db3aac4fa93cdc9297f6497ac98eeaec146a96..4af4aeb5db4dcd45cf234cba04f914d0da458d48 100644 (file)
                                        {# Deprecation #}
                                        {% if build.is_deprecated() %}
                                                <div class="level-item">
-                                                       <a href="/builds/{{ build.deprecated_by.uuid }}">
+                                                       {% if build.deprecating_build %}
+                                                               <a href="/builds/{{ build.deprecating_build.uuid }}">
+                                                                       <span class="icon">
+                                                                               <i class="fa-solid fa-arrow-right" title="{{ _("Deprecated") }}"></i>
+                                                                       </span>
+                                                               </a>
+                                                       {% else %}
                                                                <span class="icon">
                                                                        <i class="fa-solid fa-arrow-right" title="{{ _("Deprecated") }}"></i>
                                                                </span>
-                                                       </a>
+                                                       {% end %}
                                                </div>
                                        {% end %}