diff --git a/expert/field.py b/expert/field.py index 5c52525..d386298 100644 --- a/expert/field.py +++ b/expert/field.py @@ -21,6 +21,7 @@ Field definitions for reports. """ from cybertools.composer.report.field import Field +from loops.common import baseObject from loops import util @@ -39,7 +40,8 @@ class UrlField(Field): def getDisplayValue(self, row): nv = row.parent.context.view.nodeView - return dict(title=self.getValue(row), url=nv.getUrlForTarget(row.context)) + return dict(title=self.getValue(row), + url=nv.getUrlForTarget(baseObject(row.context))) class TargetField(Field): diff --git a/external/element.py b/external/element.py index b9eac6d..7ce33fc 100644 --- a/external/element.py +++ b/external/element.py @@ -90,10 +90,12 @@ class ConceptElement(Element): type = loader.concepts[self['type']] kw = dict((k, v) for k, v in self.items() if k not in self.posArgs) - # use IInstance adapter (name='editor') for unmarshalling values - #self.object = loader.addConcept(self['name'], self['title'], type, **kw) self.object = loader.addConcept(self['name'], self['title'], type) formState = self.getInstance().applyTemplate(data=kw, ignoreValidation=True) + # simple hack for resolving interface definition: + pi = self.get('predicateInterface') + if pi is not None: + adapted(self.object).predicateInterface = resolve(pi) def getInstance(self, omit=['title']): adObject = adapted(self.object) @@ -126,6 +128,9 @@ class TypeElement(ConceptElement): loader.typeConcept, **kw) instance = self.getInstance(omit=['title', 'typeInterface']) formState = instance.applyTemplate(data=kw, ignoreValidation=True) + if ti: + # overwrite type interface, might have been ignored in addConcept + adapted(self.object).typeInterface = kw['typeInterface'] class ChildElement(Element): diff --git a/tests/setup.py b/tests/setup.py index 9bd43bd..77250d3 100644 --- a/tests/setup.py +++ b/tests/setup.py @@ -14,6 +14,8 @@ from zope.app.catalog.text import TextIndex from zope.app.container.interfaces import IObjectRemovedEvent from zope.app.principalannotation import PrincipalAnnotationUtility from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility +from zope.app.renderer.rest import IReStructuredTextSource,\ + ReStructuredTextToHTMLRenderer, ReStructuredTextSourceFactory from zope.app.security.principalregistry import principalRegistry from zope.app.security.interfaces import IAuthentication from zope.app.securitypolicy.zopepolicy import ZopeSecurityPolicy @@ -122,8 +124,13 @@ class TestSite(object): component.provideUtility(principalRegistry, IAuthentication) component.provideAdapter(session.ClientId) component.provideAdapter(session.Session) - component.provideUtility(session.RAMSessionDataContainer(), ISessionDataContainer) + component.provideUtility(session.RAMSessionDataContainer(), + ISessionDataContainer) component.provideUtility(ClientIdManager()) + component.provideUtility(ReStructuredTextSourceFactory, + name='zope.source.rest') + component.provideAdapter(ReStructuredTextToHTMLRenderer, + (IReStructuredTextSource, IBrowserRequest), Interface) component.provideAdapter(LoopsType) component.provideAdapter(ConceptType)