From 9888c3ad9b6c4e35bf3d3cb319dc165f0157965d Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 26 May 2015 17:22:30 -0400 Subject: [PATCH] Add an endpoint for downloading the logs of a build. --- endpoints/web.py | 31 ++++++++++++++++++-- static/css/directives/ui/build-logs-view.css | 18 ++++++++++++ static/directives/build-logs-view.html | 6 ++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/endpoints/web.py b/endpoints/web.py index 884f4e6ea..6166a7956 100644 --- a/endpoints/web.py +++ b/endpoints/web.py @@ -9,10 +9,11 @@ from health.healthcheck import get_healthchecker from data import model from data.model.oauth import DatabaseAuthorizationProvider -from app import app, billing as stripe, build_logs, avatar, signer +from app import app, billing as stripe, build_logs, avatar, signer, log_archive from auth.auth import require_session_login, process_oauth from auth.permissions import (AdministerOrganizationPermission, ReadRepositoryPermission, - SuperUserPermission, AdministerRepositoryPermission) + SuperUserPermission, AdministerRepositoryPermission, + ModifyRepositoryPermission) from util.invoice import renderInvoiceToPdf from util.seo import render_snapshot @@ -248,6 +249,32 @@ def robots(): return send_from_directory('static', 'robots.txt') +@web.route('/buildlogs/', methods=['GET']) +@route_show_if(features.BUILD_SUPPORT) +@require_session_login +def buildlogs(build_uuid): + build = model.get_repository_build(build_uuid) + if not build: + abort(403) + + repo = build.repository + if not ModifyRepositoryPermission(repo.namespace_user.username, repo.name).can(): + abort(403) + + # If the logs have been archived, just return a URL of the completed archive + if build.logs_archived: + return redirect(log_archive.get_file_url(build.uuid)) + + _, logs = build_logs.get_log_entries(build.uuid, 0) + response = jsonify({ + 'logs': [log for log in logs] + }) + + response.mimetype = "application/json" + response.headers["Content-Disposition"] = "attachment;filename=" + build.uuid + ".json" + return response + + @web.route('/receipt', methods=['GET']) @route_show_if(features.BILLING) @require_session_login diff --git a/static/css/directives/ui/build-logs-view.css b/static/css/directives/ui/build-logs-view.css index e69a3ad57..746a6c1d7 100644 --- a/static/css/directives/ui/build-logs-view.css +++ b/static/css/directives/ui/build-logs-view.css @@ -157,6 +157,24 @@ transition: all 0.15s ease-in-out; } +.build-logs-view .download-button i.fa { + margin-right: 10px; +} + +.build-logs-view .download-button { + position: absolute; + top: 6px; + right: 124px; + z-index: 2; + transition: all 0.15s ease-in-out; +} + +.build-logs-view .download-button:not(:hover) { + background: transparent; + border: 1px solid transparent; + color: #ddd; +} + .build-logs-view .copy-button:not(.zeroclipboard-is-hover) { background: transparent; border: 1px solid transparent; diff --git a/static/directives/build-logs-view.html b/static/directives/build-logs-view.html index f99a7eb00..aa79cec8a 100644 --- a/static/directives/build-logs-view.html +++ b/static/directives/build-logs-view.html @@ -3,6 +3,12 @@ Copy Logs + + Download Logs + +