forked from 00dani/lemoncurry
Refactor how the routing for different kinds of entry works - this will make implementing webmentions easier, hopefully?
This commit is contained in:
parent
c359b7640e
commit
9580068c5b
12 changed files with 136 additions and 73 deletions
|
@ -1,15 +1,51 @@
|
|||
from django.urls import reverse
|
||||
|
||||
breadcrumbs = {}
|
||||
|
||||
|
||||
class Crumb:
|
||||
def __init__(self, route, label=None, parent=None):
|
||||
self.route = route
|
||||
self._label = label
|
||||
self.parent = parent
|
||||
|
||||
@property
|
||||
def label(self):
|
||||
return self._label
|
||||
|
||||
def __eq__(self, other):
|
||||
if hasattr(other, 'route'):
|
||||
return self.route == other.route
|
||||
return self.route == other
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.route)
|
||||
|
||||
def __repr__(self):
|
||||
return "Crumb('{0}')".format(self.route)
|
||||
|
||||
def use_match(self, match):
|
||||
self.match = match
|
||||
|
||||
@property
|
||||
def url(self):
|
||||
return reverse(self.route)
|
||||
|
||||
|
||||
def add(route, label=None, parent=None):
|
||||
breadcrumbs[route] = {'label': label, 'route': route, 'parent': parent}
|
||||
if not isinstance(route, Crumb):
|
||||
route = Crumb(route, label, parent)
|
||||
breadcrumbs[route.route] = route
|
||||
|
||||
|
||||
def find(route):
|
||||
def find(match):
|
||||
print(breadcrumbs)
|
||||
crumbs = []
|
||||
route = match.view_name
|
||||
while route:
|
||||
crumb = breadcrumbs[route]
|
||||
crumb.use_match(match)
|
||||
crumbs.append(crumb)
|
||||
route = crumb['parent']
|
||||
route = crumb.parent
|
||||
crumbs.reverse()
|
||||
return crumbs
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
<meta http-equiv="x-ua-compatible" content="ie=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
|
||||
<link rel="canonical" href="{{ uri }}" />
|
||||
{% if atom %}<link rel="alternate" type="application/atom+xml" href="{% url atom %}" />{% endif %}
|
||||
{% if rss %}<link rel="alternate" type="application/rss+xml" href="{% url rss %}" /> {% endif %}
|
||||
{% if atom %}<link rel="alternate" type="application/atom+xml" href="{{ atom }}" />{% endif %}
|
||||
{% if rss %}<link rel="alternate" type="application/rss+xml" href="{{ rss }}" /> {% endif %}
|
||||
{% block head %}{% endblock %}
|
||||
|
||||
<link rel="authorization_endpoint" href="{{ origin }}{% url 'lemonauth:indie' %}" />
|
||||
|
@ -56,7 +56,7 @@
|
|||
</div>
|
||||
</nav>
|
||||
{% if request.resolver_match.view_name %}
|
||||
{% nav_crumbs request.resolver_match.view_name %}
|
||||
{% nav_crumbs request.resolver_match %}
|
||||
{% endif %}
|
||||
</header>
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<nav class="breadcrumbs" aria-label="breadcrumb" role="navigation">
|
||||
<ol class="breadcrumb">
|
||||
{% for crumb in crumbs %}
|
||||
<li class="breadcrumb-item"><a href="{% url crumb.route %}">{{ crumb.label }}</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ crumb.url }}">{{ crumb.label }}</a></li>
|
||||
{% endfor %}
|
||||
<li class="breadcrumb-item active" aria-current="page">{% firstof current.label title %}</li>
|
||||
</ol>
|
||||
|
|
|
@ -15,7 +15,9 @@ class MenuItem:
|
|||
def __init__(self, label, icon, url):
|
||||
self.label = label
|
||||
self.icon = icon
|
||||
self.url = reverse(url)
|
||||
if isinstance(url, str):
|
||||
url = (url, ())
|
||||
self.url = reverse(url[0], args=url[1])
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
|
@ -43,7 +45,7 @@ def nav_left(request):
|
|||
items = (MenuItem(
|
||||
label=k.plural,
|
||||
icon=k.icon,
|
||||
url='entries:'+k.plural+'_index'
|
||||
url=('entries:index', (k.plural,))
|
||||
) for k in kinds.all)
|
||||
return {'items': items, 'request': request}
|
||||
|
||||
|
@ -71,9 +73,9 @@ def nav_crumbs(context, route):
|
|||
'@type': 'ListItem',
|
||||
'position': i + 1,
|
||||
'item': {
|
||||
'@id': context['origin'] + reverse(crumb['route']),
|
||||
'@id': context['origin'] + crumb.url,
|
||||
'@type': 'WebPage',
|
||||
'name': crumb['label']
|
||||
'name': crumb.label
|
||||
}
|
||||
} for i, crumb in enumerate(crumbs)]
|
||||
item_list_element.append({
|
||||
|
@ -82,7 +84,7 @@ def nav_crumbs(context, route):
|
|||
'item': {
|
||||
'id': context['uri'],
|
||||
'@type': 'WebPage',
|
||||
'name': current['label'] or context.get('title'),
|
||||
'name': current.label or context.get('title'),
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
@ -6,16 +6,21 @@ from .. import breadcrumbs as b
|
|||
|
||||
@pytest.fixture
|
||||
def nested_crumbs():
|
||||
x = {'route': 'nc.x', 'label': 'x', 'parent': None}
|
||||
y = {'route': 'nc.y', 'label': 'y', 'parent': 'nc.x'}
|
||||
z = {'route': 'nc.z', 'label': 'z', 'parent': 'nc.y'}
|
||||
x = b.Crumb('nc.x', label='x')
|
||||
y = b.Crumb('nc.y', label='y', parent='nc.x')
|
||||
z = b.Crumb('nc.z', label='z', parent='nc.y')
|
||||
crumbs = (x, y, z)
|
||||
|
||||
for crumb in crumbs:
|
||||
b.breadcrumbs[crumb['route']] = crumb
|
||||
b.breadcrumbs[crumb.route] = crumb
|
||||
yield namedtuple('NestedCrumbs', 'x y z')(*crumbs)
|
||||
for crumb in crumbs:
|
||||
del b.breadcrumbs[crumb['route']]
|
||||
del b.breadcrumbs[crumb.route]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def crumb_match(nested_crumbs):
|
||||
return namedtuple('Match', 'view_name')(nested_crumbs.z.route)
|
||||
|
||||
|
||||
class TestAdd:
|
||||
|
@ -24,9 +29,10 @@ class TestAdd:
|
|||
assert route not in b.breadcrumbs
|
||||
b.add(route, 'some label')
|
||||
assert route in b.breadcrumbs
|
||||
assert b.breadcrumbs[route] == {
|
||||
'route': route, 'label': 'some label', 'parent': None
|
||||
}
|
||||
assert b.breadcrumbs[route] == route
|
||||
route = b.breadcrumbs[route]
|
||||
assert route.label == 'some label'
|
||||
assert route.parent is None
|
||||
|
||||
def test_inserts_a_breadcrumb_with_parent(self):
|
||||
route = 'tests.add.with_parent'
|
||||
|
@ -34,14 +40,15 @@ class TestAdd:
|
|||
assert route not in b.breadcrumbs
|
||||
b.add(route, 'child label', parent)
|
||||
assert route in b.breadcrumbs
|
||||
assert b.breadcrumbs[route] == {
|
||||
'route': route, 'label': 'child label', 'parent': parent
|
||||
}
|
||||
assert b.breadcrumbs[route] == route
|
||||
route = b.breadcrumbs[route]
|
||||
assert route.label == 'child label'
|
||||
assert route.parent == parent
|
||||
|
||||
|
||||
class TestFind:
|
||||
def test_finds_chain_of_crumbs(self, nested_crumbs):
|
||||
crumbs = b.find(nested_crumbs.z['route'])
|
||||
def test_finds_chain_of_crumbs(self, nested_crumbs, crumb_match):
|
||||
crumbs = b.find(crumb_match)
|
||||
assert len(crumbs) == 3
|
||||
assert crumbs[0] == nested_crumbs.x
|
||||
assert crumbs[1] == nested_crumbs.y
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue