summaryrefslogtreecommitdiffstats
path: root/poky/bitbake/lib/toaster/toastergui/typeaheads.py
diff options
context:
space:
mode:
Diffstat (limited to 'poky/bitbake/lib/toaster/toastergui/typeaheads.py')
-rw-r--r--poky/bitbake/lib/toaster/toastergui/typeaheads.py211
1 files changed, 211 insertions, 0 deletions
diff --git a/poky/bitbake/lib/toaster/toastergui/typeaheads.py b/poky/bitbake/lib/toaster/toastergui/typeaheads.py
new file mode 100644
index 000000000..5aa0f8d88
--- /dev/null
+++ b/poky/bitbake/lib/toaster/toastergui/typeaheads.py
@@ -0,0 +1,211 @@
+#
+# BitBake Toaster Implementation
+#
+# Copyright (C) 2015 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import subprocess
+
+from toastergui.widgets import ToasterTypeAhead
+from orm.models import Project
+from django.core.urlresolvers import reverse
+from django.core.cache import cache
+
+
+class LayersTypeAhead(ToasterTypeAhead):
+ """ Typeahead for layers available and not added in the current project's
+ configuration """
+
+ def apply_search(self, search_term, prj, request):
+ layers = prj.get_all_compatible_layer_versions()
+ layers = layers.order_by('layer__name')
+
+ # Unlike the other typeaheads we also don't want to show suggestions
+ # for layers already in the project unless required such as when adding
+ # layerdeps to a new layer.
+ if "include_added" in request.GET and \
+ request.GET['include_added'] != "true":
+ layers = layers.exclude(
+ pk__in=prj.get_project_layer_versions(pk=True))
+
+ primary_results = layers.filter(layer__name__istartswith=search_term)
+ secondary_results = layers.filter(
+ layer__name__icontains=search_term).exclude(
+ pk__in=primary_results)
+
+ results = []
+
+ for layer_version in list(primary_results) + list(secondary_results):
+ vcs_reference = layer_version.get_vcs_reference()
+
+ detail = "[ %s | %s ]" % (layer_version.layer.vcs_url,
+ vcs_reference)
+ needed_fields = {
+ 'id': layer_version.pk,
+ 'name': layer_version.layer.name,
+ 'layerdetailurl': layer_version.get_detailspage_url(prj.pk),
+ 'xhrLayerUrl': reverse('xhr_layer',
+ args=(prj.pk, layer_version.pk)),
+ 'vcs_url': layer_version.layer.vcs_url,
+ 'vcs_reference': vcs_reference,
+ 'detail': detail,
+ 'local_source_dir': layer_version.layer.local_source_dir,
+ }
+
+ results.append(needed_fields)
+
+ return results
+
+
+class MachinesTypeAhead(ToasterTypeAhead):
+ """ Typeahead for all the machines available in the current project's
+ configuration """
+
+ def apply_search(self, search_term, prj, request):
+ machines = prj.get_available_machines()
+ machines = machines.order_by("name")
+
+ primary_results = machines.filter(name__istartswith=search_term)
+ secondary_results = machines.filter(
+ name__icontains=search_term).exclude(pk__in=primary_results)
+ tertiary_results = machines.filter(
+ layer_version__layer__name__icontains=search_term).exclude(
+ pk__in=primary_results).exclude(pk__in=secondary_results)
+
+ results = []
+
+ for machine in list(primary_results) + list(secondary_results) + \
+ list(tertiary_results):
+
+ detail = "[ %s ]" % (machine.layer_version.layer.name)
+ needed_fields = {
+ 'id': machine.pk,
+ 'name': machine.name,
+ 'detail': detail,
+ }
+
+ results.append(needed_fields)
+ return results
+
+
+class DistrosTypeAhead(ToasterTypeAhead):
+ """ Typeahead for all the distros available in the current project's
+ configuration """
+ def __init__(self):
+ super(DistrosTypeAhead, self).__init__()
+
+ def apply_search(self, search_term, prj, request):
+ distros = prj.get_available_distros()
+ distros = distros.order_by("name")
+
+ primary_results = distros.filter(name__istartswith=search_term)
+ secondary_results = distros.filter(name__icontains=search_term).exclude(pk__in=primary_results)
+ tertiary_results = distros.filter(layer_version__layer__name__icontains=search_term).exclude(pk__in=primary_results).exclude(pk__in=secondary_results)
+
+ results = []
+
+ for distro in list(primary_results) + list(secondary_results) + list(tertiary_results):
+
+ detail = "[ %s ]" % (distro.layer_version.layer.name)
+ needed_fields = {
+ 'id' : distro.pk,
+ 'name' : distro.name,
+ 'detail' : detail,
+ }
+
+ results.append(needed_fields)
+
+ return results
+
+
+class RecipesTypeAhead(ToasterTypeAhead):
+ """ Typeahead for all the recipes available in the current project's
+ configuration """
+ def apply_search(self, search_term, prj, request):
+ recipes = prj.get_available_recipes()
+ recipes = recipes.order_by("name")
+
+ primary_results = recipes.filter(name__istartswith=search_term)
+ secondary_results = recipes.filter(
+ name__icontains=search_term).exclude(pk__in=primary_results)
+ tertiary_results = recipes.filter(
+ layer_version__layer__name__icontains=search_term).exclude(
+ pk__in=primary_results).exclude(pk__in=secondary_results)
+
+ results = []
+
+ for recipe in list(primary_results) + list(secondary_results) + \
+ list(tertiary_results):
+
+ detail = "[ %s ]" % (recipe.layer_version.layer.name)
+ needed_fields = {
+ 'id': recipe.pk,
+ 'name': recipe.name,
+ 'detail': detail,
+ }
+
+ results.append(needed_fields)
+
+ return results
+
+
+class ProjectsTypeAhead(ToasterTypeAhead):
+ """ Typeahead for all the projects, except for command line builds """
+ def apply_search(self, search_term, prj, request):
+ projects = Project.objects.exclude(is_default=True).order_by("name")
+
+ primary_results = projects.filter(name__istartswith=search_term)
+ secondary_results = projects.filter(
+ name__icontains=search_term).exclude(pk__in=primary_results)
+
+ results = []
+
+ for project in list(primary_results) + list(secondary_results):
+ needed_fields = {
+ 'id': project.pk,
+ 'name': project.name,
+ 'detail': "",
+ 'projectPageUrl': reverse('project', args=(project.pk,))
+ }
+
+ results.append(needed_fields)
+
+ return results
+
+
+class GitRevisionTypeAhead(ToasterTypeAhead):
+ def apply_search(self, search_term, prj, request):
+ results = []
+ git_url = request.GET.get('git_url')
+ ls_remote = cache.get(git_url)
+
+ if ls_remote is None:
+ ls_remote = subprocess.check_output(['git', 'ls-remote', git_url],
+ universal_newlines=True)
+ ls_remote = ls_remote.splitlines()
+ # Avoid fetching the list of git refs on each new input
+ cache.set(git_url, ls_remote, 120)
+
+ for rev in ls_remote:
+ git_rev = str(rev).split("/")[-1:][0]
+ # "HEAD" has a special meaning in Toaster... YOCTO #9924
+ if "HEAD" in git_rev:
+ continue
+
+ if git_rev.startswith(search_term):
+ results.append({'name': git_rev,
+ 'detail': '[ %s ]' % str(rev)})
+
+ return results
OpenPOWER on IntegriCloud