Skip to content

Instantly share code, notes, and snippets.

@mdellavo
Created April 2, 2010 03:03
Show Gist options
  • Save mdellavo/352695 to your computer and use it in GitHub Desktop.
Save mdellavo/352695 to your computer and use it in GitHub Desktop.
page_tags = Table('page_tags', meta.metadata,
Column('page_id', Integer, ForeignKey('pages.id'), primary_key=True),
Column('tag_id', Integer, ForeignKey('tags.id'), primary_key=True)
)
class Metadata(AppBase, Base):
__tablename__ = 'metadata'
id = Column(Integer, primary_key=True)
page_id = Column(Integer, ForeignKey('pages.id'))
name = Column(String, nullable=False)
value = Column(String)
class Tag(AppBase, Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
class Page(AppBase, Base):
__tablename__ = 'pages'
id = Column(Integer, primary_key=True)
path = Column(String, nullable=False, unique=True)
parent = Column(String)
last_update = Column(DateTime)
accesses = Column(Integer, nullable=False, default=0)
tags_list = relation('Tag', backref='pages', secondary=page_tags, cascade='all')
tags = association_proxy('tags_list', 'name')
data_map = relation('Metadata', backref='page', collection_class=column_mapped_collection(Metadata.name), cascade='all')
data = association_proxy('data_map', 'value')
def update(self, data):
removed = set(self.data.keys()) - set(data.keys())
added = set(data.keys()) - set(self.data.keys())
for i in removed:
del self.data[i]
for i in added:
self.data_map[i] = Metadata(name=i, value=data[i])
print self.data
if 'tags' in self.data:
tag_names = set(self.data['tags'].value.split())
added_tags = tag_names - set(self.tags)
removed_tags = set(self.tags) - tag_names
for i in added_tags:
t = meta.Session.query(Tag).filter_by(name=i).first()
if t is None:
t = Tag(name=i)
self.tags_list.append(t)
for i in removed_tags:
self.tags.remove(i)
self.last_update = datetime.now()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment