pyramid/bodhi/bodhi/__init__.py | 18 ++--
pyramid/bodhi/bodhi/models/enum.py | 4 -
pyramid/bodhi/bodhi/models/models.py | 85 ++++++++--------------
pyramid/bodhi/bodhi/resources.py | 100 ++++++++++++++++++++++++++
pyramid/bodhi/bodhi/tests/views/test_views.py | 24 ++++--
pyramid/bodhi/bodhi/views.py | 15 +++
6 files changed, 178 insertions(+), 68 deletions(-)
New commits:
commit 6f190d735b7b71f3a39280ba0608c6e0a7afeca1
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri May 13 01:49:21 2011 -0400
Typo
diff --git a/pyramid/bodhi/bodhi/models/models.py b/pyramid/bodhi/bodhi/models/models.py
index 47aed4d..ea52a10 100644
--- a/pyramid/bodhi/bodhi/models/models.py
+++ b/pyramid/bodhi/bodhi/models/models.py
@@ -669,7 +669,7 @@ class Update(Base):
except: # TODO: catch sqlalchemy's not found exception!
log.debug("Creating new CVE: %s" % cve_id)
cve = CVE(cve_id=cve_id)
- ession.save(cve)
+ Session.save(cve)
self.cves.append(cve)
Session.commit()
commit 2e99e7c4d35f467c8e781c0d3d9eb051a4db3b5e
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri May 13 01:49:07 2011 -0400
Some model constraints/defaults
diff --git a/pyramid/bodhi/bodhi/models/models.py b/pyramid/bodhi/bodhi/models/models.py
index ad1cbe6..47aed4d 100644
--- a/pyramid/bodhi/bodhi/models/models.py
+++ b/pyramid/bodhi/bodhi/models/models.py
@@ -267,8 +267,10 @@ class Update(Base):
notes = Column(UnicodeText)
# Enumerated types
- type = Column(UpdateType.db_type())
- status = Column(UpdateStatus.db_type())
+ type = Column(UpdateType.db_type(), nullable=False)
+ status = Column(UpdateStatus.db_type(),
+ default=UpdateStatus.pending,
+ nullable=False)
request = Column(UpdateRequest.db_type())
# Flags
commit 451d302e8d158846d4f8d118e349577f5b8f7329
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri May 13 01:48:49 2011 -0400
Add a __json__ to our BodhiBase and EnumSymbol
diff --git a/pyramid/bodhi/bodhi/models/enum.py b/pyramid/bodhi/bodhi/models/enum.py
index 508540a..329713d 100644
--- a/pyramid/bodhi/bodhi/models/enum.py
+++ b/pyramid/bodhi/bodhi/models/enum.py
@@ -24,6 +24,9 @@ class EnumSymbol(object):
def __repr__(self):
return "<%s>" % self.name
+ def __json__(self):
+ return self.description
+
class EnumMeta(type):
"""Generate new DeclEnum classes."""
@@ -64,7 +67,6 @@ class DeclEnum(object):
def db_type(cls):
return DeclEnumType(cls)
-
class DeclEnumType(SchemaType, TypeDecorator):
def __init__(self, enum):
self.enum = enum
diff --git a/pyramid/bodhi/bodhi/models/models.py b/pyramid/bodhi/bodhi/models/models.py
index 8da71ea..ad1cbe6 100644
--- a/pyramid/bodhi/bodhi/models/models.py
+++ b/pyramid/bodhi/bodhi/models/models.py
@@ -32,12 +32,29 @@ 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
def __init__(self, **kw):
""" Automatically mapping attributes """
for key, value in kw.iteritems():
setattr(self, key, value)
+ def __json__(self):
+ items = []
+ exclude = getattr(self, '__exclude_columns__', [])
+ for col in self.__table__.columns:
+ if col.name in exclude:
+ continue
+ prop = getattr(self, col.name)
+ if isinstance(prop, list):
+ prop = [child.__json__() for child in prop]
+ elif hasattr(prop, '__json__'):
+ prop = prop.__json__()
+ elif isinstance(prop, datetime):
+ prop = prop.strftime('%Y-%m-%d %H:%M:%S')
+ items.append((col.name, prop))
+ return dict(items)
+
Base = declarative_base(cls=BodhiBase)
metadata = Base.metadata
DBSession = scoped_session(sessionmaker())
commit e555a4404aaf4b0fe1a2e9b0abdf80545c5eec3a
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri May 13 01:48:12 2011 -0400
Setup our basic views
diff --git a/pyramid/bodhi/bodhi/__init__.py b/pyramid/bodhi/bodhi/__init__.py
index f8cbaa3..c0a696c 100644
--- a/pyramid/bodhi/bodhi/__init__.py
+++ b/pyramid/bodhi/bodhi/__init__.py
@@ -5,7 +5,7 @@ from pyramid.request import Request
from pyramid.security import unauthenticated_userid
from pyramid.config import Configurator
-from bodhi.models import appmaker
+from bodhi.resources import appmaker
class BodhiRequest(Request):
@reify
@@ -25,12 +25,14 @@ def main(global_config, **settings):
engine = engine_from_config(settings, 'sqlalchemy.')
get_root = appmaker(engine)
config = Configurator(settings=settings, root_factory=get_root)
- config.set_request_factory(BodhiRequest)
+ #config.set_request_factory(BodhiRequest)
config.add_static_view('static', 'bodhi:static')
- config.add_view('bodhi.views.view_root',
- context='bodhi.models.Release',
- renderer="templates/root.pt")
- #config.add_view('bodhi.views.view_model',
- # context='bodhi.models.MyModel',
- # renderer="templates/model.pt")
+
+ config.add_view('bodhi.views.view_model_instance',
+ context='bodhi.models.Base',
+ renderer='json')
+ config.add_view('bodhi.views.view_model',
+ context='bodhi.resources.BodhiResource',
+ renderer='json')
+ config.scan()
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 32a84df..b08ce28 100644
--- a/pyramid/bodhi/bodhi/tests/views/test_views.py
+++ b/pyramid/bodhi/bodhi/tests/views/test_views.py
@@ -2,6 +2,8 @@ import unittest
from pyramid import testing
+from bodhi.models import DBSession, Release
+
class ViewTests(unittest.TestCase):
def setUp(self):
self.config = testing.setUp()
@@ -9,9 +11,21 @@ class ViewTests(unittest.TestCase):
def tearDown(self):
testing.tearDown()
- def test_my_view(self):
- from bodhi.views import view_root
+ def test_view_model(self):
+ from bodhi.views import view_model_instance
request = testing.DummyRequest()
- context = []
- info = view_root(context, request)
- self.assertEqual(info['project'], 'bodhi')
+ context = DBSession.query(Release).first()
+ info = view_model_instance(context, request)
+ self.assertEqual(info['context'], {
+ 'candidate_tag': u'dist-f11-updates-candidate',
+ 'dist_tag': u'dist-f11',
+ 'id': 1,
+ 'id_prefix': u'FEDORA',
+ 'locked': False,
+ 'long_name': u'Fedora 11',
+ 'metrics': {'test_metric': [0, 1, 2, 3, 4]},
+ 'name': u'F11',
+ 'stable_tag': u'dist-f11-updates',
+ 'testing_tag': u'dist-f11-updates-testing',
+ 'version': 11
+ })
diff --git a/pyramid/bodhi/bodhi/views.py b/pyramid/bodhi/bodhi/views.py
index 2fd492b..1921c47 100644
--- a/pyramid/bodhi/bodhi/views.py
+++ b/pyramid/bodhi/bodhi/views.py
@@ -1,5 +1,14 @@
-def view_root(context, request):
- return {'items':list(context), 'project':'bodhi'}
+#from pyramid.view import view_config
+from pyramid.response import Response
+
+from bodhi.models import Update, Package, Build, Release, DBSession
+
+def view_model_instance(context, request):
+ return {'context': context.__json__()}
def view_model(context, request):
- return {'item':context, 'project':'bodhi'}
+ print "view_model(%s)" % context
+ session = DBSession()
+ # TODO: pagination
+ entries = session.query(context.__model__).all()
+ return {'entries': [entry.__json__() for entry in entries]}
commit c9cd6930097ef1528643a3c660d3d9beffa44504
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri May 13 01:46:58 2011 -0400
Add a new resources.py module
diff --git a/pyramid/bodhi/bodhi/models/models.py b/pyramid/bodhi/bodhi/models/models.py
index 2622dc7..8da71ea 100644
--- a/pyramid/bodhi/bodhi/models/models.py
+++ b/pyramid/bodhi/bodhi/models/models.py
@@ -951,52 +951,20 @@ class Bug(Base):
# # updates
-
-
-class MyApp(object):
- __name__ = None
- __parent__ = None
-
- def __getitem__(self, key):
- session = DBSession()
- try:
- id = int(key)
- except (ValueError, TypeError):
- raise KeyError(key)
-
- query = session.query(Release).filter_by(id=id)
-
- try:
- item = query.one()
- item.__parent__ = self
- item.__name__ = key
- return item
- except NoResultFound:
- raise KeyError(key)
-
- def get(self, key, default=None):
- try:
- item = self.__getitem__(key)
- except KeyError:
- item = default
- return item
-
- def __iter__(self):
- session= DBSession()
- query = session.query(Release)
- return iter(query)
-
-root = MyApp()
-
-def default_get_root(request):
- return root
-
def populate():
session = DBSession()
- model = Release(name=u'F15')
- session.add(model)
- session.flush()
- transaction.commit()
+ release = Release(name=u'F15', long_name=u'Fedora 15',
id_prefix=u'FEDORA', dist_tag=u'dist-f15')
+ session.add(release)
+ pkg = Package(name=u'bodhi')
+ session.add(pkg)
+ build = Build(nvr=u'bodhi-2.0-1.fc15', release=release)
+ session.add(build)
+ update = Update(builds=[build], submitter=u'bodhi')
+ update.type = UpdateType.bugfix
+ session.add(update)
+ session.commit()
+ #session.flush()
+ #transaction.commit()
def initialize_sql(engine):
DBSession.configure(bind=engine)
@@ -1006,7 +974,3 @@ def initialize_sql(engine):
populate()
except IntegrityError:
DBSession.rollback()
-
-def appmaker(engine):
- initialize_sql(engine)
- return default_get_root
diff --git a/pyramid/bodhi/bodhi/resources.py b/pyramid/bodhi/bodhi/resources.py
new file mode 100644
index 0000000..e01f935
--- /dev/null
+++ b/pyramid/bodhi/bodhi/resources.py
@@ -0,0 +1,100 @@
+import logging
+
+from sqlalchemy.orm.exc import NoResultFound
+
+from bodhi.models import initialize_sql, DBSession
+from bodhi.models import Update, Package, Build, Release #, User
+
+log = logging.getLogger(__name__)
+
+resources = {}
+
+class BodhiRoot(object):
+ __name__ = None
+ __parent__ = None
+
+ def __getitem__(self, key):
+ resource = resources[key]()
+ resource.__parent__ = self
+ resource.__name__ = key
+ return resource
+
+ def get(self, key, default=None):
+ try:
+ item = self.__getitem__(key)
+ except KeyError:
+ item = default
+ return item
+
+ def __iter__(self):
+ session = DBSession()
+ query = session.query(self.__model__)
+ return iter(query)
+
+
+class BodhiResource(object):
+ __name__ = None
+ __parent__ = None
+ __model__ = None
+ __column__ = None
+
+ def __getitem__(self, key):
+ session = DBSession()
+ log.debug('%s(%r)'% (self.__class__.__name__, key))
+ try:
+ return session.query(self.__model__).filter_by(**{self.__column__:
key}).one()
+ except NoResultFound:
+ log.debug('NoResultsFound')
+ raise KeyError(key)
+
+ def get(self, key, default=None):
+ try:
+ item = self.__getitem__(key)
+ except KeyError:
+ item = default
+ return item
+
+ def __iter__(self):
+ session = DBSession()
+ query = session.query(self.__model__)
+ return iter(query)
+
+
+class PackageResource(BodhiResource):
+ __model__ = Package
+ __column__ = u'name'
+
+class BuildResource(BodhiResource):
+ __model__ = Build
+ __column__ = u'nvr'
+
+class UpdateResource(BodhiResource):
+ __model__ = Update
+ __column__ = u'title'
+
+class ReleaseResource(BodhiResource):
+ __model__ = Release
+ __column__ = u'name'
+
+
+# TODO: proper User model?
+#class UserResource(BodhiResource):
+# __model__ = Update
+# __keys__ = (u'submitter')
+
+root = BodhiRoot()
+
+def default_get_root(request):
+ global resources
+ resources.update({
+ u'updates': UpdateResource,
+ u'builds': BuildResource,
+ u'packages': PackageResource,
+ u'releases': ReleaseResource,
+ #'users': UserResource,
+ })
+ return root
+
+def appmaker(engine):
+ initialize_sql(engine)
+ return default_get_root