From: Michael Tremer Date: Sat, 16 Feb 2013 17:10:56 +0000 (+0100) Subject: Add autocompletion of package names for search. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35c46db4b39c3b7761c6da0cce92d83cb7b89fa1;p=pbs.git Add autocompletion of package names for search. --- diff --git a/backend/packages.py b/backend/packages.py index fb717db5..2682c6b1 100644 --- a/backend/packages.py +++ b/backend/packages.py @@ -95,6 +95,13 @@ class Packages(base.Object): return files + def autocomplete(self, query, limit=8): + res = self.db.query("SELECT DISTINCT name FROM packages \ + WHERE packages.name LIKE %s AND packages.type = %s \ + ORDER BY packages.name LIMIT %s", "%%%s%%" % query, "source", limit) + + return [row.name for row in res] + def get_avg_build_times(self, name): query = "SELECT jobs.arch_id AS arch_id, \ AVG(UNIX_TIMESTAMP(jobs.time_finished) - UNIX_TIMESTAMP(jobs.time_started)) AS build_time \ diff --git a/data/static/js/pbs.js b/data/static/js/pbs.js index d7c55529..d2cfe40e 100644 --- a/data/static/js/pbs.js +++ b/data/static/js/pbs.js @@ -5,6 +5,16 @@ $(document).ready(function() { // Activate tooltips. $("a[rel=tooltip]").tooltip(); $("span[rel=tooltip]").tooltip(); + + $(".typeahead-packages-autocomplete").typeahead({ + source: function(query, process) { + $.get("/api/packages/autocomplete", { q: query }, function(data) { + if (data.query == query) { + process(data.packages); + } + }); + }, + }); }); function getCookie(name) { diff --git a/data/templates/base.html b/data/templates/base.html index 2936a54b..891316f8 100644 --- a/data/templates/base.html +++ b/data/templates/base.html @@ -190,7 +190,7 @@ diff --git a/data/templates/search-form.html b/data/templates/search-form.html index a9ca62a7..e2b696ae 100644 --- a/data/templates/search-form.html +++ b/data/templates/search-form.html @@ -31,8 +31,8 @@
- +
diff --git a/web/__init__.py b/web/__init__.py index d1499c77..7500c51e 100644 --- a/web/__init__.py +++ b/web/__init__.py @@ -10,6 +10,8 @@ import tornado.web from handlers import * from ui_modules import * +import handlers_api + BASEDIR = os.path.join(os.path.dirname(__file__), "..", "data") # Enable logging @@ -238,6 +240,9 @@ class Application(tornado.web.Application): # Sessions (r"/sessions", SessionsHandler), + # API handlers + (r"/api/packages/autocomplete", handlers_api.ApiPackagesAutocomplete), + ] + static_handlers + [ # Everything else is catched by the 404 handler. diff --git a/web/handlers_api.py b/web/handlers_api.py new file mode 100644 index 00000000..21a08ca7 --- /dev/null +++ b/web/handlers_api.py @@ -0,0 +1,25 @@ +#!/usr/bin/python + +import tornado.web + +from handlers_base import * + +class ApiBaseHandler(BaseHandler): + pass + + +class ApiPackagesAutocomplete(BaseHandler): + def get(self): + query = self.get_argument("q") + if not query: + raise tornado.web.HTTPError(400) + + # Query database. + packages = self.pakfire.packages.autocomplete(query, limit=8) + + res = { + "query" : query, + "packages" : packages, + } + + self.write(res)