On Sep 18, 2010, at 10:33 PM, cd34 wrote:

> I've tried to pull out as much cruft and redesign to get the bare
> minimum model to make it easier to use the collection_class.
> 
> What I'm trying to do:
> 
> page.template.blocks[0].elements[0]
> 
> as
> 
> page.template['content'].elements[0]

so, attribute_mapped_collection on template.blocks mapping to block.name, then 
association proxy on page.template jumping across template to blocks.  You'd 
have to rename "template" as a relationship to something else since the 
association proxy would be taking that name.


> 
> Right now, I get:
> 
> page.template.blocks[0].name = 'content'
> page.template.blocks[1].name = 'menu'
> 
> so my template needs to iterate through to figure out whether I need
> to walk page.template.blocks[0] or page.template.blocks[1] whereas I
> would rather do:
> 
> for elements in template.blocks['content']:
> 
> Thanks.
> 
> controller/cms.py:
> 
>   def index(self, id='index'):
>       tmpl_context.page =
> meta.Session.query(Page).filter_by(slug=id).one()
>       return render(tmpl_context.page.template.name)
> 
> model/cms.py:
> 
> from sqlalchemy import *
> from sqlalchemy.orm import mapper, relation, backref
> from sqlalchemy import Table, ForeignKey, Column
> from sqlalchemy.types import Integer, Unicode
> from sqlalchemy.dialects import mysql
> from sqlalchemy.orm.collections import column_mapped_collection
> 
> from pesi.model.meta import Base
> 
> Template_block = Table('m_template_block', Base.metadata,
>    Column('template_id', Integer, ForeignKey('m_template.id')),
>    Column('block_id', Integer, ForeignKey('m_block.id'))
> )
> 
> Block_element = Table('m_block_element', Base.metadata,
>    Column('block_id', Integer, ForeignKey('m_block.id')),
>    Column('element_id', Integer, ForeignKey('m_element.id'))
> )
> 
> class Block(Base):
>   __tablename__ = 'm_block'
> 
>   id = Column(mysql.BIGINT(20, unsigned=True), primary_key=True,
> autoincrement=True)
>   name = Column(Unicode(80))
> 
>   elements = relation('Element', secondary=Block_element)
> 
>   def __repr__(self):
>       return '<Block: id: %d name: %s>' % (self.id, self.name)
> 
> class Element(Base):
>   __tablename__ = 'm_element'
> 
>   id = Column(mysql.BIGINT(20, unsigned=True), primary_key=True,
> autoincrement=True)
>   function = Column(Unicode(80))
> 
> class Template(Base):
>   __tablename__ = 'm_template'
> 
>   id = Column(mysql.BIGINT(20, unsigned=True), primary_key=True,
> autoincrement=True)
>   name = Column(Unicode(80))
> 
>   blocks = relation(Block, secondary=Template_block)
> 
> class Page(Base):
>   __tablename__ = 'm_page'
> 
>   id = Column(mysql.BIGINT(20, unsigned=True), primary_key=True,
> autoincrement=True)
>   template_id = Column(mysql.BIGINT(20, unsigned=True),
> ForeignKey(Template.id))
>   slug = Column(Unicode(80))
> 
>   template = relation(Template, uselist=False)
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to