diff --git a/buildout.cfg b/buildout.cfg index f041e88..d0df200 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -8,6 +8,7 @@ develop = . pyramidapp ../fa.jquery ../formalchemy recipe = zc.recipe.egg eggs = pyramid_formalchemy + pyramid_handlers pyramidapp fa.jquery WebTest diff --git a/pyramid_formalchemy/resources.py b/pyramid_formalchemy/resources.py index 2b788f4..1d728fd 100644 --- a/pyramid_formalchemy/resources.py +++ b/pyramid_formalchemy/resources.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from pyramid.exceptions import NotFound import logging log = logging.getLogger(__name__) @@ -18,22 +19,32 @@ class Base(object): request.model_class = None request.model_name = None request.model_id = None + request.relation = None request.format = 'html' def get_model(self): request = self.request if request.model_class: return request.model_class - if request.model_name: - if isinstance(request.model, list): - for model in request.model: - if model.__name__ == request.model_name: - request.model_class = model - return request.model_class - elif hasattr(request.model, request.model_name): - request.model_class = getattr(request.model, request.model_name) - return request.model_class - raise NotFound() + model_name = request.model_name + model_class = None + if isinstance(request.model, list): + for model in request.model: + if model.__name__ == model_name: + model_class = model + break + elif hasattr(request.model, model_name): + model_class = getattr(request.model, model_name) + if model_class is None: + raise NotFound() + request.model_class = model_class + return model_class + + def get_instance(self): + model = self.get_model() + session = self.request.session_factory() + return session.query(model).get(self.request.model_id) + class Models(Base): diff --git a/pyramid_formalchemy/views.py b/pyramid_formalchemy/views.py index 37bb482..bbd44bd 100644 --- a/pyramid_formalchemy/views.py +++ b/pyramid_formalchemy/views.py @@ -112,13 +112,13 @@ class ModelView(object): request = self.request model_name = request.model_name id = request.model_id - items.append((request.fa_url(), 'root')) + items.append((request.fa_url(), 'root', 'root_url')) if self.model_name: - items.append((request.fa_url(model_name), model_name)) + items.append((request.fa_url(model_name), model_name, 'model_url')) if id and hasattr(fs.model, '__unicode__'): - items.append((request.fa_url(model_name, id), u'%s' % fs.model)) + items.append((request.fa_url(model_name, id), u'%s' % self.context.get_instance(), 'instance_url')) elif id: - items.append((request.fa_url(model_name, id), id)) + items.append((request.fa_url(model_name, id), id, 'instance_url')) return items def render(self, **kwargs): @@ -166,7 +166,7 @@ class ModelView(object): fields = fs.render_fields if field_name in fields: field = fields[field_name] - return field.render() + return Response(field.render()) else: raise NotFound() return Response(fs.render()) @@ -238,7 +238,7 @@ class ModelView(object): del fs[field.name] return fs - def get_grid(self): + def get_grid(self, model_name=None): """return a Grid object Default is:: @@ -249,14 +249,15 @@ class ModelView(object): return grid """ request = self.request - model_name = self.model_name + model_name = model_name or self.model_name if request.forms and hasattr(request.forms, '%sGrid' % model_name): g = getattr(request.forms, '%sGrid' % model_name) g.engine = g.engine or self.engine g.readonly = True self.update_grid(g) return g - grid = self.Grid(self.context.get_model()) + model = self.context.get_model() + grid = self.Grid(model) grid.engine = self.engine self.update_grid(grid) return grid @@ -287,7 +288,7 @@ class ModelView(object): def listing(self, **kwargs): """listing page""" - page = self.get_page() + page = self.get_page(**kwargs) fs = self.get_grid() fs = fs.bind(instances=page) fs.readonly = True diff --git a/pyramidapp/pyramidapp/models.py b/pyramidapp/pyramidapp/models.py index e14ea01..dc981d8 100644 --- a/pyramidapp/pyramidapp/models.py +++ b/pyramidapp/pyramidapp/models.py @@ -1,10 +1,13 @@ import transaction +from sqlalchemy import Table from sqlalchemy import Column from sqlalchemy import Integer from sqlalchemy import Unicode +from sqlalchemy import ForeignKey from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import relation from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import scoped_session @@ -37,6 +40,38 @@ class Bar(Base): id = Column(Integer, primary_key=True) foo = Column(Unicode(255)) +class User(Base): + __tablename__ = 'users' + id = Column(Integer, primary_key=True) + name = Column(Unicode) + group_id = Column(Integer, ForeignKey('groups.id')) + group = relation("Group", backref='users') + + def __unicode__(self): + return self.name + +group_permissions = Table('group_permissions', Base.metadata, + Column('permission_id', Integer, ForeignKey('permissions.id')), + Column('group_id', Integer, ForeignKey('groups.id')), + ) + +class Group(Base): + __tablename__ = 'groups' + id = Column(Integer, primary_key=True) + name = Column(Unicode) + permissions = relation("Permission", secondary=group_permissions, backref="groups") + + def __unicode__(self): + return self.name + +class Permission(Base): + __tablename__ = 'permissions' + id = Column(Integer, primary_key=True) + name = Column(Unicode) + + def __unicode__(self): + return self.name + def populate(): session = DBSession() model = MyModel(name=u'root',value=55) @@ -46,8 +81,11 @@ def populate(): model = MyModel(name=u'root%i' % i,value=i) session.add(model) session.flush() + g = Group() + g.id = 1 + g.name = 'group1' transaction.commit() - + def initialize_sql(engine): DBSession.configure(bind=engine) Base.metadata.bind = engine