This is an automated email from the ASF dual-hosted git repository.
sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-release.git
The following commit(s) were added to refs/heads/main by this push:
new 298c328 Rename the overview page to content
298c328 is described below
commit 298c328477c5a0daf3c12dbb8b4247762d2bdc19
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Apr 21 19:28:42 2025 +0100
Rename the overview page to content
---
atr/routes/draft.py | 188 ++++++++++-----------
atr/routes/release.py | 2 +-
atr/templates/draft-add-files.html | 2 +-
.../{draft-overview.html => draft-content.html} | 0
atr/templates/draft-vote-start.html | 2 +-
atr/templates/index-committer.html | 2 +-
playwright/test.py | 4 +-
7 files changed, 100 insertions(+), 100 deletions(-)
diff --git a/atr/routes/draft.py b/atr/routes/draft.py
index 7475fb5..8f6c983 100644
--- a/atr/routes/draft.py
+++ b/atr/routes/draft.py
@@ -156,7 +156,7 @@ async def add(session: routes.CommitterSession) ->
response.Response | str:
project_name=str(form.project_name.data),
version=str(form.version_name.data), asf_uid=session.uid
)
return await session.redirect(
- overview,
+ content,
project_name=project.name,
version_name=new_release.version,
success="Release candidate draft created successfully",
@@ -236,6 +236,98 @@ async def add_files(session: routes.CommitterSession,
project_name: str, version
)
[email protected]("/draft/content/<project_name>/<version_name>")
+async def content(session: routes.CommitterSession, project_name: str,
version_name: str) -> response.Response | str:
+ """Show the contents of the release candidate draft."""
+ if not any((p.name == project_name) for p in (await
session.user_projects)):
+ return await session.redirect(add, error="You do not have access to
this project")
+
+ async with db.session() as data:
+ release_name = models.release_name(project_name, version_name)
+ release = await data.release(
+ name=release_name,
phase=models.ReleasePhase.RELEASE_CANDIDATE_DRAFT, _project=True
+ ).demand(base.ASFQuartException("Release does not exist",
errorcode=404))
+ if release.revision is None:
+ raise base.ASFQuartException("This release does not have a
revision.", errorcode=400)
+
+ base_path = util.get_release_candidate_draft_dir() / project_name /
version_name / release.revision
+ paths = await util.paths_recursive(base_path)
+ path_templates = {}
+ path_substitutions = {}
+ path_artifacts = set()
+ path_metadata = set()
+ path_successes = {}
+ path_warnings = {}
+ path_errors = {}
+
+ for path in paths:
+ # Get template and substitutions
+ elements = {
+ "core": project_name,
+ "version": version_name,
+ "sub": None,
+ "template": None,
+ "substitutions": None,
+ }
+ template, substitutions = analysis.filename_parse(str(path),
elements)
+ path_templates[path] = template
+ path_substitutions[path] =
analysis.substitutions_format(substitutions) or "none"
+
+ # Get artifacts and metadata
+ search = re.search(analysis.extension_pattern(), str(path))
+ if search:
+ if search.group("artifact"):
+ path_artifacts.add(path)
+ elif search.group("metadata"):
+ path_metadata.add(path)
+
+ # Get successes, warnings, and errors
+ path_successes[path] = await data.check_result(
+ release_name=release.name, primary_rel_path=str(path),
status=models.CheckResultStatus.SUCCESS
+ ).all()
+ path_warnings[path] = await data.check_result(
+ release_name=release.name, primary_rel_path=str(path),
status=models.CheckResultStatus.WARNING
+ ).all()
+ path_errors[path] = await data.check_result(
+ release_name=release.name, primary_rel_path=str(path),
status=models.CheckResultStatus.FAILURE
+ ).all()
+
+ revision_name_from_link, revision_editor, revision_time = await
revision.latest_info(project_name, version_name)
+
+ # Get the number of ongoing tasks for the current revision
+ ongoing_tasks_count = 0
+ if revision_name_from_link:
+ ongoing_tasks_count = await db.tasks_ongoing(project_name,
version_name, revision_name_from_link)
+
+ delete_draft_form = await DeleteForm.create_form()
+ delete_file_form = await DeleteFileForm.create_form()
+
+ return await quart.render_template(
+ "draft-content.html",
+ project_name=project_name,
+ version_name=version_name,
+ release=release,
+ paths=paths,
+ artifacts=path_artifacts,
+ metadata=path_metadata,
+ successes=path_successes,
+ warnings=path_warnings,
+ errors=path_errors,
+ templates=path_templates,
+ substitutions=path_substitutions,
+ revision_editor=revision_editor,
+ revision_time=revision_time,
+ revision_name_from_link=revision_name_from_link,
+ ongoing_tasks_count=ongoing_tasks_count,
+ delete_form=delete_draft_form,
+ delete_file_form=delete_file_form,
+ asf_id=session.uid,
+ server_domain=session.host,
+ format_datetime=routes.format_datetime,
+ models=models,
+ )
+
+
async def create_release_draft(project_name: str, version: str, asf_uid: str)
-> tuple[models.Release, models.Project]:
"""Creates the initial release draft record and revision directory."""
# Get the project from the project name
@@ -652,98 +744,6 @@ async def hashgen(
)
[email protected]("/draft/overview/<project_name>/<version_name>")
-async def overview(session: routes.CommitterSession, project_name: str,
version_name: str) -> response.Response | str:
- """Show an overview of the release candidate draft."""
- if not any((p.name == project_name) for p in (await
session.user_projects)):
- return await session.redirect(add, error="You do not have access to
this project")
-
- async with db.session() as data:
- release_name = models.release_name(project_name, version_name)
- release = await data.release(
- name=release_name,
phase=models.ReleasePhase.RELEASE_CANDIDATE_DRAFT, _project=True
- ).demand(base.ASFQuartException("Release does not exist",
errorcode=404))
- if release.revision is None:
- raise base.ASFQuartException("This release does not have a
revision.", errorcode=400)
-
- base_path = util.get_release_candidate_draft_dir() / project_name /
version_name / release.revision
- paths = await util.paths_recursive(base_path)
- path_templates = {}
- path_substitutions = {}
- path_artifacts = set()
- path_metadata = set()
- path_successes = {}
- path_warnings = {}
- path_errors = {}
-
- for path in paths:
- # Get template and substitutions
- elements = {
- "core": project_name,
- "version": version_name,
- "sub": None,
- "template": None,
- "substitutions": None,
- }
- template, substitutions = analysis.filename_parse(str(path),
elements)
- path_templates[path] = template
- path_substitutions[path] =
analysis.substitutions_format(substitutions) or "none"
-
- # Get artifacts and metadata
- search = re.search(analysis.extension_pattern(), str(path))
- if search:
- if search.group("artifact"):
- path_artifacts.add(path)
- elif search.group("metadata"):
- path_metadata.add(path)
-
- # Get successes, warnings, and errors
- path_successes[path] = await data.check_result(
- release_name=release.name, primary_rel_path=str(path),
status=models.CheckResultStatus.SUCCESS
- ).all()
- path_warnings[path] = await data.check_result(
- release_name=release.name, primary_rel_path=str(path),
status=models.CheckResultStatus.WARNING
- ).all()
- path_errors[path] = await data.check_result(
- release_name=release.name, primary_rel_path=str(path),
status=models.CheckResultStatus.FAILURE
- ).all()
-
- revision_name_from_link, revision_editor, revision_time = await
revision.latest_info(project_name, version_name)
-
- # Get the number of ongoing tasks for the current revision
- ongoing_tasks_count = 0
- if revision_name_from_link:
- ongoing_tasks_count = await db.tasks_ongoing(project_name,
version_name, revision_name_from_link)
-
- delete_draft_form = await DeleteForm.create_form()
- delete_file_form = await DeleteFileForm.create_form()
-
- return await quart.render_template(
- "draft-overview.html",
- project_name=project_name,
- version_name=version_name,
- release=release,
- paths=paths,
- artifacts=path_artifacts,
- metadata=path_metadata,
- successes=path_successes,
- warnings=path_warnings,
- errors=path_errors,
- templates=path_templates,
- substitutions=path_substitutions,
- revision_editor=revision_editor,
- revision_time=revision_time,
- revision_name_from_link=revision_name_from_link,
- ongoing_tasks_count=ongoing_tasks_count,
- delete_form=delete_draft_form,
- delete_file_form=delete_file_form,
- asf_id=session.uid,
- server_domain=session.host,
- format_datetime=routes.format_datetime,
- models=models,
- )
-
-
@routes.committer("/draft/revision/set/<project_name>/<version_name>",
methods=["POST"])
async def revision_set(session: routes.CommitterSession, project_name: str,
version_name: str) -> response.Response:
"""Set a specific revision as the latest for a candidate draft."""
@@ -1161,7 +1161,7 @@ async def vote_start(
# TODO: Consider relaxing this to all committers
# Otherwise we must not show the vote form
if not user.is_committee_member(release.committee, session.uid):
- return await session.redirect(overview, error="You must be on the
PMC of this project to start a vote")
+ return await session.redirect(content, error="You must be on the
PMC of this project to start a vote")
committee = util.unwrap(release.committee)
sender = f"{session.uid}@apache.org"
diff --git a/atr/routes/release.py b/atr/routes/release.py
index 9dd6733..05071f1 100644
--- a/atr/routes/release.py
+++ b/atr/routes/release.py
@@ -137,7 +137,7 @@ async def start(session: routes.CommitterSession,
project_name: str) -> response
)[0]
# Redirect to the new draft's overview page on success
return await session.redirect(
- draft.overview,
+ draft.content,
project_name=project.name,
version_name=new_release.version,
success="Release candidate draft created successfully",
diff --git a/atr/templates/draft-add-files.html
b/atr/templates/draft-add-files.html
index dc60841..28a7162 100644
--- a/atr/templates/draft-add-files.html
+++ b/atr/templates/draft-add-files.html
@@ -9,7 +9,7 @@
{% endblock description %}
{% block content %}
- <a href="{{ as_url(routes.draft.overview, project_name=project_name,
version_name=version_name) }}"
+ <a href="{{ as_url(routes.draft.content, project_name=project_name,
version_name=version_name) }}"
class="back-link">← Back to {{ project_display_name }} {{ version_name
}}</a>
<h1>Add files to {{ project_display_name }} {{ version_name }}</h1>
diff --git a/atr/templates/draft-overview.html
b/atr/templates/draft-content.html
similarity index 100%
rename from atr/templates/draft-overview.html
rename to atr/templates/draft-content.html
diff --git a/atr/templates/draft-vote-start.html
b/atr/templates/draft-vote-start.html
index c6b1455..af8317d 100644
--- a/atr/templates/draft-vote-start.html
+++ b/atr/templates/draft-vote-start.html
@@ -105,7 +105,7 @@
<div class="mt-4 col-md-9 offset-md-3">
{{ form.submit(class_='btn btn-primary') }}
- <a href="{{ as_url(routes.draft.overview,
project_name=release.project.name, version_name=release.version) }}"
+ <a href="{{ as_url(routes.draft.content,
project_name=release.project.name, version_name=release.version) }}"
class="btn btn-link text-secondary">Cancel</a>
</div>
</form>
diff --git a/atr/templates/index-committer.html
b/atr/templates/index-committer.html
index cd9bd4b..0b4e3ac 100644
--- a/atr/templates/index-committer.html
+++ b/atr/templates/index-committer.html
@@ -111,7 +111,7 @@
<div class="d-flex flex-wrap gap-3">
{% for release in active_releases %}
{% set current_phase_index = phase_index_map.get(release.phase,
-1) %}
- {% set release_link = as_url(routes.draft.overview,
project_name=release.project.name, version_name=release.version) if
release.phase.value == "release_candidate_draft" else
as_url(routes.candidate.view, project_name=release.project.name,
version_name=release.version) %}
+ {% set release_link = as_url(routes.draft.content,
project_name=release.project.name, version_name=release.version) if
release.phase.value == "release_candidate_draft" else
as_url(routes.candidate.view, project_name=release.project.name,
version_name=release.version) %}
<a href="{{ release_link }}" class="text-decoration-none">
<div class="card h-100 shadow-sm hover-lift atr-cursor-pointer
page-card">
diff --git a/playwright/test.py b/playwright/test.py
index 96794cf..4413dd5 100644
--- a/playwright/test.py
+++ b/playwright/test.py
@@ -587,8 +587,8 @@ def test_lifecycle_01_add_draft(page: sync_api.Page,
credentials: Credentials) -
sync_api.expect(submit_button_locator).to_be_enabled()
submit_button_locator.click()
- logging.info("Waiting for navigation to
/draft/overview/tooling-test-example/0.1 after adding draft")
- wait_for_path(page, "/draft/overview/tooling-test-example/0.1")
+ logging.info("Waiting for navigation to
/draft/content/tooling-test-example/0.1 after adding draft")
+ wait_for_path(page, "/draft/content/tooling-test-example/0.1")
logging.info("Add draft actions completed successfully")
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]