Skip to content

Commit 13b64cf

Browse files
committed
Implement related views
[23](LaLogiaDePython#23)
1 parent ec80644 commit 13b64cf

File tree

6 files changed

+71
-7
lines changed

6 files changed

+71
-7
lines changed

AUTHORS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ Val Kneeman under the name [django-menuware](https://github.com/un33k/django-men
77
* Milton Lenis - miltonln04@gmail.com
88

99
## Contributors:
10-
* Jonathan Weth - dev@jonathanweth.de
10+
* Jonathan Weth - dev@jonathanweth.de
11+
* Dominik George - nik@naturalnet.de

docs/authors.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ Contributors
99
============
1010

1111
`Jonathan Weth <https://github.com/hansegucker>`__ - dev@jonathanweth.de
12+
13+
`Dominik George <https://www.openhub.net/accounts/Natureshadow>`__ - nik@naturalnet.de

docs/menugeneration.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Django Menu Generator uses python dictionaries to represent the menu items, usua
1212
"root": True | False,
1313
"related_urls": [ list of related URLs ],
1414
"validators": [ list of validators ],
15+
"related_views": [ list of related views ],
1516
"submenu": Dictionary like this
1617
}
1718
@@ -23,7 +24,9 @@ Where each key is as follows:
2324

2425
- ``url``: See :doc:`urls`
2526

26-
- ``related_urls``: If one of this URLs is part of the path on the currently opened page, the menu item will be marked as selected (format of URLs like described at :doc:`urls`)
27+
- ``related_urls``: If one of these URLs is part of the path on the currently opened page, the menu item will be marked as selected (format of URLs like described at :doc:`urls`)
28+
29+
- ``related_views``: If the currently opened page resolves to one of these views, the menu item will be marked as selected.
2730

2831
- ``root``: A flag to indicate this item is the root of a path, with this you can correctly mark nested menus as selected.
2932

menu_generator/menu.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
from .utils import get_callable, parse_url, path_startswith
66

77
if django.VERSION >= (1, 10): # pragma: no cover
8-
from django.urls import reverse, NoReverseMatch
8+
from django.urls import resolve, reverse, NoReverseMatch
99
else:
10-
from django.core.urlresolvers import reverse, NoReverseMatch
10+
from django.core.urlresolvers import resolve, reverse, NoReverseMatch
1111

1212

1313
class MenuBase(object):
@@ -83,12 +83,20 @@ def _get_related_urls(self, item_dict):
8383
related_urls = item_dict.get('related_urls', [])
8484
return [parse_url(url) for url in related_urls]
8585

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+
8693
def _is_selected(self, item_dict):
8794
"""
8895
Given a menu item dictionary, it returns true if `url` is on path,
8996
unless the item is marked as a root, in which case returns true if `url` is part of path.
9097
9198
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.
92100
"""
93101
url = self._get_url(item_dict)
94102
if self._is_root(item_dict) and path_startswith(self.path, url):

menu_generator/tests/test_menu.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from django.http import HttpRequest
33
from django.test import TestCase
44

5+
from .urls import testview
56
from .utils import TestUser, is_main_site, is_paid_user
67
from ..menu import MenuBase
78
from ..templatetags.menu_generator import get_menu
@@ -306,3 +307,48 @@ def test_generate_menu_selected_related_urls_submenu(self):
306307
self.assertEqual(nav[0]["selected"], True)
307308
self.assertEqual(nav[0]["submenu"][0]["selected"], True)
308309
self.assertEqual(nav[0]["submenu"][1]["selected"], False)
310+
311+
def test_generate_menu_selected_related_views_simple(self):
312+
self.request.user = TestUser(authenticated=True)
313+
self.request.path = "/known-view/"
314+
self.menu.save_user_state(self.request)
315+
list_dict = [
316+
{
317+
"name": "parent1",
318+
"url": "/user/account/",
319+
"related_views": [testview],
320+
}
321+
]
322+
nav = self.menu.generate_menu(list_dict)
323+
324+
self.assertEqual(len(nav), 1)
325+
self.assertEqual(nav[0]["selected"], True)
326+
327+
def test_generate_menu_selected_related_views_submenu(self):
328+
self.request.user = TestUser(authenticated=True)
329+
self.request.path = "/known-view/"
330+
self.menu.save_user_state(self.request)
331+
list_dict = [
332+
{
333+
"name": "parent1",
334+
"url": "/user/account/",
335+
"submenu": [
336+
{
337+
"name": "child1",
338+
"url": '/user/account/profile/',
339+
"related_views": [testview]
340+
},
341+
{
342+
"name": "child2",
343+
"url": 'named_url',
344+
"related_views": []
345+
},
346+
],
347+
}
348+
]
349+
nav = self.menu.generate_menu(list_dict)
350+
351+
self.assertEqual(len(nav), 1)
352+
self.assertEqual(nav[0]["selected"], True)
353+
self.assertEqual(nav[0]["submenu"][0]["selected"], True)
354+
self.assertEqual(nav[0]["submenu"][1]["selected"], False)

menu_generator/tests/urls.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
from django.conf.urls import url
22

3+
def testview(request):
4+
return 'foo'
5+
36
urlpatterns = [
4-
url('', lambda: 'foo'),
5-
url('named-url', lambda: 'foo', name='named_url'),
6-
url('named-with-params/(?P<pk>\d+)/', lambda: 'foo', name='named_with_params')
7+
url(r'', lambda: 'foo'),
8+
url(r'named-url', lambda: 'foo', name='named_url'),
9+
url(r'named-with-params/(?P<pk>\d+)/', lambda: 'foo', name='named_with_params'),
10+
url(r'known-view', testview, name='known_view'),
711
]

0 commit comments

Comments
 (0)