aboutsummaryrefslogtreecommitdiff
path: root/src_py/hatter/ui.py
diff options
context:
space:
mode:
authorbozo.kopic <bozo@kopic.xyz>2022-03-27 20:18:44 +0200
committerbozo.kopic <bozo@kopic.xyz>2022-03-27 20:18:44 +0200
commit1d06423081b04a54d69376f4ac0cea0b40dc5b2d (patch)
tree50469ae88dee87b421dca468b753778b3666ce8f /src_py/hatter/ui.py
parent81e0cbc034e594c73a38202afc0676b3522c6b46 (diff)
WIP server
Diffstat (limited to 'src_py/hatter/ui.py')
-rw-r--r--src_py/hatter/ui.py135
1 files changed, 73 insertions, 62 deletions
diff --git a/src_py/hatter/ui.py b/src_py/hatter/ui.py
index cb827bd..a10eede 100644
--- a/src_py/hatter/ui.py
+++ b/src_py/hatter/ui.py
@@ -22,18 +22,17 @@ async def create(host: str,
app = aiohttp.web.Application()
get_routes = (
aiohttp.web.get(path, handler) for path, handler in (
- ('/', ui._get_root_handler),
- ('/repo/{repo}', ui._get_repo_handler),
- ('/repo/{repo}/commit/{commit}', ui._get_commit_handler)))
+ ('/', ui._process_get_root),
+ ('/repo/{repo}', ui._process_get_repo),
+ ('/repo/{repo}/commit/{commit}', ui._process_get_commit)))
post_routes = (
aiohttp.web.post(path, handler) for path, handler in (
- ('/repo/{repo}/webhook', ui._post_webhook_handler),
- ('/repo/{repo}/add', ui._post_add_handler),
- ('/repo/{repo}/commit/{commit}/rerun', ui._post_rerun_handler),
- ('/repo/{repo}/commit/{commit}/remove', ui._post_remove_handler)))
- app.add_routes([*get_routes,
- *post_routes,
- aiohttp.web.static('/', static_dir)])
+ ('/repo/{repo}/run', ui._process_post_run),
+ ('/repo/{repo}/commit/{commit}/remove', ui._process_post_remove)))
+ webhook_route = aiohttp.web.route('*', '/repo/{repo}/webhook',
+ ui._process_webhook)
+ static_route = aiohttp.web.static('/', static_dir)
+ app.add_routes([*get_routes, *post_routes, webhook_route, static_route])
runner = aiohttp.web.AppRunner(app)
await runner.setup()
@@ -60,70 +59,68 @@ class UI(aio.Resource):
def async_group(self):
return self._async_group
- async def _get_root_handler(self, request):
+ async def _process_get_root(self, request):
commits = await self._server.get_commits(None)
body = (f'{_generate_repos(self._server.repos)}\n'
f'{_generate_commits(commits)}')
return _create_html_response('hatter', body)
- async def _get_repo_handler(self, request):
- repo = _parse_repo(request, self._server.repos)
-
+ async def _process_get_repo(self, request):
+ repo = self._get_repo(request)
commits = await self._server.get_commits(repo)
+ title = f'hatter - {repo}'
body = (f'{_generate_commits(commits)}\n'
- f'{_generate_add(repo)}')
- return _create_html_response(f'hatter - {repo}', body)
-
- async def _get_commit_handler(self, request):
- repo = _parse_repo(request, self._server.repos)
+ f'{_generate_run(repo)}')
+ return _create_html_response(title, body)
- commit_hash = request.match_info['commit']
- commit = await self._server.get_commit(repo, commit_hash)
+ async def _process_get_commit(self, request):
+ commit = await self._get_commit(request)
+ title = f'hatter - {commit.repo}/{commit.hash}'
body = _generate_commit(commit)
- return _create_html_response(f'hatter - {repo}/{commit_hash}', body)
-
- async def _post_webhook_handler(self, request):
- repo = _parse_repo(request, self._server.repos)
-
- self._server.sync_repo(repo)
-
- return aiohttp.web.Response()
+ return _create_html_response(title, body)
- async def _post_add_handler(self, request):
- repo = _parse_repo(request, self._server.repos)
+ async def _process_post_run(self, request):
+ repo = self._get_repo(request)
body = await request.post()
commit_hash = body['hash']
if not commit_hash:
raise aiohttp.web.HTTPBadRequest()
- raise aiohttp.web.HTTPFound(f'/repo/{repo}/commit/{commit_hash}')
+ commit = await self._server.run_commit(repo, commit_hash)
- async def _post_rerun_handler(self, request):
- repo = _parse_repo(request, self._server.repos)
+ url = f'/repo/{commit.repo}/commit/{commit.hash}'
+ raise aiohttp.web.HTTPFound(url)
- commit_hash = request.match_info['commit']
- await self._server.rerun_commit(repo, commit_hash)
+ async def _process_post_remove(self, request):
+ commit = await self._get_commit(request)
- raise aiohttp.web.HTTPFound(f'/repo/{repo}/commit/{commit_hash}')
+ await self._server.remove_commit(commit)
- async def _post_remove_handler(self, request):
- repo = _parse_repo(request, self._server.repos)
+ raise aiohttp.web.HTTPFound(f'/repo/{commit.repo}')
- commit_hash = request.match_info['commit']
- await self._server.remove_commit(repo, commit_hash)
+ async def _process_webhook(self, request):
+ repo = self._get_repo(request)
- raise aiohttp.web.HTTPFound(f'/repo/{repo}')
+ self._server.sync_repo(repo)
+ return aiohttp.web.Response()
+ def _get_repo(self, request):
+ repo = request.match_info['repo']
+ if repo not in self._server.repos:
+ raise aiohttp.web.HTTPBadRequest()
+ return repo
-def _parse_repo(request, repos):
- repo = request.match_info['repo']
- if repo not in repos:
- raise aiohttp.web.HTTPBadRequest()
- return repo
+ async def _get_commit(self, request):
+ repo = self._get_repo(request)
+ commit_hash = request.match_info['commit']
+ commit = await self._server.get_commit(repo, commit_hash)
+ if not commit:
+ raise aiohttp.web.HTTPBadRequest()
+ return commit
def _create_html_response(title, body):
@@ -155,8 +152,8 @@ def _generate_commits(commits):
tbody = '\n'.join(
(f'<tr>\n'
f'<td class="col-change">{_format_time(commit.change)}</td>\n'
- f'<td class="col-repo"><a href="/repo/{commit.repo}">{commit.repo}</a></td>\n' # NOQA
- f'<td class="col-hash"><a href="/repo/{commit.repo}/commit/{commit.hash}">{commit.hash}</a></td>\n' # NOQA
+ f'<td class="col-repo">{_generate_repo_link(commit.repo)}</td>\n'
+ f'<td class="col-hash">{_generate_commit_link(commit)}</td>\n'
f'<td class="col-status">{commit.status.name}</td>\n'
f'</tr>')
for commit in commits)
@@ -175,33 +172,47 @@ def _generate_commits(commits):
def _generate_commit(commit):
- buttons = '\n'.join(
- (f'<form method="post" action="{action}">\n'
- f'<input type="submit" value="{value}">\n'
- f'</form>')
- for value, action in (
- ('Rerun', f'/repo/{commit.repo}/commit/{commit.hash}/rerun'),
- ('Remove', f'/repo/{commit.repo}/commit/{commit.hash}/remove')))
+ run_action = f'/repo/{commit.repo}/run'
+ run_button = (f'<form method="post" action="{run_action}">\n'
+ f'<input type="hidden" name="hash" value="{commit.hash}">\n'
+ f'<input type="submit" value="Run commit">\n'
+ f'</form>')
+
+ remove_action = f'/repo/{commit.repo}/commit/{commit.hash}/remove'
+ remove_button = (f'<form method="post" action="{remove_action}">\n'
+ f'<input type="submit" value="Remove commit">\n'
+ f'</form>')
+
+ repo_link = _generate_repo_link(commit.repo)
return (f'<div class="commit">\n'
- f'<label>Repo:</label><div><a href="/repo/{commit.repo}">{commit.repo}</a></div>\n' # NOQA
+ f'<label>Repo:</label><div>{repo_link}</div>\n'
f'<label>Commit:</label><div>{commit.hash}</div>\n'
f'<label>Change:</label><div>{_format_time(commit.change)}</div>\n'
f'<label>Status:</label><div>{commit.status.name}</div>\n'
f'<label>Output:</label><pre>{commit.output}</pre>\n'
- f'<label></label><div>{buttons}</div>\n'
+ f'<label></label><div>{run_button}{remove_button}</div>\n'
f'</div>')
-def _generate_add(repo):
- return (f'<div class="add">\n'
- f'<form method="post" action="/repo/{repo}/add">\n'
+def _generate_run(repo):
+ return (f'<div class="run">\n'
+ f'<form method="post" action="/repo/{repo}/run">\n'
f'<input type="text" name="hash">\n'
- f'<input type="submit" value="Add commit">\n'
+ f'<input type="submit" value="Run commit">\n'
f'</form>\n'
f'</div>')
+def _generate_repo_link(repo):
+ return f'<a href="/repo/{repo}">{repo}</a>'
+
+
+def _generate_commit_link(commit):
+ url = f'/repo/{commit.repo}/commit/{commit.hash}'
+ return f'<a href="{url}">{commit.hash}</a>'
+
+
def _format_time(t):
return datetime.datetime.fromtimestamp(t).strftime("%Y-%m-%d %H:%M:%S")