Atsushi Odagiri avatar Atsushi Odagiri committed 49c9c58

fist commit

Comments (0)

Files changed (27)

+0.0
+---
+
+-  Initial version
+include *.txt *.ini *.cfg *.rst
+recursive-include faexample *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml
+faexample README
+==================
+
+Getting Started
+---------------
+
+- cd <directory containing this file>
+
+- $venv/bin/python setup.py develop
+
+- $venv/bin/populate_faexample development.ini
+
+- $venv/bin/pserve development.ini
+

README_FORMALCHEMY.txt

+This script does not want to tell you how your app should be set up.
+As such, it does not set an app up for you.
+
+Please use this template together with other templates, like Akhet,
+pyramid_routesalchemy or pyramid_alchemy.
+
+You should add pyramid_fanstatic and fa.jquery as dependencies in your
+setup.py.
+
+To finally include FormAlchemy, modify your main method were you
+create the wsgi application, and include {{package}}.fainit to the
+configuration, like that:
+
+    >>> config.include("{{package}}.fainit")
+
+If you are using pyramid_routesalchemy or pyramid_alchemy,
+you must modify the models.py. For FormAlchemy to be able to use the
+Model, the Model must have a constructer that can be called without
+any argument.
+So open up models.py and either remove the constructor of MyModel,
+or add default values.
+
+If you are using akhet, nothing special needs to be done.
+
+After this modifications, you should find the FormAlchemy Admin
+Interface under /admin
+
+
+[app:main]
+use = egg:faexample
+
+pyramid.reload_templates = true
+pyramid.debug_authorization = false
+pyramid.debug_notfound = false
+pyramid.debug_routematch = false
+pyramid.default_locale_name = en
+pyramid.includes =
+    pyramid_debugtoolbar
+    pyramid_tm
+
+sqlalchemy.url = sqlite:///%(here)s/faexample.db
+
+[server:main]
+use = egg:waitress#main
+host = 0.0.0.0
+port = 6543
+
+# Begin logging configuration
+
+[loggers]
+keys = root, faexample, sqlalchemy
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = INFO
+handlers = console
+
+[logger_faexample]
+level = DEBUG
+handlers =
+qualname = faexample
+
+[logger_sqlalchemy]
+level = INFO
+handlers =
+qualname = sqlalchemy.engine
+# "level = INFO" logs SQL queries.
+# "level = DEBUG" logs SQL queries and results.
+# "level = WARN" logs neither.  (Recommended for production systems.)
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
+
+# End logging configuration

faexample/__init__.py

+from pyramid.config import Configurator
+from sqlalchemy import engine_from_config
+
+from .models import DBSession
+
+def main(global_config, **settings):
+    """ This function returns a Pyramid WSGI application.
+    """
+    engine = engine_from_config(settings, 'sqlalchemy.')
+    DBSession.configure(bind=engine)
+    config = Configurator(settings=settings)
+    config.add_static_view('static', 'static', cache_max_age=3600)
+    config.add_route('home', '/')
+    config.include('.fainit')
+    config.scan()
+    return config.make_wsgi_app()
+

faexample/faforms.py

+from formalchemy import forms
+from formalchemy import tables
+from .models import Note
+
+class FieldSet(forms.FieldSet):
+    pass
+
+class Grid(tables.Grid):
+    pass
+
+class NoteAdd(FieldSet):
+    def __init__(self, *args, **kwargs):
+        super(NoteAdd, self).__init__(*args, **kwargs)
+
+        self.configure(options=[self.name.textarea()])
+
+NoteAdd = NoteAdd(Note)

faexample/fainit.py

