stepz on #sqlalchemy helped me to get my mind together and followed me
through setting up all shown bellow:
-------8<-------8<-------8<-------8<-------8<-------8<-------8<-------8<-------8<-------
from pylons import config
#from oil.lib.helpers import url_for
#from sqlalchemy import Column, MetaData, Table, types
import sqlalchemy as sqla
from sqlalchemy.orm import mapper, relation
from sqlalchemy.orm import scoped_session, sessionmaker
import datetime
from pytz import UTC

# Global session manager.
#S ession() returns the session object appropriate for the current web
request.
Session = scoped_session(sessionmaker(autoflush=True,
                                      transactional=True,
 
bind=config['pylons.g'].sa_engine))


# Global metadata.
# If you have multiple databases with overlapping table names, you'll
need a
# metadata for each database.
metadata = sqla.MetaData()

users = sqla.Table('users', metadata,
    sqla.Column('id', sqla.Integer, primary_key=True,
autoincrement=True),
    sqla.Column('name', sqla.Unicode(60), nullable=False,
unique=True),
    sqla.Column('openid', sqla.String),
    sqla.Column('slug', sqla.String),
    sqla.Column('signup', sqla.DateTime(timezone=True),
nullable=False),
    sqla.Column('lastlogin', sqla.DateTime(timezone=True),
nullable=False),
    sqla.Column('email', sqla.Unicode, nullable=True, unique=True),
    sqla.Column('banned', sqla.Boolean, nullable=False,
default=False),
    sqla.Column('type', sqla.String(7), nullable=False,
default="user"),
    sqla.Column('language', sqla.Unicode, nullable=True,
default="en"),
    sqla.Column('tzinfo', sqla.Unicode, nullable=True, default="UTC"),

)

class User(object):
    def __init__(self, openid, name=None):
        self.openid = openid
        self.name = name if name is not None else openid
        self.signup = datetime.datetime.utcnow()
        self.updatelastlogin()
    def __unicode__(self):
        return self.name
    def updatelastlogin(self):
        self.lastlogin = datetime.datetime.utcnow()
    def is_admin(self):
        return self.type == 'admin'
    def is_manager(self):
        return self.type == 'manager'


bots = sqla.Table('bots', metadata,
    sqla.Column('name', sqla.Unicode, nullable=False, unique=True,
primary_key=True),
    sqla.Column('user_id', sqla.Integer, sqla.ForeignKey('users.id'))
)

class Bot(object):
    def __init__(self, name):
        self.name = name


networks = sqla.Table('networks', metadata,
    sqla.Column('name', sqla.Unicode, nullable=False, unique=True,
primary_key=True),
    sqla.Column('address', sqla.Unicode, nullable=False,
unique=False),
    sqla.Column('port', sqla.Integer, nullable=False, unique=False),
)

class Network(object):
    def __init__(self, address, port):
        self.address = address
        self.port = port
        self.name = u'%s-%s' % (address, port)
    def __unicode__(self):
        return '%s:%s' % (self.address, self.port)
    def __repr__(self):
        return '<IRC Network: %s:%s>' % (self.address, self.port)

bots_on_network = sqla.Table('bots_on_network', metadata,
    sqla.Column('id', sqla.Integer, primary_key=True,
autoincrement=True),
    sqla.Column('network_name', sqla.Integer,
sqla.ForeignKey('networks.name')),
    sqla.Column('bot_name', sqla.Integer,
sqla.ForeignKey('bots.name')),
    sqla.Column('nick', sqla.Unicode, nullable=False, unique=True),
    sqla.Column('passwd', sqla.Unicode, nullable=True, unique=False),
)

class BotsOnNetwork(object):
    pass


channels = sqla.Table('channels', metadata,
    sqla.Column('network_name', sqla.Integer,
sqla.ForeignKey('networks.name'),
                primary_key=True),
    sqla.Column('channel_name', sqla.Unicode, primary_key=True),
    sqla.Column('topic', sqla.Unicode, nullable=True, unique=False),
    sqla.Column('first_entry', sqla.Date, nullable=True,
unique=False),
    sqla.Column('last_entry', sqla.Date, nullable=True, unique=False),
    sqla.PrimaryKeyConstraint('network_name', 'channel_name')
)

class Channel(object):
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        network =
Session.query(Network).filter_by(id=self.network_name).first()
        return "<IRC Channel: '%s' on '%s:%d'>" % (
            self.name, network.address, network.port
        )

    def __unicode__(self):
        return self.name


bots_on_channels = sqla.Table('bots_on_channels', metadata,
    sqla.Column('network_name', sqla.Integer),
    sqla.Column('channel_name', sqla.Integer),
    sqla.Column('bots_on_network_id', sqla.Integer,
                sqla.ForeignKey('bots_on_network.id')),
 
sqla.PrimaryKeyConstraint('bots_on_network_id','network_name','channel_name'),
    sqla.ForeignKeyConstraint(['network_name','channel_name'],
 
['channels.network_name','channels.channel_name'])
)


class BotsOnChannels(object):
    pass

mapper(User, users, order_by=[sqla.asc(users.c.name)])

mapper(Bot, bots, order_by=[sqla.asc(bots.c.name)],
       properties=dict(
            manager=relation(User, backref='bots'),
            networks=relation(BotsOnNetwork, backref='bots'),
       )
)

mapper(BotsOnNetwork, bots_on_network,
       order_by=[sqla.asc(bots_on_network.c.id)],
       properties=dict(
            channels=relation(BotsOnChannels, backref='bots_on_netw'),
       )

)

mapper(BotsOnChannels, bots_on_channels,
       order_by=[sqla.asc(bots_on_channels.c.bots_on_network_id)],
)
-------8<-------8<-------8<-------8<-------8<-------8<-------8<-------8<-------8<-------
Ie, how it should be, unfortunately I sitll fail to know how to
relation() all this....
Any good pointers would be wonderfull, and your also allowed to joke
on me ;)

Regards,
--
Pedro Algarvio
   __ ___  ___ _______        ___ __
|   Y   .'  _|   _   .-----.'  _|  |_   .-----.----.-----.
|.  |   |   _|   1___|  _  |   _|   _|__|  _  |   _|  _  |
|.  |   |__| |____   |_____|__| |____|__|_____|__| |___  |
|:  1   |    |:  1   |                             |_____|
|::.. . |    |::.. . |  ufs [AT] ufsoft [DOT] org
`-------'    `-------'    ufs [AT] sapo [DOT] pt


--~--~---------~--~----~------------~-------~--~----~
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