Merge branch 'master' into bbmaster

This commit is contained in:
Helmut Merz 2012-01-19 18:18:56 +01:00
commit 335c52e3cb
8 changed files with 78 additions and 21 deletions

View file

@ -28,7 +28,6 @@
<div metal:use-macro="views/node_macros/object_actions" /> <div metal:use-macro="views/node_macros/object_actions" />
</tal:actions> </tal:actions>
<h1 tal:attributes="ondblclick item/openEditWindow"> <h1 tal:attributes="ondblclick item/openEditWindow">
<a name="top" />
<a tal:omit-tag="python: level > 1" <a tal:omit-tag="python: level > 1"
tal:attributes="href request/URL" tal:attributes="href request/URL"
tal:content="item/title">Title</a> tal:content="item/title">Title</a>

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de # Copyright (c) 2012 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
@ -18,8 +18,6 @@
""" """
Definition of the Concept and related classes. Definition of the Concept and related classes.
$Id$
""" """
from zope import component, schema from zope import component, schema
@ -209,9 +207,26 @@ class Concept(Contained, Persistent):
return [r.first for r in self.getParentRelations(predicates, sort=sort, return [r.first for r in self.getParentRelations(predicates, sort=sort,
noSecurityCheck=noSecurityCheck)] noSecurityCheck=noSecurityCheck)]
def assignChild(self, concept, predicate=None, order=0, relevance=1.0): def checkPredicate(self, child, predicate=None):
cm = self.getConceptManager()
defaultPredicate = cm.getDefaultPredicate()
if predicate is None: if predicate is None:
predicate = self.getConceptManager().getDefaultPredicate() predicate = defaultPredicate
if predicate == defaultPredicate:
subtypePred = cm.get('issubtype')
if subtypePred is not None:
subtypeRels = list(self.conceptType.getChildRelations(
[subtypePred], child.conceptType))
if subtypeRels:
from loops.predicate import adaptedRelation
rel = adaptedRelation(subtypeRels[0])
predName = rel.usePredicate
if predName and predName != u'standard':
predicate = cm[predName]
return predicate
def assignChild(self, concept, predicate=None, order=0, relevance=1.0):
predicate = self.checkPredicate(concept, predicate)
registry = component.getUtility(IRelationRegistry) registry = component.getUtility(IRelationRegistry)
rel = ConceptRelation(self, concept, predicate) rel = ConceptRelation(self, concept, predicate)
if order != 0: if order != 0:

View file

@ -263,6 +263,15 @@
set_schema="loops.interfaces.IPredicate" /> set_schema="loops.interfaces.IPredicate" />
</class> </class>
<adapter factory="loops.predicate.IsSubtype"
provides="loops.interfaces.IIsSubtype" trusted="True" />
<class class="loops.predicate.IsSubtype">
<require permission="zope.View"
interface="loops.interfaces.IIsSubtype" />
<require permission="zope.ManageContent"
set_schema="loops.interfaces.IIsSubtype" />
</class>
<!--<adapter factory="loops.predicate.MappingAttributeRelation" trusted="True" /> <!--<adapter factory="loops.predicate.MappingAttributeRelation" trusted="True" />
<class class="loops.predicate.MappingAttributeRelation"> <class class="loops.predicate.MappingAttributeRelation">
<require permission="zope.View" <require permission="zope.View"

