* basic SQLAlchemy model
* menu handling code * SQLAlchemy setup in environent.py, base.py and websetup.py
This commit is contained in:
parent
292c102db8
commit
096df406b8
9 changed files with 125 additions and 5 deletions
|
@ -33,6 +33,8 @@ beaker.session.secret = somesecret
|
||||||
# execute malicious code after an exception is raised.
|
# execute malicious code after an exception is raised.
|
||||||
#set debug = false
|
#set debug = false
|
||||||
|
|
||||||
|
sqlalchemy.url = sqlite:///%(here)s/gvaweb.sqlite
|
||||||
|
|
||||||
|
|
||||||
# Logging configuration
|
# Logging configuration
|
||||||
[loggers]
|
[loggers]
|
||||||
|
|
|
@ -7,6 +7,9 @@ import gnuviechadminweb.lib.app_globals as app_globals
|
||||||
import gnuviechadminweb.lib.helpers
|
import gnuviechadminweb.lib.helpers
|
||||||
from gnuviechadminweb.config.routing import make_map
|
from gnuviechadminweb.config.routing import make_map
|
||||||
|
|
||||||
|
from sqlalchemy import engine_from_config
|
||||||
|
from gnuviechadminweb.model import init_model
|
||||||
|
|
||||||
def load_environment(global_conf, app_conf):
|
def load_environment(global_conf, app_conf):
|
||||||
"""Configure the Pylons environment via the ``pylons.config``
|
"""Configure the Pylons environment via the ``pylons.config``
|
||||||
object
|
object
|
||||||
|
@ -31,3 +34,5 @@ def load_environment(global_conf, app_conf):
|
||||||
|
|
||||||
# CONFIGURATION OPTIONS HERE (note: all config options will override
|
# CONFIGURATION OPTIONS HERE (note: all config options will override
|
||||||
# any Pylons config options)
|
# any Pylons config options)
|
||||||
|
engine = engine_from_config(config, 'sqlalchemy.')
|
||||||
|
init_model(engine)
|
||||||
|
|
|
@ -6,7 +6,6 @@ from gnuviechadminweb.lib.base import *
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
class GvaController(BaseController):
|
class GvaController(BaseController):
|
||||||
|
|
||||||
def index(self):
|
def index(self):
|
||||||
# Return a rendered template
|
# Return a rendered template
|
||||||
return render('/main.mako')
|
return render('/main.mako')
|
||||||
|
|
|
@ -12,15 +12,24 @@ from pylons.templating import render
|
||||||
|
|
||||||
import gnuviechadminweb.lib.helpers as h
|
import gnuviechadminweb.lib.helpers as h
|
||||||
import gnuviechadminweb.model as model
|
import gnuviechadminweb.model as model
|
||||||
|
from gnuviechadminweb.model import meta
|
||||||
|
|
||||||
class BaseController(WSGIController):
|
class BaseController(WSGIController):
|
||||||
|
|
||||||
def __call__(self, environ, start_response):
|
def __call__(self, environ, start_response):
|
||||||
"""Invoke the Controller"""
|
"""Invoke the Controller"""
|
||||||
|
conn = meta.engine.connect()
|
||||||
|
meta.Session.configure(bind=conn)
|
||||||
|
c.menu = model.Menu.allowed(session['user'] if 'user' in session \
|
||||||
|
else None)
|
||||||
|
try:
|
||||||
# WSGIController.__call__ dispatches to the Controller method
|
# WSGIController.__call__ dispatches to the Controller method
|
||||||
# the request is routed to. This routing information is
|
# the request is routed to. This routing information is
|
||||||
# available in environ['pylons.routes_dict']
|
# available in environ['pylons.routes_dict']
|
||||||
return WSGIController.__call__(self, environ, start_response)
|
return WSGIController.__call__(self, environ, start_response)
|
||||||
|
finally:
|
||||||
|
meta.Session.remove()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
# Include the '_' function in the public names
|
# Include the '_' function in the public names
|
||||||
__all__ = [__name for __name in locals().keys() if not __name.startswith('_') \
|
__all__ = [__name for __name in locals().keys() if not __name.startswith('_') \
|
||||||
|
|
|
@ -4,3 +4,11 @@ Consists of functions to typically be used within templates, but also
|
||||||
available to Controllers. This module is available to both as 'h'.
|
available to Controllers. This module is available to both as 'h'.
|
||||||
"""
|
"""
|
||||||
from webhelpers import *
|
from webhelpers import *
|
||||||
|
|
||||||
|
def cssclasses(menuitem):
|
||||||
|
cssclassnames=['menuitem']
|
||||||
|
return " ".join(cssclassnames)
|
||||||
|
|
||||||
|
def menulink(menuitem):
|
||||||
|
return link_to(menuitem.title, url(controller=menuitem.controller,
|
||||||
|
action=menuitem.action))
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy import orm
|
||||||
|
|
||||||
|
from gnuviechadminweb.model import meta
|
||||||
|
|
||||||
|
def init_model(engine):
|
||||||
|
"""Call me before using any of the tables or classes in the model."""
|
||||||
|
|
||||||
|
sm = orm.sessionmaker(autoflush=True, transactional=True, bind=engine)
|
||||||
|
|
||||||
|
meta.engine = engine
|
||||||
|
meta.Session = orm.scoped_session(sm)
|
||||||
|
|
||||||
|
from gnuviechadminweb.model import menu
|
||||||
|
from gnuviechadminweb.model.menu import Menu, User, Role
|
64
gnuviechadminweb/model/menu.py
Normal file
64
gnuviechadminweb/model/menu.py
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
# -*- python -*-
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy import orm
|
||||||
|
|
||||||
|
from gnuviechadminweb.model import meta
|
||||||
|
|
||||||
|
t_menu = \
|
||||||
|
sa.Table("menu", meta.metadata,
|
||||||
|
sa.Column("id", sa.types.Integer, primary_key=True),
|
||||||
|
sa.Column("title", sa.types.String(40), nullable=False),
|
||||||
|
sa.Column("controller", sa.types.String(40), nullable=False),
|
||||||
|
sa.Column("action", sa.types.String(40), nullable=False)
|
||||||
|
)
|
||||||
|
|
||||||
|
t_user = \
|
||||||
|
sa.Table("user", meta.metadata,
|
||||||
|
sa.Column("id", sa.types.Integer, primary_key=True),
|
||||||
|
sa.Column("name", sa.types.String(40), nullable=False),
|
||||||
|
sa.Column("password", sa.types.String(128), nullable=False)
|
||||||
|
)
|
||||||
|
|
||||||
|
t_role = \
|
||||||
|
sa.Table("role", meta.metadata,
|
||||||
|
sa.Column("id", sa.types.Integer, primary_key=True),
|
||||||
|
sa.Column("name", sa.types.String(40), nullable=False)
|
||||||
|
)
|
||||||
|
|
||||||
|
t_menu_role = \
|
||||||
|
sa.Table("menu_role", meta.metadata,
|
||||||
|
sa.Column("id", sa.types.Integer, primary_key=True),
|
||||||
|
sa.Column("menu_id", sa.types.Integer, sa.ForeignKey(t_menu.c.id)),
|
||||||
|
sa.Column("role_id", sa.types.Integer, sa.ForeignKey(t_role.c.id))
|
||||||
|
)
|
||||||
|
|
||||||
|
t_user_role = \
|
||||||
|
sa.Table("user_role", meta.metadata,
|
||||||
|
sa.Column("id", sa.types.Integer, primary_key=True),
|
||||||
|
sa.Column("user_id", sa.types.Integer, sa.ForeignKey(t_user.c.id)),
|
||||||
|
sa.Column("role_id", sa.types.Integer, sa.ForeignKey(t_role.c.id))
|
||||||
|
)
|
||||||
|
|
||||||
|
class Menu(object):
|
||||||
|
@classmethod
|
||||||
|
def allowed(cls, user=None):
|
||||||
|
menu_q = meta.Session.query(cls)
|
||||||
|
return menu_q.all()
|
||||||
|
|
||||||
|
class User(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Role(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
orm.mapper(Menu, t_menu, {
|
||||||
|
'roles' : orm.relation(Role, secondary = t_menu_role),
|
||||||
|
})
|
||||||
|
orm.mapper(Role, t_role, properties = {
|
||||||
|
'users' : orm.relation(User, secondary = t_user_role),
|
||||||
|
'menus' : orm.relation(Menu, secondary = t_menu_role),
|
||||||
|
})
|
||||||
|
orm.mapper(User, t_role, properties = {
|
||||||
|
'roles' : orm.relation(User, secondary = t_user_role)
|
||||||
|
})
|
14
gnuviechadminweb/model/meta.py
Normal file
14
gnuviechadminweb/model/meta.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
"""SQLAlchemy Metadata and Session object"""
|
||||||
|
from sqlalchemy import MetaData
|
||||||
|
|
||||||
|
__all__ = ['engine', 'metadata', 'Session']
|
||||||
|
|
||||||
|
# SQLAlchemy database engine. Updated by model.init_model().
|
||||||
|
engine = None
|
||||||
|
|
||||||
|
# SQLAlchemy session manager. Updated by model.init_model().
|
||||||
|
Session = None
|
||||||
|
|
||||||
|
# Global metadata. If you have multiple databases with overlapping table
|
||||||
|
# names, you'll need a metadata for each database.
|
||||||
|
metadata = MetaData()
|
|
@ -5,6 +5,7 @@ from paste.deploy import appconfig
|
||||||
from pylons import config
|
from pylons import config
|
||||||
|
|
||||||
from gnuviechadminweb.config.environment import load_environment
|
from gnuviechadminweb.config.environment import load_environment
|
||||||
|
from gnuviechadminweb.model import meta
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -12,3 +13,6 @@ def setup_config(command, filename, section, vars):
|
||||||
"""Place any commands to setup gnuviechadminweb here"""
|
"""Place any commands to setup gnuviechadminweb here"""
|
||||||
conf = appconfig('config:' + filename)
|
conf = appconfig('config:' + filename)
|
||||||
load_environment(conf.global_conf, conf.local_conf)
|
load_environment(conf.global_conf, conf.local_conf)
|
||||||
|
log.info("Creating tables")
|
||||||
|
meta.metadata.create_all(bind=meta.engine)
|
||||||
|
log.info("Successfully setup")
|
||||||
|
|
Loading…
Reference in a new issue