work in progress: predicate adapters; import bug fix: import of child relations now OK
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2705 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									580838acb8
								
							
						
					
					
						commit
						878e18d244
					
				
					 8 changed files with 117 additions and 19 deletions
				
			
		|  | @ -213,7 +213,7 @@ class NameChooser(BaseNameChooser): | |||
|         '\xc4': 'Ae', '\xe4': 'ae', '\xd6': 'Oe', '\xf6': 'oe', | ||||
|         '\xdc': 'Ue', '\xfc': 'ue', '\xdf': 'ss'} | ||||
| 
 | ||||
| # caching | ||||
| # caching (TBD) | ||||
| 
 | ||||
| def cached(obj): | ||||
|     return obj | ||||
|  |  | |||
|  | @ -250,6 +250,14 @@ | |||
|              set_schema="loops.interfaces.ITypeConcept" /> | ||||
|   </class> | ||||
| 
 | ||||
|   <adapter factory="loops.predicate.Predicate" trusted="True" /> | ||||
|   <class class="loops.predicate.Predicate"> | ||||
|     <require permission="zope.View" | ||||
|              interface="loops.interfaces.IPredicate" /> | ||||
|     <require permission="zope.ManageContent" | ||||
|              set_schema="loops.interfaces.IPredicate" /> | ||||
|   </class> | ||||
| 
 | ||||
|   <adapter factory="loops.query.QueryConcept" trusted="True" /> | ||||
|   <class class="loops.query.QueryConcept"> | ||||
|     <require permission="zope.View" | ||||
|  |  | |||
							
								
								
									
										3
									
								
								external/base.py
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								external/base.py
									
										
									
									
										vendored
									
									
								
							|  | @ -25,7 +25,7 @@ $Id$ | |||
| 
 | ||||
| from cStringIO import StringIO | ||||
| import itertools | ||||
| import os | ||||
| import os, sys | ||||
| import zdaemon | ||||
| from zope import component | ||||
| from zope.cachedescriptors.property import Lazy | ||||
|  | @ -77,6 +77,7 @@ class Loader(Base, SetupManager): | |||
|     def __init__(self, context, resourceDirectory=None): | ||||
|         super(Loader, self).__init__(context, resourceDirectory) | ||||
|         self.logger = StringIO() | ||||
|         #self.logger = sys.stdout | ||||
| 
 | ||||
|     def load(self, elements): | ||||
|         for element in elements: | ||||
|  |  | |||
							
								
								
									
										15
									
								
								external/element.py
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								external/element.py
									
										
									
									
										vendored
									
									
								
							|  | @ -116,7 +116,7 @@ class ChildElement(Element): | |||
|         for idx, arg in enumerate(args): | ||||
|             self[self.posArgs[idx]] = arg | ||||
| 
 | ||||
|     def __call__(self, loader): | ||||
|     def execute(self, loader): | ||||
|         loader.assignChild(self['first'], self['second'], self['predicate']) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -174,14 +174,14 @@ class NodeElement(Element): | |||
|     def execute(self, loader): | ||||
|         type = self['type'] | ||||
|         cont = traverse(loader.views, self['path']) | ||||
|         target = self.pop('target', None) | ||||
|         #target = self.pop('target', None) | ||||
|         kw = dict((k, v) for k, v in self.items() | ||||
|                          if k not in self.posArgs) | ||||
|         node = loader.addNode(self['name'], self['title'], cont, type, **kw) | ||||
|         if target is not None: | ||||
|             targetObject = traverse(loader.context, target, None) | ||||
|             node.target = targetObject | ||||
|         self.object = node | ||||
|         #if target is not None: | ||||
|         #    targetObject = traverse(loader.context, target, None) | ||||
|         #    node.target = targetObject | ||||
|         #self.object = node | ||||
| 
 | ||||
| 
 | ||||
| # element registry | ||||
|  | @ -196,4 +196,5 @@ elementTypes = dict( | |||
|     I18NValue=I18NValue, | ||||
| ) | ||||
| 
 | ||||
| toplevelElements = ('type', 'concept', 'resource', 'resourceRelation', 'node') | ||||
| toplevelElements = ('type', 'concept', 'resource', | ||||
|                     'child', 'resourceRelation', 'node') | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| # | ||||
| #  Copyright (c) 2004 Helmut Merz helmutm@cy55.de | ||||
| #  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 | ||||
|  | @ -611,7 +611,6 @@ class IIndexAttributes(Interface): | |||
| 
 | ||||
| # types stuff | ||||
| 
 | ||||
| #class ITypeConcept(Interface): | ||||
| class ITypeConcept(IConceptSchema): | ||||
|     """ Concepts of type 'type' should be adaptable to this interface. | ||||
|     """ | ||||
|  | @ -641,6 +640,21 @@ class ITypeConcept(IConceptSchema): | |||
|     # storage = schema.Choice() | ||||
| 
 | ||||
| 
 | ||||
| class IPredicate(IConceptSchema): | ||||
|     """ Provided by predicates (predicate concepts that specify relation types), | ||||
|         i.e. concepts of type 'predicate' should be adaptable to this interface. | ||||
|     """ | ||||
| 
 | ||||
|     typeInterface = schema.TextLine(    #schema.Choice | ||||
|         title=_(u'Type Interface'), | ||||
|         description=_(u'Optional: allows specification of additional ' | ||||
|                     'attributes of relations that are instances of this ' | ||||
|                     'predicate.'), | ||||
|         default=u'',    #None | ||||
|         #source="loops.TypeInterfaceSource", | ||||
|         required=False) | ||||
| 
 | ||||
| 
 | ||||
| class IResourceAdapter(IBaseResourceSchema): | ||||
|     """ Base interface for adapters for resources. This is the base interface | ||||
|         of the interfaces to be used as typeInterface attribute on type concepts | ||||
|  |  | |||
							
								
								
									
										58
									
								
								predicate.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								predicate.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | |||
| # | ||||
| #  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 | ||||
| # | ||||
| 
 | ||||
| """ | ||||
| Predicate management. | ||||
| 
 | ||||
