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:
helmutm 2008-06-12 06:31:29 +00:00
parent 580838acb8
commit 878e18d244
8 changed files with 117 additions and 19 deletions

View file

@ -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

View file

@ -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
View file

@ -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
View file

@ -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')

View file

@ -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
View 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 = ()

View file

@ -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):

View file

@ -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)