Skip to content

Commit 205c909

Browse files
committed
api.views: update pr description on landing triggers (bug 2031664)
1 parent b72b313 commit 205c909

5 files changed

Lines changed: 82 additions & 28 deletions

File tree

src/lando/api/legacy/api/landing_jobs.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
from django.utils.decorators import method_decorator
88
from django.views import View
99

10+
from lando.api.views import generate_enhanced_pr_description
1011
from lando.main.auth import require_authenticated_user
1112
from lando.main.models import JobAction, JobStatus, LandingJob
1213
from lando.utils.exceptions import NotFoundProblemException
14+
from lando.utils.github import GitHubAPIClient
1315

1416
logger = logging.getLogger(__name__)
1517

@@ -99,6 +101,18 @@ def put(self, request: WSGIRequest, job_id: int) -> JsonResponse:
99101
if landing_job.status in (JobStatus.SUBMITTED, JobStatus.DEFERRED):
100102
landing_job.transition_status(JobAction.CANCEL)
101103
landing_job.save()
104+
if landing_job.is_pull_request_job:
105+
client = GitHubAPIClient(landing_job.target_repo.url)
106+
for revision in landing_job.revisions:
107+
pull_request = client.build_pull_request(revision.pull_number)
108+
description = generate_enhanced_pr_description(
109+
pull_request,
110+
landing_job.target_repo,
111+
template="pr_description_landing.md",
112+
)
113+
client.update_pull_request_body(
114+
revision.pull_number, description
115+
)
102116
return JsonResponse({"id": landing_job.id})
103117
else:
104118
data = {

src/lando/api/legacy/workers/landing_worker.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ def run_job(self, job: LandingJob) -> bool:
9797
True: The job finished processing and is in a permanent state.
9898
False: The job encountered a temporary failure and should be tried again.
9999
"""
100+
from lando.api.views import generate_enhanced_pr_description
101+
100102
repo: Repo = job.target_repo
101103
scm = repo.scm
102104

@@ -139,6 +141,13 @@ def run_job(self, job: LandingJob) -> bool:
139141
pull_number = job.revisions.first().pull_number
140142
message = f"Pull request closed by commit {commit_id}"
141143
client = GitHubAPIClient(job.target_repo.url)
144+
pull_request = client.build_pull_request(pull_number)
145+
description = generate_enhanced_pr_description(
146+
pull_request,
147+
job.target_repo,
148+
template="pr_description_landing.md",
149+
)
150+
client.update_pull_request_body(pull_number, description)
142151
client.add_comment_to_pull_request(pull_number, message)
143152
client.close_pull_request(pull_number)
144153

src/lando/api/views.py

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,45 @@ def generate_warnings_and_blockers(
9999
return {"warnings": warnings, "blockers": blockers}
100100

101101

102+
def generate_enhanced_pr_description(
103+
pull_request: PullRequest,
104+
target_repo: Repo,
105+
request: WSGIRequest = None,
106+
template: str = "pr_description.md",
107+
) -> str:
108+
context = {}
109+
if request:
110+
context.update(
111+
generate_warnings_and_blockers(target_repo, pull_request, request)
112+
)
113+
114+
context["landing_status"] = str(
115+
get_pull_request_last_landing_job_status(target_repo.name, pull_request.number)
116+
).lower()
117+
118+
path = reverse(
119+
"pull-request",
120+
kwargs={
121+
"repo_name": target_repo.name,
122+
"number": pull_request.number,
123+
},
124+
)
125+
126+
context["lando_url"] = f"{settings.SITE_URL}{path}"
127+
context["special_delimiter"] = SPECIAL_DELIMITER
128+
bugs = parse_bugs(pull_request.title)
129+
context["bugs"] = []
130+
131+
for bug in bugs:
132+
context["bugs"].append((bug, f"{settings.BUGZILLA_URL}/{bug}"))
133+
134+
context["title"] = pull_request.title
135+
context["body"] = pull_request.parsed_body
136+
137+
rendered = render_to_string(template, context)
138+
return rendered
139+
140+
102141
@method_decorator(csrf_exempt, name="dispatch")
103142
class LegacyDiffWarningView(View):
104143
"""
@@ -233,10 +272,10 @@ def get(
233272
self, request: WSGIRequest, repo_name: int, pull_number: int
234273
) -> JsonResponse:
235274
"""Return the status of a pull request based on landing job counts."""
236-
status = str(
275+
landing_status = str(
237276
get_pull_request_last_landing_job_status(repo_name, pull_number)
238277
).lower()
239-
return JsonResponse({"status": status}, status=200)
278+
return JsonResponse({"status": landing_status}, status=200)
240279

241280
@method_decorator(require_authenticated_user)
242281
def post(
@@ -302,6 +341,14 @@ class Form(forms.Form):
302341
job.status = JobStatus.SUBMITTED
303342
job.save()
304343

344+
description = generate_enhanced_pr_description(
345+
self.pull_request,
346+
self.target_repo,
347+
request,
348+
template="pr_description_landing.md",
349+
)
350+
self.client.update_pull_request_body(pull_number, description)
351+
305352
return JsonResponse({"id": job.id}, status=201)
306353

307354

@@ -378,30 +425,10 @@ def get(
378425
if not request.user.has_perm("main.can_change_landing_job"):
379426
raise PermissionError()
380427

381-
context = {}
382-
context.update(
383-
generate_warnings_and_blockers(self.target_repo, self.pull_request, request)
428+
description = generate_enhanced_pr_description(
429+
self.pull_request, self.target_repo, request
384430
)
385-
386-
path = reverse(
387-
"pull-request",
388-
kwargs={
389-
"repo_name": self.target_repo.name,
390-
"number": self.pull_request.number,
391-
},
431+
self.client.update_pull_request_body(pull_number, description)
432+
return JsonResponse(
433+
{"status": f"Pull request {pull_number} description updated."}
392434
)
393-
394-
context["lando_url"] = f"{settings.SITE_URL}{path}"
395-
context["special_delimiter"] = SPECIAL_DELIMITER
396-
bugs = parse_bugs(self.pull_request.title)
397-
context["bugs"] = []
398-
399-
for bug in bugs:
400-
context["bugs"].append((bug, f"{settings.BUGZILLA_URL}/{bug}"))
401-
402-
context["title"] = self.pull_request.title
403-
context["body"] = self.pull_request.parsed_body
404-
405-
rendered = render_to_string("pr_description.md", context)
406-
self.client.update_pull_request_body(pull_number, rendered)
407-
return JsonResponse({"context": context, "md": rendered})

src/lando/ui/jinja2/pr_description.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
{% endfor %}
1212
{% endmacro %}
1313

14-
{% block upper %}
1514
Lando: [link]({{ lando_url }})
1615
{% if bugs %}Bugzilla: {% for bug in bugs %}[bug {{ bug.0 }}]({{ bug.1 }}){% endfor %}{% endif %}
1716

17+
{% block upper %}
1818
{% if not warnings and not blockers %}
1919
:white_check_mark: All Lando checks passed
2020
{% endif %}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% extends "pr_description.md" %}
2+
{% block upper %}
3+
**Landing request {{ landing_status }}**
4+
{% endblock %}

0 commit comments

Comments
 (0)