[gnome-continuous-yocto/gnomeostree-3.28-rocko: 887/8267] bitbake: toaster: port table for Built packages to ToasterTable



commit a786ac14f1c6c02c38dc141125035445413f1250
Author: Michael Wood <michael g wood intel com>
Date:   Thu May 26 16:12:20 2016 +0100

    bitbake: toaster: port table for Built packages to ToasterTable
    
    This is the table that displays all the packages built in the build.
    Build -> Packages. Adds a template snippet for the git revision popover.
    
    (Bitbake rev: df62f38ff4e634544c9b1e97c5f6ca45e84a4f1e)
    
    Signed-off-by: Michael Wood <michael g wood intel com>
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 bitbake/lib/toaster/toastergui/buildtables.py      |  152 ++++++++++++++++++++
 bitbake/lib/toaster/toastergui/tables.py           |   10 +-
 .../toastergui/templates/basebuildpage.html        |   26 ++--
 .../lib/toaster/toastergui/templates/bpackage.html |  106 --------------
 .../templates/buildinfo-toastertable.html          |   23 +++
 .../templates/snippets/gitrev_popover.html         |    8 +
 bitbake/lib/toaster/toastergui/urls.py             |    7 +-
 bitbake/lib/toaster/toastergui/views.py            |   90 ------------
 8 files changed, 203 insertions(+), 219 deletions(-)
