work in progress: wiki configuration and editing

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3855 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2010-05-09 09:50:15 +00:00
parent 3f1a3cd08f
commit b1a231f40e
16 changed files with 117 additions and 27 deletions

View file

@ -3,7 +3,7 @@
<body>
<div metal:fill-slot="content">
<div metal:fill-slot="main">
<metal:content use-macro="view/contentMacro" />
</div>

View file

@ -1,4 +1,4 @@
<tal:block i18n:domain="loops">
<tal:block i18n:domain="zope">
<div class="body"
metal:define-macro="body"
tal:define="controller nocall:view/controller;
@ -8,8 +8,8 @@
<div class="top" metal:define-slot="top">
<a href="#" name="top" metal:define-slot="logo"
tal:attributes="href string:${request/URL/1}"><img class="logo"
src="logo.gif" border="0" alt="Home"
tal:attributes="src string:${resourceBase}logo.gif" /></a>
border="0" alt="Home"
tal:attributes="src string:${resourceBase}logo.png" /></a>
<div metal:define-slot="top-actions">
<tal:action repeat="macro controller/macros/top_actions">
<metal:action use-macro="macro" />

View file

@ -5,5 +5,6 @@
xmlns:browser="http://namespaces.zope.org/browser">
<browser:resource name="base.css" file="base.css" />
<browser:resource name="logo.png" file="logo.png" />
</configure>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -3,7 +3,7 @@
<head>
<title tal:content="view/head_title|context/title|default">
Powered by Zope 3
Powered by Zope
</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css"
@ -16,8 +16,8 @@
<div class="top" metal:define-slot="top">
<a href="#" name="top" metal:define-slot="logo"
tal:attributes="href view/homeURL"><img class="logo"
src="logo.gif" border="0" alt="Home"
tal:attributes="src string:${view/resource_prefix}logo.gif" /></a>
border="0" alt="Home"
tal:attributes="src string:${view/resource_prefix}logo.png" /></a>
<div metal:define-slot="top-actions">
<tal:action repeat="macro view/actions/top">
<metal:action use-macro="macro" />
@ -34,7 +34,7 @@
<div metal:define-slot="actions"></div>
<div metal:define-slot="message"></div>
<div>
<metal:content define-slot="content">Content</metal:content>
<metal:content define-slot="main">Content</metal:content>
</div>
</div>
<div id="sub-section">

View file

@ -37,6 +37,7 @@ class BaseView(object):
index = generic_page
default_template = view_macros # specify in subclass
resource_prefix = '/@@/'
mode = 'view'
def __call__(self):
return self.index(self)

View file

@ -1,5 +1,5 @@
#
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
# Copyright (c) 2010 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -58,6 +58,11 @@ class WikiManager(BaseConfiguration):
if name in self.wikis:
del self.wikis[name]
def renameWiki(self, wiki, newName):
del self.wikis[wiki.name]
self.wikis[newName] = wiki
wiki.rename(newName)
def listWikis(self):
return self.wikis.values()
@ -110,7 +115,6 @@ class Wiki(BaseConfiguration):
self.name = name
self.title = title or name
self.pages = {}
#self.setup()
def setup(self):
self.getManager().addWiki(self)

View file

@ -8,7 +8,7 @@
<tr tal:repeat="wiki view/listWikis">
<td>
<a tal:attributes="href wiki/absolute_url"
tal:content="wiki/context/title" />
tal:content="wiki/title" />
</td>
</tr>
</table>
@ -24,11 +24,27 @@
</metal:content>
<metal:content define-macro="wiki_edit">
<h1>Edit Wiki: <span tal:content="context/title" /></h1>
<form method="post">
<input type="hidden" name="form_action" value="edit" />
<div><label for="form_name">Short name</label></div>
<div><input type="text" id="form_name" name="name"
tal:attributes="value context/name" /></div>
<div><label for="form_title">Title</label></div>
<div><input type="text" id="form_title" name="title"
tal:attributes="value context/title" /></div>
<input type="submit" name="submit" value="Save" />
</form>
</metal:content>
<metal:content define-macro="wikipage">
<div metal:define-macro="edit">
<tal:edit condition="python: request.get('mode') == 'edit'">
<tal:edit condition="python: view.mode == 'edit'">
<h1>Edit <span tal:content="context/title">Wiki Page</span></h1>
<form method="post">
<form method="post"
tal:attributes="action context/absolute_url">
<input type="hidden" name="form_action" value="edit" />
<div>
<div>Title</div>
@ -49,12 +65,14 @@
</tal:edit>
</div>
<div metal:define-macro="show">
<h1 tal:content="context/title">Wiki Page</h1>
<div tal:content="structure view/render" />
<tal:show condition="python: request.get('mode') != 'edit'">
<div>&nbsp;</div>
<div><a href="?mode=edit">Edit</a></div>
</tal:show>
<h1 tal:content="context/title">Wiki Page</h1>
<div tal:content="structure view/render" />
<tal:show condition="view/showEditButton">
<div>&nbsp;</div>
<div>
<a tal:attributes="href string:${context/absolute_url}/edit.html">Edit</a>
</div>
</tal:show>
</div>
</metal:content>

