[z3-checkins] r23820 - in
z3/zopeweb/trunk/content/documentation/z3tut: . collector
collector/browser collector/browser/skin collector/etc
collector/ftests collector/tests
baijum at codespeak.net
baijum at codespeak.net
Wed Mar 1 04:55:18 CET 2006
Author: baijum
Date: Wed Mar 1 04:54:27 2006
New Revision: 23820
Added:
z3/zopeweb/trunk/content/documentation/z3tut/
z3/zopeweb/trunk/content/documentation/z3tut/collector/
z3/zopeweb/trunk/content/documentation/z3tut/collector/__init__.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/__init__.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectorform.pt
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectorform.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectormain.pt
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectormain.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/commentform.pt
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/commentform.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/configure.zcml
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/__init__.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/configure.zcml
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/tuto.css
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/view_macros.pt
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketform.pt
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketform.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketmain.pt
z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketmain.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/comment.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/configure.zcml
z3/zopeweb/trunk/content/documentation/z3tut/collector/etc/
z3/zopeweb/trunk/content/documentation/z3tut/collector/etc/collector-configure.zcml
z3/zopeweb/trunk/content/documentation/z3tut/collector/etc/overrides.zcml
z3/zopeweb/trunk/content/documentation/z3tut/collector/ftests/
z3/zopeweb/trunk/content/documentation/z3tut/collector/ftests/__init__.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/interfaces.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/
z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/__init__.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/test_collector.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/test_ticket.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/ticket.py
z3/zopeweb/trunk/content/documentation/z3tut/collector/ticketcollector.py
Log:
Added collector example app for Zope 3 tutorial.
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/__init__.py
==============================================================================
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/__init__.py
==============================================================================
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectorform.pt
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectorform.pt Wed Mar 1 04:54:27 2006
@@ -0,0 +1,28 @@
+<html metal:use-macro="context/@@view_macros/page">
+
+<body metal:use-macro="body">
+<div metal:fill-slot="sidebox">
+ <li><a href="#" i18n:translate="">Home</a></li>
+ <li><a href="#" i18n:translate="">Add Ticket</a></li>
+</div>
+
+
+<div metal:fill-slot="mainbox">
+ <h1 i18n:translate="">Collector</h1>
+
+ <form action="." tal:attributes="action request/URL">
+
+ <div tal:repeat="widget view/widgets">
+ <b tal:content="widget/label" i18n:translate="">label</b>
+ <div tal:content="structure widget"></div>
+ </div>
+
+ <input
+ tal:repeat="action view/actions"
+ tal:replace="structure action/render"
+ />
+ </form>
+
+</div>
+</body>
+</html>
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectorform.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectorform.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,22 @@
+
+from zope.formlib import form
+from zope.formlib import namedtemplate
+from zope.app.pagetemplate import ViewPageTemplateFile
+
+from collector.interfaces import ICollector
+from collector.ticketcollector import Collector
+
+class AddCollector(form.AddForm):
+
+ form_fields = form.Fields(ICollector)
+
+ template = namedtemplate.NamedTemplate('collector')
+
+ def create(self, data):
+ collector = Collector()
+ collector.description = data['description']
+ return collector
+
+collector_page_template = namedtemplate.NamedTemplateImplementation(
+ ViewPageTemplateFile('collectorform.pt'),
+ form.interfaces.IPageForm)
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectormain.pt
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectormain.pt Wed Mar 1 04:54:27 2006
@@ -0,0 +1,20 @@
+<html metal:use-macro="context/@@view_macros/page">
+
+<body metal:use-macro="body">
+<div metal:fill-slot="sidebox">
+ <li><a href="./@@CollectorMain.html" i18n:translate="">Home</a></li>
+ <li><a href="./@@+/AddTicket.html" i18n:translate="">Add Ticket</a></li>
+</div>
+
+<div metal:fill-slot="mainbox">
+ <h1 i18n:translate="">Collector</h1>
+ <ol>
+ <span tal:repeat="item view/tickets">
+ <li><a tal:attributes="href item/name" tal:content="string: ${item/summary}">Summary</a></li>
+ </span>
+ </ol>
+</div>
+</body>
+
+</html>
+
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectormain.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/collectormain.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,14 @@
+from collector.interfaces import ITicket
+
+class CollectorMain:
+
+ def tickets(self):
+ tickets = []
+ for name, child in self.context.items():
+ if ITicket.providedBy(child):
+ info = {}
+ info['summary'] = child.summary
+ info['description'] = child.description
+ info['name'] = child.__name__ + "/@@+/AddComment.html"
+ tickets.append(info)
+ return tickets
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/commentform.pt
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/commentform.pt Wed Mar 1 04:54:27 2006
@@ -0,0 +1,42 @@
+<html metal:use-macro="context/@@view_macros/page">
+
+<body metal:use-macro="body">
+<div metal:fill-slot="sidebox">
+ <li><a href="../../@@CollectorMain.html" i18n:translate="">Home</a></li>
+ <li><a href="../../@@+/AddTicket.html" i18n:translate="">Add Ticket</a></li>
+</div>
+
+<div metal:fill-slot="mainbox">
+ <h1 i18n:translate="">Collector</h1>
+
+ <h4 tal:content="view/summary">Summary</h4>
+ <h3>Initial Comment</h3>
+
+ <p tal:content="view/description|default">Description</p>
+
+ <h3>Additional Comments</h3>
+ <ol>
+ <span tal:repeat="item view/comments">
+ <li tal:content="string: ${item/body}">Summary</li>
+ </span>
+ </ol>
+
+ <form action="." tal:attributes="action request/URL">
+
+ <div tal:repeat="widget view/widgets">
+ <b tal:content="widget/label" i18n:translate="">label</b>
+ <div tal:content="structure widget"></div>
+ </div>
+
+ <input
+ tal:repeat="action view/actions"
+ tal:replace="structure action/render"
+ />
+
+ </form>
+
+</div>
+</body>
+
+</html>
+
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/commentform.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/commentform.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,44 @@
+
+from zope.formlib import form
+from zope.formlib import namedtemplate
+from zope.app.pagetemplate import ViewPageTemplateFile
+
+from collector.interfaces import IComment
+from collector.comment import Comment
+
+class AddComment(form.AddForm):
+
+ form_fields = form.Fields(IComment)
+
+ template = namedtemplate.NamedTemplate('comment')
+
+ def create(self, data):
+ comment = Comment()
+ comment.body = data['body']
+ return comment
+
+ def nextURL(self):
+ return "../../@@CollectorMain.html"
+
+ def comments(self):
+ ticket = self.context.__parent__
+ comments = []
+ for name, child in ticket.items():
+ if IComment.providedBy(child):
+ info = {}
+ info['body'] = child.body
+ comments.append(info)
+ return comments
+
+ def summary(self):
+ ticket = self.context.__parent__
+ return ticket.summary
+
+ def description(self):
+ ticket = self.context.__parent__
+ return ticket.description
+ pass
+
+comment_page_template = namedtemplate.NamedTemplateImplementation(
+ ViewPageTemplateFile('commentform.pt'),
+ form.interfaces.IPageForm)
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/configure.zcml
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/configure.zcml Wed Mar 1 04:54:27 2006
@@ -0,0 +1,89 @@
+<configure
+ xmlns="http://namespaces.zope.org/browser"
+ xmlns:zope="http://namespaces.zope.org/zope">
+
+ <page
+ name="CollectorMain.html"
+ for="collector.interfaces.ICollector"
+ class=".collectormain.CollectorMain"
+ template="collectormain.pt"
+ permission="zope.Public"
+ menu="zmi_views"
+ title="Preview"
+ />
+
+ <defaultView
+ for="collector.interfaces.ICollector"
+ name="CollectorMain.html"
+ />
+
+ <zope:adapter
+ factory=".collectorform.collector_page_template"
+ name="collector"
+ />
+
+ <page
+ name="AddCollector.html"
+ class=".collectorform.AddCollector"
+ template="collectorform.pt"
+ permission="zope.ManageContent"
+ for="zope.app.container.interfaces.IAdding"
+ />
+
+ <addMenuItem
+ class="collector.ticketcollector.Collector"
+ title="Collector"
+ description="A Collector"
+ permission="zope.ManageContent"
+ view="AddCollector.html"
+ />
+
+ <zope:adapter
+ factory=".ticketform.ticket_page_template"
+ name="ticket"
+ />
+
+ <page
+ name="AddTicket.html"
+ class=".ticketform.AddTicket"
+ template="ticketform.pt"
+ permission="zope.ManageContent"
+ for="zope.app.container.interfaces.IAdding"
+ />
+
+ <zope:adapter
+ factory=".commentform.comment_page_template"
+ name="comment"
+ />
+
+ <page
+ name="AddComment.html"
+ class=".commentform.AddComment"
+ template="commentform.pt"
+ permission="zope.ManageContent"
+ for="zope.app.container.interfaces.IAdding"
+ />
+
+ <page
+ name="TicketMain.html"
+ for="collector.interfaces.ITicket"
+ class=".ticketmain.TicketMain"
+ template="ticketmain.pt"
+ permission="zope.Public"
+ menu="zmi_views"
+ title="Preview"
+ />
+
+ <defaultView
+ for="collector.interfaces.ITicket"
+ name="AddComment.html"
+ />
+
+ <zope:adapter
+ factory=".ticketmain.ticket_page_template"
+ name="ticketmain"
+ />
+
+ <include package=".skin" />
+
+</configure>
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/__init__.py
==============================================================================
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/configure.zcml
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/configure.zcml Wed Mar 1 04:54:27 2006
@@ -0,0 +1,18 @@
+<configure
+ xmlns="http://namespaces.zope.org/browser">
+
+ <layer name="tuto"/>
+
+ <skin name="tuto" layers="tuto rotterdam default"/>
+
+ <resource name="tuto.css" file="tuto.css" layer="tuto"/>
+
+ <page
+ for="*"
+ name="view_macros"
+ permission="zope.View"
+ layer="tuto"
+ template="view_macros.pt"
+ />
+
+</configure>
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/tuto.css
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/tuto.css Wed Mar 1 04:54:27 2006
@@ -0,0 +1,211 @@
+a:link {color:blue}
+a:visited {color:blue}
+a:active {color:blue}
+a:hover {color:blue}
+
+div#header h1,
+div#container h1 {
+ font-size: 35px;
+}
+
+div#header h2,
+div#container h2,
+div#sidebar ul li.head {
+ font-size: 14px;
+}
+
+div#sidebar ul li a, div#container p {
+ font-size: 12px;
+}
+
+div#header div#login,
+div#container div.code,
+div#container div.foot,
+div#footer,
+div#container div.quote {
+ font-size: 10px;
+}
+
+div#header h1,
+div#container h1,
+div#header h2,
+div#container h2,
+div#sidebar ul li.head,
+div#container div.quote span,
+div#container div.code span {
+ font-weight: bold;
+}
+
+div#container div.quote{
+ font-style: italic;
+}
+
+body {
+ font-family: "Verdana", Sans-Serif;
+ margin: 2px;
+}
+
+div#uberclass {
+ width: 730px;
+}
+
+div#header {
+ border: 2px solid;
+ margin-bottom: 3px;
+ padding: 3px;
+}
+
+div#header h1 {
+ letter-spacing: -3px;
+ margin: 0;
+ text-decoration: none;
+ word-spacing: 3px;
+}
+
+div#header h2 {
+ letter-spacing: 0px;
+ margin: 0;
+ text-decoration: none;
+}
+
+div#header div#login {
+ clear: right;
+ float: right;
+}
+
+div#header div#login a {
+ text-decoration: underline;
+}
+
+div#header div#login a:hover {
+ text-decoration: none;
+}
+
+div#sidebar {
+ border: 2px solid;
+ float: left;
+ width: 150px;
+}
+
+div#sidebar ul {
+ margin: 0;
+ padding: 0;
+ list-style-type: none;
+}
+
+div#sidebar ul li {
+ border-bottom: 1px solid;
+}
+
+div#sidebar ul li.head {
+ padding: 4px;
+}
+
+div#sidebar ul li.last {
+ border-bottom: 0;
+}
+
+div#sidebar ul li a {
+ letter-spacing: -1px;
+ display: block;
+ padding: 3px 0 3px 3px;
+ text-decoration: none;
+ width: 147px;
+}
+
+div#container {
+ border: 2px solid;
+ margin-left: 157px;
+ padding: 3px;
+}
+
+div#container h1 {
+ border-bottom: 1px solid;
+ letter-spacing: -3px;
+ margin: 0;
+ text-decoration: none;
+}
+
+div#container h2 {
+ border-bottom: 1px solid;
+ display: block;
+ margin: 14px 11px 14px 11px;
+ text-decoration: none;
+}
+
+div#container p {
+ margin: 0 13px 17px 13px;
+}
+
+div#container p a {
+ text-decoration: none;
+}
+
+div#container div.quote, div#container div.code {
+ border-top: 1px solid;
+ border-bottom: 1px solid;
+ padding: 8px;
+ margin: 0 15px 17px 15px;
+}
+
+div#container div.quote span, div#container div.code span {
+ display: block;
+}
+
+div#container ul {
+ list-style: square;
+}
+
+div#container ul li {
+ font-size: 11px;
+}
+
+div#container ul li a {
+ text-decoration: underline;
+}
+
+div#container ul li a:hover {
+ text-decoration: none;
+}
+
+div#container form fieldset {
+ border: 0;
+ font-size: 11px;
+ margin: 0;
+ padding: 0;
+ text-align: center;
+}
+
+div#container form fieldset input,
+div#container form fieldset textarea{
+ border: 1px solid;
+ font-family: "Verdana", Sans-Serif;
+ font-size: 10px;
+ margin-bottom: 3px;
+}
+
+div#container div.foot{
+ border-top: 1px dashed;
+ margin: 0 8px 37px 8px;
+ text-align: right;
+}
+
+div#container div.foot a{
+ text-decoration: underline;
+}
+
+div#container div.foot a:hover{
+ text-decoration: none;
+}
+
+div#footer{
+ border-top: 1px solid;
+}
+
+div#footer a{
+ text-decoration: underline;
+}
+
+div#footer a:hover{
+ text-decoration: none;
+}
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/view_macros.pt
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/skin/view_macros.pt Wed Mar 1 04:54:27 2006
@@ -0,0 +1,34 @@
+<html metal:define-macro="page" i18n:domain="collector">
+
+<head metal:define-macro="head">
+ <title>Collector</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link href="context/++resource++tuto.css" rel="stylesheet" type="text/css"
+ tal:attributes="href context/++resource++tuto.css" />
+</head>
+
+<body metal:define-macro="body">
+<div id="uberclass">
+ <div id="sidebar">
+ <ul id="navigation">
+ <div metal:define-slot="sidebox">
+ <li metal:define-slot="homelink">
+ <a href="../@@CollectorMain.html" i18n:translate="">Home</a>
+ </li>
+ <li class="last" metal:define-slot="addticketlink">
+ <a href="/@@+/AddTicket.html" i18n:translate="">Add Ticket</a>
+ </li>
+ </div>
+ </ul>
+ </div>
+ <div id="container">
+ <div metal:define-slot="mainbox">
+ <h1 i18n:translate="">Collector</h1>
+ <h2 i18n:translate="">Ticket Collector Software</h2>
+ <p i18n:translate="">Use the left navigation bar
+ for accessing the functionalities of Collector.</p>
+ </div>
+ </div>
+</div>
+</body>
+</html>
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketform.pt
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketform.pt Wed Mar 1 04:54:27 2006
@@ -0,0 +1,30 @@
+<html metal:use-macro="context/@@view_macros/page">
+
+<body metal:use-macro="body">
+<div metal:fill-slot="sidebox">
+ <li><a href="../@@CollectorMain.html" i18n:translate="">Home</a></li>
+ <li><a href="#" i18n:translate="">Add Ticket</a></li>
+</div>
+
+<div metal:fill-slot="mainbox">
+ <h1 i18n:translate="">Collector</h1>
+
+ <form action="." tal:attributes="action request/URL">
+
+ <div tal:repeat="widget view/widgets">
+ <b tal:content="widget/label" i18n:translate="">label</b>
+ <div tal:content="structure widget"></div>
+ </div>
+
+ <input
+ tal:repeat="action view/actions"
+ tal:replace="structure action/render"
+ />
+
+ </form>
+
+</div>
+</body>
+
+</html>
+
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketform.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketform.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,26 @@
+
+from zope.formlib import form
+from zope.formlib import namedtemplate
+from zope.app.pagetemplate import ViewPageTemplateFile
+
+from collector.interfaces import ITicket
+from collector.ticket import Ticket
+
+class AddTicket(form.AddForm):
+
+ form_fields = form.Fields(ITicket)
+
+ template = namedtemplate.NamedTemplate('ticket')
+
+ def create(self, data):
+ ticket = Ticket()
+ ticket.summary = data['summary']
+ ticket.description = data['description']
+ return ticket
+
+ def nextURL(self):
+ return "../@@CollectorMain.html"
+
+ticket_page_template = namedtemplate.NamedTemplateImplementation(
+ ViewPageTemplateFile('ticketform.pt'),
+ form.interfaces.IPageForm)
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketmain.pt
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketmain.pt Wed Mar 1 04:54:27 2006
@@ -0,0 +1,22 @@
+<html metal:use-macro="context/@@view_macros/page">
+
+<body metal:use-macro="body">
+<div metal:fill-slot="sidebox">
+ <li><a href="./@@CollectorMain.html" i18n:translate="">Home</a></li>
+ <li><a href="./@@+/AddTicket.html" i18n:translate="">Add Ticket</a></li>
+</div>
+
+<div metal:fill-slot="mainbox">
+ <h1 i18n:translate="">Collector</h1>
+
+ <ol>
+ <span tal:repeat="item view/comments">
+ <li tal:content="string: ${item/body}">Summary</li>
+ </span>
+ </ol>
+
+</div>
+</body>
+
+</html>
+
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketmain.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/browser/ticketmain.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,27 @@
+
+from zope.formlib import form
+from zope.formlib import namedtemplate
+from zope.app.pagetemplate import ViewPageTemplateFile
+
+from collector.interfaces import ITicket
+from collector.interfaces import IComment
+from collector.ticket import Ticket
+
+class TicketMain(form.AddForm):
+
+ form_fields = form.Fields(ITicket)
+
+ template = namedtemplate.NamedTemplate('ticketmain')
+
+ def comments(self):
+ comments = []
+ for name, child in self.context.items():
+ if IComment.providedBy(child):
+ info = {}
+ info['body'] = child.body
+ comments.append(info)
+ return comments
+
+ticket_page_template = namedtemplate.NamedTemplateImplementation(
+ ViewPageTemplateFile('ticketmain.pt'),
+ form.interfaces.IPageForm)
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/comment.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/comment.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,28 @@
+from zope.interface import implements
+
+from interfaces import IComment
+from interfaces import ICommentContained
+from zope.app.container.contained import Contained
+
+class Comment(Contained):
+ """A simple implementation of a comment.
+
+ Make sure that the ``Comment`` implements the ``IComment`` interface::
+
+ >>> from zope.interface.verify import verifyClass
+ >>> verifyClass(IComment, Comment)
+ True
+
+ Here is an example of changing the body of the comment::
+
+ >>> comment = Comment()
+ >>> comment.body
+ u''
+ >>> comment.body = u'Comment Body'
+ >>> comment.body
+ u'Comment Body'
+ """
+
+ implements(IComment, ICommentContained)
+
+ body = u""
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/configure.zcml
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/configure.zcml Wed Mar 1 04:54:27 2006
@@ -0,0 +1,69 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope">
+
+ <interface
+ interface=".interfaces.ICollector"
+ type="zope.app.content.interfaces.IContentType"
+ />
+
+ <content class=".ticketcollector.Collector">
+ <implements
+ interface="zope.app.annotation.interfaces.IAttributeAnnotatable"
+ />
+ <implements
+ interface="zope.app.container.interfaces.IContentContainer"
+ />
+ <require
+ permission="zope.ManageContent"
+ interface=".interfaces.ICollector"
+ />
+ <require
+ permission="zope.ManageContent"
+ set_schema=".interfaces.ICollector"
+ />
+ </content>
+
+ <interface
+ interface=".interfaces.ITicket"
+ type="zope.app.content.interfaces.IContentType"
+ />
+
+ <content class=".ticket.Ticket">
+ <implements
+ interface="zope.app.annotation.interfaces.IAttributeAnnotatable"
+ />
+ <implements
+ interface="zope.app.container.interfaces.IContentContainer"
+ />
+ <require
+ permission="zope.ManageContent"
+ set_schema=".interfaces.ITicket"
+ />
+ <require
+ permission="zope.ManageContent"
+ interface=".interfaces.ITicket"
+ />
+ </content>
+
+ <interface
+ interface=".interfaces.IComment"
+ type="zope.app.content.interfaces.IContentType"
+ />
+
+ <content class=".comment.Comment">
+ <implements
+ interface="zope.app.annotation.interfaces.IAttributeAnnotatable"
+ />
+ <require
+ permission="zope.ManageContent"
+ set_schema=".interfaces.IComment"
+ />
+ <require
+ permission="zope.ManageContent"
+ interface=".interfaces.IComment"
+ />
+ </content>
+
+ <include package=".browser" />
+
+</configure>
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/etc/collector-configure.zcml
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/etc/collector-configure.zcml Wed Mar 1 04:54:27 2006
@@ -0,0 +1 @@
+<include package="collector" />
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/etc/overrides.zcml
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/etc/overrides.zcml Wed Mar 1 04:54:27 2006
@@ -0,0 +1,10 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser">
+
+ <!-- Provide local overrides of standard configurations -->
+
+ <!-- For example, define a different default skin -->
+ <!-- <browser:defaultSkin name="" /> -->
+ <browser:defaultSkin name="tuto" />
+
+</configure>
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/ftests/__init__.py
==============================================================================
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/interfaces.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/interfaces.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,67 @@
+from zope.interface import Interface
+from zope.schema import Text, TextLine, Field
+
+from zope.app.container.constraints import ContainerTypesConstraint
+from zope.app.container.constraints import ItemTypePrecondition
+from zope.app.container.interfaces import IContained, IContainer
+
+class IComment(Interface):
+ """Comment for Ticket"""
+
+ body = Text(
+ title=u"Additional Comment",
+ description=u"Body of the Comment.",
+ default=u"",
+ required=True)
+
+class ITicket(IContainer):
+ """A ticket object."""
+
+ summary = TextLine(
+ title=u"Summary",
+ description=u"Short summary",
+ default=u"",
+ required=True)
+
+ description = Text(
+ title=u"Description",
+ description=u"Full description",
+ default=u"",
+ required=False)
+
+ def __setitem__(name, object):
+ """Add an IComment object."""
+
+ __setitem__.precondition = ItemTypePrecondition(IComment)
+
+
+class ICollector(IContainer):
+ """The collector the base object. It can only
+ contain ITicket objects."""
+
+ def __setitem__(name, object):
+ """Add an ICollector object."""
+
+ __setitem__.precondition = ItemTypePrecondition(ITicket)
+
+ description = Text(
+ title=u"Description",
+ description=u"A description of the collector.",
+ default=u"",
+ required=False)
+
+
+class ITicketContained(IContained):
+ """Interface that specifies the type of objects that can contain
+ tickets."""
+
+ __parent__ = Field(
+ constraint = ContainerTypesConstraint(ICollector))
+
+
+class ICommentContained(IContained):
+ """Interface that specifies the type of objects that can contain
+ comments."""
+
+ __parent__ = Field(
+ constraint = ContainerTypesConstraint(ITicket))
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/__init__.py
==============================================================================
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/test_collector.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/test_collector.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,21 @@
+import unittest
+from zope.testing.doctestunit import DocTestSuite
+
+from zope.app.container.tests.test_icontainer import TestSampleContainer
+
+from collector.ticketcollector import Collector
+
+
+class Test(TestSampleContainer):
+
+ def makeTestObject(self):
+ return Collector()
+
+def test_suite():
+ return unittest.TestSuite((
+ DocTestSuite('collector.ticketcollector'),
+ unittest.makeSuite(Test),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/test_ticket.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/tests/test_ticket.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,21 @@
+import unittest
+from zope.testing.doctestunit import DocTestSuite
+
+from zope.app.container.tests.test_icontainer import TestSampleContainer
+
+from collector.ticket import Ticket
+
+
+class Test(TestSampleContainer):
+
+ def makeTestObject(self):
+ return Ticket()
+
+def test_suite():
+ return unittest.TestSuite((
+ DocTestSuite('collector.ticket'),
+ unittest.makeSuite(Test),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/ticket.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/ticket.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,36 @@
+from zope.interface import implements
+from zope.interface import classProvides
+from zope.app.container.btree import BTreeContainer
+from zope.app.container.contained import Contained
+
+from interfaces import ITicket
+from interfaces import ITicketContained
+
+class Ticket(BTreeContainer, Contained):
+ """A simple implementation of a ticket.
+
+ Make sure that the ``Ticket`` implements the ``ITicket`` interface::
+
+ >>> from zope.interface.verify import verifyClass
+ >>> verifyClass(ITicket, Ticket)
+ True
+
+ Here is an example of changing the summary and description of the ticket::
+
+ >>> ticket = Ticket()
+ >>> ticket.summary
+ u''
+ >>> ticket.description
+ u''
+ >>> ticket.summary = u'Ticket Summary'
+ >>> ticket.description = u'Ticket Description'
+ >>> ticket.summary
+ u'Ticket Summary'
+ >>> ticket.description
+ u'Ticket Description'
+ """
+
+ implements(ITicket, ITicketContained)
+
+ summary = u''
+ description = u''
Added: z3/zopeweb/trunk/content/documentation/z3tut/collector/ticketcollector.py
==============================================================================
--- (empty file)
+++ z3/zopeweb/trunk/content/documentation/z3tut/collector/ticketcollector.py Wed Mar 1 04:54:27 2006
@@ -0,0 +1,28 @@
+from zope.interface import implements
+from zope.app.container.btree import BTreeContainer
+
+from interfaces import ICollector
+
+class Collector(BTreeContainer):
+ """A very simple implementation of a collector using B-Tree Containers
+
+ Make sure that the ``Collector`` implements the ``ICollector``
+ interface::
+
+ >>> from zope.interface.verify import verifyClass
+ >>> verifyClass(ICollector, Collector)
+ True
+
+ Here is an example of changing the description of the collector::
+
+ >>> collector = Collector()
+ >>> collector.description
+ u''
+ >>> collector.description = u'Message Collector Description'
+ >>> collector.description
+ u'Message Collector Description'
+ """
+
+ implements(ICollector)
+
+ description = u''
More information about the z3-checkins
mailing list