diff options
| -rw-r--r-- | bitbake/lib/toaster/toastergui/typeaheads.py | 145 | ||||
| -rw-r--r-- | bitbake/lib/toaster/toastergui/urls.py | 11 |
2 files changed, 156 insertions, 0 deletions
diff --git a/bitbake/lib/toaster/toastergui/typeaheads.py b/bitbake/lib/toaster/toastergui/typeaheads.py new file mode 100644 index 0000000000..d5bec58ea7 --- /dev/null +++ b/bitbake/lib/toaster/toastergui/typeaheads.py | |||
| @@ -0,0 +1,145 @@ | |||
| 1 | # | ||
| 2 | # BitBake Toaster Implementation | ||
| 3 | # | ||
| 4 | # Copyright (C) 2015 Intel Corporation | ||
| 5 | # | ||
| 6 | # This program is free software; you can redistribute it and/or modify | ||
| 7 | # it under the terms of the GNU General Public License version 2 as | ||
| 8 | # published by the Free Software Foundation. | ||
| 9 | # | ||
| 10 | # This program is distributed in the hope that it will be useful, | ||
| 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | # GNU General Public License for more details. | ||
| 14 | # | ||
| 15 | # You should have received a copy of the GNU General Public License along | ||
| 16 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
| 17 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
| 18 | |||
| 19 | from toastergui.widgets import ToasterTypeAhead | ||
| 20 | from orm.models import Project | ||
| 21 | from django.core.urlresolvers import reverse | ||
| 22 | |||
| 23 | class LayersTypeAhead(ToasterTypeAhead): | ||
| 24 | """ Typeahead for layers available and not added in the current project's | ||
| 25 | configuration """ | ||
| 26 | def __init__(self): | ||
| 27 | super(LayersTypeAhead, self).__init__() | ||
| 28 | |||
| 29 | def apply_search(self, search_term, prj, request): | ||
| 30 | layers = prj.compatible_layerversions() | ||
| 31 | layers = layers.order_by('layer__name') | ||
| 32 | |||
| 33 | # Unlike the other typeaheads we also don't want to show suggestions | ||
| 34 | # for layers already in the project unless required such as when adding | ||
| 35 | # layerdeps to a new layer. | ||
| 36 | if ("include_added" in request.GET and | ||
| 37 | request.GET['include_added'] != "true"): | ||
| 38 | layers = layers.exclude(pk__in=prj.projectlayer_equivalent_set) | ||
| 39 | |||
| 40 | primary_results = layers.filter(layer__name__istartswith=search_term) | ||
| 41 | secondary_results = layers.filter(layer__name__icontains=search_term).exclude(pk__in=primary_results) | ||
| 42 | |||
| 43 | results = [] | ||
| 44 | |||
| 45 | for layer_version in list(primary_results) + list(secondary_results): | ||
| 46 | vcs_reference = layer_version.get_vcs_reference() | ||
| 47 | |||
| 48 | detail = "[ %s | %s ]" % (layer_version.layer.vcs_url, | ||
| 49 | vcs_reference) | ||
| 50 | needed_fields = { | ||
| 51 | 'id' : layer_version.pk, | ||
| 52 | 'name' : layer_version.layer.name, | ||
| 53 | 'layerdetailurl' : layer_version.get_detailspage_url(prj.pk), | ||
| 54 | 'vcs_url' : layer_version.layer.vcs_url, | ||
| 55 | 'vcs_reference' : vcs_reference, | ||
| 56 | 'detail' : detail, | ||
| 57 | } | ||
| 58 | |||
| 59 | results.append(needed_fields) | ||
| 60 | |||
| 61 | return results | ||
| 62 | |||
| 63 | class MachinesTypeAhead(ToasterTypeAhead): | ||
| 64 | """ Typeahead for all the machines available in the current project's | ||
| 65 | configuration """ | ||
| 66 | def __init__(self): | ||
| 67 | super(MachinesTypeAhead, self).__init__() | ||
| 68 | |||
| 69 | def apply_search(self, search_term, prj, request): | ||
| 70 | machines = prj.get_available_machines() | ||
| 71 | machines = machines.order_by("name") | ||
| 72 | |||
| 73 | primary_results = machines.filter(name__istartswith=search_term) | ||
| 74 | secondary_results = machines.filter(name__icontains=search_term).exclude(pk__in=primary_results) | ||
| 75 | tertiary_results = machines.filter(layer_version__layer__name__icontains=search_term).exclude(pk__in=primary_results).exclude(pk__in=secondary_results) | ||
| 76 | |||
| 77 | results = [] | ||
| 78 | |||
| 79 | for machine in list(primary_results) + list(secondary_results) + list(tertiary_results): | ||
| 80 | |||
| 81 | detail = "[ %s ]" % (machine.layer_version.layer.name) | ||
| 82 | needed_fields = { | ||
| 83 | 'id' : machine.pk, | ||
| 84 | 'name' : machine.name, | ||
| 85 | 'detail' : detail, | ||
| 86 | } | ||
| 87 | |||
| 88 | results.append(needed_fields) | ||
| 89 | |||
| 90 | return results | ||
| 91 | |||
| 92 | class RecipesTypeAhead(ToasterTypeAhead): | ||
| 93 | """ Typeahead for all the recipes available in the current project's | ||
| 94 | configuration """ | ||
| 95 | def __init__(self): | ||
| 96 | super(RecipesTypeAhead, self).__init__() | ||
| 97 | |||
| 98 | def apply_search(self, search_term, prj, request): | ||
| 99 | recipes = prj.get_available_recipes() | ||
| 100 | recipes = recipes.order_by("name") | ||
| 101 | |||
| 102 | |||
| 103 | primary_results = recipes.filter(name__istartswith=search_term) | ||
| 104 | secondary_results = recipes.filter(name__icontains=search_term).exclude(pk__in=primary_results) | ||
| 105 | tertiary_results = recipes.filter(layer_version__layer__name__icontains=search_term).exclude(pk__in=primary_results).exclude(pk__in=secondary_results) | ||
| 106 | |||
| 107 | results = [] | ||
| 108 | |||
| 109 | for recipe in list(primary_results) + list(secondary_results) + list(tertiary_results): | ||
| 110 | |||
| 111 | detail = "[ %s ]" % (recipe.layer_version.layer.name) | ||
| 112 | needed_fields = { | ||
| 113 | 'id' : recipe.pk, | ||
| 114 | 'name' : recipe.name, | ||
| 115 | 'detail' : detail, | ||
| 116 | } | ||
| 117 | |||
| 118 | results.append(needed_fields) | ||
| 119 | |||
| 120 | return results | ||
| 121 | |||
| 122 | class ProjectsTypeAhead(ToasterTypeAhead): | ||
| 123 | """ Typeahead for all the projects """ | ||
| 124 | def __init__(self): | ||
| 125 | super(ProjectsTypeAhead, self).__init__() | ||
| 126 | |||
| 127 | def apply_search(self, search_term, prj, request): | ||
| 128 | projects = Project.objects.all().order_by("name") | ||
| 129 | |||
| 130 | primary_results = projects.filter(name__istartswith=search_term) | ||
| 131 | secondary_results = projects.filter(name__icontains=search_term).exclude(pk__in=primary_results) | ||
| 132 | |||
| 133 | results = [] | ||
| 134 | |||
| 135 | for project in list(primary_results) + list(secondary_results): | ||
| 136 | needed_fields = { | ||
| 137 | 'id' : project.pk, | ||
| 138 | 'name' : project.name, | ||
| 139 | 'detail' : "", | ||
| 140 | 'projectPageUrl' : reverse('project', args=(project.pk,)) | ||
| 141 | } | ||
| 142 | |||
| 143 | results.append(needed_fields) | ||
| 144 | |||
| 145 | return results | ||
diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py index beb43038a1..b44c42f2e3 100644 --- a/bitbake/lib/toaster/toastergui/urls.py +++ b/bitbake/lib/toaster/toastergui/urls.py | |||
| @@ -21,6 +21,7 @@ from django.views.generic import RedirectView, TemplateView | |||
| 21 | 21 | ||
| 22 | from django.http import HttpResponseBadRequest | 22 | from django.http import HttpResponseBadRequest |
| 23 | from toastergui import tables | 23 | from toastergui import tables |
| 24 | from toastergui import typeaheads | ||
| 24 | 25 | ||
| 25 | urlpatterns = patterns('toastergui.views', | 26 | urlpatterns = patterns('toastergui.views', |
| 26 | # landing page | 27 | # landing page |
| @@ -127,6 +128,16 @@ urlpatterns = patterns('toastergui.views', | |||
| 127 | 128 | ||
| 128 | url(r'^xhr_datatypeahead/(?P<pid>\d+)$', 'xhr_datatypeahead', name='xhr_datatypeahead'), | 129 | url(r'^xhr_datatypeahead/(?P<pid>\d+)$', 'xhr_datatypeahead', name='xhr_datatypeahead'), |
| 129 | url(r'^xhr_configvaredit/(?P<pid>\d+)$', 'xhr_configvaredit', name='xhr_configvaredit'), | 130 | url(r'^xhr_configvaredit/(?P<pid>\d+)$', 'xhr_configvaredit', name='xhr_configvaredit'), |
| 131 | # typeahead api end points | ||
| 132 | url(r'^xhr_typeahead/(?P<pid>\d+)/layers$', | ||
| 133 | typeaheads.LayersTypeAhead.as_view(), name='xhr_layerstypeahead'), | ||
| 134 | url(r'^xhr_typeahead/(?P<pid>\d+)/machines$', | ||
| 135 | typeaheads.MachinesTypeAhead.as_view(), name='xhr_machinestypeahead'), | ||
| 136 | url(r'^xhr_typeahead/(?P<pid>\d+)/recipes$', | ||
| 137 | typeaheads.RecipesTypeAhead.as_view(), name='xhr_recipestypeahead'), | ||
| 138 | url(r'^xhr_typeahead/projects$', | ||
| 139 | typeaheads.ProjectsTypeAhead.as_view(), name='xhr_projectstypeahead'), | ||
| 140 | |||
| 130 | 141 | ||
| 131 | url(r'^xhr_importlayer/$', 'xhr_importlayer', name='xhr_importlayer'), | 142 | url(r'^xhr_importlayer/$', 'xhr_importlayer', name='xhr_importlayer'), |
| 132 | url(r'^xhr_updatelayer/$', 'xhr_updatelayer', name='xhr_updatelayer'), | 143 | url(r'^xhr_updatelayer/$', 'xhr_updatelayer', name='xhr_updatelayer'), |
