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) |