[Checkins] SVN: z3c.website/trunk/src/z3c/website/ Use the common criteria supported IAuthentication

Roger Ineichen roger at projekt01.ch
Wed May 23 07:40:30 EDT 2007


Log message for revision 75904:
  Use the common criteria supported IAuthentication
  Added initial Member management page
  Improve sample setup implementation

Changed:
  A   z3c.website/trunk/src/z3c/website/authentication.py
  A   z3c.website/trunk/src/z3c/website/authentication.zcml
  U   z3c.website/trunk/src/z3c/website/browser/configure.zcml
  U   z3c.website/trunk/src/z3c/website/browser/member.py
  U   z3c.website/trunk/src/z3c/website/browser/member.zcml
  A   z3c.website/trunk/src/z3c/website/browser/member_add.pt
  U   z3c.website/trunk/src/z3c/website/browser/member_edit.pt
  U   z3c.website/trunk/src/z3c/website/browser/members.pt
  A   z3c.website/trunk/src/z3c/website/browser/sample.pt
  A   z3c.website/trunk/src/z3c/website/browser/sample.py
  A   z3c.website/trunk/src/z3c/website/browser/sample.zcml
  A   z3c.website/trunk/src/z3c/website/browser/sample_add.pt
  A   z3c.website/trunk/src/z3c/website/browser/sample_edit_meta.pt
  U   z3c.website/trunk/src/z3c/website/browser/site.py
  U   z3c.website/trunk/src/z3c/website/browser/site_add.pt
  U   z3c.website/trunk/src/z3c/website/configure.zcml
  D   z3c.website/trunk/src/z3c/website/form.py
  U   z3c.website/trunk/src/z3c/website/interfaces.py
  A   z3c.website/trunk/src/z3c/website/provider.py
  A   z3c.website/trunk/src/z3c/website/provider.zcml
  U   z3c.website/trunk/src/z3c/website/sample.py
  U   z3c.website/trunk/src/z3c/website/sample.zcml
  U   z3c.website/trunk/src/z3c/website/site.py
  U   z3c.website/trunk/src/z3c/website/skin/demo.js
  A   z3c.website/trunk/src/z3c/website/skin/fisheye/members.gif
  A   z3c.website/trunk/src/z3c/website/skin/fisheye/members.png
  D   z3c.website/trunk/src/z3c/website/skin/form.pt
  U   z3c.website/trunk/src/z3c/website/skin/template.pt
  D   z3c.website/trunk/src/z3c/website/skin/widget.pt
  U   z3c.website/trunk/src/z3c/website/tool/adding.pt
  U   z3c.website/trunk/src/z3c/website/tool/adding.py
  U   z3c.website/trunk/src/z3c/website/tool/configure.zcml
  U   z3c.website/trunk/src/z3c/website/tool/content.pt
  U   z3c.website/trunk/src/z3c/website/tool/content.py
  U   z3c.website/trunk/src/z3c/website/tool/edit.py
  A   z3c.website/trunk/src/z3c/website/tool/sample.py
  A   z3c.website/trunk/src/z3c/website/tool/samples.pt

-=-
Added: z3c.website/trunk/src/z3c/website/authentication.py
===================================================================
--- z3c.website/trunk/src/z3c/website/authentication.py	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/authentication.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,37 @@
+###############################################################################
+#
+# Copyright (c) 2007 Projekt01 GmbH.
+# All Rights Reserved.
+#
+###############################################################################
+"""
+$Id: authentication.py 371 2007-03-26 01:44:30Z roger.ineichen $
+"""
+
+import zope.interface
+from zope.schema.fieldproperty import FieldProperty
+
+from z3c.authentication.simple import member
+from z3c.website import interfaces
+
+
+class WebSiteMember(member.Member):
+    """An IMember for MemberContainer."""
+
+    zope.interface.implements(interfaces.IWebSiteMember)
+
+    firstName = FieldProperty(interfaces.IWebSiteMember['firstName'])
+    lastName = FieldProperty(interfaces.IWebSiteMember['lastName'])
+    email = FieldProperty(interfaces.IWebSiteMember['email'])
+    phone = FieldProperty(interfaces.IWebSiteMember['phone'])
+
+    def __init__(self, login, password, firstName, lastName, email):
+        title = firstName +' '+ lastName
+        super(WebSiteMember, self).__init__(login, password, title)
+        self.firstName = firstName
+        self.lastName = lastName
+        self.email = email
+        self.description = email
+
+    def __repr__(self):
+        return '<%s %r>' %(self.__class__.__name__, self.title)

Added: z3c.website/trunk/src/z3c/website/authentication.zcml
===================================================================
--- z3c.website/trunk/src/z3c/website/authentication.zcml	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/authentication.zcml	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,13 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    i18n_domain="z3c.website">
+
+  <class class=".authentication.WebSiteMember">
+    <require
+        permission="zope.ManageServices"
+        interface=".interfaces.IWebSiteMember"
+        set_schema=".interfaces.IWebSiteMember"
+        />
+  </class>
+
+</configure>

Modified: z3c.website/trunk/src/z3c/website/browser/configure.zcml
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/configure.zcml	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/browser/configure.zcml	2007-05-23 11:40:29 UTC (rev 75904)
@@ -2,6 +2,7 @@
     xmlns:zope="http://namespaces.zope.org/zope"
     i18n_domain="z3c.website">
 
+  <include file="sample.zcml" />
   <include file="site.zcml" />
   <include file="member.zcml" />
   <include file="page.zcml" />

Modified: z3c.website/trunk/src/z3c/website/browser/member.py
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/member.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/browser/member.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -23,9 +23,9 @@
 import zope.component
 import zope.event
 import zope.lifecycleevent
-from zope.formlib import form
 from zope.publisher.browser import BrowserPage
 from zope.publisher.browser import TestRequest
+from zope.traversing.browser import absoluteURL
 
 from zope.app import zapi
 from zope.app import security
