5
5
from .utils import get_callable , parse_url
6
6
7
7
if django .VERSION >= (1 , 10 ): # pragma: no cover
8
- from django .urls import reverse , NoReverseMatch
8
+ from django .urls import resolve , reverse , NoReverseMatch
9
9
else :
10
- from django .core .urlresolvers import reverse , NoReverseMatch
10
+ from django .core .urlresolvers import resolve , reverse , NoReverseMatch
11
11
12
12
13
13
class MenuBase (object ):
@@ -83,12 +83,20 @@ def _get_related_urls(self, item_dict):
83
83
related_urls = item_dict .get ('related_urls' , [])
84
84
return [parse_url (url ) for url in related_urls ]
85
85
86
+ def _get_related_views (self , item_dict ):
87
+ """
88
+ Given a menu item dictionary, it returns the relateds viewss or an empty list.
89
+ """
90
+ related_views = item_dict .get ('related_views' , [])
91
+ return related_views
92
+
86
93
def _is_selected (self , item_dict ):
87
94
"""
88
95
Given a menu item dictionary, it returns true if `url` is on path,
89
96
unless the item is marked as a root, in which case returns true if `url` is part of path.
90
97
91
98
If related URLS are given, it also returns true if one of the related URLS is part of path.
99
+ If related views are given, it also returns true if the path maps to one of these views.
92
100
"""
93
101
url = self ._get_url (item_dict )
94
102
if self ._is_root (item_dict ) and url in self .path :
@@ -100,6 +108,9 @@ def _is_selected(self, item_dict):
100
108
for related_url in self ._get_related_urls (item_dict ):
101
109
if related_url in self .path :
102
110
return True
111
+ # Resolve URL and check if it relates to a related views
112
+ if resolve (self .path ).func in self ._get_related_views (item_dict ):
113
+ return True
103
114
return False
104
115
105
116
def _is_root (self , item_dict ):
0 commit comments