1+ from dataclasses import dataclass
12from enum import StrEnum
23
34from django .conf import settings
5+ from django .urls import reverse
46
57from versions .models import Version
68
@@ -18,24 +20,59 @@ class NavItem(StrEnum):
1820 RELEASES = "releases"
1921
2022
23+ _PATH_MAP = {
24+ "/doc/libs/" : NavItem .LIBRARIES , # special case - handle first
25+ "/doc/" : NavItem .LEARN ,
26+ "/docs/" : NavItem .LEARN ,
27+ "/boost-development/" : NavItem .LEARN ,
28+ "/news/" : NavItem .NEWS ,
29+ "/community/" : NavItem .COMMUNITY ,
30+ "/library/" : NavItem .LIBRARIES ,
31+ "/libraries/" : NavItem .LIBRARIES ,
32+ "/releases/" : NavItem .RELEASES ,
33+ }
34+
35+
36+ def _get_active_nav_item (request ):
37+ """Determines the active nav item based on the request path."""
38+ for prefix , item in _PATH_MAP .items ():
39+ if request .path .startswith (prefix ):
40+ return item
41+ return "home"
42+
43+
2144def active_nav_item (request ):
2245 """Custom context processor that adds the active nav item to the context"""
23- default_nav_item = "home"
24- path_map = {
25- "/doc/libs/" : NavItem .LIBRARIES , # special case - handle first
26- "/doc/" : NavItem .LEARN ,
27- "/docs/" : NavItem .LEARN ,
28- "/boost-development/" : NavItem .LEARN ,
29- "/news/" : NavItem .NEWS ,
30- "/community/" : NavItem .COMMUNITY ,
31- "/library/" : NavItem .LIBRARIES ,
32- "/libraries/" : NavItem .LIBRARIES ,
33- "/releases/" : NavItem .RELEASES ,
46+ return {"active_nav_item" : _get_active_nav_item (request )}
47+
48+
49+ @dataclass
50+ class NavLink :
51+ """A single header navigation link."""
52+
53+ label : str
54+ url : str
55+ nav_id : str = ""
56+ is_unread : bool = False
57+
58+
59+ def header_context (request ):
60+ """Context processor for header nav links."""
61+ nav_links = [
62+ NavLink (label = "Libraries" , url = reverse ("libraries" ), nav_id = "libraries" ),
63+ NavLink (label = "Learn" , url = reverse ("docs" ), nav_id = "learn" ),
64+ NavLink (label = "Community" , url = reverse ("community" ), nav_id = "community" ),
65+ NavLink (
66+ label = "Posts" , url = reverse ("news" ), nav_id = "news" , is_unread = True
67+ ), # TODO: update is_unread based on actual unread state
68+ NavLink (
69+ label = "Download" , url = reverse ("releases-most-recent" ), nav_id = "releases"
70+ ),
71+ ]
72+ return {
73+ "nav_links" : nav_links ,
74+ "releases_url" : reverse ("releases-most-recent" ),
3475 }
35- for prefix , item in path_map .items ():
36- if request .path .startswith (prefix ):
37- return {"active_nav_item" : item }
38- return {"active_nav_item" : default_nav_item }
3976
4077
4178def debug (request ):
0 commit comments