summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRalph Bean <ralph.bean@gmail.com>2011-04-13 16:58:33 -0400
committerRalph Bean <ralph.bean@gmail.com>2011-04-13 16:58:33 -0400
commit3947d863e837dcfee1bdb2eb5bd04645133961a1 (patch)
tree6a229c66c99c7eebbd21f6e918529653e056b2ea
parent7fbc81696a5e401ca20df581736ed60b03edaa31 (diff)
downloadleafymiracle-3947d863e837dcfee1bdb2eb5bd04645133961a1.tar.gz
leafymiracle-3947d863e837dcfee1bdb2eb5bd04645133961a1.tar.xz
leafymiracle-3947d863e837dcfee1bdb2eb5bd04645133961a1.zip
Search bar is IN
-rw-r--r--leafymiracle/__init__.py4
-rw-r--r--leafymiracle/templates/model.pt3
-rw-r--r--leafymiracle/views.py68
-rw-r--r--leafymiracle/widgets.py58
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);
+ }"""
+ )
+ }