going pylons !

git-svn-id: http://yolanda.mister-muffin.de/svn@362 7eef14d0-6ed0-489d-bf55-20463b2d70db
main
erlehmann 16 years ago
parent 494f18a01b
commit bffdb722ac

@ -0,0 +1,2 @@
recursive-include yolanda/public *
recursive-include yolanda/templates *

@ -0,0 +1,19 @@
This file is for you to describe the Yolanda application. Typically
you would include information such as the information below:
Installation and Setup
======================
Install ``Yolanda`` using easy_install::
easy_install Yolanda
Make a config file as follows::
paster make-config Yolanda config.ini
Tweak the config file as appropriate and then setup the application::
paster setup-app config.ini
Then you are ready to go.

@ -0,0 +1,10 @@
Metadata-Version: 1.0
Name: Yolanda
Version: 0.0.0dev
Summary: UNKNOWN
Home-page: UNKNOWN
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Description: UNKNOWN
Platform: UNKNOWN

@ -0,0 +1,29 @@
MANIFEST.in
README.txt
setup.cfg
setup.py
Yolanda.egg-info/PKG-INFO
Yolanda.egg-info/SOURCES.txt
Yolanda.egg-info/dependency_links.txt
Yolanda.egg-info/entry_points.txt
Yolanda.egg-info/paste_deploy_config.ini_tmpl
Yolanda.egg-info/requires.txt
Yolanda.egg-info/top_level.txt
yolanda/__init__.py
yolanda/websetup.py
yolanda/config/__init__.py
yolanda/config/environment.py
yolanda/config/middleware.py
yolanda/config/routing.py
yolanda/controllers/__init__.py
yolanda/controllers/error.py
yolanda/controllers/template.py
yolanda/lib/__init__.py
yolanda/lib/app_globals.py
yolanda/lib/base.py
yolanda/lib/helpers.py
yolanda/model/__init__.py
yolanda/public/index.html
yolanda/tests/__init__.py
yolanda/tests/test_models.py
yolanda/tests/functional/__init__.py

@ -0,0 +1,7 @@
[paste.app_factory]
main = yolanda.config.middleware:make_app
[paste.app_install]
main = pylons.util:PylonsInstaller

@ -0,0 +1,58 @@
#
# Yolanda - Pylons configuration
#
# The %(here)s variable will be replaced with the parent directory of this file
#
[DEFAULT]
debug = true
email_to = you@yourdomain.com
smtp_server = localhost
error_email_from = paste@localhost
[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000
[app:main]
use = egg:Yolanda
full_stack = true
cache_dir = %(here)s/data
beaker.session.key = yolanda
beaker.session.secret = ${app_instance_secret}
app_instance_uuid = ${app_instance_uuid}
# If you'd like to fine-tune the individual locations of the cache data dirs
# for the Cache data, or the Session saves, un-comment the desired settings
# here:
#beaker.cache.data_dir = %(here)s/data/cache
#beaker.session.data_dir = %(here)s/data/sessions
# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
# Debug mode will enable the interactive debugging tool, allowing ANYONE to
# execute malicious code after an exception is raised.
set debug = false
# Logging configuration
[loggers]
keys = root
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = INFO
handlers = console
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s] %(message)s

@ -0,0 +1,3 @@
Pylons
WebHelpers
PasteScript

