Commit c2f76353 authored by Amos Latteier's avatar Amos Latteier

Added ZopeTutorial to CVS.

parent 47c1bd01
Zope Tutorial 1.0a6
Bug Fixes
* Rearranged things a bit for 2.2 release.
* Improved missing cookie behavior.
* Improved descriptions of management screen navigation.
* Many typos and nits fixed in lessons and examples.
Known Limitations
* Requires Zope 2.1.6 or higher.
* Works better with HTTP cookies.
Zope Tutorial 1.0a5
Features
* Changed the way examples are installed. Now the examples are
installed by adding a Zope object. This resolves a lot of security
issues.
* Added some preliminary API docs, and an API documentation
infrastructure.
Bug Fixes
* Miscellaneous restructuring and fixing.
Known Limitations
* Requires Zope 2.1.6 or higher.
* Requires HTTP cookies.
Zope Tutorial 1.0a4
Features
* Added an introduction.
* Improved installation location and verification.
Bug Fixes
* More information about how to navigate between management
screens.
* Many typos fixed thanks to Karl Ulbrich.
Known Bugs
* Requires Zope 2.1.6 or higher.
Zope Tutorial 1.0a3
Features
* Glossary greatly improved and linked into lessons.
Bug Fixes
* Install now correctly sets up gadfly database.
* Some DTML typos fixed thanks to Didier Georgieff.
Known Bugs
* Requires Zope 2.1.6 or higher.
Zope Tutorial 1.0a2
Features
* Improved PRE formatting. Examples now look nice.
* Improved examples navigation, no longer requires Javascript.
* Added more information to the glossary.
* Added feedback link.
Bug Fixes
* Grammar and typo fixes.
Known Bugs
* Requires Zope 2.1.6 or higher.
Zope Tutorial 1.0a1
Initial preview release.
\ No newline at end of file
##############################################################################
#
# Zope Public License (ZPL) Version 1.0
# -------------------------------------
#
# Copyright (c) Digital Creations. All rights reserved.
#
# This license has been certified as Open Source(tm).
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions in source code must retain the above copyright
# notice, this list of conditions, and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# 3. Digital Creations requests that attribution be given to Zope
# in any manner possible. Zope includes a "Powered by Zope"
# button that is installed by default. While it is not a license
# violation to remove this button, it is requested that the
# attribution remain. A significant investment has been put
# into Zope, and this effort will continue if the Zope community
# continues to grow. This is one way to assure that growth.
#
# 4. All advertising materials and documentation mentioning
# features derived from or use of this software must display
# the following acknowledgement:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# In the event that the product being advertised includes an
# intact Zope distribution (with copyright and license included)
# then this clause is waived.
#
# 5. Names associated with Zope or Digital Creations must not be used to
# endorse or promote products derived from this software without
# prior written permission from Digital Creations.
#
# 6. Modified redistributions of any form whatsoever must retain
# the following acknowledgment:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# Intact (re-)distributions of any official Zope release do not
# require an external acknowledgement.
#
# 7. Modifications are encouraged but must be packaged separately as
# patches to official Zope releases. Distributions that do not
# clearly separate the patches from the original work must be clearly
# labeled as unofficial distributions. Modifications which do not
# carry the name Zope may be packaged in any form, as long as they
# conform to all of the clauses above.
#
#
# Disclaimer
#
# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#
# This software consists of contributions made by Digital Creations and
# many individuals on behalf of Digital Creations. Specific
# attributions are listed in the accompanying credits file.
#
##############################################################################
import OFS.Folder
from HelpSys.HelpTopic import TextTopic
from Globals import HTML, HTMLFile, MessageDialog
import DateTime
import DocumentTemplate
import StructuredText
import string, re
pre_pat=re.compile(r'<PRE>(.+?)</PRE>', re.DOTALL)
tutorialExamplesFile='ZopeTutorialExamples.zexp'
class TutorialTopic(TextTopic):
"""
A Tutorial Help Topic
"""
def __init__(self, id, title, text):
self.id=id
self.title=title
text=str(StructuredText.HTML(text))
self.obj=HTML(pre_pat.sub(clean_pre, text))
index_html=HTMLFile('lessonView', globals())
def lessonURL(self, id, REQUEST):
"""
URL of the examples for a lesson
"""
try:
return '%s/lesson%d' % (REQUEST['tutorialExamplesURL'], id)
except KeyError:
return ""
def tutorialShowLesson(self, id, REQUEST):
"""
Navigate management frame to a given lesson's screen.
"""
url=self.lessonURL(id, REQUEST)
if not url:
return """\
<p class="warning">
Zope cannot find the tutorial examples.
You should install the tutorial examples before
continuing. Choose "Zope Tutorial" from the product
add list in the Zope management screen to install
the examples.
</p>
<p class="warning">
If you have already installed the tutorial, you can either
follow along manually, or reinstall the tutorial examples.
Note: make sure that you have cookies turned on in your browser.
</p>
"""
return """\
<SCRIPT LANGUAGE="javascript">
<!--
window.open("%s/manage_main", "manage_main");
//-->
</SCRIPT>
<p class="information">
<a href="%s/manage_main" target="manage_main"
onClick="javascript:window.open("%s/manage_main", "manage_main").focus()"
>Show lesson examples</a> in another window.
</p>""" % (url, url, url)
def apiLink(self, klass, REQUEST):
"""
Returns the URL to a API documentation for a given class.
"""
names=string.split(klass, '.')
url="%s/Control_Panel/Products/%s/Help/%s.py#%s" % (REQUEST['SCRIPT_NAME'],
names[0], names[1], names[2])
return '<a href="%s">API Documentation</a>' % url
tutorialNavigation=HTMLFile('tutorialNav', globals())
addTutorialForm=HTMLFile('tutorialAdd', globals())
def addTutorial(self, id, REQUEST=None, RESPONSE=None):
"""
Install tutorial examples.
"""
ob=OFS.Folder.Folder()
ob.id=id
ob.title='Zope Tutorial Examples'
id=self._setObject(id, ob)
folder=getattr(self, id)
# work around old Zope bug in importing
try:
folder.manage_importObject(tutorialExamplesFile)
except:
folder._p_jar=self.Destination()._p_jar
folder.manage_importObject(tutorialExamplesFile)
# acquire REQUEST if necessary
if REQUEST is None:
REQUEST=self.REQUEST
# Set local roles on examples
changeOwner(folder, REQUEST['AUTHENTICATED_USER'])
# Run lesson setup methods -- call Setup.setup methods in lesson folders
examples=folder.examples
for lesson in examples.objectValues():
if hasattr(lesson, 'Setup'):
lesson.Setup.setup(lesson.Setup, REQUEST)
if RESPONSE is not None:
e=(DateTime.DateTime('GMT') + 365).rfc822()
RESPONSE.setCookie('tutorialExamplesURL', folder.absolute_url() + '/examples',
path='/',
expires=e)
RESPONSE.redirect(folder.absolute_url() + '/examples')
def changeOwner(obj, owner):
"""
Recursively changes the Owner of an object and all its subobjects.
"""
for user, roles in obj.get_local_roles():
if 'Owner' in roles:
obj.manage_delLocalRoles([user])
break
obj.manage_setLocalRoles(owner.getUserName(), ['Owner'])
for subobj in obj.objectValues():
changeOwner(subobj, owner)
def clean_pre(match):
"""
Reformat a pre tag to get rid of extra indentation
and extra blank lines.
"""
lines=string.split(match.group(1), '\n')
nlines=[]
min_indent=None
for line in lines:
indent=len(line) - len(string.lstrip(line))
if min_indent is None or indent < min_indent:
if string.strip(line):
min_indent=indent
for line in lines:
nlines.append(line[min_indent:])
while 1:
if not string.strip(nlines[0]):
nlines.pop(0)
else:
break
while 1:
if not string.strip(nlines[-1]):
nlines.pop()
else:
break
return "<PRE>%s</PRE>" % string.join(nlines, '\n')
##############################################################################
#
# Zope Public License (ZPL) Version 1.0
# -------------------------------------
#
# Copyright (c) Digital Creations. All rights reserved.
#
# This license has been certified as Open Source(tm).
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions in source code must retain the above copyright
# notice, this list of conditions, and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# 3. Digital Creations requests that attribution be given to Zope
# in any manner possible. Zope includes a "Powered by Zope"
# button that is installed by default. While it is not a license
# violation to remove this button, it is requested that the
# attribution remain. A significant investment has been put
# into Zope, and this effort will continue if the Zope community
# continues to grow. This is one way to assure that growth.
#
# 4. All advertising materials and documentation mentioning
# features derived from or use of this software must display
# the following acknowledgement:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# In the event that the product being advertised includes an
# intact Zope distribution (with copyright and license included)
# then this clause is waived.
#
# 5. Names associated with Zope or Digital Creations must not be used to
# endorse or promote products derived from this software without
# prior written permission from Digital Creations.
#
# 6. Modified redistributions of any form whatsoever must retain
# the following acknowledgment:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# Intact (re-)distributions of any official Zope release do not
# require an external acknowledgement.
#
# 7. Modifications are encouraged but must be packaged separately as
# patches to official Zope releases. Distributions that do not
# clearly separate the patches from the original work must be clearly
# labeled as unofficial distributions. Modifications which do not
# carry the name Zope may be packaged in any form, as long as they
# conform to all of the clauses above.
#
#
# Disclaimer
#
# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#
# This software consists of contributions made by Digital Creations and
# many individuals on behalf of Digital Creations. Specific
# attributions are listed in the accompanying credits file.
#
##############################################################################
import TutorialTopic
import App.Common
import os.path
import string
import os
import stat
from DateTime import DateTime
from urllib import quote_plus
from StructuredText.StructuredText import html_quote
import re
from HelpSys import APIHelpTopic
def initialize(context):
# abuse registerClass to get a tutorial constructor
# in the product add list
context.registerClass(
None,
meta_type='Zope Tutorial',
permission='Add Documents, Images, and Files',
constructors=(TutorialTopic.addTutorialForm, TutorialTopic.addTutorial),
)
# create tutorial help topics
lesson_path=os.path.join(App.Common.package_home(globals()), 'tutorial.stx')
glossary_path=os.path.join(App.Common.package_home(globals()), 'glossary.stx')
help=context.getProductHelp()
# test to see if nothing has changed since last registration
if help.lastRegistered is not None and \
help.lastRegistered >= DateTime(os.stat(lesson_path)[stat.ST_MTIME]):
return
help.lastRegistered=DateTime()
# delete old help topics
for id in help.objectIds('Help Topic'):
help._delObject(id)
# create glossary
text=open(glossary_path).read()
text=term_pat.sub(defineTerm, text)
glossary=TutorialTopic.TutorialTopic('glossary', 'Zope Tutorial Glossary', text)
# create lessons
f=open(lesson_path)
lines=[]
id=0
while 1:
line = f.readline()
if (string.strip(line) and string.find(line, ' ') != 0) or line=='':
# new topic
if lines:
id = id + 1
topic_id = 'topic_%d' % id
text=string.join(lines[1:], '')
text=term_pat.sub(glossaryTerm, text)
topic=TutorialTopic.TutorialTopic(topic_id, string.strip(lines[0]), text)
context.registerHelpTopic(topic_id, topic)
lines=[line]
else:
lines.append(line)
if line == '':
break
f.close()
# register glossary last
context.registerHelpTopic('glossary', glossary)
# Glossary functions
# ----------------
term_pat=re.compile(r'\[([^\]])+?\]')
terms=[]
def glossaryTerm(match):
"""
A linked glossary term
"""
name=match.group(1)
if name in terms:
return """<a href="../glossary#%s">%s</a>""" % \
(quote_plus(name), html_quote(name))
return """[%s]""" % name
def defineTerm(match):
"""
Define a glossary term
"""
name=match.group(1)
terms.append(name)
return """<a name="%s"></a>\n\n<strong>%s</strong>""" % \
(quote_plus(name), html_quote(name))
Glossary
For general information about Zope <a
href="http://www.zope.org/SiteIndex/searchForm" target="_blank">search</a> Zope.org.
For Zope documentation try the <a href="http://zdp.zope.org" target="_blank">Zope
Documentation Project</a> site and the <a
href="http://www.zope.org/Documentation" target="_blank">documentation area</a> on Zope.org.
[DTML] -- A tag-based reporting language, like ASP
or PHP. It allows you to perform operations on Zope objects and insert the
results in web pages.
For more information on DTML see the <a
href="http://www.zope.org/Documentation/Guides/DTML" target="_blank">DTML
Reference</a>.
[DTML Document] -- A Zope object for a web page.
You can use DTML tags in a DTML document.
For more information on DTML Documents see the <a
href="http://www.zope.org/Documentation/Guides/ZCMG-HTML/ZCMG.9.2.html"
target="_blank">Zope Content Manager's Guide</a>.
<dtml-var "apiLink('OFSP'+'.DTMLDocument.DTMLDocument', REQUEST)">
[DTML Method] -- A Zope object that holds a piece of content that can
be inserted into a web page. You can use DTML tags in a DTML Method.
For more information on DTML Methods see the <a
href="http://www.zope.org/Documentation/Guides/ZCMG-HTML/ZCMG.9.1.html"
target="_blank">Zope Content Manager's Guide</a>.
<dtml-var "apiLink('OFSP'+'.DTMLMethod.DTMLMethod', REQUEST)">
[Delete] -- Remove an object from the current Folder. Unlike Cut, this
does not place a copy of the object in the clipboard.
[Folder] -- A Zope object that contains other Zope objects. You can
move objects between Folders by cutting and pasting them. You can
add new objects to Folders with the product add list.
For more information on Folders see the <a
href="http://www.zope.org/Documentation/Guides/ZCMG-HTML/ZCMG.8.2.html"
target="_blank">Zope Content Manager's Guide</a>.
[Cut] -- Remove a Zope object from its current location and place it
in the clipboard.
[Copy] -- Copy a Zope object to the clipboard.
[Database Connection] -- A Zope object to connect to a relational
database.
For more information on Database Connections see the <a
href="http://www.zope.org/Documentation/Guides/ZSQL-HTML/ZSQL.1.3.html"
target="_blank">SQL Method User's Guide</a>.
[<dtml-call>] -- A DTML tag that allows your to perform an
action without inserting anything into a web page.
For more information on &lt;dtml-call&gt; tag see the <a
href="http://www.zope.org/Documentation/Guides/DTML-HTML/DTML.11.html"
target="_blank">DTML Reference</a>.
[<dtml-if>] -- A DTML tag that allows you to conditionally insert
objects into a DTML Document or DTML Method.
For more information on &lt;dtml-if&gt; tag see the <a
href="http://www.zope.org/Documentation/Guides/DTML-HTML/DTML.7.html"
target="_blank">DTML Reference</a>.
[<dtml-in>] -- A DTML tag that allows you to loop over a sequence
of objects.
For more information on &lt;dtml-in&gt; tag see the <a
href="http://www.zope.org/Documentation/Guides/DTML-HTML/DTML.8.html"
target="_blank">DTML Reference</a>.
[<dtml-var>] -- A DTML tag that allows you to insert objects
into a DTML Document or DTML Method.
For more information on &lt;dtml-var&gt; tag see the <a
href="http://www.zope.org/Documentation/Guides/DTML-HTML/DTML.6.html"
target="_blank">DTML Reference</a>.
[<dtml-sendmail>] -- A DTML tag that sends email.
For more information on &lt;dtml-sendmail&gt; tag see the <a
href="http://www.zope.org/Documentation/Guides/DTML-HTML/DTML.17.html"
target="_blank">DTML Reference</a>.
[Mail Host] -- A Zope object that allows you to send email.
Use the &lt;dtml-sendmail&gt; tag to send email.
[Paste] -- Insert the objects from the clipboard into the current Folder.
[Image] -- A Zope object for a picture.
For more information on Images see the <a
href="http://www.zope.org/Documentation/Guides/ZCMG-HTML/ZCMG.8.4.html"
>Zope Content Manager's Guide</a>.
<dtml-var "apiLink('OFSP'+'.Image.Image', REQUEST)">
[HTTP Cookies] -- Cookies allow you to record information in a visitor's
browser. This is commonly used to provide personalization for a web site.
[id] -- All Zope objects have an identifier known as the id. The id is a
short string that contains letters and numbers, spaces, underscores, dashes,
commas and tildes. Here are some example ids: 'index.html', 'My Page',
'item-12'.
[index_html] -- The name of the default Zope object in a Folder.
When you view a Folder the index_html object will be displayed
unless you specify otherwise. This is just like the 'index.html'
or 'default.htm' default web page with a normal web server.
[product add list] -- The list of addable objects. Select an object
from the product add list to create a new object in the current
Folder.
[Properties] -- Properties contain small pieces of content.
[standard_html_header] -- The standard Zope header object. By
convention this object displays an HTML header.
[standard_html_footer] -- The standard Zope footer object. By
convention this object displays an HTML footer.
[title] -- Most Zope objects can have titles. Titles are optional
one line descriptions.
[Undo] -- Allows you to recover from mistakes by undoing a
transaction.
[ZSQL Method] -- A Zope object to get data into or out of a relational
database.
For more information on ZSQL Methods see the <a
href="http://www.zope.org/Documentation/Guides/ZSQL-HTML/ZSQL.1.4.html"
target="_blank">SQL Method User's Guide</a>.
\ No newline at end of file
<dtml-var standard_html_header>
<style type="text/css">
PRE {
background-color : #FFFFAA;
border : thin solid;
white-space : pre;
padding-bottom : 10pt;
padding-left : 10pt;
padding-right : 10pt;
padding-top : 10pt;
}
.feedback {
font-size: 9pt;
}
.warning {
font-size: 9pt;
font-weight: bold;
color: red;
}
.information {
font-size: 9pt;
font-weight: bold;
}
</style>
<dtml-var obj>
<dtml-unless "id=='glossary'">
<hr>
<dtml-var tutorialNavigation>
</dtml-unless>
<p class="feedback">Comments on this lesson?
<a href="mailto:docs@digicool.com?subject=<dtml-var title>">Email feedback</a>.
</p>
<dtml-var standard_html_footer>
\ No newline at end of file
This diff is collapsed.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML lang="en">
<HEAD>
<TITLE>Add Zope Tutorial</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" LINK="#000099" VLINK="#555555">
<H2>Add Zope Tutorial</H2>
<P>
This tutorial show you the basics of using Zope. You will
learn how to create and manage Zope resources by builting
a web site devoted to tracking Elvis sightings. Each lesson
includes working examples in Zope that allow you to learn
by hands on experimentation.
</P><P>
The tutorial assumes that you are familiar with basic Internet
technologies such as <a href="http://www.w3.org/MarkUp/Guide/">HTML</a>,
URLs, and web browers.
</P>
<FORM ACTION="addTutorial" METHOD="POST">
<TABLE CELLSPACING="2">
<TR>
<TD ALIGN="LEFT" VALIGN="TOP">
<STRONG>Id</STRONG>
</TD>
<TD ALIGN="LEFT" VALIGN="TOP">
<INPUT TYPE="TEXT" NAME="id" SIZE="40">
</TD>
</TR>
<TR>
<TD></TD>
<TD>
<BR><INPUT TYPE="SUBMIT" VALUE=" Add ">
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
<dtml-call "REQUEST.set('ids', aq_parent.objectIds())">
<dtml-call "ids.remove('glossary')">
<dtml-call "REQUEST.set('i', ids.index(id))">
<table width="100%" border="0" padding="0" spacing="0">
<tr valign="top"><td width="50%" align="right">
<dtml-if "i > 0">
<form action="../<dtml-var "ids[i-1]">">
<input type="submit" value=" &lt; Back ">
</form>
</dtml-if>
</td>
<td width="50%">
<dtml-unless hide_next>
<dtml-if "i < _.len(ids) -1 ">
<form action="../<dtml-var "ids[i+1]">">
<input type="submit" value=" Next &gt; ">
</form>
</dtml-if>
</dtml-unless>
</td></tr></table>
\ No newline at end of file
Zope Tutorial 1.0a5
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment