diff options
| -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 | }, |
