All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 01/14] toaster: make layouts consistent
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 02/14] toaster: apply common styles to right hand column of detail pages Alex DAMIAN
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Alexandru DAMIAN

From: Belen Barros Pena <belen.barros.pena@intel.com>

The layer details page should have the same layout as all
other detail pages (recipes, packages). For this to happen,
the basebuilddetailpage.html and baseprojectpage.html
templates should use the same layout, and so should the
layerdetails.html and recipe.html templates.

This patch also capitalises the string 'All layers' in the
breadcrumb of layerdetails.html as all other breadcrumb elements.

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
---
 lib/toaster/toastergui/templates/baseprojectpage.html | 12 ++++--------
 lib/toaster/toastergui/templates/layerdetails.html    | 17 ++++-------------
 lib/toaster/toastergui/templates/project.html         |  4 ++--
 3 files changed, 10 insertions(+), 23 deletions(-)

diff --git a/lib/toaster/toastergui/templates/baseprojectpage.html b/lib/toaster/toastergui/templates/baseprojectpage.html
index 95a9f47..e140925 100644
--- a/lib/toaster/toastergui/templates/baseprojectpage.html
+++ b/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -4,7 +4,7 @@
 {% block pagecontent %}
 
 
- <div class="">
+ <div class="row-fluid">
 <!-- Breadcrumbs -->
     <div class="section">
         <ul class="breadcrumb" id="breadcrumb">
@@ -28,14 +28,10 @@
         </script>
     </div>
 
-    <div>
+    <!-- Begin main page container -->
+    {% block projectinfomain %}{% endblock %}
+    <!-- End main container -->
 
-        <!-- Begin main page container -->
-        {% block projectinfomain %}{% endblock %}
-        <!-- End main container -->
-
-
-    </div>
   </div>
 
 
diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index 5bed0f8..22e99e0 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -3,7 +3,7 @@
 {% load humanize %}
 {% load static %}
 {% block localbreadcrumb %}
-<li><a href="{% url 'layers' %}">All Layers</a></li>
+<li><a href="{% url 'layers' %}">All layers</a></li>
 <li>
   {{layerversion.layer.name}} ({{layerversion.commit|truncatechars:13}})
 </li>
@@ -63,18 +63,13 @@
 {% endif %}
 
 {% include "layers_dep_modal.html" %}
- <div class="container-fluid top-padded">
-  <div class="row-fluid">
-    <div class="span11">
+  <div class="row-fluid span11">
       <div class="page-header">
         <h1>{{layerversion.layer.name}} <small class="commit" data-toggle="tooltip" title="{{layerversion.commit}}">({{layerversion.commit|truncatechars:13}})</small></h1>
       </div>
-    </div>
   </div>
 
-    <div class="row-fluid">
-    <div class="span7">
-      <div class="tabbable">
+    <div class="row-fluid span7 tabbable">
         <div class="alert alert-info lead" id="alert-area" style="display:none">
           <button type="button" class="close" id="dismiss-alert" data-dismiss="alert">&times;</button>
           <span id="alert-msg"></span>
@@ -91,7 +86,6 @@
             <a data-toggle="tab" href="#machines" id="machines-tab">Machines ({{total_machines}})</a>
           </li>
         </ul>
-      </div>
       <div class="tab-content">
         <span class="button-place">
           {% if layer_in_project == 0 %}
@@ -435,7 +429,7 @@
                   </div>
               </div>
             </div>
-            <div class="row span4 well">
+            <div class="row-fluid span4 well">
               <h2>About {{layerversion.layer.name}}</h2>
               <dl>
 
@@ -480,7 +474,4 @@
            </dl>
          </div>
 
-          </div>
-       </div>
-   </div>
 {% endblock %}
diff --git a/lib/toaster/toastergui/templates/project.html b/lib/toaster/toastergui/templates/project.html
index b8579e4..3b75d19 100644
--- a/lib/toaster/toastergui/templates/project.html
+++ b/lib/toaster/toastergui/templates/project.html
@@ -91,7 +91,7 @@ vim: expandtab tabstop=2
   <div class="well">
     <form class="build-form" ng-submit="buildNamedTarget()">
       <div class="input-append controls">
-        <input type="text" class="huge span7" placeholder="Type the target(s) you want to build" autocomplete="off" ng-model="targetName" typeahead="e.name for e in getAutocompleteSuggestions('targets', $viewValue)|filter:$viewValue" typeahead-template-url="suggestion_details" ng-disabled="!layers.length"/>
+        <input type="text" class="huge input-xxlarge" placeholder="Type the target(s) you want to build" autocomplete="off" ng-model="targetName" typeahead="e.name for e in getAutocompleteSuggestions('targets', $viewValue)|filter:$viewValue" typeahead-template-url="suggestion_details" ng-disabled="!layers.length"/>
         <button type="submit" class="btn btn-large btn-primary" ng-disabled="!targetName.length">
         Build
         </button>
@@ -337,7 +337,7 @@ vim: expandtab tabstop=2
       <p class="link-action">
             <a href="{% url 'projectconf' project.id %}" class="link">Edit configuration variables</a>
             <i data-original-title="You can set other project configuration options here. Each option, like everything else in the build system, is a variable - value pair" class="icon-question-sign get-help heading-help" title=""></i>
-			</p>
+            </p>
     </div>
   </div>
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 02/14] toaster: apply common styles to right hand column of detail pages
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 01/14] toaster: make layouts consistent Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 03/14] toastergui: Generic message for the layer details empty states Alex DAMIAN
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

Layer, recipe and package details pages have a right column
with additional information. This commit standardises the
formatting of the content in that right column across
all these pages by creating a new css class .item-info
in default.css

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/static/css/default.css             | 3 +--
 lib/toaster/toastergui/templates/layerdetails.html        | 2 +-
 lib/toaster/toastergui/templates/package_detail_base.html | 2 +-
 lib/toaster/toastergui/templates/recipe.html              | 6 +++---
 4 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/lib/toaster/toastergui/static/css/default.css b/lib/toaster/toastergui/static/css/default.css
index a3fa0dd..5eeeea4 100644
--- a/lib/toaster/toastergui/static/css/default.css
+++ b/lib/toaster/toastergui/static/css/default.css
@@ -38,7 +38,7 @@ dd code, .alert code { white-space: pre-wrap; word-break: break-all; word-wrap:
 dd ul { list-style-type: none; margin: 0px; }
 dt, dd  {line-height: 25px; }
 dd li { line-height: 25px; }
-dd p { line-height: 20px; }
+.item-info dd { line-height: 20px; margin-bottom: 10px; }
 
 /* Style the filter modal dialogs */
 .modal { width: 800px; margin-left: -400px; }
@@ -200,7 +200,6 @@ dl textarea { resize: vertical; }
 .lead .help-block { font-size: 14px; line-height: 20px; font-weight: normal; }
 .button-place  .btn { margin: 0 0 20px 0; }
 .tooltip-inner { max-width: 250px; }
-dd > span { line-height: 20px; }
 .new-build { padding: 20px; }
 .new-build li { line-height: 30px; }
 .new-build h6 { margin: 10px 0 0 0; color: #5a5a5a; }
diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index 22e99e0..9286df6 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -431,7 +431,7 @@
             </div>
             <div class="row-fluid span4 well">
               <h2>About {{layerversion.layer.name}}</h2>
-              <dl>
+              <dl class="item-info">
 
                 <dt>
                   Summary
diff --git a/lib/toaster/toastergui/templates/package_detail_base.html b/lib/toaster/toastergui/templates/package_detail_base.html
index dfeba55..ad75454 100644
--- a/lib/toaster/toastergui/templates/package_detail_base.html
+++ b/lib/toaster/toastergui/templates/package_detail_base.html
@@ -54,7 +54,7 @@
         <h2>Package information</h2>
 
         <!-- info presented as definition list -->
-        <dl>
+        <dl class="item-info">
             <dt>
                 Size
                 <i class="icon-question-sign get-help" title="The size of the package"></i>
diff --git a/lib/toaster/toastergui/templates/recipe.html b/lib/toaster/toastergui/templates/recipe.html
index b20c65e..d91768d 100644
--- a/lib/toaster/toastergui/templates/recipe.html
+++ b/lib/toaster/toastergui/templates/recipe.html
@@ -250,14 +250,14 @@
 
 <div class="row span4 well">
     <h2>About {{object.name}}</h2>
-    <dl>
+    <dl class="item-info">
         {% if object.summary %}
             <dt>Summary</dt>
-            <dd><p>{{object.summary}}</p></dd>
+            <dd>{{object.summary}}</dd>
         {% endif %}
         {% if object.description %}
             <dt>Description</dt>
-            <dd><p>{{object.description}}</dd>
+            <dd>{{object.description}}</dd>
         {% endif %}
         {% if object.homepage %}
             <dt>Homepage</dt>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 03/14] toastergui: Generic message for the layer details empty states
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 01/14] toaster: make layouts consistent Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 02/14] toaster: apply common styles to right hand column of detail pages Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 04/14] toastergui: remove redundant style declaration Alex DAMIAN
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

In the layer details page, change the message you see when
the number of targets or machines provided by a layer is
0, either because that's what's reported by a layer index
instance, or because Toaster does not have any information
about the layer.

The new message is more generic, in order to fit layers from
all layer sources.

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/templates/layerdetails.html | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index 9286df6..207197bce 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -184,9 +184,7 @@
                 <div name="targets" id="targets" class="tab-pane">
                   {% if total_targets == 0 %}
                   <div class="alert alert-info">
-                    <strong>There is no target data for {{layerversion.layer.name}} ... yet</strong> <br />
-                    Toaster learns about layers as they are built. Once you have used {{layerversion.layer.name}} in a build, Toaster will show you
-                    here the targets it provides.
+                    There is no target information for the <strong> {{layerversion.layer.name}} </strong> layer.
                   </div>
                   {% else %}
 
@@ -313,9 +311,7 @@
                 <div name="machines" id="machines" class="tab-pane">
                   {% if total_machines == 0 %}
                   <div class="alert alert-info">
-                    <strong>There is no machine data for {{layerversion.layer.name}} ... yet</strong> <br />
-                    Toaster learns about layers as they are built. Once you have used {{layerversion.layer.name}} in a build, Toaster will show you
-                    here the machines it provides.
+                    There is no machine information for the <strong>{{layerversion.layer.name}}</strong> layer.
                   </div>
                   {% else %}
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 04/14] toastergui: remove redundant style declaration
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (2 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 03/14] toastergui: Generic message for the layer details empty states Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 05/14] toastergui: consistent add / remove layer notifications Alex DAMIAN
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

The bottom margin for dd tags nested inside forms is
set twice. Delete one of them.

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/static/css/default.css | 1 -
 1 file changed, 1 deletion(-)

diff --git a/lib/toaster/toastergui/static/css/default.css b/lib/toaster/toastergui/static/css/default.css
index 5eeeea4..cb27342 100644
--- a/lib/toaster/toastergui/static/css/default.css
+++ b/lib/toaster/toastergui/static/css/default.css
@@ -184,7 +184,6 @@ a code:hover { color: #005580; }
 .control-group { margin-bottom: 0px; }
 #project-details form { margin: 0px; }
 dd form { margin: 10px 0 0 0; }
-dd form { margin-bottom: 0px; }
 dl textarea { resize: vertical; }
 .navbar-fixed-top {  z-index: 1; }
 .popover { z-index: 2; }
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 05/14] toastergui: consistent add / remove layer notifications
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (3 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 04/14] toastergui: remove redundant style declaration Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 06/14] toastergui: give the add dependencies form some breathing space Alex DAMIAN
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

In my struggle to ensure consistency in the format and content
of the notifications we show when you add and remove layers to
a project, I've:

* added the project name to the notifications
in the layer details page

* removed the 'Go to project configuration' link
from the notifications in the layer details page

This changes align the notifications we show in the layer
details page with the ones we show in the 'all' pages.

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/static/js/layerdetails.js   | 10 ++++++----
 lib/toaster/toastergui/templates/layerdetails.html |  2 +-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/toaster/toastergui/static/js/layerdetails.js b/lib/toaster/toastergui/static/js/layerdetails.js
index 41cbf4b..2addecd 100644
--- a/lib/toaster/toastergui/static/js/layerdetails.js
+++ b/lib/toaster/toastergui/static/js/layerdetails.js
@@ -211,7 +211,7 @@ function layerDetailsPageInit (ctx) {
       addRmLayerBtn.prepend("<span class=\"icon-trash\"></span>");
 
       if (depsList) {
-        alertMsg.append("You have added <strong>"+(depsList.length+1)+"</strong> layers: <span id=\"layer-affected-name\"></span> and its dependencies ");
+        alertMsg.append("You have added <strong>"+(depsList.length+1)+"</strong> layers to <a id=\"project-affected-name\"></a>: <span id=\"layer-affected-name\"></span> and its dependencies ");
 
         /* Build the layer deps list */
         depsList.map(function(layer, i){
@@ -227,7 +227,7 @@ function layerDetailsPageInit (ctx) {
           alertMsg.append(link);
         });
       } else {
-        alertMsg.append("You have added <strong>1</strong> layer: <span id=\"layer-affected-name\"></span>");
+        alertMsg.append("You have added <strong>1</strong> layer to <a id=\"project-affected-name\"></a>: <span id=\"layer-affected-name\"></span>");
       }
     } else {
       /* disable and switch all the button states */
@@ -252,10 +252,12 @@ function layerDetailsPageInit (ctx) {
           break;
       }
 
-      alertMsg.append("You have deleted <strong>1</strong> layer: <span id=\"layer-affected-name\"></span>");
+      alertMsg.append("You have deleted <strong>1</strong> layer from <a id=\"project-affected-name\"></a>: <span id=\"layer-affected-name\"></span>");
     }
 
-    alertMsg.children("#layer-affected-name").text(ctx.layerVersion.name);
+    alertMsg.children("#layer-affected-name").html("<strong>" + ctx.layerVersion.name + "</strong>");
+    alertMsg.children("#project-affected-name").text(ctx.projectName);
+    alertMsg.children("#project-affected-name").attr("href", ctx.projectPageUrl);
     $("#alert-area").show();
   }
 
diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index 207197bce..a89ffb0 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -23,6 +23,7 @@
       xhrDataTypeaheadUrl : "{% url 'xhr_datatypeahead' %}",
       xhrUpdateLayerUrl : "{% url 'xhr_updatelayer' %}",
       projectId : {{project.id}},
+      projectName : "{{project.name}}",
       numTargets : {{total_targets}},
       numMachines: {{machines|length}},
       layerVersion : {
@@ -73,7 +74,6 @@
         <div class="alert alert-info lead" id="alert-area" style="display:none">
           <button type="button" class="close" id="dismiss-alert" data-dismiss="alert">&times;</button>
           <span id="alert-msg"></span>
-          <p style="margin-top:10px;"><a href="{% url 'project' project.id %}">Go to project configuration</a></p>
         </div>
         <ul class="nav nav-pills">
           <li class="active">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 06/14] toastergui: give the add dependencies form some breathing space
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (4 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 05/14] toastergui: consistent add / remove layer notifications Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 07/14] toastergui: add 'show all' link to no results page Alex DAMIAN
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

