diff --git a/browser/common.py b/browser/common.py index adc9b4f..3f1033c 100644 --- a/browser/common.py +++ b/browser/common.py @@ -28,6 +28,7 @@ from zope.app.form.browser.interfaces import ITerms from zope.app.i18n.interfaces import ITranslationDomain from zope.app.security.interfaces import IAuthentication from zope.app.pagetemplate import ViewPageTemplateFile +from zope.app.security.interfaces import PrincipalLookupError from zope.cachedescriptors.property import Lazy from zope.dottedname.resolve import resolve from zope.dublincore.interfaces import IZopeDublinCore @@ -161,9 +162,11 @@ class BaseView(GenericView, I18NView): pau = component.getUtility(IAuthentication) creators = [] for c in cr: - principal = pau.getPrincipal(c) - if principal is not None: + try: + principal = pau.getPrincipal(c) creators.append(principal.title) + except PrincipalLookupError: + creators.append(c) return ', '.join(creators) @Lazy diff --git a/common.py b/common.py index 7c98663..fccb711 100644 --- a/common.py +++ b/common.py @@ -94,6 +94,7 @@ class AdapterBase(object): _adapterAttributes = ('context', '__parent__',) _contextAttributes = list(IConcept) + _noexportAttributes = () def __init__(self, context): self.context = context @@ -105,7 +106,11 @@ class AdapterBase(object): def __setattr__(self, attr, value): if attr in self._adapterAttributes: - object.__setattr__(self, attr, value) + try: + object.__setattr__(self, attr, value) + except AttributeError: + print '***', self.context.__name__, attr, value + raise else: self.checkAttr(attr) setattr(self.context, '_' + attr, value) diff --git a/compound/blog/post.py b/compound/blog/post.py index e9954b8..a0372eb 100644 --- a/compound/blog/post.py +++ b/compound/blog/post.py @@ -48,6 +48,7 @@ class BlogPost(Compound): _adapterAttributes = Compound._adapterAttributes + ('text', 'private', 'creator',) _contextAttributes = Compound._contextAttributes + ['date', 'privateComment'] + _noexportAttributes = ('creator', 'text', 'private') defaultTextContentType = 'text/restructured' textContentType = defaultTextContentType diff --git a/external/annotation.py b/external/annotation.py index 163321d..43ede0f 100644 --- a/external/annotation.py +++ b/external/annotation.py @@ -23,7 +23,7 @@ $Id$ """ from datetime import datetime -from time import time +import time from zope.component import adapts from zope.dublincore.interfaces import IZopeDublinCore from zope.interface import implements @@ -47,7 +47,7 @@ class AnnotationsElement(Element): if dc is not None: for k, v in self.items(): if k in ('created', 'modified'): - v = datetime(*time.strptime(u'%Y-%m-%dT%H:%M')[0:6]) + v = datetime(*time.strptime(v, u'%Y-%m-%dT%H:%M')[0:6]) setattr(dc, k, v) diff --git a/external/base.py b/external/base.py index 5559884..f89fe44 100644 --- a/external/base.py +++ b/external/base.py @@ -192,6 +192,10 @@ class Extractor(Base): # this should also convert object attributes like e.g. typeInterface #data = instance.applyTemplate(mode='export') data = instance.applyTemplate(mode='edit') + noexp = getattr(aObj, '_noexportAttributes', ()) + for attr in noexp: + if attr in data: + del data[attr] if 'title' in data: del data['title'] data['description'] = obj.description diff --git a/external/browser.py b/external/browser.py index 5c0c4b3..0a5bd39 100644 --- a/external/browser.py +++ b/external/browser.py @@ -89,7 +89,7 @@ class ExportImport(object): return False reader = component.getUtility(IReader) elements = reader.read(data) - loader = Loader(self.context) + loader = Loader(self.context, resourceImportDirectory) loader.load(elements) self.message = u'Content uploaded and imported.' return False diff --git a/external/element.py b/external/element.py index fed833f..9b24e52 100644 --- a/external/element.py +++ b/external/element.py @@ -30,6 +30,7 @@ from zope.interface import Interface, implements from zope.traversing.api import getName, traverse from loops.external.interfaces import IElement +from loops.i18n.common import I18NValue class Element(dict): @@ -192,6 +193,7 @@ elementTypes = dict( resource=ResourceElement, resourceRelation=ResourceRelationElement, node=NodeElement, + I18NValue=I18NValue, ) toplevelElements = ('type', 'concept', 'resource', 'resourceRelation', 'node') diff --git a/organize/party.py b/organize/party.py index e394aad..42edf6b 100644 --- a/organize/party.py +++ b/organize/party.py @@ -54,7 +54,7 @@ TypeInterfaceSourceList.typeInterfaces += (IPerson, IAddress) def getPersonForUser(context, request=None, principal=None): if principal is None: - principal = request.principal + principal = getattr(request, 'principal', None) if principal is None: return None loops = context.getLoopsRoot() @@ -83,6 +83,8 @@ class Person(AdapterBase, BasePerson): def setUserId(self, userId): if userId: principal = self.getPrincipalForUserId(userId) + if principal is None: + return person = getPersonForUser(self.context, principal=principal) if person is not None and person != self.context: raise ValueError(