diff options
| -rw-r--r-- | bitbake/lib/toaster/orm/models.py | 29 | ||||
| -rw-r--r-- | bitbake/lib/toaster/toastergui/tables.py | 33 | ||||
| -rw-r--r-- | bitbake/lib/toaster/toastergui/templates/mrb_section.html | 7 | ||||
| -rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 2 |
4 files changed, 46 insertions, 25 deletions
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py index ba1eb0f2c8..1cf997cfe5 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py | |||
| @@ -31,6 +31,7 @@ import django.db.models.signals | |||
| 31 | 31 | ||
| 32 | import os.path | 32 | import os.path |
| 33 | import re | 33 | import re |
| 34 | import itertools | ||
| 34 | 35 | ||
| 35 | import logging | 36 | import logging |
| 36 | logger = logging.getLogger("toaster") | 37 | logger = logging.getLogger("toaster") |
| @@ -372,11 +373,37 @@ class Build(models.Model): | |||
| 372 | build_name = models.CharField(max_length=100) | 373 | build_name = models.CharField(max_length=100) |
| 373 | bitbake_version = models.CharField(max_length=50) | 374 | bitbake_version = models.CharField(max_length=50) |
| 374 | 375 | ||
| 376 | @staticmethod | ||
| 377 | def get_recent(project=None): | ||
| 378 | """ | ||
| 379 | Return recent builds as a list; if project is set, only return | ||
| 380 | builds for that project | ||
| 381 | """ | ||
| 382 | |||
| 383 | builds = Build.objects.all() | ||
| 384 | |||
| 385 | if project: | ||
| 386 | builds = builds.filter(project=project) | ||
| 387 | |||
| 388 | finished_criteria = Q(outcome=Build.SUCCEEDED) | Q(outcome=Build.FAILED) | ||
| 389 | |||
| 390 | recent_builds = list(itertools.chain( | ||
| 391 | builds.filter(outcome=Build.IN_PROGRESS).order_by("-started_on"), | ||
| 392 | builds.filter(finished_criteria).order_by("-completed_on")[:3] | ||
| 393 | )) | ||
| 394 | |||
| 395 | # add percentage done property to each build; this is used | ||
| 396 | # to show build progress in mrb_section.html | ||
| 397 | for build in recent_builds: | ||
| 398 | build.percentDone = build.completeper() | ||
| 399 | |||
| 400 | return recent_builds | ||
| 401 | |||
| 375 | def completeper(self): | 402 | def completeper(self): |
| 376 | tf = Task.objects.filter(build = self) | 403 | tf = Task.objects.filter(build = self) |
| 377 | tfc = tf.count() | 404 | tfc = tf.count() |
| 378 | if tfc > 0: | 405 | if tfc > 0: |
| 379 | completeper = tf.exclude(order__isnull=True).count()*100/tf.count() | 406 | completeper = tf.exclude(order__isnull=True).count()*100/tfc |
| 380 | else: | 407 | else: |
| 381 | completeper = 0 | 408 | completeper = 0 |
| 382 | return completeper | 409 | return completeper |
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py index ba2726d070..7fb3f8605e 100644 --- a/bitbake/lib/toaster/toastergui/tables.py +++ b/bitbake/lib/toaster/toastergui/tables.py | |||
| @@ -28,7 +28,6 @@ from django.conf.urls import url | |||
| 28 | from django.core.urlresolvers import reverse, resolve | 28 | from django.core.urlresolvers import reverse, resolve |
| 29 | from django.http import HttpResponse | 29 | from django.http import HttpResponse |
| 30 | from django.views.generic import TemplateView | 30 | from django.views.generic import TemplateView |
| 31 | import itertools | ||
| 32 | 31 | ||
| 33 | from toastergui.tablefilter import TableFilter | 32 | from toastergui.tablefilter import TableFilter |
| 34 | from toastergui.tablefilter import TableFilterActionToggle | 33 | from toastergui.tablefilter import TableFilterActionToggle |
| @@ -1060,17 +1059,9 @@ class BuildsTable(ToasterTable): | |||
| 1060 | def get_context_data(self, **kwargs): | 1059 | def get_context_data(self, **kwargs): |
| 1061 | context = super(BuildsTable, self).get_context_data(**kwargs) | 1060 | context = super(BuildsTable, self).get_context_data(**kwargs) |
| 1062 | 1061 | ||
| 1063 | # for the latest builds section | 1062 | # should be set in subclasses |
| 1064 | builds = self.get_builds() | 1063 | context['mru'] = [] |
| 1065 | 1064 | ||
| 1066 | finished_criteria = Q(outcome=Build.SUCCEEDED) | Q(outcome=Build.FAILED) | ||
| 1067 | |||
| 1068 | latest_builds = itertools.chain( | ||
| 1069 | builds.filter(outcome=Build.IN_PROGRESS).order_by("-started_on"), | ||
| 1070 | builds.filter(finished_criteria).order_by("-completed_on")[:3] | ||
| 1071 | ) | ||
| 1072 | |||
| 1073 | context['mru'] = list(latest_builds) | ||
| 1074 | context['mrb_type'] = self.mrb_type | 1065 | context['mrb_type'] = self.mrb_type |
| 1075 | 1066 | ||
| 1076 | return context | 1067 | return context |
| @@ -1481,6 +1472,12 @@ class AllBuildsTable(BuildsTable): | |||
| 1481 | static_data_name='project', | 1472 | static_data_name='project', |
| 1482 | static_data_template=project_template) | 1473 | static_data_template=project_template) |
| 1483 | 1474 | ||
| 1475 | def get_context_data(self, **kwargs): | ||
| 1476 | """ Get all builds for the recent builds area """ | ||
| 1477 | context = super(AllBuildsTable, self).get_context_data(**kwargs) | ||
| 1478 | context['mru'] = Build.get_recent() | ||
| 1479 | return context | ||
| 1480 | |||
| 1484 | class ProjectBuildsTable(BuildsTable): | 1481 | class ProjectBuildsTable(BuildsTable): |
| 1485 | """ | 1482 | """ |
| 1486 | Builds page for a single project; a BuildsTable, with the queryset | 1483 | Builds page for a single project; a BuildsTable, with the queryset |
| @@ -1521,18 +1518,16 @@ class ProjectBuildsTable(BuildsTable): | |||
| 1521 | 1518 | ||
| 1522 | def get_context_data(self, **kwargs): | 1519 | def get_context_data(self, **kwargs): |
| 1523 | """ | 1520 | """ |
| 1521 | Get recent builds for this project, and the project itself | ||
| 1522 | |||
| 1524 | NOTE: self.project_id must be set before calling super(), | 1523 | NOTE: self.project_id must be set before calling super(), |
| 1525 | as it's used in get_context_data() | 1524 | as it's used in get_context_data() |
| 1526 | """ | 1525 | """ |
| 1527 | self.project_id = kwargs['pid'] | 1526 | self.project_id = kwargs['pid'] |
| 1528 | |||
| 1529 | context = super(ProjectBuildsTable, self).get_context_data(**kwargs) | 1527 | context = super(ProjectBuildsTable, self).get_context_data(**kwargs) |
| 1530 | context['project'] = Project.objects.get(pk=self.project_id) | ||
| 1531 | |||
| 1532 | return context | ||
| 1533 | |||
| 1534 | def get_builds(self): | ||
| 1535 | """ override: only return builds for the relevant project """ | ||
| 1536 | 1528 | ||
| 1537 | project = Project.objects.get(pk=self.project_id) | 1529 | project = Project.objects.get(pk=self.project_id) |
| 1538 | return Build.objects.filter(project=project) | 1530 | context['mru'] = Build.get_recent(project) |
| 1531 | context['project'] = project | ||
| 1532 | |||
| 1533 | return context | ||
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html index 2e5eb5050b..da1253e1d5 100644 --- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html +++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html | |||
| @@ -165,7 +165,6 @@ $(document).ready(function(){ | |||
| 165 | progressTimer = window.setInterval(function() { | 165 | progressTimer = window.setInterval(function() { |
| 166 | libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, | 166 | libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, |
| 167 | function(prjInfo){ | 167 | function(prjInfo){ |
| 168 | |||
| 169 | /* These two are needed because a build can be 100% and still | 168 | /* These two are needed because a build can be 100% and still |
| 170 | * in progress due to the fact that the % done is updated at the | 169 | * in progress due to the fact that the % done is updated at the |
| 171 | * start of a task so it can be doing the last task at 100% | 170 | * start of a task so it can be doing the last task at 100% |
| @@ -176,18 +175,18 @@ $(document).ready(function(){ | |||
| 176 | for (var i in prjInfo.builds){ | 175 | for (var i in prjInfo.builds){ |
| 177 | var build = prjInfo.builds[i]; | 176 | var build = prjInfo.builds[i]; |
| 178 | 177 | ||
| 179 | if (build.status === "In Progress" || | 178 | if (build.outcome === "In Progress" || |
| 180 | $(".progress .bar").length > 0){ | 179 | $(".progress .bar").length > 0){ |
| 181 | /* Update the build progress */ | 180 | /* Update the build progress */ |
| 182 | var percentDone; | 181 | var percentDone; |
| 183 | 182 | ||
| 184 | if (build.status !== "In Progress"){ | 183 | if (build.outcome !== "In Progress"){ |
| 185 | /* We have to ignore the value when it's Succeeded because it | 184 | /* We have to ignore the value when it's Succeeded because it |
| 186 | * goes back to 0 | 185 | * goes back to 0 |
| 187 | */ | 186 | */ |
| 188 | percentDone = 100; | 187 | percentDone = 100; |
| 189 | } else { | 188 | } else { |
| 190 | percentDone = build.build[0].completeper; | 189 | percentDone = build.percentDone; |
| 191 | inProgress++; | 190 | inProgress++; |
| 192 | } | 191 | } |
| 193 | 192 | ||
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 9ad2746881..da73d43c4f 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
| @@ -2008,7 +2008,7 @@ if True: | |||
| 2008 | "completedbuilds": Build.objects.exclude(outcome = Build.IN_PROGRESS).filter(project_id = pid), | 2008 | "completedbuilds": Build.objects.exclude(outcome = Build.IN_PROGRESS).filter(project_id = pid), |
| 2009 | "prj" : {"name": prj.name, }, | 2009 | "prj" : {"name": prj.name, }, |
| 2010 | "buildrequests" : prj.build_set.filter(outcome=Build.IN_PROGRESS), | 2010 | "buildrequests" : prj.build_set.filter(outcome=Build.IN_PROGRESS), |
| 2011 | #"builds" : _project_recent_build_list(prj), | 2011 | "builds" : Build.get_recent(prj), |
| 2012 | "layers" : map(lambda x: { | 2012 | "layers" : map(lambda x: { |
| 2013 | "id": x.layercommit.pk, | 2013 | "id": x.layercommit.pk, |
| 2014 | "orderid": x.pk, | 2014 | "orderid": x.pk, |