19
external/element.py vendored
View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de # Copyright (c) 2012 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
@ -19,8 +19,6 @@
""" """
Basic implementation of the elements used for the intermediate format for export Basic implementation of the elements used for the intermediate format for export
and import of loops objects. and import of loops objects.
$Id$
""" """
import os import os
@ -38,6 +36,7 @@ from loops.interfaces import IConceptSchema
from loops.external.interfaces import IElement from loops.external.interfaces import IElement
from loops.i18n.common import I18NValue from loops.i18n.common import I18NValue
from loops.layout.base import LayoutNode from loops.layout.base import LayoutNode
from loops.predicate import adaptedRelation
from loops.view import Node from loops.view import Node
@ -138,14 +137,26 @@ class ChildElement(Element):
elementType = 'child' elementType = 'child'
posArgs = ('first', 'second', 'predicate', 'order', 'relevance') posArgs = ('first', 'second', 'predicate', 'order', 'relevance')
def __init__(self, *args): def __init__(self, *args, **kw):
for idx, arg in enumerate(args): for idx, arg in enumerate(args):
self[self.posArgs[idx]] = arg self[self.posArgs[idx]] = arg
for k, v in kw.items():
self[k] = v
def execute(self, loader): def execute(self, loader):
loader.assignChild(self['first'], self['second'], self['predicate'], loader.assignChild(self['first'], self['second'], self['predicate'],
order = self.get('order') or 0, order = self.get('order') or 0,
relevance = self.get('relevance') or 1.0) relevance = self.get('relevance') or 1.0)
additionalParams = [(k, v) for k, v in self.items()
if k not in self.posArgs]
if additionalParams:
pred = loader.getPredicate(self['predicate'])
first = loader.concepts[self['first']]
second = loader.concepts[self['second']]
relation = first.getChildRelations([pred], child=second)[0]
adaptedRel = adaptedRelation(relation)
for attr, value in additionalParams:
setattr(adaptedRel, attr, value)
class ResourceElement(Element): class ResourceElement(Element):

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de # Copyright (c) 2012 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
@ -18,8 +18,6 @@
""" """
loops interface definitions. loops interface definitions.
$Id$
""" """
from zope.interface import Interface, Attribute from zope.interface import Interface, Attribute
@ -761,6 +759,16 @@ class IRelationAdapter(Interface):
""" """
class IIsSubtype(IRelationAdapter):
usePredicate = schema.TextLine(
title=_(u'Use Predicate'),
description=_(u'The name of the predicate that should be used'
u'for relations between concepts of these types.'),
default=u'standard',
required=False)
# probably not useful # probably not useful
class xxIMappingAttributeRelation(IConceptSchema): class xxIMappingAttributeRelation(IConceptSchema):
""" A relation based on a predicate ('mappingAttribute') that provides """ A relation based on a predicate ('mappingAttribute') that provides

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de # Copyright (c) 2012 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
@ -18,8 +18,6 @@
""" """
Definition and management of special predicates and corresponding relations. Definition and management of special predicates and corresponding relations.
$Id$
""" """
from zope import component, schema from zope import component, schema
@ -31,7 +29,8 @@ from zope.security.proxy import removeSecurityProxy
from zope.traversing.api import getName from zope.traversing.api import getName
from loops.interfaces import ILoopsObject, IConcept, IResource, IConceptRelation from loops.interfaces import ILoopsObject, IConcept, IResource, IConceptRelation
from loops.interfaces import IPredicate, IRelationAdapter #, IMappingAttributeRelation from loops.interfaces import IPredicate, IRelationAdapter
from loops.interfaces import IIsSubtype #, IMappingAttributeRelation
from loops.concept import Concept from loops.concept import Concept
from loops.common import adapted, AdapterBase from loops.common import adapted, AdapterBase
from loops.type import TypeInterfaceSourceList from loops.type import TypeInterfaceSourceList
@ -89,8 +88,20 @@ def adaptedRelation(relation):
# standard relation adapters # standard relation adapters
#PredicateInterfaceSourceList.predicateInterfaces += (IMappingAttributeRelation,) PredicateInterfaceSourceList.predicateInterfaces += (
IIsSubtype,)
class IsSubtype(RelationAdapter):
""" Allows specification of a predicate for relations between concepts
of certain types.
"""
implements(IIsSubtype)
_contextAttributes = list(IIsSubtype)
#PredicateInterfaceSourceList.predicateInterfaces += (IMappingAttributeRelation,)
#class MappingAttributeRelation(AdapterBase): #class MappingAttributeRelation(AdapterBase):

View file

@ -110,8 +110,9 @@ class DataTableSourceBinder(object):
def __init__(self, tableName): def __init__(self, tableName):
self.tableName = tableName self.tableName = tableName
def __call__(self, context): def __call__(self, instance):
context = baseObject(context) #context = baseObject(instance.context)
context = instance.view.nodeView.context
dt = context.getLoopsRoot().getConceptManager()[self.tableName] dt = context.getLoopsRoot().getConceptManager()[self.tableName]
return DataTableSourceList(adapted(dt)) return DataTableSourceList(adapted(dt))

View file

@ -64,10 +64,12 @@ from loops.config.base import GlobalOptions, LoopsOptions
from loops.config.base import QueryOptions, PredicateOptions, TypeOptions from loops.config.base import QueryOptions, PredicateOptions, TypeOptions
from loops.interfaces import ILoopsObject, IIndexAttributes from loops.interfaces import ILoopsObject, IIndexAttributes
from loops.interfaces import IDocument, IFile, ITextDocument from loops.interfaces import IDocument, IFile, ITextDocument
from loops.interfaces import IIsSubtype
from loops.layout.base import LayoutNode from loops.layout.base import LayoutNode
from loops.organize.memberinfo import MemberInfoProvider from loops.organize.memberinfo import MemberInfoProvider
from loops.organize.stateful.base import StatefulResourceIndexInfo, handleTransition from loops.organize.stateful.base import StatefulResourceIndexInfo, handleTransition
from loops.predicate import Predicate #, MappingAttributeRelation from loops.predicate import Predicate
from loops.predicate import IsSubtype#, MappingAttributeRelation
from loops.expert.concept import QueryConcept from loops.expert.concept import QueryConcept
from loops.resource import Resource, FileAdapter, TextDocumentAdapter from loops.resource import Resource, FileAdapter, TextDocumentAdapter
from loops.resource import Document, MediaAsset from loops.resource import Document, MediaAsset
@ -135,6 +137,7 @@ class TestSite(object):
component.provideAdapter(LoopsType) component.provideAdapter(LoopsType)
component.provideAdapter(ConceptType) component.provideAdapter(ConceptType)
component.provideAdapter(Predicate) component.provideAdapter(Predicate)
component.provideAdapter(IsSubtype, provides=IIsSubtype)
#component.provideAdapter(MappingAttributeRelation) #component.provideAdapter(MappingAttributeRelation)
component.provideAdapter(ResourceType, (IDocument,)) component.provideAdapter(ResourceType, (IDocument,))
component.provideAdapter(TypeConcept) component.provideAdapter(TypeConcept)