| $Id$ | ||||
| """ | ||||
| 
 | ||||
| from zope import component, schema | ||||
| from zope.component import adapts | ||||
| from zope.interface import implements | ||||
| from zope.cachedescriptors.property import Lazy | ||||
| from zope.dottedname.resolve import resolve | ||||
| from zope.security.proxy import removeSecurityProxy | ||||
| from zope.traversing.api import getName | ||||
| 
 | ||||
| from loops.interfaces import ILoopsObject, IConcept, IResource | ||||
| from loops.interfaces import IPredicate | ||||
| from loops.concept import Concept | ||||
| from loops.common import AdapterBase | ||||
| from loops.type import TypeInterfaceSourceList as BaseTypeInterfaceSourceList | ||||
| 
 | ||||
| 
 | ||||
| BaseTypeInterfaceSourceList.typeInterfaces += (IPredicate,) | ||||
| 
 | ||||
| 
 | ||||
| class Predicate(AdapterBase): | ||||
|     """ typeInterface adapter for concepts of type 'predicate'. | ||||
|     """ | ||||
| 
 | ||||
|     implements(IPredicate) | ||||
| 
 | ||||
|     _contextAttributes = list(IPredicate) + list(IConcept) | ||||
| 
 | ||||
| 
 | ||||
| class TypeInterfaceSourceList(BaseTypeInterfaceSourceList): | ||||
|     """ Collects type interfaces for predicates, i.e. interfaces that | ||||
|         may be used for specifying additional attributes of relations. | ||||
|     """ | ||||
| 
 | ||||
|     typeInterfaces = () | ||||
| 
 | ||||
							
								
								
									
										30
									
								
								setup.py
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								setup.py
									
										
									
									
									
								
							|  | @ -28,7 +28,7 @@ from zope import component | |||
| from zope.cachedescriptors.property import Lazy | ||||
| from zope.component import adapts | ||||
| from zope.interface import implements, Interface | ||||
| from zope.traversing.api import getName | ||||
| from zope.traversing.api import getName, traverse | ||||
| 
 | ||||
| from cybertools.typology.interfaces import IType | ||||
| from loops.common import adapted | ||||
|  | @ -160,10 +160,12 @@ class SetupManager(object): | |||
|         concept = self.concepts[conceptName] | ||||
|         child = self.concepts[childName] | ||||
|         if child in concept.getChildren([predicate]): | ||||
|             self.log("Concept '%s' is already a child of '%s with predicate '%s'.'" % | ||||
|             self.log("Concept '%s' is already a child of '%s' with predicate '%s'.'" % | ||||
|                      (childName, conceptName, getName(predicate))) | ||||
|         else: | ||||
|             concept.assignChild(child, predicate) | ||||
|             self.log("Concept '%s' assigned to '%s with predicate '%s'.'" % | ||||
|                      (childName, conceptName, getName(predicate))) | ||||
| 
 | ||||
|     def addResource(self, name, title, resourceType, description=u'', **kw): | ||||
|         if name in self.resources: | ||||
|  | @ -187,13 +189,15 @@ class SetupManager(object): | |||
|         concept = self.concepts[conceptName] | ||||
|         resource = self.resources[resourceName] | ||||
|         if resource in concept.getResources([predicate]): | ||||
|             self.log("Concept '%s' is already assigned to '%s with predicate '%s'.'" % | ||||
|                      (conceptName, resourceName, getName(predicate))) | ||||
|             self.log("Resource '%s' is already assigned to '%s with predicate '%s'.'" % | ||||
|                      (resourceName, conceptName, getName(predicate))) | ||||
|         else: | ||||
|             concept.assignResource(resource, predicate) | ||||
|             self.log("Resource '%s' assigned to '%s with predicate '%s'.'" % | ||||
|                      (resourceName, conceptName, getName(predicate))) | ||||
| 
 | ||||
|     def addNode(self, name, title, container=None, nodeType='page', | ||||
|                 description=u'', body=u'', targetName=None, **kw): | ||||
|                 description=u'', body=u'', target=None, **kw): | ||||
|         if container is None: | ||||
|             container = self.views | ||||
|             nodeType = 'menu' | ||||
|  | @ -209,9 +213,19 @@ class SetupManager(object): | |||
|                               description=description, body=body, | ||||
|                               nodeType=nodeType, **kw) | ||||
|             self.log("Node '%s' ('%s') created." % (name, title)) | ||||
|         if targetName is not None: | ||||
|             if targetName in self.concepts: | ||||
|                 n.target = self.concepts[targetName] | ||||
|         if target is not None: | ||||
|             targetObject = traverse(self, target, None) | ||||
|             if targetObject is not None: | ||||
|                 if n.target == targetObject: | ||||
|                     self.log("Target '%s' already assigned to node '%s'." % | ||||
|                              (target, name)) | ||||
|                 else: | ||||
|                     n.target = targetObject | ||||
|                     self.log("Target '%s' assigned to node '%s'." % | ||||
|                              (target, name)) | ||||
|             else: | ||||
|                 self.log("Target '%s' for '%s' does not exist." % | ||||
|                          (target, name)) | ||||
|         return n | ||||
| 
 | ||||
|     def log(self, message): | ||||
|  |  | |||
|  | @ -54,6 +54,7 @@ from loops.interfaces import ILoopsObject, IIndexAttributes | |||
| from loops.interfaces import IDocument, IFile, ITextDocument | ||||
| from loops.organize.memberinfo import MemberInfoProvider | ||||
| from loops.organize.stateful.base import StatefulResourceIndexInfo, handleTransition | ||||
| from loops.predicate import Predicate | ||||
| from loops.query import QueryConcept | ||||
| from loops.query import QueryConcept | ||||
| from loops.resource import Resource, FileAdapter, TextDocumentAdapter | ||||
|  | @ -110,6 +111,7 @@ class TestSite(object): | |||
| 
 | ||||
|         component.provideAdapter(LoopsType) | ||||
|         component.provideAdapter(ConceptType) | ||||
|         component.provideAdapter(Predicate) | ||||
|         component.provideAdapter(ResourceType, (IDocument,)) | ||||
|         component.provideAdapter(TypeConcept) | ||||
|         component.provideAdapter(QueryConcept) | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm