diff --git a/src/lando/ui/jinja2/stack/pull_request.html b/src/lando/ui/jinja2/stack/pull_request.html new file mode 100644 index 000000000..d647308f4 --- /dev/null +++ b/src/lando/ui/jinja2/stack/pull_request.html @@ -0,0 +1,40 @@ +{% extends "partials/layout.html" %} +{% block page_title %}{{pull_request}}{% endblock %} + +{% block main %} +
+

Pull request {{ pull_request.number }}

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pull request{{ pull_request.number }}
Target Lando Repo{{ target_repo }}
GitHub repo{{ pull_request.head_repo_git_url }}
Author{{ pull_request.user_login }}
State{{ pull_request.state}}
Title{{ pull_request.title }}
Description{{ pull_request.body }}
+
+
+{% endblock %} diff --git a/src/lando/ui/pull_requests.py b/src/lando/ui/pull_requests.py new file mode 100644 index 000000000..60f31e8d4 --- /dev/null +++ b/src/lando/ui/pull_requests.py @@ -0,0 +1,33 @@ +import logging + +from django.core.handlers.wsgi import WSGIRequest +from django.template.response import TemplateResponse + +from lando.main.models import Repo +from lando.ui.views import LandoView +from lando.utils.github import GitHubAPIClient, PullRequest + +logger = logging.getLogger(__name__) + + +class PullRequestView(LandoView): + """A class-based view to handle pull requests in the Lando UI.""" + + def get( + self, request: WSGIRequest, repo_name: str, number: int, *args, **kwargs + ) -> TemplateResponse: + """Handle the GET request for the pull request view.""" + target_repo = Repo.objects.get(name=repo_name) + client = GitHubAPIClient(target_repo) + pull_request = PullRequest(client.get_pull_request(number)) + + context = { + "target_repo": target_repo, + "pull_request": pull_request, + } + + return TemplateResponse( + request=request, + template="stack/pull_request.html", + context=context, + ) diff --git a/src/lando/urls.py b/src/lando/urls.py index 24a56314e..c3e2f08b9 100644 --- a/src/lando/urls.py +++ b/src/lando/urls.py @@ -38,7 +38,7 @@ from lando.try_api.api import ( api as try_api, ) -from lando.ui import jobs +from lando.ui import jobs, pull_requests from lando.ui.legacy import pages, revisions, user_settings urlpatterns = [ @@ -52,6 +52,11 @@ path( "D/", revisions.RevisionView.as_view(), name="revisions-page" ), + path( + "pulls///", + pull_requests.PullRequestView.as_view(), + name="pull-request", + ), path("manage_api_key/", user_settings.manage_api_key, name="user-settings"), path("uplift/", revisions.UpliftRequestView.as_view(), name="uplift-page"), path( diff --git a/src/lando/utils/github.py b/src/lando/utils/github.py index 277ff5217..ac45931e7 100644 --- a/src/lando/utils/github.py +++ b/src/lando/utils/github.py @@ -89,3 +89,60 @@ def list_pull_requests(self) -> list: def get_pull_request(self, pull_number: int) -> dict: """Get a specific pull request from the repo.""" return self._get(f"{self.repo_base_url}/pulls/{pull_number}") + + def get_diff(self, url: str) -> str: + pass + + +class PullRequest: + """A class that parses data returned from the GitHub API for pull requests.""" + + def __repr__(self) -> str: + return f"Pull request #{self.number} ({self.head_repo_git_url})" + + def __init__(self, data: dict): + self.url = data["url"] + self.base_ref = data["base"]["ref"] # "source" branch name + self.base_sha = data["base"]["sha"] # "source" branch sha + self.base_user_login = data["base"]["user"]["login"] + self.base_user_id = data["base"]["user"]["id"] + self.created_at = data["created_at"] + self.updated_at = data["updated_at"] + self.closed_at = data["closed_at"] + self.merged_at = data["merged_at"] + self.diff_url = data["diff_url"] + self.patch_url = data["patch_url"] + self.body = data["body"] # description + self.is_draft = data["draft"] + self.comments_url = data["comments_url"] + self.commits_url = data["commits_url"] + + self.head_ref = data["head"]["ref"] # "destination" branch name + self.head_sha = data["head"]["sha"] + self.head_repo_git_url = data["head"]["repo"][ + "git_url" + ] # e.g., git://github.com/mozilla-conduit/test-repo.git + self.html_url = data["html_url"] + self.id = data["id"] + self.number = data["number"] + self.requested_reviewers = [ + {"id": r["id"], "html_url": r["html_url"], "login": r["login"]} + for r in data["requested_reviewers"] + ] + self.requested_teams = [ + { + "id": r["id"], + "html_url": r["html_url"], + "name": r["name"], + "slug": r["slug"], + "description": r["description"], + } + for r in data["requested_teams"] + ] + + self.state = data["state"] # e.g., "open" + self.title = data["title"] + + self.user_id = data["user"]["id"] + self.user_html_url = data["user"]["html_url"] + self.user_login = data["user"]["login"]