From d20282e5b5b6d37183f7ab70226b319d8d8dc0eb Mon Sep 17 00:00:00 2001 From: Marcin Lulek Date: Wed, 21 Oct 2015 21:15:57 +0200 Subject: alchemy: change file structure to modules for views and models --- pyramid/scaffolds/alchemy/+package+/__init__.py | 2 +- pyramid/scaffolds/alchemy/+package+/models.py | 62 ---------------------- .../scaffolds/alchemy/+package+/models/__init__.py | 3 ++ pyramid/scaffolds/alchemy/+package+/models/meta.py | 47 ++++++++++++++++ .../scaffolds/alchemy/+package+/models/mymodel.py | 16 ++++++ .../alchemy/+package+/scripts/initializedb.py | 4 +- pyramid/scaffolds/alchemy/+package+/tests.py_tmpl | 14 ++--- pyramid/scaffolds/alchemy/+package+/views.py_tmpl | 33 ------------ .../scaffolds/alchemy/+package+/views/__init__.py | 0 .../alchemy/+package+/views/default.py_tmpl | 33 ++++++++++++ 10 files changed, 109 insertions(+), 105 deletions(-) delete mode 100644 pyramid/scaffolds/alchemy/+package+/models.py create mode 100644 pyramid/scaffolds/alchemy/+package+/models/__init__.py create mode 100644 pyramid/scaffolds/alchemy/+package+/models/meta.py create mode 100644 pyramid/scaffolds/alchemy/+package+/models/mymodel.py delete mode 100644 pyramid/scaffolds/alchemy/+package+/views.py_tmpl create mode 100644 pyramid/scaffolds/alchemy/+package+/views/__init__.py create mode 100644 pyramid/scaffolds/alchemy/+package+/views/default.py_tmpl diff --git a/pyramid/scaffolds/alchemy/+package+/__init__.py b/pyramid/scaffolds/alchemy/+package+/__init__.py index 116839351..06ca7580d 100644 --- a/pyramid/scaffolds/alchemy/+package+/__init__.py +++ b/pyramid/scaffolds/alchemy/+package+/__init__.py @@ -5,7 +5,7 @@ def main(global_config, **settings): """ config = Configurator(settings=settings) config.include('pyramid_chameleon') - config.include('.models') + config.include('.models.meta') config.add_static_view('static', 'static', cache_max_age=3600) config.add_route('home', '/') config.scan() diff --git a/pyramid/scaffolds/alchemy/+package+/models.py b/pyramid/scaffolds/alchemy/+package+/models.py deleted file mode 100644 index 832e67b37..000000000 --- a/pyramid/scaffolds/alchemy/+package+/models.py +++ /dev/null @@ -1,62 +0,0 @@ -from sqlalchemy import ( - Column, - Index, - Integer, - Text, - ) - -from sqlalchemy import engine_from_config -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker -from sqlalchemy.schema import MetaData -import zope.sqlalchemy - -NAMING_CONVENTION = { - "ix": 'ix_%(column_0_label)s', - "uq": "uq_%(table_name)s_%(column_0_name)s", - "ck": "ck_%(table_name)s_%(constraint_name)s", - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", - "pk": "pk_%(table_name)s" -} - -metadata = MetaData(naming_convention=NAMING_CONVENTION) -Base = declarative_base(metadata=metadata) - - -def includeme(config): - settings = config.get_settings() - dbmaker = get_dbmaker(get_engine(settings)) - - config.add_request_method( - lambda r: get_session(r.tm, dbmaker), - 'dbsession', - reify=True - ) - - config.include('pyramid_tm') - - -def get_session(transaction_manager, dbmaker): - dbsession = dbmaker() - zope.sqlalchemy.register(dbsession, transaction_manager=transaction_manager) - return dbsession - - -def get_engine(settings, prefix='sqlalchemy.'): - return engine_from_config(settings, prefix) - - -def get_dbmaker(engine): - dbmaker = sessionmaker() - dbmaker.configure(bind=engine) - return dbmaker - - -class MyModel(Base): - __tablename__ = 'models' - id = Column(Integer, primary_key=True) - name = Column(Text) - value = Column(Integer) - - -Index('my_index', MyModel.name, unique=True, mysql_length=255) diff --git a/pyramid/scaffolds/alchemy/+package+/models/__init__.py b/pyramid/scaffolds/alchemy/+package+/models/__init__.py new file mode 100644 index 000000000..01c31e497 --- /dev/null +++ b/pyramid/scaffolds/alchemy/+package+/models/__init__.py @@ -0,0 +1,3 @@ +# import all models classes here for sqlalchemy mappers +# to pick up +from .mymodel import MyModel diff --git a/pyramid/scaffolds/alchemy/+package+/models/meta.py b/pyramid/scaffolds/alchemy/+package+/models/meta.py new file mode 100644 index 000000000..f66d1e5ec --- /dev/null +++ b/pyramid/scaffolds/alchemy/+package+/models/meta.py @@ -0,0 +1,47 @@ +from sqlalchemy import engine_from_config +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker +from sqlalchemy.schema import MetaData +import zope.sqlalchemy + +NAMING_CONVENTION = { + "ix": 'ix_%(column_0_label)s', + "uq": "uq_%(table_name)s_%(column_0_name)s", + "ck": "ck_%(table_name)s_%(constraint_name)s", + "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", + "pk": "pk_%(table_name)s" +} + +metadata = MetaData(naming_convention=NAMING_CONVENTION) +Base = declarative_base(metadata=metadata) + + +def includeme(config): + settings = config.get_settings() + dbmaker = get_dbmaker(get_engine(settings)) + + config.add_request_method( + lambda r: get_session(r.tm, dbmaker), + 'dbsession', + reify=True + ) + + config.include('pyramid_tm') + + +def get_session(transaction_manager, dbmaker): + dbsession = dbmaker() + zope.sqlalchemy.register(dbsession, transaction_manager=transaction_manager) + return dbsession + + +def get_engine(settings, prefix='sqlalchemy.'): + return engine_from_config(settings, prefix) + + +def get_dbmaker(engine): + dbmaker = sessionmaker() + dbmaker.configure(bind=engine) + return dbmaker + + diff --git a/pyramid/scaffolds/alchemy/+package+/models/mymodel.py b/pyramid/scaffolds/alchemy/+package+/models/mymodel.py new file mode 100644 index 000000000..b4191aa55 --- /dev/null +++ b/pyramid/scaffolds/alchemy/+package+/models/mymodel.py @@ -0,0 +1,16 @@ +from .meta import Base +from sqlalchemy import ( + Column, + Index, + Integer, + Text, +) + +class MyModel(Base): + __tablename__ = 'models' + id = Column(Integer, primary_key=True) + name = Column(Text) + value = Column(Integer) + + +Index('my_index', MyModel.name, unique=True, mysql_length=255) diff --git a/pyramid/scaffolds/alchemy/+package+/scripts/initializedb.py b/pyramid/scaffolds/alchemy/+package+/scripts/initializedb.py index 43e25bff8..f0d09729e 100644 --- a/pyramid/scaffolds/alchemy/+package+/scripts/initializedb.py +++ b/pyramid/scaffolds/alchemy/+package+/scripts/initializedb.py @@ -9,13 +9,13 @@ from pyramid.paster import ( from pyramid.scripts.common import parse_vars -from ..models import ( - MyModel, +from ..models.meta import ( Base, get_session, get_engine, get_dbmaker, ) +from ..models.mymodel import MyModel def usage(argv): diff --git a/pyramid/scaffolds/alchemy/+package+/tests.py_tmpl b/pyramid/scaffolds/alchemy/+package+/tests.py_tmpl index 4ce706077..074c7a773 100644 --- a/pyramid/scaffolds/alchemy/+package+/tests.py_tmpl +++ b/pyramid/scaffolds/alchemy/+package+/tests.py_tmpl @@ -13,10 +13,10 @@ class BaseTest(unittest.TestCase): self.config = testing.setUp(settings={ 'sqlalchemy.url': 'sqlite:///:memory:' }) - self.config.include('.models') + self.config.include('.models.meta') settings = self.config.get_settings() - from .models import ( + from .models.meta import ( get_session, get_engine, get_dbmaker, @@ -28,11 +28,11 @@ class BaseTest(unittest.TestCase): self.session = get_session(transaction.manager, dbmaker) def init_database(self): - from .models import Base + from .models.meta import Base Base.metadata.create_all(self.engine) def tearDown(self): - from .models import Base + from .models.meta import Base testing.tearDown() transaction.abort() @@ -45,13 +45,13 @@ class TestMyViewSuccessCondition(BaseTest): super(TestMyViewSuccessCondition, self).setUp() self.init_database() - from .models import MyModel + from .models.mymodel import MyModel model = MyModel(name='one', value=55) self.session.add(model) def test_passing_view(self): - from .views import my_view + from .views.default import my_view info = my_view(dummy_request(self.session)) self.assertEqual(info['one'].name, 'one') self.assertEqual(info['project'], '{{project}}') @@ -60,6 +60,6 @@ class TestMyViewSuccessCondition(BaseTest): class TestMyViewFailureCondition(BaseTest): def test_failing_view(self): - from .views import my_view + from .views.default import my_view info = my_view(dummy_request(self.session)) self.assertEqual(info.status_int, 500) diff --git a/pyramid/scaffolds/alchemy/+package+/views.py_tmpl b/pyramid/scaffolds/alchemy/+package+/views.py_tmpl deleted file mode 100644 index b559b31ce..000000000 --- a/pyramid/scaffolds/alchemy/+package+/views.py_tmpl +++ /dev/null @@ -1,33 +0,0 @@ -from pyramid.response import Response -from pyramid.view import view_config - -from sqlalchemy.exc import DBAPIError - -from .models import MyModel - - -@view_config(route_name='home', renderer='templates/mytemplate.pt') -def my_view(request): - try: - one = request.dbsession.query(MyModel).filter(MyModel.name == 'one').first() - except DBAPIError: - return Response(conn_err_msg, content_type='text/plain', status_int=500) - return {'one': one, 'project': '{{project}}'} - - -conn_err_msg = """\ -Pyramid is having a problem using your SQL database. The problem -might be caused by one of the following things: - -1. You may need to run the "initialize_{{project}}_db" script - to initialize your database tables. Check your virtual - environment's "bin" directory for this script and try to run it. - -2. Your database server may not be running. Check that the - database server referred to by the "sqlalchemy.url" setting in - your "development.ini" file is running. - -After you fix the problem, please restart the Pyramid application to -try it again. -""" - diff --git a/pyramid/scaffolds/alchemy/+package+/views/__init__.py b/pyramid/scaffolds/alchemy/+package+/views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pyramid/scaffolds/alchemy/+package+/views/default.py_tmpl b/pyramid/scaffolds/alchemy/+package+/views/default.py_tmpl new file mode 100644 index 000000000..9dc8e233f --- /dev/null +++ b/pyramid/scaffolds/alchemy/+package+/views/default.py_tmpl @@ -0,0 +1,33 @@ +from pyramid.response import Response +from pyramid.view import view_config + +from sqlalchemy.exc import DBAPIError + +from ..models.mymodel import MyModel + + +@view_config(route_name='home', renderer='../templates/mytemplate.pt') +def my_view(request): + try: + one = request.dbsession.query(MyModel).filter(MyModel.name == 'one').first() + except DBAPIError: + return Response(conn_err_msg, content_type='text/plain', status_int=500) + return {'one': one, 'project': '{{project}}'} + + +conn_err_msg = """\ +Pyramid is having a problem using your SQL database. The problem +might be caused by one of the following things: + +1. You may need to run the "initialize_{{project}}_db" script + to initialize your database tables. Check your virtual + environment's "bin" directory for this script and try to run it. + +2. Your database server may not be running. Check that the + database server referred to by the "sqlalchemy.url" setting in + your "development.ini" file is running. + +After you fix the problem, please restart the Pyramid application to +try it again. +""" + -- cgit v1.2.3