summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/toaster/toastergui/templates/base.html5
-rw-r--r--bitbake/lib/toaster/toastergui/templates/builds.html3
-rw-r--r--bitbake/lib/toaster/toastergui/templates/mrb_section.html6
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projects.html7
-rw-r--r--bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py34
-rw-r--r--bitbake/lib/toaster/toastergui/tests.py38
6 files changed, 82 insertions, 11 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 640bc47bcc..3f277909d7 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -1,6 +1,7 @@
1<!DOCTYPE html> 1<!DOCTYPE html>
2{% load static %} 2{% load static %}
3{% load projecttags %} 3{% load projecttags %}
4{% load project_url_tag %}
4<html lang="en"> 5<html lang="en">
5 <head> 6 <head>
6 <title>{% if objectname %} {{objectname|title}} - {% endif %}Toaster</title> 7 <title>{% if objectname %} {{objectname|title}} - {% endif %}Toaster</title>
@@ -35,7 +36,7 @@
35 projectsTypeAheadUrl: {% url 'xhr_projectstypeahead' as prjurl%}{{prjurl|json}}, 36 projectsTypeAheadUrl: {% url 'xhr_projectstypeahead' as prjurl%}{{prjurl|json}},
36 {% if project.id %} 37 {% if project.id %}
37 projectId : {{project.id}}, 38 projectId : {{project.id}},
38 projectPageUrl : {% url 'project' project.id as purl%}{{purl|json}}, 39 projectPageUrl : {% url 'project' project.id as purl %}{{purl|json}},
39 projectName : {{project.name|json}}, 40 projectName : {{project.name|json}},
40 recipesTypeAheadUrl: {% url 'xhr_recipestypeahead' project.id as paturl%}{{paturl|json}}, 41 recipesTypeAheadUrl: {% url 'xhr_recipestypeahead' project.id as paturl%}{{paturl|json}},
41 layersTypeAheadUrl: {% url 'xhr_layerstypeahead' project.id as paturl%}{{paturl|json}}, 42 layersTypeAheadUrl: {% url 'xhr_layerstypeahead' project.id as paturl%}{{paturl|json}},
@@ -133,7 +134,7 @@
133 <h6>Project:</h6> 134 <h6>Project:</h6>
134 <span id="project"> 135 <span id="project">
135 {% if project.id %} 136 {% if project.id %}
136 <a class="lead" href="{% url 'project' project.id %}">{{project.name}}</a> 137 <a class="lead" href="{% project_url project %}">{{project.name}}</a>
137 {% else %} 138 {% else %}
138 <a class="lead" href="#"></a> 139 <a class="lead" href="#"></a>
139 {% endif %} 140 {% endif %}
diff --git a/bitbake/lib/toaster/toastergui/templates/builds.html b/bitbake/lib/toaster/toastergui/templates/builds.html
index 2b35b010ed..6fbaf98ae0 100644
--- a/bitbake/lib/toaster/toastergui/templates/builds.html
+++ b/bitbake/lib/toaster/toastergui/templates/builds.html
@@ -2,6 +2,7 @@
2 2
3{% load static %} 3{% load static %}
4{% load projecttags %} 4{% load projecttags %}
5{% load project_url_tag %}
5{% load humanize %} 6{% load humanize %}
6 7
7{% block extraheadcontent %} 8{% block extraheadcontent %}
@@ -104,7 +105,7 @@
104 {% endif %} 105 {% endif %}
105 </td> 106 </td>
106 <td> 107 <td>
107 <a href="{% url 'project' build.project.id %}">{{build.project.name}}</a> 108 <a href="{% project_url build.project %}">{{build.project.name}}</a>
108 </td> 109 </td>
109 </tr> 110 </tr>
110 111
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 5e96b39121..b29f650f5d 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -1,8 +1,8 @@
1{% load static %} 1{% load static %}
2{% load projecttags %} 2{% load projecttags %}
3{% load project_url_tag %}
3{% load humanize %} 4{% load humanize %}
4 5
5
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' %}
@@ -22,7 +22,7 @@
22 {% if mrb_type != 'project' %} 22 {% if mrb_type != 'project' %}
23 project-name"> 23 project-name">
24 <span class="label {%if build.outcome == build.SUCCEEDED%}label-success{%elif build.outcome == build.FAILED%}label-important{%else%}label-info{%endif%}"> 24 <span class="label {%if build.outcome == build.SUCCEEDED%}label-success{%elif build.outcome == build.FAILED%}label-important{%else%}label-info{%endif%}">
25 <a href={% url 'project' build.project.pk %}> 25 <a href={% project_url build.project %}>
26 {{build.project.name}} 26 {{build.project.name}}
27 </a> 27 </a>
28 </span> 28 </span>
@@ -106,7 +106,7 @@
106 pull-right" 106 pull-right"
107 onclick='scheduleBuild({% url 'projectbuilds' build.project.id as bpi %}{{bpi|json}}, 107 onclick='scheduleBuild({% url 'projectbuilds' build.project.id as bpi %}{{bpi|json}},
108 {{build.project.name|json}}, 108 {{build.project.name|json}},
109 {% url 'project' build.project.id as bpurl %}{{bpurl|json}}, 109 {% url 'project' build.project.id as purl %}{{purl|json}},
110 {{build.target_set.all|get_tasks|json}})'> 110 {{build.target_set.all|get_tasks|json}})'>
111 111
112 Run again 112 Run again
diff --git a/bitbake/lib/toaster/toastergui/templates/projects.html b/bitbake/lib/toaster/toastergui/templates/projects.html
index a7192c2d72..7c612e8c43 100644
--- a/bitbake/lib/toaster/toastergui/templates/projects.html
+++ b/bitbake/lib/toaster/toastergui/templates/projects.html
@@ -2,6 +2,7 @@
2 2
3{% load static %} 3{% load static %}
4{% load projecttags %} 4{% load projecttags %}
5{% load project_url_tag %}
5{% load humanize %} 6{% load humanize %}
6 7
7{% block pagecontent %} 8{% block pagecontent %}
@@ -37,8 +38,10 @@
37 {% include "basetable_top.html" %} 38 {% include "basetable_top.html" %}
38 {% for o in objects %} 39 {% for o in objects %}
39 <tr class="data" data-project="{{ o.id }}"> 40 <tr class="data" data-project="{{ o.id }}">
40 <td><a href="{% url 'project' o.id %}">{{o.name}}</a></td> 41 <td data-project-field="name">
41 <td class="updated"><a href="{% url 'project' o.id %}">{{o.updated|date:"d/m/y H:i"}}</a></td> 42 <a href="{% project_url o %}">{{o.name}}</a>
43 </td>
44 <td class="updated"><a href="{% project_url o %}">{{o.updated|date:"d/m/y H:i"}}</a></td>
42 <td data-project-field="release"> 45 <td data-project-field="release">
43 {% if o.release %} 46 {% if o.release %}
44 <a href="{% url 'project' o.id %}#project-details">{{o.release.name}}</a> 47 <a href="{% url 'project' o.id %}#project-details">{{o.release.name}}</a>
diff --git a/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py b/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py
new file mode 100644
index 0000000000..04770ac6a8
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py
@@ -0,0 +1,34 @@
1from django import template
2from django.core.urlresolvers import reverse
3
4register = template.Library()
5
6def project_url(parser, token):
7 """
8 Create a URL for a project's main page;
9 for non-default projects, this is the configuration page;
10 for the default project, this is the project builds page
11 """
12 try:
13 tag_name, project = token.split_contents()
14 except ValueError:
15 raise template.TemplateSyntaxError(
16 "%s tag requires exactly one argument" % tag_name
17 )
18 return ProjectUrlNode(project)
19
20class ProjectUrlNode(template.Node):
21 def __init__(self, project):
22 self.project = template.Variable(project)
23
24 def render(self, context):
25 try:
26 project = self.project.resolve(context)
27 if project.is_default:
28 return reverse('projectbuilds', args=(project.id,))
29 else:
30 return reverse('project', args=(project.id,))
31 except template.VariableDoesNotExist:
32 return ''
33
34register.tag('project_url', project_url)
diff --git a/bitbake/lib/toaster/toastergui/tests.py b/bitbake/lib/toaster/toastergui/tests.py
index c725fc827d..3753748b75 100644
--- a/bitbake/lib/toaster/toastergui/tests.py
+++ b/bitbake/lib/toaster/toastergui/tests.py
@@ -428,8 +428,8 @@ class LandingPageTests(TestCase):
428 self.assertTrue('/builds' in response.url, 428 self.assertTrue('/builds' in response.url,
429 'should redirect to builds') 429 'should redirect to builds')
430 430
431class ProjectsPageTests(TestCase): 431class AllProjectsPageTests(TestCase):
432 """ Tests for projects page """ 432 """ Tests for projects page /projects/ """
433 433
434 MACHINE_NAME = 'delorean' 434 MACHINE_NAME = 'delorean'
435 435
@@ -554,6 +554,38 @@ class ProjectsPageTests(TestCase):
554 self.assertEqual(text, self.MACHINE_NAME, 554 self.assertEqual(text, self.MACHINE_NAME,
555 'machine name should be shown for non-default project') 555 'machine name should be shown for non-default project')
556 556
557 def test_project_page_links(self):
558 """
559 Test that links for the default project point to the builds
560 page /projects/X/builds for that project, and that links for
561 other projects point to their configuration pages /projects/X/
562 """
563
564 # need a build, otherwise project doesn't display at all
565 self._add_build_to_default_project()
566
567 # another project to test, which should show machine
568 self._add_non_default_project()
569
570 response = self.client.get(reverse('all-projects'), follow=True)
571 soup = BeautifulSoup(response.content)
572
573 # link for default project
574 row = soup.find('tr', attrs={'data-project': self.default_project.id})
575 cell = row.find('td', attrs={'data-project-field': 'name'})
576 url = cell.find('a')['href']
577 expected_url = reverse('projectbuilds', args=(self.default_project.id,))
578 self.assertEqual(url, expected_url,
579 'link on default project name should point to builds')
580
581 # link for other project
582 row = soup.find('tr', attrs={'data-project': self.project.id})
583 cell = row.find('td', attrs={'data-project-field': 'name'})
584 url = cell.find('a')['href']
585 expected_url = reverse('project', args=(self.project.id,))
586 self.assertEqual(url, expected_url,
587 'link on project name should point to configuration')
588
557class ProjectBuildsPageTests(TestCase): 589class ProjectBuildsPageTests(TestCase):
558 """ Test data at /project/X/builds is displayed correctly """ 590 """ Test data at /project/X/builds is displayed correctly """
559 591
@@ -650,7 +682,7 @@ class ProjectBuildsPageTests(TestCase):
650 self.assertEqual(len(result), 2) 682 self.assertEqual(len(result), 2)
651 683
652class AllBuildsPageTests(TestCase): 684class AllBuildsPageTests(TestCase):
653 """ Tests for all builds page """ 685 """ Tests for all builds page /builds/ """
654 686
655 def setUp(self): 687 def setUp(self):
656 bbv = BitbakeVersion.objects.create(name="bbv1", giturl="/tmp/", 688 bbv = BitbakeVersion.objects.create(name="bbv1", giturl="/tmp/",