@@ -41,29 +41,36 @@
 from zc.table import table
 from z3c.authentication.simple.interfaces import IMember
 from z3c.authentication.simple.member import Member
+from z3c.form.interfaces import IWidgets
+from z3c.form import button
+from z3c.form import form
+from z3c.form import field
+from z3c.formui import layout
 from z3c.pagelet import browser
 
 from z3c.website.i18n import MessageFactory as _
 from z3c.website import interfaces
+from z3c.website.authentication import WebSiteMember
 
 
-class AddMemberForm(form.AddFormBase):
+class MemberAddForm(form.AddForm):
+    """Member add form."""
 
-    label = _('Add Member')
-    prefix = 'memberform'
-    template = ViewPageTemplateFile('member_edit.pt')
-    actions = form.AddFormBase.actions.copy()
+    label = _(u'Add Member')
 
-    form_fields = form.Fields(IMember).select(
-        'login', 'password', 'title', 'description')
+    fields = field.Fields(interfaces.IWebSiteMember).select(
+        'login', 'password', 'firstName', 'lastName', 'email', 'phone')
 
     def create(self, data):
-        # Create the admin principal
+        # Create the member
         login = data['login']
         password = data['password']
-        title = data['title']
-        description = data['description']
-        return Member(login, password, title, description)
+        firstName = data['firstName']
+        lastName = data['lastName']
+        email = data['email']
+        user = WebSiteMember(login, password, firstName, lastName, email)
+        user.phone = data.get('phone', u'')
+        return user
 
     def add(self, member):
         auth = zope.component.getUtility(IAuthentication, context=self.context)
@@ -71,46 +78,35 @@
         self._finished_add = True
         return member
 
-    def handle_cancel(self, action, data, errors=None):
-        self.request.response.redirect(self.request.URL)
-
-    actions.append(
-        form.Action(_('Cancel'), success=handle_cancel, failure=handle_cancel))
-
     def nextURL(self):
-        return self.request.URL
+        return absoluteURL(self.context, self.request) + '/members.html'
 
 
-class EditMemberForm(form.EditFormBase):
+class MemberEditForm(form.EditForm):
 
     label = _('Edit Member')
-    prefix = 'memberform'
-    template = ViewPageTemplateFile('member_edit.pt')
-    actions = form.Actions()
 
-    form_fields = form.Fields(IMember).select(
-        'login', 'password', 'title', 'description')
+    fields = field.Fields(interfaces.IWebSiteMember).select(
+        'login', 'password', 'firstName', 'lastName', 'email', 'phone')
 
-    @form.action(_("Apply"))
-    def handle_edit_action(self, action, data):
-        if form.applyChanges(self.context, self.form_fields, data,
-                             self.adapters):
-            zope.event.notify(
-                zope.lifecycleevent.ObjectModifiedEvent(self.context))
-            self.status = _('Member updated.')
+    ignoreRequest = False
 
-    def handle_cancel(self, action, data, errors=None):
-        self.request.response.redirect(self.request.URL)
+    def updateWidgets(self):
+        self.widgets = zope.component.getMultiAdapter(
+            (self, self.request, self.getContent()), IWidgets)
+        self.widgets.ignoreRequest = self.ignoreRequest
+        self.widgets.update()
 
-    actions.append(
-        form.Action(_('Cancel'), success=handle_cancel, failure=handle_cancel))
+#    @button.buttonAndHandler(u'Cancel')
+#    def handleCancel(self, action):
+#        self.request.response.redirect(self.request.getURL())
 
 
 class RadioButtonColumn(column.Column):
 
     def renderCell(self, item, formatter):
         name = zapi.getName(item['member'])