---
diff --git a/bitbake/lib/toaster/toastergui/buildtables.py b/bitbake/lib/toaster/toastergui/buildtables.py
new file mode 100644
index 0000000..cf07ea8
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/buildtables.py
@@ -0,0 +1,152 @@
+#
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# BitBake Toaster Implementation
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from orm.models import Build
+import toastergui.tables as tables
+
+from toastergui.widgets import ToasterTable
+
+
+class BuildTablesMixin(ToasterTable):
+    def get_context_data(self, **kwargs):
+        # We need to be explicit about which superclass we're calling here
+        # Otherwise the MRO gets in a right mess
+        context = ToasterTable.get_context_data(self, **kwargs)
+        context['build'] = Build.objects.get(pk=kwargs['build_id'])
+        return context
+
+
+class BuiltPackagesTableBase(tables.PackagesTable):
+    """ Table to display all the packages built in a build """
+    def __init__(self, *args, **kwargs):
+        super(BuiltPackagesTableBase, self).__init__(*args, **kwargs)
+        self.title = "Packages built"
+        self.default_orderby = "name"
+
+    def setup_queryset(self, *args, **kwargs):
+        build = Build.objects.get(pk=kwargs['build_id'])
+        self.static_context_extra['build'] = build
+        self.queryset = build.package_set.all().exclude(recipe=None)
+        self.queryset = self.queryset.order_by(self.default_orderby)
+
+    def setup_columns(self, *args, **kwargs):
+        super(BuiltPackagesTableBase, self).setup_columns(*args, **kwargs)
+
+        def pkg_link_template(val):
+            """ return the template used for the link with the val as the
+            element value i.e. inside the <a></a>"""
+
+            return ('''
+                    <a href="
+                    {%% url "package_built_detail" extra.build.pk data.pk %%}
+                    ">%s</a>
+                    ''' % val)
+
+        def recipe_link_template(val):
+            return ('''
+                    {%% if data.recipe %%}
+                    <a href="
+                    {%% url "recipe" extra.build.pk data.recipe.pk %%}
+                    ">%(value)s</a>
+                    {%% else %%}
+                    %(value)s
+                    {%% endif %%}
+                    ''' % {'value': val})
+
+        add_pkg_link_to = ['name', 'version', 'size', 'license']
+        add_recipe_link_to = ['recipe__name', 'recipe__version']
+
+        # Add the recipe and pkg build links to the required columns
+        for column in self.columns:
+            # Convert to template field style accessors
+            tmplv = column['field_name'].replace('__', '.')
+            tmplv = "{{data.%s}}" % tmplv
+
+            if column['field_name'] in add_pkg_link_to:
+                # Don't overwrite an existing template
+                if column['static_data_template']:
+                    column['static_data_template'] =\
+                        pkg_link_template(column['static_data_template'])
+                else:
+                    column['static_data_template'] = pkg_link_template(tmplv)
+
+                column['static_data_name'] = column['field_name']
+
+            elif column['field_name'] in add_recipe_link_to:
+                # Don't overwrite an existing template
+                if column['static_data_template']:
+                    column['static_data_template'] =\
+                        recipe_link_template(column['static_data_template'])
+                else:
+                    column['static_data_template'] =\
+                        recipe_link_template(tmplv)
+                column['static_data_name'] = column['field_name']
+
+        self.add_column(title="Layer",
+                        field_name="recipe__layer_version__layer__name",
+                        hidden=True,
+                        orderable=True)
+
+        self.add_column(title="Layer branch",
+                        field_name="recipe__layer_version__branch",
+                        hidden=True,
+                        orderable=True)
+
+        git_rev_template = '''
+        {% with vcs_ref=data.recipe.layer_version.commit %}
+        {% include 'snippets/gitrev_popover.html' %}
+        {% endwith %}
+        '''
+
+        self.add_column(title="Layer commit",
+                        static_data_name='vcs_ref',
+                        static_data_template=git_rev_template,
+                        hidden=True)
+
+
+class BuiltPackagesTable(BuildTablesMixin, BuiltPackagesTableBase):
+    """ Show all the packages built for the selected build """
+    def __init__(self, *args, **kwargs):
+        super(BuiltPackagesTable, self).__init__(*args, **kwargs)
+        self.title = "Packages built"
+        self.default_orderby = "name"
+
+        self.empty_state =\
+            ('<strong>No packages were built.</strong> How did this happen?'
+             'Well, BitBake reuses as much stuff as possible.'
+             'If all of the packages needed were already built and available'
+             'in your build infrastructure, BitBake'
+             'will not rebuild any of them. This might be slightly confusing,'
+             'but it does make everything faster.')
+
+    def setup_columns(self, *args, **kwargs):
+        super(BuiltPackagesTable, self).setup_columns(*args, **kwargs)
+
+        def remove_dep_cols(columns):
+            for column in columns:
+                # We don't need these fields
+                if column['static_data_name'] in ['reverse_dependencies',
+                                                  'dependencies']:
+                    continue
+
+                yield column
+
+        self.columns = list(remove_dep_cols(self.columns))
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index 0cf96a0..902f62f 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -146,15 +146,8 @@ class LayersTable(ToasterTable):
                         static_data_template=git_dir_template)
 
         revision_template =  '''
-        {% load projecttags  %}
         {% with vcs_ref=data.get_vcs_reference %}
-        {% if vcs_ref|is_shaid %}
-        <a class="btn" data-content="<ul class='unstyled'> <li>{{vcs_ref}}</li> </ul>">
-        {{vcs_ref|truncatechars:10}}
-        </a>
-        {% else %}
-        {{vcs_ref}}
-        {% endif %}
+        {% include 'snippets/gitrev_popover.html' %}
         {% endwith %}
         '''
 
@@ -718,6 +711,7 @@ class PackagesTable(ToasterTable):
 
         self.add_column(title="Approx Size",
                         orderable=True,
+                        field_name="size",
                         static_data_name="size",
                         static_data_template="{% load projecttags %} \
                         {{data.size|filtered_filesizeformat}}")
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html 
b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
index 76a602b..c002e42 100644
--- a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
@@ -23,10 +23,19 @@
       {% block localbreadcrumb %}{% endblock %}
     </ul>
     <script>
-      $( function () {
+      $(document).ready(function(){
         $('#breadcrumb > li').append('<span class="divider">&rarr;</span>');
         $('#breadcrumb > li:last').addClass("active");
         $('#breadcrumb > li:last > span').remove();
+
+        $("#build-menu li a").each(function(){
+          /* Set the page active state in the Build menu */
+          if (window.location.href.split('?')[0] === $(this).prop("href")){
+            $(this).parent().addClass("active");
+          } else {
+            $(this).parent().removeClass("active");
+          }
+        });
       });
     </script>
   </div>
@@ -35,7 +44,7 @@
   <div class="row">
     <!-- begin left sidebar container -->
     <div id="nav" class="col-md-2">
-      <ul class="nav nav-list well">
+      <ul class="nav nav-list well" id="build-menu">
         <li
           {% if request.resolver_match.url_name == 'builddashboard'  %}
             class="active"
@@ -54,25 +63,14 @@
         {% block nav-configuration %}
           <li><a href="{% url 'configuration' build.pk %}">Configuration</a></li>
         {% endblock %}
-        {% block nav-tasks %}
+
           <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
-        {% endblock %}
-        {% block nav-recipes %}
           <li><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
-        {% endblock %}
-        {% block nav-packages %}
           <li><a href="{% url 'packages' build.pk %}">Packages</a></li>
-        {% endblock %}
           <li class="nav-header">Performance</li>
-        {% block nav-buildtime %}
           <li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
-        {% endblock %}
-        {% block nav-cputime %}
           <li><a href="{% url 'cputime' build.pk %}">CPU usage</a></li>
-        {% endblock %}
-        {% block nav-diskio %}
           <li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
-        {% endblock %}
 
         <li class="divider"></li>
 
diff --git a/bitbake/lib/toaster/toastergui/templates/buildinfo-toastertable.html 
b/bitbake/lib/toaster/toastergui/templates/buildinfo-toastertable.html
new file mode 100644
index 0000000..4ce5c4a
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/buildinfo-toastertable.html
@@ -0,0 +1,23 @@
+{% extends "basebuildpage.html" %}
+
+{% load projecttags %}
+
+{% block title %} {{title}} - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - 
{{build.project.name}} - Toaster {% endblock %}
+{% block localbreadcrumb %}
+<li>{{title}}</li>
+{% endblock %}
+
+{% block nav-packages %}
+{% endblock %}
+
+{% block buildinfomain %}
+<div class="span10">
+{% url 'builtpackagestable' build.id as xhr_table_url %}
+  <div class="page-header">
+     <h1>
+       {{title}} (<span class="table-count-{{table_name}}">0</span>) </h2>
+     </h1>
+  </div>
+  {% include "toastertable.html" %}
+</div>
+{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/snippets/gitrev_popover.html 
b/bitbake/lib/toaster/toastergui/templates/snippets/gitrev_popover.html
new file mode 100644
index 0000000..281a3bd
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/snippets/gitrev_popover.html
@@ -0,0 +1,8 @@
+{% load projecttags  %}
+{% if vcs_ref|is_shaid %}
+<a class="btn" data-content="<ul class='unstyled'> <li>{{vcs_ref}}</li> </ul>">
+ {{vcs_ref|truncatechars:10}}
+</a>
+{% else %}
+{{vcs_ref}}
+{% endif %}
diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py
index 27b0baa..3ce0d51 100644
--- a/bitbake/lib/toaster/toastergui/urls.py
+++ b/bitbake/lib/toaster/toastergui/urls.py
@@ -21,6 +21,7 @@ from django.views.generic import RedirectView, TemplateView
 
 from django.http import HttpResponseBadRequest
 from toastergui import tables
+from toastergui import buildtables
 from toastergui import typeaheads
 from toastergui import api
 
@@ -44,7 +45,11 @@ urlpatterns = patterns('toastergui.views',
         url(r'^build/(?P<build_id>\d+)/recipe/(?P<recipe_id>\d+)$', 'recipe', name='recipe'),
         url(r'^build/(?P<build_id>\d+)/recipe_packages/(?P<recipe_id>\d+)$', 'recipe_packages', 
name='recipe_packages'),
 
-        url(r'^build/(?P<build_id>\d+)/packages/$', 'bpackage', name='packages'),
+        url(r'^build/(?P<build_id>\d+)/packages/$',
+            buildtables.BuiltPackagesTable.as_view(
+                template_name="buildinfo-toastertable.html"),
+            name='packages'),
+
         url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)$', 'package_built_detail',
                 name='package_built_detail'),
         url(r'^build/(?P<build_id>\d+)/package_built_dependencies/(?P<package_id>\d+)$',
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index 0510897..de1e413 100755
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -1493,96 +1493,6 @@ def configvars(request, build_id):
     _set_parameters_values(pagesize, orderby, request)
     return response
 
-def bpackage(request, build_id):
-    template = 'bpackage.html'
-    (pagesize, orderby) = _get_parameters_values(request, 100, 'name:+')
-    mandatory_parameters = { 'count' : pagesize,  'page' : 1, 'orderby' : orderby }
-    retval = _verify_parameters( request.GET, mandatory_parameters )
-    if retval:
-        return _redirect_parameters( 'packages', request.GET, mandatory_parameters, build_id = build_id)
-    (filter_string, search_term, ordering_string) = _search_tuple(request, Package)
-    queryset = Package.objects.filter(build = build_id).filter(size__gte=0)
-    queryset = _get_queryset(Package, queryset, filter_string, search_term, ordering_string, 'name')
-
-    packages = _build_page_range(Paginator(queryset, pagesize),request.GET.get('page', 1))
-
-    build = Build.objects.get( pk = build_id )
-
-    context = {
-        'objectname': 'packages built',
-        'build': build,
-        'project': build.project,
-        'objects' : packages,
-        'default_orderby' : 'name:+',
-        'tablecols':[
-            {
-                'name':'Package',
-                'qhelp':'Packaged output resulting from building a recipe',
-                'orderfield': _get_toggle_order(request, "name"),
-                'ordericon':_get_toggle_order_icon(request, "name"),
-            },
-            {
-                'name':'Package version',
-                'qhelp':'The package version and revision',
-            },
-            {
-                'name':'Size',
-                'qhelp':'The size of the package',
-                'orderfield': _get_toggle_order(request, "size", True),
-                'ordericon':_get_toggle_order_icon(request, "size"),
-                'orderkey' : 'size',
-                'clclass': 'size', 'hidden': 0,
-                'dclass' : 'span2',
-            },
-            {
-                'name':'License',
-                'qhelp':'The license under which the package is distributed. Multiple license names 
separated by the pipe character indicates a choice between licenses. Multiple license names separated by the 
ampersand character indicates multiple licenses exist that cover different parts of the source',
-                'orderfield': _get_toggle_order(request, "license"),
-                'ordericon':_get_toggle_order_icon(request, "license"),
-                'orderkey' : 'license',
-                'clclass': 'license', 'hidden': 1,
-            },
-            {
-                'name':'Recipe',
-                'qhelp':'The name of the recipe building the package',
-                'orderfield': _get_toggle_order(request, "recipe__name"),
-                'ordericon':_get_toggle_order_icon(request, "recipe__name"),
-                'orderkey' : 'recipe__name',
-                'clclass': 'recipe__name', 'hidden': 0,
-            },
-            {
-                'name':'Recipe version',
-                'qhelp':'Version and revision of the recipe building the package',
-                'clclass': 'recipe__version', 'hidden': 1,
-            },
-            {
-                'name':'Layer',
-                'qhelp':'The name of the layer providing the recipe that builds the package',
-                'orderfield': _get_toggle_order(request, "recipe__layer_version__layer__name"),
-                'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__layer__name"),
-                'orderkey' : 'recipe__layer_version__layer__name',
-                'clclass': 'recipe__layer_version__layer__name', 'hidden': 1,
-            },
-            {
-                'name':'Layer branch',
-                'qhelp':'The Git branch of the layer providing the recipe that builds the package',
-                'orderfield': _get_toggle_order(request, "recipe__layer_version__branch"),
-                'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__branch"),
-                'orderkey' : 'recipe__layer_version__branch',
-                'clclass': 'recipe__layer_version__branch', 'hidden': 1,
-            },
-            {
-                'name':'Layer commit',
-                'qhelp':'The Git commit of the layer providing the recipe that builds the package',
-                'clclass': 'recipe__layer_version__layer__commit', 'hidden': 1,
-            },
-            ]
-        }
-
-    response = render(request, template, context)
-    _set_parameters_values(pagesize, orderby, request)
-    return response
-
 def bfile(request, build_id, package_id):
     template = 'bfile.html'
     files = Package_File.objects.filter(package = package_id)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]