diff options
author | Michael Wood <michael.g.wood@intel.com> | 2015-01-30 18:21:05 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-02-10 23:07:49 +0000 |
commit | 8c25c3491b851e5cfed66b7ec458ef369f531065 (patch) | |
tree | bcc5db4ee649ee6812958c5a7e320621418adcc9 | |
parent | 6969a3d3ea1a428ae151669317e49b32ac198062 (diff) | |
download | poky-8c25c3491b851e5cfed66b7ec458ef369f531065.tar.gz |
bitbake: toaster: Add add/select functionality to machines page
This feature for the machines page allows the user to add a layer and
it's dependencies to the current project and then if successful select
the machine(s) which become available due to being provided by the
layer.
AlexD merged the changes into the submission queue.
(Bitbake rev: ca4e4ab09ba214363181eeb8ad54ccc716bd65f3)
Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | bitbake/lib/toaster/toastergui/static/js/machines.js | 89 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/machines.html | 99 | ||||
-rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 12 |
3 files changed, 146 insertions, 54 deletions
diff --git a/bitbake/lib/toaster/toastergui/static/js/machines.js b/bitbake/lib/toaster/toastergui/static/js/machines.js new file mode 100644 index 0000000000..a3ea43baed --- /dev/null +++ b/bitbake/lib/toaster/toastergui/static/js/machines.js | |||
@@ -0,0 +1,89 @@ | |||
1 | "use strict" | ||
2 | |||
3 | function machinesPageInit (ctx) { | ||
4 | |||
5 | |||
6 | function setLayerInCurrentPrj(addLayerBtn, depsList){ | ||
7 | var alertMsg = $("#alert-msg"); | ||
8 | |||
9 | $(".select-or-add").each(function(){ | ||
10 | /* If we have added a layer it may also enable other machines so search | ||
11 | * for other machines that have that layer and enable them */ | ||
12 | var selectMachineBtn = $(this).children(".select-machine-btn"); | ||
13 | var otherAddLayerBtns = $(this).children(".add-layer"); | ||
14 | |||
15 | if (addLayerBtn.data('layer-version-id') == selectMachineBtn.data('layer-version-id')) { | ||
16 | otherAddLayerBtns.fadeOut(function(){ | ||
17 | selectMachineBtn.fadeIn(); | ||
18 | }); | ||
19 | } | ||
20 | }); | ||
21 | |||
22 | /* Reset alert message */ | ||
23 | alertMsg.text(""); | ||
24 | |||
25 | /* If we have added layer dependencies */ | ||
26 | if (depsList) { | ||
27 | alertMsg.append("You have added <strong>"+(depsList.length+1)+"</strong> layers: <span id=\"layer-affected-name\"></span> and its dependencies "); | ||
28 | |||
29 | /* Build the layer deps list */ | ||
30 | depsList.map(function(layer, i){ | ||
31 | var link = $("<a></a>"); | ||
32 | |||
33 | link.attr("href", layer.layerdetailurl); | ||
34 | link.text(layer.name); | ||
35 | link.tooltip({title: layer.tooltip}); | ||
36 | |||
37 | if (i != 0) | ||
38 | alertMsg.append(", "); | ||
39 | |||
40 | alertMsg.append(link); | ||
41 | }); | ||
42 | } else { | ||
43 | alertMsg.append("You have added <strong>1</strong> layer: <span id=\"layer-affected-name\"></span>"); | ||
44 | } | ||
45 | |||
46 | var layerName = addLayerBtn.data('layer-name'); | ||
47 | alertMsg.children("#layer-affected-name").text(layerName); | ||
48 | $("#alert-area").show(); | ||
49 | } | ||
50 | |||
51 | /* Add or remove this layer from the project */ | ||
52 | $(".add-layer").click(function() { | ||
53 | var btn = $(this); | ||
54 | /* If adding get the deps for this layer */ | ||
55 | var layer = { | ||
56 | id : $(this).data('layer-version-id'), | ||
57 | name : $(this).data('layer-name'), | ||
58 | }; | ||
59 | |||
60 | libtoaster.getLayerDepsForProject(ctx.xhrDataTypeaheadUrl, ctx.projectId, layer.id, function (data) { | ||
61 | /* got result for dependencies */ | ||
62 | if (data.list.length == 0){ | ||
63 | var editData = { layerAdd : layer.id }; | ||
64 | libtoaster.editProject(ctx.xhrEditProjectUrl, ctx.projectId, editData, | ||
65 | function() { | ||
66 | setLayerInCurrentPrj(btn); | ||
67 | }); | ||
68 | return; | ||
69 | } else { | ||
70 | /* The add deps will include this layer so no need to add it | ||
71 | * separately. | ||
72 | */ | ||
73 | show_layer_deps_modal(ctx.projectId, layer, data.list, null, null, true, function () { | ||
74 | /* Success add deps and layer */ | ||
75 | setLayerInCurrentPrj(btn, data.list); | ||
76 | console.log ("TODO SUCCESS"); | ||
77 | }); | ||
78 | } | ||
79 | }, null); | ||
80 | }); | ||
81 | |||
82 | $(".select-machine-btn").click(function(){ | ||
83 | var data = { machineName : $(this).data('machine-name') }; | ||
84 | libtoaster.editProject(ctx.xhrEditProjectUrl, ctx.projectId, data, | ||
85 | function (){ | ||
86 | window.location.replace(ctx.projectPageUrl); | ||
87 | }, null); | ||
88 | }); | ||
89 | } | ||
diff --git a/bitbake/lib/toaster/toastergui/templates/machines.html b/bitbake/lib/toaster/toastergui/templates/machines.html index e0bda51cf5..c0d4c6cc33 100644 --- a/bitbake/lib/toaster/toastergui/templates/machines.html +++ b/bitbake/lib/toaster/toastergui/templates/machines.html | |||
@@ -1,62 +1,65 @@ | |||
1 | {% extends "baseprojectpage.html" %} | 1 | {% extends "baseprojectpage.html" %} |
2 | {% load projecttags %} | 2 | {% load projecttags %} |
3 | {% load humanize %} | 3 | {% load humanize %} |
4 | 4 | {% load static %} | |
5 | {% block localbreadcrumb %} | 5 | {% block localbreadcrumb %} |
6 | <li>All compatible machines</li> | 6 | <li>All compatible machines</li> |
7 | {% endblock %} | 7 | {% endblock %} |
8 | 8 | ||
9 | {% block projectinfomain %} | 9 | {% block projectinfomain %} |
10 | <div class="page-header"> | 10 | <script src="{% static 'js/machines.js' %}"></script> |
11 | <h1> | 11 | <script> |
12 | All compatible machines | 12 | |
13 | <i class="icon-question-sign get-help heading-help" title="This page lists all the machines compatible with the release selected for this project, which is {{project.release.description}}"></i> | 13 | $(document).ready(function (){ |
14 | </h1> | 14 | var ctx = { |
15 | </div> | 15 | projectPageUrl : "{% url 'project' project.id %}", |
16 | <!--div class="alert"> | 16 | xhrEditProjectUrl : "{% url 'xhr_projectedit' project.id %}", |
17 | <div class="input-append" style="margin-bottom:0px;"> | 17 | projectId : {{project.id}}, |
18 | <input class="input-xxlarge" type="text" placeholder="Search targets" value="browser" /> | 18 | xhrDataTypeaheadUrl : "{% url 'xhr_datatypeahead' %}", |
19 | <a class="add-on btn"> | 19 | }; |
20 | <i class="icon-remove"></i> | 20 | |
21 | </a> | 21 | try { |
22 | <button class="btn" type="button">Search</button> | 22 | machinesPageInit(ctx); |
23 | <a class="btn btn-link" href="#">Show all targets</a> | 23 | } catch (e) { |
24 | </div> | 24 | document.write("Sorry, An error has occurred loading this page"); |
25 | </div--> | 25 | console.warn(e); |
26 | <div id="target-added" class="alert alert-info lead" style="display:none;"></div> | 26 | } |
27 | <div id="target-removed" class="alert alert-info lead" style="display:none;"> | 27 | }); |
28 | <button type="button" class="close" data-dismiss="alert">×</button> | 28 | </script> |
29 | <strong>1</strong> target deleted from <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a> | 29 | {% include "layers_dep_modal.html" %} |
30 | </div> | 30 | <div class="page-header"> |
31 | <h1> | ||
32 | All machines | ||
33 | <i class="icon-question-sign get-help heading-help" title="This page lists all the machines compatible with Yocto Project 1.7 'Dxxxx' that Toaster knows about. They include community-created targets suitable for use on top of OpenEmbedded Core and any targets you have imported"></i> | ||
34 | </h1> | ||
35 | </div> | ||
31 | 36 | ||
37 | <div class="alert alert-info lead" id="alert-area" style="display:none"> | ||
38 | <button type="button" class="close" id="dismiss-alert" data-dismiss="alert">×</button> | ||
39 | <span id="alert-msg"></span> | ||
40 | <p style="margin-top:10px;"><a href="{% url 'project' project.id %}">Go to project configuration</a></p> | ||
41 | </div> | ||
32 | 42 | ||
33 | {% include "basetable_top.html" %} | 43 | {% include "basetable_top.html" %} |
34 | {% for o in objects %} | 44 | {% for o in objects %} |
35 | <tr class="data"> | 45 | <tr class="data"> |
36 | <td class="machine"> | 46 | <td class="machine">{{o.name}}</td> |
37 | {{o.name}} | 47 | <td class="description">{{o.description}}</td> |
38 | <a machine="_blank" href="http://layers.openembedded.org/layerindex/branch/master/machines/?q=3g-router-image"><i class="icon-share get-info"></i></a> | 48 | <td class="layer"><a href="{%url "layerdetails" o.layer_version.id %}">{{o.layer_version.layer.name}}</a></td> |
39 | </td> | 49 | <td class="source">{{o.layer_source.name}}</td> |
40 | <td class="description">{{o.description}}</td> | 50 | <td class="branch">{{o.layer_version.commit}}</td> |
41 | <td class="machine-file"> | 51 | <td class="select-or-add"> |
42 | <code>{{o.file_path}}</code> | 52 | <a href="#" class="btn btn-block select-machine-btn" data-machine-name="{{o.name}}" data-layer-version-id="{{o.layer_version.id}}" |
43 | <a href="http://github.com/embeddedgeeks/meta-embeddedgeeks/blob/master/machines-core/images/3g-router-image.bb" machine="_blank"><i class="icon-share get-info"></i></a> | 53 | {%if o.layer_version.id not in project_layers %}style="display:none" {%endif%} >Select machine</a> |
44 | </td> | 54 | <a href="#" class="btn btn-block nopop add-layer" data-layer-version-id="{{o.layer_version.id}}" data-layer-name="{{o.layer_version.layer.name}}" {%if o.layer_version.id in project_layers %}style="display:none" {%endif%} |
45 | <td class="layer"><a href="#">{{o.layer_version.layer.name}}</a></td> | 55 | > |
46 | <td class="source">{{o.layer_source.name}}</td> | 56 | <i class="icon-plus"></i> |
47 | <td class="branch">{{o.layer_version.commit}}</td> | 57 | Add layer |
48 | <td class="build"> | 58 | <i class="icon-question-sign get-help" title="To build this machine, you must first add the {{o.layer_version.layer.name}} layer to your project"></i> |
49 | <a id="build-machine" href="project-with-machines.html?machine=3g-router-image" class="btn btn-block" style="display:none;"> | 59 | </a> |
50 | Build machine | 60 | </td> |
51 | </a> | 61 | </tr> |
52 | <a id="add-layer" href="#" class="btn btn-block nopop" title="1 layer added"> | 62 | {% endfor %} |
53 | <i class="icon-plus"></i> | ||
54 | Add layer | ||
55 | <i class="icon-question-sign get-help" title="To build this machine, you must first add the meta-embeddedgeeks layer to your project"></i> | ||
56 | </a> | ||
57 | </td> | ||
58 | </tr> | ||
59 | {% endfor %} | ||
60 | 63 | ||
61 | {% include "basetable_bottom.html" %} | 64 | {% include "basetable_bottom.html" %} |
62 | 65 | ||
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 73a5c7e99f..641170e639 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
@@ -2770,6 +2770,9 @@ if toastermain.settings.MANAGED: | |||
2770 | return response | 2770 | return response |
2771 | 2771 | ||
2772 | def machines(request): | 2772 | def machines(request): |
2773 | if not 'project_id' in request.session: | ||
2774 | raise Exception("invalid page: cannot show page without a project") | ||
2775 | |||
2773 | template = "machines.html" | 2776 | template = "machines.html" |
2774 | # define here what parameters the view needs in the GET portion in order to | 2777 | # define here what parameters the view needs in the GET portion in order to |
2775 | # be able to display something. 'count' and 'page' are mandatory for all views | 2778 | # be able to display something. 'count' and 'page' are mandatory for all views |
@@ -2785,18 +2788,19 @@ if toastermain.settings.MANAGED: | |||
2785 | (filter_string, search_term, ordering_string) = _search_tuple(request, Machine) | 2788 | (filter_string, search_term, ordering_string) = _search_tuple(request, Machine) |
2786 | 2789 | ||
2787 | queryset_all = Machine.objects.all() | 2790 | queryset_all = Machine.objects.all() |
2788 | # if 'project_id' in request.session: | ||
2789 | # queryset_all = queryset_all.filter(Q(layer_version__up_branch__name = Project.objects.get(request.session['project_id']).release.branch_name) | Q(layer_version__build__in = Project.objects.get(request.session['project_id']).build_set.all())) | ||
2790 | 2791 | ||
2791 | queryset_with_search = _get_queryset(Machine, queryset_all, None, search_term, ordering_string, '-name') | 2792 | queryset_with_search = _get_queryset(Machine, queryset_all, None, search_term, ordering_string, '-name') |
2792 | queryset = _get_queryset(Machine, queryset_all, filter_string, search_term, ordering_string, '-name') | 2793 | queryset = _get_queryset(Machine, queryset_all, filter_string, search_term, ordering_string, '-name') |
2793 | 2794 | ||
2795 | project_layers = ProjectLayer.objects.filter(project_id=request.session['project_id']).values_list('layercommit',flat=True) | ||
2796 | |||
2794 | # retrieve the objects that will be displayed in the table; machines a paginator and gets a page range to display | 2797 | # retrieve the objects that will be displayed in the table; machines a paginator and gets a page range to display |
2795 | machine_info = _build_page_range(Paginator(queryset, request.GET.get('count', 10)),request.GET.get('page', 1)) | 2798 | machine_info = _build_page_range(Paginator(queryset, request.GET.get('count', 10)),request.GET.get('page', 1)) |
2796 | 2799 | ||
2797 | 2800 | ||
2798 | context = { | 2801 | context = { |
2799 | 'objects' : machine_info, | 2802 | 'objects' : machine_info, |
2803 | 'project_layers' : project_layers, | ||
2800 | 'objectname' : "machines", | 2804 | 'objectname' : "machines", |
2801 | 'default_orderby' : 'name:+', | 2805 | 'default_orderby' : 'name:+', |
2802 | 'total_count': queryset_with_search.count(), | 2806 | 'total_count': queryset_with_search.count(), |
@@ -2810,10 +2814,6 @@ if toastermain.settings.MANAGED: | |||
2810 | 'dclass': 'span5', | 2814 | 'dclass': 'span5', |
2811 | 'clclass': 'description', | 2815 | 'clclass': 'description', |
2812 | }, | 2816 | }, |
2813 | { 'name': 'Machine file', | ||
2814 | 'clclass': 'machine-file', | ||
2815 | 'hidden': 1, | ||
2816 | }, | ||
2817 | { 'name': 'Layer', | 2817 | { 'name': 'Layer', |
2818 | 'clclass': 'layer', | 2818 | 'clclass': 'layer', |
2819 | }, | 2819 | }, |