Log:
The tables of a quickstarted project can now be created
with a given prefix via a tg-admin quickstart option (#1249).
Modified:
branches/1.5/turbogears/command/quickstart.py
branches/1.5/turbogears/qstemplates/quickstart/+package+/model.py_tmpl
branches/1.5/turbogears/testutil.py
Modified: branches/1.5/turbogears/command/quickstart.py
==============================================================================
--- branches/1.5/turbogears/command/quickstart.py Tue Mar 8 08:33:04 2011 (r7247)
+++ branches/1.5/turbogears/command/quickstart.py Tue Mar 8 09:39:01 2011 (r7248)
@@ -128,30 +128,33 @@
usage="%prog quickstart [options] [project name]",
version="%prog " + version)
parser.add_option("-s", "--sqlalchemy",
- help="use SQLAlchemy instead of SQLObject",
- action="store_true", dest="sqlalchemy", default = False)
+ help="use SQLAlchemy instead of SQLObject (the default)",
+ action="store_true", dest="sqlalchemy", default=False)
parser.add_option("-e", "--elixir",
help="use SQLAlchemy Elixir instead of SQLObject",
- action="store_true", dest="elixir", default = False)
+ action="store_true", dest="elixir", default=False)
parser.add_option("-o", "--sqlobject",
help="use SQLObject instead of SQLAlchemy",
- action="store_true", dest="sqlobject", default = False)
+ action="store_true", dest="sqlobject", default=False)
parser.add_option("-i", "--identity",
help="provide Identity support",
- action="store_true", dest="identity", default = False)
- parser.add_option(
- "", "--no-identity",
- help="Don't prompt for Identity support (ignored if -i is on)",
+ action="store_true", dest="identity", default=False)
+ parser.add_option("", "--no-identity",
+ help="don't prompt for Identity support (ignored with -i)",
action="store_false", dest="prompt_identity", default=True)
+ parser.add_option("", "--table-prefix",
+ help="add the specified prefix to all generated tables",
+ dest="table_prefix")
parser.add_option("-p", "--package",
help="package name for the code",
dest="package")
parser.add_option("-t", "--templates",
help="user specific templates",
- dest="templates", default = self.templates)
+ dest="templates", default=self.templates)
parser.add_option("-r", "--svn-repository", metavar="REPOS",
help="create project in given SVN repository",
- dest="svn_repository", default = self.svn_repository)
+ dest="svn_repository", default=self.svn_repository)
+
parser.add_option("--dry-run",
help="dry run (don't actually do anything)",
action="store_true", dest="dry_run")
@@ -159,7 +162,7 @@
options, args = parser.parse_args()
self.__dict__.update(options.__dict__)
- if not True in [self.elixir, self.sqlalchemy, self.sqlobject]:
+ if not True in (self.elixir, self.sqlalchemy, self.sqlobject):
self.sqlalchemy = True
if self.elixir:
@@ -170,6 +173,12 @@
if self.sqlobject:
self.sqlalchemy = False
+ if self.table_prefix:
+ self.table_prefix_always = self.table_prefix
+ else:
+ self.table_prefix_always = 'tg_'
+ self.table_prefix = ''
+
if args:
self.name = args[0]
self.turbogearsversion = version
@@ -249,6 +258,8 @@
cmd_args.append("elixir=%s" % self.elixir)
cmd_args.append("sqlobject=%s" % self.sqlobject)
cmd_args.append("identity=%s" % self.identity)
+ cmd_args.append("table_prefix=%s" % self.table_prefix)
+ cmd_args.append("table_prefix_always=%s" % self.table_prefix_always)
cmd_args.append("package=%s" % self.package)
# set the exact ORM-version for the proper requirements
# it's extracted from our own requirements, so looking
@@ -353,7 +364,7 @@
options, args = self.parser.parse_args()
self.__dict__.update(options.__dict__)
- if not True in [self.elixir, self.sqlalchemy, self.sqlobject]:
+ if not True in (self.elixir, self.sqlalchemy, self.sqlobject):
if turbogears.config.get('sqlobject.dburi'):
self.sqlobject = True
else:
Modified: branches/1.5/turbogears/qstemplates/quickstart/+package+/model.py_tmpl
==============================================================================
--- branches/1.5/turbogears/qstemplates/quickstart/+package+/model.py_tmpl Tue Mar 8 08:33:04 2011 (r7247)
+++ branches/1.5/turbogears/qstemplates/quickstart/+package+/model.py_tmpl Tue Mar 8 09:39:01 2011 (r7248)
@@ -104,9 +104,13 @@
#if $identity == 'sqlobject'
# the identity model
-
class Visit(SQLObject):
"""A visit to your site."""
+#if $table_prefix
+
+ class sqlmeta:
+ table = '${table_prefix}visit'
+#end if
visit_key = StringCol(length=40, alternateID=True,
alternateMethodName='by_visit_key')
@@ -123,6 +127,11 @@
class VisitIdentity(SQLObject):
"""A Visit that is linked to a User object."""
+#if $table_prefix
+
+ class sqlmeta:
+ table = '${table_prefix}visit_identity'
+#end if
visit_key = StringCol(length=40, alternateID=True,
alternateMethodName='by_visit_key')
@@ -131,11 +140,13 @@
class Group(SQLObject):
"""An ultra-simple Group definition."""
+#if $table_prefix_always
# names like "user" and "group" are reserved words in SQL
# so we set the name to something safe for SQL
class sqlmeta:
- table = 'tg_group'
+ table = '${table_prefix_always}group'
+#end if
def __repr__(self):
return '<Group: name="%s", display_name="%s">' % (
@@ -150,12 +161,12 @@
created = DateTimeCol(default=datetime.now)
# collection of all users belonging to this group
- users = RelatedJoin('User', intermediateTable='user_group',
+ users = RelatedJoin('User', intermediateTable='${table_prefix}user_group',
joinColumn='group_id', otherColumn='user_id')
# collection of all permissions for this group
permissions = RelatedJoin('Permission', joinColumn='group_id',
- intermediateTable='group_permission',
+ intermediateTable='${table_prefix}group_permission',
otherColumn='permission_id')
@@ -165,11 +176,13 @@
Probably would want additional attributes.
"""
+#if $table_prefix_always
# names like "user" and "group" are reserved words in SQL
# so we set the name to something safe for SQL
class sqlmeta:
- table = 'tg_user'
+ table = '${table_prefix_always}user'
+#end if
user_name = UnicodeCol(length=16, alternateID=True,
alternateMethodName='by_user_name')
@@ -180,7 +193,7 @@
created = DateTimeCol(default=datetime.now)
# groups this user belongs to
- groups = RelatedJoin('Group', intermediateTable='user_group',
+ groups = RelatedJoin('Group', intermediateTable='${table_prefix}user_group',
joinColumn='user_id', otherColumn='group_id')
def __repr__(self):
@@ -208,13 +221,18 @@
class Permission(SQLObject):
"""A relationship that determines what each Group can do."""
+#if $table_prefix
+
+ class sqlmeta:
+ table = '${table_prefix}permission'
+#end if
permission_name = UnicodeCol(length=16, alternateID=True,
alternateMethodName='by_permission_name')
description = UnicodeCol(length=255)
groups = RelatedJoin('Group',
- intermediateTable='group_permission',
+ intermediateTable='${table_prefix}group_permission',
joinColumn='permission_id',
otherColumn='group_id')
@@ -231,7 +249,7 @@
class Visit(Entity):
"""A visit to your site."""
- using_options(tablename='visit')
+ using_options(tablename='${table_prefix}visit')
visit_key = Field(String(40), primary_key=True)
created = Field(DateTime, nullable=False, default=datetime.now)
@@ -240,13 +258,14 @@
@classmethod
def lookup_visit(cls, visit_key):
return Visit.get(visit_key)
+
by_visit_key = lookup_visit
class VisitIdentity(Entity):
"""A Visit that is linked to a User object."""
- using_options(tablename='visit_identity')
+ using_options(tablename='${table_prefix}visit_identity')
visit_key = Field(String(40), primary_key=True)
user = ManyToOne('User', colname='user_id', use_alter=True)
@@ -260,14 +279,14 @@
class Group(Entity):
"""An ultra-simple Group definition."""
- using_options(tablename='tg_group')
+ using_options(tablename='${table_prefix_always}group')
group_id = Field(Integer, primary_key=True)
group_name = Field(Unicode(16), unique=True, nullable=False)
display_name = Field(Unicode(255))
created = Field(DateTime, default=datetime.now)
- users = ManyToMany('User', tablename='user_group')
- permissions = ManyToMany('Permission', tablename='group_permission')
+ users = ManyToMany('User', tablename='${table_prefix}user_group')
+ permissions = ManyToMany('Permission', tablename='${table_prefix}group_permission')
def __repr__(self):
return '<Group: name="%s", display_name="%s">' % (
@@ -280,6 +299,7 @@
def by_group_name(cls, group_name):
"""Look up Group by given group name."""
return cls.get_by(group_name=group_name)
+
by_name = by_group_name
@@ -290,7 +310,7 @@
"""
- using_options(tablename='tg_user')
+ using_options(tablename='${table_prefix_always}user')
user_id = Field(Integer, primary_key=True)
user_name = Field(Unicode(16), unique=True, nullable=False)
@@ -298,7 +318,7 @@
display_name = Field(Unicode(255))
_password = Field(Unicode(40), colname='password')
created = Field(DateTime, default=datetime.now)
- groups = ManyToMany('Group', tablename='user_group')
+ groups = ManyToMany('Group', tablename='${table_prefix}user_group')
def __repr__(self):
return '<User: name="%s", email="%s", display name="%s">' % (
@@ -333,6 +353,7 @@
"""
return cls.get_by(user_name=user_name)
+
by_name = by_user_name
def _set_password(self, password):
@@ -349,12 +370,12 @@
class Permission(Entity):
"""A relationship that determines what each Group can do."""
- using_options(tablename='permission')
+ using_options(tablename='${table_prefix}permission')
permission_id = Field(Integer, primary_key=True)
permission_name = Field(Unicode(16), unique=True, nullable=False)
description = Field(Unicode(255))
- groups = ManyToMany('Group', tablename='group_permission')
+ groups = ManyToMany('Group', tablename='${table_prefix}group_permission')
def __repr__(self):
return '<Permission: name="%s">' % self.permission_name
@@ -366,29 +387,30 @@
def by_permission_name(cls, permission_name):
"""Look up Permission by given permission name."""
return cls.get_by(permission_name=permission_name)
+
by_name = by_permission_name
#else
# the identity schema
-visits_table = Table('visit', metadata,
+visits_table = Table('${table_prefix}visit', metadata,
Column('visit_key', String(40), primary_key=True),
Column('created', DateTime, nullable=False, default=datetime.now),
Column('expiry', DateTime)
)
-visit_identity_table = Table('visit_identity', metadata,
+visit_identity_table = Table('${table_prefix}visit_identity', metadata,
Column('visit_key', String(40), primary_key=True),
Column('user_id', Integer, ForeignKey('tg_user.user_id'), index=True)
)
-groups_table = Table('tg_group', metadata,
+groups_table = Table('${table_prefix_always}group', metadata,
Column('group_id', Integer, primary_key=True),
Column('group_name', Unicode(16), unique=True, nullable=False),
Column('display_name', Unicode(255)),
Column('created', DateTime, default=datetime.now)
)
-users_table = Table('tg_user', metadata,
+users_table = Table('${table_prefix_always}user', metadata,
Column('user_id', Integer, primary_key=True),
Column('user_name', Unicode(16), unique=True, nullable=False),
Column('email_address', Unicode(255), unique=True),
@@ -397,23 +419,23 @@
Column('created', DateTime, default=datetime.now)
)
-permissions_table = Table('permission', metadata,
+permissions_table = Table('${table_prefix}permission', metadata,
Column('permission_id', Integer, primary_key=True),
Column('permission_name', Unicode(16), unique=True, nullable=False),
Column('description', Unicode(255))
)
-user_group_table = Table('user_group', metadata,
- Column('user_id', Integer, ForeignKey('tg_user.user_id',
+user_group_table = Table('${table_prefix}user_group', metadata,
+ Column('user_id', Integer, ForeignKey('${table_prefix_always}user.user_id',
onupdate='CASCADE', ondelete='CASCADE'), primary_key=True),
- Column('group_id', Integer, ForeignKey('tg_group.group_id',
+ Column('group_id', Integer, ForeignKey('${table_prefix_always}group.group_id',
onupdate='CASCADE', ondelete='CASCADE'), primary_key=True)
)
-group_permission_table = Table('group_permission', metadata,
- Column('group_id', Integer, ForeignKey('tg_group.group_id',
+group_permission_table = Table('${table_prefix}group_permission', metadata,
+ Column('group_id', Integer, ForeignKey('${table_prefix_always}group.group_id',
onupdate='CASCADE', ondelete='CASCADE'), primary_key=True),
- Column('permission_id', Integer, ForeignKey('permission.permission_id',
+ Column('permission_id', Integer, ForeignKey('${table_prefix}permission.permission_id',
onupdate='CASCADE', ondelete='CASCADE'), primary_key=True)
)
@@ -452,6 +474,7 @@
def by_group_name(cls, group_name):
"""Look up Group by given group name."""
return session.query(cls).filter_by(group_name=group_name).first()
+
by_name = by_group_name
@@ -496,6 +519,7 @@
"""
return session.query(cls).filter_by(user_name=user_name).first()
+
by_name = by_user_name
def _set_password(self, password):
@@ -522,6 +546,7 @@
def by_permission_name(cls, permission_name):
"""Look up Permission by given permission name."""
return session.query(cls).filter_by(permission_name=permission_name).first()
+
by_name = by_permission_name
@@ -530,25 +555,27 @@
mapper(Visit, visits_table)
mapper(VisitIdentity, visit_identity_table,
- properties=dict(user=relation(User, backref='visit_identity')))
+ properties=dict(user=relation(User, backref='visit_identity')))
mapper(User, users_table,
- properties=dict(_password=users_table.c.password))
+ properties=dict(_password=users_table.c.password))
mapper(Group, groups_table,
- properties=dict(users=relation(User,
- secondary=user_group_table, backref='groups')))
+ properties=dict(users=relation(User,
+ secondary=user_group_table, backref='groups')))
mapper(Permission, permissions_table,
- properties=dict(groups=relation(Group,
- secondary=group_permission_table, backref='permissions')))
+ properties=dict(groups=relation(Group,
+ secondary=group_permission_table, backref='permissions')))
#end if
#end if
#if $elixir == 'True'
+
# set up all Elixir entities declared above
setup_all()
+
#end if
# functions for populating the database
@@ -596,8 +623,6 @@
"""
#if $sqlobject == 'True'
- ## XXX: This is duplicated from testutil.DBTestSO and should be factored
- ## out to a reusable function (maybe into turbogears.database?).
from turbogears.util import get_model
from inspect import isclass
@@ -615,22 +640,24 @@
if drop_all:
print "Dropping all database tables defined in model."
for item in reversed(so_classes):
- if isclass(item) and issubclass(item, SQLObject) and \
- item is not SQLObject and item is not InheritableSQLObject:
+ if (isclass(item) and issubclass(item, SQLObject)
+ and item is not SQLObject
+ and item is not InheritableSQLObject):
item.dropTable(ifExists=True, cascade=True)
# list of constraints we will collect
constraints = list()
for item in so_classes:
- if isclass(item) and issubclass(item, SQLObject) and \
- item is not SQLObject and item is not InheritableSQLObject:
+ if (isclass(item) and issubclass(item, SQLObject)
+ and item is not SQLObject
+ and item is not InheritableSQLObject):
# create table without applying constraints, collect
# all the constaints for later creation.
# see http://sqlobject.org/FAQ.html#mutually-referencing-tables
# for more info
- collected_constraints = item.createTable(ifNotExists=True,
- applyConstraints=False)
+ collected_constraints = item.createTable(
+ ifNotExists=True, applyConstraints=False)
if collected_constraints:
constraints.extend(collected_constraints)
Modified: branches/1.5/turbogears/testutil.py
==============================================================================
--- branches/1.5/turbogears/testutil.py Tue Mar 8 08:33:04 2011 (r7247)
+++ branches/1.5/turbogears/testutil.py Tue Mar 8 09:39:01 2011 (r7248)
@@ -325,9 +325,10 @@
constraints = list()
for item in self._get_soClasses():
- if isinstance(item, types.TypeType) and issubclass(item,
- sqlobject.SQLObject) and item != sqlobject.SQLObject \
- and item != InheritableSQLObject:
+ if (isinstance(item, types.TypeType)
+ and issubclass(item, sqlobject.SQLObject)
+ and item is not sqlobject.SQLObject
+ and item is not InheritableSQLObject):
# create table without applying constraints, collect
# all the constraints for later creation.
# see http://sqlobject.org/FAQ.html#mutually-referencing-tables
@@ -346,9 +347,10 @@
def tearDown(self):
database.rollback_all()
for item in reversed(self._get_soClasses()):
- if isinstance(item, types.TypeType) and issubclass(item,
- sqlobject.SQLObject) and item != sqlobject.SQLObject \
- and item != InheritableSQLObject:
+ if (isinstance(item, types.TypeType)
+ and issubclass(item, sqlobject.SQLObject)
+ and item is not sqlobject.SQLObject
+ and item is not InheritableSQLObject):
item.dropTable(ifExists=True, cascade=True)