summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/glossary.rst4
-rw-r--r--docs/narr/MyProject/myproject/configure.zcml6
-rw-r--r--docs/narr/MyProject/myproject/run.py2
-rw-r--r--docs/narr/MyProject/myproject/templates/mytemplate.pt98
-rw-r--r--docs/narr/MyProject/myproject/templates/static/default.css380
-rw-r--r--docs/narr/MyProject/myproject/templates/static/images/img01.gifbin0 -> 3840 bytes
-rw-r--r--docs/narr/MyProject/myproject/templates/static/images/img02.gifbin0 -> 4689 bytes
-rw-r--r--docs/narr/MyProject/myproject/templates/static/images/img03.gifbin0 -> 229 bytes
-rw-r--r--docs/narr/MyProject/myproject/templates/static/images/img04.gifbin0 -> 92 bytes
-rw-r--r--docs/narr/MyProject/myproject/templates/static/images/spacer.gifbin0 -> 43 bytes
-rw-r--r--docs/narr/MyProject/myproject/templates/static/templatelicense.txt243
-rw-r--r--docs/narr/MyProject/myproject/tests.py7
-rw-r--r--docs/narr/MyProject/myproject/views.py6
-rw-r--r--docs/narr/project.pngbin0 -> 65901 bytes
-rw-r--r--docs/narr/project.rst99
-rw-r--r--docs/narr/views.rst2
16 files changed, 809 insertions, 38 deletions
diff --git a/docs/glossary.rst b/docs/glossary.rst
index 528522e16..19eb304df 100644
--- a/docs/glossary.rst
+++ b/docs/glossary.rst
@@ -261,6 +261,10 @@ Glossary
A `plain text format <http://docutils.sourceforge.net/rst.html>`_
that is the defacto standard for descriptive text shipped in
:term:`distribution` files, and Python docstrings.
+ Root
+ The object at which :term:`traversal` begins when
+ :mod:`repoze.bfg` searches for a context (for :term:`URL
+ Dispatch`, the root is *always* the context).
Subpath
A list of element "left over" after the :term:`router` has
performed a successful traversal to a view. The subpath is a
diff --git a/docs/narr/MyProject/myproject/configure.zcml b/docs/narr/MyProject/myproject/configure.zcml
index 584dee906..89bf74525 100644
--- a/docs/narr/MyProject/myproject/configure.zcml
+++ b/docs/narr/MyProject/myproject/configure.zcml
@@ -8,4 +8,10 @@
view=".views.my_view"
/>
+ <view
+ for=".models.MyModel"
+ view=".views.static_view"
+ name="static"
+ />
+
</configure>
diff --git a/docs/narr/MyProject/myproject/run.py b/docs/narr/MyProject/myproject/run.py
index cb9296e1f..19c5cab73 100644
--- a/docs/narr/MyProject/myproject/run.py
+++ b/docs/narr/MyProject/myproject/run.py
@@ -4,6 +4,8 @@ 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
from myproject.models import get_root
import myproject
return make_app(get_root, myproject, options=kw)
+
diff --git a/docs/narr/MyProject/myproject/templates/mytemplate.pt b/docs/narr/MyProject/myproject/templates/mytemplate.pt
index a7affedf9..b94cb7098 100644
--- a/docs/narr/MyProject/myproject/templates/mytemplate.pt
+++ b/docs/narr/MyProject/myproject/templates/mytemplate.pt
@@ -1,7 +1,99 @@
+<!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></head>
+ 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>
- <h1>Welcome to ${project}</h1>
+<!-- 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://static.repoze.org/bfgdocs">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://static.repoze.org/bfgdocs/search.html">
+ <fieldset>
+ <input type="text" id="q" name="q" value="" />
+ <input type="submit" id="x" value="Search" />
+ </fieldset>
+ </form>
+ </li>
+ <li>
+ <h2><code>repoze.bfg</code> links</h2>
+ <ul>
+ <li><a
+ href="http://static.repoze.org/bfgdocs/#narrative-documentation">Narrative
+ Documentation</a>
+ </li>
+ <li>
+ <a
+ href="http://static.repoze.org/bfgdocs/#api-documentation">API
+ Documentation</a>
+ </li>
+ <li>
+ <a
+ href="http://static.repoze.org/bfgdocs/#tutorials">Tutorials</a>
+ </li>
+ <li>
+ <a
+ href="http://static.repoze.org/bfgdocs/#change-history">Change
+ History</a>
+ </li>
+ <li>
+ <a
+ href="http://static.repoze.org/bfgdocs/#sample-applications">Sample
+ Applications</a>
+ </li>
+ <li>
+ <a
+ href="http://static.repoze.org/bfgdocs/#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/narr/MyProject/myproject/templates/static/default.css b/docs/narr/MyProject/myproject/templates/static/default.css
new file mode 100644
index 000000000..41b3debde
--- /dev/null
+++ b/docs/narr/MyProject/myproject/templates/static/default.css
@@ -0,0 +1,380 @@
+/*
+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/narr/MyProject/myproject/templates/static/images/img01.gif b/docs/narr/MyProject/myproject/templates/static/images/img01.gif
new file mode 100644
index 000000000..5f082bd99
--- /dev/null
+++ b/docs/narr/MyProject/myproject/templates/static/images/img01.gif
Binary files differ
diff --git a/docs/narr/MyProject/myproject/templates/static/images/img02.gif b/docs/narr/MyProject/myproject/templates/static/images/img02.gif
new file mode 100644
index 000000000..45a3ae976
--- /dev/null
+++ b/docs/narr/MyProject/myproject/templates/static/images/img02.gif
Binary files differ
diff --git a/docs/narr/MyProject/myproject/templates/static/images/img03.gif b/docs/narr/MyProject/myproject/templates/static/images/img03.gif
new file mode 100644
index 000000000..d92ea38f9
--- /dev/null
+++ b/docs/narr/MyProject/myproject/templates/static/images/img03.gif
Binary files differ
diff --git a/docs/narr/MyProject/myproject/templates/static/images/img04.gif b/docs/narr/MyProject/myproject/templates/static/images/img04.gif
new file mode 100644
index 000000000..950c4af9d
--- /dev/null
+++ b/docs/narr/MyProject/myproject/templates/static/images/img04.gif
Binary files differ
diff --git a/docs/narr/MyProject/myproject/templates/static/images/spacer.gif b/docs/narr/MyProject/myproject/templates/static/images/spacer.gif
new file mode 100644
index 000000000..5bfd67a2d
--- /dev/null
+++ b/docs/narr/MyProject/myproject/templates/static/images/spacer.gif
Binary files differ
diff --git a/docs/narr/MyProject/myproject/templates/static/templatelicense.txt b/docs/narr/MyProject/myproject/templates/static/templatelicense.txt
new file mode 100644
index 000000000..ccb6b06ab
--- /dev/null
+++ b/docs/narr/MyProject/myproject/templates/static/templatelicense.txt
@@ -0,0 +1,243 @@
+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/narr/MyProject/myproject/tests.py b/docs/narr/MyProject/myproject/tests.py
index 64314616d..4e0b2f8f4 100644
--- a/docs/narr/MyProject/myproject/tests.py
+++ b/docs/narr/MyProject/myproject/tests.py
@@ -28,7 +28,7 @@ class ViewTests(unittest.TestCase):
request = testing.DummyRequest()
renderer = testing.registerDummyRenderer('templates/mytemplate.pt')
response = my_view(context, request)
- renderer.assert_(project='myproject')
+ renderer.assert_(project='MyProject')
class ViewIntegrationTests(unittest.TestCase):
""" These tests are integration tests for the view. These test
@@ -51,7 +51,8 @@ class ViewIntegrationTests(unittest.TestCase):
cleanUp()
import myproject
import zope.configuration.xmlconfig
- zope.configuration.xmlconfig.file('configure.zcml', package=myproject)
+ zope.configuration.xmlconfig.file('configure.zcml',
+ package=myproject)
def tearDown(self):
""" Clear out the application registry """
@@ -64,7 +65,7 @@ class ViewIntegrationTests(unittest.TestCase):
result = my_view(context, request)
self.assertEqual(result.status, '200 OK')
body = result.app_iter[0]
- self.failUnless('Welcome to myproject' in body)
+ self.failUnless('Welcome to' in body)
self.assertEqual(len(result.headerlist), 2)
self.assertEqual(result.headerlist[0],
('content-type', 'text/html; charset=UTF-8'))
diff --git a/docs/narr/MyProject/myproject/views.py b/docs/narr/MyProject/myproject/views.py
index 67dbd00b6..d4de33b6d 100644
--- a/docs/narr/MyProject/myproject/views.py
+++ b/docs/narr/MyProject/myproject/views.py
@@ -1,5 +1,9 @@
from repoze.bfg.chameleon_zpt import render_template_to_response
+from repoze.bfg.view import static
+
+static_view = static('templates/static')
def my_view(context, request):
return render_template_to_response('templates/mytemplate.pt',
- project = 'myproject')
+ request = request,
+ project = 'MyProject')
diff --git a/docs/narr/project.png b/docs/narr/project.png
new file mode 100644
index 000000000..4b9bd4ab5
--- /dev/null
+++ b/docs/narr/project.png
Binary files differ
diff --git a/docs/narr/project.rst b/docs/narr/project.rst
index 89e4e1d9e..7f056d645 100644
--- a/docs/narr/project.rst
+++ b/docs/narr/project.rst
@@ -47,6 +47,17 @@ project we name ``MyProject``:
Recursing into templates
Creating ./MyProject/myproject/templates/
Copying mytemplate.pt to ./MyProject/myproject/templates/mytemplate.pt
+ Recursing into static
+ Creating ./MyProject/myproject/templates/static/
+ Copying default.css to ./MyProject/myproject/templates/static/default.css
+ Recursing into images
+ Creating ./MyProject/myproject/templates/static/images/
+ Copying img01.gif to ./MyProject/myproject/templates/static/images/img01.gif
+ Copying img02.gif to ./MyProject/myproject/templates/static/images/img02.gif
+ Copying img03.gif to ./MyProject/myproject/templates/static/images/img03.gif
+ Copying img04.gif to ./MyProject/myproject/templates/static/images/img04.gif
+ Copying spacer.gif to ./MyProject/myproject/templates/static/images/spacer.gif
+ Copying templatelicense.txt to ./MyProject/myproject/templates/static/templatelicense.txt
Copying tests.py_tmpl to ./MyProject/myproject/tests.py
Copying views.py_tmpl to ./MyProject/myproject/views.py
Copying +project+.ini_tmpl to ./MyProject/MyProject.ini
@@ -188,9 +199,10 @@ port 6543.
Viewing the Application
-----------------------
-Visit ``http://localhost:6543/`` in your browser. You will see::
+Visit ``http://localhost:6543/`` in your browser. You will see
+something in your browser like what is displayed below:
- Welcome to MyProject
+.. image:: project.png
That's the page shown by default when you visit an unmodified ``paster
create``-generated application.
@@ -216,7 +228,8 @@ The ``MyProject`` project has the following directory structure::
| |-- models.py
| |-- run.py
| |-- templates
- | | `-- mytemplate.pt
+ | | |-- mytemplate.pt
+ | | `-- static/
| |-- tests.py
| `-- views.py
|-- MyProject.ini
@@ -426,13 +439,13 @@ tarball to other people who want to use your application.
By default, ``setup.py sdist`` does not place non-Python-source
files in generated tarballs. This means, in this case, that the
- ``mytemplate.pt`` file that's in our ``templates`` directory is not
- packaged in the tarball. To allow this to happen, check all the
- files that you'd like to be distributed along with your
- application's Python files into a version control system such as
- Subversion. After you do this, when you rerun ``setup.py sdist``,
- all files checked into the version control system will be included
- in the tarball.
+ ``templates/mytemplate.pt`` file and the files in the
+ ``templates/static`` directory are not packaged in the tarball. To
+ allow this to happen, check all the files that you'd like to be
+ distributed along with your application's Python files into a
+ version control system such as Subversion. After you do this, when
+ you rerun ``setup.py sdist``, all files checked into the version
+ control system will be included in the tarball.
The ``myproject`` :term:`Package`
---------------------------------
@@ -476,31 +489,36 @@ registry`. It looks like so:
:linenos:
:language: xml
-#. Lines 1-3 provide the root node and namespaces for the
- configuration language. ``http://namespaces.repoze.org/bfg`` is
- the default XML namespace. Add-on packages may require other
- namespaces.
+#. Lines 1 provides the root node and namespaces for the configuration
+ language. ``http://namespaces.repoze.org/bfg`` is the default XML
+ namespace. Add-on packages may require other namespaces.
-#. Line 6 initializes :mod:`repoze.bfg`-specific configuration
+#. Lines 4 initializes :mod:`repoze.bfg`-specific configuration
directives by including the ``repoze.bfg.includes`` package. This
causes all of the ZCML within the ``configure.zcml`` of the
``repoze.bfg.includes`` package (which can be found in the main
:mod:`repoze.bfg` sources).
-#. Lines 8-11 register a single view. It is ``for`` model objects
- that are instances of the ``MyModel`` class. The ``view``
- attribute points at a Python function that does all the work for
- this view. Note that the values of both the ``for`` attribute and
- the ``view`` attribute begin with a single period. Names that
- begin with a period are "shortcuts" which point at files relative
- to the :term:`package` in which the ``configure.zcml`` file lives.
- In this case, since the ``configure.zcml`` file lives within the
- ``myproject`` package, the shorcut ``.models.MyModel`` could also
- be spelled ``myproject.models.MyModel`` (forming a full Python
- dotted-path name to the ``MyModel`` class). Likewise the shortcut
+#. Lines 6-9 register a "default view" (a view that has no ``name``
+ attribute). It is ``for`` model objects that are instances of the
+ ``MyModel`` class. The ``view`` attribute points at a Python
+ function that does all the work for this view. Note that the
+ values of both the ``for`` attribute and the ``view`` attribute
+ begin with a single period. Names that begin with a period are
+ "shortcuts" which point at files relative to the :term:`package` in
+ which the ``configure.zcml`` file lives. In this case, since the
+ ``configure.zcml`` file lives within the ``myproject`` package, the
+ shorcut ``.models.MyModel`` could also be spelled
+ ``myproject.models.MyModel`` (forming a full Python dotted-path
+ name to the ``MyModel`` class). Likewise the shortcut
``.views.my_view`` could be replaced with
``myproject.views.my_view``.
+#. Lines 11-15 register a view named ``static``. This view
+ declaration points at the ``static_view``, which is a view
+ implementation that serves static files from the filesystem for the
+ default application.
+
``views.py``
~~~~~~~~~~~~
@@ -511,7 +529,15 @@ in the model, and the HTML given back to the browser.
.. literalinclude:: MyProject/myproject/views.py
:linenos:
-#. Lines 3-5 provide the ``my_view`` that was registered as the view.
+#. Lines 1-2 import required functions.
+
+#. Line 4 sets up a ``static_view`` which will be consulted when
+ visitors visit ``/static/<something>``. This view will serve up
+ CSS and images in our default application. This view is registered
+ in ``configure.zcml`` as the ``static`` view name for the class
+ ``MyModel`` (the root).
+
+#. Lines 6-9 provide the ``my_view`` that was registered as the view.
``configure.zcml`` said that the default URL for instances that are
of the class ``MyModel`` should run this ``my_view`` function.
@@ -544,6 +570,11 @@ in the model, and the HTML given back to the browser.
module, which you can use to retrieve the template object without
rendering it at all, for additional control.
+.. note::
+
+ For more information about the ``static`` view helper function see
+ :ref:`static_resources_section`.
+
.. _modelspy_project_section:
``models.py``
@@ -585,7 +616,7 @@ without the PasteDeploy configuration file:
#. Line 1 imports the ``make_app`` functions from
:mod:`repoze.bfg.router` that we use later.
-#. Lines 3-9 define a function that returns a :mod:`repoze.bfg` Router
+#. Lines 3-10 define a function that returns a :mod:`repoze.bfg` Router
application from :ref:`router_module` . This is meant to be called
by the :term:`PasteDeploy` framework as a result of running
``paster serve``.
@@ -599,9 +630,15 @@ The single :term:`Chameleon` template in the project looks like so:
:linenos:
:language: xml
-It displays the current project name when it is rendered. It is
-referenced by the ``my_view`` function in the ``views.py`` module.
-Templates are accessed and used by view functions.
+It displays a default page when rendered. It is referenced by the
+``my_view`` function in the ``views.py`` module. Templates are
+accessed and used by view functions.
+
+``templates/static``
+~~~~~~~~~~~~~~~~~~~~
+
+This directory contains static resources which support the
+``mytemplate.pt`` template. It includes CSS and images.
``tests.py``
~~~~~~~~~~~~
diff --git a/docs/narr/views.rst b/docs/narr/views.rst
index d85df9396..5fa601a59 100644
--- a/docs/narr/views.rst
+++ b/docs/narr/views.rst
@@ -500,6 +500,8 @@ All exception types from the :mod:`webob.exc` module implement the
view. See :term:`WebOb` for the documentation for this module; it
includes other response types for Unauthorized, etc.
+.. _static_resources_section:
+
Serving Static Resources Using a View
-------------------------------------