bitbake: toaster: hide irrelevant builds in the project builds view

This patch fixes the project builds view so it doesn't show
"in progress" builds or builds for other projects.

Note that this also modifies the "all builds" view to use
the same queryset filtering as the project builds. This is
to avoid excluding "in progress" builds more than once, which
is what was happening before.

The patch also has a minor change to ensure that when
displaying the project builds page, only builds for that
project are in the results.

The queryset filtering is now split over several lines so
you can see what's going on.

[YOCTO #8236]
[YOCTO #8187]

(Bitbake rev: 771c08b9be1f7875e0216e381ab0a81ef0d26256)

Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Elliot Smith <elliot.smith@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexandru DAMIAN 2015-07-24 16:05:20 +01:00 committed by Richard Purdie
parent 5b4e380b9b
commit e993aa6705
3 changed files with 91 additions and 6 deletions

View File

@ -24,10 +24,11 @@
from django.test import TestCase
from django.core.urlresolvers import reverse
from django.utils import timezone
from orm.models import Project, Release, BitbakeVersion, Build
from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer
from orm.models import Project, Release, BitbakeVersion, ProjectTarget
from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Build
from orm.models import Layer_Version, Recipe, Machine, ProjectLayer
import json
from bs4 import BeautifulSoup
PROJECT_NAME = "test project"
@ -41,7 +42,6 @@ class ViewTests(TestCase):
bitbake_version=bbv)
self.project = Project.objects.create_project(name=PROJECT_NAME,
release=release)
layersrc = LayerSource.objects.create(sourcetype=LayerSource.TYPE_IMPORTED)
self.priority = ReleaseLayerSourcePriority.objects.create(release=release,
layer_source=layersrc)
@ -292,3 +292,88 @@ class ProjectsPageTests(TestCase):
'should be a project row in the page')
self.assertTrue(self.PROJECT_NAME in response.content,
'default project "cli builds" should be in page')
class ProjectBuildsDisplayTest(TestCase):
""" Test data at /project/X/builds is displayed correctly """
def setUp(self):
bbv = BitbakeVersion.objects.create(name="bbv1", giturl="/tmp/",
branch="master", dirpath="")
release = Release.objects.create(name="release1",
bitbake_version=bbv)
self.project1 = Project.objects.create_project(name=PROJECT_NAME,
release=release)
self.project2 = Project.objects.create_project(name=PROJECT_NAME,
release=release)
# parameters for builds to associate with the projects
now = timezone.now()
self.project1_build_success = {
"project": self.project1,
"started_on": now,
"completed_on": now,
"outcome": Build.SUCCEEDED
}
self.project1_build_in_progress = {
"project": self.project1,
"started_on": now,
"completed_on": now,
"outcome": Build.IN_PROGRESS
}
self.project2_build_success = {
"project": self.project2,
"started_on": now,
"completed_on": now,
"outcome": Build.SUCCEEDED
}
self.project2_build_in_progress = {
"project": self.project2,
"started_on": now,
"completed_on": now,
"outcome": Build.IN_PROGRESS
}
def _get_rows_for_project(self, project_id):
url = reverse("projectbuilds", args=(project_id,))
response = self.client.get(url, follow=True)
soup = BeautifulSoup(response.content)
return soup.select('tr[class="data"]')
def test_show_builds_for_project(self):
""" Builds for a project should be displayed """
build1a = Build.objects.create(**self.project1_build_success)
build1b = Build.objects.create(**self.project1_build_success)
build_rows = self._get_rows_for_project(self.project1.id)
self.assertEqual(len(build_rows), 2)
def test_show_builds_for_project_only(self):
""" Builds for other projects should be excluded """
build1a = Build.objects.create(**self.project1_build_success)
build1b = Build.objects.create(**self.project1_build_success)
build1c = Build.objects.create(**self.project1_build_success)
# shouldn't see these two
build2a = Build.objects.create(**self.project2_build_success)
build2b = Build.objects.create(**self.project2_build_in_progress)
build_rows = self._get_rows_for_project(self.project1.id)
self.assertEqual(len(build_rows), 3)
def test_show_builds_exclude_in_progress(self):
""" "in progress" builds should not be shown """
build1a = Build.objects.create(**self.project1_build_success)
build1b = Build.objects.create(**self.project1_build_success)
# shouldn't see this one
build1c = Build.objects.create(**self.project1_build_in_progress)
# shouldn't see these two either, as they belong to a different project
build2a = Build.objects.create(**self.project2_build_success)
build2b = Build.objects.create(**self.project2_build_in_progress)
build_rows = self._get_rows_for_project(self.project1.id)
self.assertEqual(len(build_rows), 2)

View File

@ -40,7 +40,7 @@ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.http import HttpResponseBadRequest, HttpResponseNotFound
from django.utils import timezone
from django.utils.html import escape
from datetime import timedelta, datetime, date
from datetime import timedelta, datetime
from django.utils import formats
from toastergui.templatetags.projecttags import json as jsonfilter
import json
@ -442,8 +442,7 @@ def _modify_date_range_filter(filter_string):
def _add_daterange_context(queryset_all, request, daterange_list):
# calculate the exact begining of local today and yesterday
today_begin = timezone.localtime(timezone.now())
today_begin = date(today_begin.year,today_begin.month,today_begin.day)
yesterday_begin = today_begin-timedelta(days=1)
yesterday_begin = today_begin - timedelta(days=1)
# add daterange persistent
context_date = {}
context_date['last_date_from'] = request.GET.get('last_date_from',timezone.localtime(timezone.now()).strftime("%d/%m/%Y"))

View File

@ -3,3 +3,4 @@ South==0.8.4
argparse==1.2.1
wsgiref==0.1.2
filemagic==1.6
beautifulsoup4>=4.4.0