-        widget = (u'<input type="radio" '
+        widget = (u'<input type="radio" class="radioWidget" '
                   u'name="selectedItem" value="%s" %s />')
         selected=''
         if 'selectedItem' in formatter.request and \
@@ -129,38 +125,38 @@
         return self.getText(item)
 
 
-def getDescription(item):
+def getLogin(item):
     p = item['member']
-    return p.description
+    return p.login
 
 
-def getTitle(item):
+def getFirstName(item):
     p = item['member']
-    return p.title
+    return p.firstName
 
 
-def getLogin(item):
+def getLastName(item):
     p = item['member']
-    return p.login
+    return p.lastName
 
 
+def getEmail(item):
+    p = item['member']
+    return p.email
 
-class MemberManagement(browser.BrowserPagelet):
+
+class MemberManagement(layout.FormLayoutSupport, form.Form):
     """Management of members."""
 
-    status = None
+    subForm = None
 
-    label = _('Manage Members')
-    prefix = 'form'
-    tableActions = form.Actions()
-    subForm = u''
-
     # Only the first columns
     columns = (
         RadioButtonColumn(_('Sel')),
         GetTextColumn(_('Login'), 'lastName', getLogin),
-        GetTextColumn(_('Title'), 'email', getTitle),
-        GetTextColumn(_('Description'), 'phone', getDescription),
+        GetTextColumn(_('FirstName'), 'email', getFirstName),
+        GetTextColumn(_('Last Name'), 'phone', getLastName),
+        GetTextColumn(_('Email'), 'phone', getEmail),
         )
 
     @property
@@ -186,27 +182,21 @@
         formatter = table.AlternatingRowFormatter(
             self.context, self.request, self.members, columns=self.columns,
             prefix='members.')
-        formatter.widths = [25, 150, 150, 200, 200]
-        formatter.cssClasses['table'] = 'sorted'
+        formatter.widths = [25, 150, 150, 150, 150]
+        #formatter.cssClasses['table'] = 'sorted'
         return formatter()
 
-    def update(self):
+    @button.buttonAndHandler(u'Edit')
+    def editMember(self, action):
         if self.selectedItem:
-            self.subForm = EditMemberForm(
-                self.selectedItem, self.request)
+            self.subForm = MemberEditForm(self.selectedItem, self.request)
+            self.subForm.ignoreRequest = True
+            self.subForm.update()
         else:
-            self.subForm = AddMemberForm(self.context, self.request)
-        self.subForm.update()
-        if self.subForm.status is not None:
-            self.status = self.subForm.status
+            self.status = _('No member selected for editing.')
 
-        errors, action = form.handleSubmit(
-            self.tableActions, {}, lambda a, d: True)
-        if action is not None:
-            action.success({})
-
-    @form.action(_('Delete Member'), tableActions)
-    def deleteMember(self, action, data):
+    @button.buttonAndHandler(u'Delete')
+    def deleteMember(self, action):
         if not self.selectedItem:
             self.status = _('No member selected.')
             return
@@ -223,10 +213,17 @@
                 group.setPrincipals(principals, check=False)
         self.status = _('Member has been deleted.')
 
-    @form.action(_('Edit Member'), tableActions)
-    def editMember(self, action, data):
+    @button.buttonAndHandler(u'Cancel')
+    def handleCancel(self, action):
+        self.request.response.redirect(self.request.getURL())
+
+    def update(self):
         if self.selectedItem:
-            self.subForm = EditMemberForm(self.selectedItem, self.request)
-            self.subForm.resetForm()
+            self.subForm = MemberEditForm(self.selectedItem, self.request)
+            self.subForm.update()
         else:
-            self.status = _('No member selected for editing.')
+            self.subForm = MemberAddForm(self.context, self.request)
+        self.subForm.update()
+        if self.subForm.status is not None:
+            self.status = self.subForm.status
+        super(MemberManagement, self).update()

Modified: z3c.website/trunk/src/z3c/website/browser/member.zcml
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/member.zcml	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/browser/member.zcml	2007-05-23 11:40:29 UTC (rev 75904)
@@ -17,4 +17,16 @@
       layer="z3c.website.layer.IWebSiteBrowserLayer"
       />
 
+  <z3c:template
+      template="member_add.pt"
+      for=".member.MemberAddForm"
+      layer="z3c.website.layer.IWebSiteBrowserLayer"
+      />
+
+  <z3c:template
+      template="member_edit.pt"
+      for=".member.MemberEditForm"
+      layer="z3c.website.layer.IWebSiteBrowserLayer"
+      />
+
 </configure>

Added: z3c.website/trunk/src/z3c/website/browser/member_add.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/member_add.pt	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/browser/member_add.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,2 @@
+<div metal:use-macro="macro:widget-rows" />
+<div metal:use-macro="macro:form-buttons" />

Modified: z3c.website/trunk/src/z3c/website/browser/member_edit.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/member_edit.pt	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/browser/member_edit.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -1,21 +1,3 @@
-<fieldset>
-<legend tal:content="view/label">Add Member</legend>
-    <tal:block define="widget nocall:view/widgets/login">
-      <div metal:use-macro="macro:widget-row" />
-    </tal:block>
-    <tal:block define="widget nocall:view/widgets/password">
-      <div metal:use-macro="macro:widget-row" />
-    </tal:block>
-    <tal:block define="widget nocall:view/widgets/title">
-      <div metal:use-macro="macro:widget-row" />
-    </tal:block>
-    <tal:block define="widget nocall:view/widgets/description">
-      <div metal:use-macro="macro:widget-row" />
-    </tal:block>
-    <div id="actionsView">
-      <span class="actionButtons">
-      <input tal:repeat="action view/actions"
-           tal:replace="structure action/render" />
-      </span>
-    </div>
-</fieldset>
+<div metal:use-macro="macro:widget-rows" />
+<div metal:use-macro="macro:form-buttons" />
+

Modified: z3c.website/trunk/src/z3c/website/browser/members.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/members.pt	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/browser/members.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -11,13 +11,7 @@
     <tr>
       <td valign="top" width="600" style="padding-right:10px;">
         <tal:block replace="structure view/table" />
-        <div id="actionsView">
-          <span class="actionButtons">
-          <input tal:repeat="action view/tableActions"
-               tal:replace="structure action/render"
-               />
-          </span>
-        </div>
+        <div metal:use-macro="macro:form-buttons" />
       </td>
       <td valign="top" width="340">
 	        <tal:block replace="structure view/getEditForm" />

Added: z3c.website/trunk/src/z3c/website/browser/sample.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/sample.pt	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/browser/sample.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,10 @@
+<metal:block define-macro="intro">
+<div class="headline" tal:content="structure context/headline">reStructureText Editor</div>
+<div class="summary" tal:content="structure context/summary"></div>
+</metal:block>
+<metal:block define-macro="footer">
+<div id="contributor">
+   <div class="label">Author</div>
+   <div class="description" tal:content="structure context/author">Roger Ineichen</div>
+</div>
+</metal:block>

Added: z3c.website/trunk/src/z3c/website/browser/sample.py
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/sample.py	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/browser/sample.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,129 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id: __init__.py 69382 2006-08-09 13:26:53Z rogerineichen $
+"""
+__docformat__ = "reStructuredText"
+
+import zope.interface
+import zope.component
+from zope.traversing.browser import absoluteURL
+from z3c.configurator import configurator
+from z3c.form import form
+from z3c.form import field
+from z3c.pagelet import browser
+from z3c.template.interfaces import ILayoutTemplate
+from z3c.website.i18n import MessageFactory as _
+from z3c.website import interfaces
+from z3c.website import session
+
+
+class SampleAddForm(form.AddForm):
+    """Reusable add form for standard ISample implementations.
+    
+    You must only define the getFactory method in your add form if you are not
+    enhanced the ISample interface for your sample object.
+    """
+
+    label = _('You must define a own label in the sample add form.')
+
+    contentName = None
+    data = None
+
+    # define your content class as a factory with a empty constructor
+    # Note if you use a enhanced ISample interface you can still use this add 
+    # form and provide the additional attributes in the edit form
+    factory = None
+
+    fields = field.Fields(
+        zope.schema.TextLine(
+            __name__='__name__',
+            title=_(u"Name"),
+            required=True))
+
+    fields += field.Fields(interfaces.ISample).select('title', 'description',
+        'keyword')
+
+    def getFactory(self):
+        raise NotImplementedError("Sub class must implement getFactory.")
+
+    def create(self, data):
+        self.data = data
+        # get form data
+        self.contentName = data.get('__name__', u'')
+
+        # Create site
+        obj = self.factory()
+        obj.title = data.get('title', u'')
+        obj.description = data.get('description', u'')
+        obj.keyword = data.get('keyword', u'')
+        return obj
+
+    def add(self, obj):
+        
+        # Add the site
+        if self.context.get(self.contentName) is not None:
+            self.status = _('Page with that name already exist.')
+            self._finished_add = False
+            return None
+        self.context[self.contentName] = obj
+
+        # Configure the new obj
+        configurator.configure(obj, self.data)
+
+        self._finished_add = True
+        return obj
+
+    def nextURL(self):
+        obj = self.context[self.contentName]
+        return absoluteURL(obj, self.request) + '/edit.html'
+
+    def __call__(self):
+        self.update()
+        layout = zope.component.getMultiAdapter((self, self.request),
+            ILayoutTemplate)
+        return layout(self)
+
+
+class SampleMetaEditPagelet(form.EditForm):
+    """Content edit page."""
+
+    fields = field.Fields(interfaces.ISample).select('title', 'description',
+        'keyword', 'headline', 'summary', 'author')
+
+    def __call__(self):
+        self.update()
+        layout = zope.component.getMultiAdapter((self, self.request),
+            ILayoutTemplate)
+        return layout(self)
+
+
+# Note, the ISample content edit form is located in the jquery.demo.resteditor
+# because we use the JQuery based reSTructuredText Editor widget
+
+
+class SessionDataEditForm(form.EditForm):
+    """Sample edit form supporting storing content object in a session."""
+
+    def getContentFactory(self):
+        return session.SessionData
+
+    def getContent(self):
+        return session.getSessionData(self)
+
+    def __call__(self):
+        self.update()
+        layout = zope.component.getMultiAdapter((self, self.request),
+            ILayoutTemplate)
+        return layout(self)

Added: z3c.website/trunk/src/z3c/website/browser/sample.zcml
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/sample.zcml	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/browser/sample.zcml	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,49 @@
+<configure
+    xmlns:zope="http://namespaces.zope.org/zope"
+    xmlns="http://namespaces.zope.org/browser"
+    xmlns:z3c="http://namespaces.zope.org/z3c"
+    i18n_domain="z3c.website">
+
+  <!-- Note; the content edit.html form for ISample is defined in the 
+       jquery.demo package because we use the reStructuredText Editor widget 
+       defined in the JQuery package
+       -->
+
+  <z3c:template
+      template="sample_add.pt"
+      for=".sample.SampleAddForm"
+      layer="z3c.website.layer.IWebSiteBrowserLayer"
+      />
+
+  <z3c:pagelet
+      name="meta.html"
+      for="z3c.website.interfaces.ISample"
+      class=".sample.SampleMetaEditPagelet"
+      layer="z3c.website.layer.IWebSiteBrowserLayer"
+      permission="z3c.website.ManageSite"
+      />
+
+  <z3c:template
+      template="sample_edit_meta.pt"
+      for=".sample.SampleMetaEditPagelet"
+      layer="z3c.website.layer.IWebSiteBrowserLayer"
+      />
+
+  <!-- additional intro and footer templates for IPageletRenderer -->
+  <z3c:template
+      name="intro"
+      macro="intro"
+      template="sample.pt"
+      for="z3c.pagelet.interfaces.IPagelet"
+      layer="z3c.website.layer.IWebSiteBrowserLayer"
+      />
+
+  <z3c:template
+      name="footer"
+      macro="footer"
+      template="sample.pt"
+      for="z3c.pagelet.interfaces.IPagelet"
+      layer="z3c.website.layer.IWebSiteBrowserLayer"
+      />
+
+</configure>

Added: z3c.website/trunk/src/z3c/website/browser/sample_add.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/sample_add.pt	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/browser/sample_add.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1 @@
+<div metal:use-macro="macro:form" />

Added: z3c.website/trunk/src/z3c/website/browser/sample_edit_meta.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/sample_edit_meta.pt	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/browser/sample_edit_meta.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1 @@
+<div metal:use-macro="macro:form" />

Modified: z3c.website/trunk/src/z3c/website/browser/site.py
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/site.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/browser/site.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -24,7 +24,6 @@
 from zc.table import column
 from zc.table import table
 
-from z3c.authentication.simple.interfaces import IMember
 from z3c.configurator import configurator
 from z3c.form import form
 from z3c.form import field
@@ -116,8 +115,9 @@
             required=True))
 
     fields += field.Fields(interfaces.IWebSite).select('title')
-    fields += field.Fields(IMember, prefix="member").select('member.title', 
-        'member.description', 'member.login', 'member.password')
+    fields += field.Fields(interfaces.IWebSiteMember, prefix="member").select(
+        'member.login', 'member.password', 'member.firstName', 
+        'member.lastName', 'member.email', 'member.phone')
 
     def create(self, data):
         self.data = data

Modified: z3c.website/trunk/src/z3c/website/browser/site_add.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/browser/site_add.pt	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/browser/site_add.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -18,12 +18,18 @@
     <tal:block define="widget nocall:view/widgets/member.password">
       <div metal:use-macro="macro:widget-row" />
     </tal:block>
-    <tal:block define="widget nocall:view/widgets/member.title">
+    <tal:block define="widget nocall:view/widgets/member.firstName">
       <div metal:use-macro="macro:widget-row" />
     </tal:block>
-    <tal:block define="widget nocall:view/widgets/member.description">
+    <tal:block define="widget nocall:view/widgets/member.lastName">
       <div metal:use-macro="macro:widget-row" />
     </tal:block>
+    <tal:block define="widget nocall:view/widgets/member.email">
+      <div metal:use-macro="macro:widget-row" />
+    </tal:block>
+    <tal:block define="widget nocall:view/widgets/member.phone">
+      <div metal:use-macro="macro:widget-row" />
+    </tal:block>
     </fieldset>
   </div>
   <metal:block fill-slot="actions">

Modified: z3c.website/trunk/src/z3c/website/configure.zcml
===================================================================
--- z3c.website/trunk/src/z3c/website/configure.zcml	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/configure.zcml	2007-05-23 11:40:29 UTC (rev 75904)
@@ -8,12 +8,14 @@
       type="zope.publisher.interfaces.browser.IBrowserSkinType"
       />
 
+  <include file="authentication.zcml" />
   <include file="security.zcml" />
   <include file="sample.zcml" />
   <include file="session.zcml" />
   <include file="site.zcml" />
   <include file="layer.zcml" />
   <include file="page.zcml" />
+  <include file="provider.zcml" />
 
   <include package=".browser" />
   <include package=".skin" />

Deleted: z3c.website/trunk/src/z3c/website/form.py
===================================================================
--- z3c.website/trunk/src/z3c/website/form.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/form.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -1,37 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-$Id: __init__.py 69382 2006-08-09 13:26:53Z rogerineichen $
-"""
-
-import zope.component
-from z3c.template.interfaces import ILayoutTemplate
-from z3c.form import form
-from z3c.website import session
-
-
-class SampleEditForm(form.EditForm):
-    """Sample edit form supporting storing content object in a session."""
-
-    def getContentFactory(self):
-        return session.SessionData
-
-    def getContent(self):
-        return session.getSessionData(self)
-
-    def __call__(self):
-        self.update()
-        layout = zope.component.getMultiAdapter((self, self.request),
-            ILayoutTemplate)
-        return layout(self)
\ No newline at end of file

Modified: z3c.website/trunk/src/z3c/website/interfaces.py
===================================================================
--- z3c.website/trunk/src/z3c/website/interfaces.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/interfaces.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -26,6 +26,10 @@
 from zope.app.file.interfaces import IFile as ZIFile
 from zope.app.file.interfaces import IImage as ZIImage
 from zope.app.session.interfaces import ISession
+import z3c.schema.email
+import z3c.pagelet.interfaces
+import z3c.form.interfaces
+from z3c.authentication.simple.interfaces import IMember
 from z3c.resource.interfaces import IResourceTraversable
 from z3c.resource.interfaces import IResourceItem
 from z3c.website.i18n import MessageFactory as _
@@ -97,12 +101,41 @@
         required=True)
 
 
-class ISample(IPage):
+class ISample(IContent):
     """Base class for Z3C sample objects."""
 
     containers(ISamples)
 
+    headline = zope.schema.TextLine(
+        title=_(u'Headline'),
+        description=_(u'The headline for the sample.'),
+        default=u'',
+        required=False)
 
+    summary = zope.schema.Text(
+        title=_(u'Summary'),
+        description=_(u'The sumary for the sample.'),
+        default=u'',
+        required=False)
+
+    author = zope.schema.TextLine(
+        title=_(u'Author'),
+        description=_(u'The author of the sample.'),
+        default=u'',
+        required=False)
+
+
+class ISamplePagelet(z3c.pagelet.interfaces.IPagelet):
+    """Sample pagelet using a special IPageletRenderer whic includes intro and 
+    footer templates."""
+
+
+class ISampleAddForm(z3c.form.interfaces.IAddForm, 
+    z3c.pagelet.interfaces.IPagelet):
+    """Sample pagelet using a special IPageletRenderer whic includes intro and 
+    footer templates."""
+
+
 class ISessionData(zope.interface.Interface):
     """Simple data object which offers a field called content."""
 
@@ -128,3 +161,31 @@
 
 class IImage(IResourceItem, ZIImage):
     """Image resource item."""
+
+
+class IWebSiteMember(IMember):
+    """WebSite member."""
+
+    lastName = zope.schema.TextLine(
+        title=_(u'Last Name'),
+        description=_(u'The last name of the administrator.'),
+        default=u'',
+        missing_value=u'',
+        required=True)
+
+    firstName = zope.schema.TextLine(
+        title=_(u'First Name'),
+        description=_(u'The first name of the administrator.'),
+        default=u'',
+        missing_value=u'',
+        required=True)
+
+    email = z3c.schema.email.field.RFC822MailAddress(
+        title=_(u'Email'),
+        description=_(u'The email address of the administrator.'),
+        required=True)
+
+    phone = zope.schema.TextLine(
+        title=_('Phone'),
+        description=_('The phone number of the administrator.'),
+        required=True)

