[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