@ -0,0 +1,12 @@
(dp1
S'_authentication_token'
p2
S'141491361115205551276239095199970379580'
p3
sS'_accessed_time'
p4
F1217161386.3120041
sS'_creation_time'
p5
F1217161386.3120079
s.

@ -0,0 +1,40 @@
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
_magic_number = 2
_modified_time = 1216907993.197489
_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/index.mako'
_template_uri='/index.mako'
_template_cache=cache.Cache(__name__, _modified_time)
_source_encoding=None
_exports = []
def render_body(context,**pageargs):
context.caller_stack.push_frame()
try:
__M_locals = dict(pageargs=pageargs)
h = context.get('h', UNDEFINED)
# SOURCE LINE 1
context.write(u'<h1>\n Welcome to Yolanda\n</h1>\n\n<p>\n This is the front page.\n</p>\n\n<p>\n <a href="">upload video</a>\n</p>\n\n<p>\n\n')
# SOURCE LINE 15
context.write(unicode( h.form( \
h.url(action='/results'), \
method='get', \
enctype='application/x-www-form-urlencoded' \
) ))
# SOURCE LINE 19
context.write(u'\n\n')
# SOURCE LINE 21
context.write(unicode( h.text_field('query') ))
context.write(u'\n')
# SOURCE LINE 22
context.write(unicode( h.submit('find video') ))
context.write(u'\n\n')
# SOURCE LINE 24
context.write(unicode( h.end_form() ))
context.write(u'\n\n <form action="/results" method="get" enctype="application/x-www-form-urlencoded">\n <fieldset>\n\n <legend>\n search for videos\n </legend>\n\n <input type="text" name="query" />\n <input type="submit" value="find" />\n\n </fieldset>\n </form>\n</p>\n')
return ''
finally:
context.caller_stack.pop_frame()

@ -0,0 +1,22 @@
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
_magic_number = 2
_modified_time = 1216815389.6429961
_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/index.myt'
_template_uri='/index.myt'
_template_cache=cache.Cache(__name__, _modified_time)
_source_encoding=None
_exports = []
def render_body(context,**pageargs):
context.caller_stack.push_frame()
try:
__M_locals = dict(pageargs=pageargs)
# SOURCE LINE 1
context.write(u'<!-- header -->\n\n<h1>\n Welcome to Yolanda\n</h1>\n\n<p>\n This is the front page.\n</p>\n\n<p>\n <a href="">upload video</a>\n</p>\n\n<p>\n <form action="/results" method="get" enctype="application/x-www-form-urlencoded">\n <fieldset>\n\n <legend>\n search for videos\n </legend>\n\n <input type="text" name="query" />\n <input type="submit" value="find" />\n\n </fieldset>\n </form>\n</p>\n\n<!-- footer -->\n')
return ''
finally:
context.caller_stack.pop_frame()

@ -0,0 +1,62 @@
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
_magic_number = 2
_modified_time = 1216910187.0066929
_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/results.mako'
_template_uri='/results.mako'
_template_cache=cache.Cache(__name__, _modified_time)
_source_encoding=None
_exports = ['result']
def render_body(context,**pageargs):
context.caller_stack.push_frame()
try:
__M_locals = dict(pageargs=pageargs)
h = context.get('h', UNDEFINED)
c = context.get('c', UNDEFINED)
def result(x):
return render_result(context.locals_(__M_locals),x)
# SOURCE LINE 1
context.write(u'<html>\n\n\n<head>\n\n')
# SOURCE LINE 6
context.write(unicode( h.javascript_include_tag('/javascripts/effects.js', builtins=True) ))
context.write(u'\n\n</head>\n\n\n<body>\n\n')
# SOURCE LINE 18
context.write(u'\n\n<p>\n Here be results for ')
# SOURCE LINE 21
context.write(unicode(c.query))
context.write(u'.\n</p>\n\n')
# SOURCE LINE 24
for x in range(1,10):
# SOURCE LINE 25
context.write(u' ')
context.write(unicode(result(x)))
context.write(u'\n')
# SOURCE LINE 27
context.write(u'\n</body>\n\n\n</html>\n')
return ''
finally:
context.caller_stack.pop_frame()
def render_result(context,x):
context.caller_stack.push_frame()
try:
h = context.get('h', UNDEFINED)
# SOURCE LINE 13
context.write(u'\n <div class="result" id="')
# SOURCE LINE 14
context.write(unicode(x))
context.write(u'">\n ')
# SOURCE LINE 15
context.write(unicode( h.draggable_element(x, revert=True) ))
context.write(u'\n thumbnail and infos for video ')
# SOURCE LINE 16
context.write(unicode(x))
context.write(u'\n </div>\n')
return ''
finally:
context.caller_stack.pop_frame()

@ -0,0 +1,44 @@
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
_magic_number = 2
_modified_time = 1216817791.7502799
_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/results.myt'
_template_uri='/results.myt'
_template_cache=cache.Cache(__name__, _modified_time)
_source_encoding=None
_exports = []
def render_body(context,**pageargs):
context.caller_stack.push_frame()
try:
__M_locals = dict(pageargs=pageargs)
h = context.get('h', UNDEFINED)
c = context.get('c', UNDEFINED)
# SOURCE LINE 1
context.write(u'<h1>\n Welcome to Yolanda\n</h1>\n\n<p>\n This is the search page.\n</p>\n\n<p>\n')
# SOURCE LINE 10
h.start_form(h.url_for(action='save', title=c.query), method="get")
context.write(u'\n ')
# SOURCE LINE 11
h.text_area(name='content', rows=7, cols=40, content=c.content)
context.write(u' <br />\n ')
# SOURCE LINE 12
h.submit(value="Save changes", name='commit')
context.write(u'\n')
# SOURCE LINE 13
h.end_form()
context.write(u'\n\n ')
# SOURCE LINE 15
c.query
context.write(u'\n</p>\n')
return ''
finally:
context.caller_stack.pop_frame()

@ -0,0 +1,22 @@
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
_magic_number = 2
_modified_time = 1216814715.8671241
_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/search.myt'
_template_uri='/search.myt'
_template_cache=cache.Cache(__name__, _modified_time)
_source_encoding=None
_exports = []
def render_body(context,**pageargs):
context.caller_stack.push_frame()
try:
__M_locals = dict(pageargs=pageargs)
# SOURCE LINE 1
context.write(u'<!-- header -->\n\n<h1>\n Welcome to Yolanda\n</h1>\n\n<p>\n This is the search page.\n</p>\n\n<!-- footer -->\n')
return ''
finally:
context.caller_stack.pop_frame()

@ -0,0 +1,48 @@
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
_magic_number = 2
_modified_time = 1217192624.700382
_template_filename=u'/home/nils/src/yolanda/trunk/yolanda/templates/xhtml/base.mako'
_template_uri=u'/xhtml/base.mako'
_template_cache=cache.Cache(__name__, _modified_time)
_source_encoding=None
_exports = []
def render_body(context,**pageargs):
context.caller_stack.push_frame()
try:
__M_locals = dict(pageargs=pageargs)
h = context.get('h', UNDEFINED)
self = context.get('self', UNDEFINED)
# SOURCE LINE 1
context.write(u'<?xml version="1.0" ?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n<html xmlns="http://www.w3.org/1999/xhtml">\n\n<head>\n\n <meta\n http-equiv="Content-Type"\n content="application/xhtml+xml;charset=utf-8"\n />\n\n <link\n rel="stylesheet"\n type="text/css"\n media="screen"\n href="')
# SOURCE LINE 18
context.write(unicode(h.url_for('/css/default.css')))
context.write(u'"\n />\n\n <title>\n Yolanda - ')
# SOURCE LINE 22
context.write(unicode(self.title()))
context.write(u'\n </title>\n\n</head>\n\n<body>\n\n <div id="heading-box">\n <h1>\n ')
# SOURCE LINE 31
context.write(unicode(self.heading()))
context.write(u'\n </h1>\n </div>\n\n <div id="search-box">\n\n <h1>\n Search all videos\n </h1>\n\n ')
# SOURCE LINE 41
context.write(unicode(h.form(h.url_for('search_results'), method='get')))
context.write(u'\n\n ')
# SOURCE LINE 43
context.write(unicode(h.text_field('query')))
context.write(u'\n ')
# SOURCE LINE 44
context.write(unicode(h.submit('Search')))
context.write(u'\n\n ')
# SOURCE LINE 46
context.write(unicode(h.end_form()))
context.write(u'\n\n </div>\n\n ')
# SOURCE LINE 50
context.write(unicode(self.body()))
context.write(u'\n\n <div id="copyright">\n <em>Yolanda</em> Copyright &copy; 2007, 2008 <em>The Yolanda Developers</em> &ndash;\n This program comes with <em>absolutely no warranty</em>; for details <a href="">click here</a>.\n This is <em>free software</em>, and you are welcome to redistribute it\n under certain conditions; <a href="">click here</a> for details.\n To view the source code, <a href="">click here</a>. Report bugs <a href="">here</a>.\n </div>\n\n <ul id="antipixel" role="navigation">\n\n <li>\n <a href="http://validator.w3.org/">\n <img alt="XHTML 1.1 logo" class="antipixel" src="" />\n </a>\n </li>\n\n <li>\n <a href="http://jigsaw.w3.org/css-validator/">\n <img alt="CSS logo" class="antipixel" src="" />\n </a>\n </li>\n\n <li>\n <a href="">\n <img alt="Javascript logo" class="antipixel" src="" />\n </a>\n </li>\n\n <li>\n <a href="http://www.theora.org/">\n <img alt="Ogg Theora logo" class="antipixel" src="" />\n </a>\n </li>\n\n </ul>\n\n</body>\n\n</html>\n')
return ''
finally:
context.caller_stack.pop_frame()

@ -0,0 +1,57 @@
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
_magic_number = 2
_modified_time = 1217192819.900584
_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/xhtml/index.mako'
_template_uri='/xhtml/index.mako'
_template_cache=cache.Cache(__name__, _modified_time)
_source_encoding=None
_exports = ['heading', 'title']
def _mako_get_namespace(context, name):
try:
return context.namespaces[(__name__, name)]
except KeyError:
_mako_generate_namespaces(context)
return context.namespaces[(__name__, name)]
def _mako_generate_namespaces(context):
pass
def _mako_inherit(template, context):
_mako_generate_namespaces(context)
return runtime._inherit_from(context, u'base.mako', _template_uri)
def render_body(context,**pageargs):
context.caller_stack.push_frame()
try:
__M_locals = dict(pageargs=pageargs)
# SOURCE LINE 1
context.write(u'\n\n')
# SOURCE LINE 5
context.write(u'\n\n')
# SOURCE LINE 9
context.write(u'\n\nLOL INDEX\n')
return ''
finally:
context.caller_stack.pop_frame()
def render_heading(context):
context.caller_stack.push_frame()
try:
# SOURCE LINE 7
context.write(u'\n Welcome, youngling !\n')
return ''
finally:
context.caller_stack.pop_frame()
def render_title(context):
context.caller_stack.push_frame()
try:
# SOURCE LINE 3
context.write(u'\n front page\n')
return ''
finally:
context.caller_stack.pop_frame()

@ -0,0 +1,105 @@
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
_magic_number = 2
_modified_time = 1217192310.2031181
_template_filename='/home/nils/src/yolanda/trunk/yolanda/templates/xhtml/results.mako'
_template_uri='/xhtml/results.mako'
_template_cache=cache.Cache(__name__, _modified_time)
_source_encoding=None
_exports = ['results_listing', 'heading', 'title']
def _mako_get_namespace(context, name):
try:
return context.namespaces[(__name__, name)]
except KeyError:
_mako_generate_namespaces(context)
return context.namespaces[(__name__, name)]
def _mako_generate_namespaces(context):
pass
def _mako_inherit(template, context):
_mako_generate_namespaces(context)
return runtime._inherit_from(context, u'base.mako', _template_uri)
def render_body(context,**pageargs):
context.caller_stack.push_frame()
try:
__M_locals = dict(pageargs=pageargs)
def results_listing(results):
return render_results_listing(context.locals_(__M_locals),results)
c = context.get('c', UNDEFINED)
# SOURCE LINE 1
context.write(u'\n\n')
# SOURCE LINE 5
context.write(u'\n\n')
# SOURCE LINE 9
context.write(u'\n\n')
# SOURCE LINE 25
context.write(u'\n\n')
# SOURCE LINE 27
context.write(unicode(results_listing(c.results)))
context.write(u'\n')
return ''
finally:
context.caller_stack.pop_frame()
def render_results_listing(context,results):
context.caller_stack.push_frame()
try:
h = context.get('h', UNDEFINED)
c = context.get('c', UNDEFINED)
# SOURCE LINE 11
context.write(u'\n <ol id="results">\n')
# SOURCE LINE 13
for result in c.results:
# SOURCE LINE 14
context.write(u' <li id="result">\n <a href="')
# SOURCE LINE 15
context.write(unicode(h.url_for('video_page', video=result)))
context.write(u'">\n <img src="')
# SOURCE LINE 16
context.write(unicode(result['thumbnail']))
context.write(u'" alt=\'thumbnail for "')
context.write(unicode(result['title']))
context.write(u'"\'/>\n </a>\n <br />\n <a href="')
# SOURCE LINE 19
context.write(unicode(h.url_for('video_page', video=result)))
context.write(u'">\n ')
# SOURCE LINE 20
context.write(unicode(result['title']))
context.write(u'\n </a>\n </li>\n')
# SOURCE LINE 24
context.write(u' </ol>\n')
return ''
finally:
context.caller_stack.pop_frame()
def render_heading(context):
context.caller_stack.push_frame()
try:
c = context.get('c', UNDEFINED)
# SOURCE LINE 7
context.write(u'\n 9001 results for "')
# SOURCE LINE 8
context.write(unicode(c.query))
context.write(u'":\n')
return ''
finally:
context.caller_stack.pop_frame()
def render_title(context):
context.caller_stack.push_frame()
try:
c = context.get('c', UNDEFINED)
# SOURCE LINE 3
context.write(u'\n results for "')
# SOURCE LINE 4
context.write(unicode(c.query))
context.write(u'"\n')
return ''
finally:
context.caller_stack.pop_frame()

@ -0,0 +1,64 @@
#
# Yolanda - Pylons development environment configuration
#
# The %(here)s variable will be replaced with the parent directory of this file
#
[DEFAULT]
debug = true
# Uncomment and replace with the address which should receive any error reports
#email_to = you@yourdomain.com
smtp_server = localhost
error_email_from = paste@localhost
[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000
[app:main]
use = egg:Yolanda
full_stack = true
cache_dir = %(here)s/data
beaker.session.key = yolanda
beaker.session.secret = somesecret
# If you'd like to fine-tune the individual locations of the cache data dirs
# for the Cache data, or the Session saves, un-comment the desired settings
# here:
#beaker.cache.data_dir = %(here)s/data/cache
#beaker.session.data_dir = %(here)s/data/sessions
# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
# Debug mode will enable the interactive debugging tool, allowing ANYONE to
# execute malicious code after an exception is raised.
#set debug = false
# Logging configuration
[loggers]
keys = root, yolanda
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = INFO
handlers = console
[logger_yolanda]
level = DEBUG
handlers =
qualname = yolanda
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S

@ -0,0 +1,12 @@
yolanda
+++++++
This is the main index page of your documentation. It should be written in
`reStructuredText format <http://docutils.sourceforge.net/rst.html>`_.
You can generate your documentation in HTML format by running this command::
setup.py pudge
For this to work you will need to download and install ``buildutils`` and
``pudge``.

@ -0,0 +1,59 @@
[egg_info]
tag_build = dev
tag_svn_revision = true
[easy_install]
find_links = http://www.pylonshq.com/download/
[pudge]
theme = pythonpaste.org
# Add extra doc files here with spaces between them
docs = docs/index.txt
# Doc Settings
doc_base = docs/
dest = docs/html
# Add extra modules here separated with commas
modules = yolanda
title = Yolanda
organization = Pylons
# Highlight code-block sections with Pygments
highlighter = pygments
# Optionally add extra links
#organization_url = http://pylonshq.com/
#trac_url = http://pylonshq.com/project
settings = no_about=true
# Optionally add extra settings
# link1=/community/ Community
# link2=/download/ Download
[publish]
doc-dir=docs/html
make-dirs=1
# Babel configuration
[compile_catalog]
domain = yolanda
directory = yolanda/i18n
statistics = true
[extract_messages]
add_comments = TRANSLATORS:
output_file = yolanda/i18n/yolanda.pot
width = 80
[init_catalog]
domain = yolanda
input_file = yolanda/i18n/yolanda.pot
output_dir = yolanda/i18n
[update_catalog]
domain = yolanda
input_file = yolanda/i18n/yolanda.pot
output_dir = yolanda/i18n
previous = true

@ -0,0 +1,31 @@
try:
from setuptools import setup, find_packages
except ImportError:
from ez_setup import use_setuptools
use_setuptools()
from setuptools import setup, find_packages
setup(
name='Yolanda',
version="",
#description='',
#author='',
#author_email='',
#url='',
install_requires=["Pylons>=0.9.6.1"],
packages=find_packages(exclude=['ez_setup']),
include_package_data=True,
test_suite='nose.collector',
package_data={'yolanda': ['i18n/*/LC_MESSAGES/*.mo']},
#message_extractors = {'yolanda': [
# ('**.py', 'python', None),
# ('templates/**.mako', 'mako', None),
# ('public/**', 'ignore', None)]},
entry_points="""
[paste.app_factory]
main = yolanda.config.middleware:make_app
[paste.app_install]
main = pylons.util:PylonsInstaller
""",
)

@ -0,0 +1,21 @@
#
# Yolanda - Pylons testing environment configuration
#
# The %(here)s variable will be replaced with the parent directory of this file
#
[DEFAULT]
debug = true
# Uncomment and replace with the address which should receive any error reports
#email_to = you@yourdomain.com
smtp_server = localhost
error_email_from = paste@localhost
[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000
[app:main]
use = config:development.ini
# Add additional test specific configuration options as necessary.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,33 @@
"""Pylons environment configuration"""
import os
from pylons import config
import yolanda.lib.app_globals as app_globals
import yolanda.lib.helpers
from yolanda.config.routing import make_map
def load_environment(global_conf, app_conf):
"""Configure the Pylons environment via the ``pylons.config``
object
"""
# Pylons paths
root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
paths = dict(root=root,
controllers=os.path.join(root, 'controllers'),
static_files=os.path.join(root, 'public'),
templates=[os.path.join(root, 'templates')])
# Initialize config with the basic options
config.init_app(global_conf, app_conf, package='yolanda',
template_engine='mako', paths=paths)
config['routes.map'] = make_map()
config['pylons.g'] = app_globals.Globals()
config['pylons.h'] = yolanda.lib.helpers
# Customize templating options via this variable
tmpl_options = config['buffet.template_options']
# CONFIGURATION OPTIONS HERE (note: all config options will override
# any Pylons config options)

@ -0,0 +1,57 @@
"""Pylons middleware initialization"""
from paste.cascade import Cascade
from paste.registry import RegistryManager
from paste.urlparser import StaticURLParser
from paste.deploy.converters import asbool
from pylons import config
from pylons.error import error_template
from pylons.middleware import error_mapper, ErrorDocuments, ErrorHandler, \
StaticJavascripts
from pylons.wsgiapp import PylonsApp
from yolanda.config.environment import load_environment
def make_app(global_conf, full_stack=True, **app_conf):
"""Create a Pylons WSGI application and return it
``global_conf``
The inherited configuration for this application. Normally from
the [DEFAULT] section of the Paste ini file.
``full_stack``
Whether or not this application provides a full WSGI stack (by
default, meaning it handles its own exceptions and errors).
Disable full_stack when this application is "managed" by
another WSGI middleware.
``app_conf``
The application's local configuration. Normally specified in the
[app:<name>] section of the Paste ini file (where <name>
defaults to main).
"""
# Configure the Pylons environment
load_environment(global_conf, app_conf)
# The Pylons WSGI app
app = PylonsApp()
# CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares)
if asbool(full_stack):
# Handle Python exceptions
app = ErrorHandler(app, global_conf, error_template=error_template,
**config['pylons.errorware'])
# Display error documents for 401, 403, 404 status codes (and
# 500 when debug is disabled)
app = ErrorDocuments(app, global_conf, mapper=error_mapper, **app_conf)
# Establish the Registry for this application
app = RegistryManager(app)
# Static files
javascripts_app = StaticJavascripts()
static_app = StaticURLParser(config['pylons.paths']['static_files'])
app = Cascade([static_app, javascripts_app, app])
return app

@ -0,0 +1,46 @@
"""Routes configuration
The more specific and detailed routes should be defined first so they
may take precedent over the more generic routes. For more information
refer to the routes manual at http://routes.groovie.org/docs/
"""
from pylons import config
from routes import Mapper
def make_map():
"""Create, configure and return the routes Mapper"""
map = Mapper(directory=config['pylons.paths']['controllers'],
always_scan=config['debug'])
# The ErrorController route (handles 404/500 error pages); it should
# likely stay at the top, ensuring it can always be resolved
map.connect('error/:action/:id', controller='error')
# CUSTOM ROUTES HERE
# front page (search form and search errors)
map.connect('', controller='index', action='index')
# search results
map.connect('search_results', 'results', controller='search', action='results')
# videos
def video_expand(kargs):
# only alter kargs if a video keyword arg is present
if 'video' not in kargs:
return kargs
video = kargs.pop('video')
kargs['id'] = video['id']
kargs['title'] = video['title']
return kargs
map.connect('video_page', 'video/:id/:title', controller='video', _filter=video_expand)
# map.connect('video_file', 'video/:id.ogv', controller='video', action='file' _filter=video_expand)
# everything else
map.connect(':controller/:action/:id')
# map.connect('*url', controller='template', action='view')
return map

Binary file not shown.

@ -0,0 +1,13 @@
import logging
from yolanda.lib.base import *
log = logging.getLogger(__name__)
class AccountController(BaseController):
def index(self):
# Return a rendered template
# return render('/some/template.mako')
# or, Return a response
return 'account'

@ -0,0 +1,39 @@
import os.path
import paste.fileapp
from pylons.middleware import error_document_template, media_path
from yolanda.lib.base import *
class ErrorController(BaseController):
"""Generates error documents as and when they are required.
The ErrorDocuments middleware forwards to ErrorController when error
related status codes are returned from the application.
This behaviour can be altered by changing the parameters to the
ErrorDocuments middleware in your config/middleware.py file.
"""
def document(self):
"""Render the error document"""
page = error_document_template % \
dict(prefix=request.environ.get('SCRIPT_NAME', ''),
code=request.params.get('code', ''),
message=request.params.get('message', ''))
return page
def img(self, id):
"""Serve Pylons' stock images"""
return self._serve_file(os.path.join(media_path, 'img', id))
def style(self, id):
"""Serve Pylons' stock stylesheets"""
return self._serve_file(os.path.join(media_path, 'style', id))
def _serve_file(self, path):
"""Call Paste's FileApp (a WSGI application) to serve the file
at the specified path
"""
fapp = paste.fileapp.FileApp(path)
return fapp(request.environ, self.start_response)

@ -0,0 +1,10 @@
import logging
from yolanda.lib.base import *
log = logging.getLogger(__name__)
class IndexController(BaseController):
def index(self):
return render('/xhtml/index.mako')

@ -0,0 +1,31 @@
import logging
from yolanda.lib.base import *
log = logging.getLogger(__name__)
class SearchController(BaseController):
def results(self):
# maybe c.query could / should be a dictionary ?
c.query = request.params['query']
# c.results dummy
c.results = [
{'title': 'foobar', 'id': '23' , 'thumbnail': h.url_for('/images/404.png')},
{'title': 'blablupp', 'id': '42', 'thumbnail': h.url_for('/images/404.png')},
{'title': 'uiae nrdt', 'id': '555' , 'thumbnail': h.url_for('/images/404.png')},
{'title': 'uiaenrtd uiaenrtd uiaenrdt', 'id': '666666666', 'thumbnail': h.url_for('/images/404.png')},
{'title': 'foobar', 'id': '23' , 'thumbnail': h.url_for('/images/404.png')},
{'title': 'blablupp', 'id': '42', 'thumbnail': h.url_for('/images/404.png')},
{'title': 'James Bond drives a bulletproof Aston Martin !!!', 'id': '555' , 'thumbnail': h.url_for('/images/404.png')},
{'title': 'uiaenrtd uiaenrtd uiaenrdt uiaenrtd uiaenrtd', 'id': '666666666', 'thumbnail': h.url_for('/images/404.png')},
{'title': 'foobar', 'id': '123' , 'thumbnail': h.url_for('/images/404.png')},
{'title': 'blablupp', 'id': '42', 'thumbnail': h.url_for('/images/404.png')},
{'title': 'lolwtf hax !!!11', 'id': '9001', 'thumbnail': h.url_for('/images/404.png')}
]
return render('/xhtml/results.mako')
# return request.params['query']
# return h.form(h.url(action='search'), method='get')

@ -0,0 +1,27 @@
from yolanda.lib.base import *
class TemplateController(BaseController):
def view(self, url):
"""By default, the final controller tried to fulfill the request
when no other routes match. It may be used to display a template
when all else fails, e.g.::
def view(self, url):
return render('/%s' % url)
Or if you're using Mako and want to explicitly send a 404 (Not
Found) response code when the requested template doesn't exist::
import mako.exceptions
def view(self, url):
try:
return render('/%s' % url)
except mako.exceptions.TopLevelLookupException:
abort(404)
By default this controller aborts the request with a 404 (Not
Found)
"""
abort(404)

@ -0,0 +1,14 @@
import logging
from yolanda.lib.base import *
log = logging.getLogger(__name__)
class VideoController(BaseController):
def index(self):
return 'show a video html page'
def file(self):
return 'serve video'

Binary file not shown.

@ -0,0 +1,14 @@
"""The application's Globals object"""
from pylons import config
class Globals(object):
"""Globals acts as a container for objects available throughout the
life of the application
"""
def __init__(self):
"""One instance of Globals is created during application
initialization and is available during requests via the 'g'
variable
"""
pass

Binary file not shown.

@ -0,0 +1,27 @@
"""The base Controller API
Provides the BaseController class for subclassing, and other objects
utilized by Controllers.
"""
from pylons import c, cache, config, g, request, response, session
from pylons.controllers import WSGIController
from pylons.controllers.util import abort, etag_cache, redirect_to
from pylons.decorators import jsonify, validate
from pylons.i18n import _, ungettext, N_
from pylons.templating import render
import yolanda.lib.helpers as h
import yolanda.model as model
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)
# Include the '_' function in the public names
__all__ = [__name for __name in locals().keys() if not __name.startswith('_') \
or __name == '_']

Binary file not shown.

@ -0,0 +1,6 @@
"""Helper functions
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 *

Binary file not shown.

Binary file not shown.

@ -0,0 +1,97 @@
/* reset */
*
{
margin: 0px;
padding: 0px;
}
/* re/b/oot */
body
{
padding-bottom: 0.5em;
text-align: center;
}
div
{
background-color: #eeeeec;
color: black;
border: 1px solid black;
margin: 0.5em;
padding: 0.5em;
}
form
{
padding: 0.5em;
}
form input
{
font-size: 1.2em;
width: 11em;
}
form input[type="text"]
{
text-align: left;
}
h1
{
font-size: 1.2em;
font-weight: normal;
}
ol, ul[role="navigation"]
{
list-style-position: inside;
list-style-type: none;
}
ol#results
{
margin: 0.5em;
padding: 0.5em;
}
ol#results li
{
display: inline-block;
padding: 0.5em;
vertical-align: top;
width: 227px;
}
ol#results li img
{
border: 1px solid black;
}
#antipixel li, #footer li
{
display: inline-block;
}
#antipixel li
{
padding: 0.5em;
}
#copyright
{
background-color: #eeeeec;
clear: right;
color: black;
border: 1px solid black;
margin: 0.5em;
padding: 0.5em;
font-family: monospace;
}
#heading-box, #search-box
{
clear: right;
float: right;
width: 15em;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

@ -0,0 +1,90 @@
<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type"
content="application/xhtml+xml;charset=utf-8"
/>
<link
rel="stylesheet"
type="text/css"
media="screen"
href="${h.url_for('/css/default.css')}"
/>
<title>
Yolanda - ${self.title()}
</title>
</head>
<body>
<div id="heading-box">
<h1>
${self.heading()}
</h1>
</div>
<div id="search-box">
<h1>
Search all videos
</h1>
${h.form(h.url_for('search_results'), method='get')}
${h.text_field('query')}
${h.submit('Search')}
${h.end_form()}
</div>
${self.body()}
<div id="copyright">
<em>Yolanda</em> Copyright &copy; 2007, 2008 <em>The Yolanda Developers</em> &ndash;
This program comes with <em>absolutely no warranty</em>; for details <a href="">click here</a>.
This is <em>free software</em>, and you are welcome to redistribute it
under certain conditions; <a href="">click here</a> for details.
To view the source code, <a href="">click here</a>. Report bugs <a href="">here</a>.
</div>
<ul id="antipixel" role="navigation">
<li>
<a href="http://validator.w3.org/">
<img alt="XHTML 1.1 logo" class="antipixel" src="" />
</a>
</li>
<li>
<a href="http://jigsaw.w3.org/css-validator/">
<img alt="CSS logo" class="antipixel" src="" />
</a>
</li>
<li>
<a href="">
<img alt="Javascript logo" class="antipixel" src="" />
</a>
</li>
<li>
<a href="http://www.theora.org/">
<img alt="Ogg Theora logo" class="antipixel" src="" />
</a>
</li>
</ul>
</body>
</html>

@ -0,0 +1,11 @@
<%inherit file="base.mako"/>
<%def name="title()">
front page
</%def>
<%def name="heading()">
Welcome, youngling !
</%def>
LOL INDEX

@ -0,0 +1,27 @@
<%inherit file="base.mako"/>
<%def name="title()">
results for "${c.query}"
</%def>
<%def name="heading()">
9001 results for "${c.query}":
</%def>
<%def name="results_listing(results)">
<ol id="results">
% for result in c.results:
<li id="result">
<a href="${h.url_for('video_page', video=result)}">
<img src="${result['thumbnail']}" alt='thumbnail for "${result['title']}"'/>
</a>
<br />
<a href="${h.url_for('video_page', video=result)}">
${result['title']}
</a>
</li>
% endfor
</ol>
</%def>
${results_listing(c.results)}

@ -0,0 +1,40 @@
"""Pylons application test package
When the test runner finds and executes tests within this directory,
this file will be loaded to setup the test environment.
It registers the root directory of the project in sys.path and
pkg_resources, in case the project hasn't been installed with
setuptools. It also initializes the application via websetup (paster
setup-app) with the project's test.ini configuration file.
"""
import os
import sys
from unittest import TestCase
import pkg_resources
import paste.fixture
import paste.script.appinstall
from paste.deploy import loadapp
from routes import url_for
__all__ = ['url_for', 'TestController']
here_dir = os.path.dirname(os.path.abspath(__file__))
conf_dir = os.path.dirname(os.path.dirname(here_dir))
sys.path.insert(0, conf_dir)
pkg_resources.working_set.add_entry(conf_dir)
pkg_resources.require('Paste')
pkg_resources.require('PasteScript')
test_file = os.path.join(conf_dir, 'test.ini')
cmd = paste.script.appinstall.SetupCommand('setup-app')
cmd.run([test_file])
class TestController(TestCase):
def __init__(self, *args, **kwargs):
wsgiapp = loadapp('config:test.ini', relative_to=conf_dir)
self.app = paste.fixture.TestApp(wsgiapp)
TestCase.__init__(self, *args, **kwargs)

@ -0,0 +1,7 @@
from yolanda.tests import *
class TestAccountController(TestController):
def test_index(self):
response = self.app.get(url_for(controller='account'))
# Test response...

@ -0,0 +1,7 @@
from yolanda.tests import *
class TestIndexController(TestController):
def test_index(self):
response = self.app.get(url_for(controller='index'))
# Test response...

@ -0,0 +1,7 @@
from yolanda.tests import *
class TestSearchController(TestController):
def test_index(self):
response = self.app.get(url_for(controller='search'))
# Test response...

@ -0,0 +1,7 @@
from yolanda.tests import *
class TestVideoController(TestController):
def test_index(self):
response = self.app.get(url_for(controller='video'))
# Test response...

@ -0,0 +1,14 @@
"""Setup the Yolanda application"""
import logging
from paste.deploy import appconfig
from pylons import config
from yolanda.config.environment import load_environment
log = logging.getLogger(__name__)
def setup_config(command, filename, section, vars):
"""Place any commands to setup yolanda here"""
conf = appconfig('config:' + filename)
load_environment(conf.global_conf, conf.local_conf)
Loading…
Cancel
Save