Added: z3c.website/trunk/src/z3c/website/provider.py
===================================================================
--- z3c.website/trunk/src/z3c/website/provider.py	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/provider.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,65 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id: provider.py 72087 2007-01-18 01:03:33Z rogerineichen $
+"""
+
+import zope.interface
+import zope.component
+from zope.publisher.interfaces import browser
+from zope.pagetemplate.interfaces import IPageTemplate
+
+from z3c.pagelet import interfaces
+
+
+class SamplePageletRenderer(object):
+    """Render the adapted pagelet including the summary and author."""
+
+    zope.interface.implements(interfaces.IPageletRenderer)
+
+    def __init__(self, context, request, pagelet):
+        self.__updated = False
+        self.__parent__ = pagelet
+        self.context = context
+        self.request = request
+
+    def update(self):
+        pass
+
+    def render(self):
+        intro = self.introTemplate()
+        content = self.__parent__.render()
+        footer = self.footerTemplate()
+        return intro + content + footer
+
+    def introTemplate(self):
+        """This template renders the intro for you into your sample template.
+        
+        You dont have to do anything else. All the maigic get done by the 
+        custom z3c.pagelet.interfaces.IPageletRenderer.
+        """
+        template = zope.component.getMultiAdapter((self.__parent__, 
+            self.request), IPageTemplate, name='intro')
+        return template(self.__parent__)
+
+    def footerTemplate(self):
+        """This template renders the footer info for you into your sample 
+        template.
+        
+        You dont have to do anything else. All the maigic get done by the 
+        custom z3c.pagelet.interfaces.IPageletRenderer.
+        """
+        template = zope.component.getMultiAdapter((self.__parent__, 
+            self.request), IPageTemplate, name='footer')
+        return template(self.__parent__)

Added: z3c.website/trunk/src/z3c/website/provider.zcml
===================================================================
--- z3c.website/trunk/src/z3c/website/provider.zcml	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/provider.zcml	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,19 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    i18n_domain="z3c.website">
+
+  <!-- You can't belive how powerfull IPageletRenderer can be. They
+       allow us to render a summary and author information around a simple
+       template before they get included into the main layout. 
+       Belive me it's realy time to drop the macro pattern for layout work. ri 
+       -->
+  <adapter
+      name="pagelet"
+      for="z3c.website.interfaces.ISample
+           z3c.website.layer.IWebSiteBrowserLayer
+           z3c.website.interfaces.ISamplePagelet"
+      provides="zope.contentprovider.interfaces.IContentProvider"
+      factory=".provider.SamplePageletRenderer"
+      />
+
+</configure>

Modified: z3c.website/trunk/src/z3c/website/sample.py
===================================================================
--- z3c.website/trunk/src/z3c/website/sample.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/sample.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -16,13 +16,16 @@
 """
 __docformat__ = "reStructuredText"
 
