Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """The application's model objects"""
- import sha
- from pylons import session
- import sqlalchemy as sa
- from sqlalchemy import orm
- from irective.model import meta
- def init_model(engine):
- """Call me before using any of the tables or classes in the model"""
- meta.Session.configure(bind=engine)
- meta.engine = engine
- project_assocs_table = sa.Table(
- 'ProjectAssocs', meta.metadata,
- sa.Column('left_id', sa.types.Integer, sa.ForeignKey('Users.id')),
- sa.Column('right_id', sa.types.Integer, sa.ForeignKey('Projects.id')),
- )
- users_table = sa.Table(
- 'Users', meta.metadata,
- sa.Column('id', sa.types.Integer, primary_key=True),
- sa.Column('enabled', sa.types.Boolean),
- sa.Column('name', sa.types.Unicode(255), unique=True),
- sa.Column('password', sa.types.String(40))
- )
- orm.mapper(User, users_table,
- properties=dict(
- projects=orm.relation(Project, secondary=project_assocs_table, backref='users'),
- )
- )
- projects_table = sa.Table(
- 'Projects', meta.metadata,
- sa.Column('id', sa.types.Integer, primary_key=True),
- sa.Column('enabled', sa.types.Boolean),
- sa.Column('name', sa.types.Unicode(255))
- )
- orm.mapper(Project, projects_table,
- properties=dict(
- files=orm.relation(File, backref='project')
- )
- )
- files_table = sa.Table(
- 'Files', meta.metadata,
- sa.Column('id', sa.types.Integer, primary_key=True),
- sa.Column('project_id', sa.types.Integer, sa.ForeignKey('Projects.id')),
- sa.Column('name', sa.types.Unicode(255)),
- sa.Column('fn', sa.types.String(255))
- )
- orm.mapper(File, files_table,
- properties=dict(
- attrs=orm.relation(Attr, backref='file'),
- symbols=orm.relation(Symbol, backref='file'),
- )
- )
- attrs_table = sa.Table(
- 'Attrs', meta.metadata,
- sa.Column('id', sa.types.Integer, primary_key=True),
- sa.Column('file_id', sa.types.Integer, sa.ForeignKey('Files.id')),
- sa.Column('name', sa.types.String(255)),
- sa.Column('data', sa.types.PickleType())
- )
- orm.mapper(Attr, attrs_table)
- symbols_table = sa.Table(
- 'Symbols', meta.metadata,
- sa.Column('id', sa.types.Integer, primary_key=True),
- sa.Column('file_id', sa.types.Integer, sa.ForeignKey('Files.id')),
- sa.Column('type', sa.types.String(255)),
- sa.Column('address', sa.types.Integer),
- sa.Column('data', sa.types.PickleType())
- )
- orm.mapper(Symbol, symbols_table)
- class User(object):
- @staticmethod
- def login(username, password):
- try:
- user = meta.Session.query(User).filter(
- User.enabled and
- User.name == username and
- User.password == sha.new(password).hexdigest()
- ).one()
- session['uid'] = user.id
- session.save()
- return True
- except:
- return False
- @staticmethod
- def register(username, password):
- user = User()
- user.enabled = True
- user.name = username
- user.password = sha.new(password).hexdigest()
- meta.Session.add(user)
- try:
- meta.Session.commit()
- except:
- return False
- return User.login(username, password)
- @staticmethod
- def get():
- return meta.Session.query(User).filter(User.id == session['uid']).one()
- @staticmethod
- def getProjects():
- return filter(lambda x: x.enabled, User.get().projects)
- class Project(object):
- @staticmethod
- def add(name):
- project = Project()
- project.enabled = True
- project.name = name
- meta.Session.add(project)
- user = User.get()
- user.projects.append(project)
- meta.Session.commit()
- @staticmethod
- def get(id):
- try:
- return meta.Session.query(Project).filter(Project.id == id).one()
- except:
- return None
- class File(object):
- def addAttr(self, name, data):
- attr = self.getAttr(name)
- if attr == None:
- attr = Attr()
- attr.file = self
- attr.name = name
- meta.Session.add(attr)
- else:
- attr.data = data
- def getAttr(self, name):
- try:
- return meta.Session.query(Attr).filter(Attr.file_id == self.id and Attr.name == name).one()
- except:
- return None
- def addSymbol(self, symbol):
- symbol.file = self
- self.symbols.append(symbol)
- meta.Session.add(symbol)
- def getSymbols(self, type=None, addr_range=None):
- query = meta.Session.query(Symbol)
- if type != None:
- query = query.filter(Symbol.type == type)
- if addr_range != None:
- query = query.filter(Symbol.address >= addr_range[0] and Symbol.address < addr_range[1])
- return query.all()
- class Attr(object):
- pass
- class Symbol(object):
- pass
Add Comment
Please, Sign In to add comment