In the editable version of the layer details page, the form to
add dependencies needs some distance from the dependency list.

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/static/css/default.css | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/toaster/toastergui/static/css/default.css b/lib/toaster/toastergui/static/css/default.css
index cb27342..1095254 100644
--- a/lib/toaster/toastergui/static/css/default.css
+++ b/lib/toaster/toastergui/static/css/default.css
@@ -206,6 +206,7 @@ dl textarea { resize: vertical; }
 .new-build form { margin: 5px 0 0; }
 .new-build .input-append { margin-bottom: 0; }
 #build-selected { margin-top: 15px; }
+div.add-deps { margin-top: 15px; }
 
 
 .animate-repeat {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 07/14] toastergui: add 'show all' link to no results page
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (5 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 06/14] toastergui: give the add dependencies form some breathing space Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 08/14] toastergui: set column width in layer details page Alex DAMIAN
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

When you search for targets or machines in the layer details
page and your search returns no results, you should
see a 'show all' link that you can click to clear the
search and display all table entries.

[YOCTO #7218]

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/static/js/layerdetails.js   |  4 ++--
 lib/toaster/toastergui/templates/layerdetails.html | 10 ++++++++--
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/lib/toaster/toastergui/static/js/layerdetails.js b/lib/toaster/toastergui/static/js/layerdetails.js
index 2addecd..2793225 100644
--- a/lib/toaster/toastergui/static/js/layerdetails.js
+++ b/lib/toaster/toastergui/static/js/layerdetails.js
@@ -381,12 +381,12 @@ function layerDetailsPageInit (ctx) {
   });
 
   /* Clear the current search selection and reload the results */
-  $("#target-search-clear").click(function(){
+  $(".target-search-clear").click(function(){
     $("#target-search").val("");
     $(this).parents("form").submit();
   });
 
-  $("#machine-search-clear").click(function(){
+  $(".machine-search-clear").click(function(){
     $("#machine-search").val("");
     $(this).parents("form").submit();
   });
diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index a89ffb0..f8f2d7a 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -205,11 +205,14 @@
 
                       <input type="text" id="target-search" name="targets_search" placeholder="Search targets" class="input-xlarge" value="{{request.GET.targets_search}}">
                         {% if request.GET.targets_search %}
-                        <a class="add-on btn" id="target-search-clear">
+                        <a class="add-on btn target-search-clear">
                           <i class="icon-remove"></i>
                         </a>
                         {% endif %}
                         <button type="submit" class="btn">Search</button>
+                        {% if targets.paginator.count == 0 %}
+                            <button type="submit" class="btn btn-link target-search-clear">Show all targets</a>
+                        {% endif %}
                       </form>
                     {% endif %}
 
@@ -332,11 +335,14 @@
 
                       <input type="text" id="machine-search" name="machines_search" placeholder="Search machines" class="input-xlarge" value="{{request.GET.machines_search}}">
                         {% if request.GET.machines_search %}
-                        <a class="add-on btn" id="machine-search-clear">
+                        <a class="add-on btn machine-search-clear">
                           <i class="icon-remove"></i>
                         </a>
                         {% endif %}
                         <button type="submit" class="btn">Search</button>
+                        {% if machines.paginator.count == 0 %}
+                            <button type="submit" class="btn btn-link machine-search-clear">Show all machines</a>
+                        {% endif %}
                       </form>
                     {% endif %}
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 08/14] toastergui: set column width in layer details page
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (6 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 07/14] toastergui: add 'show all' link to no results page Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 09/14] toastergui: hide table controls when when less than 10 entries Alex DAMIAN
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

Set the width of the action columns to span2 to stop
the buttons from wrapping as much as possible.

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/templates/layerdetails.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index f8f2d7a..6c5e785 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -254,7 +254,7 @@
                           Target version
                         </th>
                         <th class="span4">Description</th>
-                        <th>Build target</th>
+                        <th class="span2">Build target</th>
                       </tr>
                     </thead>
                     <tbody>
@@ -380,7 +380,7 @@
                           {% endif %}
                         </th>
                         <th>Description</th>
-                        <th>Select machine</th>
+                        <th class="span2">Select machine</th>
                       </tr>
                     </thead>
                     <tbody>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 09/14] toastergui: hide table controls when when less than 10 entries
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (7 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 08/14] toastergui: set column width in layer details page Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 10/14] toastergui: consistent capitals in button Alex DAMIAN
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

The 'show rows' and pagination controls in the layer details
page should only show when there are more than 10 entries
in a table.

[YOCTO #7217]

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/templates/layerdetails.html | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index 6c5e785..1daf9b9 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -223,6 +223,7 @@
                      </div>
                     {% else %}
 
+                    {% if total_targets > 10 %}
                     <div class="pull-right">
                       <span class="help-inline" style="padding-top:5px;">Show rows:</span>
                       <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
@@ -237,6 +238,7 @@
                       {% endwith %}
                     </select>
                   </div>
+                  {% endif %}
                 </div>
 
                 <table class="table table-bordered table-hover">
@@ -274,6 +276,7 @@
                     </tbody>
                   </table>
 
+                  {% if total_targets > 10 %}
                   <!-- Show pagination controls -->
                   <div class="pagination">
                     <ul>
@@ -308,6 +311,7 @@
                   </div>
                   {% endif %}
                   {% endif %}
+                  {% endif %}
                 </div>
 
 
@@ -351,8 +355,10 @@
                      </div>
                      <!-- end row-fluid -->
                      </div>
+
                     {% else %}
 
+                    {% if total_machines > 10 %}
                     <div class="pull-right">
                       <span class="help-inline" style="padding-top:5px;">Show rows:</span>
                       <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
@@ -367,6 +373,8 @@
                       {% endwith %}
                     </select>
                   </div>
+                  {% endif %}
+
                 </div>
 
                 <table class="table table-bordered table-hover">
@@ -394,6 +402,7 @@
                     </tbody>
                   </table>
 
+                  {% if total_machines > 10 %}
                   <!-- Show pagination controls -->
                   <div class="pagination">
                     <ul>
@@ -428,6 +437,7 @@
                   </div>
                   {% endif %}
                   {% endif %}
+                  {% endif %}
                   </div>
               </div>
             </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 00/14] Toaster patchset
