You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tooling.apache.org by ar...@apache.org on 2026/04/21 08:15:36 UTC

(tooling-trusted-releases) 01/04: #510 - add archive button

This is an automated email from the ASF dual-hosted git repository.

alitheg pushed a commit to branch project_archival
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git

commit 68024092b278f5a3ac8d57d1e398bff66fe0f663
Author: Alastair McFarlane <ar...@apache.org>
AuthorDate: Fri Apr 17 16:50:11 2026 +0100

    #510 - add archive button
---
 atr/get/projects.py         | 47 ++++++++++++++++++++++++++++++---------------
 atr/shared/projects.py      |  4 ++++
 atr/templates/projects.html |  4 +---
 3 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/atr/get/projects.py b/atr/get/projects.py
index 2fa747aa..0179e66a 100644
--- a/atr/get/projects.py
+++ b/atr/get/projects.py
@@ -94,28 +94,43 @@ async def add_project(
 
 
 @get.typed
-async def projects(_session: web.Public, _projects: Literal["projects"]) -> str:
+async def projects(session: web.Public, _projects: Literal["projects"]) -> str:
     """
     URL: /projects
     Main project directory page.
     """
     async with db.session() as data:
-        projects = await data.project(_committee=True).order_by(sql.Project.name).all()
-
-    delete_forms: dict[str, htm.Element] = {}
-    for project in projects:
-        delete_forms[str(project.key)] = await form.render(
-            model_cls=shared.projects.DeleteSelectedProject,
-            action=util.as_url(post.projects.delete),
-            form_classes=".d-inline-block.m-0",
-            submit_classes="btn-sm btn-outline-danger",
-            submit_label="Delete project",
-            empty=True,
-            defaults={"project_key": str(project.key)},
-            confirm="Are you sure you want to delete this project? This cannot be undone.",
-        )
+        projects = await data.project(_committee=True, _releases=True).order_by(sql.Project.name).all()
+
+    action_forms: dict[str, htm.Element] = {}
+    if session is not None:
+        for project in projects:
+            if not (user.is_committee_member(project.committee, session.uid) or session.is_admin):
+                continue
+            if project.releases:
+                action_forms[str(project.key)] = await form.render(
+                    model_cls=shared.projects.ArchiveSelectedProject,
+                    action="#",
+                    form_classes=".d-inline-block.m-0",
+                    submit_classes="btn-sm btn-outline-secondary",
+                    submit_label="Archive project",
+                    submit_disabled=True,
+                    empty=True,
+                    defaults={"project_key": str(project.key)},
+                )
+            else:
+                action_forms[str(project.key)] = await form.render(
+                    model_cls=shared.projects.DeleteSelectedProject,
+                    action=util.as_url(post.projects.delete),
+                    form_classes=".d-inline-block.m-0",
+                    submit_classes="btn-sm btn-outline-danger",
+                    submit_label="Delete project",
+                    empty=True,
+                    defaults={"project_key": str(project.key)},
+                    confirm="Are you sure you want to delete this project? This cannot be undone.",
+                )
 
-    return await template.render("projects.html", projects=projects, delete_forms=delete_forms)
+    return await template.render("projects.html", projects=projects, action_forms=action_forms)
 
 
 @get.typed
diff --git a/atr/shared/projects.py b/atr/shared/projects.py
index 92c3974b..64721b28 100644
--- a/atr/shared/projects.py
+++ b/atr/shared/projects.py
@@ -271,6 +271,10 @@ class RemoveLanguageForm(form.Form):
     language_to_remove: str = form.label("Language to remove", widget=form.Widget.HIDDEN)
 
 
+class ArchiveSelectedProject(form.Form):
+    project_key: safe.ProjectKey = form.label("Project name", widget=form.Widget.HIDDEN)
+
+
 class DeleteProjectForm(form.Form):
     variant: DELETE_PROJECT = form.value(DELETE_PROJECT)
     project_key: safe.ProjectKey = form.label("Project name", widget=form.Widget.HIDDEN)
diff --git a/atr/templates/projects.html b/atr/templates/projects.html
index d9e2defb..77649c61 100644
--- a/atr/templates/projects.html
+++ b/atr/templates/projects.html
@@ -71,9 +71,7 @@
             </div>
           {% endif %}
 
-            {# TODO: Could add "or is_viewing_as_admin_fn(current_user.uid)" #}
-            {# But then the page is noisy for admins #}
-          {% if project.created_by == current_user.uid %}<div class="mt-3 position-relative z-1">{{ delete_forms[project.key] }}</div>{% endif %}
+          {% if project.key in action_forms %}<div class="mt-3 position-relative z-1">{{ action_forms[project.key] }}</div>{% endif %}
 
         </div>
       </div>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@tooling.apache.org
For additional commands, e-mail: commits-help@tooling.apache.org