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> <body>
<div metal:fill-slot="content"> <div metal:fill-slot="main">
<metal:content use-macro="view/contentMacro" /> <metal:content use-macro="view/contentMacro" />
</div> </div>

View file

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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

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

View file

@ -37,6 +37,7 @@ class BaseView(object):
index = generic_page index = generic_page
default_template = view_macros # specify in subclass default_template = view_macros # specify in subclass
resource_prefix = '/@@/' resource_prefix = '/@@/'
mode = 'view'
def __call__(self): def __call__(self):
return self.index(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 # 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 # 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: if name in self.wikis:
del self.wikis[name] del self.wikis[name]
def renameWiki(self, wiki, newName):
del self.wikis[wiki.name]
self.wikis[newName] = wiki
wiki.rename(newName)
def listWikis(self): def listWikis(self):
return self.wikis.values() return self.wikis.values()
@ -110,7 +115,6 @@ class Wiki(BaseConfiguration):
self.name = name self.name = name
self.title = title or name self.title = title or name
self.pages = {} self.pages = {}
#self.setup()
def setup(self): def setup(self):
self.getManager().addWiki(self) self.getManager().addWiki(self)

View file

@ -8,7 +8,7 @@
<tr tal:repeat="wiki view/listWikis"> <tr tal:repeat="wiki view/listWikis">
<td> <td>
<a tal:attributes="href wiki/absolute_url" <a tal:attributes="href wiki/absolute_url"
tal:content="wiki/context/title" /> tal:content="wiki/title" />
</td> </td>
</tr> </tr>
</table> </table>
@ -24,11 +24,27 @@
</metal:content> </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"> <metal:content define-macro="wikipage">
<div metal:define-macro="edit"> <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> <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" /> <input type="hidden" name="form_action" value="edit" />
<div> <div>
<div>Title</div> <div>Title</div>
@ -49,12 +65,14 @@
</tal:edit> </tal:edit>
</div> </div>
<div metal:define-macro="show"> <div metal:define-macro="show">
<h1 tal:content="context/title">Wiki Page</h1> <h1 tal:content="context/title">Wiki Page</h1>
<div tal:content="structure view/render" /> <div tal:content="structure view/render" />
<tal:show condition="python: request.get('mode') != 'edit'"> <tal:show condition="view/showEditButton">
<div>&nbsp;</div> <div>&nbsp;</div>
<div><a href="?mode=edit">Edit</a></div> <div>
</tal:show> <a tal:attributes="href string:${context/absolute_url}/edit.html">Edit</a>
</div>
</tal:show>
</div> </div>
</metal:content> </metal:content>

View file

@ -25,6 +25,8 @@ $Id$
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope import component from zope import component
from zope.event import notify
from zope.lifecycleevent import ObjectModifiedEvent
from zope.traversing.browser import absoluteURL from zope.traversing.browser import absoluteURL
from cybertools.link.interfaces import ILinkManager from cybertools.link.interfaces import ILinkManager
@ -64,6 +66,27 @@ class WikiView(WikiBaseView):
return self.context.listPages() 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): class CreatePage(object):
def update(self): def update(self):
@ -71,6 +94,7 @@ class CreatePage(object):
name = form.get('name') name = form.get('name')
title = name title = name
page = self.context.createPage(name, title) page = self.context.createPage(name, title)
notify(ObjectModifiedEvent(page))
# record in LinkManager # record in LinkManager
manager = self.context.getManager() manager = self.context.getManager()
lmName = self.context.getConfig('linkManager') lmName = self.context.getConfig('linkManager')
@ -78,7 +102,7 @@ class CreatePage(object):
for link in lm.query(name=name): for link in lm.query(name=name):
if link.target is None: if link.target is None:
link.update(target=page) link.update(target=page)
self.request.response.redirect('%s?mode=edit' % self.request.response.redirect('%s/edit.html' %
absoluteURL(page, self.request)) absoluteURL(page, self.request))
return False return False
@ -96,10 +120,15 @@ class WikiPageView(WikiBaseView):
text = form.get('text') text = form.get('text')
if text and text != self.context.text: if text and text != self.context.text:
self.context.text = text self.context.text = text
# TODO: notify(ObjectModifiedEvent()) notify(ObjectModifiedEvent(self.context))
#self.request.response.redirect(absoluteURL(self.context, self.request))
#return False
return True return True
def render(self): def render(self):
return self.context.render(self.request) 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 # 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 # 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: if uid in self.wikiUids:
self.wikiUids.remove(uid) 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): def listWikis(self):
for uid in self.wikiUids: for uid in self.wikiUids:
yield self.getObject(uid) yield self.getObject(uid)
@ -114,7 +122,6 @@ class Wiki(BaseWiki):
def getPages(self): def getPages(self):
# TODO: restrict to wiki page objects # 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()) return dict((k, v) for k, v in self.getItems())
def createPage(self, name, title, text=u''): 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$ $Id$
""" """
@ -91,7 +91,7 @@ class Link(BaseLink, Stateful, Track):
return component.getUtility(IStatesDefinition, name=self.statesDefinition) return component.getUtility(IStatesDefinition, name=self.statesDefinition)
class xx_LinkManager(BaseLinkManager): class LinkManager(BaseLinkManager):
""" A tracking storage adapter managing wiki links. """ 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 import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from cybertools.view.browser.view import BaseView, GenericView from cybertools.view.browser.view import BaseView, GenericView
main_page = ViewPageTemplateFile('main.pt')
zmi_page = ViewPageTemplateFile('main_zmi.pt')
class BaseView(BrowserView, BaseView): class BaseView(BrowserView, BaseView):
resource_prefix = '/++resource++' resource_prefix = '/++resource++'

View file

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