@ 2015-01-27 14:27 Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 01/14] toaster: make layouts consistent Alex DAMIAN
                   ` (13 more replies)
  0 siblings, 14 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Alexandru DAMIAN

From: Alexandru DAMIAN <alexandru.damian@intel.com>


Hello,

This is a Toaster bug fixing patchset, clearing up issues in the Project interface.

The patches have been reviewed on the toaster mailing list. Can you please pull
at your own convenience ?

Cheers,
Alex


The following changes since commit 9b5b1bd7d77e3f5886f6c557d3b750de1f6d6025:

  siggen: Ensure taskdata default functions exist in base class (2015-01-23 14:39:40 +0000)

are available in the git repository at:

  git://git.yoctoproject.org/poky-contrib adamian/20150127-submission-bb
  http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=adamian/20150127-submission-bb

Alexandru DAMIAN (1):
  toastergui: update project build listing

Alexandru Damian (1):
  toasterui: do not filter images by extension

Belen Barros Pena (12):
  toaster: make layouts consistent
  toaster: apply common styles to right hand column of detail pages
  toastergui: Generic message for the layer details empty states
  toastergui: remove redundant style declaration
  toastergui: consistent add / remove layer notifications
  toastergui: give the add dependencies form some breathing space
  toastergui: add 'show all' link to no results page
  toastergui: set column width in layer details page
  toastergui: hide table controls when when less than 10 entries
  toastergui: consistent capitals in button
  toastergui: remove recipe id links to the layer index
  toastergui: alignment fix

 lib/bb/ui/buildinfohelper.py                       |   2 +-
 lib/toaster/bldcontrol/models.py                   |   9 ++
 lib/toaster/toastergui/static/css/default.css      |   5 +-
 lib/toaster/toastergui/static/js/layerdetails.js   |  14 +--
 .../toastergui/templates/baseprojectpage.html      |  12 +--
 .../toastergui/templates/buildrequestdetails.html  |  67 ++++++++++++++
 lib/toaster/toastergui/templates/layerdetails.html |  65 ++++++-------
 .../toastergui/templates/managed_builds.html       |  18 ++--
 .../toastergui/templates/managed_mrb_section.html  |  42 ++++++---
 .../toastergui/templates/package_detail_base.html  |   2 +-
 lib/toaster/toastergui/templates/project.html      |   4 +-
 .../toastergui/templates/projectbuilds.html        |  20 ++--
 lib/toaster/toastergui/templates/recipe.html       |   6 +-
 lib/toaster/toastergui/urls.py                     |   2 +
 lib/toaster/toastergui/views.py                    | 103 +++++++++++++--------
 15 files changed, 248 insertions(+), 123 deletions(-)
 create mode 100644 lib/toaster/toastergui/templates/buildrequestdetails.html

-- 
1.9.1



^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 10/14] toastergui: consistent capitals in button
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (8 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 09/14] toastergui: hide table controls when when less than 10 entries Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 11/14] toastergui: remove recipe id links to the layer index Alex DAMIAN
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

Capitalise correctly the 'Build target' button label in
the layer details page: it should match the table heading.

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/templates/layerdetails.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index 1daf9b9..2b57561 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -270,7 +270,7 @@
                         </td>
                         <td>{{target.version}}</td>
                         <td>{{target.summary}}</td>
-                        <td><button class="btn btn-block build-target-btn" data-target-name="{{target.name}}" {% if layer_in_project == 0 %}disabled="disabled"{% endif %} >Build Target</button></td>
+                        <td><button class="btn btn-block build-target-btn" data-target-name="{{target.name}}" {% if layer_in_project == 0 %}disabled="disabled"{% endif %} >Build target</button></td>
                       </tr>
                       {% endfor %}
                     </tbody>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 11/14] toastergui: remove recipe id links to the layer index
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (9 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 10/14] toastergui: consistent capitals in button Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 12/14] toastergui: alignment fix Alex DAMIAN
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel

From: Belen Barros Pena <belen.barros.pena@intel.com>

Toaster cannot use the recipe id to link to the layer
index, because recipe ids can change. We need to search
by the recipe name instead.

This patch removes the recipe id link from the layer
details page and replaces it with a search by the
recipe name.

It also makes sure links to the layer index open in
a new tab/window.

[YOCTO #7194]
[YOCTO #7193]

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
---
 lib/toaster/toastergui/templates/layerdetails.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index 2b57561..84a21d7 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -265,7 +265,7 @@
                         <td>
                           {{target.name}}
                           {% if target.up_id %}
-                          <a href="http://layers.openembedded.org/layerindex/recipe/{{target.up_id}}/" class="icon-share get-info"></a>
+                          <a href="{{target.get_layersource_view_url}}" class="icon-share get-info" target="_blank"></a>
                           {% endif %}
                         </td>
                         <td>{{target.version}}</td>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 12/14] toastergui: alignment fix
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (10 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 11/14] toastergui: remove recipe id links to the layer index Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 13/14] toasterui: do not filter images by extension Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 14/14] toastergui: update project build listing Alex DAMIAN
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Alexandru DAMIAN

From: Belen Barros Pena <belen.barros.pena@intel.com>

Align horizontally the pagination and show rows
controls at the bottom of the layer details page.

Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com>
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
---
 lib/toaster/toastergui/templates/layerdetails.html | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html
index 84a21d7..4ffd071 100644
--- a/lib/toaster/toastergui/templates/layerdetails.html
+++ b/lib/toaster/toastergui/templates/layerdetails.html
@@ -295,8 +295,8 @@
                       {%endif%}
                     </ul>
                     <div class="pull-right">
-                      <span class="help-inline" style="padding-top:5px;">Show rows:</span>
-                      <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
+                      <span class="help-inline" style="padding-bottom:10px;">Show rows:</span>
+                      <select class="pagesize">
                         {% with "10 25 50 100 150" as list%}
                         {% for i in list.split %}
                         {% if request.session.limit == i %}
@@ -421,8 +421,8 @@
                       {%endif%}
                     </ul>
                     <div class="pull-right">
-                      <span class="help-inline" style="padding-top:5px;">Show rows:</span>
-                      <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
+                      <span class="help-inline" style="padding-bottom:10px;">Show rows:</span>
+                      <select class="pagesize">
                         {% with "10 25 50 100 150" as list%}
                         {% for i in list.split %}
                         {% if request.session.limit == i %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 13/14] toasterui: do not filter images by extension
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (11 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 12/14] toastergui: alignment fix Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  2015-01-27 14:27 ` [PATCH 14/14] toastergui: update project build listing Alex DAMIAN
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Alexandru Damian

From: Alexandru Damian <alexandru.damian@intel.com>

ToasterUI filters build artifacts by extension in order
to determine if a build artifact is an image or not.

Using IMAGE_FSTYPES for this purpose is not correct as
the varible value holding image extensions is just a coincidence.

So we just look if the filename contains the "rootfs" magic
string, which is a pretty good approximation.

[YOCTO #7213]

Signed-off-by: Alexandru Damian <alexandru.damian@intel.com>
---
 lib/bb/ui/buildinfohelper.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/bb/ui/buildinfohelper.py b/lib/bb/ui/buildinfohelper.py
index be0de6b..4e2d4a7 100644
--- a/lib/bb/ui/buildinfohelper.py
+++ b/lib/bb/ui/buildinfohelper.py
@@ -770,7 +770,7 @@ class BuildInfoHelper(object):
             if t.is_image == True:
                 output_files = list(evdata.viewkeys())
                 for output in output_files:
-                    if t.target in output and output.split('.rootfs.')[1] in image_fstypes:
+                    if t.target in output and 'rootfs' in output and not output.endswith(".manifest"):
                         self.orm_wrapper.save_target_image_file_information(t, output, evdata[output])
 
     def update_artifact_image_file(self, event):
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 14/14] toastergui: update project build listing
  2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
                   ` (12 preceding siblings ...)
  2015-01-27 14:27 ` [PATCH 13/14] toasterui: do not filter images by extension Alex DAMIAN
