dist_templates_DATA = \
src/templates/base.html \
src/templates/index.html \
- src/templates/jobs-abort.html \
src/templates/jobs-buildroot.html \
src/templates/log.html \
src/templates/login.html \
templates_events_modulesdir = $(templates_eventsdir)/modules
+dist_templates_jobs_DATA = \
+ src/templates/jobs/abort.html
+
templates_jobsdir = $(templatesdir)/jobs
dist_templates_jobs_messages_DATA = \
return NotImplemented
+ def has_perm(self, user):
+ """
+ Check permissions
+ """
+ # This is the same as for builds
+ return self.build.has_perm(user)
+
@property
def uuid(self):
return self.data.uuid
if self.has_finished():
return self.data.failed
+ # Abort
+
+ async def abort(self, user=None):
+ """
+ Aborts the job
+ """
+ pass # XXX TODO
+
@property
def message(self):
return self.data.message
+++ /dev/null
-{% extends "base.html" %}
-
-{% block title %}{{ _("Abort build job %s") % job.name }}{% end block %}
-
-{% block body %}
- <h1>{{ _("Abort build job %s") % job.name }}</h1>
- <p>
- {{ _("You may abort a running build.") }}
- {{ _("The build server will eventually stop to build the package.") }}
- </p>
-
- <form method="post" action="">
- {% raw xsrf_form_html() %}
- <table class="form form3">
- <tr>
- <td class="col1">{{ _("Build job") }}</td>
- <td class="col2">
- <a href="/job/{{ job.uuid }}">{{ job.name }}</a>
- </td>
- <td class="col3">
-
- </td>
- </tr>
- <tr>
- <td class="col1">{{ _("Start time") }}</td>
- <td class="col2">
- {% if job.time_started %}
- {{ locale.format_date(job.time_started, full_format=True) }}
- {% else %}
- {{ _("No started, yet.") }}
- {% end %}
- </td>
- <td class="col3">
-
- </td>
- </tr>
- <tr>
- <td class="col1">{{ _("Build server") }}</td>
- <td class="col2">
- <a href="/builders/{{ job.builder.name }}">{{ job.builder.name }}</a>
- </td>
- <td class="col3">
-
- </td>
- </tr>
- <tr>
- <td colspan="3" class="buttons">
- <input type="submit" value="{{ _("Abort build job") }}" />
- </td>
- </tr>
- </table>
- </form>
-{% end block %}
--- /dev/null
+{% extends "../base.html" %}
+
+{% block title %}{{ _("Abort Job %s") % job }}{% end block %}
+
+{% block container %}
+ <nav class="breadcrumb" aria-label="breadcrumbs">
+ <ul>
+ <li>
+ <a href="/builds">{{ _("Builds") }}</a>
+ </li>
+ <li>
+ <a href="/builds/{{ job.build.uuid }}">{{ job.build }}</a>
+ </li>
+ <li>
+ <a href="#" disabled>{{ job.arch }}</a>
+ </li>
+ <li class="is-active">
+ <a href="#" aria-current="page">{{ _("Abort") }}</a>
+ </li>
+ </ul>
+ </nav>
+
+ <div class="columns is-centered">
+ <div class="column is-6">
+ <h1 class="title is-1">{{ _("Abort Job") }}</h1>
+
+ <form method="POST" action="">
+ <div class="box">
+ {% raw xsrf_form_html() %}
+
+ <input class="button is-danger" type="submit"
+ value="{{ _("Abort Job") }}" />
+ </div>
+ </form>
+ </div>
+ </div>
+{% end block %}
<progress class="progress is-small is-light" max="100"></progress>
</div>
- <div class="column is-2">
+ <div class="column is-1">
{{ format_time(job.duration, shorter=True) }}
</div>
+
+ <div class="column is-1">
+ <a class="button is-danger" href="/jobs/{{ job.uuid }}/abort">
+ {{ _("Abort") }}
+ </a>
+ </div>
</div>
{% end %}
</div>
(r"/queue", jobs.QueueHandler),
# Jobs
+ (r"/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", jobs.AbortHandler),
(r"/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/log", jobs.LogHandler),
- (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", jobs.JobAbortHandler),
(r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/buildroot", jobs.JobBuildrootHandler),
# Builders
buildroot_size=buildroot_size)
-class JobAbortHandler(base.BaseHandler):
- def get_job(self, uuid):
+class AbortHandler(base.BaseHandler):
+ @tornado.web.authenticated
+ def get(self, uuid):
job = self.backend.jobs.get_by_uuid(uuid)
if not job:
raise tornado.web.HTTPError(404, "Job not found: %s" % uuid)
- return job
-
- @tornado.web.authenticated
- def get(self, uuid):
- job = self.get_job(uuid)
-
- # XXX Check if user has the right to manage the job.
+ # Check for permissions
+ if not job.has_perm(self.current_user):
+ raise tornado.web.HTTPError(403)
- self.render("jobs-abort.html", job=job)
+ self.render("jobs/abort.html", job=job)
@tornado.web.authenticated
- def post(self, uuid):
- job = self.get_job(uuid)
-
- # XXX Check if user has the right to manage the job.
-
- # Only running builds can be set to aborted state.
- if not job.state == "running":
- # XXX send the user a nicer error message.
- self.redirect("/job/%s" % job.uuid)
- return
+ async def post(self, uuid):
+ job = self.backend.jobs.get_by_uuid(uuid)
+ if not job:
+ raise tornado.web.HTTPError(404, "Job not found: %s" % uuid)
- # Set the job into aborted state.
- job.state = "aborted"
+ # Check for permissions
+ if not job.has_perm(self.current_user):
+ raise tornado.web.HTTPError(403)
- # 0 means the job was aborted by the user.
- job.aborted_state = 0
+ with self.db.transaction():
+ await job.abort(self.current_user)
- self.redirect("/job/%s" % job.uuid)
+ self.redirect("/builds/%s" % job.build.uuid)
class ListModule(ui_modules.UIModule):