summaryrefslogtreecommitdiff
path: root/docs/tutorials/bfgwiki2
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-01 00:12:03 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-01 00:12:03 +0000
commitc2dbab3e024be02c4246746f3d7d9dc5da9219d8 (patch)
tree19bd184b72044f5e80538e1cefab4adf53530559 /docs/tutorials/bfgwiki2
parent1f5d891f9f82b7e4b991268c1beace96bb7d7f02 (diff)
downloadpyramid-c2dbab3e024be02c4246746f3d7d9dc5da9219d8.tar.gz
pyramid-c2dbab3e024be02c4246746f3d7d9dc5da9219d8.tar.bz2
pyramid-c2dbab3e024be02c4246746f3d7d9dc5da9219d8.zip
Only keep useful stuff.
Diffstat (limited to 'docs/tutorials/bfgwiki2')
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/setup.cfg2
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial.ini21
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/configure.zcml11
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py47
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/models.py26
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/run.py31
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/edit.pt31
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/login.pt32
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/style.css109
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/view.pt27
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/tests.py150
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py94
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/CHANGES.txt (renamed from docs/tutorials/bfgwiki2/src/authorization/CHANGES.txt)0
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/README.txt (renamed from docs/tutorials/bfgwiki2/src/authorization/README.txt)0
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/ez_setup.py (renamed from docs/tutorials/bfgwiki2/src/authorization/ez_setup.py)0
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/setup.cfg6
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/setup.py (renamed from docs/tutorials/bfgwiki2/src/authorization/setup.py)17
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial.ini (renamed from docs/tutorials/bfgwiki2/src/models/tutorial.ini)9
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/__init__.py (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/__init__.py)0
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/configure.zcml19
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/models.py50
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/run.py27
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/mytemplate.pt (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/mytemplate.pt)0
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/mytemplate.pt.py110
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/default.css (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/default.css)0
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img01.gif (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img01.gif)bin3840 -> 3840 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img02.gif (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img02.gif)bin4689 -> 4689 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img03.gif (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img03.gif)bin229 -> 229 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img04.gif (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img04.gif)bin92 -> 92 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/spacer.gif (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/spacer.gif)bin43 -> 43 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/templatelicense.txt (renamed from docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/templatelicense.txt)0
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/tests.py28
-rw-r--r--docs/tutorials/bfgwiki2/src/basiclayout/tutorial/views.py (renamed from docs/tutorials/bfgwiki2/src/models/tutorial/views.py)6
-rw-r--r--docs/tutorials/bfgwiki2/src/models/CHANGES.txt3
-rw-r--r--docs/tutorials/bfgwiki2/src/models/README.txt4
-rw-r--r--docs/tutorials/bfgwiki2/src/models/ez_setup.py276
-rw-r--r--docs/tutorials/bfgwiki2/src/models/setup.cfg2
-rw-r--r--docs/tutorials/bfgwiki2/src/models/setup.py48
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/__init__.py2
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/configure.zcml17
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/models.py22
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/run.py17
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/templates/mytemplate.pt99
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/default.css380
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img01.gifbin3840 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img02.gifbin4689 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img03.gifbin229 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img04.gifbin92 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/spacer.gifbin43 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/templatelicense.txt243
-rw-r--r--docs/tutorials/bfgwiki2/src/models/tutorial/tests.py75
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/CHANGES.txt3
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/README.txt4
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/ez_setup.py276
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/setup.cfg2
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/setup.py48
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial.ini21
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/__init__.py2
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/configure.zcml8
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/models.py22
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/run.py17
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/edit.pt30
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/mytemplate.pt99
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/default.css380
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img01.gifbin3840 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img02.gifbin4689 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img03.gifbin229 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img04.gifbin92 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/spacer.gifbin43 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/style.css109
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/templatelicense.txt243
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/view.pt26
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/tests.py150
-rw-r--r--docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/views.py81
-rw-r--r--docs/tutorials/bfgwiki2/src/views/CHANGES.txt3
-rw-r--r--docs/tutorials/bfgwiki2/src/views/README.txt4
-rw-r--r--docs/tutorials/bfgwiki2/src/views/ez_setup.py276
-rw-r--r--docs/tutorials/bfgwiki2/src/views/setup.cfg2
-rw-r--r--docs/tutorials/bfgwiki2/src/views/setup.py48
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial.ini21
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/__init__.py2
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/configure.zcml34
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/models.py22
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/run.py17
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/edit.pt30
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/mytemplate.pt99
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/default.css380
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img01.gifbin3840 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img02.gifbin4689 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img03.gifbin229 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img04.gifbin92 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/spacer.gifbin43 -> 0 bytes
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/style.css109
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/templatelicense.txt243
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/templates/view.pt26
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/tests.py150
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/views.py71
97 files changed, 260 insertions, 4839 deletions
diff --git a/docs/tutorials/bfgwiki2/src/authorization/setup.cfg b/docs/tutorials/bfgwiki2/src/authorization/setup.cfg
deleted file mode 100644
index 8ce7ae0fb..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[easy_install]
-index_url = http://dist.repoze.org/bfg/current/simple
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial.ini b/docs/tutorials/bfgwiki2/src/authorization/tutorial.ini
deleted file mode 100644
index 181682585..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-[DEFAULT]
-debug = true
-
-[app:zodb]
-use = egg:tutorial#app
-reload_templates = true
-debug_authorization = false
-debug_notfound = false
-zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000
-
-[pipeline:main]
-pipeline =
- egg:repoze.zodbconn#closer
- egg:Paste#evalerror
- egg:repoze.tm#tm
- zodb
-
-[server:main]
-use = egg:Paste#http
-host = 0.0.0.0
-port = 6543
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/configure.zcml b/docs/tutorials/bfgwiki2/src/authorization/tutorial/configure.zcml
deleted file mode 100644
index df11c18b1..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/configure.zcml
+++ /dev/null
@@ -1,11 +0,0 @@
-<configure xmlns="http://namespaces.repoze.org/bfg">
-
- <!-- this must be included for the view declarations to work -->
- <include package="repoze.bfg.includes" />
-
- <scan package="."/>
-
- <utility provides="repoze.bfg.interfaces.IForbiddenResponseFactory"
- component=".login.login"/>
-
-</configure>
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py b/docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py
deleted file mode 100644
index 293f3dcd5..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from webob.exc import HTTPFound
-
-from repoze.bfg.chameleon_zpt import render_template_to_response
-from repoze.bfg.view import bfg_view
-from repoze.bfg.url import model_url
-
-from repoze.bfg.security import remember
-from repoze.bfg.security import forget
-
-from tutorial.models import Wiki
-from tutorial.run import USERS
-
-@bfg_view(for_=Wiki, name='login')
-def login(context, request):
- login_url = model_url(context, request, 'login')
- referrer = request.environ.get('HTTP_REFERER', '/')
- if referrer == login_url:
- referrer = '/' # never use the login form itself as came_from
- came_from = request.params.get('came_from', referrer)
- message = ''
- login = ''
- password = ''
- if 'form.submitted' in request.params:
- login = request.params['login']
- password = request.params['password']
- if USERS.get(login) == password:
- headers = remember(request, login)
- return HTTPFound(location = came_from,
- headers = headers)
- message = 'Failed login'
-
- return render_template_to_response(
- 'templates/login.pt',
- message = message,
- url = request.application_url + '/login',
- came_from = came_from,
- login = login,
- password = password,
- request =request,
- )
-
-@bfg_view(for_=Wiki, name='logout')
-def logout(context, request):
- headers = forget(request)
- return HTTPFound(location = model_url(context, request),
- headers = headers)
-
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/models.py b/docs/tutorials/bfgwiki2/src/authorization/tutorial/models.py
deleted file mode 100644
index 976f5e3e9..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/models.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from persistent import Persistent
-from persistent.mapping import PersistentMapping
-
-from repoze.bfg.security import Allow
-from repoze.bfg.security import Everyone
-
-class Wiki(PersistentMapping):
- __name__ = None
- __parent__ = None
- __acl__ = [ (Allow, Everyone, 'view'), (Allow, 'editor', 'edit') ]
-
-class Page(Persistent):
- def __init__(self, data):
- self.data = data
-
-def appmaker(zodb_root):
- if not 'app_root' in zodb_root:
- app_root = Wiki()
- frontpage = Page('This is the front page')
- app_root['FrontPage'] = frontpage
- frontpage.__name__ = 'FrontPage'
- frontpage.__parent__ = app_root
- zodb_root['app_root'] = app_root
- import transaction
- transaction.commit()
- return zodb_root['app_root']
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/run.py b/docs/tutorials/bfgwiki2/src/authorization/tutorial/run.py
deleted file mode 100644
index a5d0cf39c..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/run.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from repoze.bfg.router import make_app
-from repoze.bfg.authentication import AuthTktAuthenticationPolicy
-from repoze.zodbconn.finder import PersistentApplicationFinder
-
-
-def app(global_config, **kw):
- """ This function returns a repoze.bfg.router.Router object.
-
- It is usually called by the PasteDeploy framework during ``paster serve``.
- """
- # paster app config callback
- import tutorial
- from tutorial.models import appmaker
- zodb_uri = kw.get('zodb_uri')
- if zodb_uri is None:
- raise ValueError("No 'zodb_uri' in application configuration.")
-
- authpolicy = AuthTktAuthenticationPolicy('seekr!t', callback=groupfinder)
-
- get_root = PersistentApplicationFinder(zodb_uri, appmaker)
- return make_app(get_root, tutorial, authentication_policy=authpolicy,
- options=kw)
-
-USERS = {'editor':'editor',
- 'viewer':'viewer'}
-GROUPS = {'editor':['group.editors']}
-
-def groupfinder(userid):
- if userid in USERS:
- return GROUPS.get(userid, [])
-
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/edit.pt b/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/edit.pt
deleted file mode 100644
index d6b3ad466..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/edit.pt
+++ /dev/null
@@ -1,31 +0,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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
- <title>bfg tutorial wiki (based on TurboGears 20-Minute Wiki) Editing: ${page.__name__}</title>
- <link rel="stylesheet" type="text/css"
- href="${request.application_url}/static/style.css" />
-</head>
-
-<body>
-
-<div class="main_content">
- <div style="float:right; width: 10em;"> Viewing
- <span tal:replace="page.__name__">Page Name Goes Here</span> <br/>
- You can return to the <a href="${request.application_url}">FrontPage</a>.
- <span tal:condition="logged_in"><a href="${request.application_url}/logout">Logout</a></span>
- </div>
-
- <div>
- <form action="${save_url}" method="post">
- <textarea name="body" tal:content="page.data" rows="10" cols="60"/>
- <input type="submit" name="form.submitted" value="Save"/>
- </form>
- </div>
-</div>
-</body>
-</html>
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/login.pt b/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/login.pt
deleted file mode 100644
index a9e086461..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/login.pt
+++ /dev/null
@@ -1,32 +0,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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
- <title>bfg tutorial wiki (based on TurboGears 20-Minute Wiki)</title>
- <link rel="stylesheet" type="text/css"
- href="${request.application_url}/static/style.css" />
-</head>
-
-<body>
-
-<h1>Log In</h1>
-
-<div tal:replace="message"/>
-
-<div class="main_content">
- <form action="${url}" method="post">
- <input type="hidden" name="came_from" value="${came_from}"/>
- <input type="text" name="login" value="${login}"/>
- <br/>
- <input type="password" name="password" value="${password}"/>
- <br/>
- <input type="submit" name="form.submitted" value="Log In"/>
- </form>
-</div>
-
-</body>
-</html>
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/style.css b/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/style.css
deleted file mode 100644
index 0a4b5767e..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/style.css
+++ /dev/null
@@ -1,109 +0,0 @@
-html, body {
- color: black;
- background-color: #ddd;
- font: x-small "Lucida Grande", "Lucida Sans Unicode", geneva, verdana, sans-serif;
- margin: 0;
- padding: 0;
-}
-
-td, th {padding:3px;border:none;}
-tr th {text-align:left;background-color:#f0f0f0;color:#333;}
-tr.odd td {background-color:#edf3fe;}
-tr.even td {background-color:#fff;}
-
-#header {
- height: 80px;
- width: 777px;
- background: blue URL('../images/header_inner.png') no-repeat;
- border-left: 1px solid #aaa;
- border-right: 1px solid #aaa;
- margin: 0 auto 0 auto;
-}
-
-a.link, a, a.active {
- color: #369;
-}
-
-
-#main_content {
- color: black;
- font-size: 127%;
- background-color: white;
- width: 757px;
- margin: 0 auto 0 auto;
- border-left: 1px solid #aaa;
- border-right: 1px solid #aaa;
- padding: 10px;
-}
-
-#sidebar {
- border: 1px solid #aaa;
- background-color: #eee;
- margin: 0.5em;
- padding: 1em;
- float: right;
- width: 200px;
- font-size: 88%;
-}
-
-#sidebar h2 {
- margin-top: 0;
-}
-
-#sidebar ul {
- margin-left: 1.5em;
- padding-left: 0;
-}
-
-h1,h2,h3,h4,h5,h6,#getting_started_steps {
- font-family: "Century Schoolbook L", Georgia, serif;
- font-weight: bold;
-}
-
-h2 {
- font-size: 150%;
-}
-
-#footer {
- border: 1px solid #aaa;
- border-top: 0px none;
- color: #999;
- background-color: white;
- padding: 10px;
- font-size: 80%;
- text-align: center;
- width: 757px;
- margin: 0 auto 1em auto;
-}
-
-.code {
- font-family: monospace;
-}
-
-span.code {
- font-weight: bold;
- background: #eee;
-}
-
-#status_block {
- margin: 0 auto 0.5em auto;
- padding: 15px 10px 15px 55px;
- background: #cec URL('../images/ok.png') left center no-repeat;
- border: 1px solid #9c9;
- width: 450px;
- font-size: 120%;
- font-weight: bolder;
-}
-
-.notice {
- margin: 0.5em auto 0.5em auto;
- padding: 15px 10px 15px 55px;
- width: 450px;
- background: #eef URL('../images/info.png') left center no-repeat;
- border: 1px solid #cce;
-}
-
-.fielderror {
- color: red;
- font-weight: bold;
-}
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/view.pt b/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/view.pt
deleted file mode 100644
index 3c5cc2a33..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/view.pt
+++ /dev/null
@@ -1,27 +0,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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
- <title>${page.__name__} - bfg tutorial wiki (based on TurboGears 20-Minute Wiki)</title>
- <link rel="stylesheet" type="text/css"
- href="${request.application_url}/static/style.css" />
-</head>
-
-<body>
-
-<div class="main_content">
-<div style="float:right; width: 10em;"> Viewing
-<span tal:replace="page.__name__">Page Name Goes Here</span> <br/>
-You can return to the <a href="${request.application_url}">FrontPage</a>.
-<span tal:condition="logged_in"><a href="${request.application_url}/logout">Logout</a></span>
-</div>
-
-<div tal:replace="structure content">Page text goes here.</div>
-<p><a tal:attributes="href edit_url" href="">Edit this page</a></p>
-</div>
-
-</body></html>
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/tests.py b/docs/tutorials/bfgwiki2/src/authorization/tutorial/tests.py
deleted file mode 100644
index 84a3a0f37..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/tests.py
+++ /dev/null
@@ -1,150 +0,0 @@
-import unittest
-
-from repoze.bfg import testing
-
-class PageModelTests(unittest.TestCase):
-
- def _getTargetClass(self):
- from tutorial.models import Page
- return Page
-
- def _makeOne(self, data=u'some data'):
- return self._getTargetClass()(data=data)
-
- def test_constructor(self):
- instance = self._makeOne()
- self.assertEqual(instance.data, u'some data')
-
-class WikiModelTests(unittest.TestCase):
-
- def _getTargetClass(self):
- from tutorial.models import Wiki
- return Wiki
-
- def _makeOne(self):
- return self._getTargetClass()()
-
- def test_it(self):
- wiki = self._makeOne()
- self.assertEqual(wiki.__parent__, None)
- self.assertEqual(wiki.__name__, None)
-
-class AppmakerTests(unittest.TestCase):
- def _callFUT(self, zodb_root):
- from tutorial.models import appmaker
- return appmaker(zodb_root)
-
- def test_it(self):
- root = {}
- self._callFUT(root)
- self.assertEqual(root['app_root']['FrontPage'].data,
- 'This is the front page')
-
-class ViewWikiTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def test_it(self):
- from tutorial.views import view_wiki
- context = testing.DummyModel()
- request = testing.DummyRequest()
- response = view_wiki(context, request)
- self.assertEqual(response.location, 'http://example.com/FrontPage')
-
-class ViewPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import view_page
- return view_page(context, request)
-
- def test_it(self):
- wiki = testing.DummyModel()
- wiki['IDoExist'] = testing.DummyModel()
- context = testing.DummyModel(data='Hello CruelWorld IDoExist')
- context.__parent__ = wiki
- context.__name__ = 'thepage'
- request = testing.DummyRequest()
- renderer = testing.registerDummyRenderer('templates/view.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(
- renderer.content,
- '<div class="document">\n'
- '<p>Hello <a href="http://example.com/add_page/CruelWorld">'
- 'CruelWorld</a> '
- '<a href="http://example.com/IDoExist/">'
- 'IDoExist</a>'
- '</p>\n</div>\n')
- self.assertEqual(renderer.edit_url,
- 'http://example.com/thepage/edit_page')
-
-
-class AddPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import add_page
- return add_page(context, request)
-
- def test_it_notsubmitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest()
- request.subpath = ['AnotherPage']
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(renderer.page.data, '')
-
- def test_it_submitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest({'form.submitted':True,
- 'body':'Hello yo!'})
- request.subpath = ['AnotherPage']
- response = self._callFUT(context, request)
- page = context['AnotherPage']
- self.assertEqual(page.data, 'Hello yo!')
- self.assertEqual(page.__name__, 'AnotherPage')
- self.assertEqual(page.__parent__, context)
-
-class EditPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import edit_page
- return edit_page(context, request)
-
- def test_it_notsubmitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest()
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(renderer.page, context)
-
- def test_it_submitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest({'form.submitted':True,
- 'body':'Hello yo!'})
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(response.location, 'http://example.com/')
- self.assertEqual(context.data, 'Hello yo!')
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py b/docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py
deleted file mode 100644
index c8c02e57e..000000000
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py
+++ /dev/null
@@ -1,94 +0,0 @@
-from docutils.core import publish_parts
-import re
-
-from webob.exc import HTTPFound
-from repoze.bfg.url import model_url
-from repoze.bfg.chameleon_zpt import render_template_to_response
-
-from repoze.bfg.security import authenticated_userid
-
-from repoze.bfg.view import static
-from repoze.bfg.view import bfg_view
-
-from tutorial.models import Page
-from tutorial.models import Wiki
-
-# regular expression used to find WikiWords
-wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")
-
-static_app = static('templates/static')
-
-@bfg_view(for_=Wiki, name='static', permission='view')
-def static_view(context, request):
- return static_app(context, request)
-
-@bfg_view(for_=Wiki, permission='view')
-def view_wiki(context, request):
- return HTTPFound(location = model_url(context, request, 'FrontPage'))
-
-@bfg_view(for_=Page, permission='view')
-def view_page(context, request):
- wiki = context.__parent__
-
- def check(match):
- word = match.group(1)
- if word in wiki:
- page = wiki[word]
- view_url = model_url(page, request)
- return '<a href="%s">%s</a>' % (view_url, word)
- else:
- add_url = request.application_url + '/add_page/' + word
- return '<a href="%s">%s</a>' % (add_url, word)
-
- content = publish_parts(context.data, writer_name='html')['html_body']
- content = wikiwords.sub(check, content)
- edit_url = model_url(context, request, 'edit_page')
-
- logged_in = authenticated_userid(request)
-
- return render_template_to_response('templates/view.pt',
- request = request,
- page = context,
- content = content,
- logged_in = logged_in,
- edit_url = edit_url)
-
-@bfg_view(for_=Wiki, name='add_page', permission='edit')
-def add_page(context, request):
- name = request.subpath[0]
- if 'form.submitted' in request.params:
- body = request.params['body']
- page = Page(body)
- page.__name__ = name
- page.__parent__ = context
- context[name] = page
- return HTTPFound(location = model_url(page, request))
- save_url = model_url(context, request, 'add_page', name)
- page = Page('')
- page.__name__ = name
- page.__parent__ = context
-
- logged_in = 'repoze.who.identity' in request.environ
-
- return render_template_to_response('templates/edit.pt',
- request = request,
- page = page,
- logged_in = logged_in,
- save_url = save_url)
-
-@bfg_view(for_=Page, name='edit_page', permission='edit')
-def edit_page(context, request):
- if 'form.submitted' in request.params:
- context.data = request.params['body']
- return HTTPFound(location = model_url(context, request))
-
- logged_in = 'repoze.who.identity' in request.environ
-
- return render_template_to_response('templates/edit.pt',
- request = request,
- page = context,
- logged_in = logged_in,
- save_url = model_url(context, request,
- 'edit_page')
- )
-
diff --git a/docs/tutorials/bfgwiki2/src/authorization/CHANGES.txt b/docs/tutorials/bfgwiki2/src/basiclayout/CHANGES.txt
index 1544cf53b..1544cf53b 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/CHANGES.txt
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/CHANGES.txt
diff --git a/docs/tutorials/bfgwiki2/src/authorization/README.txt b/docs/tutorials/bfgwiki2/src/basiclayout/README.txt
index d41f7f90f..d41f7f90f 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/README.txt
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/README.txt
diff --git a/docs/tutorials/bfgwiki2/src/authorization/ez_setup.py b/docs/tutorials/bfgwiki2/src/basiclayout/ez_setup.py
index d24e845e5..d24e845e5 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/ez_setup.py
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/ez_setup.py
diff --git a/docs/tutorials/bfgwiki2/src/basiclayout/setup.cfg b/docs/tutorials/bfgwiki2/src/basiclayout/setup.cfg
new file mode 100644
index 000000000..807ea6b0e
--- /dev/null
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/setup.cfg
@@ -0,0 +1,6 @@
+[nosetests]
+match=^test
+nocapture=1
+cover-package=tutorial
+with-coverage=1
+cover-erase=1
diff --git a/docs/tutorials/bfgwiki2/src/authorization/setup.py b/docs/tutorials/bfgwiki2/src/basiclayout/setup.py
index b289ca8b0..480a690d2 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/setup.py
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/setup.py
@@ -1,4 +1,5 @@
import os
+import sys
from ez_setup import use_setuptools
use_setuptools()
@@ -11,12 +12,15 @@ CHANGES = open(os.path.join(here, 'CHANGES.txt')).read()
requires = [
'repoze.bfg',
- 'docutils',
- 'ZODB3',
- 'repoze.zodbconn',
- 'repoze.tm',
+ 'SQLAlchemy',
+ 'transaction',
+ 'repoze.tm2',
+ 'zope.sqlalchemy',
]
+if sys.version_info[:3] < (2,5,0):
+ requires.append('pysqlite')
+
setup(name='tutorial',
version='0.1',
description='tutorial',
@@ -37,9 +41,8 @@ setup(name='tutorial',
packages=find_packages(),
include_package_data=True,
zip_safe=False,
- install_requires=requires,
- tests_require=requires,
- test_suite="tutorial",
+ test_suite='tutorial',
+ install_requires = requires,
entry_points = """\
[paste.app_factory]
app = tutorial.run:app
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial.ini b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial.ini
index 897a2bde6..1f8a5ccce 100644
--- a/docs/tutorials/bfgwiki2/src/models/tutorial.ini
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial.ini
@@ -1,18 +1,17 @@
[DEFAULT]
debug = true
-[app:zodb]
+[app:sql]
use = egg:tutorial#app
reload_templates = true
debug_authorization = false
debug_notfound = false
-zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000
+db_string = sqlite:///%(here)s/tutorial.db
[pipeline:main]
pipeline =
- egg:repoze.zodbconn#closer
- egg:repoze.tm#tm
- zodb
+ egg:repoze.tm2#tm
+ sql
[server:main]
use = egg:Paste#http
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/__init__.py b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/__init__.py
index cbdfd3ac6..cbdfd3ac6 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/__init__.py
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/__init__.py
diff --git a/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/configure.zcml b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/configure.zcml
new file mode 100644
index 000000000..4858c47fd
--- /dev/null
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/configure.zcml
@@ -0,0 +1,19 @@
+<configure xmlns="http://namespaces.repoze.org/bfg">
+
+ <!-- this must be included for the view declarations to work -->
+ <include package="repoze.bfg.includes" />
+
+ <subscriber for="repoze.bfg.interfaces.INewRequest"
+ handler=".run.handle_teardown"/>
+
+ <route path=""
+ name="home"
+ view=".views.my_view"
+ />
+
+ <route path="static/*subpath"
+ name="static"
+ view=".views.static_view"
+ />
+
+</configure>
diff --git a/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/models.py b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/models.py
new file mode 100644
index 000000000..63496583e
--- /dev/null
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/models.py
@@ -0,0 +1,50 @@
+import transaction
+
+from sqlalchemy import create_engine
+from sqlalchemy import Column
+from sqlalchemy import Integer
+from sqlalchemy import MetaData
+from sqlalchemy import Table
+from sqlalchemy import Unicode
+
+from sqlalchemy.exc import IntegrityError
+
+from sqlalchemy.orm import scoped_session
+from sqlalchemy.orm import sessionmaker
+from sqlalchemy.orm import mapper
+
+from zope.sqlalchemy import ZopeTransactionExtension
+
+DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
+
+metadata = MetaData()
+
+class Model(object):
+ def __init__(self, name=''):
+ self.name = name
+
+models_table = Table(
+ 'models',
+ metadata,
+ Column('id', Integer, primary_key=True),
+ Column('name', Unicode(255), unique=True),
+ )
+
+models_mapper = mapper(Model, models_table)
+
+def populate():
+ session = DBSession()
+ model = Model(name=u'root')
+ session.add(model)
+ session.flush()
+ transaction.commit()
+
+def initialize_sql(db_string, echo=False):
+ engine = create_engine(db_string, echo=echo)
+ DBSession.configure(bind=engine)
+ metadata.bind = engine
+ metadata.create_all(engine)
+ try:
+ populate()
+ except IntegrityError:
+ pass
diff --git a/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/run.py b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/run.py
new file mode 100644
index 000000000..f9789522c
--- /dev/null
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/run.py
@@ -0,0 +1,27 @@
+from repoze.bfg.router import make_app
+
+import tutorial
+from tutorial.models import DBSession
+from tutorial.models import initialize_sql
+
+class Cleanup:
+ def __init__(self, cleaner):
+ self.cleaner = cleaner
+ def __del__(self):
+ self.cleaner()
+
+def handle_teardown(event):
+ environ = event.request.environ
+ environ['tutorial.sasession'] = Cleanup(DBSession.remove)
+
+def app(global_config, **kw):
+ """ This function returns a repoze.bfg.router.Router object.
+
+ It is usually called by the PasteDeploy framework during ``paster serve``.
+ """
+ db_string = kw.get('db_string')
+ if db_string is None:
+ raise ValueError("No 'db_string' value in application configuration.")
+ initialize_sql(db_string)
+ return make_app(None, tutorial, options=kw)
+
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/mytemplate.pt b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/mytemplate.pt
index 767252554..767252554 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/mytemplate.pt
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/mytemplate.pt
diff --git a/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/mytemplate.pt.py b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/mytemplate.pt.py
new file mode 100644
index 000000000..678ee58fe
--- /dev/null
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/mytemplate.pt.py
@@ -0,0 +1,110 @@
+registry = dict(version='6.3')
+def bind():
+ from cPickle import loads as _loads
+ _init_stream = _loads('cchameleon.core.generation\ninitialize_stream\np1\n.')
+ _lookup_attr = _loads('cchameleon.core.codegen\nlookup_attr\np1\n.')
+ _init_scope = _loads('cchameleon.core.utils\necontext\np1\n.')
+ _re_amp = _loads("cre\n_compile\np1\n(S'&(?!([A-Za-z]+|#[0-9]+);)'\np2\nI0\ntRp3\n.")
+ _init_default = _loads('cchameleon.core.generation\ninitialize_default\np1\n.')
+ _lookup_name = _loads('cchameleon.core.codegen\nlookup_name\np1\n.')
+ _init_tal = _loads('cchameleon.core.generation\ninitialize_tal\np1\n.')
+ def render(econtext):
+ macros = econtext.get('macros')
+ _slots = econtext.get('_slots')
+ target_language = econtext.get('target_language')
+ u'_init_stream()'
+ (_out, _write) = _init_stream()
+ u'_init_tal()'
+ (_attributes, repeat) = _init_tal()
+ u'_init_default()'
+ _default = _init_default()
+ u'None'
+ default = None
+ u'None'
+ _domain = None
+ u'project'
+ _write(u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head><title>')
+ _tmp1 = econtext['project']
+ _tmp = _tmp1
+ if (_tmp.__class__ not in (str, unicode) and hasattr(_tmp, '__html__')):
+ _write(_tmp.__html__())
+ elif _tmp is not None:
+ if not (isinstance(_tmp, unicode)):
+ _tmp = str(_tmp)
+ if '&' in _tmp:
+ if ';' in _tmp:
+ _tmp = _re_amp.sub('&amp;', _tmp)
+ else:
+ _tmp = _tmp.replace('&', '&amp;')
+ if '<' in _tmp:
+ _tmp = _tmp.replace('<', '&lt;')
+ if '>' in _tmp:
+ _tmp = _tmp.replace('>', '&gt;')
+ _write(_tmp)
+ _write(u' Application</title>\n<meta name="keywords" content="python web application" />\n<meta name="description" content="repoze.bfg web application" />\n<link')
+ default = u'${request.application_url}/static/default.css'
+ "join(value('request.application_url'), u'/static/default.css')"
+ _tmp1 = ('%s%s' % (_lookup_attr(econtext['request'], 'application_url'), u'/static/default.css'))
+ default = None
+ if _tmp1 is _default:
+ _tmp1 = u'${request.application_url}/static/default.css'
+ if (_tmp1 is None or _tmp1 is False):
+ pass
+ else:
+ if not (isinstance(_tmp1, unicode)):
+ _tmp1 = str(_tmp1)
+ if '&' in _tmp1:
+ if ';' in _tmp1:
+ _tmp1 = _re_amp.sub('&amp;', _tmp1)
+ else:
+ _tmp1 = _tmp1.replace('&', '&amp;')
+ if '<' in _tmp1:
+ _tmp1 = _tmp1.replace('<', '&lt;')
+ if '>' in _tmp1:
+ _tmp1 = _tmp1.replace('>', '&gt;')
+ if '"' in _tmp1:
+ _tmp1 = _tmp1.replace('"', '&quot;')
+ _write((' href="' + _tmp1) + '"')
+ u'project'
+ _write(u' rel="stylesheet" type="text/css" />\n</head>\n<body>\n<!-- start header -->\n<div id="logo">\n <h2><code>')
+ _tmp1 = econtext['project']
+ _tmp = _tmp1
+ if (_tmp.__class__ not in (str, unicode) and hasattr(_tmp, '__html__')):
+ _write(_tmp.__html__())
+ elif _tmp is not None:
+ if not (isinstance(_tmp, unicode)):
+ _tmp = str(_tmp)
+ if '&' in _tmp:
+ if ';' in _tmp:
+ _tmp = _re_amp.sub('&amp;', _tmp)
+ else:
+ _tmp = _tmp.replace('&', '&amp;')
+ if '<' in _tmp:
+ _tmp = _tmp.replace('<', '&lt;')
+ if '>' in _tmp:
+ _tmp = _tmp.replace('>', '&gt;')
+ _write(_tmp)
+ u'project'
+ _write(u'</code>, a <code>repoze.bfg</code> application</h2>\n</div>\n<div id="header">\n <div id="menu">\n </div>\n</div>\n<!-- end header -->\n<div id="wrapper">\n <!-- start page -->\n <div id="page">\n <!-- start content -->\n <div id="content">\n <div class="post">\n\t<h1 class="title">Welcome to <code>')
+ _tmp1 = econtext['project']
+ _tmp = _tmp1
+ if (_tmp.__class__ not in (str, unicode) and hasattr(_tmp, '__html__')):
+ _write(_tmp.__html__())
+ elif _tmp is not None:
+ if not (isinstance(_tmp, unicode)):
+ _tmp = str(_tmp)
+ if '&' in _tmp:
+ if ';' in _tmp:
+ _tmp = _re_amp.sub('&amp;', _tmp)
+ else:
+ _tmp = _tmp.replace('&', '&amp;')
+ if '<' in _tmp:
+ _tmp = _tmp.replace('<', '&lt;')
+ if '>' in _tmp:
+ _tmp = _tmp.replace('>', '&gt;')
+ _write(_tmp)
+ _write(u'</code>, an\n\tapplication generated by the <a href="http://bfg.repoze.org">repoze.bfg</a> web\n\tapplication framework.</h1>\n </div>\n </div>\n <!-- end content -->\n <!-- start sidebar -->\n <div id="sidebar">\n <ul>\n\t<li id="search">\n\t <h2>Search<br /> <code>repoze.bfg</code> Documentation</h2>\n\t <form method="get" action="http://bfg.repoze.org/searchresults">\n\t <fieldset>\n\t <input type="text" id="q" name="text" value="" />\n\t <input type="submit" id="x" value="Search" />\n\t </fieldset>\n\t </form>\n\t</li>\n\t<li>\n\t <h2><code>repoze.bfg</code> links</h2>\n\t <ul>\n\t <li><a href="http://docs.repoze.org/bfg/#narrative-documentation">Narrative\n\t Documentation</a>\n </li>\n\t <li>\n <a href="http://docs.repoze.org/bfg/#api-documentation">API\n Documentation</a>\n </li>\n\t <li>\n <a href="http://docs.repoze.org/bfg/#tutorials">Tutorials</a>\n </li>\n\t <li>\n <a href="http://docs.repoze.org/bfg/#change-history">Change\n History</a>\n </li>\n\t <li>\n <a href="http://docs.repoze.org/bfg/#sample-applications">Sample\n Applications</a>\n </li>\n\t <li>\n <a href="http://docs.repoze.org/bfg/#support-and-development">Support\n and Development</a>\n </li>\n\t <li>\n <a href="irc://irc.freenode.net#repoze">IRC Channel</a>\n </li>\n\t </ul>\n\t</li>\n </ul>\n </div>\n <!-- end sidebar -->\n <div style="clear: both;">&nbsp;</div>\n </div>\n</div>\n<!-- end page -->\n<!-- start footer -->\n<div id="footer">\n <p id="legal">( c ) 2008. All Rights Reserved. Template design\n by <a href="http://www.freecsstemplates.org/">Free CSS\n Templates</a>.</p>\n</div>\n<!-- end footer -->\n</body>\n</html>')
+ return _out.getvalue()
+ return render
+
+registry[(None, True, '1488bdb950901f8f258549439ef6661a49aae984')] = bind()
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/default.css b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/default.css
index 41b3debde..41b3debde 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/default.css
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/default.css
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img01.gif b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img01.gif
index 5f082bd99..5f082bd99 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img01.gif
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img01.gif
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img02.gif b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img02.gif
index 45a3ae976..45a3ae976 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img02.gif
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img02.gif
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img03.gif b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img03.gif
index d92ea38f9..d92ea38f9 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img03.gif
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img03.gif
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img04.gif b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img04.gif
index 950c4af9d..950c4af9d 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/img04.gif
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/img04.gif
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/spacer.gif b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/spacer.gif
index 5bfd67a2d..5bfd67a2d 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/images/spacer.gif
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/images/spacer.gif
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/templatelicense.txt b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/templatelicense.txt
index ccb6b06ab..ccb6b06ab 100644
--- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/templates/static/templatelicense.txt
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/templates/static/templatelicense.txt
diff --git a/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/tests.py b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/tests.py
new file mode 100644
index 000000000..8d163ad20
--- /dev/null
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/tests.py
@@ -0,0 +1,28 @@
+import unittest
+from repoze.bfg import testing
+
+def _initTestingDB():
+ from tutorial.models import initialize_sql
+ session = initialize_sql('sqlite://')
+ return session
+
+class TestMyView(unittest.TestCase):
+ def setUp(self):
+ testing.cleanUp()
+ _initTestingDB()
+
+ def tearDown(self):
+ testing.cleanUp()
+
+ def _callFUT(self, context, request):
+ from tutorial.views import my_view
+ return my_view(context, request)
+
+ def test_it(self):
+ request = testing.DummyRequest()
+ context = testing.DummyModel()
+ renderer = testing.registerDummyRenderer('templates/mytemplate.pt')
+ response = self._callFUT(context, request)
+ self.assertEqual(renderer.root.name, 'root')
+ self.assertEqual(renderer.request, request)
+ self.assertEqual(renderer.project, 'tutorial')
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/views.py b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/views.py
index 13b84352f..375293b02 100644
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/views.py
+++ b/docs/tutorials/bfgwiki2/src/basiclayout/tutorial/views.py
@@ -1,9 +1,15 @@
from repoze.bfg.chameleon_zpt import render_template_to_response
from repoze.bfg.view import static
+from tutorial.models import DBSession
+from tutorial.models import Model
+
static_view = static('templates/static')
def my_view(context, request):
+ dbsession = DBSession()
+ root = dbsession.query(Model).filter(Model.name==u'root').first()
return render_template_to_response('templates/mytemplate.pt',
+ root = root,
request = request,
project = 'tutorial')
diff --git a/docs/tutorials/bfgwiki2/src/models/CHANGES.txt b/docs/tutorials/bfgwiki2/src/models/CHANGES.txt
deleted file mode 100644
index 1544cf53b..000000000
--- a/docs/tutorials/bfgwiki2/src/models/CHANGES.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-0.1
-
- Initial version
diff --git a/docs/tutorials/bfgwiki2/src/models/README.txt b/docs/tutorials/bfgwiki2/src/models/README.txt
deleted file mode 100644
index d41f7f90f..000000000
--- a/docs/tutorials/bfgwiki2/src/models/README.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-tutorial README
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/models/ez_setup.py b/docs/tutorials/bfgwiki2/src/models/ez_setup.py
deleted file mode 100644
index d24e845e5..000000000
--- a/docs/tutorials/bfgwiki2/src/models/ez_setup.py
+++ /dev/null
@@ -1,276 +0,0 @@
-#!python
-"""Bootstrap setuptools installation
-
-If you want to use setuptools in your package's setup.py, just include this
-file in the same directory with it, and add this to the top of your setup.py::
-
- from ez_setup import use_setuptools
- use_setuptools()
-
-If you want to require a specific version of setuptools, set a download
-mirror, or use an alternate download directory, you can do so by supplying
-the appropriate options to ``use_setuptools()``.
-
-This file can also be run as a script to install or upgrade setuptools.
-"""
-import sys
-DEFAULT_VERSION = "0.6c9"
-DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
-
-md5_data = {
- 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
- 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
- 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
- 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
- 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
- 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
- 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
- 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
- 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
- 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
- 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
- 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
- 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
- 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
- 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
- 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
- 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
- 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
- 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
- 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
- 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
- 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
- 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
- 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
- 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
- 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
- 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
- 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
- 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
- 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
- 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
- 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
- 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
- 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
-}
-
-import sys, os
-try: from hashlib import md5
-except ImportError: from md5 import md5
-
-def _validate_md5(egg_name, data):
- if egg_name in md5_data:
- digest = md5(data).hexdigest()
- if digest != md5_data[egg_name]:
- print >>sys.stderr, (
- "md5 validation of %s failed! (Possible download problem?)"
- % egg_name
- )
- sys.exit(2)
- return data
-
-def use_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- download_delay=15
-):
- """Automatically find/download setuptools and make it available on sys.path
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end with
- a '/'). `to_dir` is the directory where setuptools will be downloaded, if
- it is not already available. If `download_delay` is specified, it should
- be the number of seconds that will be paused before initiating a download,
- should one be required. If an older version of setuptools is installed,
- this routine will print a message to ``sys.stderr`` and raise SystemExit in
- an attempt to abort the calling script.
- """
- was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
- def do_download():
- egg = download_setuptools(version, download_base, to_dir, download_delay)
- sys.path.insert(0, egg)
- import setuptools; setuptools.bootstrap_install_from = egg
- try:
- import pkg_resources
- except ImportError:
- return do_download()
- try:
- pkg_resources.require("setuptools>="+version); return
- except pkg_resources.VersionConflict, e:
- if was_imported:
- print >>sys.stderr, (
- "The required version of setuptools (>=%s) is not available, and\n"
- "can't be installed while this script is running. Please install\n"
- " a more recent version first, using 'easy_install -U setuptools'."
- "\n\n(Currently using %r)"
- ) % (version, e.args[0])
- sys.exit(2)
- else:
- del pkg_resources, sys.modules['pkg_resources'] # reload ok
- return do_download()
- except pkg_resources.DistributionNotFound:
- return do_download()
-
-def download_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- delay = 15
-):
- """Download setuptools from a specified location and return its filename
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end
- with a '/'). `to_dir` is the directory where the egg will be downloaded.
- `delay` is the number of seconds to pause before an actual download attempt.
- """
- import urllib2, shutil
- egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
- url = download_base + egg_name
- saveto = os.path.join(to_dir, egg_name)
- src = dst = None
- if not os.path.exists(saveto): # Avoid repeated downloads
- try:
- from distutils import log
- if delay:
- log.warn("""
----------------------------------------------------------------------------
-This script requires setuptools version %s to run (even to display
-help). I will attempt to download it for you (from
-%s), but
-you may need to enable firewall access for this script first.
-I will start the download in %d seconds.
-
-(Note: if this machine does not have network access, please obtain the file
-
- %s
-
-and place it in this directory before rerunning this script.)
----------------------------------------------------------------------------""",
- version, download_base, delay, url
- ); from time import sleep; sleep(delay)
- log.warn("Downloading %s", url)
- src = urllib2.urlopen(url)
- # Read/write all in one block, so we don't create a corrupt file
- # if the download is interrupted.
- data = _validate_md5(egg_name, src.read())
- dst = open(saveto,"wb"); dst.write(data)
- finally:
- if src: src.close()
- if dst: dst.close()
- return os.path.realpath(saveto)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-def main(argv, version=DEFAULT_VERSION):
- """Install or upgrade setuptools and EasyInstall"""
- try:
- import setuptools
- except ImportError:
- egg = None
- try:
- egg = download_setuptools(version, delay=0)
- sys.path.insert(0,egg)
- from setuptools.command.easy_install import main
- return main(list(argv)+[egg]) # we're done here
- finally:
- if egg and os.path.exists(egg):
- os.unlink(egg)
- else:
- if setuptools.__version__ == '0.0.1':
- print >>sys.stderr, (
- "You have an obsolete version of setuptools installed. Please\n"
- "remove it from your system entirely before rerunning this script."
- )
- sys.exit(2)
-
- req = "setuptools>="+version
- import pkg_resources
- try:
- pkg_resources.require(req)
- except pkg_resources.VersionConflict:
- try:
- from setuptools.command.easy_install import main
- except ImportError:
- from easy_install import main
- main(list(argv)+[download_setuptools(delay=0)])
- sys.exit(0) # try to force an exit
- else:
- if argv:
- from setuptools.command.easy_install import main
- main(argv)
- else:
- print "Setuptools version",version,"or greater has been installed."
- print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
-
-def update_md5(filenames):
- """Update our built-in md5 registry"""
-
- import re
-
- for name in filenames:
- base = os.path.basename(name)
- f = open(name,'rb')
- md5_data[base] = md5(f.read()).hexdigest()
- f.close()
-
- data = [" %r: %r,\n" % it for it in md5_data.items()]
- data.sort()
- repl = "".join(data)
-
- import inspect
- srcfile = inspect.getsourcefile(sys.modules[__name__])
- f = open(srcfile, 'rb'); src = f.read(); f.close()
-
- match = re.search("\nmd5_data = {\n([^}]+)}", src)
- if not match:
- print >>sys.stderr, "Internal error!"
- sys.exit(2)
-
- src = src[:match.start(1)] + repl + src[match.end(1):]
- f = open(srcfile,'w')
- f.write(src)
- f.close()
-
-
-if __name__=='__main__':
- if len(sys.argv)>2 and sys.argv[1]=='--md5update':
- update_md5(sys.argv[2:])
- else:
- main(sys.argv[1:])
-
-
-
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/models/setup.cfg b/docs/tutorials/bfgwiki2/src/models/setup.cfg
deleted file mode 100644
index 8ce7ae0fb..000000000
--- a/docs/tutorials/bfgwiki2/src/models/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[easy_install]
-index_url = http://dist.repoze.org/bfg/current/simple
diff --git a/docs/tutorials/bfgwiki2/src/models/setup.py b/docs/tutorials/bfgwiki2/src/models/setup.py
deleted file mode 100644
index b289ca8b0..000000000
--- a/docs/tutorials/bfgwiki2/src/models/setup.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import os
-
-from ez_setup import use_setuptools
-use_setuptools()
-
-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 = [
- 'repoze.bfg',
- 'docutils',
- 'ZODB3',
- 'repoze.zodbconn',
- 'repoze.tm',
- ]
-
-setup(name='tutorial',
- version='0.1',
- description='tutorial',
- long_description=README + '\n\n' + CHANGES,
- classifiers=[
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Internet :: WWW/HTTP :: WSGI",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- ],
- author='',
- author_email='',
- url='',
- keywords='web wsgi bfg zope',
- packages=find_packages(),
- include_package_data=True,
- zip_safe=False,
- install_requires=requires,
- tests_require=requires,
- test_suite="tutorial",
- entry_points = """\
- [paste.app_factory]
- app = tutorial.run:app
- """
- )
-
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/__init__.py b/docs/tutorials/bfgwiki2/src/models/tutorial/__init__.py
deleted file mode 100644
index cbdfd3ac6..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# A package
-
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/configure.zcml b/docs/tutorials/bfgwiki2/src/models/tutorial/configure.zcml
deleted file mode 100644
index c734bb61f..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/configure.zcml
+++ /dev/null
@@ -1,17 +0,0 @@
-<configure xmlns="http://namespaces.repoze.org/bfg">
-
- <!-- this must be included for the view declarations to work -->
- <include package="repoze.bfg.includes" />
-
- <view
- for=".models.Wiki"
- view=".views.my_view"
- />
-
- <view
- for=".models.Wiki"
- view=".views.static_view"
- name="static"
- />
-
-</configure>
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/models.py b/docs/tutorials/bfgwiki2/src/models/tutorial/models.py
deleted file mode 100644
index 9761856c6..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/models.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from persistent import Persistent
-from persistent.mapping import PersistentMapping
-
-class Wiki(PersistentMapping):
- __name__ = None
- __parent__ = None
-
-class Page(Persistent):
- def __init__(self, data):
- self.data = data
-
-def appmaker(zodb_root):
- if not 'app_root' in zodb_root:
- app_root = Wiki()
- frontpage = Page('This is the front page')
- app_root['FrontPage'] = frontpage
- frontpage.__name__ = 'FrontPage'
- frontpage.__parent__ = app_root
- zodb_root['app_root'] = app_root
- import transaction
- transaction.commit()
- return zodb_root['app_root']
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/run.py b/docs/tutorials/bfgwiki2/src/models/tutorial/run.py
deleted file mode 100644
index 89953e6de..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/run.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from repoze.bfg.router import make_app
-from repoze.zodbconn.finder import PersistentApplicationFinder
-
-def app(global_config, **kw):
- """ This function returns a repoze.bfg.router.Router object.
-
- It is usually called by the PasteDeploy framework during ``paster serve``.
- """
- # paster app config callback
- import tutorial
- from tutorial.models import appmaker
- zodb_uri = kw.get('zodb_uri')
- if zodb_uri is None:
- raise ValueError("No 'zodb_uri' in application configuration.")
-
- get_root = PersistentApplicationFinder(zodb_uri, appmaker)
- return make_app(get_root, tutorial, options=kw)
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/mytemplate.pt b/docs/tutorials/bfgwiki2/src/models/tutorial/templates/mytemplate.pt
deleted file mode 100644
index 767252554..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/mytemplate.pt
+++ /dev/null
@@ -1,99 +0,0 @@
-<!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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-<head>
-<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-<title>${project} Application</title>
-<meta name="keywords" content="python web application" />
-<meta name="description" content="repoze.bfg web application" />
-<link href="${request.application_url}/static/default.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<!-- start header -->
-<div id="logo">
- <h2><code>${project}</code>, a <code>repoze.bfg</code> application</h2>
-</div>
-<div id="header">
- <div id="menu">
- </div>
-</div>
-<!-- end header -->
-<div id="wrapper">
- <!-- start page -->
- <div id="page">
- <!-- start content -->
- <div id="content">
- <div class="post">
- <h1 class="title">Welcome to <code>${project}</code>, an
- application generated by the <a
- href="http://bfg.repoze.org">repoze.bfg</a> web
- application framework.</h1>
- </div>
- </div>
- <!-- end content -->
- <!-- start sidebar -->
- <div id="sidebar">
- <ul>
- <li id="search">
- <h2>Search<br/> <code>repoze.bfg</code> Documentation</h2>
- <form method="get"
- action="http://bfg.repoze.org/searchresults">
- <fieldset>
- <input type="text" id="q" name="text" value="" />
- <input type="submit" id="x" value="Search" />
- </fieldset>
- </form>
- </li>
- <li>
- <h2><code>repoze.bfg</code> links</h2>
- <ul>
- <li><a
- href="http://docs.repoze.org/bfg/#narrative-documentation">Narrative
- Documentation</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#api-documentation">API
- Documentation</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#tutorials">Tutorials</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#change-history">Change
- History</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#sample-applications">Sample
- Applications</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#support-and-development">Support
- and Development</a>
- </li>
- <li>
- <a
- href="irc://irc.freenode.net#repoze">IRC Channel</a>
- </li>
- </ul>
- </li>
- </ul>
- </div>
- <!-- end sidebar -->
- <div style="clear: both;">&nbsp;</div>
- </div>
-</div>
-<!-- end page -->
-<!-- start footer -->
-<div id="footer">
- <p id="legal">( c ) 2008. All Rights Reserved. Template design
- by <a href="http://www.freecsstemplates.org/">Free CSS
- Templates</a>.</p>
-</div>
-<!-- end footer -->
-</body>
-</html>
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/default.css b/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/default.css
deleted file mode 100644
index 41b3debde..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/default.css
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
-Design by Free CSS Templates
-http://www.freecsstemplates.org
-Released for free under a Creative Commons Attribution 2.5 License
-*/
-
-body {
- margin: 0;
- padding: 0;
- background: url(images/img01.gif) repeat-x left top;
- font-size: 13px;
- font-family: "Trebuchet MS", Georgia, "Times New Roman", Times, serif;
- text-align: justify;
- color: #FFFFFF;
-}
-
-h1, h2, h3 {
- margin: 0;
- text-transform: lowercase;
- font-weight: normal;
- color: #FFFFFF;
-}
-
-h1 {
- letter-spacing: -1px;
- font-size: 32px;
-}
-
-h2 {
- font-size: 23px;
-}
-
-p, ul, ol {
- margin: 0 0 2em 0;
- text-align: justify;
- line-height: 26px;
-}
-
-a:link {
- color: #8BD80E;
-}
-
-a:hover, a:active {
- text-decoration: none;
- color: #8BD80E;
-}
-
-a:visited {
- color: #8BD80E;
-}
-
-img {
- border: none;
-}
-
-img.left {
- float: left;
- margin-right: 15px;
-}
-
-img.right {
- float: right;
- margin-left: 15px;
-}
-
-/* Form */
-
-form {
- margin: 0;
- padding: 0;
-}
-
-fieldset {
- margin: 0;
- padding: 0;
- border: none;
-}
-
-legend {
- display: none;
-}
-
-input, textarea, select {
- font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
- font-size: 13px;
- color: #333333;
-}
-
-#wrapper {
- margin: 0;
- padding: 0;
- background: #000000;
-}
-
-/* Header */
-
-#header {
- width: 713px;
- margin: 0 auto;
- height: 42px;
-}
-
-/* Menu */
-
-#menu {
- float: left;
- width: 713px;
- height: 50px;
- background: url(images/img02.gif) no-repeat left top;
-}
-
-#menu ul {
- margin: 0;
- padding: 0px 0 0 10px;
- list-style: none;
- line-height: normal;
-}
-
-#menu li {
- display: block;
- float: left;
-}
-
-#menu a {
- display: block;
- float: left;
- background: url(images/img04.gif) no-repeat right 55%;
- margin-top: 5px;
- margin-right: 3px;
- padding: 8px 17px;
- text-decoration: none;
- font-size: 13px;
- color: #000000;
-}
-
-#menu a:hover {
- color: #000000;
-}
-
-#menu .current_page_item a {
- color: #000000;
-}
-
-/** LOGO */
-
-#logo {
- width: 713px;
- height: 80px;
- margin: 0 auto;
-}
-
-#logo h1, #logo h2 {
- float: left;
- margin: 0;
- padding: 30px 0 0 0px;
- line-height: normal;
-}
-
-#logo h1 {
- font-family: Georgia, "Times New Roman", Times, serif;
- font-size:40px;
-}
-
-#logo h1 a {
- text-decoration: none;
- color: #4C4C4C;
-}
-
-#logo h1 a:hover { text-decoration: underline; }
-
-#logo h2 {
- float: left;
- padding: 45px 0 0 18px;
- font: 18px Georgia, "Times New Roman", Times, serif;
- color: #8BD80E;
-}
-
-#logo p a {
- text-decoration: none;
- color: #8BD80E;
-}
-
-#logo p a:hover { text-decoration: underline; }
-
-
-
-/* Page */
-
-#page {
- width: 663px;
- margin: 0 auto;
- background: #4C4C4C url(images/img03.gif) no-repeat left bottom;
- padding: 0 25px;
-}
-
-/* Content */
-
-#content {
- float: left;
- width: 410px;
-
-}
-
-/* Post */
-
-.post {
- padding: 15px 0px;
- margin-bottom: 20px;
-}
-
-.post .title {
- margin-bottom: 20px;
- padding-bottom: 5px;
-}
-
-.post h1 {
- padding: 0px 0 0 0px;
- background: url(images/img08.jpg) no-repeat left top;
- font-size: 24px;
- color: #FFFFFF;
-}
-
-.post h2 {
- padding: 0px 0 0 0px;
- font-size: 22px;
- color: #FFFFFF;
-}
-
-.post .entry {
-}
-
-.post .meta {
- padding: 15px 15px 30px 0px;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 11px;
-}
-
-.post .meta p {
- margin: 0;
- padding-top: 15px;
- line-height: normal;
- color: #FFFFFF;
-}
-
-.post .meta .byline {
- float: left;
-}
-
-.post .meta .links {
- float: right;
-}
-
-.post .meta .more {
- padding: 0 10px 0 18px;
-}
-
-.post .meta .comments {
-}
-
-.post .meta b {
- display: none;
-}
-
-
-/* Sidebar */
-
-#sidebar {
- width: 210px;
- float: right;
- margin: 0;
- padding: 0;
-}
-
-#sidebar ul {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-#sidebar li {
- margin-bottom: 40px;
-}
-
-#sidebar li ul {
-}
-
-#sidebar li li {
- margin: 0;
-}
-
-#sidebar h2 {
- width: 250px;
- padding: 8px 0 0 0px;
- margin-bottom: 10px;
- background: url(images/img07.jpg) no-repeat left top;
- font-size: 20px;
- color: #FFFFFF;
-}
-
-/* Search */
-
-#search {
-
-}
-
-#search h2 {
- margin-bottom: 20px;
-}
-
-#s {
- width: 140px;
- margin-right: 5px;
- padding: 3px;
- border: 1px solid #BED99C;
-}
-
-#x {
- padding: 3px;
- border: none;
- background: #8BD80E;
- text-transform: lowercase;
- font-size: 11px;
- color: #FFFFFF;
-}
-
-/* Boxes */
-
-.box1 {
- padding: 20px;
-}
-
-.box2 {
- color: #BABABA;
-}
-
-.box2 h2 {
- margin-bottom: 15px;
- font-size: 16px;
- color: #FFFFFF;
-}
-
-.box2 ul {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-.box2 a:link, .box2 a:hover, .box2 a:active, .box2 a:visited {
- color: #EDEDED;
-}
-
-/* Footer */
-#footer-wrap {
-}
-
-#footer {
- margin: 0 auto;
- padding: 20px 0 10px 0;
- background: #000000;
-}
-
-html>body #footer {
- height: auto;
-}
-
-#footer p {
- font-size: 11px;
-}
-
-#legal {
- clear: both;
- padding-top: 17px;
- text-align: center;
- color: #FFFFFF;
-}
-
-#legal a {
- font-weight: normal;
- color: #FFFFFF;
-}
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img01.gif b/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img01.gif
deleted file mode 100644
index 5f082bd99..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img01.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img02.gif b/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img02.gif
deleted file mode 100644
index 45a3ae976..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img02.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img03.gif b/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img03.gif
deleted file mode 100644
index d92ea38f9..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img03.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img04.gif b/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img04.gif
deleted file mode 100644
index 950c4af9d..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/img04.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/spacer.gif b/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/spacer.gif
deleted file mode 100644
index 5bfd67a2d..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/images/spacer.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/templatelicense.txt b/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/templatelicense.txt
deleted file mode 100644
index ccb6b06ab..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/templates/static/templatelicense.txt
+++ /dev/null
@@ -1,243 +0,0 @@
-Creative Commons </>
-
-Creative Commons Legal Code
-
-*Attribution 2.5*
-
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
-LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
-ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION
-ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE
-INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
-ITS USE.
-
-/License/
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE
-RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS
-AND CONDITIONS.
-
-*1. Definitions*
-
- 1. *"Collective Work"* means a work, such as a periodical issue,
- anthology or encyclopedia, in which the Work in its entirety in
- unmodified form, along with a number of other contributions,
- constituting separate and independent works in themselves, are
- assembled into a collective whole. A work that constitutes a
- Collective Work will not be considered a Derivative Work (as
- defined below) for the purposes of this License.
- 2. *"Derivative Work"* means a work based upon the Work or upon the
- Work and other pre-existing works, such as a translation, musical
- arrangement, dramatization, fictionalization, motion picture
- version, sound recording, art reproduction, abridgment,
- condensation, or any other form in which the Work may be recast,
- transformed, or adapted, except that a work that constitutes a
- Collective Work will not be considered a Derivative Work for the
- purpose of this License. For the avoidance of doubt, where the
- Work is a musical composition or sound recording, the
- synchronization of the Work in timed-relation with a moving image
- ("synching") will be considered a Derivative Work for the purpose
- of this License.
- 3. *"Licensor"* means the individual or entity that offers the Work
- under the terms of this License.
- 4. *"Original Author"* means the individual or entity who created the
- Work.
- 5. *"Work"* means the copyrightable work of authorship offered under
- the terms of this License.
- 6. *"You"* means an individual or entity exercising rights under this
- License who has not previously violated the terms of this License
- with respect to the Work, or who has received express permission
- from the Licensor to exercise rights under this License despite a
- previous violation.
-
-*2. Fair Use Rights.* Nothing in this license is intended to reduce,
-limit, or restrict any rights arising from fair use, first sale or other
-limitations on the exclusive rights of the copyright owner under
-copyright law or other applicable laws.
-
-*3. License Grant.* Subject to the terms and conditions of this License,
-Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-perpetual (for the duration of the applicable copyright) license to
-exercise the rights in the Work as stated below:
-
- 1. to reproduce the Work, to incorporate the Work into one or more
- Collective Works, and to reproduce the Work as incorporated in the
- Collective Works;
- 2. to create and reproduce Derivative Works;
- 3. to distribute copies or phonorecords of, display publicly, perform
- publicly, and perform publicly by means of a digital audio
- transmission the Work including as incorporated in Collective Works;
- 4. to distribute copies or phonorecords of, display publicly, perform
- publicly, and perform publicly by means of a digital audio
- transmission Derivative Works.
- 5.
-
- For the avoidance of doubt, where the work is a musical composition:
-
- 1. *Performance Royalties Under Blanket Licenses*. Licensor
- waives the exclusive right to collect, whether individually
- or via a performance rights society (e.g. ASCAP, BMI,
- SESAC), royalties for the public performance or public
- digital performance (e.g. webcast) of the Work.
- 2. *Mechanical Rights and Statutory Royalties*. Licensor waives
- the exclusive right to collect, whether individually or via
- a music rights agency or designated agent (e.g. Harry Fox
- Agency), royalties for any phonorecord You create from the
- Work ("cover version") and distribute, subject to the
- compulsory license created by 17 USC Section 115 of the US
- Copyright Act (or the equivalent in other jurisdictions).
- 6. *Webcasting Rights and Statutory Royalties*. For the avoidance of
- doubt, where the Work is a sound recording, Licensor waives the
- exclusive right to collect, whether individually or via a
- performance-rights society (e.g. SoundExchange), royalties for the
- public digital performance (e.g. webcast) of the Work, subject to
- the compulsory license created by 17 USC Section 114 of the US
- Copyright Act (or the equivalent in other jurisdictions).
-
-The above rights may be exercised in all media and formats whether now
-known or hereafter devised. The above rights include the right to make
-such modifications as are technically necessary to exercise the rights
-in other media and formats. All rights not expressly granted by Licensor
-are hereby reserved.
-
-*4. Restrictions.*The license granted in Section 3 above is expressly
-made subject to and limited by the following restrictions:
-
- 1. You may distribute, publicly display, publicly perform, or
- publicly digitally perform the Work only under the terms of this
- License, and You must include a copy of, or the Uniform Resource
- Identifier for, this License with every copy or phonorecord of the
- Work You distribute, publicly display, publicly perform, or
- publicly digitally perform. You may not offer or impose any terms
- on the Work that alter or restrict the terms of this License or
- the recipients' exercise of the rights granted hereunder. You may
- not sublicense the Work. You must keep intact all notices that
- refer to this License and to the disclaimer of warranties. You may
- not distribute, publicly display, publicly perform, or publicly
- digitally perform the Work with any technological measures that
- control access or use of the Work in a manner inconsistent with
- the terms of this License Agreement. The above applies to the Work
- as incorporated in a Collective Work, but this does not require
- the Collective Work apart from the Work itself to be made subject
- to the terms of this License. If You create a Collective Work,
- upon notice from any Licensor You must, to the extent practicable,
- remove from the Collective Work any credit as required by clause
- 4(b), as requested. If You create a Derivative Work, upon notice
- from any Licensor You must, to the extent practicable, remove from
- the Derivative Work any credit as required by clause 4(b), as
- requested.
- 2. If you distribute, publicly display, publicly perform, or publicly
- digitally perform the Work or any Derivative Works or Collective
- Works, You must keep intact all copyright notices for the Work and
- provide, reasonable to the medium or means You are utilizing: (i)
- the name of the Original Author (or pseudonym, if applicable) if
- supplied, and/or (ii) if the Original Author and/or Licensor
- designate another party or parties (e.g. a sponsor institute,
- publishing entity, journal) for attribution in Licensor's
- copyright notice, terms of service or by other reasonable means,
- the name of such party or parties; the title of the Work if
- supplied; to the extent reasonably practicable, the Uniform
- Resource Identifier, if any, that Licensor specifies to be
- associated with the Work, unless such URI does not refer to the
- copyright notice or licensing information for the Work; and in the
- case of a Derivative Work, a credit identifying the use of the
- Work in the Derivative Work (e.g., "French translation of the Work
- by Original Author," or "Screenplay based on original Work by
- Original Author"). Such credit may be implemented in any
- reasonable manner; provided, however, that in the case of a
- Derivative Work or Collective Work, at a minimum such credit will
- appear where any other comparable authorship credit appears and in
- a manner at least as prominent as such other comparable authorship
- credit.
-
-*5. Representations, Warranties and Disclaimer*
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-*7. Termination*
-
- 1. This License and the rights granted hereunder will terminate
- automatically upon any breach by You of the terms of this License.
- Individuals or entities who have received Derivative Works or
- Collective Works from You under this License, however, will not
- have their licenses terminated provided such individuals or
- entities remain in full compliance with those licenses. Sections
- 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
- 2. Subject to the above terms and conditions, the license granted
- here is perpetual (for the duration of the applicable copyright in
- the Work). Notwithstanding the above, Licensor reserves the right
- to release the Work under different license terms or to stop
- distributing the Work at any time; provided, however that any such
- election will not serve to withdraw this License (or any other
- license that has been, or is required to be, granted under the
- terms of this License), and this License will continue in full
- force and effect unless terminated as stated above.
-
-*8. Miscellaneous*
-
- 1. Each time You distribute or publicly digitally perform the Work or
- a Collective Work, the Licensor offers to the recipient a license
- to the Work on the same terms and conditions as the license
- granted to You under this License.
- 2. Each time You distribute or publicly digitally perform a
- Derivative Work, Licensor offers to the recipient a license to the
- original Work on the same terms and conditions as the license
- granted to You under this License.
- 3. If any provision of this License is invalid or unenforceable under
- applicable law, it shall not affect the validity or enforceability
- of the remainder of the terms of this License, and without further
- action by the parties to this agreement, such provision shall be
- reformed to the minimum extent necessary to make such provision
- valid and enforceable.
- 4. No term or provision of this License shall be deemed waived and no
- breach consented to unless such waiver or consent shall be in
- writing and signed by the party to be charged with such waiver or
- consent.
- 5. This License constitutes the entire agreement between the parties
- with respect to the Work licensed here. There are no
- understandings, agreements or representations with respect to the
- Work not specified here. Licensor shall not be bound by any
- additional provisions that may appear in any communication from
- You. This License may not be modified without the mutual written
- agreement of the Licensor and You.
-
-Creative Commons is not a party to this License, and makes no warranty
-whatsoever in connection with the Work. Creative Commons will not be
-liable to You or any party on any legal theory for any damages
-whatsoever, including without limitation any general, special,
-incidental or consequential damages arising in connection to this
-license. Notwithstanding the foregoing two (2) sentences, if Creative
-Commons has expressly identified itself as the Licensor hereunder, it
-shall have all rights and obligations of Licensor.
-
-Except for the limited purpose of indicating to the public that the Work
-is licensed under the CCPL, neither party will use the trademark
-"Creative Commons" or any related trademark or logo of Creative Commons
-without the prior written consent of Creative Commons. Any permitted use
-will be in compliance with Creative Commons' then-current trademark
-usage guidelines, as may be published on its website or otherwise made
-available upon request from time to time.
-
-Creative Commons may be contacted at http://creativecommons.org/
-<http://creativecommons.org>.
-
-« Back to Commons Deed <./>
diff --git a/docs/tutorials/bfgwiki2/src/models/tutorial/tests.py b/docs/tutorials/bfgwiki2/src/models/tutorial/tests.py
deleted file mode 100644
index f367b7da0..000000000
--- a/docs/tutorials/bfgwiki2/src/models/tutorial/tests.py
+++ /dev/null
@@ -1,75 +0,0 @@
-import unittest
-
-from repoze.bfg import testing
-
-class PageModelTests(unittest.TestCase):
-
- def _getTargetClass(self):
- from tutorial.models import Page
- return Page
-
- def _makeOne(self, data=u'some data'):
- return self._getTargetClass()(data=data)
-
- def test_constructor(self):
- instance = self._makeOne()
- self.assertEqual(instance.data, u'some data')
-
-class WikiModelTests(unittest.TestCase):
-
- def _getTargetClass(self):
- from tutorial.models import Wiki
- return Wiki
-
- def _makeOne(self):
- return self._getTargetClass()()
-
- def test_it(self):
- wiki = self._makeOne()
- self.assertEqual(wiki.__parent__, None)
- self.assertEqual(wiki.__name__, None)
-
-class AppmakerTests(unittest.TestCase):
-
- def _callFUT(self, zodb_root):
- from tutorial.models import appmaker
- return appmaker(zodb_root)
-
- def test_no_app_root(self):
- root = {}
- self._callFUT(root)
- self.assertEqual(root['app_root']['FrontPage'].data,
- 'This is the front page')
-
- def test_w_app_root(self):
- app_root = object()
- root = {'app_root': app_root}
- self._callFUT(root)
- self.failUnless(root['app_root'] is app_root)
-
-class ViewTests(unittest.TestCase):
-
- """ These tests are unit tests for the view. They test the
- functionality of *only* the view. They register and use dummy
- implementations of repoze.bfg functionality to allow you to avoid
- testing 'too much'"""
-
- def setUp(self):
- """ cleanUp() is required to clear out the application registry
- between tests (done in setUp for good measure too)
- """
- testing.cleanUp()
-
- def tearDown(self):
- """ cleanUp() is required to clear out the application registry
- between tests
- """
- testing.cleanUp()
-
- def test_my_view(self):
- from tutorial.views import my_view
- context = testing.DummyModel()
- request = testing.DummyRequest()
- renderer = testing.registerDummyRenderer('templates/mytemplate.pt')
- response = my_view(context, request)
- renderer.assert_(project='tutorial')
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/CHANGES.txt b/docs/tutorials/bfgwiki2/src/viewdecorators/CHANGES.txt
deleted file mode 100644
index 1544cf53b..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/CHANGES.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-0.1
-
- Initial version
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/README.txt b/docs/tutorials/bfgwiki2/src/viewdecorators/README.txt
deleted file mode 100644
index d41f7f90f..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/README.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-tutorial README
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/ez_setup.py b/docs/tutorials/bfgwiki2/src/viewdecorators/ez_setup.py
deleted file mode 100644
index d24e845e5..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/ez_setup.py
+++ /dev/null
@@ -1,276 +0,0 @@
-#!python
-"""Bootstrap setuptools installation
-
-If you want to use setuptools in your package's setup.py, just include this
-file in the same directory with it, and add this to the top of your setup.py::
-
- from ez_setup import use_setuptools
- use_setuptools()
-
-If you want to require a specific version of setuptools, set a download
-mirror, or use an alternate download directory, you can do so by supplying
-the appropriate options to ``use_setuptools()``.
-
-This file can also be run as a script to install or upgrade setuptools.
-"""
-import sys
-DEFAULT_VERSION = "0.6c9"
-DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
-
-md5_data = {
- 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
- 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
- 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
- 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
- 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
- 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
- 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
- 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
- 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
- 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
- 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
- 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
- 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
- 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
- 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
- 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
- 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
- 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
- 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
- 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
- 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
- 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
- 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
- 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
- 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
- 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
- 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
- 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
- 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
- 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
- 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
- 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
- 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
- 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
-}
-
-import sys, os
-try: from hashlib import md5
-except ImportError: from md5 import md5
-
-def _validate_md5(egg_name, data):
- if egg_name in md5_data:
- digest = md5(data).hexdigest()
- if digest != md5_data[egg_name]:
- print >>sys.stderr, (
- "md5 validation of %s failed! (Possible download problem?)"
- % egg_name
- )
- sys.exit(2)
- return data
-
-def use_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- download_delay=15
-):
- """Automatically find/download setuptools and make it available on sys.path
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end with
- a '/'). `to_dir` is the directory where setuptools will be downloaded, if
- it is not already available. If `download_delay` is specified, it should
- be the number of seconds that will be paused before initiating a download,
- should one be required. If an older version of setuptools is installed,
- this routine will print a message to ``sys.stderr`` and raise SystemExit in
- an attempt to abort the calling script.
- """
- was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
- def do_download():
- egg = download_setuptools(version, download_base, to_dir, download_delay)
- sys.path.insert(0, egg)
- import setuptools; setuptools.bootstrap_install_from = egg
- try:
- import pkg_resources
- except ImportError:
- return do_download()
- try:
- pkg_resources.require("setuptools>="+version); return
- except pkg_resources.VersionConflict, e:
- if was_imported:
- print >>sys.stderr, (
- "The required version of setuptools (>=%s) is not available, and\n"
- "can't be installed while this script is running. Please install\n"
- " a more recent version first, using 'easy_install -U setuptools'."
- "\n\n(Currently using %r)"
- ) % (version, e.args[0])
- sys.exit(2)
- else:
- del pkg_resources, sys.modules['pkg_resources'] # reload ok
- return do_download()
- except pkg_resources.DistributionNotFound:
- return do_download()
-
-def download_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- delay = 15
-):
- """Download setuptools from a specified location and return its filename
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end
- with a '/'). `to_dir` is the directory where the egg will be downloaded.
- `delay` is the number of seconds to pause before an actual download attempt.
- """
- import urllib2, shutil
- egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
- url = download_base + egg_name
- saveto = os.path.join(to_dir, egg_name)
- src = dst = None
- if not os.path.exists(saveto): # Avoid repeated downloads
- try:
- from distutils import log
- if delay:
- log.warn("""
----------------------------------------------------------------------------
-This script requires setuptools version %s to run (even to display
-help). I will attempt to download it for you (from
-%s), but
-you may need to enable firewall access for this script first.
-I will start the download in %d seconds.
-
-(Note: if this machine does not have network access, please obtain the file
-
- %s
-
-and place it in this directory before rerunning this script.)
----------------------------------------------------------------------------""",
- version, download_base, delay, url
- ); from time import sleep; sleep(delay)
- log.warn("Downloading %s", url)
- src = urllib2.urlopen(url)
- # Read/write all in one block, so we don't create a corrupt file
- # if the download is interrupted.
- data = _validate_md5(egg_name, src.read())
- dst = open(saveto,"wb"); dst.write(data)
- finally:
- if src: src.close()
- if dst: dst.close()
- return os.path.realpath(saveto)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-def main(argv, version=DEFAULT_VERSION):
- """Install or upgrade setuptools and EasyInstall"""
- try:
- import setuptools
- except ImportError:
- egg = None
- try:
- egg = download_setuptools(version, delay=0)
- sys.path.insert(0,egg)
- from setuptools.command.easy_install import main
- return main(list(argv)+[egg]) # we're done here
- finally:
- if egg and os.path.exists(egg):
- os.unlink(egg)
- else:
- if setuptools.__version__ == '0.0.1':
- print >>sys.stderr, (
- "You have an obsolete version of setuptools installed. Please\n"
- "remove it from your system entirely before rerunning this script."
- )
- sys.exit(2)
-
- req = "setuptools>="+version
- import pkg_resources
- try:
- pkg_resources.require(req)
- except pkg_resources.VersionConflict:
- try:
- from setuptools.command.easy_install import main
- except ImportError:
- from easy_install import main
- main(list(argv)+[download_setuptools(delay=0)])
- sys.exit(0) # try to force an exit
- else:
- if argv:
- from setuptools.command.easy_install import main
- main(argv)
- else:
- print "Setuptools version",version,"or greater has been installed."
- print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
-
-def update_md5(filenames):
- """Update our built-in md5 registry"""
-
- import re
-
- for name in filenames:
- base = os.path.basename(name)
- f = open(name,'rb')
- md5_data[base] = md5(f.read()).hexdigest()
- f.close()
-
- data = [" %r: %r,\n" % it for it in md5_data.items()]
- data.sort()
- repl = "".join(data)
-
- import inspect
- srcfile = inspect.getsourcefile(sys.modules[__name__])
- f = open(srcfile, 'rb'); src = f.read(); f.close()
-
- match = re.search("\nmd5_data = {\n([^}]+)}", src)
- if not match:
- print >>sys.stderr, "Internal error!"
- sys.exit(2)
-
- src = src[:match.start(1)] + repl + src[match.end(1):]
- f = open(srcfile,'w')
- f.write(src)
- f.close()
-
-
-if __name__=='__main__':
- if len(sys.argv)>2 and sys.argv[1]=='--md5update':
- update_md5(sys.argv[2:])
- else:
- main(sys.argv[1:])
-
-
-
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/setup.cfg b/docs/tutorials/bfgwiki2/src/viewdecorators/setup.cfg
deleted file mode 100644
index 8ce7ae0fb..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[easy_install]
-index_url = http://dist.repoze.org/bfg/current/simple
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/setup.py b/docs/tutorials/bfgwiki2/src/viewdecorators/setup.py
deleted file mode 100644
index b289ca8b0..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/setup.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import os
-
-from ez_setup import use_setuptools
-use_setuptools()
-
-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 = [
- 'repoze.bfg',
- 'docutils',
- 'ZODB3',
- 'repoze.zodbconn',
- 'repoze.tm',
- ]
-
-setup(name='tutorial',
- version='0.1',
- description='tutorial',
- long_description=README + '\n\n' + CHANGES,
- classifiers=[
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Internet :: WWW/HTTP :: WSGI",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- ],
- author='',
- author_email='',
- url='',
- keywords='web wsgi bfg zope',
- packages=find_packages(),
- include_package_data=True,
- zip_safe=False,
- install_requires=requires,
- tests_require=requires,
- test_suite="tutorial",
- entry_points = """\
- [paste.app_factory]
- app = tutorial.run:app
- """
- )
-
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial.ini b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial.ini
deleted file mode 100644
index 181682585..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-[DEFAULT]
-debug = true
-
-[app:zodb]
-use = egg:tutorial#app
-reload_templates = true
-debug_authorization = false
-debug_notfound = false
-zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000
-
-[pipeline:main]
-pipeline =
- egg:repoze.zodbconn#closer
- egg:Paste#evalerror
- egg:repoze.tm#tm
- zodb
-
-[server:main]
-use = egg:Paste#http
-host = 0.0.0.0
-port = 6543
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/__init__.py b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/__init__.py
deleted file mode 100644
index cbdfd3ac6..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# A package
-
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/configure.zcml b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/configure.zcml
deleted file mode 100644
index b1501597d..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/configure.zcml
+++ /dev/null
@@ -1,8 +0,0 @@
-<configure xmlns="http://namespaces.repoze.org/bfg">
-
- <!-- this must be included for the view declarations to work -->
- <include package="repoze.bfg.includes" />
-
- <scan package="."/>
-
-</configure>
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/models.py b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/models.py
deleted file mode 100644
index 9761856c6..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/models.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from persistent import Persistent
-from persistent.mapping import PersistentMapping
-
-class Wiki(PersistentMapping):
- __name__ = None
- __parent__ = None
-
-class Page(Persistent):
- def __init__(self, data):
- self.data = data
-
-def appmaker(zodb_root):
- if not 'app_root' in zodb_root:
- app_root = Wiki()
- frontpage = Page('This is the front page')
- app_root['FrontPage'] = frontpage
- frontpage.__name__ = 'FrontPage'
- frontpage.__parent__ = app_root
- zodb_root['app_root'] = app_root
- import transaction
- transaction.commit()
- return zodb_root['app_root']
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/run.py b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/run.py
deleted file mode 100644
index 89953e6de..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/run.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from repoze.bfg.router import make_app
-from repoze.zodbconn.finder import PersistentApplicationFinder
-
-def app(global_config, **kw):
- """ This function returns a repoze.bfg.router.Router object.
-
- It is usually called by the PasteDeploy framework during ``paster serve``.
- """
- # paster app config callback
- import tutorial
- from tutorial.models import appmaker
- zodb_uri = kw.get('zodb_uri')
- if zodb_uri is None:
- raise ValueError("No 'zodb_uri' in application configuration.")
-
- get_root = PersistentApplicationFinder(zodb_uri, appmaker)
- return make_app(get_root, tutorial, options=kw)
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/edit.pt b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/edit.pt
deleted file mode 100644
index 883ac8b52..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/edit.pt
+++ /dev/null
@@ -1,30 +0,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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
- <title>bfg tutorial wiki (based on TurboGears 20-Minute Wiki) Editing: ${page.__name__}</title>
- <link rel="stylesheet" type="text/css"
- href="${request.application_url}/static/style.css" />
-</head>
-
-<body>
-
-<div class="main_content">
- <div style="float:right; width: 10em;"> Viewing
- <span tal:replace="page.__name__">Page Name Goes Here</span> <br/>
- You can return to the <a href="${request.application_url}">FrontPage</a>.
- </div>
-
- <div>
- <form action="${save_url}" method="post">
- <textarea name="body" tal:content="page.data" rows="10" cols="60"/>
- <input type="submit" name="form.submitted" value="Save"/>
- </form>
- </div>
-</div>
-</body>
-</html>
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/mytemplate.pt b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/mytemplate.pt
deleted file mode 100644
index 767252554..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/mytemplate.pt
+++ /dev/null
@@ -1,99 +0,0 @@
-<!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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-<head>
-<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-<title>${project} Application</title>
-<meta name="keywords" content="python web application" />
-<meta name="description" content="repoze.bfg web application" />
-<link href="${request.application_url}/static/default.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<!-- start header -->
-<div id="logo">
- <h2><code>${project}</code>, a <code>repoze.bfg</code> application</h2>
-</div>
-<div id="header">
- <div id="menu">
- </div>
-</div>
-<!-- end header -->
-<div id="wrapper">
- <!-- start page -->
- <div id="page">
- <!-- start content -->
- <div id="content">
- <div class="post">
- <h1 class="title">Welcome to <code>${project}</code>, an
- application generated by the <a
- href="http://bfg.repoze.org">repoze.bfg</a> web
- application framework.</h1>
- </div>
- </div>
- <!-- end content -->
- <!-- start sidebar -->
- <div id="sidebar">
- <ul>
- <li id="search">
- <h2>Search<br/> <code>repoze.bfg</code> Documentation</h2>
- <form method="get"
- action="http://bfg.repoze.org/searchresults">
- <fieldset>
- <input type="text" id="q" name="text" value="" />
- <input type="submit" id="x" value="Search" />
- </fieldset>
- </form>
- </li>
- <li>
- <h2><code>repoze.bfg</code> links</h2>
- <ul>
- <li><a
- href="http://docs.repoze.org/bfg/#narrative-documentation">Narrative
- Documentation</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#api-documentation">API
- Documentation</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#tutorials">Tutorials</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#change-history">Change
- History</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#sample-applications">Sample
- Applications</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#support-and-development">Support
- and Development</a>
- </li>
- <li>
- <a
- href="irc://irc.freenode.net#repoze">IRC Channel</a>
- </li>
- </ul>
- </li>
- </ul>
- </div>
- <!-- end sidebar -->
- <div style="clear: both;">&nbsp;</div>
- </div>
-</div>
-<!-- end page -->
-<!-- start footer -->
-<div id="footer">
- <p id="legal">( c ) 2008. All Rights Reserved. Template design
- by <a href="http://www.freecsstemplates.org/">Free CSS
- Templates</a>.</p>
-</div>
-<!-- end footer -->
-</body>
-</html>
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/default.css b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/default.css
deleted file mode 100644
index 41b3debde..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/default.css
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
-Design by Free CSS Templates
-http://www.freecsstemplates.org
-Released for free under a Creative Commons Attribution 2.5 License
-*/
-
-body {
- margin: 0;
- padding: 0;
- background: url(images/img01.gif) repeat-x left top;
- font-size: 13px;
- font-family: "Trebuchet MS", Georgia, "Times New Roman", Times, serif;
- text-align: justify;
- color: #FFFFFF;
-}
-
-h1, h2, h3 {
- margin: 0;
- text-transform: lowercase;
- font-weight: normal;
- color: #FFFFFF;
-}
-
-h1 {
- letter-spacing: -1px;
- font-size: 32px;
-}
-
-h2 {
- font-size: 23px;
-}
-
-p, ul, ol {
- margin: 0 0 2em 0;
- text-align: justify;
- line-height: 26px;
-}
-
-a:link {
- color: #8BD80E;
-}
-
-a:hover, a:active {
- text-decoration: none;
- color: #8BD80E;
-}
-
-a:visited {
- color: #8BD80E;
-}
-
-img {
- border: none;
-}
-
-img.left {
- float: left;
- margin-right: 15px;
-}
-
-img.right {
- float: right;
- margin-left: 15px;
-}
-
-/* Form */
-
-form {
- margin: 0;
- padding: 0;
-}
-
-fieldset {
- margin: 0;
- padding: 0;
- border: none;
-}
-
-legend {
- display: none;
-}
-
-input, textarea, select {
- font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
- font-size: 13px;
- color: #333333;
-}
-
-#wrapper {
- margin: 0;
- padding: 0;
- background: #000000;
-}
-
-/* Header */
-
-#header {
- width: 713px;
- margin: 0 auto;
- height: 42px;
-}
-
-/* Menu */
-
-#menu {
- float: left;
- width: 713px;
- height: 50px;
- background: url(images/img02.gif) no-repeat left top;
-}
-
-#menu ul {
- margin: 0;
- padding: 0px 0 0 10px;
- list-style: none;
- line-height: normal;
-}
-
-#menu li {
- display: block;
- float: left;
-}
-
-#menu a {
- display: block;
- float: left;
- background: url(images/img04.gif) no-repeat right 55%;
- margin-top: 5px;
- margin-right: 3px;
- padding: 8px 17px;
- text-decoration: none;
- font-size: 13px;
- color: #000000;
-}
-
-#menu a:hover {
- color: #000000;
-}
-
-#menu .current_page_item a {
- color: #000000;
-}
-
-/** LOGO */
-
-#logo {
- width: 713px;
- height: 80px;
- margin: 0 auto;
-}
-
-#logo h1, #logo h2 {
- float: left;
- margin: 0;
- padding: 30px 0 0 0px;
- line-height: normal;
-}
-
-#logo h1 {
- font-family: Georgia, "Times New Roman", Times, serif;
- font-size:40px;
-}
-
-#logo h1 a {
- text-decoration: none;
- color: #4C4C4C;
-}
-
-#logo h1 a:hover { text-decoration: underline; }
-
-#logo h2 {
- float: left;
- padding: 45px 0 0 18px;
- font: 18px Georgia, "Times New Roman", Times, serif;
- color: #8BD80E;
-}
-
-#logo p a {
- text-decoration: none;
- color: #8BD80E;
-}
-
-#logo p a:hover { text-decoration: underline; }
-
-
-
-/* Page */
-
-#page {
- width: 663px;
- margin: 0 auto;
- background: #4C4C4C url(images/img03.gif) no-repeat left bottom;
- padding: 0 25px;
-}
-
-/* Content */
-
-#content {
- float: left;
- width: 410px;
-
-}
-
-/* Post */
-
-.post {
- padding: 15px 0px;
- margin-bottom: 20px;
-}
-
-.post .title {
- margin-bottom: 20px;
- padding-bottom: 5px;
-}
-
-.post h1 {
- padding: 0px 0 0 0px;
- background: url(images/img08.jpg) no-repeat left top;
- font-size: 24px;
- color: #FFFFFF;
-}
-
-.post h2 {
- padding: 0px 0 0 0px;
- font-size: 22px;
- color: #FFFFFF;
-}
-
-.post .entry {
-}
-
-.post .meta {
- padding: 15px 15px 30px 0px;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 11px;
-}
-
-.post .meta p {
- margin: 0;
- padding-top: 15px;
- line-height: normal;
- color: #FFFFFF;
-}
-
-.post .meta .byline {
- float: left;
-}
-
-.post .meta .links {
- float: right;
-}
-
-.post .meta .more {
- padding: 0 10px 0 18px;
-}
-
-.post .meta .comments {
-}
-
-.post .meta b {
- display: none;
-}
-
-
-/* Sidebar */
-
-#sidebar {
- width: 210px;
- float: right;
- margin: 0;
- padding: 0;
-}
-
-#sidebar ul {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-#sidebar li {
- margin-bottom: 40px;
-}
-
-#sidebar li ul {
-}
-
-#sidebar li li {
- margin: 0;
-}
-
-#sidebar h2 {
- width: 250px;
- padding: 8px 0 0 0px;
- margin-bottom: 10px;
- background: url(images/img07.jpg) no-repeat left top;
- font-size: 20px;
- color: #FFFFFF;
-}
-
-/* Search */
-
-#search {
-
-}
-
-#search h2 {
- margin-bottom: 20px;
-}
-
-#s {
- width: 140px;
- margin-right: 5px;
- padding: 3px;
- border: 1px solid #BED99C;
-}
-
-#x {
- padding: 3px;
- border: none;
- background: #8BD80E;
- text-transform: lowercase;
- font-size: 11px;
- color: #FFFFFF;
-}
-
-/* Boxes */
-
-.box1 {
- padding: 20px;
-}
-
-.box2 {
- color: #BABABA;
-}
-
-.box2 h2 {
- margin-bottom: 15px;
- font-size: 16px;
- color: #FFFFFF;
-}
-
-.box2 ul {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-.box2 a:link, .box2 a:hover, .box2 a:active, .box2 a:visited {
- color: #EDEDED;
-}
-
-/* Footer */
-#footer-wrap {
-}
-
-#footer {
- margin: 0 auto;
- padding: 20px 0 10px 0;
- background: #000000;
-}
-
-html>body #footer {
- height: auto;
-}
-
-#footer p {
- font-size: 11px;
-}
-
-#legal {
- clear: both;
- padding-top: 17px;
- text-align: center;
- color: #FFFFFF;
-}
-
-#legal a {
- font-weight: normal;
- color: #FFFFFF;
-}
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img01.gif b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img01.gif
deleted file mode 100644
index 5f082bd99..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img01.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img02.gif b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img02.gif
deleted file mode 100644
index 45a3ae976..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img02.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img03.gif b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img03.gif
deleted file mode 100644
index d92ea38f9..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img03.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img04.gif b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img04.gif
deleted file mode 100644
index 950c4af9d..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/img04.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/spacer.gif b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/spacer.gif
deleted file mode 100644
index 5bfd67a2d..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/images/spacer.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/style.css b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/style.css
deleted file mode 100644
index 0a4b5767e..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/style.css
+++ /dev/null
@@ -1,109 +0,0 @@
-html, body {
- color: black;
- background-color: #ddd;
- font: x-small "Lucida Grande", "Lucida Sans Unicode", geneva, verdana, sans-serif;
- margin: 0;
- padding: 0;
-}
-
-td, th {padding:3px;border:none;}
-tr th {text-align:left;background-color:#f0f0f0;color:#333;}
-tr.odd td {background-color:#edf3fe;}
-tr.even td {background-color:#fff;}
-
-#header {
- height: 80px;
- width: 777px;
- background: blue URL('../images/header_inner.png') no-repeat;
- border-left: 1px solid #aaa;
- border-right: 1px solid #aaa;
- margin: 0 auto 0 auto;
-}
-
-a.link, a, a.active {
- color: #369;
-}
-
-
-#main_content {
- color: black;
- font-size: 127%;
- background-color: white;
- width: 757px;
- margin: 0 auto 0 auto;
- border-left: 1px solid #aaa;
- border-right: 1px solid #aaa;
- padding: 10px;
-}
-
-#sidebar {
- border: 1px solid #aaa;
- background-color: #eee;
- margin: 0.5em;
- padding: 1em;
- float: right;
- width: 200px;
- font-size: 88%;
-}
-
-#sidebar h2 {
- margin-top: 0;
-}
-
-#sidebar ul {
- margin-left: 1.5em;
- padding-left: 0;
-}
-
-h1,h2,h3,h4,h5,h6,#getting_started_steps {
- font-family: "Century Schoolbook L", Georgia, serif;
- font-weight: bold;
-}
-
-h2 {
- font-size: 150%;
-}
-
-#footer {
- border: 1px solid #aaa;
- border-top: 0px none;
- color: #999;
- background-color: white;
- padding: 10px;
- font-size: 80%;
- text-align: center;
- width: 757px;
- margin: 0 auto 1em auto;
-}
-
-.code {
- font-family: monospace;
-}
-
-span.code {
- font-weight: bold;
- background: #eee;
-}
-
-#status_block {
- margin: 0 auto 0.5em auto;
- padding: 15px 10px 15px 55px;
- background: #cec URL('../images/ok.png') left center no-repeat;
- border: 1px solid #9c9;
- width: 450px;
- font-size: 120%;
- font-weight: bolder;
-}
-
-.notice {
- margin: 0.5em auto 0.5em auto;
- padding: 15px 10px 15px 55px;
- width: 450px;
- background: #eef URL('../images/info.png') left center no-repeat;
- border: 1px solid #cce;
-}
-
-.fielderror {
- color: red;
- font-weight: bold;
-}
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/templatelicense.txt b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/templatelicense.txt
deleted file mode 100644
index ccb6b06ab..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/static/templatelicense.txt
+++ /dev/null
@@ -1,243 +0,0 @@
-Creative Commons </>
-
-Creative Commons Legal Code
-
-*Attribution 2.5*
-
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
-LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
-ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION
-ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE
-INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
-ITS USE.
-
-/License/
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE
-RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS
-AND CONDITIONS.
-
-*1. Definitions*
-
- 1. *"Collective Work"* means a work, such as a periodical issue,
- anthology or encyclopedia, in which the Work in its entirety in
- unmodified form, along with a number of other contributions,
- constituting separate and independent works in themselves, are
- assembled into a collective whole. A work that constitutes a
- Collective Work will not be considered a Derivative Work (as
- defined below) for the purposes of this License.
- 2. *"Derivative Work"* means a work based upon the Work or upon the
- Work and other pre-existing works, such as a translation, musical
- arrangement, dramatization, fictionalization, motion picture
- version, sound recording, art reproduction, abridgment,
- condensation, or any other form in which the Work may be recast,
- transformed, or adapted, except that a work that constitutes a
- Collective Work will not be considered a Derivative Work for the
- purpose of this License. For the avoidance of doubt, where the
- Work is a musical composition or sound recording, the
- synchronization of the Work in timed-relation with a moving image
- ("synching") will be considered a Derivative Work for the purpose
- of this License.
- 3. *"Licensor"* means the individual or entity that offers the Work
- under the terms of this License.
- 4. *"Original Author"* means the individual or entity who created the
- Work.
- 5. *"Work"* means the copyrightable work of authorship offered under
- the terms of this License.
- 6. *"You"* means an individual or entity exercising rights under this
- License who has not previously violated the terms of this License
- with respect to the Work, or who has received express permission
- from the Licensor to exercise rights under this License despite a
- previous violation.
-
-*2. Fair Use Rights.* Nothing in this license is intended to reduce,
-limit, or restrict any rights arising from fair use, first sale or other
-limitations on the exclusive rights of the copyright owner under
-copyright law or other applicable laws.
-
-*3. License Grant.* Subject to the terms and conditions of this License,
-Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-perpetual (for the duration of the applicable copyright) license to
-exercise the rights in the Work as stated below:
-
- 1. to reproduce the Work, to incorporate the Work into one or more
- Collective Works, and to reproduce the Work as incorporated in the
- Collective Works;
- 2. to create and reproduce Derivative Works;
- 3. to distribute copies or phonorecords of, display publicly, perform
- publicly, and perform publicly by means of a digital audio
- transmission the Work including as incorporated in Collective Works;
- 4. to distribute copies or phonorecords of, display publicly, perform
- publicly, and perform publicly by means of a digital audio
- transmission Derivative Works.
- 5.
-
- For the avoidance of doubt, where the work is a musical composition:
-
- 1. *Performance Royalties Under Blanket Licenses*. Licensor
- waives the exclusive right to collect, whether individually
- or via a performance rights society (e.g. ASCAP, BMI,
- SESAC), royalties for the public performance or public
- digital performance (e.g. webcast) of the Work.
- 2. *Mechanical Rights and Statutory Royalties*. Licensor waives
- the exclusive right to collect, whether individually or via
- a music rights agency or designated agent (e.g. Harry Fox
- Agency), royalties for any phonorecord You create from the
- Work ("cover version") and distribute, subject to the
- compulsory license created by 17 USC Section 115 of the US
- Copyright Act (or the equivalent in other jurisdictions).
- 6. *Webcasting Rights and Statutory Royalties*. For the avoidance of
- doubt, where the Work is a sound recording, Licensor waives the
- exclusive right to collect, whether individually or via a
- performance-rights society (e.g. SoundExchange), royalties for the
- public digital performance (e.g. webcast) of the Work, subject to
- the compulsory license created by 17 USC Section 114 of the US
- Copyright Act (or the equivalent in other jurisdictions).
-
-The above rights may be exercised in all media and formats whether now
-known or hereafter devised. The above rights include the right to make
-such modifications as are technically necessary to exercise the rights
-in other media and formats. All rights not expressly granted by Licensor
-are hereby reserved.
-
-*4. Restrictions.*The license granted in Section 3 above is expressly
-made subject to and limited by the following restrictions:
-
- 1. You may distribute, publicly display, publicly perform, or
- publicly digitally perform the Work only under the terms of this
- License, and You must include a copy of, or the Uniform Resource
- Identifier for, this License with every copy or phonorecord of the
- Work You distribute, publicly display, publicly perform, or
- publicly digitally perform. You may not offer or impose any terms
- on the Work that alter or restrict the terms of this License or
- the recipients' exercise of the rights granted hereunder. You may
- not sublicense the Work. You must keep intact all notices that
- refer to this License and to the disclaimer of warranties. You may
- not distribute, publicly display, publicly perform, or publicly
- digitally perform the Work with any technological measures that
- control access or use of the Work in a manner inconsistent with
- the terms of this License Agreement. The above applies to the Work
- as incorporated in a Collective Work, but this does not require
- the Collective Work apart from the Work itself to be made subject
- to the terms of this License. If You create a Collective Work,
- upon notice from any Licensor You must, to the extent practicable,
- remove from the Collective Work any credit as required by clause
- 4(b), as requested. If You create a Derivative Work, upon notice
- from any Licensor You must, to the extent practicable, remove from
- the Derivative Work any credit as required by clause 4(b), as
- requested.
- 2. If you distribute, publicly display, publicly perform, or publicly
- digitally perform the Work or any Derivative Works or Collective
- Works, You must keep intact all copyright notices for the Work and
- provide, reasonable to the medium or means You are utilizing: (i)
- the name of the Original Author (or pseudonym, if applicable) if
- supplied, and/or (ii) if the Original Author and/or Licensor
- designate another party or parties (e.g. a sponsor institute,
- publishing entity, journal) for attribution in Licensor's
- copyright notice, terms of service or by other reasonable means,
- the name of such party or parties; the title of the Work if
- supplied; to the extent reasonably practicable, the Uniform
- Resource Identifier, if any, that Licensor specifies to be
- associated with the Work, unless such URI does not refer to the
- copyright notice or licensing information for the Work; and in the
- case of a Derivative Work, a credit identifying the use of the
- Work in the Derivative Work (e.g., "French translation of the Work
- by Original Author," or "Screenplay based on original Work by
- Original Author"). Such credit may be implemented in any
- reasonable manner; provided, however, that in the case of a
- Derivative Work or Collective Work, at a minimum such credit will
- appear where any other comparable authorship credit appears and in
- a manner at least as prominent as such other comparable authorship
- credit.
-
-*5. Representations, Warranties and Disclaimer*
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-*7. Termination*
-
- 1. This License and the rights granted hereunder will terminate
- automatically upon any breach by You of the terms of this License.
- Individuals or entities who have received Derivative Works or
- Collective Works from You under this License, however, will not
- have their licenses terminated provided such individuals or
- entities remain in full compliance with those licenses. Sections
- 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
- 2. Subject to the above terms and conditions, the license granted
- here is perpetual (for the duration of the applicable copyright in
- the Work). Notwithstanding the above, Licensor reserves the right
- to release the Work under different license terms or to stop
- distributing the Work at any time; provided, however that any such
- election will not serve to withdraw this License (or any other
- license that has been, or is required to be, granted under the
- terms of this License), and this License will continue in full
- force and effect unless terminated as stated above.
-
-*8. Miscellaneous*
-
- 1. Each time You distribute or publicly digitally perform the Work or
- a Collective Work, the Licensor offers to the recipient a license
- to the Work on the same terms and conditions as the license
- granted to You under this License.
- 2. Each time You distribute or publicly digitally perform a
- Derivative Work, Licensor offers to the recipient a license to the
- original Work on the same terms and conditions as the license
- granted to You under this License.
- 3. If any provision of this License is invalid or unenforceable under
- applicable law, it shall not affect the validity or enforceability
- of the remainder of the terms of this License, and without further
- action by the parties to this agreement, such provision shall be
- reformed to the minimum extent necessary to make such provision
- valid and enforceable.
- 4. No term or provision of this License shall be deemed waived and no
- breach consented to unless such waiver or consent shall be in
- writing and signed by the party to be charged with such waiver or
- consent.
- 5. This License constitutes the entire agreement between the parties
- with respect to the Work licensed here. There are no
- understandings, agreements or representations with respect to the
- Work not specified here. Licensor shall not be bound by any
- additional provisions that may appear in any communication from
- You. This License may not be modified without the mutual written
- agreement of the Licensor and You.
-
-Creative Commons is not a party to this License, and makes no warranty
-whatsoever in connection with the Work. Creative Commons will not be
-liable to You or any party on any legal theory for any damages
-whatsoever, including without limitation any general, special,
-incidental or consequential damages arising in connection to this
-license. Notwithstanding the foregoing two (2) sentences, if Creative
-Commons has expressly identified itself as the Licensor hereunder, it
-shall have all rights and obligations of Licensor.
-
-Except for the limited purpose of indicating to the public that the Work
-is licensed under the CCPL, neither party will use the trademark
-"Creative Commons" or any related trademark or logo of Creative Commons
-without the prior written consent of Creative Commons. Any permitted use
-will be in compliance with Creative Commons' then-current trademark
-usage guidelines, as may be published on its website or otherwise made
-available upon request from time to time.
-
-Creative Commons may be contacted at http://creativecommons.org/
-<http://creativecommons.org>.
-
-« Back to Commons Deed <./>
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/view.pt b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/view.pt
deleted file mode 100644
index 5326e6454..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/templates/view.pt
+++ /dev/null
@@ -1,26 +0,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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
- <title>${page.__name__} - bfg tutorial wiki (based on TurboGears 20-Minute Wiki)</title>
- <link rel="stylesheet" type="text/css"
- href="${request.application_url}/static/style.css" />
-</head>
-
-<body>
-
-<div class="main_content">
-<div style="float:right; width: 10em;"> Viewing
-<span tal:replace="page.__name__">Page Name Goes Here</span> <br/>
-You can return to the <a href="${request.application_url}">FrontPage</a>.
-</div>
-
-<div tal:replace="structure content">Page text goes here.</div>
-<p><a tal:attributes="href edit_url" href="">Edit this page</a></p>
-</div>
-
-</body></html>
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/tests.py b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/tests.py
deleted file mode 100644
index 84a3a0f37..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/tests.py
+++ /dev/null
@@ -1,150 +0,0 @@
-import unittest
-
-from repoze.bfg import testing
-
-class PageModelTests(unittest.TestCase):
-
- def _getTargetClass(self):
- from tutorial.models import Page
- return Page
-
- def _makeOne(self, data=u'some data'):
- return self._getTargetClass()(data=data)
-
- def test_constructor(self):
- instance = self._makeOne()
- self.assertEqual(instance.data, u'some data')
-
-class WikiModelTests(unittest.TestCase):
-
- def _getTargetClass(self):
- from tutorial.models import Wiki
- return Wiki
-
- def _makeOne(self):
- return self._getTargetClass()()
-
- def test_it(self):
- wiki = self._makeOne()
- self.assertEqual(wiki.__parent__, None)
- self.assertEqual(wiki.__name__, None)
-
-class AppmakerTests(unittest.TestCase):
- def _callFUT(self, zodb_root):
- from tutorial.models import appmaker
- return appmaker(zodb_root)
-
- def test_it(self):
- root = {}
- self._callFUT(root)
- self.assertEqual(root['app_root']['FrontPage'].data,
- 'This is the front page')
-
-class ViewWikiTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def test_it(self):
- from tutorial.views import view_wiki
- context = testing.DummyModel()
- request = testing.DummyRequest()
- response = view_wiki(context, request)
- self.assertEqual(response.location, 'http://example.com/FrontPage')
-
-class ViewPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import view_page
- return view_page(context, request)
-
- def test_it(self):
- wiki = testing.DummyModel()
- wiki['IDoExist'] = testing.DummyModel()
- context = testing.DummyModel(data='Hello CruelWorld IDoExist')
- context.__parent__ = wiki
- context.__name__ = 'thepage'
- request = testing.DummyRequest()
- renderer = testing.registerDummyRenderer('templates/view.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(
- renderer.content,
- '<div class="document">\n'
- '<p>Hello <a href="http://example.com/add_page/CruelWorld">'
- 'CruelWorld</a> '
- '<a href="http://example.com/IDoExist/">'
- 'IDoExist</a>'
- '</p>\n</div>\n')
- self.assertEqual(renderer.edit_url,
- 'http://example.com/thepage/edit_page')
-
-
-class AddPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import add_page
- return add_page(context, request)
-
- def test_it_notsubmitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest()
- request.subpath = ['AnotherPage']
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(renderer.page.data, '')
-
- def test_it_submitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest({'form.submitted':True,
- 'body':'Hello yo!'})
- request.subpath = ['AnotherPage']
- response = self._callFUT(context, request)
- page = context['AnotherPage']
- self.assertEqual(page.data, 'Hello yo!')
- self.assertEqual(page.__name__, 'AnotherPage')
- self.assertEqual(page.__parent__, context)
-
-class EditPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import edit_page
- return edit_page(context, request)
-
- def test_it_notsubmitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest()
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(renderer.page, context)
-
- def test_it_submitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest({'form.submitted':True,
- 'body':'Hello yo!'})
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(response.location, 'http://example.com/')
- self.assertEqual(context.data, 'Hello yo!')
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/views.py b/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/views.py
deleted file mode 100644
index aae1c30ce..000000000
--- a/docs/tutorials/bfgwiki2/src/viewdecorators/tutorial/views.py
+++ /dev/null
@@ -1,81 +0,0 @@
-from docutils.core import publish_parts
-import re
-
-from webob.exc import HTTPFound
-from repoze.bfg.url import model_url
-from repoze.bfg.chameleon_zpt import render_template_to_response
-from repoze.bfg.view import static
-from repoze.bfg.view import bfg_view
-
-from tutorial.models import Page
-from tutorial.models import Wiki
-
-# regular expression used to find WikiWords
-wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")
-
-static_app = static('templates/static')
-
-@bfg_view(for_=Wiki, name='static')
-def static_view(context, request):
- return static_app(context, request)
-
-@bfg_view(for_=Wiki)
-def view_wiki(context, request):
- return HTTPFound(location = model_url(context, request, 'FrontPage'))
-
-@bfg_view(for_=Page)
-def view_page(context, request):
- wiki = context.__parent__
-
- def check(match):
- word = match.group(1)
- if word in wiki:
- page = wiki[word]
- view_url = model_url(page, request)
- return '<a href="%s">%s</a>' % (view_url, word)
- else:
- add_url = request.application_url + '/add_page/' + word
- return '<a href="%s">%s</a>' % (add_url, word)
-
- content = publish_parts(context.data, writer_name='html')['html_body']
- content = wikiwords.sub(check, content)
- edit_url = model_url(context, request, 'edit_page')
- return render_template_to_response('templates/view.pt',
- request = request,
- page = context,
- content = content,
- edit_url = edit_url)
-
-@bfg_view(for_=Wiki, name='add_page')
-def add_page(context, request):
- name = request.subpath[0]
- if 'form.submitted' in request.params:
- body = request.params['body']
- page = Page(body)
- page.__name__ = name
- page.__parent__ = context
- context[name] = page
- return HTTPFound(location = model_url(page, request))
- save_url = model_url(context, request, 'add_page', name)
- page = Page('')
- page.__name__ = name
- page.__parent__ = context
- return render_template_to_response('templates/edit.pt',
- request = request,
- page = page,
- save_url = save_url)
-
-@bfg_view(for_=Page, name='edit_page')
-def edit_page(context, request):
- if 'form.submitted' in request.params:
- context.data = request.params['body']
- return HTTPFound(location = model_url(context, request))
-
- return render_template_to_response('templates/edit.pt',
- request = request,
- page = context,
- save_url = model_url(context, request,
- 'edit_page')
- )
-
-
diff --git a/docs/tutorials/bfgwiki2/src/views/CHANGES.txt b/docs/tutorials/bfgwiki2/src/views/CHANGES.txt
deleted file mode 100644
index 1544cf53b..000000000
--- a/docs/tutorials/bfgwiki2/src/views/CHANGES.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-0.1
-
- Initial version
diff --git a/docs/tutorials/bfgwiki2/src/views/README.txt b/docs/tutorials/bfgwiki2/src/views/README.txt
deleted file mode 100644
index d41f7f90f..000000000
--- a/docs/tutorials/bfgwiki2/src/views/README.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-tutorial README
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/views/ez_setup.py b/docs/tutorials/bfgwiki2/src/views/ez_setup.py
deleted file mode 100644
index d24e845e5..000000000
--- a/docs/tutorials/bfgwiki2/src/views/ez_setup.py
+++ /dev/null
@@ -1,276 +0,0 @@
-#!python
-"""Bootstrap setuptools installation
-
-If you want to use setuptools in your package's setup.py, just include this
-file in the same directory with it, and add this to the top of your setup.py::
-
- from ez_setup import use_setuptools
- use_setuptools()
-
-If you want to require a specific version of setuptools, set a download
-mirror, or use an alternate download directory, you can do so by supplying
-the appropriate options to ``use_setuptools()``.
-
-This file can also be run as a script to install or upgrade setuptools.
-"""
-import sys
-DEFAULT_VERSION = "0.6c9"
-DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
-
-md5_data = {
- 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
- 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
- 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
- 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
- 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
- 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
- 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
- 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
- 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
- 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
- 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
- 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
- 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
- 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
- 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
- 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
- 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
- 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
- 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
- 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
- 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
- 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
- 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
- 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
- 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
- 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
- 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
- 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
- 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
- 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
- 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
- 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
- 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
- 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
-}
-
-import sys, os
-try: from hashlib import md5
-except ImportError: from md5 import md5
-
-def _validate_md5(egg_name, data):
- if egg_name in md5_data:
- digest = md5(data).hexdigest()
- if digest != md5_data[egg_name]:
- print >>sys.stderr, (
- "md5 validation of %s failed! (Possible download problem?)"
- % egg_name
- )
- sys.exit(2)
- return data
-
-def use_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- download_delay=15
-):
- """Automatically find/download setuptools and make it available on sys.path
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end with
- a '/'). `to_dir` is the directory where setuptools will be downloaded, if
- it is not already available. If `download_delay` is specified, it should
- be the number of seconds that will be paused before initiating a download,
- should one be required. If an older version of setuptools is installed,
- this routine will print a message to ``sys.stderr`` and raise SystemExit in
- an attempt to abort the calling script.
- """
- was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
- def do_download():
- egg = download_setuptools(version, download_base, to_dir, download_delay)
- sys.path.insert(0, egg)
- import setuptools; setuptools.bootstrap_install_from = egg
- try:
- import pkg_resources
- except ImportError:
- return do_download()
- try:
- pkg_resources.require("setuptools>="+version); return
- except pkg_resources.VersionConflict, e:
- if was_imported:
- print >>sys.stderr, (
- "The required version of setuptools (>=%s) is not available, and\n"
- "can't be installed while this script is running. Please install\n"
- " a more recent version first, using 'easy_install -U setuptools'."
- "\n\n(Currently using %r)"
- ) % (version, e.args[0])
- sys.exit(2)
- else:
- del pkg_resources, sys.modules['pkg_resources'] # reload ok
- return do_download()
- except pkg_resources.DistributionNotFound:
- return do_download()
-
-def download_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- delay = 15
-):
- """Download setuptools from a specified location and return its filename
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end
- with a '/'). `to_dir` is the directory where the egg will be downloaded.
- `delay` is the number of seconds to pause before an actual download attempt.
- """
- import urllib2, shutil
- egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
- url = download_base + egg_name
- saveto = os.path.join(to_dir, egg_name)
- src = dst = None
- if not os.path.exists(saveto): # Avoid repeated downloads
- try:
- from distutils import log
- if delay:
- log.warn("""
----------------------------------------------------------------------------
-This script requires setuptools version %s to run (even to display
-help). I will attempt to download it for you (from
-%s), but
-you may need to enable firewall access for this script first.
-I will start the download in %d seconds.
-
-(Note: if this machine does not have network access, please obtain the file
-
- %s
-
-and place it in this directory before rerunning this script.)
----------------------------------------------------------------------------""",
- version, download_base, delay, url
- ); from time import sleep; sleep(delay)
- log.warn("Downloading %s", url)
- src = urllib2.urlopen(url)
- # Read/write all in one block, so we don't create a corrupt file
- # if the download is interrupted.
- data = _validate_md5(egg_name, src.read())
- dst = open(saveto,"wb"); dst.write(data)
- finally:
- if src: src.close()
- if dst: dst.close()
- return os.path.realpath(saveto)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-def main(argv, version=DEFAULT_VERSION):
- """Install or upgrade setuptools and EasyInstall"""
- try:
- import setuptools
- except ImportError:
- egg = None
- try:
- egg = download_setuptools(version, delay=0)
- sys.path.insert(0,egg)
- from setuptools.command.easy_install import main
- return main(list(argv)+[egg]) # we're done here
- finally:
- if egg and os.path.exists(egg):
- os.unlink(egg)
- else:
- if setuptools.__version__ == '0.0.1':
- print >>sys.stderr, (
- "You have an obsolete version of setuptools installed. Please\n"
- "remove it from your system entirely before rerunning this script."
- )
- sys.exit(2)
-
- req = "setuptools>="+version
- import pkg_resources
- try:
- pkg_resources.require(req)
- except pkg_resources.VersionConflict:
- try:
- from setuptools.command.easy_install import main
- except ImportError:
- from easy_install import main
- main(list(argv)+[download_setuptools(delay=0)])
- sys.exit(0) # try to force an exit
- else:
- if argv:
- from setuptools.command.easy_install import main
- main(argv)
- else:
- print "Setuptools version",version,"or greater has been installed."
- print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
-
-def update_md5(filenames):
- """Update our built-in md5 registry"""
-
- import re
-
- for name in filenames:
- base = os.path.basename(name)
- f = open(name,'rb')
- md5_data[base] = md5(f.read()).hexdigest()
- f.close()
-
- data = [" %r: %r,\n" % it for it in md5_data.items()]
- data.sort()
- repl = "".join(data)
-
- import inspect
- srcfile = inspect.getsourcefile(sys.modules[__name__])
- f = open(srcfile, 'rb'); src = f.read(); f.close()
-
- match = re.search("\nmd5_data = {\n([^}]+)}", src)
- if not match:
- print >>sys.stderr, "Internal error!"
- sys.exit(2)
-
- src = src[:match.start(1)] + repl + src[match.end(1):]
- f = open(srcfile,'w')
- f.write(src)
- f.close()
-
-
-if __name__=='__main__':
- if len(sys.argv)>2 and sys.argv[1]=='--md5update':
- update_md5(sys.argv[2:])
- else:
- main(sys.argv[1:])
-
-
-
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/views/setup.cfg b/docs/tutorials/bfgwiki2/src/views/setup.cfg
deleted file mode 100644
index 8ce7ae0fb..000000000
--- a/docs/tutorials/bfgwiki2/src/views/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[easy_install]
-index_url = http://dist.repoze.org/bfg/current/simple
diff --git a/docs/tutorials/bfgwiki2/src/views/setup.py b/docs/tutorials/bfgwiki2/src/views/setup.py
deleted file mode 100644
index b289ca8b0..000000000
--- a/docs/tutorials/bfgwiki2/src/views/setup.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import os
-
-from ez_setup import use_setuptools
-use_setuptools()
-
-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 = [
- 'repoze.bfg',
- 'docutils',
- 'ZODB3',
- 'repoze.zodbconn',
- 'repoze.tm',
- ]
-
-setup(name='tutorial',
- version='0.1',
- description='tutorial',
- long_description=README + '\n\n' + CHANGES,
- classifiers=[
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Internet :: WWW/HTTP :: WSGI",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- ],
- author='',
- author_email='',
- url='',
- keywords='web wsgi bfg zope',
- packages=find_packages(),
- include_package_data=True,
- zip_safe=False,
- install_requires=requires,
- tests_require=requires,
- test_suite="tutorial",
- entry_points = """\
- [paste.app_factory]
- app = tutorial.run:app
- """
- )
-
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial.ini b/docs/tutorials/bfgwiki2/src/views/tutorial.ini
deleted file mode 100644
index 181682585..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-[DEFAULT]
-debug = true
-
-[app:zodb]
-use = egg:tutorial#app
-reload_templates = true
-debug_authorization = false
-debug_notfound = false
-zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000
-
-[pipeline:main]
-pipeline =
- egg:repoze.zodbconn#closer
- egg:Paste#evalerror
- egg:repoze.tm#tm
- zodb
-
-[server:main]
-use = egg:Paste#http
-host = 0.0.0.0
-port = 6543
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/__init__.py b/docs/tutorials/bfgwiki2/src/views/tutorial/__init__.py
deleted file mode 100644
index cbdfd3ac6..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# A package
-
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/configure.zcml b/docs/tutorials/bfgwiki2/src/views/tutorial/configure.zcml
deleted file mode 100644
index fda2ce0e8..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/configure.zcml
+++ /dev/null
@@ -1,34 +0,0 @@
-<configure xmlns="http://namespaces.repoze.org/bfg">
-
- <!-- this must be included for the view declarations to work -->
- <include package="repoze.bfg.includes" />
-
- <view
- for=".models.Wiki"
- view=".views.static_view"
- name="static"
- />
-
- <view
- for=".models.Wiki"
- view=".views.view_wiki"
- />
-
- <view
- for=".models.Wiki"
- name="add_page"
- view=".views.add_page"
- />
-
- <view
- for=".models.Page"
- view=".views.view_page"
- />
-
- <view
- for=".models.Page"
- name="edit_page"
- view=".views.edit_page"
- />
-
-</configure>
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/models.py b/docs/tutorials/bfgwiki2/src/views/tutorial/models.py
deleted file mode 100644
index 9761856c6..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/models.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from persistent import Persistent
-from persistent.mapping import PersistentMapping
-
-class Wiki(PersistentMapping):
- __name__ = None
- __parent__ = None
-
-class Page(Persistent):
- def __init__(self, data):
- self.data = data
-
-def appmaker(zodb_root):
- if not 'app_root' in zodb_root:
- app_root = Wiki()
- frontpage = Page('This is the front page')
- app_root['FrontPage'] = frontpage
- frontpage.__name__ = 'FrontPage'
- frontpage.__parent__ = app_root
- zodb_root['app_root'] = app_root
- import transaction
- transaction.commit()
- return zodb_root['app_root']
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/run.py b/docs/tutorials/bfgwiki2/src/views/tutorial/run.py
deleted file mode 100644
index 89953e6de..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/run.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from repoze.bfg.router import make_app
-from repoze.zodbconn.finder import PersistentApplicationFinder
-
-def app(global_config, **kw):
- """ This function returns a repoze.bfg.router.Router object.
-
- It is usually called by the PasteDeploy framework during ``paster serve``.
- """
- # paster app config callback
- import tutorial
- from tutorial.models import appmaker
- zodb_uri = kw.get('zodb_uri')
- if zodb_uri is None:
- raise ValueError("No 'zodb_uri' in application configuration.")
-
- get_root = PersistentApplicationFinder(zodb_uri, appmaker)
- return make_app(get_root, tutorial, options=kw)
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/edit.pt b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/edit.pt
deleted file mode 100644
index 883ac8b52..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/edit.pt
+++ /dev/null
@@ -1,30 +0,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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
- <title>bfg tutorial wiki (based on TurboGears 20-Minute Wiki) Editing: ${page.__name__}</title>
- <link rel="stylesheet" type="text/css"
- href="${request.application_url}/static/style.css" />
-</head>
-
-<body>
-
-<div class="main_content">
- <div style="float:right; width: 10em;"> Viewing
- <span tal:replace="page.__name__">Page Name Goes Here</span> <br/>
- You can return to the <a href="${request.application_url}">FrontPage</a>.
- </div>
-
- <div>
- <form action="${save_url}" method="post">
- <textarea name="body" tal:content="page.data" rows="10" cols="60"/>
- <input type="submit" name="form.submitted" value="Save"/>
- </form>
- </div>
-</div>
-</body>
-</html>
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/mytemplate.pt b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/mytemplate.pt
deleted file mode 100644
index 767252554..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/mytemplate.pt
+++ /dev/null
@@ -1,99 +0,0 @@
-<!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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-<head>
-<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-<title>${project} Application</title>
-<meta name="keywords" content="python web application" />
-<meta name="description" content="repoze.bfg web application" />
-<link href="${request.application_url}/static/default.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<!-- start header -->
-<div id="logo">
- <h2><code>${project}</code>, a <code>repoze.bfg</code> application</h2>
-</div>
-<div id="header">
- <div id="menu">
- </div>
-</div>
-<!-- end header -->
-<div id="wrapper">
- <!-- start page -->
- <div id="page">
- <!-- start content -->
- <div id="content">
- <div class="post">
- <h1 class="title">Welcome to <code>${project}</code>, an
- application generated by the <a
- href="http://bfg.repoze.org">repoze.bfg</a> web
- application framework.</h1>
- </div>
- </div>
- <!-- end content -->
- <!-- start sidebar -->
- <div id="sidebar">
- <ul>
- <li id="search">
- <h2>Search<br/> <code>repoze.bfg</code> Documentation</h2>
- <form method="get"
- action="http://bfg.repoze.org/searchresults">
- <fieldset>
- <input type="text" id="q" name="text" value="" />
- <input type="submit" id="x" value="Search" />
- </fieldset>
- </form>
- </li>
- <li>
- <h2><code>repoze.bfg</code> links</h2>
- <ul>
- <li><a
- href="http://docs.repoze.org/bfg/#narrative-documentation">Narrative
- Documentation</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#api-documentation">API
- Documentation</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#tutorials">Tutorials</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#change-history">Change
- History</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#sample-applications">Sample
- Applications</a>
- </li>
- <li>
- <a
- href="http://docs.repoze.org/bfg/#support-and-development">Support
- and Development</a>
- </li>
- <li>
- <a
- href="irc://irc.freenode.net#repoze">IRC Channel</a>
- </li>
- </ul>
- </li>
- </ul>
- </div>
- <!-- end sidebar -->
- <div style="clear: both;">&nbsp;</div>
- </div>
-</div>
-<!-- end page -->
-<!-- start footer -->
-<div id="footer">
- <p id="legal">( c ) 2008. All Rights Reserved. Template design
- by <a href="http://www.freecsstemplates.org/">Free CSS
- Templates</a>.</p>
-</div>
-<!-- end footer -->
-</body>
-</html>
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/default.css b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/default.css
deleted file mode 100644
index 41b3debde..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/default.css
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
-Design by Free CSS Templates
-http://www.freecsstemplates.org
-Released for free under a Creative Commons Attribution 2.5 License
-*/
-
-body {
- margin: 0;
- padding: 0;
- background: url(images/img01.gif) repeat-x left top;
- font-size: 13px;
- font-family: "Trebuchet MS", Georgia, "Times New Roman", Times, serif;
- text-align: justify;
- color: #FFFFFF;
-}
-
-h1, h2, h3 {
- margin: 0;
- text-transform: lowercase;
- font-weight: normal;
- color: #FFFFFF;
-}
-
-h1 {
- letter-spacing: -1px;
- font-size: 32px;
-}
-
-h2 {
- font-size: 23px;
-}
-
-p, ul, ol {
- margin: 0 0 2em 0;
- text-align: justify;
- line-height: 26px;
-}
-
-a:link {
- color: #8BD80E;
-}
-
-a:hover, a:active {
- text-decoration: none;
- color: #8BD80E;
-}
-
-a:visited {
- color: #8BD80E;
-}
-
-img {
- border: none;
-}
-
-img.left {
- float: left;
- margin-right: 15px;
-}
-
-img.right {
- float: right;
- margin-left: 15px;
-}
-
-/* Form */
-
-form {
- margin: 0;
- padding: 0;
-}
-
-fieldset {
- margin: 0;
- padding: 0;
- border: none;
-}
-
-legend {
- display: none;
-}
-
-input, textarea, select {
- font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
- font-size: 13px;
- color: #333333;
-}
-
-#wrapper {
- margin: 0;
- padding: 0;
- background: #000000;
-}
-
-/* Header */
-
-#header {
- width: 713px;
- margin: 0 auto;
- height: 42px;
-}
-
-/* Menu */
-
-#menu {
- float: left;
- width: 713px;
- height: 50px;
- background: url(images/img02.gif) no-repeat left top;
-}
-
-#menu ul {
- margin: 0;
- padding: 0px 0 0 10px;
- list-style: none;
- line-height: normal;
-}
-
-#menu li {
- display: block;
- float: left;
-}
-
-#menu a {
- display: block;
- float: left;
- background: url(images/img04.gif) no-repeat right 55%;
- margin-top: 5px;
- margin-right: 3px;
- padding: 8px 17px;
- text-decoration: none;
- font-size: 13px;
- color: #000000;
-}
-
-#menu a:hover {
- color: #000000;
-}
-
-#menu .current_page_item a {
- color: #000000;
-}
-
-/** LOGO */
-
-#logo {
- width: 713px;
- height: 80px;
- margin: 0 auto;
-}
-
-#logo h1, #logo h2 {
- float: left;
- margin: 0;
- padding: 30px 0 0 0px;
- line-height: normal;
-}
-
-#logo h1 {
- font-family: Georgia, "Times New Roman", Times, serif;
- font-size:40px;
-}
-
-#logo h1 a {
- text-decoration: none;
- color: #4C4C4C;
-}
-
-#logo h1 a:hover { text-decoration: underline; }
-
-#logo h2 {
- float: left;
- padding: 45px 0 0 18px;
- font: 18px Georgia, "Times New Roman", Times, serif;
- color: #8BD80E;
-}
-
-#logo p a {
- text-decoration: none;
- color: #8BD80E;
-}
-
-#logo p a:hover { text-decoration: underline; }
-
-
-
-/* Page */
-
-#page {
- width: 663px;
- margin: 0 auto;
- background: #4C4C4C url(images/img03.gif) no-repeat left bottom;
- padding: 0 25px;
-}
-
-/* Content */
-
-#content {
- float: left;
- width: 410px;
-
-}
-
-/* Post */
-
-.post {
- padding: 15px 0px;
- margin-bottom: 20px;
-}
-
-.post .title {
- margin-bottom: 20px;
- padding-bottom: 5px;
-}
-
-.post h1 {
- padding: 0px 0 0 0px;
- background: url(images/img08.jpg) no-repeat left top;
- font-size: 24px;
- color: #FFFFFF;
-}
-
-.post h2 {
- padding: 0px 0 0 0px;
- font-size: 22px;
- color: #FFFFFF;
-}
-
-.post .entry {
-}
-
-.post .meta {
- padding: 15px 15px 30px 0px;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 11px;
-}
-
-.post .meta p {
- margin: 0;
- padding-top: 15px;
- line-height: normal;
- color: #FFFFFF;
-}
-
-.post .meta .byline {
- float: left;
-}
-
-.post .meta .links {
- float: right;
-}
-
-.post .meta .more {
- padding: 0 10px 0 18px;
-}
-
-.post .meta .comments {
-}
-
-.post .meta b {
- display: none;
-}
-
-
-/* Sidebar */
-
-#sidebar {
- width: 210px;
- float: right;
- margin: 0;
- padding: 0;
-}
-
-#sidebar ul {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-#sidebar li {
- margin-bottom: 40px;
-}
-
-#sidebar li ul {
-}
-
-#sidebar li li {
- margin: 0;
-}
-
-#sidebar h2 {
- width: 250px;
- padding: 8px 0 0 0px;
- margin-bottom: 10px;
- background: url(images/img07.jpg) no-repeat left top;
- font-size: 20px;
- color: #FFFFFF;
-}
-
-/* Search */
-
-#search {
-
-}
-
-#search h2 {
- margin-bottom: 20px;
-}
-
-#s {
- width: 140px;
- margin-right: 5px;
- padding: 3px;
- border: 1px solid #BED99C;
-}
-
-#x {
- padding: 3px;
- border: none;
- background: #8BD80E;
- text-transform: lowercase;
- font-size: 11px;
- color: #FFFFFF;
-}
-
-/* Boxes */
-
-.box1 {
- padding: 20px;
-}
-
-.box2 {
- color: #BABABA;
-}
-
-.box2 h2 {
- margin-bottom: 15px;
- font-size: 16px;
- color: #FFFFFF;
-}
-
-.box2 ul {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-.box2 a:link, .box2 a:hover, .box2 a:active, .box2 a:visited {
- color: #EDEDED;
-}
-
-/* Footer */
-#footer-wrap {
-}
-
-#footer {
- margin: 0 auto;
- padding: 20px 0 10px 0;
- background: #000000;
-}
-
-html>body #footer {
- height: auto;
-}
-
-#footer p {
- font-size: 11px;
-}
-
-#legal {
- clear: both;
- padding-top: 17px;
- text-align: center;
- color: #FFFFFF;
-}
-
-#legal a {
- font-weight: normal;
- color: #FFFFFF;
-}
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img01.gif b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img01.gif
deleted file mode 100644
index 5f082bd99..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img01.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img02.gif b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img02.gif
deleted file mode 100644
index 45a3ae976..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img02.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img03.gif b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img03.gif
deleted file mode 100644
index d92ea38f9..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img03.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img04.gif b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img04.gif
deleted file mode 100644
index 950c4af9d..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/img04.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/spacer.gif b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/spacer.gif
deleted file mode 100644
index 5bfd67a2d..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/images/spacer.gif
+++ /dev/null
Binary files differ
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/style.css b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/style.css
deleted file mode 100644
index 0a4b5767e..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/style.css
+++ /dev/null
@@ -1,109 +0,0 @@
-html, body {
- color: black;
- background-color: #ddd;
- font: x-small "Lucida Grande", "Lucida Sans Unicode", geneva, verdana, sans-serif;
- margin: 0;
- padding: 0;
-}
-
-td, th {padding:3px;border:none;}
-tr th {text-align:left;background-color:#f0f0f0;color:#333;}
-tr.odd td {background-color:#edf3fe;}
-tr.even td {background-color:#fff;}
-
-#header {
- height: 80px;
- width: 777px;
- background: blue URL('../images/header_inner.png') no-repeat;
- border-left: 1px solid #aaa;
- border-right: 1px solid #aaa;
- margin: 0 auto 0 auto;
-}
-
-a.link, a, a.active {
- color: #369;
-}
-
-
-#main_content {
- color: black;
- font-size: 127%;
- background-color: white;
- width: 757px;
- margin: 0 auto 0 auto;
- border-left: 1px solid #aaa;
- border-right: 1px solid #aaa;
- padding: 10px;
-}
-
-#sidebar {
- border: 1px solid #aaa;
- background-color: #eee;
- margin: 0.5em;
- padding: 1em;
- float: right;
- width: 200px;
- font-size: 88%;
-}
-
-#sidebar h2 {
- margin-top: 0;
-}
-
-#sidebar ul {
- margin-left: 1.5em;
- padding-left: 0;
-}
-
-h1,h2,h3,h4,h5,h6,#getting_started_steps {
- font-family: "Century Schoolbook L", Georgia, serif;
- font-weight: bold;
-}
-
-h2 {
- font-size: 150%;
-}
-
-#footer {
- border: 1px solid #aaa;
- border-top: 0px none;
- color: #999;
- background-color: white;
- padding: 10px;
- font-size: 80%;
- text-align: center;
- width: 757px;
- margin: 0 auto 1em auto;
-}
-
-.code {
- font-family: monospace;
-}
-
-span.code {
- font-weight: bold;
- background: #eee;
-}
-
-#status_block {
- margin: 0 auto 0.5em auto;
- padding: 15px 10px 15px 55px;
- background: #cec URL('../images/ok.png') left center no-repeat;
- border: 1px solid #9c9;
- width: 450px;
- font-size: 120%;
- font-weight: bolder;
-}
-
-.notice {
- margin: 0.5em auto 0.5em auto;
- padding: 15px 10px 15px 55px;
- width: 450px;
- background: #eef URL('../images/info.png') left center no-repeat;
- border: 1px solid #cce;
-}
-
-.fielderror {
- color: red;
- font-weight: bold;
-}
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/templatelicense.txt b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/templatelicense.txt
deleted file mode 100644
index ccb6b06ab..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/static/templatelicense.txt
+++ /dev/null
@@ -1,243 +0,0 @@
-Creative Commons </>
-
-Creative Commons Legal Code
-
-*Attribution 2.5*
-
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
-LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
-ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION
-ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE
-INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
-ITS USE.
-
-/License/
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE
-RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS
-AND CONDITIONS.
-
-*1. Definitions*
-
- 1. *"Collective Work"* means a work, such as a periodical issue,
- anthology or encyclopedia, in which the Work in its entirety in
- unmodified form, along with a number of other contributions,
- constituting separate and independent works in themselves, are
- assembled into a collective whole. A work that constitutes a
- Collective Work will not be considered a Derivative Work (as
- defined below) for the purposes of this License.
- 2. *"Derivative Work"* means a work based upon the Work or upon the
- Work and other pre-existing works, such as a translation, musical
- arrangement, dramatization, fictionalization, motion picture
- version, sound recording, art reproduction, abridgment,
- condensation, or any other form in which the Work may be recast,
- transformed, or adapted, except that a work that constitutes a
- Collective Work will not be considered a Derivative Work for the
- purpose of this License. For the avoidance of doubt, where the
- Work is a musical composition or sound recording, the
- synchronization of the Work in timed-relation with a moving image
- ("synching") will be considered a Derivative Work for the purpose
- of this License.
- 3. *"Licensor"* means the individual or entity that offers the Work
- under the terms of this License.
- 4. *"Original Author"* means the individual or entity who created the
- Work.
- 5. *"Work"* means the copyrightable work of authorship offered under
- the terms of this License.
- 6. *"You"* means an individual or entity exercising rights under this
- License who has not previously violated the terms of this License
- with respect to the Work, or who has received express permission
- from the Licensor to exercise rights under this License despite a
- previous violation.
-
-*2. Fair Use Rights.* Nothing in this license is intended to reduce,
-limit, or restrict any rights arising from fair use, first sale or other
-limitations on the exclusive rights of the copyright owner under
-copyright law or other applicable laws.
-
-*3. License Grant.* Subject to the terms and conditions of this License,
-Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-perpetual (for the duration of the applicable copyright) license to
-exercise the rights in the Work as stated below:
-
- 1. to reproduce the Work, to incorporate the Work into one or more
- Collective Works, and to reproduce the Work as incorporated in the
- Collective Works;
- 2. to create and reproduce Derivative Works;
- 3. to distribute copies or phonorecords of, display publicly, perform
- publicly, and perform publicly by means of a digital audio
- transmission the Work including as incorporated in Collective Works;
- 4. to distribute copies or phonorecords of, display publicly, perform
- publicly, and perform publicly by means of a digital audio
- transmission Derivative Works.
- 5.
-
- For the avoidance of doubt, where the work is a musical composition:
-
- 1. *Performance Royalties Under Blanket Licenses*. Licensor
- waives the exclusive right to collect, whether individually
- or via a performance rights society (e.g. ASCAP, BMI,
- SESAC), royalties for the public performance or public
- digital performance (e.g. webcast) of the Work.
- 2. *Mechanical Rights and Statutory Royalties*. Licensor waives
- the exclusive right to collect, whether individually or via
- a music rights agency or designated agent (e.g. Harry Fox
- Agency), royalties for any phonorecord You create from the
- Work ("cover version") and distribute, subject to the
- compulsory license created by 17 USC Section 115 of the US
- Copyright Act (or the equivalent in other jurisdictions).
- 6. *Webcasting Rights and Statutory Royalties*. For the avoidance of
- doubt, where the Work is a sound recording, Licensor waives the
- exclusive right to collect, whether individually or via a
- performance-rights society (e.g. SoundExchange), royalties for the
- public digital performance (e.g. webcast) of the Work, subject to
- the compulsory license created by 17 USC Section 114 of the US
- Copyright Act (or the equivalent in other jurisdictions).
-
-The above rights may be exercised in all media and formats whether now
-known or hereafter devised. The above rights include the right to make
-such modifications as are technically necessary to exercise the rights
-in other media and formats. All rights not expressly granted by Licensor
-are hereby reserved.
-
-*4. Restrictions.*The license granted in Section 3 above is expressly
-made subject to and limited by the following restrictions:
-
- 1. You may distribute, publicly display, publicly perform, or
- publicly digitally perform the Work only under the terms of this
- License, and You must include a copy of, or the Uniform Resource
- Identifier for, this License with every copy or phonorecord of the
- Work You distribute, publicly display, publicly perform, or
- publicly digitally perform. You may not offer or impose any terms
- on the Work that alter or restrict the terms of this License or
- the recipients' exercise of the rights granted hereunder. You may
- not sublicense the Work. You must keep intact all notices that
- refer to this License and to the disclaimer of warranties. You may
- not distribute, publicly display, publicly perform, or publicly
- digitally perform the Work with any technological measures that
- control access or use of the Work in a manner inconsistent with
- the terms of this License Agreement. The above applies to the Work
- as incorporated in a Collective Work, but this does not require
- the Collective Work apart from the Work itself to be made subject
- to the terms of this License. If You create a Collective Work,
- upon notice from any Licensor You must, to the extent practicable,
- remove from the Collective Work any credit as required by clause
- 4(b), as requested. If You create a Derivative Work, upon notice
- from any Licensor You must, to the extent practicable, remove from
- the Derivative Work any credit as required by clause 4(b), as
- requested.
- 2. If you distribute, publicly display, publicly perform, or publicly
- digitally perform the Work or any Derivative Works or Collective
- Works, You must keep intact all copyright notices for the Work and
- provide, reasonable to the medium or means You are utilizing: (i)
- the name of the Original Author (or pseudonym, if applicable) if
- supplied, and/or (ii) if the Original Author and/or Licensor
- designate another party or parties (e.g. a sponsor institute,
- publishing entity, journal) for attribution in Licensor's
- copyright notice, terms of service or by other reasonable means,
- the name of such party or parties; the title of the Work if
- supplied; to the extent reasonably practicable, the Uniform
- Resource Identifier, if any, that Licensor specifies to be
- associated with the Work, unless such URI does not refer to the
- copyright notice or licensing information for the Work; and in the
- case of a Derivative Work, a credit identifying the use of the
- Work in the Derivative Work (e.g., "French translation of the Work
- by Original Author," or "Screenplay based on original Work by
- Original Author"). Such credit may be implemented in any
- reasonable manner; provided, however, that in the case of a
- Derivative Work or Collective Work, at a minimum such credit will
- appear where any other comparable authorship credit appears and in
- a manner at least as prominent as such other comparable authorship
- credit.
-
-*5. Representations, Warranties and Disclaimer*
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-*7. Termination*
-
- 1. This License and the rights granted hereunder will terminate
- automatically upon any breach by You of the terms of this License.
- Individuals or entities who have received Derivative Works or
- Collective Works from You under this License, however, will not
- have their licenses terminated provided such individuals or
- entities remain in full compliance with those licenses. Sections
- 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
- 2. Subject to the above terms and conditions, the license granted
- here is perpetual (for the duration of the applicable copyright in
- the Work). Notwithstanding the above, Licensor reserves the right
- to release the Work under different license terms or to stop
- distributing the Work at any time; provided, however that any such
- election will not serve to withdraw this License (or any other
- license that has been, or is required to be, granted under the
- terms of this License), and this License will continue in full
- force and effect unless terminated as stated above.
-
-*8. Miscellaneous*
-
- 1. Each time You distribute or publicly digitally perform the Work or
- a Collective Work, the Licensor offers to the recipient a license
- to the Work on the same terms and conditions as the license
- granted to You under this License.
- 2. Each time You distribute or publicly digitally perform a
- Derivative Work, Licensor offers to the recipient a license to the
- original Work on the same terms and conditions as the license
- granted to You under this License.
- 3. If any provision of this License is invalid or unenforceable under
- applicable law, it shall not affect the validity or enforceability
- of the remainder of the terms of this License, and without further
- action by the parties to this agreement, such provision shall be
- reformed to the minimum extent necessary to make such provision
- valid and enforceable.
- 4. No term or provision of this License shall be deemed waived and no
- breach consented to unless such waiver or consent shall be in
- writing and signed by the party to be charged with such waiver or
- consent.
- 5. This License constitutes the entire agreement between the parties
- with respect to the Work licensed here. There are no
- understandings, agreements or representations with respect to the
- Work not specified here. Licensor shall not be bound by any
- additional provisions that may appear in any communication from
- You. This License may not be modified without the mutual written
- agreement of the Licensor and You.
-
-Creative Commons is not a party to this License, and makes no warranty
-whatsoever in connection with the Work. Creative Commons will not be
-liable to You or any party on any legal theory for any damages
-whatsoever, including without limitation any general, special,
-incidental or consequential damages arising in connection to this
-license. Notwithstanding the foregoing two (2) sentences, if Creative
-Commons has expressly identified itself as the Licensor hereunder, it
-shall have all rights and obligations of Licensor.
-
-Except for the limited purpose of indicating to the public that the Work
-is licensed under the CCPL, neither party will use the trademark
-"Creative Commons" or any related trademark or logo of Creative Commons
-without the prior written consent of Creative Commons. Any permitted use
-will be in compliance with Creative Commons' then-current trademark
-usage guidelines, as may be published on its website or otherwise made
-available upon request from time to time.
-
-Creative Commons may be contacted at http://creativecommons.org/
-<http://creativecommons.org>.
-
-« Back to Commons Deed <./>
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/view.pt b/docs/tutorials/bfgwiki2/src/views/tutorial/templates/view.pt
deleted file mode 100644
index 5326e6454..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/templates/view.pt
+++ /dev/null
@@ -1,26 +0,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"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
-
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
- <title>${page.__name__} - bfg tutorial wiki (based on TurboGears 20-Minute Wiki)</title>
- <link rel="stylesheet" type="text/css"
- href="${request.application_url}/static/style.css" />
-</head>
-
-<body>
-
-<div class="main_content">
-<div style="float:right; width: 10em;"> Viewing
-<span tal:replace="page.__name__">Page Name Goes Here</span> <br/>
-You can return to the <a href="${request.application_url}">FrontPage</a>.
-</div>
-
-<div tal:replace="structure content">Page text goes here.</div>
-<p><a tal:attributes="href edit_url" href="">Edit this page</a></p>
-</div>
-
-</body></html>
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/tests.py b/docs/tutorials/bfgwiki2/src/views/tutorial/tests.py
deleted file mode 100644
index 84a3a0f37..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/tests.py
+++ /dev/null
@@ -1,150 +0,0 @@
-import unittest
-
-from repoze.bfg import testing
-
-class PageModelTests(unittest.TestCase):
-
- def _getTargetClass(self):
- from tutorial.models import Page
- return Page
-
- def _makeOne(self, data=u'some data'):
- return self._getTargetClass()(data=data)
-
- def test_constructor(self):
- instance = self._makeOne()
- self.assertEqual(instance.data, u'some data')
-
-class WikiModelTests(unittest.TestCase):
-
- def _getTargetClass(self):
- from tutorial.models import Wiki
- return Wiki
-
- def _makeOne(self):
- return self._getTargetClass()()
-
- def test_it(self):
- wiki = self._makeOne()
- self.assertEqual(wiki.__parent__, None)
- self.assertEqual(wiki.__name__, None)
-
-class AppmakerTests(unittest.TestCase):
- def _callFUT(self, zodb_root):
- from tutorial.models import appmaker
- return appmaker(zodb_root)
-
- def test_it(self):
- root = {}
- self._callFUT(root)
- self.assertEqual(root['app_root']['FrontPage'].data,
- 'This is the front page')
-
-class ViewWikiTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def test_it(self):
- from tutorial.views import view_wiki
- context = testing.DummyModel()
- request = testing.DummyRequest()
- response = view_wiki(context, request)
- self.assertEqual(response.location, 'http://example.com/FrontPage')
-
-class ViewPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import view_page
- return view_page(context, request)
-
- def test_it(self):
- wiki = testing.DummyModel()
- wiki['IDoExist'] = testing.DummyModel()
- context = testing.DummyModel(data='Hello CruelWorld IDoExist')
- context.__parent__ = wiki
- context.__name__ = 'thepage'
- request = testing.DummyRequest()
- renderer = testing.registerDummyRenderer('templates/view.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(
- renderer.content,
- '<div class="document">\n'
- '<p>Hello <a href="http://example.com/add_page/CruelWorld">'
- 'CruelWorld</a> '
- '<a href="http://example.com/IDoExist/">'
- 'IDoExist</a>'
- '</p>\n</div>\n')
- self.assertEqual(renderer.edit_url,
- 'http://example.com/thepage/edit_page')
-
-
-class AddPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import add_page
- return add_page(context, request)
-
- def test_it_notsubmitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest()
- request.subpath = ['AnotherPage']
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(renderer.page.data, '')
-
- def test_it_submitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest({'form.submitted':True,
- 'body':'Hello yo!'})
- request.subpath = ['AnotherPage']
- response = self._callFUT(context, request)
- page = context['AnotherPage']
- self.assertEqual(page.data, 'Hello yo!')
- self.assertEqual(page.__name__, 'AnotherPage')
- self.assertEqual(page.__parent__, context)
-
-class EditPageTests(unittest.TestCase):
- def setUp(self):
- testing.cleanUp()
-
- def tearDown(self):
- testing.cleanUp()
-
- def _callFUT(self, context, request):
- from tutorial.views import edit_page
- return edit_page(context, request)
-
- def test_it_notsubmitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest()
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(renderer.request, request)
- self.assertEqual(renderer.page, context)
-
- def test_it_submitted(self):
- context = testing.DummyModel()
- request = testing.DummyRequest({'form.submitted':True,
- 'body':'Hello yo!'})
- renderer = testing.registerDummyRenderer('templates/edit.pt')
- response = self._callFUT(context, request)
- self.assertEqual(response.location, 'http://example.com/')
- self.assertEqual(context.data, 'Hello yo!')
-
-
-
diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/views.py b/docs/tutorials/bfgwiki2/src/views/tutorial/views.py
deleted file mode 100644
index eb1f9c0bf..000000000
--- a/docs/tutorials/bfgwiki2/src/views/tutorial/views.py
+++ /dev/null
@@ -1,71 +0,0 @@
-from docutils.core import publish_parts
-import re
-
-from webob.exc import HTTPFound
-from repoze.bfg.url import model_url
-from repoze.bfg.chameleon_zpt import render_template_to_response
-from repoze.bfg.view import static
-
-from tutorial.models import Page
-
-# regular expression used to find WikiWords
-wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")
-
-static_view = static('templates/static')
-
-def view_wiki(context, request):
- return HTTPFound(location = model_url(context, request, 'FrontPage'))
-
-def view_page(context, request):
- wiki = context.__parent__
-
- def check(match):
- word = match.group(1)
- if word in wiki:
- page = wiki[word]
- view_url = model_url(page, request)
- return '<a href="%s">%s</a>' % (view_url, word)
- else:
- add_url = request.application_url + '/add_page/' + word
- return '<a href="%s">%s</a>' % (add_url, word)
-
- content = publish_parts(context.data, writer_name='html')['html_body']
- content = wikiwords.sub(check, content)
- edit_url = model_url(context, request, 'edit_page')
- return render_template_to_response('templates/view.pt',
- request = request,
- page = context,
- content = content,
- edit_url = edit_url)
-
-def add_page(context, request):
- name = request.subpath[0]
- if 'form.submitted' in request.params:
- body = request.params['body']
- page = Page(body)
- page.__name__ = name
- page.__parent__ = context
- context[name] = page
- return HTTPFound(location = model_url(page, request))
- save_url = model_url(context, request, 'add_page', name)
- page = Page('')
- page.__name__ = name
- page.__parent__ = context
- return render_template_to_response('templates/edit.pt',
- request = request,
- page = page,
- save_url = save_url)
-
-def edit_page(context, request):
- if 'form.submitted' in request.params:
- context.data = request.params['body']
- return HTTPFound(location = model_url(context, request))
-
- return render_template_to_response('templates/edit.pt',
- request = request,
- page = context,
- save_url = model_url(context, request,
- 'edit_page')
- )
-
-