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

zopefoundation / grokcore.layout / 16098815659

18 Jun 2025 06:34AM UTC coverage: 96.033%. Remained the same
16098815659

push

github

icemac
Back to development: 5.1

22 of 26 branches covered (84.62%)

Branch coverage included in aggregate %.

438 of 453 relevant lines covered (96.69%)

0.97 hits per line

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

90.0
/src/grokcore/layout/components.py
1
import grokcore.component as grok
1✔
2
import grokcore.view
1✔
3
import martian
1✔
4
import zope.component
1✔
5
import zope.errorview.browser
1✔
6
import zope.interface.common.interfaces
1✔
7
import zope.publisher.interfaces
1✔
8
import zope.security.interfaces
1✔
9
from zope.interface import Interface
1✔
10
from zope.publisher.publish import mapply
1✔
11

12
from grokcore.layout.interfaces import ILayout
1✔
13
from grokcore.layout.interfaces import IPage
1✔
14

15

16
class layout(martian.Directive):
1✔
17
    scope = martian.CLASS_OR_MODULE
1✔
18
    store = martian.ONCE
1✔
19
    default = ILayout
1✔
20

21

22
@grok.implementer(ILayout)
1✔
23
class Layout(grokcore.view.ViewSupport):
1✔
24
    """A layout object."""
25

26
    grok.baseclass()
1✔
27

28
    def __init__(self, request, context):
1✔
29
        self.context = context
1✔
30
        self.request = request
1✔
31
        self.view = None
1✔
32

33
        static_name = getattr(self, '__static_name__', None)
1✔
34
        if static_name is not None:
1!
35
            self.static = zope.component.queryAdapter(
1✔
36
                self.request,
37
                Interface,
38
                name=static_name)
39
        else:
40
            self.static = None
×
41

42
    def default_namespace(self):
1✔
43
        namespace = {}
1✔
44
        namespace['view'] = self.view
1✔
45
        namespace['layout'] = self
1✔
46
        namespace['static'] = self.static
1✔
47
        namespace['context'] = self.context
1✔
48
        namespace['request'] = self.request
1✔
49
        return namespace
1✔
50

51
    def namespace(self):
1✔
52
        return {}
1✔
53

54
    def update(self):
1✔
55
        pass
1✔
56

57
    def _render_template(self):
1✔
58
        return self.template.render(self)
1✔
59

60
    def render(self):
1✔
61
        return self._render_template()
1✔
62

63
    render.base_method = True
1✔
64

65
    def __call__(self, view):
1✔
66
        self.view = view
1✔
67
        self.update()
1✔
68
        return self.render()
1✔
69

70

71
class LayoutAware:
1✔
72
    """A mixin to make views aware of layouts.
73
    """
74
    grok.baseclass()
1✔
75

76
    layout = None
1✔
77

78
    def _get_layout(self):
1✔
79
        wanted = layout.bind().get(self)
1✔
80
        return zope.component.getMultiAdapter(
1✔
81
            (self.request, self.context), wanted)
82

83
    def update(self, **kwargs):
1✔
84
        super().update(**kwargs)
1✔
85
        self.request.response.setHeader(
1✔
86
            'Content-Type', 'text/html;charset=utf-8')
87

88
    def __call__(self):
1✔
89
        self.layout = self._get_layout()
1✔
90
        mapply(self.update, (), self.request)
1✔
91
        if self.request.response.getStatus() in (302, 303):
1!
92
            # A redirect was triggered somewhere in update().  Don't
93
            # continue rendering the template or doing anything else.
94
            return
×
95
        return self.layout(self)
1✔
96

97
    def default_namespace(self):
1✔
98
        namespace = super().default_namespace()
×
99
        namespace['layout'] = self.layout
×
100
        return namespace
×
101

102
    def content(self):
1✔
103
        template = getattr(self, 'template', None)
1✔
104
        if template is not None:
1!
105
            return self._render_template()
×
106
        return mapply(self.render, (), self.request)
1✔
107

108

109
@grok.implementer(IPage)
1✔
110
class Page(LayoutAware, grokcore.view.View):
1✔
111
    """A view class.
112
    """
113
    grok.baseclass()
1✔
114

115

116
class ExceptionPage(
1✔
117
        LayoutAware,
118
        zope.errorview.browser.ExceptionView,
119
        grokcore.view.View):
120
    grok.context(zope.interface.common.interfaces.IException)
1✔
121
    grok.baseclass()
1✔
122

123

124
class NotFoundPage(
1✔
125
        LayoutAware,
126
        zope.errorview.browser.NotFoundView,
127
        grokcore.view.View):
128
    grok.context(zope.publisher.interfaces.INotFound)
1✔
129
    grok.baseclass()
1✔
130

131

132
class UnauthorizedPage(
1✔
133
        LayoutAware,
134
        zope.errorview.browser.UnauthorizedView,
135
        grokcore.view.View):
136
    grok.context(zope.security.interfaces.IUnauthorized)
1✔
137
    grok.baseclass()
1✔
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