Skip to content

Commit 87695b6

Browse files
committed
Treats steps like a subnavigation of "Risk Assessment".
I.e. the navigation entry remains active for all the steps.
1 parent 308f159 commit 87695b6

File tree

5 files changed

+37
-14
lines changed

5 files changed

+37
-14
lines changed

src/riskmatrix/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from riskmatrix.flash import MessageQueue
77
from riskmatrix.i18n import LocaleNegotiator
8+
from riskmatrix.layouts.steps import show_steps
89
from riskmatrix.route_factories import root_factory
910
from riskmatrix.security import authenticated_user
1011
from riskmatrix.security_policy import SessionSecurityPolicy
@@ -45,6 +46,7 @@ def includeme(config: Configurator) -> None:
4546

4647
config.add_request_method(authenticated_user, 'user', property=True)
4748
config.add_request_method(MessageQueue, 'messages', reify=True)
49+
config.add_request_method(show_steps, 'show_steps', reify=True)
4850

4951

5052
def main(

src/riskmatrix/layouts/layout.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from datetime import date
44
from typing import Any, TYPE_CHECKING
55

6-
from riskmatrix.cache import request_cache
76
from riskmatrix.static import bootstrap_css
87
from riskmatrix.static import bootstrap_js
98

@@ -25,14 +24,8 @@ def __init__(self, context: Any, request: 'IRequest') -> None:
2524
bootstrap_css.need()
2625
bootstrap_js.need()
2726

28-
@request_cache()
2927
def show_steps(self) -> bool:
30-
route = self.request.matched_route
31-
return hasattr(route, 'name') and route.name in (
32-
'assessment',
33-
'assess_impact',
34-
'assess_likelihood',
35-
)
28+
return self.request.show_steps
3629

3730
def locale_name(self) -> str:
3831
return self.request.locale_name

src/riskmatrix/layouts/navbar.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from typing import TYPE_CHECKING
66
if TYPE_CHECKING:
7+
from collections.abc import Callable
78
from pyramid.interfaces import IRequest
89

910
from riskmatrix.types import RenderData
@@ -17,10 +18,20 @@ class NavbarEntry:
1718
url: str
1819
active: bool
1920

20-
def __init__(self, request: 'IRequest', title: str, url: str):
21+
def __init__(
22+
self,
23+
request: 'IRequest',
24+
title: str,
25+
url: str,
26+
active: 'Callable[[IRequest, str], bool] | None' = None
27+
):
2128
self.title = title
2229
self.url = url
23-
self.active = request.path_url == url
30+
31+
if active is None:
32+
self.active = request.path_url == url
33+
else:
34+
self.active = active(request, url)
2435

2536
def __call__(self) -> str:
2637
item_class = 'nav-item'
@@ -70,7 +81,8 @@ def navbar(context: object, request: 'IRequest') -> 'RenderData':
7081
NavbarEntry(
7182
request,
7283
_('Risk Assessment'),
73-
request.route_url('assessment')
84+
request.route_url('assessment'),
85+
lambda request, url: request.show_steps,
7486
),
7587
]
7688
}

src/riskmatrix/layouts/steps.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ def steps(context: 'Organization', request: 'IRequest') -> 'RenderData':
2020
'steps': [
2121
Step(
2222
_('Identify Risks'),
23-
request.route_url('assessment', id=context.id)
23+
request.route_url('assessment')
2424
),
2525
Step(
2626
_('Assess Impact'),
27-
request.route_url('assess_impact', id=context.id)
27+
request.route_url('assess_impact')
2828
),
2929
Step(
3030
_('Assess Likelihood'),
31-
request.route_url('assess_likelihood', id=context.id)
31+
request.route_url('assess_likelihood')
3232
),
3333
Step(
3434
_('Generate Risk Matrix'),
@@ -41,3 +41,17 @@ def steps(context: 'Organization', request: 'IRequest') -> 'RenderData':
4141
),
4242
]
4343
}
44+
45+
46+
def show_steps(request: 'IRequest') -> bool:
47+
# FIXME: For increased robustness we probably should store the
48+
# steps in shared configuration and generate this condition
49+
# from the defined steps
50+
route = request.matched_route
51+
if hasattr(route, 'name'):
52+
return route.name in (
53+
'assessment',
54+
'assess_impact',
55+
'assess_likelihood'
56+
)
57+
return False

stubs/pyramid/interfaces.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ class IRequest(Interface, _Request):
164164
user: User
165165

166166
messages: MessageQueue
167+
show_steps: bool
168+
167169
response: IResponse
168170
layout_manager: ILayoutManager
169171

0 commit comments

Comments
 (0)