src/pyams_skin/skin.py
changeset 156 b8b688fc964e
parent 155 cd3ab32436f0
child 160 6b3ffcd6dbb1
--- 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)