pyramid/bodhi/bodhi/__init__.py | 19 +++++++++++--
pyramid/bodhi/bodhi/models/models.py | 15 +++++++++--
pyramid/bodhi/bodhi/templates/model.mak | 16 +++++++++++
pyramid/bodhi/bodhi/tests/functional/test_wsgi.py | 29 +++++++++++++++++++++
pyramid/bodhi/bodhi/tests/views/test_views.py | 10 +++----
pyramid/bodhi/bodhi/views.py | 30 ++++++++++++++++++----
pyramid/bodhi/development.ini | 1
7 files changed, 105 insertions(+), 15 deletions(-)
New commits:
commit eb0b2761d321100689d292bbcc38bca3b80ddd63
Author: Luke Macken <lmacken(a)redhat.com>
Date: Mon May 16 12:11:31 2011 -0400
Add functional WSGI stack tests
diff --git a/pyramid/bodhi/bodhi/tests/functional/__init__.py
b/pyramid/bodhi/bodhi/tests/functional/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/pyramid/bodhi/bodhi/tests/functional/test_wsgi.py
b/pyramid/bodhi/bodhi/tests/functional/test_wsgi.py
new file mode 100644
index 0000000..7a21563
--- /dev/null
+++ b/pyramid/bodhi/bodhi/tests/functional/test_wsgi.py
@@ -0,0 +1,29 @@
+import unittest
+import json
+
+from nose.tools import eq_
+
+app = None
+
+def setup():
+ from bodhi import main
+ from webtest import TestApp
+ global app
+ app = main({}, **{'sqlalchemy.url': 'sqlite://'})
+ app = TestApp(app)
+
+class FunctionalTests(unittest.TestCase):
+
+ def test_release_view_json(self):
+ res = app.get('/releases/F15', status=200)
+ data = json.loads(res.body)
+ eq_(data['context']['name'], 'F15')
+
+ def test_invalid_release(self):
+ app.get('/releases/F16', status=404)
+
+ def test_releases_view_json(self):
+ res = app.get('/releases', status=200)
+ data = json.loads(res.body)
+ eq_(data[u'entries'][0][u'name'], 'F15')
+
commit 7d7d99cff82ed0fc3c12d94141ea85d54d7e1e82
Author: Luke Macken <lmacken(a)redhat.com>
Date: Mon May 16 12:11:19 2011 -0400
Add our generic model grid mako template
diff --git a/pyramid/bodhi/bodhi/templates/model.mak
b/pyramid/bodhi/bodhi/templates/model.mak
new file mode 100644
index 0000000..6854880
--- /dev/null
+++ b/pyramid/bodhi/bodhi/templates/model.mak
@@ -0,0 +1,16 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html
xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="content-type" content="text/html;
charset=utf-8" />
+ <title></title>
+</head>
+ <body>
+ <table class="stylized">
+ ${page.pager('$link_previous ~3~ $link_next (Page $page of
$page_count)')}
+ <caption>${caption}</caption>
+ <col class="c1" />
+ ${grid}
+ </table>
+ </body>
+</html>
commit 012dba7807a3319484540058296cdb7670703664
Author: Luke Macken <lmacken(a)redhat.com>
Date: Mon May 16 12:10:47 2011 -0400
Add a BodhiBase.grid_columns property for use by our Grid view
diff --git a/pyramid/bodhi/bodhi/models/models.py b/pyramid/bodhi/bodhi/models/models.py
index 92c0bd4..83385fc 100644
--- a/pyramid/bodhi/bodhi/models/models.py
+++ b/pyramid/bodhi/bodhi/models/models.py
@@ -56,6 +56,17 @@ class BodhiBase(object):
items.append((col.name, prop))
return dict(items)
+ @property
+ def grid_columns(self):
+ columns = []
+ exclude = getattr(self, '__exclude_columns__', [])
+ for col in self.__table__.columns:
+ if col.name in exclude:
+ continue
+ columns.append(col.name)
+ return columns
+
+
Base = declarative_base(cls=BodhiBase)
metadata = Base.metadata
DBSession = scoped_session(sessionmaker())
commit 9cde4c9ae7c53f568f00a55f4a4f53b7bd7089d5
Author: Luke Macken <lmacken(a)redhat.com>
Date: Mon May 16 12:10:44 2011 -0400
Exclude some columns from JSON output
diff --git a/pyramid/bodhi/bodhi/models/models.py b/pyramid/bodhi/bodhi/models/models.py
index b09148b..92c0bd4 100644
--- a/pyramid/bodhi/bodhi/models/models.py
+++ b/pyramid/bodhi/bodhi/models/models.py
@@ -32,7 +32,7 @@ identity = Bunch(current=Bunch(user_name=u'Bob'))
class BodhiBase(object):
""" Our custom model base class """
- __exclude_columns___ = None # List of columns to exclude from JSON
+ __exclude_columns___ = ('id',) # List of columns to exclude from JSON
def __init__(self, **kw):
""" Automatically mapping attributes """
@@ -115,7 +115,7 @@ bug_cve_table = Table('bug_cve_table', metadata,
class Release(Base):
__tablename__ = 'releases'
- __exclude_columns__ = ('metrics')
+ __exclude_columns__ = ('id', 'metrics')
id = Column(Integer, primary_key=True)
name = Column(Unicode(10), unique=True, nullable=False)
commit 56252f87d5f2c5286a896c9d441dc398e0983421
Author: Luke Macken <lmacken(a)redhat.com>
Date: Mon May 16 12:10:22 2011 -0400
Add our JSON and Mako grid views
diff --git a/pyramid/bodhi/bodhi/__init__.py b/pyramid/bodhi/bodhi/__init__.py
index 923ad53..d3fc95c 100644
--- a/pyramid/bodhi/bodhi/__init__.py
+++ b/pyramid/bodhi/bodhi/__init__.py
@@ -28,11 +28,24 @@ def main(global_config, **settings):
#config.set_request_factory(BodhiRequest)
config.add_static_view('static', 'bodhi:static')
- config.add_view('bodhi.views.view_model_instance',
+ # JSON views
+ config.add_view('bodhi.views.view_model_instance_json',
context='bodhi.models.Base',
+ accept='application/json',
renderer='json')
- config.add_view('bodhi.views.view_model',
+ config.add_view('bodhi.views.view_model_json',
context='bodhi.resources.BodhiResource',
+ accept='application/json',
renderer='json')
- #config.scan()
+
+ # Mako template views
+ config.add_view('bodhi.views.view_model_instance',
+ context='bodhi.models.Base',
+ accept='text/html',
+ renderer='bodhi:templates/instance.mak')
+ config.add_view('bodhi.views.view_model',
+ accept='text/html',
+ context='bodhi.resources.BodhiResource',
+ renderer='bodhi:templates/model.mak')
+
return config.make_wsgi_app()
diff --git a/pyramid/bodhi/bodhi/tests/views/test_views.py
b/pyramid/bodhi/bodhi/tests/views/test_views.py
index f7477c7..ed58a63 100644
--- a/pyramid/bodhi/bodhi/tests/views/test_views.py
+++ b/pyramid/bodhi/bodhi/tests/views/test_views.py
@@ -11,16 +11,16 @@ class ViewTests(unittest.TestCase):
def tearDown(self):
testing.tearDown()
- def test_view_model_instance(self):
- from bodhi.views import view_model_instance
+ def test_view_model_instance_json(self):
+ from bodhi.views import view_model_instance_json
request = testing.DummyRequest()
context = DBSession.query(Release).first()
- info = view_model_instance(context, request)
+ info = view_model_instance_json(context, request)
self.assertEqual(info['context'], context.__json__())
def test_view_model(self):
from bodhi.resources import ReleaseResource
- from bodhi.views import view_model
+ from bodhi.views import view_model_json
request = testing.DummyRequest()
- info = view_model(ReleaseResource, request)
+ info = view_model_json(ReleaseResource, request)
self.assertEqual(len(info['entries']), 2)
diff --git a/pyramid/bodhi/bodhi/views.py b/pyramid/bodhi/bodhi/views.py
index b0b70dc..afc8f50 100644
--- a/pyramid/bodhi/bodhi/views.py
+++ b/pyramid/bodhi/bodhi/views.py
@@ -1,13 +1,33 @@
-#from pyramid.view import view_config
-from pyramid.response import Response
+from webhelpers.html.grid import Grid
+from webhelpers.paginate import Page, PageURL_WebOb
-from bodhi.models import Update, Package, Build, Release, DBSession
+from bodhi.models import DBSession
-def view_model_instance(context, request):
+## JSON views
+
+def view_model_instance_json(context, request):
return {'context': context.__json__()}
-def view_model(context, request):
+def view_model_json(context, request):
session = DBSession()
# TODO: pagination
entries = session.query(context.__model__).all()
return {'entries': [entry.__json__() for entry in entries]}
+
+## Mako templated views
+
+def view_model_instance(context, request):
+ return {'context': context}
+
+def view_model(context, request):
+ session = DBSession()
+ entries = session.query(context.__model__)
+ current_page = int(request.params.get('page', 1))
+ items_per_page = int(request.params.get('items_per_page', 20))
+ page_url = PageURL_WebOb(request)
+ page = Page(entries, page=current_page, url=page_url,
+ items_per_page=items_per_page)
+ # FIXME: entries[0] triggers another query
+ grid = Grid([entry.__json__() for entry in page], entries[0].grid_columns)
+ return {'caption': context.__model__.__name__ + 's',
+ 'grid': grid, 'page': page}
diff --git a/pyramid/bodhi/development.ini b/pyramid/bodhi/development.ini
index bef0deb..adb4df9 100644
--- a/pyramid/bodhi/development.ini
+++ b/pyramid/bodhi/development.ini
@@ -7,6 +7,7 @@ debug_routematch = false
debug_templates = true
default_locale_name = en
sqlalchemy.url = sqlite:///%(here)s/bodhi.db
+mako.directories = bodhi:templates
[pipeline:main]
pipeline =