+import persistent
 import zope.interface
 import zope.component
 from zope.app import folder
 from zope.schema.fieldproperty import FieldProperty
 from zope.app.container import btree
+from zope.app.container import contained
 
 from z3c.website import interfaces
+from z3c.website import page
 
 
 class Samples(btree.BTreeContainer):
@@ -37,3 +40,22 @@
 
     def __repr__(self):
         return '<%s %r>' % (self.__class__.__name__, self.__name__)
+
+
+class Sample(persistent.Persistent, contained.Contained):
+    """ISample implementation."""
+
+    zope.interface.implements(interfaces.ISample)
+
+    title = FieldProperty(interfaces.ISample['title'])
+    description = FieldProperty(interfaces.ISample['description'])
+    keyword = FieldProperty(interfaces.ISample['keyword'])
+    body = FieldProperty(interfaces.ISample['body'])
+
+    # infos about the sample and the author
+    headline = FieldProperty(interfaces.ISample['headline'])
+    summary = FieldProperty(interfaces.ISample['summary'])
+    author = FieldProperty(interfaces.ISample['author'])
+
+    def __repr__(self):
+        return '<%s %r>' % (self.__class__.__name__, self.__name__)

Modified: z3c.website/trunk/src/z3c/website/sample.zcml
===================================================================
--- z3c.website/trunk/src/z3c/website/sample.zcml	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/sample.zcml	2007-05-23 11:40:29 UTC (rev 75904)
@@ -5,12 +5,27 @@
   <class class=".sample.Samples">
     <require
         permission="zope.Public"
-        interface=".interfaces.ISamples"
+        interface=".interfaces.IContent"
         />
     <require
+        permission="zope.Public"
+        interface="zope.app.container.interfaces.IContainer"
+        />
+    <require
         permission="z3c.website.ManageContent"
         set_schema=".interfaces.ISamples"
         />
   </class>
 
+  <class class=".sample.Sample">
+    <require
+        permission="zope.Public"
+        interface=".interfaces.ISample"
+        />
+    <require
+        permission="z3c.website.ManageContent"
+        set_schema=".interfaces.ISample"
+        />
+  </class>
+
 </configure>

Modified: z3c.website/trunk/src/z3c/website/site.py
===================================================================
--- z3c.website/trunk/src/z3c/website/site.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/site.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -36,11 +36,11 @@
 from z3c.authentication.simple.interfaces import IAuthenticatedPrincipal
 from z3c.authentication.simple.interfaces import IFoundPrincipal
 from z3c.authentication.simple.principal import PrincipalBase
-from z3c.authentication.simple import member
 from z3c.configurator import configurator
 from z3c.resource.interfaces import IResource
 
 from z3c.website import interfaces
+from z3c.website import authentication
 from z3c.website import page
 from z3c.website import sample
 
@@ -112,8 +112,10 @@
 
         # Add a Admin to the administrators group
         login = data['member.login']
-        admin = Member(login, data['member.password'], data['member.title'], 
-            data['member.description'])
+        admin = authentication.WebSiteMember(login, data['member.password'], 
+            data['member.firstName'], data['member.lastName'], 
+            data['member.email'])
+        admin.phone = data['member.phone']
         zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(admin))
         auth['members'].add(admin)
 

Modified: z3c.website/trunk/src/z3c/website/skin/demo.js
===================================================================
--- z3c.website/trunk/src/z3c/website/skin/demo.js	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/skin/demo.js	2007-05-23 11:40:29 UTC (rev 75904)
@@ -8,7 +8,7 @@
          proximity: 90,
          halign : 'center'}
     );
-    $('input').jsonValidate();
-    $('textarea').jsonValidate();
-    $('.restEditorWidget').resteditor();
+    $('form#JSONValidateSample input').jsonValidate();
+    $('form#JSONValidateSample textarea').jsonValidate();
+    $('textarea.restEditorWidget').restEditor();
 });

Added: z3c.website/trunk/src/z3c/website/skin/fisheye/members.gif
===================================================================
(Binary files differ)


Property changes on: z3c.website/trunk/src/z3c/website/skin/fisheye/members.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: z3c.website/trunk/src/z3c/website/skin/fisheye/members.png
===================================================================
(Binary files differ)


Property changes on: z3c.website/trunk/src/z3c/website/skin/fisheye/members.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Deleted: z3c.website/trunk/src/z3c/website/skin/form.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/skin/form.pt	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/skin/form.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -1,46 +0,0 @@
-<form action="." method="post" enctype="multipart/form-data"
-      metal:define-macro="form"
-			tal:attributes="action request/URL"
-      class="edit-form" >
-  <div id="viewspace" metal:define-slot="viewspace">
-    <h1  i18n:translate=""
-       tal:condition="view/label"
-       tal:content="view/label"
-       metal:define-slot="heading"
-       >Do something</h1>
-    <metal:block define-macro="header">
-    <div class="form-status"
-       tal:define="status view/status"
-       tal:condition="status">
-      <div class="summary"
-           i18n:translate=""
-           tal:content="view/status">
-        Form status summary
-      </div>
-      <ul class="errors" tal:condition="view/errors">
-        <li tal:repeat="error view/error_views">
-          <span tal:replace="structure error">Error Type</span>
-        </li>
-      </ul>
-    </div>
-    </metal:block>
-    <div metal:define-slot="extra_info" tal:replace="nothing">
-    </div>
-    <div metal:define-slot="main">
-    </div>
-    <metal:block define-slot="above_buttons">
-    </metal:block>
-  </div>
-  <metal:block define-macro="form_action_views">
-  <div id="actionsView"
-       metal:define-macro="form_actions">
-    <span class="actionButtons"
-        tal:condition="view/availableActions"
-        metal:define-slot="bottom_buttons">
-    <input tal:repeat="action view/actions"
-           tal:replace="structure action/render"
-           />
-    </span>
-  </div>
-  </metal:block>
-</form>

Modified: z3c.website/trunk/src/z3c/website/skin/template.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/skin/template.pt	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/skin/template.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -64,6 +64,13 @@
 	            tal:attributes="src context/++resource++fisheye/contact.gif" />
           <span>Contact</span>
           </a>
+          <a class="dock-item" href="#"
+             tal:condition="python:request.principal.id != 'zope.anybody'"
+		     tal:attributes="href string:${siteURL}/members.html"
+          ><img src="members.gif" alt="contact"
+	            tal:attributes="src context/++resource++fisheye/members.gif" />
+          <span>Members</span>
+          </a>
         </div>
       </div>
     </div>

Deleted: z3c.website/trunk/src/z3c/website/skin/widget.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/skin/widget.pt	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/skin/widget.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -1,34 +0,0 @@
-<metal:block define-macro="widget_rows">
-<div class="row" tal:repeat="widget view/widgets">
-  <metal:block define-macro="widget_row" tal:define="hint widget/hint">
-  <!-- label -->
-  <div class="label">
-    <label tal:condition="python:hint"
-                tal:attributes="for widget/name">
-      <span i18n:translate=""
-                tal:content="widget/label">label</span
-         >
-      <span class="required" tal:condition="widget/required">*</span>
-    </label>
-  </div>
-  <!-- widget -->
-  <div class="form-fields-help"
-           i18n:translate=""
-           tal:content="hint"
-           tal:condition="hint"
-           tal:attributes="id string:field-help-for-${widget/name}"
-           onclick="this.style.visibility='hidden';"
-           style="visibility: hidden; position: absolute;"
-           >
-    Title of this content object.
-  </div>
-  <div class="widget" tal:content="structure widget">
-    <input type="text" size="24" />
-  </div>
-  <div class="error"
-           tal:condition="widget/error">
-    <span tal:replace="structure widget/error">error</span>
-  </div>
-  </metal:block>
-</div>
-</metal:block>

Modified: z3c.website/trunk/src/z3c/website/tool/adding.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/tool/adding.pt	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/tool/adding.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -6,10 +6,10 @@
       <tal:block i18n:translate="">Adding</tal:block>
     </div>
     <div class="naviBoxBody">
-    <div tal:repeat="sample view/samples">
+    <div tal:repeat="sample view/addForms">
 	<a href=""
 	   tal:attributes="href sample/url"
-	   tal:content="sample/title">title</a>
+	   tal:content="sample/label">label</a>
 	</div>
     </div>
   </div>