+from faexample import models, faforms
+import logging
+
+log = logging.getLogger(__name__)
+
+
+def includeme(config):
+    config.include('pyramid_formalchemy')
+
+    try:
+        # Add fanstatic tween if available
+        config.include('pyramid_fanstatic')
+    except ImportError:
+        log.warn('You should install pyramid_fanstatic or register a fanstatic'
+                 ' middleware by hand')
+
+    try:
+        # Adding the jquery libraries if available
+        config.include('fa.jquery')
+    except ImportError:
+        model_view = 'pyramid_formalchemy.views.ModelView'
+    else:
+        model_view = 'fa.jquery.pyramid.ModelView'
+
+    session_factory = getattr(models, "DBSession", None)
+    if session_factory is not None:
+        # pyramid_alchemy
+        session_factory = 'faexample.models.DBSession'
+    else:
+        # Akhet
+        session_factory = 'faexample.models.Session'
+
+    # register session and model_view for later use
+    settings = {'package': 'faexample',
+                'view': model_view,
+                'session_factory': session_factory,
+               }
+    config.registry.settings['faexample.fa_config'] = settings
+
+    config.formalchemy_admin("/admin", models=models, forms=faforms,
+                             **settings)
+
+    # Adding the package specific routes
+    config.include('faexample.faroutes')
+
+    log.info('formalchemy_admin registered at /admin')

faexample/faroutes.py

+from faexample import models
+import logging
+
+log = logging.getLogger(__name__)
+
+
+def includeme(config):
+    settings = config.registry.settings.get('faexample.fa_settings}}', {})
+
+    # Example to add a specific model
+    #config.formalchemy_model("/my_model", package='faexample',
+    #                         model='faexample.models.MyModel')
+    #                         **settings)
+
+    log.info('faexample.faroutes loaded')

faexample/models.py

+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import (
+    Column, Integer, Unicode, Date, ForeignKey
+)
+
+from sqlalchemy.orm import (
+    relationship,
+)
+
+from sqlalchemy.orm import (
+    scoped_session,
+    sessionmaker,
+    )
+
+from zope.sqlalchemy import ZopeTransactionExtension
+
+DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
+Base = declarative_base()
+
+class Customer(Base):
+    __tablename__ = 'customer'
+    id = Column(Integer, primary_key=True)
+    name = Column(Unicode, unique=True) #this will be the variable used to search the existing db
+    def __unicode__(self):
+        return self.name
+
+class Note(Base):
+    __tablename__ = 'note'
+    id = Column(Integer, primary_key=True)
+    name = Column(Unicode)
+    pub_date = Column(Date)
+    customer_no = Column(Integer, ForeignKey('customer.id'))
+    customer = relationship('Customer', backref='notes')

faexample/scripts/__init__.py

+# package

faexample/scripts/initializedb.py

+import os
+import sys
+import transaction
+
+from sqlalchemy import engine_from_config
+
+from pyramid.paster import (
+    get_appsettings,
+    setup_logging,
+    )
+
+from ..models import (
+    DBSession,
+    Base,
+    )
+
+def usage(argv):
+    cmd = os.path.basename(argv[0])
+    print('usage: %s <config_uri>\n'
+          '(example: "%s development.ini")' % (cmd, cmd)) 
+    sys.exit(1)
+
+def main(argv=sys.argv):
+    if len(argv) != 2:
+        usage(argv)
+    config_uri = argv[1]
+    setup_logging(config_uri)
+    settings = get_appsettings(config_uri)
+    engine = engine_from_config(settings, 'sqlalchemy.')
+    DBSession.configure(bind=engine)
+    Base.metadata.create_all(engine)
Add a comment to this file

faexample/static/favicon.ico

Added
New image
Add a comment to this file

faexample/static/footerbg.png

Added
New image
Add a comment to this file

faexample/static/headerbg.png

Added
New image

faexample/static/ie6.css

+* html img,
+* html .png{position:relative;behavior:expression((this.runtimeStyle.behavior="none")&&(this.pngSet?this.pngSet=true:(this.nodeName == "IMG" && this.src.toLowerCase().indexOf('.png')>-1?(this.runtimeStyle.backgroundImage = "none",
+this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "',sizingMethod='image')",
+this.src = "static/transparent.gif"):(this.origBg = this.origBg? this.origBg :this.currentStyle.backgroundImage.toString().replace('url("','').replace('")',''),
+this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.origBg + "',sizingMethod='crop')",
+this.runtimeStyle.backgroundImage = "none")),this.pngSet=true)
+);}
+#wrap{display:table;height:100%}
Add a comment to this file

faexample/static/middlebg.png

Added
New image

faexample/static/pylons.css

+html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;/* 16px */
+vertical-align:baseline;background:transparent;}
+body{line-height:1;}
+ol,ul{list-style:none;}
+blockquote,q{quotes:none;}
+blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}
+:focus{outline:0;}
+ins{text-decoration:none;}
+del{text-decoration:line-through;}
+table{border-collapse:collapse;border-spacing:0;}
+sub{vertical-align:sub;font-size:smaller;line-height:normal;}
+sup{vertical-align:super;font-size:smaller;line-height:normal;}
+ul,menu,dir{display:block;list-style-type:disc;margin:1em 0;padding-left:40px;}
+ol{display:block;list-style-type:decimal-leading-zero;margin:1em 0;padding-left:40px;}
+li{display:list-item;}
+ul ul,ul ol,ul dir,ul menu,ul dl,ol ul,ol ol,ol dir,ol menu,ol dl,dir ul,dir ol,dir dir,dir menu,dir dl,menu ul,menu ol,menu dir,menu menu,menu dl,dl ul,dl ol,dl dir,dl menu,dl dl{margin-top:0;margin-bottom:0;}
+ol ul,ul ul,menu ul,dir ul,ol menu,ul menu,menu menu,dir menu,ol dir,ul dir,menu dir,dir dir{list-style-type:circle;}
+ol ol ul,ol ul ul,ol menu ul,ol dir ul,ol ol menu,ol ul menu,ol menu menu,ol dir menu,ol ol dir,ol ul dir,ol menu dir,ol dir dir,ul ol ul,ul ul ul,ul menu ul,ul dir ul,ul ol menu,ul ul menu,ul menu menu,ul dir menu,ul ol dir,ul ul dir,ul menu dir,ul dir dir,menu ol ul,menu ul ul,menu menu ul,menu dir ul,menu ol menu,menu ul menu,menu menu menu,menu dir menu,menu ol dir,menu ul dir,menu menu dir,menu dir dir,dir ol ul,dir ul ul,dir menu ul,dir dir ul,dir ol menu,dir ul menu,dir menu menu,dir dir menu,dir ol dir,dir ul dir,dir menu dir,dir dir dir{list-style-type:square;}
+.hidden{display:none;}
+p{line-height:1.5em;}
+h1{font-size:1.75em;line-height:1.7em;font-family:helvetica,verdana;}
+h2{font-size:1.5em;line-height:1.7em;font-family:helvetica,verdana;}
+h3{font-size:1.25em;line-height:1.7em;font-family:helvetica,verdana;}
+h4{font-size:1em;line-height:1.7em;font-family:helvetica,verdana;}
+html,body{width:100%;height:100%;}
+body{margin:0;padding:0;background-color:#ffffff;position:relative;font:16px/24px "NobileRegular","Lucida Grande",Lucida,Verdana,sans-serif;}
+a{color:#1b61d6;text-decoration:none;}
+a:hover{color:#e88f00;text-decoration:underline;}
+body h1,
+body h2,
+body h3,
+body h4,
+body h5,
+body h6{font-family:"NeutonRegular","Lucida Grande",Lucida,Verdana,sans-serif;font-weight:normal;color:#373839;font-style:normal;}
+#wrap{min-height:100%;}
+#header,#footer{width:100%;color:#ffffff;height:40px;position:absolute;text-align:center;line-height:40px;overflow:hidden;font-size:12px;vertical-align:middle;}
+#header{background:#000000;top:0;font-size:14px;}
+#footer{bottom:0;background:#000000 url(footerbg.png) repeat-x 0 top;position:relative;margin-top:-40px;clear:both;}
+.header,.footer{width:750px;margin-right:auto;margin-left:auto;}
+.wrapper{width:100%}
+#top,#top-small,#bottom{width:100%;}
+#top{color:#000000;height:230px;background:#ffffff url(headerbg.png) repeat-x 0 top;position:relative;}
+#top-small{color:#000000;height:60px;background:#ffffff url(headerbg.png) repeat-x 0 top;position:relative;}
+#bottom{color:#222;background-color:#ffffff;}
+.top,.top-small,.middle,.bottom{width:750px;margin-right:auto;margin-left:auto;}
+.top{padding-top:40px;}
+.top-small{padding-top:10px;}
+#middle{width:100%;height:100px;background:url(middlebg.png) repeat-x;border-top:2px solid #ffffff;border-bottom:2px solid #b2b2b2;}
+.app-welcome{margin-top:25px;}
+.app-name{color:#000000;font-weight:bold;}
+.bottom{padding-top:50px;}
+#left{width:350px;float:left;padding-right:25px;}
+#right{width:350px;float:right;padding-left:25px;}
+.align-left{text-align:left;}
+.align-right{text-align:right;}
+.align-center{text-align:center;}
+ul.links{margin:0;padding:0;}
+ul.links li{list-style-type:none;font-size:14px;}
+form{border-style:none;}
+fieldset{border-style:none;}
+input{color:#222;border:1px solid #ccc;font-family:sans-serif;font-size:12px;line-height:16px;}
+input[type=text],input[type=password]{width:205px;}
+input[type=submit]{background-color:#ddd;font-weight:bold;}
+/*Opera Fix*/
+body:before{content:"";height:100%;float:left;width:0;margin-top:-32767px;}
Add a comment to this file

faexample/static/pyramid-small.png

Added
New image
Add a comment to this file

faexample/static/pyramid.png

Added
New image
Add a comment to this file

faexample/static/transparent.gif

Added
New image

faexample/templates/mytemplate.pt

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
+<head>
+  <title>The Pyramid Web Application Development Framework</title>
+  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+  <meta name="keywords" content="python web application" />
+  <meta name="description" content="pyramid web application" />
+  <link rel="shortcut icon" href="${request.static_url('faexample:static/favicon.ico')}" />
+  <link rel="stylesheet" href="${request.static_url('faexample:static/pylons.css')}" type="text/css" media="screen" charset="utf-8" />
+  <link rel="stylesheet" href="http://static.pylonsproject.org/fonts/nobile/stylesheet.css" media="screen" />
+  <link rel="stylesheet" href="http://static.pylonsproject.org/fonts/neuton/stylesheet.css" media="screen" />
+  <!--[if lte IE 6]>
+  <link rel="stylesheet" href="${request.static_url('faexample:static/ie6.css')}" type="text/css" media="screen" charset="utf-8" />
+  <![endif]-->
+</head>
+<body>
+  <div id="wrap">
+    <div id="top">
+      <div class="top align-center">
+        <div><img src="${request.static_url('faexample:static/pyramid.png')}" width="750" height="169" alt="pyramid"/></div>
+      </div>
+    </div>
+    <div id="middle">
+      <div class="middle align-center">
+        <p class="app-welcome">
+          Welcome to <span class="app-name">${project}</span>, an application generated by<br/>
+          the Pyramid web application development framework.
+        </p>
+      </div>
+    </div>
+    <div id="bottom">
+      <div class="bottom">
+        <div id="left" class="align-right">
+          <h2>Search documentation</h2>
+          <form method="get" action="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/search.html">
+                <input type="text" id="q" name="q" value="" />
+                <input type="submit" id="x" value="Go" />
+            </form>
+        </div>
+        <div id="right" class="align-left">
+          <h2>Pyramid links</h2>
+          <ul class="links">
+            <li>
+              <a href="http://pylonsproject.org">Pylons Website</a>
+            </li>
+            <li>
+              <a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#narrative-documentation">Narrative Documentation</a>
+            </li>
+            <li>
+              <a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#reference-material">API Documentation</a>
+            </li>
+            <li>
+              <a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#tutorials">Tutorials</a>
+            </li>
+            <li>
+              <a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#detailed-change-history">Change History</a>
+            </li>
+            <li>
+              <a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#sample-applications">Sample Applications</a>
+            </li>
+            <li>
+              <a href="http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/#support-and-development">Support and Development</a>
+            </li>
+            <li>
+              <a href="irc://irc.freenode.net#pyramid">IRC Channel</a>
+            </li>
+            </ul>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div id="footer">
+    <div class="footer">&copy; Copyright 2008-2011, Agendaless Consulting.</div>
+  </div>
+</body>
+</html>

faexample/tests.py

+import unittest
+import transaction
+
+from pyramid import testing
+
+from .models import DBSession
+
+class TestMyView(unittest.TestCase):
+    def setUp(self):
+        self.config = testing.setUp()
+        from sqlalchemy import create_engine
+        engine = create_engine('sqlite://')
+        from .models import (
+            Base,
+            MyModel,
+            )
+        DBSession.configure(bind=engine)
+        Base.metadata.create_all(engine)
+        with transaction.manager:
+            model = MyModel(name='one', value=55)
+            DBSession.add(model)
+
+    def tearDown(self):
+        DBSession.remove()
+        testing.tearDown()
+
+    def test_it(self):
+        from .views import my_view
+        request = testing.DummyRequest()
+        info = my_view(request)
+        self.assertEqual(info['one'].name, 'one')
+        self.assertEqual(info['project'], 'faexample')

faexample/views.py

+from pyramid.response import Response
+from pyramid.view import view_config
+
+from sqlalchemy.exc import DBAPIError
+
+from .models import (
+    DBSession,
+    )
+
+@view_config(route_name='home', renderer='templates/mytemplate.pt')
+def my_view(request):
+    return {'one':object(), 'project':'faexample'}
+[app:main]
+use = egg:faexample
+
+pyramid.reload_templates = false
+pyramid.debug_authorization = false
+pyramid.debug_notfound = false
+pyramid.debug_routematch = false
+pyramid.default_locale_name = en
+pyramid.includes =
+    pyramid_tm
+
+sqlalchemy.url = sqlite:///%(here)s/faexample.db
+
+[server:main]
+use = egg:waitress#main
+host = 0.0.0.0
+port = 6543
+
+# Begin logging configuration
+
+[loggers]
+keys = root, faexample, sqlalchemy
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = WARN
+handlers = console
+
+[logger_faexample]
+level = WARN
+handlers =
+qualname = faexample
+
+[logger_sqlalchemy]
+level = WARN
+handlers =
+qualname = sqlalchemy.engine
+# "level = INFO" logs SQL queries.
+# "level = DEBUG" logs SQL queries and results.
+# "level = WARN" logs neither.  (Recommended for production systems.)
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
+
+# End logging configuration
+[nosetests]
+match=^test
+nocapture=1
+cover-package=faexample
+with-coverage=1
+cover-erase=1
+
+[compile_catalog]
+directory = faexample/locale
+domain = faexample
+statistics = true
+
+[extract_messages]
+add_comments = TRANSLATORS:
+output_file = faexample/locale/faexample.pot
+width = 80
+
+[init_catalog]
+domain = faexample
+input_file = faexample/locale/faexample.pot
+output_dir = faexample/locale
+
+[update_catalog]
+domain = faexample
+input_file = faexample/locale/faexample.pot
+output_dir = faexample/locale
+previous = true
+import os
+
+from setuptools import setup, find_packages
+
+here = os.path.abspath(os.path.dirname(__file__))
+README = open(os.path.join(here, 'README.txt')).read()
+CHANGES = open(os.path.join(here, 'CHANGES.txt')).read()
+
+requires = [
+    'pyramid',
+    'SQLAlchemy',
+    'transaction',
+    'pyramid_tm',
+    'pyramid_debugtoolbar',
+    'zope.sqlalchemy',
+    'waitress',
+    ]
+
+setup(name='faexample',
+      version='0.0',
+      description='faexample',
+      long_description=README + '\n\n' +  CHANGES,
+      classifiers=[
+        "Programming Language :: Python",
+        "Framework :: Pylons",
+        "Topic :: Internet :: WWW/HTTP",
+        "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+        ],
+      author='',
+      author_email='',
+      url='',
+      keywords='web wsgi bfg pylons pyramid',
+      packages=find_packages(),
+      include_package_data=True,
+      zip_safe=False,
+      test_suite='faexample',
+      install_requires=requires,
+      entry_points="""\
+      [paste.app_factory]
+      main = faexample:main
+      [console_scripts]
+      initialize_faexample_db = faexample.scripts.initializedb:main
+      """,
+      )
+
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.