diff --git a/runbot/controllers/frontend.py b/runbot/controllers/frontend.py index 9756a502..693099ca 100644 --- a/runbot/controllers/frontend.py +++ b/runbot/controllers/frontend.py @@ -3,8 +3,12 @@ import operator import werkzeug from collections import OrderedDict +import werkzeug.utils +import werkzeug.urls + from odoo.addons.http_routing.models.ir_http import slug from odoo.addons.website.controllers.main import QueryURL + from odoo.http import Controller, request, route from ..common import uniq_list, flatten, fqdn from odoo.osv import expression @@ -117,26 +121,23 @@ class Runbot(Controller): context.update({'message': request.env['ir.config_parameter'].sudo().get_param('runbot.runbot_message')}) return request.render('runbot.repo', context) - @route(['/runbot/build//kill'], type='http', auth="user", methods=['POST'], csrf=False) - def build_ask_kill(self, build_id, search=None, **post): - build = request.env['runbot.build'].sudo().browse(build_id) - build._ask_kill() - return werkzeug.utils.redirect('/runbot/repo/%s' % build.repo_id.id + ('?search=%s' % search if search else '')) - - @route(['/runbot/build//wakeup'], type='http', auth="user", methods=['POST'], csrf=False) - def build_wake_up(self, build_id, search=None, **post): - build = request.env['runbot.build'].sudo().browse(build_id) - build._wake_up() - return werkzeug.utils.redirect('/runbot/repo/%s' % build.repo_id.id + ('?search=%s' % search if search else '')) - @route([ - '/runbot/build//force', - '/runbot/build//force/', + '/runbot/build//', + '/runbot/build///', ], type='http', auth="public", methods=['POST'], csrf=False) - def build_force(self, build_id, exact=0, search=None, **post): + def build_force(self, build_id, operation, exact=0, search=None, **post): build = request.env['runbot.build'].sudo().browse(build_id) - build._force(exact=bool(exact)) - return werkzeug.utils.redirect('/runbot/repo/%s' % build.repo_id.id + ('?search=%s' % search if search else '')) + if operation == 'force': + build = build._force(exact=bool(exact)) + elif operation == 'kill': + build._ask_kill() + elif operation == 'wakeup': + build._wake_up() + + qs = '' + if search: + qs = '?' + werkzeug.urls.url_encode({'search': search}) + return werkzeug.utils.redirect(build.build_url + qs) @route(['/runbot/build/'], type='http', auth="public", website=True) def build(self, build_id, search=None, **post): diff --git a/runbot/static/src/js/runbot.js b/runbot/static/src/js/runbot.js index ca775d23..9d3bea88 100644 --- a/runbot/static/src/js/runbot.js +++ b/runbot/static/src/js/runbot.js @@ -1,45 +1,43 @@ (function($) { "use strict"; - $(function() { - $('a.runbot-rebuild').click(function() { - var $f = $('
'), - url = _.str.sprintf('/runbot/build/%s/force', $(this).data('runbot-build')) + window.location.search; - $f.attr('action', url); - $f.appendTo($('body')); - $f.submit(); - return false; - }); - }); - $(function() { - $('a.runbot-rebuild-exact').click(function() { - var $f = $(''), - url = _.str.sprintf('/runbot/build/%s/force/1', $(this).data('runbot-build')) + window.location.search; - $f.attr('action', url); - $f.appendTo($('body')); - $f.submit(); - return false; - }); - }); - $(function() { - $('a.runbot-kill').click(function() { - var $f = $(''), - url = _.str.sprintf('/runbot/build/%s/kill', $(this).data('runbot-build')) + window.location.search; - $f.attr('action', url); - $f.appendTo($('body')); - $f.submit(); - return false; - }); - }); - $(function() { - $('a.runbot-wakeup').click(function() { - var $f = $(''), - url = _.str.sprintf('/runbot/build/%s/wakeup', $(this).data('runbot-build')) + window.location.search; - $f.attr('action', url); - $f.appendTo($('body')); - $f.submit(); - return false; - }); + var OPMAP = { + 'rebuild': {operation: 'force', then: 'redirect'}, + 'rebuild-exact': {operation: 'force/1', then: 'redirect'}, + 'kill': {operation: 'kill', then: 'reload'}, + 'wakeup': {operation: 'wakeup', then: 'reload'} + }; + + $(function () { + $(document).on('click', '[data-runbot]', function (e) { + e.preventDefault(); + + var data = $(this).data(); + var segment = OPMAP[data.runbot]; + if (!segment) { return; } + + // window.location.pathname but compatibility is iffy + var currentPath = window.location.href.replace(window.location.protocol + '//' + window.location.host, '').split('?')[0]; + var buildPath = _.str.sprintf('/runbot/build/%s', data.runbotBuild); + // no responseURL on $.ajax so use native object + var xhr = new XMLHttpRequest(); + xhr.addEventListener('load', function () { + switch (segment.then) { + case 'redirect': + if (currentPath === buildPath && xhr.responseURL) { + window.location.href = xhr.responseURL; + break; + } + // fallthrough to reload if no responseURL or we're + // not on the build's page + case 'reload': + window.location.reload(); + break; + } + }); + xhr.open('POST', _.str.sprintf('%s/%s', buildPath, segment.operation)); + xhr.send(); + }); }); //$(function() { // new Clipboard('.clipbtn'); diff --git a/runbot/templates/build.xml b/runbot/templates/build.xml index 4ffd4974..081903db 100644 --- a/runbot/templates/build.xml +++ b/runbot/templates/build.xml @@ -45,13 +45,13 @@