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:
parent
3f1a3cd08f
commit
b1a231f40e
16 changed files with 117 additions and 27 deletions
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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" />
|
||||||
|
|
|
@ -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>
|
||||||
|
|
BIN
view/browser/liquid/logo.png
Normal file
BIN
view/browser/liquid/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
|
@ -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">
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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> </div>
|
<div> </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>
|
||||||
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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''):
|
||||||
|
|
|
@ -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
10
z2/browser/main.pt
Normal 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
12
z2/browser/main_zmi.pt
Normal 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>
|
|
@ -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++'
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue