[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