• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zopefoundation / grokcore.viewlet / 5776423262

pending completion
5776423262

push

github

web-flow
Config with pure python template (#7)

* Drop support for Python 2.7, 3.5, 3.6.

46 of 54 branches covered (85.19%)

Branch coverage included in aggregate %.

81 of 81 new or added lines in 21 files covered. (100.0%)

580 of 604 relevant lines covered (96.03%)

0.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.31
/src/grokcore/viewlet/tests/functional/viewlet/viewlet_security.py
1
"""
2

3
=============
4
Test Viewlets
5
=============
6

7
This doctest will test the various grok viewlet registrations. Grok
8
viewlets offer the same flexibility as zope3, allowing you to register
9
viewlets for a particular view, context, layer, and permission.
10

11
Set up a content object in the application root::
12

13
  >>> root = getRootFolder()
14
  >>> root['wilma'] = CaveWoman()
15
  >>> root['fred'] = CaveMan()
16

17
Traverse to the view on the model object. We get the viewlets
18
registered for the default layer, with the anybody permission::
19

20
  >>> from zope.testbrowser.wsgi import Browser
21
  >>> browser = Browser()
22
  >>> browser.handleErrors = False
23
  >>> browser.open("http://localhost/wilma/@@caveview")
24
  >>> print(browser.contents)
25
  Brack Bone
26
  T-Rex Bone
27

28
After assigning the ``grok.BoneOwner`` role to ``zope.anybody``, he
29
gains the ``bone.gold`` permission. This allows the principal to view
30
the ``GoldBone`` viewlet::
31

32
  >>> from zope.securitypolicy.interfaces import IPrincipalRoleManager
33
  >>> IPrincipalRoleManager(root).assignRoleToPrincipal(
34
  ...    'grok.BoneOwner', 'zope.anybody')
35
  >>> browser.open("http://localhost/wilma/@@caveview")
36
  >>> print(browser.contents)
37
  Brack Bone
38
  Gold Bone
39
  T-Rex Bone
40

41
Now we traverse to the view through a skin. We gain the viewlet
42
registered for a particular layer, ``LayeredBone``::
43

44
  >>> browser.open('http://localhost/++skin++boneskin/wilma/@@caveview')
45
  >>> print(browser.contents)
46
  Brack Bone
47
  Gold Bone
48
  Layered Bone
49
  T-Rex Bone
50

51
Only viewlets registered for the CaveMan model, ``ManBone``, should up
52
when traversing to fred::
53

54
  >>> browser.open('http://localhost/fred/@@caveview')
55
  >>> print(browser.contents)
56
  Brack Bone
57
  Gold Bone
58
  Man Bone
59
  T-Rex Bone
60

61

62
Viewlets registered for a particular view, like ``LadyViewlet``,
63
should only associate with that particular one::
64

65
  >>> browser.open('http://localhost/fred/@@fireview')
66
  >>> print(browser.contents)
67
  Brack Bone
68
  Gold Bone
69
  Lady Viewlet
70
  Man Bone
71
  T-Rex Bone
72

73
Viewlets and viewlet managers should have a __name__. It's used
74
for instance when looking up the absolute url for the viewlet
75
or manager.
76

77
  >>> from zope.publisher.browser import TestRequest
78
  >>> request = TestRequest()
79
  >>> model = CaveWoman()
80
  >>> view = CaveView(model, request)
81

82
Managers and viewlets should get their  name from the class name
83
if grok.name() is not present.
84

85
  >>> manager = Pot(model, request, view)
86
  >>> manager.__name__
87
  'pot'
88
  >>> viewlet = BrackerBone(model, request, view, manager)
89
  >>> viewlet.__name__
90
  'brackerbone'
91

92
If grok.name() is specified for manager and viewlet they should
93
get those names.
94

95
  >>> manager = NamedViewletManager(model, request, view)
96
  >>> manager.__name__
97
  'managerwithname'
98
  >>> viewlet = NamedViewlet(model, request, view, manager)
99
  >>> viewlet.__name__
100
  'viewletwithname'
101

102
"""
103

104

105
from zope.interface import Interface
1✔
106
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
1✔
107

108
import grokcore.viewlet as grok
1✔
109

110

111
class CaveWoman(grok.Context):
1✔
112
    pass
1✔
113

114

115
class CaveMan(grok.Context):
1✔
116
    pass
1✔
117

118

119
class CaveView(grok.View):
1✔
120
    grok.context(Interface)
1✔
121

122

123
class FireView(grok.View):
1✔
124
    grok.context(Interface)
1✔
125
    grok.template('caveview')
1✔
126

127

128
class Pot(grok.ViewletManager):
1✔
129
    grok.context(Interface)
1✔
130
    grok.name('pot')
1✔
131

132

133
class TRexBone(grok.Viewlet):
1✔
134
    grok.context(Interface)
1✔
135
    grok.viewletmanager(Pot)
1✔
136

137
    def render(self):
1✔
138
        return "T-Rex Bone"
1✔
139

140

141
class BrackerBone(grok.Viewlet):
1✔
142
    grok.context(Interface)
1✔
143
    grok.viewletmanager(Pot)
1✔
144

145
    def render(self):
1✔
146
        return "Brack Bone"
1✔
147

148

149
class GoldBone(grok.Viewlet):
1✔
150
    grok.context(Interface)
1✔
151
    grok.viewletmanager(Pot)
1✔
152
    grok.require('bone.gold')
1✔
153

154
    def render(self):
1✔
155
        return "Gold Bone"
1✔
156

157

158
class IBoneLayer(IDefaultBrowserLayer):
1✔
159
    grok.skin('boneskin')
1✔
160

161

162
class LayeredBone(grok.Viewlet):
1✔
163
    grok.context(Interface)
1✔
164
    grok.viewletmanager(Pot)
1✔
165
    grok.layer(IBoneLayer)
1✔
166

167
    def render(self):
1✔
168
        return "Layered Bone"
1✔
169

170

171
class ManBone(grok.Viewlet):
1✔
172
    grok.viewletmanager(Pot)
1✔
173
    grok.context(CaveMan)
1✔
174

175
    def render(self):
1✔
176
        return "Man Bone"
1✔
177

178

179
class LadyViewlet(grok.Viewlet):
1✔
180
    grok.context(Interface)
1✔
181
    grok.viewletmanager(Pot)
1✔
182
    grok.view(FireView)
1✔
183

184
    def render(self):
1✔
185
        return "Lady Viewlet"
1✔
186

187

188
class NamedViewletManager(grok.ViewletManager):
1✔
189
    grok.context(Interface)
1✔
190
    grok.name('managerwithname')
1✔
191

192

193
class NamedViewlet(grok.Viewlet):
1✔
194
    grok.context(Interface)
1✔
195
    grok.name('viewletwithname')
1✔
196
    grok.viewletmanager(NamedViewletManager)
1✔
197

198
    def render(self):
1✔
199
        return "NamedViewlet"
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc