diff options
author | Ralph Bean <ralph.bean@gmail.com> | 2011-04-13 16:58:33 -0400 |
---|---|---|
committer | Ralph Bean <ralph.bean@gmail.com> | 2011-04-13 16:58:33 -0400 |
commit | 3947d863e837dcfee1bdb2eb5bd04645133961a1 (patch) | |
tree | 6a229c66c99c7eebbd21f6e918529653e056b2ea | |
parent | 7fbc81696a5e401ca20df581736ed60b03edaa31 (diff) | |
download | leafymiracle-3947d863e837dcfee1bdb2eb5bd04645133961a1.tar.gz leafymiracle-3947d863e837dcfee1bdb2eb5bd04645133961a1.tar.xz leafymiracle-3947d863e837dcfee1bdb2eb5bd04645133961a1.zip |
Search bar is IN
-rw-r--r-- | leafymiracle/__init__.py | 4 | ||||
-rw-r--r-- | leafymiracle/templates/model.pt | 3 | ||||
-rw-r--r-- | leafymiracle/views.py | 68 | ||||
-rw-r--r-- | leafymiracle/widgets.py | 58 |
4 files changed, 117 insertions, 16 deletions
diff --git a/leafymiracle/__init__.py b/leafymiracle/__init__.py index d0e53e4..1d9203b 100644 --- a/leafymiracle/__init__.py +++ b/leafymiracle/__init__.py @@ -33,6 +33,10 @@ def main(global_config, **settings): renderer="templates/model.pt") config.add_static_view(name='static', path='static') + # Create the searchbar handler + config.add_route('search', '/search', + view='leafymiracle.views.search', xhr=True) + # Create the data view for our tw2.jit.SQLARadialGraph jit_view = lambda context, request: LeafyGraph.request(request) config.add_route('data', '/data', view=jit_view, xhr=True) diff --git a/leafymiracle/templates/model.pt b/leafymiracle/templates/model.pt index c8793ec..77c44a5 100644 --- a/leafymiracle/templates/model.pt +++ b/leafymiracle/templates/model.pt @@ -11,6 +11,9 @@ <img class="center" src="static/images/leafy_logo.png" /> </a> </div> + <div class "searchbar"> + <div tal:content="structure searchbarwidget.display()"></div> + </div> <div class="inner" tal:content="structure jitwidget.display()"></div> </body> </html> diff --git a/leafymiracle/views.py b/leafymiracle/views.py index a5e5a28..454cf4f 100644 --- a/leafymiracle/views.py +++ b/leafymiracle/views.py @@ -17,6 +17,12 @@ from pyramid.httpexceptions import HTTPFound from tw2.jqplugins.ui.base import set_ui_theme_name from widgets import LeafyGraph from widgets import LeafyDialog +from widgets import LeafySearchbar + +import leafymiracle.models +import sqlalchemy +import simplejson +import webob def view_root(context, request): return HTTPFound(location='/1') @@ -26,4 +32,64 @@ def view_model(context, request): set_ui_theme_name('hot-sneaks') return {'item':context, 'project':'leafymiracle', 'jitwidget': LeafyGraph(rootObject=context), - 'dialogwidget': LeafyDialog} + 'dialogwidget': LeafyDialog, + 'searchbarwidget': LeafySearchbar, + } + + +def search(context, request): + """ NOTE :: this is *not* the `pyramid` way of doing things. + + DB stuff should not happen in the 'view' but should instead happen.. + elsewhere? Quick hack to make this work before submission. + + --Ralph + """ + + term = request.params['term'] + cats = request.params.get('cats', 'Root,Category,Group,Package') + + # Don't do any search if the term is too short + if len(term) < 2: + return {'data':[]} + + attrs = { + 'Root' : { + 'search_on' : ['name'], + }, + 'Category' : { + 'search_on' : ['name', 'description'], + }, + 'Group' : { + 'search_on' : ['name', 'description'], + }, + 'Package' : { + 'search_on' : ['name'], + } + } + srch = '%%%s%%' % term + cats = cats.split(',') + results = [] + + for cat in cats: + if not cat in attrs.keys(): + raise ValueError, "'%s' is a disallowed category." % cat + cls = getattr(leafymiracle.models, cat) + entries = cls.query.filter(sqlalchemy.or_( + *[getattr(cls, srch_attr).like(srch) + for srch_attr in attrs[cat]['search_on']] + )) + results += [[unicode(e), e.id, cat] for e in entries] + + data = { + 'data' : [ + { + 'label' : label, + 'value' : value, + 'category' : category } + for label, value, category in results + ] + } + resp = webob.Response(request=request, content_type="application/json") + resp.body = simplejson.dumps(data) + return resp diff --git a/leafymiracle/widgets.py b/leafymiracle/widgets.py index b144f4e..b86ce7d 100644 --- a/leafymiracle/widgets.py +++ b/leafymiracle/widgets.py @@ -15,6 +15,7 @@ from tw2.jit import SQLARadialGraph from tw2.jqplugins.ui import DialogWidget +from tw2.jqplugins.ui import CategoryAutocompleteWidget from tw2.core.resources import JSSymbol @@ -53,22 +54,22 @@ class LeafyGraph(SQLARadialGraph): # Override the label style onPlaceLabel = JSSymbol(src=""" - (function(domElement, node){ - domElement.style.display = "none"; - domElement.innerHTML = node.name; - domElement.style.display = ""; - var left = parseInt(domElement.style.left); - domElement.style.width = '120px'; - domElement.style.height = ''; - var w = domElement.offsetWidth; - domElement.style.left = (left - w /2) + 'px'; + (function(domElement, node){ + domElement.style.display = "none"; + domElement.innerHTML = node.name; + domElement.style.display = ""; + var left = parseInt(domElement.style.left); + domElement.style.width = '120px'; + domElement.style.height = ''; + var w = domElement.offsetWidth; + domElement.style.left = (left - w /2) + 'px'; - domElement.style.cursor = 'pointer'; - if ( node._depth <= 1 ) - domElement.style.color = '%s'; - else - domElement.style.color = '%s'; - })""" % (triads[0], triads_dark[0])) + domElement.style.cursor = 'pointer'; + if ( node._depth <= 1 ) + domElement.style.color = '%s'; + else + domElement.style.color = '%s'; + })""" % (triads[0], triads_dark[0])) def leafy_readme(): """ Ridiculous """ @@ -86,3 +87,30 @@ class LeafyDialog(DialogWidget): 'width' : 1000 } value = leafy_readme() + +class LeafySearchbar(CategoryAutocompleteWidget): + id = 'leafy_searchbar' + value = "Leafy Searchbar" + tags = [] + options={ + 'source' : JSSymbol( + src=""" + function( request, response ) { + $.ajax({ + url: "/search", + dataType: "json", + data: { term : request.term, }, + success: function( data ) { + response( data.data ); + } + }); + }"""), + 'select' : JSSymbol( + src=""" + function( event, ui ) { + window.location.assign("/1#___" + ui.item.category + \ + "___" + ui.item.value); + window.location.reload(true); + }""" + ) + } |