summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/toaster/toastergui/templates/base.html64
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basebuildpage.html69
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable.html64
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable_bottom.html60
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable_top.html66
-rw-r--r--bitbake/lib/toaster/toastergui/templates/bpackage.html12
-rw-r--r--bitbake/lib/toaster/toastergui/templates/build.html115
-rw-r--r--bitbake/lib/toaster/toastergui/templates/builddashboard.html8
-rw-r--r--bitbake/lib/toaster/toastergui/templates/buildtime.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/configuration.html10
-rw-r--r--bitbake/lib/toaster/toastergui/templates/cpuusage.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/diskio.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipe.html15
-rw-r--r--bitbake/lib/toaster/toastergui/templates/target.html8
-rw-r--r--bitbake/lib/toaster/toastergui/templates/task.html11
-rw-r--r--bitbake/lib/toaster/toastergui/templatetags/projecttags.py5
-rw-r--r--bitbake/lib/toaster/toastergui/urls.py34
-rw-r--r--bitbake/lib/toaster/toastergui/views.py167
-rw-r--r--bitbake/lib/toaster/toastermain/settings.py10
19 files changed, 571 insertions, 159 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index d58cbeaed5..3508962e67 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -1,30 +1,64 @@
1<!DOCTYPE html> 1<!DOCTYPE html>
2{% load static %} 2{% load static %}
3<html> 3<html>
4 <head> 4 <head>
5 <title>Toaster Simple Explorer</title> 5 <title>Toaster</title>
6<script src="{% static 'js/jquery-2.0.3.js' %}"> 6<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css">
7<link rel="stylesheet" href="{% static 'css/bootstrap-responsive.min.css' %}" type='text/css'>
8<link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'>
9<link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'>
10<link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'>
11<meta name="viewport" content="width=device-width, initial-scale=1.0" />
12<script src="{% static 'js/jquery-2.0.3.min.js' %}">
7</script> 13</script>
8<script src="{% static 'js/bootstrap.js' %}"> 14<script src="{% static 'js/bootstrap.min.js' %}">
9</script> 15</script>
10<link href="{% static 'css/bootstrap.css' %}" rel="stylesheet" type="text/css"> 16<script src="{% static 'js/prettify.js' %}">
11 </head> 17</script>
18<script src="{% static 'js/main.js' %}">
19</script>
20<script>
21function reload_params(params) {
22 uri = window.location.href;
23 [url, parameters] = uri.split("?");
24 // deserialize the call parameters
25 cparams = parameters.split("&");
26 nparams = {}
27 for (i = 0; i < cparams.length; i++) {
28 temp = cparams[i].split("=");
29 nparams[temp[0]] = temp[1];
30 }
31 // update parameter values
32 for (i in params) {
33 nparams[encodeURIComponent(i)] = encodeURIComponent(params[i]);
34 }
35 // serialize the structure
36 callparams = []
37 for (i in nparams) {
38 callparams.push(i+"="+nparams[i]);
39 }
40 window.location.href = url+"?"+callparams.join('&');
41
42}
43</script>
44 </head>
12 45
13<body style="height: 100%"> 46<body style="height: 100%">
14<div style="width:100%; height: 100%; position:absolute"> 47<div class="navbar navbar-static-top">
15<div style="width: 100%; height: 3em" class="nav"> 48 <div class="navbar-inner">
16 <ul class="nav nav-tabs"> 49 <a class="brand logo" href="#"><img src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/></a>
17 <li><a href="{% url "all-builds" %}">All Builds</a></li> 50 <a class="brand" href="/">Toaster</a>
18 <li><a href="{% url "all-layers" %}">All Layers</a></li> 51 <a class="pull-right manual" href="#">
19 </ul> 52 <i class="icon-book"></i>
53 Toaster manual
54 </a>
55 </div>
20</div> 56</div>
21 57
22<div style="overflow-y:scroll; width: 100%; position: absolute; top: 3em; bottom:70px "> 58<div class="container-fluid">
23{% block pagecontent %} 59{% block pagecontent %}
24{% endblock %} 60{% endblock %}
25</div> 61</div>
26<div class="navbar" style="position: absolute; bottom: 0; width:100%"><br/>About Toaster | Yocto Project </div>
27</div>
28</body> 62</body>
29</html> 63</html>
30 64
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
index d590f28bc5..1b037f9539 100644
--- a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
@@ -1,17 +1,56 @@
1{% extends "basetable.html" %} 1{% extends "base.html" %}
2 2{% load humanize %}
3{% block pagename %} 3{% block pagecontent %}
4<ul class="nav nav-tabs" style="display: inline-block"> 4
5 <li><a>Build {{build.target_set.all|join:"&nbsp;"}} at {{build.started_on}} : </a></li> 5
6 <li><a href="{% url "task" build.id %}"> Tasks </a></li> 6 <div class="span12">
7 <li><a href="{% url "bpackage" build.id %}"> Build Packages </a></li> 7<!-- Breadcrumbs -->
8 {% for t in build.target_set.all %} 8 <div class="section">
9 {% if t.is_image %} 9 <ul class="breadcrumb" id="breadcrumb">
10 <li><a href="{% url "tpackage" build.id t.pk %}"> Packages for {{t.target}} </a> </li> 10<li><a href="{% url 'all-builds' %}">All builds</a></li>
11 {% endif %} 11<li><a href="{%url 'builddashboard' build.pk%}">{{build.target_set.all.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|naturaltime}})</a></li>
12 {% endfor %} 12 {% block localbreadcrumb %}{% endblock %}
13 <li><a href="{% url "configuration" build.id %}"> Configuration </a> </li> 13 </ul>
14</ul> 14 <script>
15 <h1>Toaster - Build {% block pagetitle %} {% endblock %}</h1> 15 $( function () {
16 $('#breadcrumb > li').append("<span class=\"divider\">→</span>");
17 $('#breadcrumb > li:last').addClass("active");
18 $('#breadcrumb > li:last > span').remove();
19 });
20 </script>
21 </div>
22
23 <div class="row-fluid">
24
25 <!-- begin left sidebar container -->
26 <div id="nav" class="span2">
27 <ul class="nav nav-list well">
28 <li class="nav-header">Images</li>
29 {% for t in build.target_set.all %}
30 <li><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
31 {% endfor %}
32 <li class="nav-header">Build</li>
33 <li><a href="{% url 'configuration' build.pk %}">Configuration</a></li>
34 <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
35 <li><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
36 <li><a href="{% url 'packages' build.pk %}">Packages</a></li>
37 <li class="nav-header">Performance</li>
38 <li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
39 <li><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
40 <li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
41 </ul>
42 </div>
43
44 <!-- end left sidebar container -->
45 <!-- Begin right container -->
46 <div class="row span10">
47 {% block buildinfomain %}{% endblock %}
48 </div>
49
50
51 </div>
52 </div>
53
54
16{% endblock %} 55{% endblock %}
17 56
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable.html b/bitbake/lib/toaster/toastergui/templates/basetable.html
deleted file mode 100644
index 16628eafbe..0000000000
--- a/bitbake/lib/toaster/toastergui/templates/basetable.html
+++ /dev/null
@@ -1,64 +0,0 @@
1{% extends "base.html" %}
2
3{% block pagecontent %}
4<script>
5function showhideTableColumn(i, sh) {
6 if (sh)
7 $('td:nth-child('+i+'),th:nth-child('+i+')').show();
8 else
9 $('td:nth-child('+i+'),th:nth-child('+i+')').hide();
10}
11
12
13function filterTableRows(test) {
14 if (test.length > 0) {
15 var r = test.split(/[ ,]+/).map(function (e) { return new RegExp(e, 'i') });
16 $('tr.data').map( function (i, el) {
17 (! r.map(function (j) { return j.test($(el).html())}).reduce(function (c, p) { return c && p;} )) ? $(el).hide() : $(el).show();
18 });
19 } else
20 {
21 $('tr.data').show();
22 }
23}
24</script>
25<div style="margin-bottom: 0.5em">
26
27 {% block pagename %}
28 {% endblock %}
29 <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">
30 </div>
31 {% if hideshowcols %}
32 <div align="right" style="display: inline-block; width: 40%">Show/Hide columns:
33 {% for i in hideshowcols %}
34 <span>{{i.name}} <input type="checkbox" id="ct{{i.name}}" onchange="showhideTableColumn({{i.order}}, $('#ct{{i.name}}').is(':checked'))" checked autocomplete="off"></span> |
35 {% endfor %}
36 </div>
37 {% endif %}
38</div>
39
40 <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.&nbsp;</span>
41 <ul class="pagination" style="display: block-inline">
42{%if objects.has_previous %}
43 <li><a href="?page={{objects.previous_page_number}}">&laquo;</a></li>
44{%else%}
45 <li class="disabled"><a href="#">&laquo;</a></li>
46{%endif%}
47{% for i in objects.page_range %}
48 <li{%if i == objects.number %} class="active" {%endif%}><a href="?page={{i}}">{{i}}</a></li>
49{% endfor %}
50{%if objects.has_next%}
51 <li><a href="?page={{objects.next_page_number}}">&raquo;</a></li>
52{%else%}
53 <li class="disabled"><a href="#">&raquo;</a></li>
54{%endif%}
55 </ul>
56</div>
57
58 <table class="table table-striped table-condensed" style="width:95%">
59{% block pagetable %}
60{% endblock %}
61 </table>
62</div>
63
64{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
new file mode 100644
index 0000000000..2a6f084929
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
@@ -0,0 +1,60 @@
1 </table>
2
3<!-- Show pagination controls -->
4<div class="pagination pagination-centered">
5 <div class="pull-left">
6 Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.
7 </div>
8
9 <ul class="pagination" style="display: block-inline">
10{%if objects.has_previous %}
11 <li><a href="?page={{objects.previous_page_number}}&count={{request.GET.count}}">&laquo;</a></li>
12{%else%}
13 <li class="disabled"><a href="#">&laquo;</a></li>
14{%endif%}
15{% for i in objects.page_range %}
16 <li{%if i == objects.number %} class="active" {%endif%}><a href="?page={{i}}&count={{request.GET.count}}">{{i}}</a></li>
17{% endfor %}
18{%if objects.has_next%}
19 <li><a href="?page={{objects.next_page_number}}&count={{request.GET.count}}">&raquo;</a></li>
20{%else%}
21 <li class="disabled"><a href="#">&raquo;</a></li>
22{%endif%}
23 </ul>
24 <div class="pull-right">
25 <span class="help-inline" style="padding-top:5px;">Show rows:</span>
26 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
27 {% with "2 5 10 25 50 100" as list%}
28 {% for i in list.split %}<option{%if i == request.GET.count %} selected{%endif%}>{{i}}</option>
29 {% endfor %}
30 {% endwith %}
31 </select>
32 </div>
33</div>
34
35<!-- Update page display settings -->
36
37<script>
38 $(document).ready(function() {
39
40 $('.chbxtoggle').each(function () {
41 showhideTableColumn($(this).attr('id'), $(this).is(':checked'))
42 });
43
44 //turn edit columns dropdown into a multi-select menu
45 $('.dropdown-menu input, .dropdown-menu label').click(function(e) {
46 e.stopPropagation();
47 });
48
49 //show tooltip with applied filter
50 $('#filtered').tooltip({container:'table', placement:'bottom', delay:{hide:1500}, html:true});
51
52 //progress bar tooltip
53 $('.progress, .lead span').tooltip({container:'table', placement:'top'});
54
55 $(".pagesize").change(function () {
56 $(".pagesize option:selected").each(function ()
57 {reload_params({"count":$(this).text()}); });
58 });
59});
60</script>
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
new file mode 100644
index 0000000000..b9277b4a3d
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -0,0 +1,66 @@
1<!-- component to display a generic table -->
2 <script>
3 function showhideTableColumn(clname, sh) {
4 if (sh) $('.' + clname).show();
5 else $('.' + clname).hide();
6 }
7
8
9 function filterTableRows(test) {
10 if (test.length > 0) {
11 var r = test.split(/[ ,]+/).map(function (e) { return new RegExp(e, 'i') });
12 $('tr.data').map( function (i, el) {
13 (! r.map(function (j) { return j.test($(el).html())}).reduce(function (c, p) { return c && p;} )) ? $(el).hide() : $(el).show();
14 });
15 } else
16 {
17 $('tr.data').show();
18 }
19 }
20 </script>
21
22<!-- control header -->
23<div class="navbar">
24 <div class="navbar-inner">
25 <form class="navbar-search input-append pull-left">
26 <input class="input-xxlarge" type="text" placeholder="Search {{objectname}}" />
27 <button class="btn" type="button">Search</button>
28 </form>
29 <div class="pull-right">
30
31 {% if tablecols %}
32 <div class="btn-group">
33 <button class="btn dropdown-toggle" data-toggle="dropdown">
34 Edit columns
35 <span class="caret"></span>
36 </button>
37 <ul class="dropdown-menu">
38
39 {% for i in tablecols %}
40 <li>
41 <label class="checkbox">
42<input type="checkbox" class="chbxtoggle" id="{{i.clclass}}" value="ct{{i.name}}" {% if i.clclass %}{% if not i.hidden %}checked="checked"{%endif%} onchange="showhideTableColumn($(this).attr('id'), $(this).is(':checked'))" {%else%} disabled{% endif %}/> {{i.name}}
43 </label>
44 </li>
45 {% endfor %}
46 </ul>
47 </div>
48 {% endif %}
49
50 <div style="display:inline">
51 <span class="divider-vertical"></span>
52 <span class="help-inline" style="padding-top:5px;">Show rows:</span>
53 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
54 {% with "2 5 10 25 50 100" as list%}
55 {% for i in list.split %}<option{%if i == request.GET.count %} selected{%endif%}>{{i}}</option>
56 {% endfor %}
57 {% endwith %}
58 </select>
59 </div>
60 </div>
61 </div>
62 </div>
63
64<!-- the actual rows of the table -->
65 <table class="table table-bordered table-hover tablesorter" id="otable">
66
diff --git a/bitbake/lib/toaster/toastergui/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
index 67fc65ca3e..3329ddae51 100644
--- a/bitbake/lib/toaster/toastergui/templates/bpackage.html
+++ b/bitbake/lib/toaster/toastergui/templates/bpackage.html
@@ -1,7 +1,12 @@
1{% extends "basebuildpage.html" %} 1{% extends "basebuildpage.html" %}
2 2
3{% block pagetitle %}Packages{% endblock %} 3{% block localbreadcrumb %}
4{% block pagetable %} 4<li>Packages</li>
5{% endblock %}
6
7{% block buildinfomain %}
8{% include "basetable_top.html" %}
9
5 {% if not objects %} 10 {% if not objects %}
6 <p>No packages were recorded for this target!</p> 11 <p>No packages were recorded for this target!</p>
7 {% else %} 12 {% else %}
@@ -21,7 +26,7 @@
21 {% for package in objects %} 26 {% for package in objects %}
22 27
23 <tr class="data"> 28 <tr class="data">
24 <td><a name="#{{package.name}}" href="{% url "bfile" build.pk package.pk %}">{{package.name}} ({{package.filelist_bpackage.count}} files)</a></td> 29 <td><a name="#{{package.name}}" href="{% url "package" build.pk package.pk %}">{{package.name}} ({{package.filelist_bpackage.count}} files)</a></td>
25 <td>{{package.version}}-{{package.revision}}</td> 30 <td>{{package.version}}-{{package.revision}}</td>
26 <td>{%if package.recipe%}<a href="{% url "layer_versions_recipes" package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td> 31 <td>{%if package.recipe%}<a href="{% url "layer_versions_recipes" package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td>
27 32
@@ -41,4 +46,5 @@
41 46
42 {% endif %} 47 {% endif %}
43 48
49{% include "basetable_bottom.html" %}
44{% endblock %} 50{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/build.html b/bitbake/lib/toaster/toastergui/templates/build.html
index 4fa87d5271..27ce1ccbc5 100644
--- a/bitbake/lib/toaster/toastergui/templates/build.html
+++ b/bitbake/lib/toaster/toastergui/templates/build.html
@@ -1,43 +1,96 @@
1{% extends "basetable.html" %} 1{% extends "base.html" %}
2
3
4{% load projecttags %}
5{% load humanize %}
6
7{% block pagecontent %}
8<div class="row-fluid">
9
10<div class="page-header" style="margin-top:40px;">
11 <h1>
12 Recent Builds
13 </h1>
14</div>
15{{build_mru}}
16{% for build in mru %}
17<div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
18 <div class="row-fluid">
19 <div class="lead span5">
20 {%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}
21 <a href="{%url 'builddashboard' build.pk%}">
22 <span data-toggle="tooltip" {%if build.target_set.all.count > 1%}title="Targets: {%for target in build.target_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{build.target_set.all.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|naturaltime}})</span>
23 </a>
24 </div>
25{%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
26 <div class="span2 lead">
27{% if build.errors_no %}
28 <i class="icon-minus-sign red"></i> <a href="{%url 'builddashboard' build.pk%}" class="error">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>
29{% endif %}
30 </div>
31 <div class="span2 lead">
32{% if build.warnings_no %}
33 <i class="icon-warning-sign yellow"></i> <a href="{%url 'builddashboard' build.pk%}" class="warning">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>
34{% endif %}
35 </div>
36 <div class="lead pull-right">
37 Build time: <a href="build-time.html">{{ build|timespent }}</a>
38 </div>
39{%endif%}{%if build.outcome == build.IN_PROGRESS %}
40 <div class="span4">
41 <div class="progress" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete">
42 <div style="width: {{build.completeper}}%;" class="bar"></div>
43 </div>
44 </div>
45 <div class="lead pull-right">ETA: in {{build.eta|naturaltime}}</div>
46{%endif%}
47 </div>
48</div>
49
50{% endfor %}
2 51
3{% block pagename %}
4 <h1>Toaster - Builds</h1>
5{% endblock %}
6 52
7{% block pagetable %} 53<div class="page-header" style="margin-top:40px;">
54 <h1>
55 All builds
56 </h1>
57</div>
58
59{% include "basetable_top.html" %}
8 60
9 {% load projecttags %}
10 <tr> 61 <tr>
11 <th>Outcome</th> 62 <th class="outcome span2"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="The outcome tells you if a build completed successfully or failed"></i> <a href="#" style="font-weight:normal;">Outcome</a> <div class="btn-group pull-right"> <a href="#outcome" role="button" class="btn btn-mini" data-toggle="modal"> <i class="icon-filter"></i> </a> </div> </th>
12 <th>Started On</th> 63 <th class="target"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="This is the build target(s): one or more recipes or image recipes"></i> <a href="#" style="font-weight:normal;">Target</a> </th>
13 <th>Completed On</th> 64 <th class="machine span3"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="The machine is the hardware for which you are building"></i> <a href="#" style="font-weight:normal;">Machine</a> </th>
14 <th>Target</th> 65 <th class="started_on"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="The date and time you started the build"></i> <a href="#" style="font-weight:normal;">Started on</a> <div class="btn-group pull-right"> <a href="#started-on" role="button" class="btn btn-mini" data-toggle="modal"> <i class="icon-filter"></i> </a> </div> </th>
15 <th>Machine</th> 66 <th class="completed_on"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="The date and time the build finished"></i> <a href="#" class="sorted"> Completed on </a> <div class="btn-group pull-right"> <a href="#completed-on" role="button" class="btn btn-mini" data-toggle="modal"> <i class="icon-filter"></i> </a> </div> <i class="icon-caret-down"></i> </th>
16 <th>Time</th> 67 <th class="failed_tasks"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="How many tasks failed during the build"></i> <a href="#" style="font-weight:normal;">Failed tasks</a> <div class="btn-group pull-right"> <a href="#failed-tasks" role="button" class="btn btn-mini" data-toggle="modal"> <i class="icon-filter"></i> </a> </div> <!--div id="filtered" class="btn-group pull-right" title="<p>Showing only builds with failed tasks</p><p><a class='btn btn-mini btn-primary' href='#'>Show all builds</a></p>"> <a class="btn btn-mini btn-primary"> <i class="icon-filter"></i> </a> </div--> </th>
17 <th>Errors</th> 68 <th class="errors"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="How many errors were encountered during the build (if any)"></i> <a href="#" style="font-weight:normal;">Errors</a> <div class="btn-group pull-right"> <a href="#errors" role="button" class="btn btn-mini" data-toggle="modal"> <i class="icon-filter"></i> </a> </div> </th>
18 <th>Warnings</th> 69 <th class="warnings"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="How many warnigns were encountered during the build (if any)"></i> <a href="#" style="font-weight:normal;">Warnings</a> <div class="btn-group pull-right"> <a href="#warnings" role="button" class="btn btn-mini" data-toggle="modal"> <i class="icon-filter"></i> </a> </div> <!--div id="filtered" class="btn-group pull-right" title="<p>Showing only builds without warnings</p><p><a class='btn btn-mini btn-primary' href='#'>Show all builds</a></p>"> <a class="btn btn-mini btn-primary"> <i class="icon-filter"></i> </a> </div--> </th>
19 <th>Output</th> 70 <th class="time"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="How long it took the build to finish"></i> <a href="#" style="font-weight:normal;">Time</a> </th>
20 <th>Log</th> 71 <th class="log span4"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="The location in disk of the build main log file"></i> <a href="#" style="font-weight:normal;">Log</a> </th>
21 <th>Bitbake Version</th> 72 <th class="output"> <i class="icon-question-sign get-help" data-toggle="tooltip" title="The root file system types produced by the build. You can find them in your <code>/build/tmp/deploy/images/</code> directory"></i> <a href="#" style="font-weight:normal;">Output</a> </th>
22 <th>Build Name</th> 73
23 </tr> 74 </tr>
24 {% for build in objects %} 75 {% for build in objects %}
25 <tr class="data"> 76 <tr class="data">
26 <td><a href="{% url "configuration" build.id %}">{{build.get_outcome_display}}</a></td> 77 <td class="outcome"><a href="{% url "configuration" build.id %}">{%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}</a></td>
27 <td>{{build.started_on}}</td> 78 <td class="target">{% for t in build.target_set.all %}{%if t.is_image %}<a href="{% url "target" build.id t.id %}">{% endif %}{{t.target}}{% if t.is_image %}</a>{% endif %}<br/>{% endfor %}</td>
28 <td>{{build.completed_on}}</td> 79 <td class="machine">{{build.machine}}</td>
29 <td>{% for t in build.target_set.all %}{%if t.is_image %}<a href="{% url "tpackage" build.id t.id %}">{% endif %}{{t.target}}{% if t.is_image %}</a>{% endif %}<br/>{% endfor %}</td> 80 <td class="started_on">{{build.started_on}}</td>
30 <td>{{build.machine}}</td> 81 <td class="completed_on">{{build.completed_on}}</td>
31 <td>{% time_difference build.started_on build.completed_on %}</td> 82 <td class="failed_tasks"></td>
32 <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> 83 <td class="errors">{% if build.errors_no %}<a class="error" href="#">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>{%endif%}</td>
33 <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> 84 <td class="warnings">{% if build.warnings_no %}<a class="warning" href="#">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>{%endif%}</td>
34 <td>{% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}{{build.image_fstypes}}{% endif %}{% endfor %}{% endif %}</td> 85 <td class="time">{{build|timespent}}</td>
35 <td>{{build.cooker_log_path}}</td> 86 <td class="log">{{build.log}}</td>
36 <td>{{build.bitbake_version}}</td> 87 <td class="output">{% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}{{build.image_fstypes}}{% endif %}{% endfor %}{% endif %}</td>
37 <td>{{build.build_name}}</td>
38 </tr> 88 </tr>
39 89
40 {% endfor %} 90 {% endfor %}
41{% endblock %}
42 91
43 92
93{% include "basetable_bottom.html" %}
94
95</div>
96{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
new file mode 100644
index 0000000000..7c58cc0b25
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
@@ -0,0 +1,8 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Dashboard</li>
4{% endblock %}
5
6{% block buildinfomain %}
7
8{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/buildtime.html b/bitbake/lib/toaster/toastergui/templates/buildtime.html
new file mode 100644
index 0000000000..ea84ae797c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/buildtime.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Build Time</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configuration.html b/bitbake/lib/toaster/toastergui/templates/configuration.html
index 521620fdce..e390a95ff5 100644
--- a/bitbake/lib/toaster/toastergui/templates/configuration.html
+++ b/bitbake/lib/toaster/toastergui/templates/configuration.html
@@ -1,7 +1,11 @@
1{% extends "basebuildpage.html" %} 1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Configuration</li>
4{% endblock %}
5
6{% block buildinfomain %}
2 7
3{% block pagetitle %}Configuration{% endblock %} 8{% include "basetable_top.html" %}
4{% block pagetable %}
5 9
6 <tr> 10 <tr>
7 <th>Name</th> 11 <th>Name</th>
@@ -19,4 +23,6 @@
19 <td>{{variable.variable_value}}</td> 23 <td>{{variable.variable_value}}</td>
20 {% endfor %} 24 {% endfor %}
21 25
26{% include "basetable_bottom.html" %}
27
22{% endblock %} 28{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/cpuusage.html b/bitbake/lib/toaster/toastergui/templates/cpuusage.html
new file mode 100644
index 0000000000..02f07b7605
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/cpuusage.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Cpu Usage</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/diskio.html b/bitbake/lib/toaster/toastergui/templates/diskio.html
new file mode 100644
index 0000000000..c5cef6f385
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/diskio.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Disk I/O</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html
index d7f57eb9ea..87c69b8d3c 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe.html
@@ -1,14 +1,11 @@
1{% extends "basetable.html" %} 1{% extends "basebuildpage.html" %}
2 2
3{% block pagename %} 3{% block localbreadcrumb %}
4<ul class="nav nav-tabs" style="display: inline-block"> 4<li>Recipes</li>
5 <li><a>Layer {{layer_version.layer.name}}&nbsp;:&nbsp;{{layer_version.branch}}&nbsp;:&nbsp;{{layer_version.commit}}&nbsp;:&nbsp;{{layer_version.priority}}</a></li>
6</ul>
7 <h1>Toaster - Recipes for a Layer</h1>
8{% endblock %} 5{% endblock %}
9 6
10{% block pagetable %} 7{% block buildinfomain %}
11 {% load projecttags %} 8{% include "basetable_top.html" %}
12 9
13 <tr> 10 <tr>
14 </tr> 11 </tr>
@@ -49,4 +46,6 @@
49 46
50 {% endfor %} 47 {% endfor %}
51 48
49{% include "basetable_bottom.html" %}
50
52{% endblock %} 51{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/target.html b/bitbake/lib/toaster/toastergui/templates/target.html
new file mode 100644
index 0000000000..f2d0ad461b
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/target.html
@@ -0,0 +1,8 @@
1{% extends "basebuildpage.html" %}
2
3{% block localbreadcrumb %}
4<li>Target</li>
5{% endblock %}
6
7{% block buildinfomain %}
8{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/task.html b/bitbake/lib/toaster/toastergui/templates/task.html
index de965ab797..6af2c51277 100644
--- a/bitbake/lib/toaster/toastergui/templates/task.html
+++ b/bitbake/lib/toaster/toastergui/templates/task.html
@@ -1,7 +1,13 @@
1{% extends "basebuildpage.html" %} 1{% extends "basebuildpage.html" %}
2 2
3{% block pagetitle %}Tasks{% endblock %} 3{% block localbreadcrumb %}
4{% block pagetable %} 4<li>Tasks</li>
5{% endblock %}
6
7{% block buildinfomain %}
8{% include "basetable_top.html" %}
9
10
5 {% if not objects %} 11 {% if not objects %}
6 <p>No tasks were executed in this build!</p> 12 <p>No tasks were executed in this build!</p>
7 {% else %} 13 {% else %}
@@ -64,4 +70,5 @@
64 70
65 {% endif %} 71 {% endif %}
66 72
73{% include "basetable_bottom.html" %}
67{% endblock %} 74{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templatetags/projecttags.py b/bitbake/lib/toaster/toastergui/templatetags/projecttags.py
index 0c0d804c0c..5f60379932 100644
--- a/bitbake/lib/toaster/toastergui/templatetags/projecttags.py
+++ b/bitbake/lib/toaster/toastergui/templatetags/projecttags.py
@@ -24,3 +24,8 @@ register = template.Library()
24@register.simple_tag 24@register.simple_tag
25def time_difference(start_time, end_time): 25def time_difference(start_time, end_time):
26 return end_time - start_time 26 return end_time - start_time
27
28@register.filter(name = 'timespent')
29def timespent(build_object):
30 tdsec = (build_object.completed_on - build_object.started_on).total_seconds()
31 return "%02d:%02d:%02d" % (int(tdsec/3600), int((tdsec - tdsec/ 3600)/ 60), int(tdsec) % 60)
diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py
index b84c95f08b..f531eb0137 100644
--- a/bitbake/lib/toaster/toastergui/urls.py
+++ b/bitbake/lib/toaster/toastergui/urls.py
@@ -19,14 +19,34 @@
19from django.conf.urls import patterns, include, url 19from django.conf.urls import patterns, include, url
20from django.views.generic import RedirectView 20from django.views.generic import RedirectView
21 21
22urlpatterns = patterns('bldviewer.views', 22urlpatterns = patterns('toastergui.views',
23 url(r'^builds/$', 'build', name='all-builds'), 23 # landing page
24 url(r'^build/(?P<build_id>\d+)/task/$', 'task', name='task'), 24 url(r'^builds/$', 'builds', name='all-builds'),
25 url(r'^build/(?P<build_id>\d+)/packages/$', 'bpackage', name='bpackage'), 25 # build info navigation
26 url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)/files/$', 'bfile', name='bfile'), 26 url(r'^build/(?P<build_id>\d+)$', 'builddashboard', name="builddashboard"),
27 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packages/$', 'tpackage', name='tpackage'), 27
28 url(r'^build/(?P<build_id>\d+)/configuration/$', 'configuration', name='configuration'), 28 url(r'^build/(?P<build_id>\d+)/tasks/$', 'tasks', name='tasks'),
29 url(r'^build/(?P<build_id>\d+)/task/(?P<task_id>\d+)$', 'task', name='task'),
30
31 url(r'^build/(?P<build_id>\d+)/recipes/$', 'recipes', name='recipes'),
32 url(r'^build/(?P<build_id>\d+)/recipe/(?P<recipe_id>\d+)$', 'recipe', name='recipe'),
33
34 url(r'^build/(?P<build_id>\d+)/packages/$', 'bpackage', name='packages'),
35 url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)$', 'bfile', name='package'),
36
37 # images are known as targets in the internal model
38 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', 'target', name='target'),
39 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packages$', 'tpackage', name='targetpackages'),
40
41 url(r'^build/(?P<build_id>\d+)/configuration$', 'configuration', name='configuration'),
42 url(r'^build/(?P<build_id>\d+)/buildtime$', 'buildtime', name='buildtime'),
43 url(r'^build/(?P<build_id>\d+)/cpuusage$', 'cpuusage', name='cpuusage'),
44 url(r'^build/(?P<build_id>\d+)/diskio$', 'diskio', name='diskio'),
45
46
47 # urls not linked from the dashboard
29 url(r'^layers/$', 'layer', name='all-layers'), 48 url(r'^layers/$', 'layer', name='all-layers'),
30 url(r'^layerversions/(?P<layerversion_id>\d+)/recipes/.*$', 'layer_versions_recipes', name='layer_versions_recipes'), 49 url(r'^layerversions/(?P<layerversion_id>\d+)/recipes/.*$', 'layer_versions_recipes', name='layer_versions_recipes'),
50 # default redirection
31 url(r'^$', RedirectView.as_view( url= 'builds/')), 51 url(r'^$', RedirectView.as_view( url= 'builds/')),
32) 52)
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index 7cb9b42379..663e03dfd2 100644
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -19,7 +19,7 @@
19import operator 19import operator
20 20
21from django.db.models import Q 21from django.db.models import Q
22from django.shortcuts import render 22from django.shortcuts import render, redirect
23from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable 23from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable
24from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency 24from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency
25from orm.models import Target_Installed_Package 25from orm.models import Target_Installed_Package
@@ -35,6 +35,7 @@ def _build_page_range(paginator, index = 1):
35 except EmptyPage: 35 except EmptyPage:
36 page = paginator.page(paginator.num_pages) 36 page = paginator.page(paginator.num_pages)
37 37
38
38 page.page_range = [page.number] 39 page.page_range = [page.number]
39 crt_range = 0 40 crt_range = 0
40 for i in range(1,5): 41 for i in range(1,5):
@@ -48,22 +49,124 @@ def _build_page_range(paginator, index = 1):
48 break 49 break
49 return page 50 return page
50 51
51@cache_control(no_store=True)
52def build(request):
53 template = 'build.html'
54 logs = LogMessage.objects.all()
55 52
56 build_info = _build_page_range(Paginator(Build.objects.order_by("-id"), 10),request.GET.get('page', 1)) 53def _verify_parameters(g, mandatory_parameters):
54 miss = []
55 for mp in mandatory_parameters:
56 if not mp in g:
57 miss.append(mp)
58 if len(miss):
59 return miss
60 return None
61
62def _redirect_parameters(view, g, mandatory_parameters):
63 import urllib
64 from django.core.urlresolvers import reverse
65 url = reverse(view)
66 params = {}
67 for i in g:
68 params[i] = g[i]
69 for i in mandatory_parameters:
70 if not i in params:
71 params[i] = mandatory_parameters[i]
72
73 return redirect(url + "?%s" % urllib.urlencode(params))
74
57 75
58 context = {'objects': build_info, 'logs': logs , 76# shows the "all builds" page
59 'hideshowcols' : [ 77def builds(request):
60 {'name': 'Output', 'order':10}, 78 template = 'build.html'
61 {'name': 'Log', 'order':11}, 79 # define here what parameters the view needs in the GET portion in order to
80 # be able to display something. 'count' and 'page' are mandatory for all views
81 # that use paginators.
82 mandatory_parameters = { 'count': 10, 'page' : 1};
83 retval = _verify_parameters( request.GET, mandatory_parameters )
84 if retval:
85 return _redirect_parameters( builds, request.GET, mandatory_parameters)
86
87 # retrieve the objects that will be displayed in the table
88 build_info = _build_page_range(Paginator(Build.objects.exclude(outcome = Build.IN_PROGRESS).order_by("-id"), request.GET.get('count', 10)),request.GET.get('page', 1))
89
90 # build view-specific information; this is rendered specifically in the builds page
91 build_mru = Build.objects.order_by("-started_on")[:3]
92 for b in [ x for x in build_mru if x.outcome == Build.IN_PROGRESS ]:
93 tf = Task.objects.filter(build = b)
94 b.completeper = tf.exclude(order__isnull=True).count()*100/tf.count()
95 from django.utils import timezone
96 b.eta = timezone.now() + ((timezone.now() - b.started_on)*100/b.completeper)
97
98 # send the data to the template
99 context = {
100 # specific info for
101 'mru' : build_mru,
102 # TODO: common objects for all table views, adapt as needed
103 'objects' : build_info,
104 'tablecols' : [
105 {'name': 'Target ', 'clclass': 'target',},
106 {'name': 'Machine ', 'clclass': 'machine'},
107 {'name': 'Completed on ', 'clclass': 'completed_on'},
108 {'name': 'Failed tasks ', 'clclass': 'failed_tasks'},
109 {'name': 'Errors ', 'clclass': 'errors_no'},
110 {'name': 'Warnings', 'clclass': 'warnings_no'},
111 {'name': 'Output ', 'clclass': 'output'},
112 {'name': 'Started on ', 'clclass': 'started_on', 'hidden' : 1},
113 {'name': 'Time ', 'clclass': 'time', 'hidden' : 1},
114 {'name': 'Output', 'clclass': 'output'},
115 {'name': 'Log', 'clclass': 'log', 'hidden': 1},
62 ]} 116 ]}
63 117
64 return render(request, template, context) 118 return render(request, template, context)
65 119
66 120
121# build dashboard for a single build, coming in as argument
122def builddashboard(request, build_id):
123 template = "builddashboard.html"
124 if Build.objects.filter(pk=build_id).count() == 0 :
125 return redirect(builds)
126 context = {
127 'build' : Build.objects.filter(pk=build_id)[0],
128 }
129 return render(request, template, context)
130
131def task(request, build_id, task_id):
132 template = "singletask.html"
133 if Build.objects.filter(pk=build_id).count() == 0 :
134 return redirect(builds)
135 context = {
136 'build' : Build.objects.filter(pk=build_id)[0],
137 }
138 return render(request, template, context)
139
140def recipe(request, build_id, recipe_id):
141 template = "recipe.html"
142 if Recipe.objects.filter(pk=recipe_id).count() == 0 :
143 return redirect(builds)
144 context = {
145 'build' : Build.objects.filter(pk=build_id)[0],
146 'object' : Recipe.objects.filter(pk=recipe_id)[0],
147 }
148 return render(request, template, context)
149
150def package(request, build_id, package_id):
151 template = "singlepackage.html"
152 if Build.objects.filter(pk=build_id).count() == 0 :
153 return redirect(builds)
154 context = {
155 'build' : Build.objects.filter(pk=build_id)[0],
156 }
157 return render(request, template, context)
158
159def target(request, build_id, target_id):
160 template = "target.html"
161 if Build.objects.filter(pk=build_id).count() == 0 :
162 return redirect(builds)
163 context = {
164 'build' : Build.objects.filter(pk=build_id)[0],
165 }
166 return render(request, template, context)
167
168
169
67def _find_task_revdep(task): 170def _find_task_revdep(task):
68 tp = [] 171 tp = []
69 for p in Task_Dependency.objects.filter(depends_on=task): 172 for p in Task_Dependency.objects.filter(depends_on=task):
@@ -81,7 +184,7 @@ def _find_task_provider(task):
81 return trc 184 return trc
82 return None 185 return None
83 186
84def task(request, build_id): 187def tasks(request, build_id):
85 template = 'task.html' 188 template = 'task.html'
86 189
87 tasks = _build_page_range(Paginator(Task.objects.filter(build=build_id), 100),request.GET.get('page', 1)) 190 tasks = _build_page_range(Paginator(Task.objects.filter(build=build_id), 100),request.GET.get('page', 1))
@@ -94,12 +197,52 @@ def task(request, build_id):
94 197
95 return render(request, template, context) 198 return render(request, template, context)
96 199
200def recipes(request, build_id):
201 template = 'recipe.html'
202
203 recipes = _build_page_range(Paginator(Recipe.objects.filter(build_recipe=build_id), 100),request.GET.get('page', 1))
204
205 context = {'build': Build.objects.filter(pk=build_id)[0], 'objects': recipes}
206
207 return render(request, template, context)
208
209
97def configuration(request, build_id): 210def configuration(request, build_id):
98 template = 'configuration.html' 211 template = 'configuration.html'
99 variables = _build_page_range(Paginator(Variable.objects.filter(build=build_id), 50), request.GET.get('page', 1)) 212 variables = _build_page_range(Paginator(Variable.objects.filter(build=build_id), 50), request.GET.get('page', 1))
100 context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : variables} 213 context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : variables}
101 return render(request, template, context) 214 return render(request, template, context)
102 215
216def buildtime(request, build_id):
217 template = "buildtime.html"
218 if Build.objects.filter(pk=build_id).count() == 0 :
219 return redirect(builds)
220 context = {
221 'build' : Build.objects.filter(pk=build_id)[0],
222 }
223 return render(request, template, context)
224
225def cpuusage(request, build_id):
226 template = "cpuusage.html"
227 if Build.objects.filter(pk=build_id).count() == 0 :
228 return redirect(builds)
229 context = {
230 'build' : Build.objects.filter(pk=build_id)[0],
231 }
232 return render(request, template, context)
233
234def diskio(request, build_id):
235 template = "diskio.html"
236 if Build.objects.filter(pk=build_id).count() == 0 :
237 return redirect(builds)
238 context = {
239 'build' : Build.objects.filter(pk=build_id)[0],
240 }
241 return render(request, template, context)
242
243
244
245
103def bpackage(request, build_id): 246def bpackage(request, build_id):
104 template = 'bpackage.html' 247 template = 'bpackage.html'
105 packages = Package.objects.filter(build = build_id) 248 packages = Package.objects.filter(build = build_id)
@@ -227,8 +370,8 @@ def model_explorer(request, model_name):
227 response_data['count'] = queryset.count() 370 response_data['count'] = queryset.count()
228 else: 371 else:
229 response_data['count'] = 0 372 response_data['count'] = 0
230
231 response_data['list'] = serializers.serialize('json', queryset) 373 response_data['list'] = serializers.serialize('json', queryset)
374# response_data = serializers.serialize('json', queryset)
232 375
233 return HttpResponse(json.dumps(response_data), 376 return HttpResponse(json.dumps(response_data),
234 content_type='application/json') 377 content_type='application/json')
diff --git a/bitbake/lib/toaster/toastermain/settings.py b/bitbake/lib/toaster/toastermain/settings.py
index b76218b959..679035e887 100644
--- a/bitbake/lib/toaster/toastermain/settings.py
+++ b/bitbake/lib/toaster/toastermain/settings.py
@@ -133,6 +133,15 @@ TEMPLATE_DIRS = (
133 # Don't forget to use absolute paths, not relative paths. 133 # Don't forget to use absolute paths, not relative paths.
134) 134)
135 135
136TEMPLATE_CONTEXT_PROCESSORS = ('django.contrib.auth.context_processors.auth',
137 'django.core.context_processors.debug',
138 'django.core.context_processors.i18n',
139 'django.core.context_processors.media',
140 'django.core.context_processors.static',
141 'django.core.context_processors.tz',
142 'django.contrib.messages.context_processors.messages',
143 "django.core.context_processors.request")
144
136INSTALLED_APPS = ( 145INSTALLED_APPS = (
137 #'django.contrib.auth', 146 #'django.contrib.auth',
138 #'django.contrib.contenttypes', 147 #'django.contrib.contenttypes',
@@ -144,6 +153,7 @@ INSTALLED_APPS = (
144 # 'django.contrib.admin', 153 # 'django.contrib.admin',
145 # Uncomment the next line to enable admin documentation: 154 # Uncomment the next line to enable admin documentation:
146 # 'django.contrib.admindocs', 155 # 'django.contrib.admindocs',
156 'django.contrib.humanize',
147 'orm', 157 'orm',
148 'toastermain', 158 'toastermain',
149 'toastergui', 159 'toastergui',