Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 1st, 2012  |  syntax: Python  |  size: 4.06 KB  |  hits: 21  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #!/usr/bin/env python
  2.  
  3. from sqlalchemy import (
  4.     Column,
  5.     Integer,
  6.     DateTime,
  7.     Unicode,
  8.     ForeignKey,
  9.     Boolean,
  10.     Sequence,
  11.     Table
  12.     )
  13.  
  14. from sqlalchemy import orm
  15. from sqlalchemy.orm.collections import collection
  16. from sqlalchemy import create_engine
  17. from sqlalchemy.orm import (
  18.     scoped_session,
  19.     sessionmaker,
  20.     )
  21. from sqlalchemy.ext.declarative import declarative_base
  22.  
  23. Base = declarative_base()
  24.  
  25. class User(Base):
  26.     __tablename__ = 'user'
  27.     __model__ = u'User'
  28.     id = Column(Integer,
  29.                 Sequence('user_seq_id', optional=True),
  30.                 primary_key=True)
  31.     username = Column(Unicode(128), nullable=False, unique=True)
  32.  
  33.     def __init__(self, name):
  34.         self.username = name
  35.  
  36. class Permission(Base):
  37.     __tablename__ = 'permission'
  38.     __model__ = u'Permission'
  39.     id = Column(Integer,
  40.                 Sequence('permission_seq_id', optional=True),
  41.                 primary_key=True)
  42.     user_id = Column(Integer, ForeignKey(User.id))
  43.     user = orm.relationship('User')
  44.     permission = Column(Unicode(64), index=True)
  45.     assoc_id = Column(Integer,
  46.                       ForeignKey('permission_assoc.id', ondelete="CASCADE"),
  47.                       nullable=False)
  48.     member = property(lambda self: getattr(self.association,
  49.                                            '_backref_%s' % self.association.model))
  50.  
  51.     def __init__(self, user, permission):
  52.         if isinstance(user, int):
  53.             self.user_id = user
  54.         else:
  55.             self.user = user
  56.         self.permission = permission
  57.  
  58. class MyMappedCollection(dict):
  59.     def __init__(self, data=None):
  60.         if data:
  61.             self.update(data)
  62.  
  63.     @collection.appender
  64.     def __setitem__(self, permission, pobj):
  65.         l = self.setdefault(permission, [])
  66.         l.append(pobj)
  67.  
  68.     @collection.remover
  69.     def _remove(self, perm):
  70.         self[perm.permission].remove(perm)
  71.  
  72.     @collection.iterator
  73.     def __iter__(self):
  74.         for vals in self.itervalues():
  75.             for perm in vals:
  76.                 yield perm
  77.  
  78.     def __repr__(self):
  79.         return '%s(%r)' % (type(self).__name__, self)
  80.  
  81. class PermissionAssoc(Base):
  82.     __tablename__ = 'permission_assoc'
  83.     __model__ = u'PermissionAssoc'
  84.     id = Column(Integer,
  85.                 Sequence('permission_assoc_seq_id', optional=True),
  86.                 primary_key=True)
  87.     model = Column(Unicode(64), index=True)
  88.     permissions = orm.relationship(Permission,
  89.                                    backref='association',
  90.                                    lazy=False,
  91.                                    collection_class=MyMappedCollection)
  92.  
  93.     def __init__(self, model):
  94.         self.model = model
  95.  
  96.  
  97. class ULine(Base):
  98.     """ Line base class """
  99.     __tablename__ = 'uline'
  100.     __model__ = u'ULine'
  101.     id = Column(Integer,
  102.                 Sequence('uline_seq_id', optional=True),
  103.                 primary_key=True)
  104.     name = Column(Unicode(256))
  105.     assoc_id = Column(Integer, ForeignKey('permission_assoc.id'))
  106.     permission_rel = orm.relation(PermissionAssoc,
  107.                                   backref=orm.backref('_backref_%s' % __model__,
  108.                                                       uselist=False))
  109.     @property
  110.     def permissions(self):
  111.         if self.permission_rel is None:
  112.             self.permission_rel = PermissionAssoc(self.__model__)
  113.         return self.permission_rel.permissions
  114.  
  115.     def __init__(self, name=''):
  116.         self.name = name
  117.  
  118. def initTestingDB():
  119.     engine = create_engine('sqlite:///:memory:', echo=False)
  120.     DBSession = scoped_session(sessionmaker())
  121.     DBSession.configure(bind=engine)
  122.     Base.metadata.bind = engine
  123.     Base.metadata.create_all(engine)
  124.     return DBSession
  125.  
  126. if __name__ == '__main__':
  127.     session = initTestingDB()
  128.     user1 = User('john')
  129.     user2 = User('kratos')
  130.     line = ULine('new line')
  131.     line.permissions['read'] = Permission(user1, 'read')
  132.     line.permissions['read'] = Permission(user2, 'read')
  133.     session.add(line)
  134.     session.flush()