src/pyams_skin/skin.py
changeset 156 b8b688fc964e
parent 155 cd3ab32436f0
child 160 6b3ffcd6dbb1
equal deleted inserted replaced
155:cd3ab32436f0 156:b8b688fc964e
    43 @implementer(ISkinnable)
    43 @implementer(ISkinnable)
    44 class SkinnableContent(object):
    44 class SkinnableContent(object):
    45     """Skinnable content base class"""
    45     """Skinnable content base class"""
    46 
    46 
    47     _inherit_skin = FieldProperty(ISkinnable['inherit_skin'])
    47     _inherit_skin = FieldProperty(ISkinnable['inherit_skin'])
    48 
    48     _skin = FieldProperty(IUserSkinnable['skin'])
    49     skin = FieldProperty(IUserSkinnable['skin'])
       
    50 
    49 
    51     @property
    50     @property
    52     def can_inherit_skin(self):
    51     def can_inherit_skin(self):
    53         return get_parent(self, ISkinnable, allow_context=False) is not None
    52         return get_parent(self, ISkinnable, allow_context=False) is not None
    54 
    53 
    56     def inherit_skin(self):
    55     def inherit_skin(self):
    57         return self._inherit_skin if self.can_inherit_skin else False
    56         return self._inherit_skin if self.can_inherit_skin else False
    58 
    57 
    59     @inherit_skin.setter
    58     @inherit_skin.setter
    60     def inherit_skin(self, value):
    59     def inherit_skin(self, value):
    61         if value and not self.can_inherit_skin:
    60         self._inherit_skin = value if self.can_inherit_skin else False
    62             value = False
    61 
    63         self._inherit_skin = value
    62     @property
       
    63     def skin(self):
       
    64         return self._skin
       
    65 
       
    66     @skin.setter
       
    67     def skin(self, value):
       
    68         self._skin = None if self.inherit_skin else value
    64 
    69 
    65     @property
    70     @property
    66     def skin_parent(self):
    71     def skin_parent(self):
    67         if (not self._inherit_skin) and self.skin:
    72         if (not self._inherit_skin) and self.skin:
    68             return self
    73             return self
    69         parent = get_parent(self, ISkinnable)
    74         parent = get_parent(self, ISkinnable, allow_context=False)
    70         if parent is not None:
    75         if parent is not None:
    71             return parent.skin_parent
    76             return parent.skin_parent
    72 
    77 
    73     def get_skin(self, request=None):
    78     def get_skin(self, request=None):
    74         parent = self.skin_parent
    79         parent = self.skin_parent
   111 
   116 
   112 @subscriber(IBeforeTraverseEvent, context_selector=ISkinnable)
   117 @subscriber(IBeforeTraverseEvent, context_selector=ISkinnable)
   113 def handle_content_skin(event):
   118 def handle_content_skin(event):
   114     """Apply skin when traversing skinnable object"""
   119     """Apply skin when traversing skinnable object"""
   115     request = event.request
   120     request = event.request
   116     try:
   121     skin = event.object.get_skin(request)
   117         skin = event.object.get_skin(request)
   122     if skin is not None:
   118     except NotImplementedError:
   123         apply_skin(request, skin)
   119         pass
       
   120     else:
       
   121         if skin is not None:
       
   122             apply_skin(request, skin)
       
   123 
   124 
   124 
   125 
   125 @subscriber(IBeforeTraverseEvent, context_selector=ISiteRoot)
   126 @subscriber(IBeforeTraverseEvent, context_selector=ISiteRoot)
   126 def handle_root_skin(event):
   127 def handle_root_skin(event):
   127     """Apply skin when traversing site root"""
   128     """Apply skin when traversing site root"""
   128     if not ISkinnable.providedBy(event.object):
   129     context = event.object
       
   130     if not ISkinnable.providedBy(context):
   129         apply_skin(event.request, PyAMSSkin)
   131         apply_skin(event.request, PyAMSSkin)
       
   132     elif context.skin is None:
       
   133         apply_skin(event.request, PyAMSSkin)