@ 2015-01-27 14:27 ` Alex DAMIAN
  13 siblings, 0 replies; 15+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Alexandru DAMIAN

From: Alexandru DAMIAN <alexandru.damian@intel.com>

We update the build listings in the project mode to enable
proper display and selection of build requests that do not have
an actual build object because the bitbake process did not start.

We add a page to display error details for build requests that
did not start a build.

Fixing errors and misspelling in build sections.

Sorting by "timespent" is disabled for build-listing pages.

[YOCTO #7165]
[YOCTO #7156]
[YOCTO #7196]
[YOCTO #7188]

Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
---
 lib/toaster/bldcontrol/models.py                   |   9 ++
 .../toastergui/templates/buildrequestdetails.html  |  67 ++++++++++++++
 .../toastergui/templates/managed_builds.html       |  18 ++--
 .../toastergui/templates/managed_mrb_section.html  |  42 ++++++---
 .../toastergui/templates/projectbuilds.html        |  20 ++--
 lib/toaster/toastergui/urls.py                     |   2 +
 lib/toaster/toastergui/views.py                    | 103 +++++++++++++--------
 7 files changed, 193 insertions(+), 68 deletions(-)
 create mode 100644 lib/toaster/toastergui/templates/buildrequestdetails.html

diff --git a/lib/toaster/bldcontrol/models.py b/lib/toaster/bldcontrol/models.py
index 2386d23..dc4afca 100644
--- a/lib/toaster/bldcontrol/models.py
+++ b/lib/toaster/bldcontrol/models.py
@@ -113,6 +113,15 @@ class BuildRequest(models.Model):
     created     = models.DateTimeField(auto_now_add = True)
     updated     = models.DateTimeField(auto_now = True)
 
+    def get_duration(self):
+        return (self.updated - self.created).total_seconds()
+
+    def get_sorted_target_list(self):
+        tgts = self.brtarget_set.order_by( 'target' );
+        return( tgts );
+
+    def get_machine(self):
+        return self.brvariable_set.get(name="MACHINE").value
 
 # These tables specify the settings for running an actual build.
 # They MUST be kept in sync with the tables in orm.models.Project*
diff --git a/lib/toaster/toastergui/templates/buildrequestdetails.html b/lib/toaster/toastergui/templates/buildrequestdetails.html
new file mode 100644
index 0000000..2a4571f
--- /dev/null
+++ b/lib/toaster/toastergui/templates/buildrequestdetails.html
@@ -0,0 +1,67 @@
+{% extends "baseprojectpage.html" %}
+
+{% load static %}
+{% load projecttags %}
+{% load humanize %}
+
+{% block localbreadcrumb %}
+<li> {{buildrequest.get_sorted_target_list.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} {{buildrequest.get_machine}} ({{buildrequest.updated|date:"d/m/y H:i"}}) </li>
+{% endblock %}
+
+{% block projectinfomain %}
+      <!-- begin content -->
+
+          <div class="row-fluid">
+
+            <!-- end left sidebar container -->
+            <!-- Begin right container -->
+            <div class="span10">
+              <div class="page-header">
+                <h1>
+ <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} {{buildrequest.get_machine}} </span>
+
+        </h1>
+              </div>
+              <div class="alert alert-error">
+                <p class="lead">
+                  <strong>Failed</strong>
+                    on {{ buildrequest.updated|date:'d/m/y H:i' }}
+            with
+
+                                    <i class="icon-minus-sign error" style="margin-left:6px;"></i>
+                  <strong><a class="error accordion-toggle toggle-errors" href="#errors">
+                        {{buildrequest.brerror_set.all.count}} error{{buildrequest.brerror_set.all.count|pluralize}}
+              </a></strong>
+                  <span class="pull-right">Build time: {{buildrequest.get_duration|sectohms}}</span>
+                </p>
+              </div>
+
+              <div class="accordion" id="errors" name="errors">
+                <div class="accordion-group">
+                  <div class="accordion-heading">
+                    <a class="accordion-toggle error toggle-errors">
+                      <h2>
+                        <i class="icon-minus-sign"></i>
+                        {{buildrequest.brerror_set.all.count}} error{{buildrequest.brerror_set.all.count|pluralize}}
+                      </h2>
+                    </a>
+                  </div>
+                  <div class="accordion-body collapse in" id="collapse-errors">
+                    <div class="accordion-inner">
+                      <div class="span10">
+               {% for error in buildrequest.brerror_set.all %}
+                        <div class="alert alert-error">
+                          ERROR: <div class="air well"><pre>{{error.errmsg}}</pre></div>
+                        </div>
+                      {% endfor %}
+                      </div>
+                    </div>
+                  </div>
+
+                </div>
+              </div>
+            </div>
+          </div> <!-- end of row-fluid -->
+
+
+{%endblock%}
diff --git a/lib/toaster/toastergui/templates/managed_builds.html b/lib/toaster/toastergui/templates/managed_builds.html
index 5944dc4..183be76 100644
--- a/lib/toaster/toastergui/templates/managed_builds.html
+++ b/lib/toaster/toastergui/templates/managed_builds.html
@@ -35,10 +35,10 @@
     </div>
 
 
-  {% else %}
+  {% else %} {# We have builds to display #}
   {% include "basetable_top_buildprojects.html" %}
         <!-- Table data rows; the order needs to match the order of "tablecols" definitions; and the <td class value needs to match the tablecols clclass value for show/hide buttons to work -->
-        {% for br in objects %}{% if br.build %}  {% with build=br.build %} {# if we have a build, just display it #}
+        {% for buildrequest in objects %}{% if buildrequest.build %}  {% with build=buildrequest.build %} {# if we have a build, just display it #}
         <tr class="data">
             <td class="outcome"><a href="{% url "builddashboard" 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>
             <td class="target">{% for t in build.target_set.all %} <a href="{% url "builddashboard" build.id %}"> {{t.target}} </a> <br />{% endfor %}</td>
@@ -61,7 +61,7 @@
             <td class="errors_no">
                 {% if  build.errors_no %}
                     <a class="errors_no error" href="{% url "builddashboard" build.id %}#errors">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>
-                    {% if MANAGED and build.project %}
+                    {% if MANAGED and build.project and build.buildartifact_set.count %}
                         <a href="{% url 'build_artifact' build.id "cookerlog" build.id %}">
                             <i class="icon-download-alt" title="" data-original-title="Download build log"></i>
                         </a>
@@ -96,21 +96,21 @@
         <tr class="data">
             <td class="outcome">{% if buildrequest.state == buildrequest.REQ_FAILED %}<i class="icon-minus-sign error"></i>{%else%}FIXME_build_request_state{%endif%}</td>
             <td class="target">
-                <span data-toggle="tooltip" {%if br.brtarget_set.all.count > 1%}title="Targets: {%for target in br.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{br.brtarget_set.all.0.target}} {%if br.brtarget_set.all.count > 1%}(+ {{br.brtarget_set.all.count|add:"-1"}}){%endif%} </span>
+                <a href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}"><span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} </span></a>
             </td>
             <td class="machine">
-                {{br.machine}}
+                <a href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}">{{buildrequest.machine}}</a>
             </td>
             <td class="started_on">
-                {{br.created|date:"d/m/y H:i"}}
+                <a href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}">{{buildrequest.created|date:"d/m/y H:i"}}</a>
             </td>
             <td class="completed_on">
-                {{br.updated|date:"d/m/y H:i"}}
+                <a href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}">{{buildrequest.updated|date:"d/m/y H:i"}}</a>
             </td>
             <td class="failed_tasks error">
-                {{br.brerror_set.all.0.errmsg|whitespace_slice:":32"}}
             </td>
             <td class="errors_no">
+                <a class="errors_no error" href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}#errors">{{buildrequest.brerror_set.all.count}} error{{buildrequest.brerror_set.all.count|pluralize}}</a>
             </td>
             <td class="warnings_no">
             </td>
@@ -120,7 +120,7 @@
             <td class="output"> {# we have no output here #}
             </td>
             <td class="project">
-                <a href="{% url 'project' br.project.id %}">{{br.project.name}}</a>
+                <a href="{% url 'project' buildrequest.project.id %}">{{buildrequest.project.name}}</a>
             </td>
         </tr>
           {%endif%}
diff --git a/lib/toaster/toastergui/templates/managed_mrb_section.html b/lib/toaster/toastergui/templates/managed_mrb_section.html
index da5a3f7..d2ffdcd 100644
--- a/lib/toaster/toastergui/templates/managed_mrb_section.html
+++ b/lib/toaster/toastergui/templates/managed_mrb_section.html
@@ -26,7 +26,7 @@
                 <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
     {% endif %}
                 <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%}
-		        </span>
+                </span>
     {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
                 </a>
     {% endif %}
@@ -71,24 +71,42 @@
 
   {% else %}  {# we use the project's page recent build design #}
 
-  <div class="alert {% if buildrequest.state  == buildrequest.REQ_FAILED %}alert-error{% else %}alert-info{% endif %}">
-    <div class="row-fluid">
 
 
+
+  <div class="alert {% if buildrequest.state  == buildrequest.REQ_FAILED %}alert-error{% else %}alert-info{% endif %} project-name">
+       <span class="label label-danger"> {{buildrequest.project.name}} </span>
+    <div class="row-fluid">
+
           {% if buildrequest.state == buildrequest.REQ_FAILED %}
-            <div class="lead span3">
-                <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} </span>
+            <div class="span3 lead">
+                <a href="{%url 'buildrequestdetails' buildrequest.project.id buildrequest.pk%}" class="error">
+                  <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} </span>
+                </a>
+            </div>
+            <div class="span2 lead">
+                {% if buildrequest.updated|format_build_date  %}
+                    {{ buildrequest.updated|date:'d/m/y H:i' }}
+                {% else %}
+                    {{ buildrequest.updated|date:'H:i' }}
+                {% endif %}
+            </div>
+            <div class="span2 lead">
+      {% if  buildrequest.brerror_set.all.count %}
+                <i class="icon-minus-sign red"></i> <a href="{%url 'buildrequestdetails' buildrequest.project.id buildrequest.pk %}#errors" class="error">{{buildrequest.brerror_set.all.count}} error{{buildrequest.brerror_set.all.count|pluralize}}</a>
+      {% endif %}
             </div>
-            <div >
+            <div class="span2 lead"> {# there are no warnings for buildrequests #}
             </div>
-            <div class="row-fluid">
-              {% for e in buildrequest.brerror_set.all|slice:":3" %}
-              <div class="air well">
-                    <pre>{{e.errmsg|whitespace_slice:":150"}}</pre>
-              </div>
-              {% endfor %}
+            <div class="lead ">
+              <span class="lead{%if not MANAGED or not buildrequest.project%} pull-right{%endif%}">
+                Build time: <a href="{% url 'buildrequestdetails' buildrequest.project.id buildrequest.pk %}">{{ buildrequest.get_duration|sectohms }}</a>
+              </span>
+              <button class="btn btn-danger pull-right" onclick='scheduleBuild({% url 'xhr_projectbuild' buildrequest.project.id as bpi%}{{bpi|json}}, {{buildrequest.project.name|json}}, {{buildrequest.get_sorted_target_list|mapselect:'target'|json}})'>Run again</button>
+
             </div>
 
+
          {% elif buildrequest.state == buildrequest.REQ_QUEUED %}
 
             <div class="lead span5">
diff --git a/lib/toaster/toastergui/templates/projectbuilds.html b/lib/toaster/toastergui/templates/projectbuilds.html
index 8f9172c..2a8bd58 100644
--- a/lib/toaster/toastergui/templates/projectbuilds.html
+++ b/lib/toaster/toastergui/templates/projectbuilds.html
@@ -13,11 +13,11 @@
                      No builds found
 
  {% else %}
-	{% if  request.GET.filter or request.GET.search  %}
-			{{objects.paginator.count}} builds found
-	{% else %}
+    {% if  request.GET.filter or request.GET.search  %}
+            {{objects.paginator.count}} builds found
+    {% else %}
                         Project builds <small>({{objects.paginator.count}})</small>
-	{% endif %}
+    {% endif %}
  {% endif %}
                         <i class="icon-question-sign get-help heading-help" title="This page lists all the builds for the current project"></i>
                     </h1>
@@ -89,23 +89,23 @@
 
 
         <tr class="data">
-            <td class="outcome">{% if buildrequest.state == buildrequest.REQ_FAILED %}<i class="icon-minus-sign error"></i>{%else%}FIXME_build_request_state{%endif%}</td>
+            <td class="outcome">{% if br.state == br.REQ_FAILED %}<i class="icon-minus-sign error"></i>{%else%}FIXME_build_request_state{%endif%}</td>
             <td class="target">
-                <span data-toggle="tooltip" {%if br.brtarget_set.all.count > 1%}title="Targets: {%for target in br.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{br.brtarget_set.all.0.target}} {%if br.brtarget_set.all.count > 1%}(+ {{br.brtarget_set.all.count|add:"-1"}}){%endif%} </span>
+                <a href="{% url "buildrequestdetails" br.project.id br.id %}"><span data-toggle="tooltip" {%if br.brtarget_set.all.count > 1%}title="Targets: {%for target in br.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{br.brtarget_set.all.0.target}} {%if br.brtarget_set.all.count > 1%}(+ {{br.brtarget_set.all.count|add:"-1"}}){%endif%} </span></a>
             </td>
             <td class="machine">
-                {{br.machine}}
+                <a href="{% url "buildrequestdetails" br.project.id br.id %}">{{br.machine}}</a>
             </td>
             <td class="started_on">
-                {{br.created|date:"d/m/y H:i"}}
+                <a href="{% url "buildrequestdetails" br.project.id br.id %}">{{br.created|date:"d/m/y H:i"}}</a>
             </td>
             <td class="completed_on">
-                {{br.updated|date:"d/m/y H:i"}}
+                <a href="{% url "buildrequestdetails" br.project.id br.id %}">{{br.updated|date:"d/m/y H:i"}}</a>
             </td>
             <td class="failed_tasks error">
-                {{br.brerror_set.all.0.errmsg|whitespace_slice:":32"}}
             </td>
             <td class="errors_no">
+        <a class="errors_no error" href="{% url "buildrequestdetails" br.project.id br.id %}#errors">{{br.brerror_set.all.count}} error{{br.brerror_set.all.count|pluralize}}</a>
             </td>
             <td class="warnings_no">
             </td>
diff --git a/lib/toaster/toastergui/urls.py b/lib/toaster/toastergui/urls.py
index 8c3b5a8..1c83090 100644
--- a/lib/toaster/toastergui/urls.py
+++ b/lib/toaster/toastergui/urls.py
@@ -97,6 +97,8 @@ urlpatterns = patterns('toastergui.views',
         url(r'^xhr_importlayer/$', 'xhr_importlayer', name='xhr_importlayer'),
         url(r'^xhr_updatelayer/$', 'xhr_updatelayer', name='xhr_updatelayer'),
 
+        # dashboard for failed build requests
+        url(r'^project/(?P<pid>\d+)/buildrequest/(?P<brid>\d+)$', 'buildrequestdetails', name='buildrequestdetails'),
 
         # default redirection
         url(r'^$', RedirectView.as_view( url= 'landing')),
diff --git a/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py
index e718ced..6ccbf54 100755
--- a/lib/toaster/toastergui/views.py
+++ b/lib/toaster/toastergui/views.py
@@ -22,7 +22,7 @@
 import operator,re
 import HTMLParser
 
-from django.db.models import Q, Sum
+from django.db.models import Q, Sum, Count
 from django.db import IntegrityError
 from django.shortcuts import render, redirect
 from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable
@@ -117,7 +117,8 @@ def _redirect_parameters(view, g, mandatory_parameters, *args, **kwargs):
     return redirect(url + "?%s" % urllib.urlencode(params), *args, **kwargs)
 
 FIELD_SEPARATOR = ":"
-VALUE_SEPARATOR = "!"
+AND_VALUE_SEPARATOR = "!"
+OR_VALUE_SEPARATOR = "|"
 DESCENDING = "-"
 
 def __get_q_for_val(name, value):
@@ -126,20 +127,31 @@ def __get_q_for_val(name, value):
     if "AND" in value:
         return reduce(operator.and_, map(lambda x: __get_q_for_val(name, x), [ x for x in value.split("AND") ]))
     if value.startswith("NOT"):
-        kwargs = { name : value.strip("NOT") }
+        value = value[3:]
+        if value == 'None':
+            value = None
+        kwargs = { name : value }
         return ~Q(**kwargs)
     else:
+        if value == 'None':
+            value = None
         kwargs = { name : value }
         return Q(**kwargs)
 
 def _get_filtering_query(filter_string):
 
     search_terms = filter_string.split(FIELD_SEPARATOR)
-    keys = search_terms[0].split(VALUE_SEPARATOR)
-    values = search_terms[1].split(VALUE_SEPARATOR)
+    and_keys = search_terms[0].split(AND_VALUE_SEPARATOR)
+    and_values = search_terms[1].split(AND_VALUE_SEPARATOR)
+
+    and_query = []
+    for kv in zip(and_keys, and_values):
+        or_keys = kv[0].split(OR_VALUE_SEPARATOR)
+        or_values = kv[1].split(OR_VALUE_SEPARATOR)
+        querydict = dict(zip(or_keys, or_values))
+        and_query.append(reduce(operator.or_, map(lambda x: __get_q_for_val(x, querydict[x]), [k for k in querydict])))
 
-    querydict = dict(zip(keys, values))
-    return reduce(operator.and_, map(lambda x: __get_q_for_val(x, querydict[x]), [k for k in querydict]))
+    return reduce(operator.and_, [k for k in and_query])
 
 def _get_toggle_order(request, orderkey, reverse = False):
     if reverse:
@@ -169,13 +181,13 @@ def _validate_input(input, model):
             return None, invalid
 
         # Check we have an equal number of terms both sides of the colon
-        if len(input_list[0].split(VALUE_SEPARATOR)) != len(input_list[1].split(VALUE_SEPARATOR)):
+        if len(input_list[0].split(AND_VALUE_SEPARATOR)) != len(input_list[1].split(AND_VALUE_SEPARATOR)):
             invalid = "Not all arg names got values"
             return None, invalid + str(input_list)
 
         # Check we are looking for a valid field
         valid_fields = model._meta.get_all_field_names()
-        for field in input_list[0].split(VALUE_SEPARATOR):
+        for field in input_list[0].split(AND_VALUE_SEPARATOR):
             if not reduce(lambda x, y: x or y, map(lambda x: field.startswith(x), [ x for x in valid_fields ])):
                 return None, (field, [ x for x in valid_fields ])
 
@@ -216,6 +228,7 @@ def _search_tuple(request, model):
 def _get_queryset(model, queryset, filter_string, search_term, ordering_string, ordering_secondary=''):
     if filter_string:
         filter_query = _get_filtering_query(filter_string)
+#        raise Exception(filter_query)
         queryset = queryset.filter(filter_query)
     else:
         queryset = queryset.all()
@@ -1780,12 +1793,13 @@ if toastermain.settings.MANAGED:
         # for that object type. copypasta for all needed table searches
         (filter_string, search_term, ordering_string) = _search_tuple(request, BuildRequest)
         # we don't display in-progress or deleted builds
-        queryset_all = buildrequests
-        queryset_with_search = _get_queryset(BuildRequest, queryset_all, None, search_term, ordering_string, '-updated')
-        queryset = _get_queryset(BuildRequest, queryset_all, filter_string, search_term, ordering_string, '-updated')
+        queryset_all = buildrequests.exclude(state = BuildRequest.REQ_DELETED)
+        queryset_all = queryset_all.annotate(Count('brerror'))
+        queryset_with_search = _get_queryset(BuildRequest, queryset_all, filter_string, search_term, ordering_string, '-updated')
+
 
         # retrieve the objects that will be displayed in the table; builds a paginator and gets a page range to display
-        build_info = _build_page_range(Paginator(queryset, pagesize), request.GET.get('page', 1))
+        build_info = _build_page_range(Paginator(queryset_with_search, pagesize), request.GET.get('page', 1))
 
         # build view-specific information; this is rendered specifically in the builds page, at the top of the page (i.e. Recent builds)
         # most recent build is like projects' most recent builds, but across all projects
@@ -1842,8 +1856,8 @@ if toastermain.settings.MANAGED:
                      'filter' : {'class' : 'outcome',
                                  'label': 'Show:',
                                  'options' : [
-                                             ('Successful builds', 'state:' + str(BuildRequest.REQ_COMPLETED), queryset_with_search.filter(state=str(BuildRequest.REQ_COMPLETED)).count()),  # this is the field search expression
-                                             ('Failed builds', 'state:'+ str(BuildRequest.REQ_FAILED), queryset_with_search.filter(state=str(BuildRequest.REQ_FAILED)).count()),
+                                             ('Successful builds', 'state:' + str(BuildRequest.REQ_COMPLETED), queryset_all.filter(state=str(BuildRequest.REQ_COMPLETED)).count()),  # this is the field search expression
+                                             ('Failed builds', 'state:'+ str(BuildRequest.REQ_FAILED), queryset_all.filter(state=str(BuildRequest.REQ_FAILED)).count()),
                                              ]
                                 }
                     },
@@ -1865,9 +1879,9 @@ if toastermain.settings.MANAGED:
                      'filter' : {'class' : 'created',
                                  'label': 'Show:',
                                  'options' : [
-                                             ("Today's builds" , 'created__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_with_search.filter(created__gte=timezone.now()).count()),
-                                             ("Yesterday's builds", 'created__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_with_search.filter(created__gte=(timezone.now()-timedelta(hours=24))).count()),
-                                             ("This week's builds", 'created__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_with_search.filter(created__gte=(timezone.now()-timedelta(days=7))).count()),
+                                             ("Today's builds" , 'created__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_all.filter(created__gte=timezone.now()).count()),
+                                             ("Yesterday's builds", 'created__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_all.filter(created__gte=(timezone.now()-timedelta(hours=24))).count()),
+                                             ("This week's builds", 'created__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_all.filter(created__gte=(timezone.now()-timedelta(days=7))).count()),
                                              ]
                                 }
                     },
@@ -1879,9 +1893,9 @@ if toastermain.settings.MANAGED:
                      'filter' : {'class' : 'updated',
                                  'label': 'Show:',
                                  'options' : [
-                                             ("Today's builds", 'updated__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_with_search.filter(updated__gte=timezone.now()).count()),
-                                             ("Yesterday's builds", 'updated__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_with_search.filter(updated__gte=(timezone.now()-timedelta(hours=24))).count()),
-                                             ("This week's builds", 'updated__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_with_search.filter(updated__gte=(timezone.now()-timedelta(days=7))).count()),
+                                             ("Today's builds", 'updated__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_all.filter(updated__gte=timezone.now()).count()),
+                                             ("Yesterday's builds", 'updated__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_all.filter(updated__gte=(timezone.now()-timedelta(hours=24))).count()),
+                                             ("This week's builds", 'updated__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_all.filter(updated__gte=(timezone.now()-timedelta(days=7))).count()),
                                              ]
                                 }
                     },
@@ -1890,8 +1904,10 @@ if toastermain.settings.MANAGED:
                      'filter' : {'class' : 'failed_tasks',
                                  'label': 'Show:',
                                  'options' : [
-                                             ('Build with failed tasks', 'build__task_build__outcome:4', queryset_with_search.filter(build__task_build__outcome=4).count()),
-                                             ('Build without failed tasks', 'build__task_build__outcome:NOT4', queryset_with_search.filter(~Q(build__task_build__outcome=4)).count()),
+                                             ('Builds with failed tasks', 'build__task_build__outcome:%d' % Task.OUTCOME_FAILED,
+                                                queryset_all.filter(build__task_build__outcome=Task.OUTCOME_FAILED).count()),
+                                             ('Builds without failed tasks', 'build__task_build__outcome:%d' % Task.OUTCOME_FAILED,
+                                                queryset_all.filter(~Q(build__task_build__outcome=Task.OUTCOME_FAILED)).count()),
                                              ]
                                 }
                     },
@@ -1903,8 +1919,10 @@ if toastermain.settings.MANAGED:
                      'filter' : {'class' : 'errors_no',
                                  'label': 'Show:',
                                  'options' : [
-                                             ('Build with errors', 'build__errors_no__gte:1', queryset_with_search.filter(build__errors_no__gte=1).count()),
-                                             ('Build without errors', 'build__errors_no:0', queryset_with_search.filter(build__errors_no=0).count()),
+                                             ('Builds with errors', 'build|build__errors_no__gt:None|0',
+                                                queryset_all.filter(Q(build=None) | Q(build__errors_no__gt=0)).count()),
+                                             ('Builds without errors', 'build__errors_no:0',
+                                                queryset_all.filter(build__errors_no=0).count()),
                                              ]
                                 }
                     },
@@ -1916,8 +1934,8 @@ if toastermain.settings.MANAGED:
                      'filter' : {'class' : 'build__warnings_no',
                                  'label': 'Show:',
                                  'options' : [
-                                             ('Build with warnings','build__warnings_no__gte:1', queryset_with_search.filter(build__warnings_no__gte=1).count()),
-                                             ('Build without warnings','build__warnings_no:0', queryset_with_search.filter(build__warnings_no=0).count()),
+                                             ('Builds with warnings','build__warnings_no__gte:1', queryset_all.filter(build__warnings_no__gte=1).count()),
+                                             ('Builds without warnings','build__warnings_no:0', queryset_all.filter(build__warnings_no=0).count()),
                                              ]
                                 }
                     },
@@ -2016,7 +2034,7 @@ if toastermain.settings.MANAGED:
 
         context = {
             "project" : prj,
-            "completedbuilds": Build.objects.filter(project = prj).exclude(outcome = Build.IN_PROGRESS),
+            "completedbuilds": BuildRequest.objects.filter(project_id = pid).exclude(state__lte = BuildRequest.REQ_INPROGRESS).exclude(state=BuildRequest.REQ_DELETED),
             "prj" : {"name": prj.name, "release": { "id": prj.release.pk, "name": prj.release.name, "desc": prj.release.description}},
             #"buildrequests" : prj.buildrequest_set.filter(state=BuildRequest.REQ_QUEUED),
             "builds" : _project_recent_build_list(prj),
@@ -2061,7 +2079,7 @@ if toastermain.settings.MANAGED:
         try:
             if request.method != "POST":
                 raise BadParameterException("invalid method")
-			request.session['project_id'] = pid
+            request.session['project_id'] = pid
             prj = Project.objects.get(id = pid)
 
 
@@ -2167,11 +2185,11 @@ if toastermain.settings.MANAGED:
         try:
             prj = None
             if request.GET.has_key('project_id'):
-				prj = Project.objects.get(pk = request.GET['project_id'])
+                prj = Project.objects.get(pk = request.GET['project_id'])
             elif 'project_id' in request.session:
                 prj = Project.objects.get(pk = request.session['project_id'])
-			else:
-				raise Exception("No valid project selected")
+            else:
+                raise Exception("No valid project selected")
 
 
             def _lv_to_dict(x):
@@ -2819,10 +2837,10 @@ if toastermain.settings.MANAGED:
 
         vars_blacklist  = {
             'DL_DR','PARALLEL_MAKE','BB_NUMBER_THREADS','SSTATE_DIR',
-			'BB_DISKMON_DIRS','BB_NUMBER_THREADS','CVS_PROXY_HOST','CVS_PROXY_PORT',
-			'DL_DIR','PARALLEL_MAKE','SSTATE_DIR','SSTATE_DIR','SSTATE_MIRRORS','TMPDIR',
-			'all_proxy','ftp_proxy','http_proxy ','https_proxy'
-			}
+            'BB_DISKMON_DIRS','BB_NUMBER_THREADS','CVS_PROXY_HOST','CVS_PROXY_PORT',
+            'DL_DIR','PARALLEL_MAKE','SSTATE_DIR','SSTATE_DIR','SSTATE_MIRRORS','TMPDIR',
+            'all_proxy','ftp_proxy','http_proxy ','https_proxy'
+            }
 
         vars_fstypes  = {
             'btrfs','cpio','cpio.gz','cpio.lz4','cpio.lzma','cpio.xz','cramfs',
@@ -2874,7 +2892,7 @@ if toastermain.settings.MANAGED:
 
     def projectbuilds(request, pid):
         template = 'projectbuilds.html'
-        buildrequests = BuildRequest.objects.exclude(project_id = pid, state__lte = BuildRequest.REQ_INPROGRESS).exclude(state=BuildRequest.REQ_DELETED)
+        buildrequests = BuildRequest.objects.filter(project_id = pid).exclude(state__lte = BuildRequest.REQ_INPROGRESS).exclude(state=BuildRequest.REQ_DELETED)
 
         try:
             context, pagesize, orderby = _build_list_helper(request, buildrequests)
@@ -3012,6 +3030,14 @@ if toastermain.settings.MANAGED:
             }
         return render(request, template, context)
 
+    def buildrequestdetails(request, pid, brid):
+        template = "buildrequestdetails.html"
+        context = {
+            'buildrequest' : BuildRequest.objects.get(pk = brid, project_id = pid)
+        }
+        return render(request, template, context)
+
+
 else:
     # these are pages that are NOT available in interactive mode
     def managedcontextprocessor(request):
@@ -3256,3 +3282,6 @@ else:
 
     def xhr_updatelayer(request):
         raise Exception("page not available in interactive mode")
+
+    def buildrequestdetails(request, pid, brid):
+        raise Exception("page not available in interactive mode")
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2015-01-27 14:27 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN
2015-01-27 14:27 ` [PATCH 01/14] toaster: make layouts consistent Alex DAMIAN
2015-01-27 14:27 ` [PATCH 02/14] toaster: apply common styles to right hand column of detail pages Alex DAMIAN
2015-01-27 14:27 ` [PATCH 03/14] toastergui: Generic message for the layer details empty states Alex DAMIAN
2015-01-27 14:27 ` [PATCH 04/14] toastergui: remove redundant style declaration Alex DAMIAN
2015-01-27 14:27 ` [PATCH 05/14] toastergui: consistent add / remove layer notifications Alex DAMIAN
2015-01-27 14:27 ` [PATCH 06/14] toastergui: give the add dependencies form some breathing space Alex DAMIAN
2015-01-27 14:27 ` [PATCH 07/14] toastergui: add 'show all' link to no results page Alex DAMIAN
2015-01-27 14:27 ` [PATCH 08/14] toastergui: set column width in layer details page Alex DAMIAN
2015-01-27 14:27 ` [PATCH 09/14] toastergui: hide table controls when when less than 10 entries Alex DAMIAN
2015-01-27 14:27 ` [PATCH 10/14] toastergui: consistent capitals in button Alex DAMIAN
2015-01-27 14:27 ` [PATCH 11/14] toastergui: remove recipe id links to the layer index Alex DAMIAN
2015-01-27 14:27 ` [PATCH 12/14] toastergui: alignment fix Alex DAMIAN
2015-01-27 14:27 ` [PATCH 13/14] toasterui: do not filter images by extension Alex DAMIAN
2015-01-27 14:27 ` [PATCH 14/14] toastergui: update project build listing Alex DAMIAN

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.