mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00
bitbake: toaster: Remove old bldviewer application
The SimpleUI is obsolete and not maintained. It should be deleted as there is no use to it. [YOCTO #7709] (Bitbake rev: 10b7c359613629bf6e3465234512990ba4742c48) Signed-off-by: Michael Wood <michael.g.wood@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
c5a16235b8
commit
ec8bd70b27
|
@ -1,44 +0,0 @@
|
|||
#
|
||||
# ex:ts=4:sw=4:sts=4:et
|
||||
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 Intel Corporation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
from django.conf.urls import patterns, include, url
|
||||
|
||||
|
||||
urlpatterns = patterns('bldviewer.views',
|
||||
url(r'^builds$', 'model_explorer', {'model_name':'build'}, name='builds'),
|
||||
url(r'^targets$', 'model_explorer', {'model_name':'target'}, name='targets'),
|
||||
url(r'^target_files$', 'model_explorer', {'model_name':'target_file'}, name='target_file'),
|
||||
url(r'^target_image_file$', 'model_explorer', {'model_name':'target_image_file'}, name='target_image_file'),
|
||||
url(r'^tasks$', 'model_explorer', {'model_name':'task'}, name='task'),
|
||||
url(r'^task_dependencies$', 'model_explorer', {'model_name':'task_dependency'}, name='task_dependencies'),
|
||||
url(r'^packages$', 'model_explorer', {'model_name':'package'}, name='package'),
|
||||
url(r'^package_dependencies$', 'model_explorer', {'model_name':'package_dependency'}, name='package_dependency'),
|
||||
url(r'^target_packages$', 'model_explorer', {'model_name':'target_installed_package'}, name='target_packages'),
|
||||
url(r'^target_installed_packages$', 'model_explorer', {'model_name':'target_installed_package'}, name='target_installed_package'),
|
||||
url(r'^package_files$', 'model_explorer', {'model_name':'build_file'}, name='build_file'),
|
||||
url(r'^layers$', 'model_explorer', {'model_name':'layer'}, name='layer'),
|
||||
url(r'^layerversions$', 'model_explorer', {'model_name':'layerversion'}, name='layerversion'),
|
||||
url(r'^recipes$', 'model_explorer', {'model_name':'recipe'}, name='recipe'),
|
||||
url(r'^recipe_dependencies$', 'model_explorer', {'model_name':'recipe_dependency'}, name='recipe_dependencies'),
|
||||
url(r'^variables$', 'model_explorer', {'model_name':'variable'}, name='variables'),
|
||||
url(r'^variableshistory$', 'model_explorer', {'model_name':'variablehistory'}, name='variablehistory'),
|
||||
url(r'^logmessages$', 'model_explorer', {'model_name':'logmessage'}, name='logmessages'),
|
||||
)
|
4797
bitbake/lib/toaster/bldviewer/static/css/bootstrap.css
vendored
4797
bitbake/lib/toaster/bldviewer/static/css/bootstrap.css
vendored
File diff suppressed because it is too large
Load Diff
1982
bitbake/lib/toaster/bldviewer/static/js/bootstrap.js
vendored
1982
bitbake/lib/toaster/bldviewer/static/js/bootstrap.js
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -1,30 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
{% load static %}
|
||||
<html>
|
||||
<head>
|
||||
<title>Toaster Simple Explorer</title>
|
||||
<script src="{% static 'js/jquery-2.0.3.js' %}">
|
||||
</script>
|
||||
<script src="{% static 'js/bootstrap.js' %}">
|
||||
</script>
|
||||
<link href="{% static 'css/bootstrap.css' %}" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
||||
<body style="height: 100%">
|
||||
<div style="width:100%; height: 100%; position:absolute">
|
||||
<div style="width: 100%; height: 3em" class="nav">
|
||||
<ul class="nav nav-tabs">
|
||||
<li><a href="{% url "simple-all-builds" %}">All Builds</a></li>
|
||||
<li><a href="{% url "simple-all-layers" %}">All Layers</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="overflow-y:scroll; width: 100%; position: absolute; top: 3em; bottom:70px ">
|
||||
{% block pagecontent %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
<div class="navbar" style="position: absolute; bottom: 0; width:100%"><br/>About Toaster | Yocto Project </div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
{% extends "simple_basetable.html" %}
|
||||
|
||||
{% block pagename %}
|
||||
<ul class="nav nav-tabs" style="display: inline-block">
|
||||
<li><a>Build {{build.target_set.all|join:" "}} at {{build.started_on}} : </a></li>
|
||||
<li><a href="{% url "simple-task" build.id %}"> Tasks </a></li>
|
||||
<li><a href="{% url "simple-bpackage" build.id %}"> Build Packages </a></li>
|
||||
{% for t in build.target_set.all %}
|
||||
{% if t.is_image %}
|
||||
<li><a href="{% url "simple-tpackage" build.id t.pk %}"> Packages for {{t.target}} </a> </li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<li><a href="{% url "simple-configuration" build.id %}"> Configuration </a> </li>
|
||||
</ul>
|
||||
<h1>Toaster - Build {% block pagetitle %} {% endblock %}</h1>
|
||||
{% endblock %}
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
{% extends "simple_base.html" %}
|
||||
|
||||
{% block pagecontent %}
|
||||
<script>
|
||||
function showhideTableColumn(i, sh) {
|
||||
if (sh)
|
||||
$('td:nth-child('+i+'),th:nth-child('+i+')').show();
|
||||
else
|
||||
$('td:nth-child('+i+'),th:nth-child('+i+')').hide();
|
||||
}
|
||||
|
||||
|
||||
function filterTableRows(test) {
|
||||
if (test.length > 0) {
|
||||
var r = test.split(/[ ,]+/).map(function (e) { return new RegExp(e, 'i') });
|
||||
$('tr.data').map( function (i, el) {
|
||||
(! r.map(function (j) { return j.test($(el).html())}).reduce(function (c, p) { return c && p;} )) ? $(el).hide() : $(el).show();
|
||||
});
|
||||
} else
|
||||
{
|
||||
$('tr.data').show();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<div style="margin-bottom: 0.5em">
|
||||
|
||||
{% block pagename %}
|
||||
{% endblock %}
|
||||
<div align="left" style="display:inline-block; width: 40%; margin-left: 2em"> Filter: <input type="search" id="filterstring" style="width: 80%" onkeyup="filterTableRows($('#filterstring').val())" autocomplete="off">
|
||||
</div>
|
||||
{% if hideshowcols %}
|
||||
<div align="right" style="display: inline-block; width: 40%">Show/Hide columns:
|
||||
{% for i in hideshowcols %}
|
||||
<span>{{i.name}} <input type="checkbox" id="ct{{i.name}}" onchange="showhideTableColumn({{i.order}}, $('#ct{{i.name}}').is(':checked'))" checked autocomplete="off"></span> |
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div style="display: block; float:right; margin-left: auto; margin-right:5em"><span class="pagination" style="vertical-align: top; margin-right: 3em">Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries. </span>
|
||||
<ul class="pagination" style="display: block-inline">
|
||||
{%if objects.has_previous %}
|
||||
<li><a href="?page={{objects.previous_page_number}}">«</a></li>
|
||||
{%else%}
|
||||
<li class="disabled"><a href="#">«</a></li>
|
||||
{%endif%}
|
||||
{% for i in objects.page_range %}
|
||||
<li{%if i == objects.number %} class="active" {%endif%}><a href="?page={{i}}">{{i}}</a></li>
|
||||
{% endfor %}
|
||||
{%if objects.has_next%}
|
||||
<li><a href="?page={{objects.next_page_number}}">»</a></li>
|
||||
{%else%}
|
||||
<li class="disabled"><a href="#">»</a></li>
|
||||
{%endif%}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<table class="table table-striped table-condensed" style="width:95%">
|
||||
{% block pagetable %}
|
||||
{% endblock %}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -1,24 +0,0 @@
|
|||
{% extends "simple_basebuildpage.html" %}
|
||||
|
||||
{% block pagetitle %}Files for package {{objects.0.bpackage.name}} {% endblock %}
|
||||
{% block pagetable %}
|
||||
{% if not objects %}
|
||||
<p>No files were recorded for this package!</p>
|
||||
{% else %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Size (Bytes)</th>
|
||||
</tr>
|
||||
|
||||
{% for file in objects %}
|
||||
|
||||
<tr class="data">
|
||||
<td>{{file.path}}</td>
|
||||
<td>{{file.size}}</td>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,44 +0,0 @@
|
|||
{% extends "simple_basebuildpage.html" %}
|
||||
|
||||
{% block pagetitle %}Packages{% endblock %}
|
||||
{% block pagetable %}
|
||||
{% if not objects %}
|
||||
<p>No packages were recorded for this target!</p>
|
||||
{% else %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Version</th>
|
||||
<th>Recipe</th>
|
||||
<th>Summary</th>
|
||||
<th>Section</th>
|
||||
<th>Description</th>
|
||||
<th>Size on host disk (Bytes)</th>
|
||||
<th>License</th>
|
||||
<th>Dependencies List (all)</th>
|
||||
</tr>
|
||||
|
||||
{% for package in objects %}
|
||||
|
||||
<tr class="data">
|
||||
<td><a name="#{{package.name}}" href="{% url "simple-bfile" build.pk package.pk %}">{{package.name}} ({{package.filelist_bpackage.count}} files)</a></td>
|
||||
<td>{{package.version}}-{{package.revision}}</td>
|
||||
<td>{%if package.recipe%}<a href="{% url "simple-layer_versions_recipes" package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td>
|
||||
|
||||
<td>{{package.summary}}</td>
|
||||
<td>{{package.section}}</td>
|
||||
<td>{{package.description}}</td>
|
||||
<td>{{package.size}}</td>
|
||||
<td>{{package.license}}</td>
|
||||
<td>
|
||||
<div style="height: 3em; overflow:auto">
|
||||
{% for bpd in package.package_dependencies_source.all %}
|
||||
{{bpd.dep_type}}: {{bpd.depends_on.name}} <br/>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,43 +0,0 @@
|
|||
{% extends "simple_basetable.html" %}
|
||||
|
||||
{% block pagename %}
|
||||
<h1>Toaster - Builds</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block pagetable %}
|
||||
|
||||
{% load simple_projecttags %}
|
||||
<tr>
|
||||
<th>Outcome</th>
|
||||
<th>Started On</th>
|
||||
<th>Completed On</th>
|
||||
<th>Target</th>
|
||||
<th>Machine</th>
|
||||
<th>Time</th>
|
||||
<th>Errors</th>
|
||||
<th>Warnings</th>
|
||||
<th>Output</th>
|
||||
<th>Log</th>
|
||||
<th>Bitbake Version</th>
|
||||
<th>Build Name</th>
|
||||
</tr>
|
||||
{% for build in objects %}
|
||||
<tr class="data">
|
||||
<td><a href="{% url "simple-configuration" build.id %}">{{build.get_outcome_display}}</a></td>
|
||||
<td>{{build.started_on}}</td>
|
||||
<td>{{build.completed_on}}</td>
|
||||
<td>{% for t in build.target_set.all %}{%if t.is_image %}<a href="{% url "simple-tpackage" build.id t.id %}">{% endif %}{{t.target}}{% if t.is_image %}</a>{% endif %}<br/>{% endfor %}</td>
|
||||
<td>{{build.machine}}</td>
|
||||
<td>{% time_difference build.started_on build.completed_on %}</td>
|
||||
<td>{{build.errors_no}}:{% if build.errors_no %}{% for error in logs %}{% if error.build == build %}{% if error.level == 2 %}<p>{{error.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
|
||||
<td>{{build.warnings_no}}:{% if build.warnings_no %}{% for warning in logs %}{% if warning.build == build %}{% if warning.level == 1 %}<p>{{warning.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
|
||||
<td>TBD: determine image file list</td>
|
||||
<td>{{build.cooker_log_path}}</td>
|
||||
<td>{{build.bitbake_version}}</td>
|
||||
<td>{{build.build_name}}</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
{% extends "simple_basebuildpage.html" %}
|
||||
|
||||
{% block pagetitle %}Configuration{% endblock %}
|
||||
{% block pagetable %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Definition history</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
|
||||
{% for variable in objects %}
|
||||
|
||||
<tr class="data">
|
||||
<td>{{variable.variable_name}}</td>
|
||||
<td>{% if variable.description %}{{variable.description}}{% endif %}</td>
|
||||
<td>{% for vh in variable.variablehistory_set.all %}{{vh.operation}} in {{vh.file_name}}:{{vh.line_number}}<br/>{%endfor%}</td>
|
||||
<td>{{variable.variable_value}}</td>
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,34 +0,0 @@
|
|||
{% extends "simple_basetable.html" %}
|
||||
|
||||
{% block pagename %}
|
||||
<h1>Toaster - Layers</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block pagetable %}
|
||||
{% load simple_projecttags %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Local Path</th>
|
||||
<th>Layer Index URL</th>
|
||||
<th>Known Versions</th>
|
||||
</tr>
|
||||
|
||||
{% for layer in objects %}
|
||||
|
||||
<tr class="data">
|
||||
<td>{{layer.name}}</td>
|
||||
<td>{{layer.local_path}}</td>
|
||||
<td><a href='{{layer.layer_index_url}}'>{{layer.layer_index_url}}</a></td>
|
||||
<td><table>
|
||||
{% for lv in layer.versions %}
|
||||
<tr><td>
|
||||
<a href="{% url "simple-layer_versions_recipes" lv.id %}">({{lv.priority}}){{lv.branch}}:{{lv.commit}} ({{lv.count}} recipes)</a>
|
||||
</td></tr>
|
||||
{% endfor %}
|
||||
</table></td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,36 +0,0 @@
|
|||
{% extends "simple_basebuildpage.html" %}
|
||||
|
||||
{% block pagetable %}
|
||||
{% if not objects %}
|
||||
<p>No packages were recorded for this target!</p>
|
||||
{% else %}
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Version</th>
|
||||
<th>Size (Bytes)</th>
|
||||
<th>Recipe</th>
|
||||
<th>Depends on</th>
|
||||
</tr>
|
||||
|
||||
{% for package in objects %}
|
||||
|
||||
<tr class="data">
|
||||
<td><a name="#{{package.name}}">{{package.name}}</a></td>
|
||||
<td>{{package.version}}</td>
|
||||
<td>{{package.size}}</td>
|
||||
<td>{%if package.recipe %}<a name="{{package.recipe.name}}.{{package.package_name}}">
|
||||
<a href="{% url "simple-layer_versions_recipes" package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td>
|
||||
<td>
|
||||
<div style="height: 4em; overflow:auto">
|
||||
{% for d in package.package_dependencies_source.all %}
|
||||
<a href="#{{d.name}}">{{d.depends_on.name}}</a><br/>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,50 +0,0 @@
|
|||
{% extends "simple_basetable.html" %}
|
||||
|
||||
{% block pagename %}
|
||||
<ul class="nav nav-tabs" style="display: inline-block">
|
||||
<li><a>Layer {{layer_version.layer.name}} : {{layer_version.branch}} : {{layer_version.commit}} : {{layer_version.priority}}</a></li>
|
||||
</ul>
|
||||
<h1>Toaster - Recipes for a Layer</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block pagetable %}
|
||||
{% load simple_projecttags %}
|
||||
|
||||
<tr>
|
||||
</tr>
|
||||
<th>Name</th>
|
||||
<th>Version</th>
|
||||
<th>Summary</th>
|
||||
<th>Description</th>
|
||||
<th>Section</th>
|
||||
<th>License</th>
|
||||
<th>Homepage</th>
|
||||
<th>Bugtracker</th>
|
||||
<th>File_path</th>
|
||||
<th style="width: 30em">Recipe Dependency</th>
|
||||
|
||||
|
||||
{% for recipe in objects %}
|
||||
|
||||
<tr class="data">
|
||||
<td><a name="{{recipe.name}}">{{recipe.name}}</a></td>
|
||||
<td>{{recipe.version}}</td>
|
||||
<td>{{recipe.summary}}</td>
|
||||
<td>{{recipe.description}}</td>
|
||||
<td>{{recipe.section}}</td>
|
||||
<td>{{recipe.license}}</td>
|
||||
<td>{{recipe.homepage}}</td>
|
||||
<td>{{recipe.bugtracker}}</td>
|
||||
<td>{{recipe.file_path}}</td>
|
||||
<td>
|
||||
<div style="height: 5em; overflow:auto">
|
||||
{% for rr in recipe.r_dependencies_recipe.all %}
|
||||
<a href="#{{rr.depends_on.name}}">{{rr.depends_on.name}}</a><br/>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,71 +0,0 @@
|
|||
{% extends "simple_basebuildpage.html" %}
|
||||
|
||||
{% block pagetitle %}Tasks{% endblock %}
|
||||
{% block pagetable %}
|
||||
{% if not objects %}
|
||||
<p>No tasks were executed in this build!</p>
|
||||
{% else %}
|
||||
|
||||
<tr>
|
||||
<th>Order</th>
|
||||
<th>Task</th>
|
||||
<th>Recipe Version</th>
|
||||
<th>Task Type</th>
|
||||
<th>Checksum</th>
|
||||
<th>Outcome</th>
|
||||
<th>Message</th>
|
||||
<th>Time</th>
|
||||
<th>CPU usage</th>
|
||||
<th>Disk I/O</th>
|
||||
<th>Script type</th>
|
||||
<th>Filesystem</th>
|
||||
<th>Depends</th>
|
||||
</tr>
|
||||
|
||||
{% for task in objects %}
|
||||
|
||||
<tr class="data">
|
||||
<td>{{task.order}}</td>
|
||||
<td><a name="{{task.recipe.name}}.{{task.task_name}}">
|
||||
<a href="{% url "simple-layer_versions_recipes" task.recipe.layer_version_id %}#{{task.recipe.name}}">{{task.recipe.name}}</a>.{{task.task_name}}</a></td>
|
||||
<td>{{task.recipe.version}}</td>
|
||||
|
||||
{% if task.task_executed %}
|
||||
<td>Executed</td>
|
||||
{% else %}
|
||||
<td>Not Executed</td>
|
||||
{% endif %}
|
||||
|
||||
<td>{{task.sstate_checksum}}</td>
|
||||
<td>{{task.get_outcome_display}}{% if task.provider %}</br>(by <a href="#{{task.provider.recipe.name}}.{{task.provider.task_name}}">{{task.provider.recipe.name}}.{{task.provider.task_name}}</a>){% endif %}
|
||||
{% if task.outcome == task.OUTCOME_CACHED %}{% for t in task.get_related_setscene %}
|
||||
<br/>({{t.task_name}} {{t.get_outcome_display}})
|
||||
{% endfor %}{%endif%}
|
||||
</td>
|
||||
<td><p>{{task.message}}</td>
|
||||
<td>{{task.elapsed_time}}</td>
|
||||
<td>{{task.cpu_usage}}</td>
|
||||
<td>{{task.disk_io}}</td>
|
||||
<td>{{task.get_script_type_display}}</td>
|
||||
<td> <table>
|
||||
<tr><td> Recipe</td><td><a target="_fileview" href="file:///{{task.recipe.file_path}}">{{task.recipe.file_path}}</a></td></tr>
|
||||
<tr><td> Source</td><td><a target="_fileview" href="file:///{{task.file_name}}">{{task.file_name}}:{{task.line_number}}</a></td></tr>
|
||||
<tr><td> Workdir</td><td><a target="_fileview" href="file:///{{task.work_directory}}">{{task.work_directory}}</a></td></tr>
|
||||
<tr><td> Log</td><td><a target="_fileview" href="file:///{{task.logfile}}">{{task.logfile}}</a><br/></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<div style="height: 3em; overflow:auto">
|
||||
{% for tt in task.task_dependencies_task.all %}
|
||||
<a href="#{{tt.depends_on.recipe.name}}.{{tt.depends_on.task_name}}">
|
||||
{{tt.depends_on.recipe.name}}.{{tt.depends_on.task_name}}</a><br/>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,29 +0,0 @@
|
|||
#
|
||||
# ex:ts=4:sw=4:sts=4:et
|
||||
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 Intel Corporation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
from datetime import datetime
|
||||
from django import template
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.simple_tag
|
||||
def time_difference(start_time, end_time):
|
||||
return end_time - start_time
|
|
@ -1,345 +0,0 @@
|
|||
"""
|
||||
This file demonstrates writing tests using the unittest module. These will pass
|
||||
when you run "manage.py test".
|
||||
|
||||
Replace this with more appropriate tests for your application.
|
||||
"""
|
||||
from django.test import TestCase
|
||||
from django.test.client import Client
|
||||
from django.db.models import Count, Q
|
||||
from orm.models import Target, Recipe, Recipe_Dependency, Layer_Version, Target_Installed_Package
|
||||
from orm.models import Build, Task, Layer, Package, Package_File, LogMessage, Variable, VariableHistory
|
||||
import json, os, re, urllib, shlex
|
||||
|
||||
|
||||
class Tests(TestCase):
|
||||
# fixtures = ['orm_views_testdata.json']
|
||||
|
||||
def setUp(self):
|
||||
raise Exception("The %s test data is not longer valid, tests disabled" % __name__)
|
||||
|
||||
def test_builds(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/builds')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
self.assertTrue(fields["machine"] == "qemux86")
|
||||
self.assertTrue(fields["distro"] == "poky")
|
||||
self.assertTrue(fields["image_fstypes"] == "tar.bz2 ext3")
|
||||
self.assertTrue(fields["bitbake_version"] == "1.21.1")
|
||||
self.assertTrue("1.5+snapshot-" in fields["distro_version"])
|
||||
self.assertEqual(fields["outcome"], 0)
|
||||
self.assertEqual(fields["errors_no"], 0)
|
||||
log_path = "/tmp/log/cooker/qemux86/"
|
||||
self.assertTrue(log_path in fields["cooker_log_path"])
|
||||
self.assertTrue(".log" in fields["cooker_log_path"])
|
||||
|
||||
def test_targets(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/targets')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
self.assertTrue(fields["is_image"] == True)
|
||||
self.assertTrue(fields["target"] == "core-image-minimal")
|
||||
|
||||
def test_tasks(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/tasks')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
recipe_id = self.get_recipes_id("pseudo-native")
|
||||
print recipe_id
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["build"] == 1 and fields["task_name"] == "do_populate_lic_setscene" and fields["recipe"] == recipe_id and fields["task_executed"] == True:
|
||||
self.assertTrue(fields["message"] == "recipe pseudo-native-1.5.1-r4: task do_populate_lic_setscene: Succeeded")
|
||||
self.assertTrue(fields["cpu_usage"] == "6.3")
|
||||
self.assertTrue(fields["disk_io"] == 124)
|
||||
self.assertTrue(fields["script_type"] == 2)
|
||||
self.assertTrue(fields["path_to_sstate_obj"] == "")
|
||||
self.assertTrue(fields["elapsed_time"] == "0.103494")
|
||||
self.assertTrue("tmp/work/i686-linux/pseudo-native/1.5.1-r4/temp/log.do_populate_lic_setscene.5867" in fields["logfile"])
|
||||
self.assertTrue(fields["sstate_result"] == 0)
|
||||
self.assertTrue(fields["outcome"] == 0)
|
||||
if fields["build"] == 1 and fields["task_name"] == "do_populate_lic" and fields["recipe"] == recipe_id and fields["task_executed"] == True:
|
||||
self.assertTrue(fields["cpu_usage"] == None)
|
||||
self.assertTrue(fields["disk_io"] == None)
|
||||
self.assertTrue(fields["script_type"] == 2)
|
||||
self.assertTrue(fields["path_to_sstate_obj"] == "")
|
||||
self.assertTrue(fields["elapsed_time"] == "0")
|
||||
self.assertTrue(fields["logfile"], None)
|
||||
self.assertTrue(fields["sstate_result"] == 3)
|
||||
self.assertTrue(fields["outcome"] == 2)
|
||||
|
||||
def test_layers(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/layers')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["name"] == "meta-yocto-bsp":
|
||||
self.assertTrue(fields["local_path"].endswith("meta-yocto-bsp"))
|
||||
self.assertTrue(fields["layer_index_url"] == "http://layers.openembedded.org/layerindex/layer/meta-yocto-bsp/")
|
||||
elif fields["name"] == "meta":
|
||||
self.assertTrue(fields["local_path"].endswith("/meta"))
|
||||
self.assertTrue(fields["layer_index_url"] == "http://layers.openembedded.org/layerindex/layer/openembedded-core/")
|
||||
elif fields["name"] == "meta-yocto":
|
||||
self.assertTrue(fields["local_path"].endswith("/meta-yocto"))
|
||||
self.assertTrue(fields["layer_index_url"] == "http://layers.openembedded.org/layerindex/layer/meta-yocto/")
|
||||
|
||||
def test_layerversions(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/layerversions')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
layer_id = self.get_layer_id("meta")
|
||||
find = False
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["layer"] == layer_id:
|
||||
find = True
|
||||
self.assertTrue(fields["build"] == 1)
|
||||
self.assertTrue(fields["priority"] == 5)
|
||||
self.assertTrue(fields["branch"] == "master")
|
||||
self.assertTrue(find == True)
|
||||
|
||||
def test_recipes(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/recipes')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
find = False
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["name"] == "busybox":
|
||||
find = True
|
||||
self.assertTrue(fields["version"] == "1.21.1-r0")
|
||||
self.assertTrue(fields["license"] == "GPLv2 & bzip2")
|
||||
self.assertTrue(fields["file_path"].endswith("/meta/recipes-core/busybox/busybox_1.21.1.bb"))
|
||||
self.assertTrue(fields["summary"] == "Tiny versions of many common UNIX utilities in a single small executable.")
|
||||
self.assertTrue(fields["description"] == "BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides minimalist replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. The utilities in BusyBox generally have fewer options than their full-featured GNU cousins; however, the options that are included provide the expected functionality and behave very much like their GNU counterparts. BusyBox provides a fairly complete POSIX environment for any small or embedded system.")
|
||||
self.assertTrue(fields["bugtracker"] == "https://bugs.busybox.net/")
|
||||
self.assertTrue(fields["homepage"] == "http://www.busybox.net")
|
||||
self.assertTrue(fields["section"] == "base")
|
||||
self.assertTrue(find == True)
|
||||
|
||||
def test_task_dependencies(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/task_dependencies')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
ids = self.get_task_id()
|
||||
do_install = ids["do_install"]
|
||||
do_compile = ids["do_compile"]
|
||||
entry = False
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["task"] == do_install and fields["depends_on"] == do_compile:
|
||||
entry = True
|
||||
self.assertTrue(entry == True)
|
||||
|
||||
def test_target_installed_package(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/target_installed_packages')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
package = self.get_package_id("udev-utils")
|
||||
find = False
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["package"] == package:
|
||||
self.assertTrue(fields["target"], 1)
|
||||
find = True
|
||||
self.assertTrue(find, True)
|
||||
|
||||
def test_packages(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/packages')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(response['count'] > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["name"] == "base-files-dev":
|
||||
self.assertTrue(fields["license"] == "GPLv2")
|
||||
self.assertTrue(fields["description"] == "The base-files package creates the basic system directory structure and provides a small set of key configuration files for the system. This package contains symbolic links, header files, and related items necessary for software development.")
|
||||
self.assertTrue(fields["summary"] == "Miscellaneous files for the base system. - Development files")
|
||||
self.assertTrue(fields["version"] == "3.0.14")
|
||||
self.assertTrue(fields["build"] == 1)
|
||||
self.assertTrue(fields["section"] == "devel")
|
||||
self.assertTrue(fields["revision"] == "r73")
|
||||
self.assertTrue(fields["size"] == 0)
|
||||
self.assertTrue(fields["installed_size"] == 0)
|
||||
self.assertTrue(self.get_recipe_name(fields["recipe"]) == "base-files")
|
||||
|
||||
def test_package_dependencies(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/package_dependencies')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
build_package = self.get_package_id("busybox")
|
||||
build_package_id = self.get_package_id("busybox-syslog")
|
||||
entry = False
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
self.assertTrue(fields["target"] == 1)
|
||||
if fields["package"] == build_package and fields["dep_type"] == 7 and fields["depends_on"] == build_package_id:
|
||||
entry = True
|
||||
self.assertTrue(entry == True)
|
||||
|
||||
def test_recipe_dependencies(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/recipe_dependencies')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
depends_on = self.get_recipes_id("autoconf-native")
|
||||
recipe = self.get_recipes_id("ncurses")
|
||||
entry = False
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["recipe"] == recipe and fields["depends_on"] == depends_on and fields["dep_type"] == 0:
|
||||
entry = True
|
||||
self.assertTrue(entry == True)
|
||||
|
||||
def test_package_files(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/package_files')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
build_package = self.get_package_id("base-files")
|
||||
entry = False
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["path"] == "/etc/motd" and fields["package"] == build_package and fields["size"] == 0:
|
||||
entry = True
|
||||
self.assertTrue(entry == True)
|
||||
|
||||
def test_Variable(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/variables')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
self.assertTrue(fields["build"] == 1)
|
||||
if fields["variable_name"] == "USRBINPATH":
|
||||
self.assertTrue(fields["variable_value"] == "/usr/bin")
|
||||
self.assertTrue(fields["changed"] == False)
|
||||
self.assertTrue(fields["description"] == "")
|
||||
if fields["variable_name"] == "PREFERRED_PROVIDER_virtual/libx11":
|
||||
self.assertTrue(fields["variable_value"] == "libx11")
|
||||
self.assertTrue(fields["changed"] == False)
|
||||
self.assertTrue(fields["description"] == "If multiple recipes provide an item, this variable determines which recipe should be given preference.")
|
||||
if fields["variable_name"] == "base_libdir_nativesdk":
|
||||
self.assertTrue(fields["variable_value"] == "/lib")
|
||||
|
||||
def test_VariableHistory(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/variableshistory')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
variable_id = self.get_variable_id("STAGING_INCDIR_NATIVE")
|
||||
find = False
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["variable"] == variable_id:
|
||||
find = True
|
||||
self.assertTrue(fields["file_name"] == "conf/bitbake.conf")
|
||||
self.assertTrue(fields["operation"] == "set")
|
||||
self.assertTrue(fields["line_number"] == 358)
|
||||
self.assertTrue(find == True)
|
||||
|
||||
def get_task_id(self):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/tasks')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["recipe"] == 7 and fields["task_name"] == "do_install":
|
||||
do_install = item["pk"]
|
||||
if fields["recipe"] == 7 and fields["task_name"] == "do_compile":
|
||||
do_compile = item["pk"]
|
||||
result = {}
|
||||
result["do_install"] = do_install
|
||||
result["do_compile"] = do_compile
|
||||
return result
|
||||
|
||||
def get_recipes_id(self, value):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/recipes')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["name"] == value:
|
||||
return item["pk"]
|
||||
return None
|
||||
|
||||
def get_recipe_name(self, value):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/recipes')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if item["pk"] == value:
|
||||
return fields["name"]
|
||||
return None
|
||||
|
||||
def get_layer_id(self, value):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/layers')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["name"] == value:
|
||||
return item["pk"]
|
||||
return None
|
||||
|
||||
def get_package_id(self, field):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/packages')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(response['count'] > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["name"] == field:
|
||||
return item["pk"]
|
||||
return None
|
||||
|
||||
def get_variable_id(self, field):
|
||||
client = Client()
|
||||
resp = client.get('http://localhost:8000/api/1.0/variables')
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
response = json.loads(resp.content)
|
||||
self.assertTrue(len(json.loads(response['list'])) > 0)
|
||||
for item in json.loads(response['list']):
|
||||
fields = item['fields']
|
||||
if fields["variable_name"] == field:
|
||||
return item["pk"]
|
||||
return None
|
|
@ -1,35 +0,0 @@
|
|||
#
|
||||
# ex:ts=4:sw=4:sts=4:et
|
||||
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 Intel Corporation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
from django.conf.urls import patterns, include, url
|
||||
from django.views.generic import RedirectView
|
||||
|
||||
urlpatterns = patterns('bldviewer.views',
|
||||
url(r'^builds/$', 'build', name='simple-all-builds'),
|
||||
url(r'^build/(?P<build_id>\d+)/task/$', 'task', name='simple-task'),
|
||||
url(r'^build/(?P<build_id>\d+)/packages/$', 'bpackage', name='simple-bpackage'),
|
||||
url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)/files/$', 'bfile', name='simple-bfile'),
|
||||
url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packages/$', 'tpackage', name='simple-tpackage'),
|
||||
url(r'^build/(?P<build_id>\d+)/configuration/$', 'configuration', name='simple-configuration'),
|
||||
url(r'^layers/$', 'layer', name='simple-all-layers'),
|
||||
url(r'^layerversions/(?P<layerversion_id>\d+)/recipes/.*$', 'layer_versions_recipes', name='simple-layer_versions_recipes'),
|
||||
url(r'^$', RedirectView.as_view( url= 'builds/')),
|
||||
)
|
|
@ -1,287 +0,0 @@
|
|||
#
|
||||
# ex:ts=4:sw=4:sts=4:et
|
||||
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2013 Intel Corporation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
import operator
|
||||
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import render
|
||||
from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable, Target_Installed_Package
|
||||
from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency
|
||||
from orm.models import Target_Installed_Package, VariableHistory, Target_Image_File, Target_File
|
||||
from django.views.decorators.cache import cache_control
|
||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||
|
||||
|
||||
def _build_page_range(paginator, index = 1):
|
||||
try:
|
||||
page = paginator.page(index)
|
||||
except PageNotAnInteger:
|
||||
page = paginator.page(1)
|
||||
except EmptyPage:
|
||||
page = paginator.page(paginator.num_pages)
|
||||
|
||||
page.page_range = [page.number]
|
||||
crt_range = 0
|
||||
for i in range(1,5):
|
||||
if (page.number + i) <= paginator.num_pages:
|
||||
page.page_range = page.page_range + [ page.number + i]
|
||||
crt_range +=1
|
||||
if (page.number - i) > 0:
|
||||
page.page_range = [page.number -i] + page.page_range
|
||||
crt_range +=1
|
||||
if crt_range == 4:
|
||||
break
|
||||
return page
|
||||
|
||||
@cache_control(no_store=True)
|
||||
def build(request):
|
||||
template = 'simple_build.html'
|
||||
logs = LogMessage.objects.all()
|
||||
|
||||
build_info = _build_page_range(Paginator(Build.objects.order_by("-id"), 10),request.GET.get('page', 1))
|
||||
|
||||
context = {'objects': build_info, 'logs': logs ,
|
||||
'hideshowcols' : [
|
||||
{'name': 'Output', 'order':10},
|
||||
{'name': 'Log', 'order':11},
|
||||
]}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
|
||||
def _find_task_revdep(task):
|
||||
tp = []
|
||||
for p in Task_Dependency.objects.filter(depends_on=task):
|
||||
tp.append(p.task);
|
||||
return tp
|
||||
|
||||
def _find_task_provider(task):
|
||||
task_revdeps = _find_task_revdep(task)
|
||||
for tr in task_revdeps:
|
||||
if tr.outcome != Task.OUTCOME_COVERED:
|
||||
return tr
|
||||
for tr in task_revdeps:
|
||||
trc = _find_task_provider(tr)
|
||||
if trc is not None:
|
||||
return trc
|
||||
return None
|
||||
|
||||
def task(request, build_id):
|
||||
template = 'simple_task.html'
|
||||
|
||||
tasks = _build_page_range(Paginator(Task.objects.filter(build=build_id, order__gt=0), 100),request.GET.get('page', 1))
|
||||
|
||||
for t in tasks:
|
||||
if t.outcome == Task.OUTCOME_COVERED:
|
||||
t.provider = _find_task_provider(t)
|
||||
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects': tasks}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
def configuration(request, build_id):
|
||||
template = 'simple_configuration.html'
|
||||
variables = _build_page_range(Paginator(Variable.objects.filter(build=build_id), 50), request.GET.get('page', 1))
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : variables}
|
||||
return render(request, template, context)
|
||||
|
||||
def bpackage(request, build_id):
|
||||
template = 'simple_bpackage.html'
|
||||
packages = Package.objects.filter(build = build_id)
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : packages}
|
||||
return render(request, template, context)
|
||||
|
||||
def bfile(request, build_id, package_id):
|
||||
template = 'simple_bfile.html'
|
||||
files = Package_File.objects.filter(package = package_id)
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : files}
|
||||
return render(request, template, context)
|
||||
|
||||
def tpackage(request, build_id, target_id):
|
||||
template = 'simple_package.html'
|
||||
packages = map(lambda x: x.package, list(Target_Installed_Package.objects.filter(target=target_id)))
|
||||
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : packages}
|
||||
return render(request, template, context)
|
||||
|
||||
def layer(request):
|
||||
template = 'simple_layer.html'
|
||||
layer_info = Layer.objects.all()
|
||||
|
||||
for li in layer_info:
|
||||
li.versions = Layer_Version.objects.filter(layer = li)
|
||||
for liv in li.versions:
|
||||
liv.count = Recipe.objects.filter(layer_version__id = liv.id).count()
|
||||
|
||||
context = {'objects': layer_info}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
|
||||
def layer_versions_recipes(request, layerversion_id):
|
||||
template = 'simple_recipe.html'
|
||||
recipes = Recipe.objects.filter(layer_version__id = layerversion_id)
|
||||
|
||||
context = {'objects': recipes,
|
||||
'layer_version' : Layer_Version.objects.filter( id = layerversion_id )[0]
|
||||
}
|
||||
|
||||
return render(request, template, context)
|
||||
|
||||
#### API
|
||||
|
||||
import json
|
||||
from django.core import serializers
|
||||
from django.http import HttpResponse, HttpResponseBadRequest
|
||||
|
||||
|
||||
def model_explorer(request, model_name):
|
||||
|
||||
DESCENDING = 'desc'
|
||||
response_data = {}
|
||||
model_mapping = {
|
||||
'build': Build,
|
||||
'target': Target,
|
||||
'target_file': Target_File,
|
||||
'target_image_file': Target_Image_File,
|
||||
'task': Task,
|
||||
'task_dependency': Task_Dependency,
|
||||
'package': Package,
|
||||
'layer': Layer,
|
||||
'layerversion': Layer_Version,
|
||||
'recipe': Recipe,
|
||||
'recipe_dependency': Recipe_Dependency,
|
||||
'package': Package,
|
||||
'package_dependency': Package_Dependency,
|
||||
'target_installed_package': Target_Installed_Package,
|
||||
'build_file': Package_File,
|
||||
'variable': Variable,
|
||||
'variablehistory': VariableHistory,
|
||||
'logmessage': LogMessage,
|
||||
}
|
||||
|
||||
if model_name not in model_mapping.keys():
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
model = model_mapping[model_name]
|
||||
|
||||
try:
|
||||
limit = int(request.GET.get('limit', 0))
|
||||
except ValueError:
|
||||
limit = 0
|
||||
|
||||
try:
|
||||
offset = int(request.GET.get('offset', 0))
|
||||
except ValueError:
|
||||
offset = 0
|
||||
|
||||
ordering_string, invalid = _validate_input(request.GET.get('orderby', ''),
|
||||
model)
|
||||
if invalid:
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
filter_string, invalid = _validate_input(request.GET.get('filter', ''),
|
||||
model)
|
||||
if invalid:
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
search_term = request.GET.get('search', '')
|
||||
|
||||
if filter_string:
|
||||
filter_terms = _get_filtering_terms(filter_string)
|
||||
try:
|
||||
queryset = model.objects.filter(**filter_terms)
|
||||
except ValueError:
|
||||
queryset = []
|
||||
else:
|
||||
queryset = model.objects.all()
|
||||
|
||||
if search_term:
|
||||
queryset = _get_search_results(search_term, queryset, model)
|
||||
|
||||
if ordering_string and queryset:
|
||||
column, order = ordering_string.split(':')
|
||||
if order.lower() == DESCENDING:
|
||||
queryset = queryset.order_by('-' + column)
|
||||
else:
|
||||
queryset = queryset.order_by(column)
|
||||
|
||||
if offset and limit:
|
||||
queryset = queryset[offset:(offset+limit)]
|
||||
elif offset:
|
||||
queryset = queryset[offset:]
|
||||
elif limit:
|
||||
queryset = queryset[:limit]
|
||||
|
||||
if queryset:
|
||||
response_data['count'] = queryset.count()
|
||||
else:
|
||||
response_data['count'] = 0
|
||||
|
||||
response_data['list'] = serializers.serialize('json', queryset)
|
||||
|
||||
return HttpResponse(json.dumps(response_data),
|
||||
content_type='application/json')
|
||||
|
||||
def _get_filtering_terms(filter_string):
|
||||
|
||||
search_terms = filter_string.split(":")
|
||||
keys = search_terms[0].split(',')
|
||||
values = search_terms[1].split(',')
|
||||
|
||||
return dict(zip(keys, values))
|
||||
|
||||
def _validate_input(input, model):
|
||||
|
||||
invalid = 0
|
||||
|
||||
if input:
|
||||
input_list = input.split(":")
|
||||
|
||||
# Check we have only one colon
|
||||
if len(input_list) != 2:
|
||||
invalid = 1
|
||||
return None, invalid
|
||||
|
||||
# Check we have an equal number of terms both sides of the colon
|
||||
if len(input_list[0].split(',')) != len(input_list[1].split(',')):
|
||||
invalid = 1
|
||||
return None, invalid
|
||||
|
||||
# Check we are looking for a valid field
|
||||
valid_fields = model._meta.get_all_field_names()
|
||||
for field in input_list[0].split(','):
|
||||
if field not in valid_fields:
|
||||
invalid = 1
|
||||
return None, invalid
|
||||
|
||||
return input, invalid
|
||||
|
||||
def _get_search_results(search_term, queryset, model):
|
||||
search_objects = []
|
||||
for st in search_term.split(" "):
|
||||
q_map = map(lambda x: Q(**{x+'__icontains': st}),
|
||||
model.search_allowed_fields)
|
||||
|
||||
search_objects.append(reduce(operator.or_, q_map))
|
||||
search_object = reduce(operator.and_, search_objects)
|
||||
queryset = queryset.filter(search_object)
|
||||
|
||||
return queryset
|
|
@ -32,8 +32,6 @@ from django.contrib import admin
|
|||
admin.autodiscover()
|
||||
|
||||
urlpatterns = patterns('',
|
||||
# the api-s are not auto-discoverable
|
||||
url(r'^api/1.0/', include('bldviewer.api')),
|
||||
|
||||
# Examples:
|
||||
# url(r'^toaster/', include('toaster.foo.urls')),
|
||||
|
|
Loading…
Reference in New Issue
Block a user