View file

@ -25,6 +25,8 @@ $Id$
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from zope import component
from zope.event import notify
from zope.lifecycleevent import ObjectModifiedEvent
from zope.traversing.browser import absoluteURL
from cybertools.link.interfaces import ILinkManager
@ -64,6 +66,27 @@ class WikiView(WikiBaseView):
return self.context.listPages()
class WikiEditForm(WikiView):
content_renderer = 'wiki_edit'
def update(self):
form = self.request.form
action = form.get('form_action')
if action == 'edit':
title = form.get('title')
if title and title != self.context.title:
self.context.title = title
notify(ObjectModifiedEvent(self.context))
name = form.get('name')
if name and name != self.context.name:
self.context.getManager().renameWiki(self.context, name)
self.request.response.redirect(
absoluteURL(self.context, self.request))
return False
return True
class CreatePage(object):
def update(self):
@ -71,6 +94,7 @@ class CreatePage(object):
name = form.get('name')
title = name
page = self.context.createPage(name, title)
notify(ObjectModifiedEvent(page))
# record in LinkManager
manager = self.context.getManager()
lmName = self.context.getConfig('linkManager')
@ -78,7 +102,7 @@ class CreatePage(object):
for link in lm.query(name=name):
if link.target is None:
link.update(target=page)
self.request.response.redirect('%s?mode=edit' %
self.request.response.redirect('%s/edit.html' %
absoluteURL(page, self.request))
return False
@ -96,10 +120,15 @@ class WikiPageView(WikiBaseView):
text = form.get('text')
if text and text != self.context.text:
self.context.text = text
# TODO: notify(ObjectModifiedEvent())
#self.request.response.redirect(absoluteURL(self.context, self.request))
#return False
notify(ObjectModifiedEvent(self.context))
return True
def render(self):
return self.context.render(self.request)
def edit(self):
self.mode = 'edit'
return self()
def showEditButton(self):
return self.mode != 'edit'

View file

@ -1,5 +1,5 @@
#
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
# Copyright (c) 2010 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by

View file

@ -88,6 +88,14 @@ class WikiManager(BaseWikiManager):
if uid in self.wikiUids:
self.wikiUids.remove(uid)
def renameWiki(self, wiki, newName):
intIds = self.getPlugin(IIntIds)
self.removeWiki(wiki)
intIds.unregister(wiki)
wiki.rename(newName)
intIds.register(wiki)
self.addWiki(wiki)
def listWikis(self):
for uid in self.wikiUids:
yield self.getObject(uid)
@ -114,7 +122,6 @@ class Wiki(BaseWiki):
def getPages(self):
# TODO: restrict to wiki page objects
#return dict((k, v) for k, v in self.objectItems())
return dict((k, v) for k, v in self.getItems())
def createPage(self, name, title, text=u''):

View file

@ -17,7 +17,7 @@
#
"""
Planning and recording activities (work items).
Store wiki links as tracks.
$Id$
"""
@ -91,7 +91,7 @@ class Link(BaseLink, Stateful, Track):
return component.getUtility(IStatesDefinition, name=self.statesDefinition)
class xx_LinkManager(BaseLinkManager):
class LinkManager(BaseLinkManager):
""" A tracking storage adapter managing wiki links.
"""

10
z2/browser/main.pt Normal file
View file

@ -0,0 +1,10 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"
metal:define-macro="page">
<body>
<div metal:define-slot="main" />
</body>
</html>

12
z2/browser/main_zmi.pt Normal file
View file

@ -0,0 +1,12 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"
metal:define-macro="page">
<body>
<div tal:replace="structure context/manage_tabs" />
<div metal:define-slot="main" />
</body>
</html>

View file

@ -23,10 +23,15 @@ $Id$
"""
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from cybertools.view.browser.view import BaseView, GenericView
main_page = ViewPageTemplateFile('main.pt')
zmi_page = ViewPageTemplateFile('main_zmi.pt')
class BaseView(BrowserView, BaseView):
resource_prefix = '/++resource++'

View file

@ -64,6 +64,9 @@ class GenericObject(object):
def getParent(self):
return aq_parent(aq_inner(self))
def rename(self, newName):
self.getParent().manage_renameObject(self.name, newName)
class GenericFolder(GenericObject):
""" Provide generic (i.e. dictionary-like) folder access to Zope2's