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:
		
							parent
							
								
									3524ab83be
								
							
						
					
					
						commit
						ebefd631a2
					
				
					 6 changed files with 148 additions and 5 deletions
				
			
		| 
						 | 
					@ -221,6 +221,15 @@
 | 
				
			||||||
      permission="zope.View"
 | 
					      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 -->
 | 
					  <!-- resource manager -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <addform
 | 
					  <addform
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										57
									
								
								browser/folder.py
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								browser/folder.py
									
										
									
									
									
										Executable 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 []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										71
									
								
								helpers.txt
									
										
									
									
									
								
							
							
						
						
									
										71
									
								
								helpers.txt
									
										
									
									
									
								
							| 
						 | 
					@ -280,6 +280,13 @@ i.e. the 'topic' concept, via an adapter:
 | 
				
			||||||
  >>> ITopic.providedBy(cc1Adapter)
 | 
					  >>> ITopic.providedBy(cc1Adapter)
 | 
				
			||||||
  True
 | 
					  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
 | 
					Simple access to type information with BaseView
 | 
				
			||||||
-----------------------------------------------
 | 
					-----------------------------------------------
 | 
				
			||||||
| 
						 | 
					@ -299,8 +306,8 @@ context object's type:
 | 
				
			||||||
  <Topic object ...>
 | 
					  <Topic object ...>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Concepts as queries
 | 
					Concepts as Queries
 | 
				
			||||||
-------------------
 | 
					===================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
We first have to set up the query type, i.e. a type concept associated
 | 
					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
 | 
					with the IQueryConcept interface. The query type concept itself has already
 | 
				
			||||||
| 
						 | 
					@ -348,8 +355,8 @@ view/multi-adapter with this name:
 | 
				
			||||||
  <class 'SimpleView'>
 | 
					  <class 'SimpleView'>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Controlling presentation using view properties
 | 
					Controlling Presentation Using View Properties
 | 
				
			||||||
----------------------------------------------
 | 
					==============================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  >>> from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations
 | 
					  >>> from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations
 | 
				
			||||||
  >>> from zope.annotation.attribute import AttributeAnnotations
 | 
					  >>> from zope.annotation.attribute import AttributeAnnotations
 | 
				
			||||||
| 
						 | 
					@ -405,3 +412,59 @@ browser).
 | 
				
			||||||
  >>> controller = Controller(view, request)
 | 
					  >>> controller = Controller(view, request)
 | 
				
			||||||
  >>> controller.skinName.value
 | 
					  >>> controller.skinName.value
 | 
				
			||||||
  'SuperSkin'
 | 
					  '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()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,6 @@ from zope import schema
 | 
				
			||||||
from zope.app.container.constraints import contains, containers
 | 
					from zope.app.container.constraints import contains, containers
 | 
				
			||||||
from zope.app.container.interfaces import IContainer, IOrderedContainer
 | 
					from zope.app.container.interfaces import IContainer, IOrderedContainer
 | 
				
			||||||
from zope.app.file.interfaces import IImage as IBaseAsset
 | 
					from zope.app.file.interfaces import IImage as IBaseAsset
 | 
				
			||||||
from zope.app.folder.interfaces import IFolder
 | 
					 | 
				
			||||||
from zope.component.interfaces import IObjectEvent
 | 
					from zope.component.interfaces import IObjectEvent
 | 
				
			||||||
from zope.size.interfaces import ISized
 | 
					from zope.size.interfaces import ISized
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -17,6 +17,9 @@ msgstr "Begriff"
 | 
				
			||||||
msgid "Resource"
 | 
					msgid "Resource"
 | 
				
			||||||
msgstr "Ressource"
 | 
					msgstr "Ressource"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Folder"
 | 
				
			||||||
 | 
					msgstr "Ordner"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Log out"
 | 
					msgid "Log out"
 | 
				
			||||||
msgstr "Abmelden"
 | 
					msgstr "Abmelden"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +35,18 @@ msgstr "Ressource anlegen..."
 | 
				
			||||||
msgid "Create a new resource object."
 | 
					msgid "Create a new resource object."
 | 
				
			||||||
msgstr "Eine neue Ressource erzeugen"
 | 
					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..."
 | 
					msgid "Edit Blog Post..."
 | 
				
			||||||
msgstr "Eintrag bearbeiten..."
 | 
					msgstr "Eintrag bearbeiten..."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue