]> git.ipfire.org Git - pbs.git/commitdiff
Add autocompletion of package names for search.
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 16 Feb 2013 17:10:56 +0000 (18:10 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 16 Feb 2013 17:10:56 +0000 (18:10 +0100)
backend/packages.py
data/static/js/pbs.js
data/templates/base.html
data/templates/search-form.html
web/__init__.py
web/handlers_api.py [new file with mode: 0644]

index fb717db56d7095f615ad7a896a7aceaed7690827..2682c6b1cff1e3c593ea5e972a4e9c694a2523f5 100644 (file)
@@ -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 \
index d7c55529746ff7091994a15b13e0c7a9ce0ed05a..d2cfe40eedb562a92cc7079cea4ac1ba32af36cb 100644 (file)
@@ -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) {
index 2936a54b146285b0a5893d6aff4cbf9c9fc46b52..891316f8f06b9e8ac695973f1a37060999ad7419 100644 (file)
                                                </ul>
 
                                                <form class="navbar-search pull-right" method="GET" action="/search">
-                                                       <input type="text" class="search-query" id="search" placeholder="{{ _("Search...") }}" name="q">
+                                                       <input type="text" class="search-query typeahead-packages-autocomplete" id="search" placeholder="{{ _("Search...") }}" name="q" autocomplete="off">
                                                </form>
                                        </div>
                                </div>
index a9ca62a7b1131dd6190491030afcb721c7ebdc56..e2b696ae99f54fdea023a36519eade5eb80c0031 100644 (file)
@@ -31,8 +31,8 @@
                <div class="span4 offset4">
                        <form class="well ac" method="GET" action="/search">
                                <div class="input-append">
-                                       <input type="text" class="input-large" name="q" placeholder="{{ _("Search") }}"
-                                               value="{{ pattern }}"><button type="submit" class="btn">{{ _("Go!") }}</button>
+                                       <input type="text" class="input-large typeahead-packages-autocomplete" name="q" placeholder="{{ _("Search") }}"
+                                               value="{{ pattern }}" autocomplete="off"><button type="submit" class="btn">{{ _("Go!") }}</button>
                                </div>
                        </form>
                </div>
index d1499c773817501cc8869de8ce28368144d6a0a4..7500c51ed10df43d764c1c4e6ec7223f5ec0d92a 100644 (file)
@@ -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 (file)
index 0000000..21a08ca
--- /dev/null
@@ -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)