diff -r cd3ab32436f0 -r b8b688fc964e src/pyams_skin/skin.py --- a/src/pyams_skin/skin.py Mon Oct 10 11:32:08 2016 +0200 +++ b/src/pyams_skin/skin.py Mon Oct 10 15:27:10 2016 +0200 @@ -45,8 +45,7 @@ """Skinnable content base class""" _inherit_skin = FieldProperty(ISkinnable['inherit_skin']) - - skin = FieldProperty(IUserSkinnable['skin']) + _skin = FieldProperty(IUserSkinnable['skin']) @property def can_inherit_skin(self): @@ -58,15 +57,21 @@ @inherit_skin.setter def inherit_skin(self, value): - if value and not self.can_inherit_skin: - value = False - self._inherit_skin = value + self._inherit_skin = value if self.can_inherit_skin else False + + @property + def skin(self): + return self._skin + + @skin.setter + def skin(self, value): + self._skin = None if self.inherit_skin else value @property def skin_parent(self): if (not self._inherit_skin) and self.skin: return self - parent = get_parent(self, ISkinnable) + parent = get_parent(self, ISkinnable, allow_context=False) if parent is not None: return parent.skin_parent @@ -113,17 +118,16 @@ def handle_content_skin(event): """Apply skin when traversing skinnable object""" request = event.request - try: - skin = event.object.get_skin(request) - except NotImplementedError: - pass - else: - if skin is not None: - apply_skin(request, skin) + skin = event.object.get_skin(request) + if skin is not None: + apply_skin(request, skin) @subscriber(IBeforeTraverseEvent, context_selector=ISiteRoot) def handle_root_skin(event): """Apply skin when traversing site root""" - if not ISkinnable.providedBy(event.object): + context = event.object + if not ISkinnable.providedBy(context): apply_skin(event.request, PyAMSSkin) + elif context.skin is None: + apply_skin(event.request, PyAMSSkin)