From 3368ab7540e4a27b6dd4cabbe638ca5c39dc070d Mon Sep 17 00:00:00 2001 From: Benjamin Bertrand <benjamin.bertrand@esss.se> Date: Mon, 2 Jul 2018 13:29:32 +0200 Subject: [PATCH] Add task blueprint Allow to display tasks JIRA INFRA-403 --- app/factory.py | 4 ++- app/static/js/tasks.js | 30 ++++++++++++++++++++++ app/task/__init__.py | 0 app/task/views.py | 42 +++++++++++++++++++++++++++++++ app/templates/base-fluid.html | 3 +++ app/templates/base.html | 1 + app/templates/task/tasks.html | 35 ++++++++++++++++++++++++++ app/templates/task/view_task.html | 30 ++++++++++++++++++++++ 8 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 app/static/js/tasks.js create mode 100644 app/task/__init__.py create mode 100644 app/task/views.py create mode 100644 app/templates/task/tasks.html create mode 100644 app/templates/task/view_task.html diff --git a/app/factory.py b/app/factory.py index b611657..566091d 100644 --- a/app/factory.py +++ b/app/factory.py @@ -21,6 +21,7 @@ from .admin.views import (AdminModelView, ItemAdmin, UserAdmin, TokenAdmin, from .main.views import bp as main from .inventory.views import bp as inventory from .network.views import bp as network +from .task.views import bp as task from .user.views import bp as user from .api.user import bp as user_api from .api.inventory import bp as inventory_api @@ -112,11 +113,12 @@ def create_app(config=None): admin.add_view(AdminModelView(models.Mac, db.session)) admin.add_view(AdminModelView(models.Cname, db.session)) admin.add_view(AdminModelView(models.Tag, db.session)) - admin.add_view(TaskAdmin(models.Task, db.session)) + admin.add_view(TaskAdmin(models.Task, db.session, endpoint='tasks')) app.register_blueprint(main) app.register_blueprint(inventory, url_prefix='/inventory') app.register_blueprint(network, url_prefix='/network') + app.register_blueprint(task, url_prefix='/task') app.register_blueprint(user, url_prefix='/user') app.register_blueprint(user_api, url_prefix='/api/v1/user') app.register_blueprint(inventory_api, url_prefix='/api/v1/inventory') diff --git a/app/static/js/tasks.js b/app/static/js/tasks.js new file mode 100644 index 0000000..de87469 --- /dev/null +++ b/app/static/js/tasks.js @@ -0,0 +1,30 @@ +$(document).ready(function() { + + var tasks_table = $("#tasks_table").DataTable({ + "ajax": function(data, callback, settings) { + $.getJSON( + $SCRIPT_ROOT + "/task/_retrieve_tasks", + function(json) { + callback(json); + }); + }, + "pagingType": "full_numbers", + "pageLength": 20, + "lengthMenu": [[20, 50, 100, -1], [20, 50, 100, "All"]], + "order": [[2, 'desc']], + "columnDefs": [ + { + "targets": [0], + "render": function(data, type, row) { + // render funtion to create link to Task view page + if ( data === null ) { + return data; + } + var url = $SCRIPT_ROOT + "/task/tasks/view/" + data; + return '<a href="'+ url + '">' + data + '</a>'; + } + } + ] + }); + +}); diff --git a/app/task/__init__.py b/app/task/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/task/views.py b/app/task/views.py new file mode 100644 index 0000000..ad3f427 --- /dev/null +++ b/app/task/views.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +""" +app.task.views +~~~~~~~~~~~~~~ + +This module implements the task blueprint. + +:copyright: (c) 2018 European Spallation Source ERIC +:license: BSD 2-Clause, see LICENSE for more details. + +""" +from flask import Blueprint, render_template, jsonify +from flask_login import login_required, current_user +from .. import utils, models + +bp = Blueprint('task', __name__) + + +@bp.route('/tasks') +@login_required +def list_tasks(): + return render_template('task/tasks.html') + + +@bp.route('/tasks/view/<id_>') +@login_required +def view_task(id_): + task = models.Task.query.get_or_404(id_) + return render_template('task/view_task.html', task=task) + + +@bp.route('/_retrieve_tasks') +@login_required +def retrieve_tasks(): + data = [(task.id, + task.name, + utils.format_field(task.created_at), + task.status.name, + task.command, + str(task.user)) + for task in current_user.get_tasks()] + return jsonify(data=data) diff --git a/app/templates/base-fluid.html b/app/templates/base-fluid.html index b425f06..44b29d3 100644 --- a/app/templates/base-fluid.html +++ b/app/templates/base-fluid.html @@ -25,6 +25,9 @@ href="{{ url_for('network.list_scopes') }}">Network Scopes</a> <a class="list-group-item list-group-item-action {{ is_active(path.startswith("/network/domains")) }}" href="{{ url_for('network.list_domains') }}">Domains</a> + {% elif path.startswith("/task") %} + <a class="list-group-item list-group-item-action {{ is_active(path.startswith("/task/tasks")) }}" + href="{{ url_for('task.list_tasks') }}">Tasks</a> {% endif %} </div> </div> diff --git a/app/templates/base.html b/app/templates/base.html index 158126a..4b2426f 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -28,6 +28,7 @@ {% set path = request.path %} <a class="nav-item nav-link {{ is_active(path.startswith("/inventory")) }}" href="{{ url_for('inventory.list_items') }}">Inventory</a> <a class="nav-item nav-link {{ is_active(path.startswith("/network")) }}" href="{{ url_for('network.list_hosts') }}">Network</a> + <a class="nav-item nav-link {{ is_active(path.startswith("/task")) }}" href="{{ url_for('task.list_tasks') }}">Task</a> {% if current_user.is_authenticated and current_user.is_admin %} <a class="nav-item nav-link" href="{{ url_for('admin.index') }}">Admin</a> <a class="nav-item nav-link" href="{{ url_for('rq_dashboard.overview') }}">RQ Dashboard</a> diff --git a/app/templates/task/tasks.html b/app/templates/task/tasks.html new file mode 100644 index 0000000..d6a4159 --- /dev/null +++ b/app/templates/task/tasks.html @@ -0,0 +1,35 @@ +{% extends "base-fluid.html" %} +{% from "_helpers.html" import is_active %} + +{% block title %}Tasks - CSEntry{% endblock %} + +{% block main %} + {% set path = request.path %} + <ul class="nav nav-tabs"> + <li class="nav-item"> + <a class="nav-link {{ is_active(path.endswith("/task/tasks")) }}" href="{{ url_for('task.list_tasks') }}">List tasks</a> + </li> + {% block tasks_nav %}{% endblock %} + </ul> + + <br> + + {% block tasks_main %} + <table id="tasks_table" class="table table-bordered table-hover table-sm" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Id</th> + <th>Name</th> + <th>Created at</th> + <th>Status</th> + <th>Command</th> + <th>User</th> + </tr> + </thead> + </table> + {%- endblock %} +{%- endblock %} + +{% block csentry_scripts %} + <script src="{{ url_for('static', filename='js/tasks.js') }}"></script> +{% endblock %} diff --git a/app/templates/task/view_task.html b/app/templates/task/view_task.html new file mode 100644 index 0000000..ff1bee2 --- /dev/null +++ b/app/templates/task/view_task.html @@ -0,0 +1,30 @@ +{% extends "task/tasks.html" %} + +{% block title %}View Task - CSEntry{% endblock %} + +{% block tasks_nav %} + <li class="nav-item"> + <a class="nav-link active" href="{{ url_for('task.view_task', id_=task.id) }}">View task</a> + </li> +{% endblock %} + +{% block tasks_main %} + <div class="row"> + <div class="col-sm-9"> + <dl class="row"> + <dt class="col-sm-3">Id</dt> + <dd class="col-sm-9">{{ task.id }}</dd> + <dt class="col-sm-3">Name</dt> + <dd class="col-sm-9">{{ task.name }}</dd> + <dt class="col-sm-3">Created at</dt> + <dd class="col-sm-9">{{ task.created_at }}</dd> + <dt class="col-sm-3">Status</dt> + <dd class="col-sm-9">{{ task.status.name }}</dd> + <dt class="col-sm-3">Command</dt> + <dd class="col-sm-9">{{ task.command }}</dd> + <dt class="col-sm-3">User</dt> + <dd class="col-sm-9">{{ task.user }}</dd> + </dl> + </div> + </div> +{%- endblock %} -- GitLab