Browse Source

* basic SQLAlchemy model

* menu handling code
 * SQLAlchemy setup in environent.py, base.py and websetup.py
master
Jan Dittberner 12 years ago
parent
commit
096df406b8
9 changed files with 125 additions and 5 deletions
  1. +2
    -0
      development.ini
  2. +5
    -0
      gnuviechadminweb/config/environment.py
  3. +0
    -1
      gnuviechadminweb/controllers/gva.py
  4. +13
    -4
      gnuviechadminweb/lib/base.py
  5. +8
    -0
      gnuviechadminweb/lib/helpers.py
  6. +15
    -0
      gnuviechadminweb/model/__init__.py
  7. +64
    -0
      gnuviechadminweb/model/menu.py
  8. +14
    -0
      gnuviechadminweb/model/meta.py
  9. +4
    -0
      gnuviechadminweb/websetup.py

+ 2
- 0
development.ini View File

@@ -33,6 +33,8 @@ beaker.session.secret = somesecret
# execute malicious code after an exception is raised.
#set debug = false

sqlalchemy.url = sqlite:///%(here)s/gvaweb.sqlite


# Logging configuration
[loggers]


+ 5
- 0
gnuviechadminweb/config/environment.py View File

@@ -7,6 +7,9 @@ import gnuviechadminweb.lib.app_globals as app_globals
import gnuviechadminweb.lib.helpers
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):
"""Configure the Pylons environment via the ``pylons.config``
object
@@ -31,3 +34,5 @@ def load_environment(global_conf, app_conf):

# CONFIGURATION OPTIONS HERE (note: all config options will override
# any Pylons config options)
engine = engine_from_config(config, 'sqlalchemy.')
init_model(engine)

+ 0
- 1
gnuviechadminweb/controllers/gva.py View File

@@ -6,7 +6,6 @@ from gnuviechadminweb.lib.base import *
log = logging.getLogger(__name__)

class GvaController(BaseController):

def index(self):
# Return a rendered template
return render('/main.mako')

+ 13
- 4
gnuviechadminweb/lib/base.py View File

@@ -12,15 +12,24 @@ from pylons.templating import render

import gnuviechadminweb.lib.helpers as h
import gnuviechadminweb.model as model
from gnuviechadminweb.model import meta

class BaseController(WSGIController):

def __call__(self, environ, start_response):
"""Invoke the Controller"""
# WSGIController.__call__ dispatches to the Controller method
# the request is routed to. This routing information is
# available in environ['pylons.routes_dict']
return WSGIController.__call__(self, environ, start_response)
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
# the request is routed to. This routing information is
# available in environ['pylons.routes_dict']
return WSGIController.__call__(self, environ, start_response)
finally:
meta.Session.remove()
conn.close()

# Include the '_' function in the public names
__all__ = [__name for __name in locals().keys() if not __name.startswith('_') \


+ 8
- 0
gnuviechadminweb/lib/helpers.py View File

@@ -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'.
"""
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))

+ 15
- 0
gnuviechadminweb/model/__init__.py View File

@@ -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
- 0
gnuviechadminweb/model/menu.py View 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
- 0
gnuviechadminweb/model/meta.py View 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()

+ 4
- 0
gnuviechadminweb/websetup.py View File

@@ -5,6 +5,7 @@ from paste.deploy import appconfig
from pylons import config

from gnuviechadminweb.config.environment import load_environment
from gnuviechadminweb.model import meta

log = logging.getLogger(__name__)

@@ -12,3 +13,6 @@ def setup_config(command, filename, section, vars):
"""Place any commands to setup gnuviechadminweb here"""
conf = appconfig('config:' + filename)
load_environment(conf.global_conf, conf.local_conf)
log.info("Creating tables")
meta.metadata.create_all(bind=meta.engine)
log.info("Successfully setup")

Loading…
Cancel
Save