Modified: z3c.website/trunk/src/z3c/website/tool/adding.py
===================================================================
--- z3c.website/trunk/src/z3c/website/tool/adding.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/tool/adding.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -16,11 +16,13 @@
 """
 __docformat__ = "reStructuredText"
 
+import zope.interface
 import zope.component
 from zope.traversing.browser import absoluteURL
 from zope.app.component import hooks
 from zope.viewlet import viewlet
 
+from z3c.website import interfaces
 import z3c.website.layer
 
 
@@ -29,15 +31,18 @@
 
     viewNames = {'REST Editor':'addRestEditor.html.html'}
 
-    def samples(self):
+    def addForms(self):
+        """Collect add form views."""
         res = []
-        append = res.append
         try:
+            append = res.append
             baseURL = absoluteURL(self.context, self.request)
-            for title, name in self.viewNames.items():
+            adapters = zope.component.getAdapters((self.context, self.request), 
+                interfaces.ISampleAddForm)
+            for viewName, view in adapters:
                 info = {}
-                info['url'] = baseURL+'/'+name
-                info['title'] = title
+                info['url'] = baseURL+'/'+viewName
+                info['label'] = view.label
                 append(info)
         except KeyError:
             # site does not exist right now

Modified: z3c.website/trunk/src/z3c/website/tool/configure.zcml
===================================================================
--- z3c.website/trunk/src/z3c/website/tool/configure.zcml	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/tool/configure.zcml	2007-05-23 11:40:29 UTC (rev 75904)
@@ -12,6 +12,17 @@
       />
 
   <viewlet
+      name="Search"
+      for="*"
+      class=".search.SearchTool"
+      manager="z3c.website.tool.IToolManager"
+      template="search.pt"
+      layer="z3c.website.layer.IWebSiteBrowserLayer"
+      permission="z3c.website.ManageContent"
+      weight="1"
+      />
+
+  <viewlet
       name="Content"
       for="*"
       class=".content.Content"
@@ -19,18 +30,18 @@
       template="content.pt"
       layer="z3c.website.layer.IWebSiteBrowserLayer"
       permission="zope.Public"
-      weight="1"
+      weight="2"
       />
 
   <viewlet
-      name="Search"
+      name="Samples"
       for="*"
-      class=".search.SearchTool"
+      class=".sample.Samples"
       manager="z3c.website.tool.IToolManager"
-      template="search.pt"
+      template="samples.pt"
       layer="z3c.website.layer.IWebSiteBrowserLayer"
-      permission="z3c.website.ManageContent"
-      weight="2"
+      permission="zope.Public"
+      weight="3"
       />
 
   <viewlet
@@ -41,18 +52,18 @@
       template="adding.pt"
       layer="z3c.website.layer.IWebSiteBrowserLayer"
       permission="z3c.website.ManageContent"
-      weight="3"
+      weight="4"
       />
 
   <viewlet
       name="Edit"
-      for="*"
+      for="..interfaces.IContent"
       class=".edit.EditTool"
       manager="z3c.website.tool.IToolManager"
       template="edit.pt"
       layer="z3c.website.layer.IWebSiteBrowserLayer"
       permission="z3c.website.ManageContent"
-      weight="4"
+      weight="5"
       />
 
 </configure>

Modified: z3c.website/trunk/src/z3c/website/tool/content.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/tool/content.pt	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/tool/content.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -6,7 +6,7 @@
       <tal:block i18n:translate="">Content</tal:block>
     </div>
     <div class="naviBoxBody">
-    <div tal:repeat="sample view/samples">
+    <div tal:repeat="sample view/items">
 	<a href=""
 	   tal:attributes="href sample/url"
 	   tal:content="sample/title">title</a>

Modified: z3c.website/trunk/src/z3c/website/tool/content.py
===================================================================
--- z3c.website/trunk/src/z3c/website/tool/content.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/tool/content.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -19,6 +19,7 @@
 import zope.component
 from zope.traversing.browser import absoluteURL
 from zope.app.component import hooks
+from zope.app.container.interfaces import IContainer
 from zope.viewlet import viewlet
 
 import z3c.website.layer
@@ -27,19 +28,22 @@
 class Content(viewlet.ViewletBase):
     """Content tool."""
 
-    sampleViewNames = ['table.html']
-
-    def samples(self):
+    def items(self):
         res = []
         append = res.append
         try:
-            site = hooks.getSite()
-            samples = site['samples']
-            baseURL = absoluteURL(samples, self.request)
-            for name in self.sampleViewNames:
+            if IContainer.providedBy(self.context):
+                # get childs if we stay at a container
+                context = self.context
+            elif IContainer.providedBy(self.context.__parent__):
+                # get siblings
+                context = self.context.__parent__
+            else:
+                return []
+            for item in context.values():
                 info = {}
-                info['url'] = baseURL+'/'+name
-                info['title'] = u'undefined'
+                info['url'] = absoluteURL(item, self.request)
+                info['title'] = item.title or u'undefined'
                 append(info)
         except KeyError:
             # site does not exist right now

Modified: z3c.website/trunk/src/z3c/website/tool/edit.py
===================================================================
--- z3c.website/trunk/src/z3c/website/tool/edit.py	2007-05-23 10:12:14 UTC (rev 75903)
+++ z3c.website/trunk/src/z3c/website/tool/edit.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -21,6 +21,8 @@
 from zope.app.component import hooks
 from zope.viewlet import viewlet
 
+
+from z3c.website import interfaces
 import z3c.website.layer
 
 
@@ -32,7 +34,10 @@
                  'Meta':'meta.html'}
 
     def samples(self):
+        # prevent edit links on add forms
         res = []
+        if interfaces.ISampleAddForm.providedBy(self.__parent__):
+            return res
         append = res.append
         try:
             baseURL = absoluteURL(self.context, self.request)

Added: z3c.website/trunk/src/z3c/website/tool/sample.py
===================================================================
--- z3c.website/trunk/src/z3c/website/tool/sample.py	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/tool/sample.py	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,44 @@
+##############################################################################
+#
+# Copyright (c) 2007 Projekt01 GmbH and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Resource License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id: app.py 44 2007-02-21 09:43:39Z roger.ineichen $
+"""
+__docformat__ = "reStructuredText"
+
+import zope.component
+from zope.traversing.browser import absoluteURL
+from zope.app.component import hooks
+from zope.viewlet import viewlet
+
+import z3c.website.layer
+
+
+class Samples(viewlet.ViewletBase):
+    """Samples tool."""
+
+    def samples(self):
+        res = []
+        append = res.append
+        try:
+            site = hooks.getSite()
+            samples = site['samples']
+            for item in samples.values():
+                info = {}
+                info['url'] = absoluteURL(item, self.request)
+                info['title'] = item.title or u'undefined'
+                append(info)
+        except KeyError:
+            # site does not exist right now
+            pass
+        return res

Added: z3c.website/trunk/src/z3c/website/tool/samples.pt
===================================================================
--- z3c.website/trunk/src/z3c/website/tool/samples.pt	                        (rev 0)
+++ z3c.website/trunk/src/z3c/website/tool/samples.pt	2007-05-23 11:40:29 UTC (rev 75904)
@@ -0,0 +1,18 @@
+<div class="naviBoxContainer">
+  <div class="naviBox">
+    <div class="naviBoxHeader">
+      <img src="content.gif" alt="navigation" height="32" width="32"
+	            tal:attributes="src context/++resource++img/content.gif" />
+      <tal:block i18n:translate="">Content</tal:block>
+    </div>
+    <div class="naviBoxBody">
+    <div tal:repeat="sample view/samples">
+	<a href=""
+	   tal:attributes="href sample/url"
+	   tal:content="sample/title">title</a>
+	</div>
+    </div>
+  </div>
+  <div class="boxSpacer">
+  </div>
+</div>



More information about the Checkins mailing list