From 29b3094b27a2e6fbcfe65720e29e89aad6f33047 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 25 Oct 2022 12:27:37 +0000 Subject: [PATCH] builds: Add tag for deprecation 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 --- src/buildservice/builds.py | 44 +++++++++++++++++++++++++--------- src/buildservice/events.py | 12 ++++------ src/database.sql | 16 ++++++++++--- src/templates/builds/show.html | 10 ++++++-- 4 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/buildservice/builds.py b/src/buildservice/builds.py index 8082f390..41494fba 100644 --- a/src/buildservice/builds.py +++ b/src/buildservice/builds.py @@ -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): diff --git a/src/buildservice/events.py b/src/buildservice/events.py index b37a15d3..1b36f1b3 100644 --- a/src/buildservice/events.py +++ b/src/buildservice/events.py @@ -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 diff --git a/src/database.sql b/src/database.sql index 5fc5172a..417c78e8 100644 --- a/src/database.sql +++ b/src/database.sql @@ -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); -- diff --git a/src/templates/builds/show.html b/src/templates/builds/show.html index b5db3aac..4af4aeb5 100644 --- a/src/templates/builds/show.html +++ b/src/templates/builds/show.html @@ -78,11 +78,17 @@ {# Deprecation #} {% if build.is_deprecated() %} {% end %} -- 2.47.2