diff options
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/toaster/orm/models.py | 8 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/static/img/toaster_1.7.png | bin | 0 -> 125151 bytes | |||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/landing.html | 55 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/machines.html | 29 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/managed_builds.html | 6 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/managed_mrb_section.html | 5 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/project.html | 14 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/projectbuilds.html | 13 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/projectconf.html | 2 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/targets.html | 12 | ||||
-rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 20 |
11 files changed, 135 insertions, 29 deletions
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py index 4bb84bd5ef..f70c0066ad 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py | |||
@@ -67,10 +67,14 @@ class ProjectManager(models.Manager): | |||
67 | 67 | ||
68 | 68 | ||
69 | for rdl in release.releasedefaultlayer_set.all(): | 69 | for rdl in release.releasedefaultlayer_set.all(): |
70 | lv = Layer_Version.objects.filter(layer__name = rdl.layer_name, up_branch__name = release.branch_name)[0].get_equivalents_wpriority(prj)[0] | 70 | try: |
71 | ProjectLayer.objects.create( project = prj, | 71 | lv =Layer_Version.objects.filter(layer__name = rdl.layer_name, up_branch__name = release.branch_name)[0].get_equivalents_wpriority(prj)[0] |
72 | ProjectLayer.objects.create( project = prj, | ||
72 | layercommit = lv, | 73 | layercommit = lv, |
73 | optional = False ) | 74 | optional = False ) |
75 | except IndexError: | ||
76 | # we may have no valid layer version objects, and that's ok | ||
77 | pass | ||
74 | 78 | ||
75 | return prj | 79 | return prj |
76 | 80 | ||
diff --git a/bitbake/lib/toaster/toastergui/static/img/toaster_1.7.png b/bitbake/lib/toaster/toastergui/static/img/toaster_1.7.png new file mode 100644 index 0000000000..7c303fd15e --- /dev/null +++ b/bitbake/lib/toaster/toastergui/static/img/toaster_1.7.png | |||
Binary files differ | |||
diff --git a/bitbake/lib/toaster/toastergui/templates/landing.html b/bitbake/lib/toaster/toastergui/templates/landing.html index 071edf86ef..d5ae9f5e20 100644 --- a/bitbake/lib/toaster/toastergui/templates/landing.html +++ b/bitbake/lib/toaster/toastergui/templates/landing.html | |||
@@ -9,10 +9,12 @@ | |||
9 | <div class="container-fluid"> | 9 | <div class="container-fluid"> |
10 | <div class="row-fluid"> | 10 | <div class="row-fluid"> |
11 | <!-- Empty - no data in database --> | 11 | <!-- Empty - no data in database --> |
12 | <div class="hero-unit span12"> | 12 | <div class="hero-unit span12" {%if MANAGED%}style="background-color: white"{%endif%}> |
13 | {% if not MANAGED %} | ||
13 | <button class="close" data-dismiss="alert" type="button"> | 14 | <button class="close" data-dismiss="alert" type="button"> |
14 | × | 15 | × |
15 | </button> | 16 | </button> |
17 | {% endif %} | ||
16 | <div class="row-fluid"> | 18 | <div class="row-fluid"> |
17 | <div class="span6"> | 19 | <div class="span6"> |
18 | <h1> | 20 | <h1> |
@@ -29,22 +31,63 @@ | |||
29 | </a> | 31 | </a> |
30 | build system. | 32 | build system. |
31 | </p> | 33 | </p> |
34 | |||
35 | {% if MANAGED %} | ||
36 | |||
37 | {% if lvs_nos %} | ||
38 | <p class="hero-actions"> | ||
39 | <a class="btn btn-primary btn-large" href="{% url 'newproject' %}"> | ||
40 | To start building, create your first Toaster project | ||
41 | </a> | ||
42 | </p> | ||
43 | {% else %} | ||
44 | <div class="alert alert-info"> | ||
45 | <p> | ||
46 | Toaster has no layer information; without layer information, you cannot run builds. To generate layer information you can: | ||
47 | </p> | ||
48 | <ul> | ||
49 | <li> <a href="https://wiki.yoctoproject.org/wiki/Setting_up_a_hosted_managed_mode_for_Toaster#LayerSources">Configure a layer source</a> | ||
50 | </li> | ||
51 | <li> <a href="{% url 'newproject' %}">Create a project</a>, then import layers | ||
52 | </ul> | ||
53 | </div> | ||
54 | {% endif %} | ||
55 | |||
56 | <p style="margin-top: 2em"> | ||
57 | <a href="https://www.yoctoproject.org/documentation/toaster-manual"> | ||
58 | Read the Toaster manual | ||
59 | </a> <br/> | ||
60 | <a href="https://wiki.yoctoproject.org/wiki/Contribute_to_Toaster"> | ||
61 | Contribute to Toaster | ||
62 | </a> | ||
63 | </p> | ||
64 | |||
65 | {% else %} | ||
66 | |||
32 | <p class="hero-actions"> | 67 | <p class="hero-actions"> |
33 | <a class="btn btn-primary btn-large" href="https://www.yoctoproject.org/documentation/toaster-manual"> | 68 | <a class="btn btn-primary btn-large" href="https://www.yoctoproject.org/documentation/toaster-manual"> |
34 | Show me the manual | 69 | Show me the manual |
35 | </a> | 70 | </a> |
36 | <a class="btn btn-large" href="https://wiki.yoctoproject.org/wiki/Contribute_to_Toaster"> | 71 | <a class="btn btn-large" href="https://wiki.yoctoproject.org/wiki/Contribute_to_Toaster"> |
37 | I want to contribute | 72 | I want to contribute |
38 | </a> | 73 | </a> |
39 | </p> | 74 | </p> |
75 | |||
76 | {% endif %} | ||
40 | </div> | 77 | </div> |
41 | <div class="span5"> | 78 | <div class="span5"> |
42 | <a href="http://www.yoctoproject.org"> | 79 | <a href="http://www.yoctoproject.org"> |
43 | <img alt="Yocto Project" class="thumbnail" src="/static/img/toaster.png"/> | 80 | {% if MANAGED %} |
81 | <img alt="Yocto Project" class="thumbnail" src="{% static 'img/toaster_1.7.png' %}"/> | ||
82 | {% else %} | ||
83 | <img alt="Yocto Project" class="thumbnail" src="{% static 'img/toaster.png' %}"/> | ||
84 | {% endif %} | ||
44 | </a> | 85 | </a> |
45 | </div> | 86 | </div> |
46 | </div> | 87 | </div> |
47 | </div> | 88 | </div> |
89 | |||
90 | {% if not MANAGED %} | ||
48 | <!-- Empty - no data in database --> | 91 | <!-- Empty - no data in database --> |
49 | <div class="page-header top-air"> | 92 | <div class="page-header top-air"> |
50 | <h1> | 93 | <h1> |
@@ -61,6 +104,8 @@ | |||
61 | Hob | 104 | Hob |
62 | </a> | 105 | </a> |
63 | </div> | 106 | </div> |
107 | {% endif %} | ||
108 | |||
64 | </div> | 109 | </div> |
65 | 110 | ||
66 | {% endblock %} | 111 | {% endblock %} |
diff --git a/bitbake/lib/toaster/toastergui/templates/machines.html b/bitbake/lib/toaster/toastergui/templates/machines.html index 9b2a540f31..1057bdda3f 100644 --- a/bitbake/lib/toaster/toastergui/templates/machines.html +++ b/bitbake/lib/toaster/toastergui/templates/machines.html | |||
@@ -47,16 +47,25 @@ | |||
47 | <button type="button" class="close" id="dismiss-alert">×</button> | 47 | <button type="button" class="close" id="dismiss-alert">×</button> |
48 | <span id="alert-msg"></span> | 48 | <span id="alert-msg"></span> |
49 | </div> | 49 | </div> |
50 | {% if request.GET.search and objects.paginator.count == 0 %} | 50 | {% if objects.paginator.count == 0 %} |
51 | <div class="alert row-fluid"> | 51 | {% if request.GET.search %} |
52 | <form class="navbar-search input-append pull-left" id="searchform"> | 52 | <div class="alert row-fluid"> |
53 | <input class="input-xxlarge" id="search" name="search" type="text" placeholder="Search machines" value="{{request.GET.search}}"><a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a> | 53 | <form class="navbar-search input-append pull-left" id="searchform"> |
54 | <input type="hidden" name="orderby" value=""> | 54 | <input class="input-xxlarge" id="search" name="search" type="text" placeholder="Search machines" value="{{request.GET.search}}"><a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a> |
55 | <input type="hidden" name="page" value="1"> | 55 | <input type="hidden" name="orderby" value=""> |
56 | <button class="btn" type="submit" value="Search">Search</button> | 56 | <input type="hidden" name="page" value="1"> |
57 | <button type="submit" class="btn btn-link" id="show-all-btn">Show all machines</button> | 57 | <button class="btn" type="submit" value="Search">Search</button> |
58 | </form> | 58 | <button type="submit" class="btn btn-link" id="show-all-btn">Show all machines</button> |
59 | </div> | 59 | </form> |
60 | </div> | ||
61 | {% else %} | ||
62 | <div class="alert alert-info"> | ||
63 | <p class="lead"> | ||
64 | Toaster has no machine information. To fetch machine information you should <a href="https://wiki.yoctoproject.org/wiki/Setting_up_a_hosted_managed_mode_for_Toaster#LayerSources">configure a layer source</a> | ||
65 | </p> | ||
66 | </div> | ||
67 | {% endif %} | ||
68 | |||
60 | {% else %} | 69 | {% else %} |
61 | {% include "basetable_top.html" %} | 70 | {% include "basetable_top.html" %} |
62 | {% for o in objects %} | 71 | {% for o in objects %} |
diff --git a/bitbake/lib/toaster/toastergui/templates/managed_builds.html b/bitbake/lib/toaster/toastergui/templates/managed_builds.html index 183be760ae..121ad07898 100644 --- a/bitbake/lib/toaster/toastergui/templates/managed_builds.html +++ b/bitbake/lib/toaster/toastergui/templates/managed_builds.html | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | {% if objects.paginator.count == 0 %} | 26 | {% if objects.paginator.count == 0 %} |
27 | <div class="row-fluid"> | 27 | <div class="row-fluid"> |
28 | {% if request.GET.filter or request.GET.search %} | ||
28 | <div class="alert"> | 29 | <div class="alert"> |
29 | <form class="no-results input-append" id="searchform"> | 30 | <form class="no-results input-append" id="searchform"> |
30 | <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %} | 31 | <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %} |
@@ -32,6 +33,11 @@ | |||
32 | <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button> | 33 | <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button> |
33 | </form> | 34 | </form> |
34 | </div> | 35 | </div> |
36 | {% else %} | ||
37 | <div class="alert alert-info"> | ||
38 | <p class="lead">Toaster has not recorded any builds yet. To run a build, <a href="{% url 'all-projects' %}">select the project</a> for which you want to build. | ||
39 | </div> | ||
40 | {% endif %} | ||
35 | </div> | 41 | </div> |
36 | 42 | ||
37 | 43 | ||
diff --git a/bitbake/lib/toaster/toastergui/templates/managed_mrb_section.html b/bitbake/lib/toaster/toastergui/templates/managed_mrb_section.html index c7ae6fd142..6f31ee0239 100644 --- a/bitbake/lib/toaster/toastergui/templates/managed_mrb_section.html +++ b/bitbake/lib/toaster/toastergui/templates/managed_mrb_section.html | |||
@@ -3,12 +3,11 @@ | |||
3 | {% load humanize %} | 3 | {% load humanize %} |
4 | 4 | ||
5 | 5 | ||
6 | {%if mru.count > 0%} | 6 | {%if len.mru > 0%} |
7 | |||
8 | <div class="page-header top-air"> | 7 | <div class="page-header top-air"> |
9 | <h1> | 8 | <h1> |
10 | Latest builds | 9 | Latest builds |
11 | </h1> | 10 | </h1> |
12 | </div> | 11 | </div> |
13 | <div id="latest-builds"> | 12 | <div id="latest-builds"> |
14 | {% for buildrequest in mru %}{% with build=buildrequest.build %} | 13 | {% for buildrequest in mru %}{% with build=buildrequest.build %} |
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html index 2c9cd8153c..7da2361460 100644 --- a/bitbake/lib/toaster/toastergui/templates/project.html +++ b/bitbake/lib/toaster/toastergui/templates/project.html | |||
@@ -16,6 +16,19 @@ vim: expandtab tabstop=2 | |||
16 | <script src="{% static "js/ui-bootstrap-tpls-0.11.0.js" %}"></script> | 16 | <script src="{% static "js/ui-bootstrap-tpls-0.11.0.js" %}"></script> |
17 | 17 | ||
18 | 18 | ||
19 | {% if lvs_nos == 0 %} | ||
20 | <div class="alert alert-info"> | ||
21 | <p> | ||
22 | Toaster has no layer information; without layer information, you cannot run builds.<br/> To generate layer information you can: | ||
23 | </p> | ||
24 | <ul> | ||
25 | <li> <a href="https://wiki.yoctoproject.org/wiki/Setting_up_a_hosted_managed_mode_for_Toaster#LayerSources">Configure a layer source</a> | ||
26 | </li> | ||
27 | <li> <a href="{% url 'importlayer' %}">Import a layer</a> | ||
28 | </ul> | ||
29 | </div> | ||
30 | |||
31 | {%else%} | ||
19 | <div id="main" role="main" ng-app="project" ng-controller="prjCtrl" class="top-padded"> | 32 | <div id="main" role="main" ng-app="project" ng-controller="prjCtrl" class="top-padded"> |
20 | 33 | ||
21 | 34 | ||
@@ -440,4 +453,5 @@ angular.element(document).ready(function() { | |||
440 | }); | 453 | }); |
441 | </script> | 454 | </script> |
442 | 455 | ||
456 | {% endif %} {# from lvs_nos check #} | ||
443 | {% endblock %} | 457 | {% endblock %} |
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html index 2a8bd58f34..02d166341f 100644 --- a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html +++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html | |||
@@ -9,8 +9,8 @@ | |||
9 | {% block projectinfomain %} | 9 | {% block projectinfomain %} |
10 | <div class="page-header"> | 10 | <div class="page-header"> |
11 | <h1> | 11 | <h1> |
12 | {% if objects.paginator.count == 0 %} | 12 | {% if objects.paginator.count == 0 and request.GET.filter or request.GET.search %} |
13 | No builds found | 13 | No builds found |
14 | 14 | ||
15 | {% else %} | 15 | {% else %} |
16 | {% if request.GET.filter or request.GET.search %} | 16 | {% if request.GET.filter or request.GET.search %} |
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | 26 | ||
27 | {% if objects.paginator.count == 0 %} | 27 | {% if objects.paginator.count == 0 %} |
28 | {% if request.GET.filter or request.GET.search %} | ||
28 | <div class="row-fluid"> | 29 | <div class="row-fluid"> |
29 | <div class="alert"> | 30 | <div class="alert"> |
30 | <form class="no-results input-append" id="searchform"> | 31 | <form class="no-results input-append" id="searchform"> |
@@ -34,7 +35,13 @@ | |||
34 | </form> | 35 | </form> |
35 | </div> | 36 | </div> |
36 | </div> | 37 | </div> |
37 | 38 | {% else %} | |
39 | <div class="alert alert-info"> | ||
40 | <p class="lead"> | ||
41 | This project has no builds. | ||
42 | </p> | ||
43 | </div> | ||
44 | {% endif %} | ||
38 | 45 | ||
39 | {% else %} | 46 | {% else %} |
40 | 47 | ||
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html index ec1fb9bd20..9cacce42d8 100644 --- a/bitbake/lib/toaster/toastergui/templates/projectconf.html +++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html | |||
@@ -52,7 +52,7 @@ | |||
52 | <i class="icon-question-sign get-help" title="Specifies additional packages to install into an image. If your build creates more than one image, the packages will be installed in <strong>all of them</strong> <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-IMAGE_INSTALL' target='_blank'>Read more in the manual</a>"></i> | 52 | <i class="icon-question-sign get-help" title="Specifies additional packages to install into an image. If your build creates more than one image, the packages will be installed in <strong>all of them</strong> <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-IMAGE_INSTALL' target='_blank'>Read more in the manual</a>"></i> |
53 | </dt> | 53 | </dt> |
54 | <dd class="lead"> | 54 | <dd class="lead"> |
55 | <span id="image_install">{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span> | 55 | <span id="image_install">{% if image_install_append %}{{image_install_append}}{%else%}<i>Not set</i>{%endif%}</span> |
56 | <i class="icon-pencil" id="change-image_install-icon"></i> | 56 | <i class="icon-pencil" id="change-image_install-icon"></i> |
57 | <i class="icon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i> | 57 | <i class="icon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i> |
58 | <form id="change-image_install-form" style="display:none;"> | 58 | <form id="change-image_install-form" style="display:none;"> |
diff --git a/bitbake/lib/toaster/toastergui/templates/targets.html b/bitbake/lib/toaster/toastergui/templates/targets.html index 6cd9391323..234159a687 100644 --- a/bitbake/lib/toaster/toastergui/templates/targets.html +++ b/bitbake/lib/toaster/toastergui/templates/targets.html | |||
@@ -25,6 +25,7 @@ | |||
25 | </div> | 25 | </div> |
26 | 26 | ||
27 | {% if objects.paginator.count == 0 %} | 27 | {% if objects.paginator.count == 0 %} |
28 | {% if request.GET.filter or request.GET.search %} | ||
28 | <div class="row-fluid"> | 29 | <div class="row-fluid"> |
29 | <div class="alert"> | 30 | <div class="alert"> |
30 | <form class="no-results input-append" id="searchform"> | 31 | <form class="no-results input-append" id="searchform"> |
@@ -34,6 +35,17 @@ | |||
34 | </form> | 35 | </form> |
35 | </div> | 36 | </div> |
36 | </div> | 37 | </div> |
38 | {% else %} | ||
39 | <div class="alert alert-info"> | ||
40 | <p class="lead"> | ||
41 | Toaster has not target information. To generate target information you can:<br/> | ||
42 | <ul class="lead"> | ||
43 | <li style="margin-top: 10px"> <a href="https://wiki.yoctoproject.org/wiki/Setting_up_a_hosted_managed_mode_for_Toaster#LayerSources">Configure a layer source</a></li> | ||
44 | <li style="margin-top: 10px"> <a href="{% url 'importlayer' %}">Import a layer</a></li> | ||
45 | </ul> | ||
46 | </p> | ||
47 | </div> | ||
48 | {% endif %} | ||
37 | 49 | ||
38 | {% else %} | 50 | {% else %} |
39 | 51 | ||
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 338b8c36f2..b5ff9b1d53 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
@@ -43,13 +43,22 @@ import json | |||
43 | # all new sessions should come through the landing page; | 43 | # all new sessions should come through the landing page; |
44 | # determine in which mode we are running in, and redirect appropriately | 44 | # determine in which mode we are running in, and redirect appropriately |
45 | def landing(request): | 45 | def landing(request): |
46 | if toastermain.settings.MANAGED and Build.objects.count() == 0 and Project.objects.count() > 0: | 46 | if toastermain.settings.MANAGED: |
47 | return redirect(reverse('all-projects'), permanent = False) | 47 | from bldcontrol.models import BuildRequest |
48 | if BuildRequest.objects.count() == 0 and Project.objects.count() > 0: | ||
49 | return redirect(reverse('all-projects'), permanent = False) | ||
48 | 50 | ||
49 | if Build.objects.all().count() > 0: | 51 | if BuildRequest.objects.all().count() > 0: |
50 | return redirect(reverse('all-builds'), permanent = False) | 52 | return redirect(reverse('all-builds'), permanent = False) |
53 | else: | ||
54 | if Build.objects.all().count() > 0: | ||
55 | return redirect(reverse('all-builds'), permanent = False) | ||
56 | |||
57 | context = {} | ||
58 | if toastermain.settings.MANAGED: | ||
59 | context['lvs_nos'] = Layer_Version.objects.all().count() | ||
51 | 60 | ||
52 | return render(request, 'landing.html') | 61 | return render(request, 'landing.html', context) |
53 | 62 | ||
54 | # returns a list for most recent builds; for use in the Project page, xhr_ updates, and other places, as needed | 63 | # returns a list for most recent builds; for use in the Project page, xhr_ updates, and other places, as needed |
55 | def _project_recent_build_list(prj): | 64 | def _project_recent_build_list(prj): |
@@ -2035,6 +2044,7 @@ if toastermain.settings.MANAGED: | |||
2035 | 2044 | ||
2036 | context = { | 2045 | context = { |
2037 | "project" : prj, | 2046 | "project" : prj, |
2047 | "lvs_nos" : Layer_Version.objects.all().count(), | ||
2038 | "completedbuilds": BuildRequest.objects.filter(project_id = pid).exclude(state__lte = BuildRequest.REQ_INPROGRESS).exclude(state=BuildRequest.REQ_DELETED), | 2048 | "completedbuilds": BuildRequest.objects.filter(project_id = pid).exclude(state__lte = BuildRequest.REQ_INPROGRESS).exclude(state=BuildRequest.REQ_DELETED), |
2039 | "prj" : {"name": prj.name, "release": { "id": prj.release.pk, "name": prj.release.name, "desc": prj.release.description}}, | 2049 | "prj" : {"name": prj.name, "release": { "id": prj.release.pk, "name": prj.release.name, "desc": prj.release.description}}, |
2040 | #"buildrequests" : prj.buildrequest_set.filter(state=BuildRequest.REQ_QUEUED), | 2050 | #"buildrequests" : prj.buildrequest_set.filter(state=BuildRequest.REQ_QUEUED), |