added view and actions for a pseudo-folder concept type

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2457 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-03-16 21:11:08 +00:00
parent 3524ab83be
commit ebefd631a2
6 changed files with 148 additions and 5 deletions

View file

@ -221,6 +221,15 @@
permission="zope.View"
/>
<zope:adapter
name="folder.html"
for="loops.interfaces.IConcept
zope.publisher.interfaces.browser.IBrowserRequest"
provides="zope.interface.Interface"
factory="loops.browser.folder.FolderView"
permission="zope.View"
/>
<!-- resource manager -->
<addform

57
browser/folder.py Executable file
View file

@ -0,0 +1,57 @@
#
# Copyright (c) 2008 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Elements for handling and presentation of pseudo folders.
$Id$
"""
from cybertools.browser.action import actions
from loops.browser.action import DialogAction
from loops.browser.concept import ConceptView
from loops.util import _
actions.register('createFolder', 'portlet', DialogAction,
title=_(u'Create Folder...'),
description=_(u'Create a new folder.'),
viewName='create_concept.html',
dialogName='createFolder',
typeToken='.loops/concepts/folder',
fixedType=True,
innerForm='inner_concept_form.html',
)
actions.register('editFolder', 'portlet', DialogAction,
title=_(u'Edit Folder...'),
description=_(u'Modify folder.'),
viewName='edit_concept.html',
dialogName='editFolder',
)
class FolderView(ConceptView):
def getActions(self, category='concept', page=None):
if category == 'portlet':
return actions.get(category, ['createFolder', 'editFolder'],
view=self, page=page)
return []

View file

@ -280,6 +280,13 @@ i.e. the 'topic' concept, via an adapter:
>>> ITopic.providedBy(cc1Adapter)
True
There is a shortcut to getting the typeInterface adapter for an object.
>>> from loops.common import adapted
>>> cc1Adapter = adapted(cc1)
>>> ITopic.providedBy(cc1Adapter)
True
Simple access to type information with BaseView
-----------------------------------------------
@ -299,8 +306,8 @@ context object's type:
<Topic object ...>
Concepts as queries
-------------------
Concepts as Queries
===================
We first have to set up the query type, i.e. a type concept associated
with the IQueryConcept interface. The query type concept itself has already
@ -348,8 +355,8 @@ view/multi-adapter with this name:
<class 'SimpleView'>
Controlling presentation using view properties
----------------------------------------------
Controlling Presentation Using View Properties
==============================================
>>> from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations
>>> from zope.annotation.attribute import AttributeAnnotations
@ -405,3 +412,59 @@ browser).
>>> controller = Controller(view, request)
>>> controller.skinName.value
'SuperSkin'
Folders
=======
We may provide a concept type called a folder - there is no special
functionality about it but it may be used for building a pseudo hierarchy
using nested folders. This may make it easier for users to map the
structures of their documents in the filesystem to the loops concept
map.
>>> from loops.setup import addAndConfigureObject
>>> tFolder = addAndConfigureObject(concepts, Concept, 'folder',
... title=u'Folder', conceptType=typeObject)
Usually we want to create folders only in objects of a certain type,
e.g. in a domain. So we activate the folder creation action by providing
the domain type with a corresponding option.
>>> tDomain = concepts['domain']
>>> taDomain = adapted(tDomain)
>>> taDomain.options = ['action.portlet:createFolder']
Importing the FolderView will register this action.
>>> from loops.browser.folder import FolderView
If we now create a domain and set up a view on it it will provide the
folder creation action.
>>> general = addAndConfigureObject(concepts, Concept, 'general',
... title=u'General', conceptType=tDomain)
>>> from loops.browser.concept import ConceptView
>>> view = ConceptView(general, TestRequest())
>>> sorted(a.name for a in view.getActions('portlet'))
['createFolder']
Let's now create a folder.
>>> f01 = addAndConfigureObject(concepts, Concept, 'f01',
... title=u'Test Folder', conceptType=tFolder)
A folder should be associated with a FolderView that provides two actions
for editing the folder and for creating a new subfolder.
>>> view = FolderView(f01, TestRequest())
>>> sorted(a.name for a in view.getActions('portlet'))
['createFolder', 'editFolder']
Fin de partie
=============
>>> placefulTearDown()

View file

@ -28,7 +28,6 @@ from zope import schema
from zope.app.container.constraints import contains, containers
from zope.app.container.interfaces import IContainer, IOrderedContainer
from zope.app.file.interfaces import IImage as IBaseAsset
from zope.app.folder.interfaces import IFolder
from zope.component.interfaces import IObjectEvent
from zope.size.interfaces import ISized

Binary file not shown.

View file

@ -17,6 +17,9 @@ msgstr "Begriff"
msgid "Resource"
msgstr "Ressource"
msgid "Folder"
msgstr "Ordner"
msgid "Log out"
msgstr "Abmelden"
@ -32,6 +35,18 @@ msgstr "Ressource anlegen..."
msgid "Create a new resource object."
msgstr "Eine neue Ressource erzeugen"
msgid "Create Folder..."
msgstr "Ordner anlegen..."
msgid "Create a new folder."
msgstr "Einen neuen Ordner anlegen"
msgid "Edit Folder..."
msgstr "Ordner bearbeiten..."
msgid "Modify folder."
msgstr "Ordner ändern"
msgid "Edit Blog Post..."
msgstr "Eintrag bearbeiten..."