summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliot Smith <elliot.smith@intel.com>2016-01-15 13:00:55 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-01-15 16:30:00 +0000
commiteaae82a19acaf786b866043ea80107f28e8206b2 (patch)
tree4e5edd8d7f044755ae76ae67bd1d473431448a3c
parent33b011c1589519db8176c9f5a4abb540698902e6 (diff)
downloadpoky-eaae82a19acaf786b866043ea80107f28e8206b2.tar.gz
bitbake: toastergui: convert project builds page to ToasterTable
Use the all builds ToasterTable as the basis for the project builds ToasterTable. [YOCTO #8738] (Bitbake rev: 87bcfb740dd2d9944e35a2a1f71cbf8ff3b266e9) Signed-off-by: Elliot Smith <elliot.smith@intel.com> Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/projecttopbar.js9
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/table.js13
-rw-r--r--bitbake/lib/toaster/toastergui/tables.py184
-rw-r--r--bitbake/lib/toaster/toastergui/templates/baseprojectpage.html1
-rw-r--r--bitbake/lib/toaster/toastergui/templates/mrb_section.html2
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html56
-rw-r--r--bitbake/lib/toaster/toastergui/urls.py6
-rwxr-xr-xbitbake/lib/toaster/toastergui/views.py16
-rw-r--r--bitbake/lib/toaster/toastergui/widgets.py1
9 files changed, 239 insertions, 49 deletions
diff --git a/bitbake/lib/toaster/toastergui/static/js/projecttopbar.js b/bitbake/lib/toaster/toastergui/static/js/projecttopbar.js
index b6ad380c19..58a32a056e 100644
--- a/bitbake/lib/toaster/toastergui/static/js/projecttopbar.js
+++ b/bitbake/lib/toaster/toastergui/static/js/projecttopbar.js
@@ -7,7 +7,10 @@ function projectTopBarInit(ctx) {
7 var projectName = $("#project-name"); 7 var projectName = $("#project-name");
8 var projectNameFormToggle = $("#project-change-form-toggle"); 8 var projectNameFormToggle = $("#project-change-form-toggle");
9 var projectNameChangeCancel = $("#project-name-change-cancel"); 9 var projectNameChangeCancel = $("#project-name-change-cancel");
10
11 // this doesn't exist for command-line builds
10 var newBuildTargetInput = $("#build-input"); 12 var newBuildTargetInput = $("#build-input");
13
11 var newBuildTargetBuildBtn = $("#build-button"); 14 var newBuildTargetBuildBtn = $("#build-button");
12 var selectedTarget; 15 var selectedTarget;
13 16
@@ -42,6 +45,12 @@ function projectTopBarInit(ctx) {
42 $(this).parent().removeClass('active'); 45 $(this).parent().removeClass('active');
43 }); 46 });
44 47
48 if (!newBuildTargetInput.length) {
49 return;
50 }
51
52 /* the following only applies for non-command-line projects */
53
45 /* Recipe build input functionality */ 54 /* Recipe build input functionality */
46 if (ctx.numProjectLayers > 0 && ctx.machine){ 55 if (ctx.numProjectLayers > 0 && ctx.machine){
47 newBuildTargetInput.removeAttr("disabled"); 56 newBuildTargetInput.removeAttr("disabled");
diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index afe16b5e1b..7ac4ed5859 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -33,6 +33,10 @@ function tableInit(ctx){
33 33
34 loadData(tableParams); 34 loadData(tableParams);
35 35
36 // clicking on this set of elements removes the search
37 var clearSearchElements = $('.remove-search-btn-'+ctx.tableName +
38 ', .show-all-'+ctx.tableName);
39
36 function loadData(tableParams){ 40 function loadData(tableParams){
37 $.ajax({ 41 $.ajax({
38 type: "GET", 42 type: "GET",
@@ -62,9 +66,9 @@ function tableInit(ctx){
62 paginationBtns.html(""); 66 paginationBtns.html("");
63 67
64 if (tableParams.search) 68 if (tableParams.search)
65 $('.remove-search-btn-'+ctx.tableName).show(); 69 clearSearchElements.show();
66 else 70 else
67 $('.remove-search-btn-'+ctx.tableName).hide(); 71 clearSearchElements.hide();
68 72
69 $('.table-count-' + ctx.tableName).text(tableData.total); 73 $('.table-count-' + ctx.tableName).text(tableData.total);
70 tableTotal = tableData.total; 74 tableTotal = tableData.total;
@@ -230,9 +234,8 @@ function tableInit(ctx){
230 234
231 } else { 235 } else {
232 /* Not orderable */ 236 /* Not orderable */
233 header.addClass("muted");
234 header.css("font-weight", "normal"); 237 header.css("font-weight", "normal");
235 header.append(col.title+' '); 238 header.append('<span class="muted">' + col.title + '</span> ');
236 } 239 }
237 240
238 /* Setup the filter button */ 241 /* Setup the filter button */
@@ -665,7 +668,7 @@ function tableInit(ctx){
665 loadData(tableParams); 668 loadData(tableParams);
666 }); 669 });
667 670
668 $('.remove-search-btn-'+ctx.tableName).click(function(e){ 671 clearSearchElements.click(function(e){
669 e.preventDefault(); 672 e.preventDefault();
670 673
671 tableParams.page = 1; 674 tableParams.page = 1;
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index 58abe36b05..d0ed49625d 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -23,9 +23,11 @@ from toastergui.widgets import ToasterTable
23from toastergui.querysetfilter import QuerysetFilter 23from toastergui.querysetfilter import QuerysetFilter
24from orm.models import Recipe, ProjectLayer, Layer_Version, Machine, Project 24from orm.models import Recipe, ProjectLayer, Layer_Version, Machine, Project
25from orm.models import CustomImageRecipe, Package, Build, LogMessage, Task 25from orm.models import CustomImageRecipe, Package, Build, LogMessage, Task
26from orm.models import ProjectTarget
26from django.db.models import Q, Max, Count 27from django.db.models import Q, Max, Count
27from django.conf.urls import url 28from django.conf.urls import url
28from django.core.urlresolvers import reverse 29from django.core.urlresolvers import reverse, resolve
30from django.http import HttpResponse
29from django.views.generic import TemplateView 31from django.views.generic import TemplateView
30import itertools 32import itertools
31 33
@@ -775,7 +777,7 @@ class ProjectsTable(ToasterTable):
775 ''' 777 '''
776 778
777 errors_template = ''' 779 errors_template = '''
778 {% if data.get_number_of_builds > 0 %} 780 {% if data.get_number_of_builds > 0 and data.get_last_errors > 0 %}
779 <a class="errors.count error" 781 <a class="errors.count error"
780 href="{% url "builddashboard" data.get_last_build_id %}#errors"> 782 href="{% url "builddashboard" data.get_last_build_id %}#errors">
781 {{data.get_last_errors}} error{{data.get_last_errors | pluralize}} 783 {{data.get_last_errors}} error{{data.get_last_errors | pluralize}}
@@ -784,7 +786,7 @@ class ProjectsTable(ToasterTable):
784 ''' 786 '''
785 787
786 warnings_template = ''' 788 warnings_template = '''
787 {% if data.get_number_of_builds > 0 %} 789 {% if data.get_number_of_builds > 0 and data.get_last_warnings > 0 %}
788 <a class="warnings.count warning" 790 <a class="warnings.count warning"
789 href="{% url "builddashboard" data.get_last_build_id %}#warnings"> 791 href="{% url "builddashboard" data.get_last_build_id %}#warnings">
790 {{data.get_last_warnings}} warning{{data.get_last_warnings | pluralize}} 792 {{data.get_last_warnings}} warning{{data.get_last_warnings | pluralize}}
@@ -886,30 +888,45 @@ class BuildsTable(ToasterTable):
886 def __init__(self, *args, **kwargs): 888 def __init__(self, *args, **kwargs):
887 super(BuildsTable, self).__init__(*args, **kwargs) 889 super(BuildsTable, self).__init__(*args, **kwargs)
888 self.default_orderby = '-completed_on' 890 self.default_orderby = '-completed_on'
889 self.title = 'All builds'
890 self.static_context_extra['Build'] = Build 891 self.static_context_extra['Build'] = Build
891 self.static_context_extra['Task'] = Task 892 self.static_context_extra['Task'] = Task
892 893
894 # attributes that are overridden in subclasses
895
896 # title for the page
897 self.title = ''
898
899 # 'project' or 'all'; determines how the mrb (most recent builds)
900 # section is displayed
901 self.mrb_type = ''
902
903 def get_builds(self):
904 """
905 overridden in ProjectBuildsTable to return builds for a
906 single project
907 """
908 return Build.objects.all()
909
893 def get_context_data(self, **kwargs): 910 def get_context_data(self, **kwargs):
894 context = super(BuildsTable, self).get_context_data(**kwargs) 911 context = super(BuildsTable, self).get_context_data(**kwargs)
895 912
896 # for the latest builds section 913 # for the latest builds section
897 queryset = Build.objects.all() 914 builds = self.get_builds()
898 915
899 finished_criteria = Q(outcome=Build.SUCCEEDED) | Q(outcome=Build.FAILED) 916 finished_criteria = Q(outcome=Build.SUCCEEDED) | Q(outcome=Build.FAILED)
900 917
901 latest_builds = itertools.chain( 918 latest_builds = itertools.chain(
902 queryset.filter(outcome=Build.IN_PROGRESS).order_by("-started_on"), 919 builds.filter(outcome=Build.IN_PROGRESS).order_by("-started_on"),
903 queryset.filter(finished_criteria).order_by("-completed_on")[:3] 920 builds.filter(finished_criteria).order_by("-completed_on")[:3]
904 ) 921 )
905 922
906 context['mru'] = list(latest_builds) 923 context['mru'] = list(latest_builds)
907 context['mrb_type'] = 'all' 924 context['mrb_type'] = self.mrb_type
908 925
909 return context 926 return context
910 927
911 def setup_queryset(self, *args, **kwargs): 928 def setup_queryset(self, *args, **kwargs):
912 queryset = Build.objects.all() 929 queryset = self.get_builds()
913 930
914 # don't include in progress builds 931 # don't include in progress builds
915 queryset = queryset.exclude(outcome=Build.IN_PROGRESS) 932 queryset = queryset.exclude(outcome=Build.IN_PROGRESS)
@@ -949,7 +966,8 @@ class BuildsTable(ToasterTable):
949 {% if data.cooker_log_path %} 966 {% if data.cooker_log_path %}
950 &nbsp; 967 &nbsp;
951 <a href="{% url "build_artifact" data.id "cookerlog" data.id %}"> 968 <a href="{% url "build_artifact" data.id "cookerlog" data.id %}">
952 <i class="icon-download-alt" title="Download build log"></i> 969 <i class="icon-download-alt get-help"
970 data-original-title="Download build log"></i>
953 </a> 971 </a>
954 {% endif %} 972 {% endif %}
955 ''' 973 '''
@@ -1031,19 +1049,6 @@ class BuildsTable(ToasterTable):
1031 {% endif %} 1049 {% endif %}
1032 ''' 1050 '''
1033 1051
1034 project_template = '''
1035 {% load project_url_tag %}
1036 <a href="{% project_url data.project %}">
1037 {{data.project.name}}
1038 </a>
1039 {% if data.project.is_default %}
1040 <i class="icon-question-sign get-help hover-help" title=""
1041 data-original-title="This project shows information about
1042 the builds you start from the command line while Toaster is
1043 running" style="visibility: hidden;"></i>
1044 {% endif %}
1045 '''
1046
1047 self.add_column(title='Outcome', 1052 self.add_column(title='Outcome',
1048 help_text='Final state of the build (successful \ 1053 help_text='Final state of the build (successful \
1049 or failed)', 1054 or failed)',
@@ -1098,16 +1103,16 @@ class BuildsTable(ToasterTable):
1098 help_text='The number of errors encountered during \ 1103 help_text='The number of errors encountered during \
1099 the build (if any)', 1104 the build (if any)',
1100 hideable=True, 1105 hideable=True,
1101 orderable=False, 1106 orderable=True,
1102 static_data_name='errors', 1107 static_data_name='errors_no',
1103 static_data_template=errors_template) 1108 static_data_template=errors_template)
1104 1109
1105 self.add_column(title='Warnings', 1110 self.add_column(title='Warnings',
1106 help_text='The number of warnings encountered during \ 1111 help_text='The number of warnings encountered during \
1107 the build (if any)', 1112 the build (if any)',
1108 hideable=True, 1113 hideable=True,
1109 orderable=False, 1114 orderable=True,
1110 static_data_name='warnings', 1115 static_data_name='warnings_no',
1111 static_data_template=warnings_template) 1116 static_data_template=warnings_template)
1112 1117
1113 self.add_column(title='Time', 1118 self.add_column(title='Time',
@@ -1125,12 +1130,6 @@ class BuildsTable(ToasterTable):
1125 static_data_name='image_files', 1130 static_data_name='image_files',
1126 static_data_template=image_files_template) 1131 static_data_template=image_files_template)
1127 1132
1128 self.add_column(title='Project',
1129 hideable=True,
1130 orderable=False,
1131 static_data_name='project-name',
1132 static_data_template=project_template)
1133
1134 def setup_filters(self, *args, **kwargs): 1133 def setup_filters(self, *args, **kwargs):
1135 # outcomes 1134 # outcomes
1136 outcome_filter = TableFilter( 1135 outcome_filter = TableFilter(
@@ -1239,3 +1238,122 @@ class BuildsTable(ToasterTable):
1239 failed_tasks_filter.add_action(with_failed_tasks_action) 1238 failed_tasks_filter.add_action(with_failed_tasks_action)
1240 failed_tasks_filter.add_action(without_failed_tasks_action) 1239 failed_tasks_filter.add_action(without_failed_tasks_action)
1241 self.add_filter(failed_tasks_filter) 1240 self.add_filter(failed_tasks_filter)
1241
1242 def post(self, request, *args, **kwargs):
1243 """ Process HTTP POSTs which make build requests """
1244
1245 project = Project.objects.get(pk=kwargs['pid'])
1246
1247 if 'buildCancel' in request.POST:
1248 for i in request.POST['buildCancel'].strip().split(" "):
1249 try:
1250 br = BuildRequest.objects.select_for_update().get(project = project, pk = i, state__lte = BuildRequest.REQ_QUEUED)
1251 br.state = BuildRequest.REQ_DELETED
1252 br.save()
1253 except BuildRequest.DoesNotExist:
1254 pass
1255
1256 if 'buildDelete' in request.POST:
1257 for i in request.POST['buildDelete'].strip().split(" "):
1258 try:
1259 BuildRequest.objects.select_for_update().get(project = project, pk = i, state__lte = BuildRequest.REQ_DELETED).delete()
1260 except BuildRequest.DoesNotExist:
1261 pass
1262
1263 if 'targets' in request.POST:
1264 ProjectTarget.objects.filter(project = project).delete()
1265 s = str(request.POST['targets'])
1266 for t in s.translate(None, ";%|\"").split(" "):
1267 if ":" in t:
1268 target, task = t.split(":")
1269 else:
1270 target = t
1271 task = ""
1272 ProjectTarget.objects.create(project = project,
1273 target = target,
1274 task = task)
1275 project.schedule_build()
1276
1277 # redirect back to builds page so any new builds in progress etc.
1278 # are visible
1279 response = HttpResponse()
1280 response.status_code = 302
1281 response['Location'] = request.build_absolute_uri()
1282 return response
1283
1284class AllBuildsTable(BuildsTable):
1285 """ Builds page for all builds """
1286
1287 def __init__(self, *args, **kwargs):
1288 super(AllBuildsTable, self).__init__(*args, **kwargs)
1289 self.title = 'All builds'
1290 self.mrb_type = 'all'
1291
1292 def setup_columns(self, *args, **kwargs):
1293 """
1294 All builds page shows a column for the project
1295 """
1296
1297 super(AllBuildsTable, self).setup_columns(*args, **kwargs)
1298
1299 project_template = '''
1300 {% load project_url_tag %}
1301 <a href="{% project_url data.project %}">
1302 {{data.project.name}}
1303 </a>
1304 {% if data.project.is_default %}
1305 <i class="icon-question-sign get-help hover-help" title=""
1306 data-original-title="This project shows information about
1307 the builds you start from the command line while Toaster is
1308 running" style="visibility: hidden;"></i>
1309 {% endif %}
1310 '''
1311
1312 self.add_column(title='Project',
1313 hideable=True,
1314 orderable=True,
1315 static_data_name='project',
1316 static_data_template=project_template)
1317
1318class ProjectBuildsTable(BuildsTable):
1319 """
1320 Builds page for a single project; a BuildsTable, with the queryset
1321 filtered by project
1322 """
1323
1324 def __init__(self, *args, **kwargs):
1325 super(ProjectBuildsTable, self).__init__(*args, **kwargs)
1326 self.title = 'All project builds'
1327 self.mrb_type = 'project'
1328
1329 # set from the querystring
1330 self.project_id = None
1331
1332 def setup_queryset(self, *args, **kwargs):
1333 """
1334 NOTE: self.project_id must be set before calling super(),
1335 as it's used in setup_queryset()
1336 """
1337 self.project_id = kwargs['pid']
1338 super(ProjectBuildsTable, self).setup_queryset(*args, **kwargs)
1339
1340 project = Project.objects.get(pk=self.project_id)
1341 self.queryset = self.queryset.filter(project=project)
1342
1343 def get_context_data(self, **kwargs):
1344 """
1345 NOTE: self.project_id must be set before calling super(),
1346 as it's used in get_context_data()
1347 """
1348 self.project_id = kwargs['pid']
1349
1350 context = super(ProjectBuildsTable, self).get_context_data(**kwargs)
1351 context['project'] = Project.objects.get(pk=self.project_id)
1352
1353 return context
1354
1355 def get_builds(self):
1356 """ override: only return builds for the relevant project """
1357
1358 project = Project.objects.get(pk=self.project_id)
1359 return Build.objects.filter(project=project)
diff --git a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
index 1f45be462d..b143b78833 100644
--- a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -1,4 +1,5 @@
1{% extends "base.html" %} 1{% extends "base.html" %}
2
2{% load projecttags %} 3{% load projecttags %}
3{% load humanize %} 4{% load humanize %}
4 5
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 52b3f1a7d3..2f4820c3e7 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -6,7 +6,7 @@
6{%if mru and mru.count > 0%} 6{%if mru and mru.count > 0%}
7 7
8 {%if mrb_type == 'project' %} 8 {%if mrb_type == 'project' %}
9 <h2> 9 <h2 class="page-header">
10 Latest project builds 10 Latest project builds
11 11
12 {% if project.is_default %} 12 {% if project.is_default %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
new file mode 100644
index 0000000000..6d7e10bac5
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
@@ -0,0 +1,56 @@
1{% extends 'base.html' %}
2
3{% load static %}
4
5{% block extraheadcontent %}
6 <link rel="stylesheet" href="{% static 'css/jquery-ui.min.css' %}" type='text/css'>
7 <link rel="stylesheet" href="{% static 'css/jquery-ui.structure.min.css' %}" type='text/css'>
8 <link rel="stylesheet" href="{% static 'css/jquery-ui.theme.min.css' %}" type='text/css'>
9 <script src="{% static 'js/jquery-ui.min.js' %}">
10 </script>
11{% endblock %}
12
13{% block title %} {{title}} - {{project.name}} - Toaster {% endblock %}
14
15{% block pagecontent %}
16
17 {% include "projecttopbar.html" %}
18
19 <div class="row-fluid">
20 {% with mru=mru mrb_type=mrb_type %}
21 {% include 'mrb_section.html' %}
22 {% endwith %}
23
24 <h2 class="page-header top-air" data-role="page-title"></h2>
25
26 {% url 'projectbuilds' project.id as xhr_table_url %}
27 {% include 'toastertable.html' %}
28 </div>
29
30 <script>
31 $(document).ready(function () {
32 // title
33 var tableElt = $("#{{table_name}}");
34 var titleElt = $("[data-role='page-title']");
35
36 tableElt.on("table-done", function (e, total, tableParams) {
37 var title = "All project builds";
38
39 if (tableParams.search || tableParams.filter) {
40 if (total === 0) {
41 title = "No project builds found";
42 }
43 else if (total > 0) {
44 title = total + " project build" + (total > 1 ? 's' : '') + " found";
45 }
46 }
47
48 titleElt.text(title);
49 });
50
51 // highlight builds tab
52 $("#topbar-builds-tab").addClass("active")
53 });
54 </script>
55
56{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py
index 707b7d5f20..c8c1c6a1fe 100644
--- a/bitbake/lib/toaster/toastergui/urls.py
+++ b/bitbake/lib/toaster/toastergui/urls.py
@@ -28,7 +28,7 @@ urlpatterns = patterns('toastergui.views',
28 url(r'^landing/$', 'landing', name='landing'), 28 url(r'^landing/$', 'landing', name='landing'),
29 29
30 url(r'^builds/$', 30 url(r'^builds/$',
31 tables.BuildsTable.as_view(template_name="builds-toastertable.html"), 31 tables.AllBuildsTable.as_view(template_name="builds-toastertable.html"),
32 name='all-builds'), 32 name='all-builds'),
33 33
34 # build info navigation 34 # build info navigation
@@ -83,7 +83,9 @@ urlpatterns = patterns('toastergui.views',
83 83
84 url(r'^project/(?P<pid>\d+)/$', 'project', name='project'), 84 url(r'^project/(?P<pid>\d+)/$', 'project', name='project'),
85 url(r'^project/(?P<pid>\d+)/configuration$', 'projectconf', name='projectconf'), 85 url(r'^project/(?P<pid>\d+)/configuration$', 'projectconf', name='projectconf'),
86 url(r'^project/(?P<pid>\d+)/builds/$', 'projectbuilds', name='projectbuilds'), 86 url(r'^project/(?P<pid>\d+)/builds/$',
87 tables.ProjectBuildsTable.as_view(template_name="projectbuilds-toastertable.html"),
88 name='projectbuilds'),
87 89
88 # the import layer is a project-specific functionality; 90 # the import layer is a project-specific functionality;
89 url(r'^project/(?P<pid>\d+)/importlayer$', 'importlayer', name='importlayer'), 91 url(r'^project/(?P<pid>\d+)/importlayer$', 'importlayer', name='importlayer'),
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index 295773fc66..fbae36c69c 100755
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -91,6 +91,7 @@ def landing(request):
91 91
92 return render(request, 'landing.html', context) 92 return render(request, 'landing.html', context)
93 93
94"""
94# returns a list for most recent builds; 95# returns a list for most recent builds;
95def _get_latest_builds(prj=None): 96def _get_latest_builds(prj=None):
96 queryset = Build.objects.all() 97 queryset = Build.objects.all()
@@ -101,8 +102,9 @@ def _get_latest_builds(prj=None):
101 return list(itertools.chain( 102 return list(itertools.chain(
102 queryset.filter(outcome=Build.IN_PROGRESS).order_by("-started_on"), 103 queryset.filter(outcome=Build.IN_PROGRESS).order_by("-started_on"),
103 queryset.filter(outcome__lt=Build.IN_PROGRESS).order_by("-started_on")[:3] )) 104 queryset.filter(outcome__lt=Build.IN_PROGRESS).order_by("-started_on")[:3] ))
105"""
104 106
105 107"""
106# a JSON-able dict of recent builds; for use in the Project page, xhr_ updates, and other places, as needed 108# a JSON-able dict of recent builds; for use in the Project page, xhr_ updates, and other places, as needed
107def _project_recent_build_list(prj): 109def _project_recent_build_list(prj):
108 data = [] 110 data = []
@@ -131,8 +133,7 @@ def _project_recent_build_list(prj):
131 data.append(d) 133 data.append(d)
132 134
133 return data 135 return data
134 136"""
135
136 137
137def objtojson(obj): 138def objtojson(obj):
138 from django.db.models.query import QuerySet 139 from django.db.models.query import QuerySet
@@ -1915,6 +1916,7 @@ if True:
1915 ''' The exception raised on invalid POST requests ''' 1916 ''' The exception raised on invalid POST requests '''
1916 pass 1917 pass
1917 1918
1919 """
1918 # helper function, to be used on "all builds" and "project builds" pages 1920 # helper function, to be used on "all builds" and "project builds" pages
1919 def _build_list_helper(request, queryset_all, redirect_page, pid=None): 1921 def _build_list_helper(request, queryset_all, redirect_page, pid=None):
1920 default_orderby = 'completed_on:-' 1922 default_orderby = 'completed_on:-'
@@ -2119,6 +2121,7 @@ if True:
2119 # merge daterange values 2121 # merge daterange values
2120 context.update(context_date) 2122 context.update(context_date)
2121 return context, pagesize, orderby 2123 return context, pagesize, orderby
2124 """
2122 2125
2123 2126
2124 2127
@@ -2256,7 +2259,7 @@ if True:
2256 "completedbuilds": Build.objects.exclude(outcome = Build.IN_PROGRESS).filter(project_id = pid), 2259 "completedbuilds": Build.objects.exclude(outcome = Build.IN_PROGRESS).filter(project_id = pid),
2257 "prj" : {"name": prj.name, }, 2260 "prj" : {"name": prj.name, },
2258 "buildrequests" : prj.build_set.filter(outcome=Build.IN_PROGRESS), 2261 "buildrequests" : prj.build_set.filter(outcome=Build.IN_PROGRESS),
2259 "builds" : _project_recent_build_list(prj), 2262 #"builds" : _project_recent_build_list(prj),
2260 "layers" : map(lambda x: { 2263 "layers" : map(lambda x: {
2261 "id": x.layercommit.pk, 2264 "id": x.layercommit.pk,
2262 "orderid": x.pk, 2265 "orderid": x.pk,
@@ -2827,10 +2830,8 @@ if True:
2827 # will set the GET parameters and redirect back to the 2830 # will set the GET parameters and redirect back to the
2828 # all-builds or projectbuilds page as appropriate; 2831 # all-builds or projectbuilds page as appropriate;
2829 # TODO don't use exceptions to control program flow 2832 # TODO don't use exceptions to control program flow
2830 @_template_renderer('projectbuilds.html') 2833 """
2831 def projectbuilds(request, pid): 2834 def projectbuilds(request, pid):
2832 prj = Project.objects.get(id = pid)
2833
2834 if request.method == "POST": 2835 if request.method == "POST":
2835 # process any build request 2836 # process any build request
2836 2837
@@ -2880,6 +2881,7 @@ if True:
2880 context['mru'] = _get_latest_builds(prj) 2881 context['mru'] = _get_latest_builds(prj)
2881 2882
2882 return context 2883 return context
2884 """
2883 2885
2884 2886
2885 def _file_name_for_artifact(b, artifact_type, artifact_id): 2887 def _file_name_for_artifact(b, artifact_type, artifact_id):
diff --git a/bitbake/lib/toaster/toastergui/widgets.py b/bitbake/lib/toaster/toastergui/widgets.py
index 47de30d631..bc081b818b 100644
--- a/bitbake/lib/toaster/toastergui/widgets.py
+++ b/bitbake/lib/toaster/toastergui/widgets.py
@@ -61,7 +61,6 @@ class ToasterTable(TemplateView):
61 61
62 self.total_count = 0 62 self.total_count = 0
63 self.static_context_extra = {} 63 self.static_context_extra = {}
64 self.filter_actions = {}
65 self.empty_state = "Sorry - no data found" 64 self.empty_state = "Sorry - no data found"
66 self.default_orderby = "" 65 self.default_orderby = ""
67 66