lemoncurry/lemoncurry/templatetags/lemoncurry_tags.py

110 lines
2.7 KiB
Python
Raw Normal View History

2017-10-22 19:35:29 -04:00
import json
from os.path import join
from types import SimpleNamespace
2017-10-22 19:35:29 -04:00
2017-10-22 18:37:24 -04:00
from django import template
from django.conf import settings
2017-10-24 00:01:17 -04:00
from django.urls import reverse
2017-10-22 18:37:24 -04:00
from .. import breadcrumbs
from entries import kinds
2017-10-22 18:37:24 -04:00
register = template.Library()
cache = SimpleNamespace(package_json=None)
2017-10-22 18:37:24 -04:00
2017-10-22 19:35:29 -04:00
2017-10-24 00:01:17 -04:00
class MenuItem:
def __init__(self, label, icon, url):
self.label = label
self.icon = icon
self.url = reverse(url)
2017-10-22 19:35:29 -04:00
@register.simple_tag
def get_package_json():
if cache.package_json:
return cache.package_json
2017-10-22 19:35:29 -04:00
with open(join(settings.BASE_DIR, 'package.json')) as f:
cache.package_json = json.load(f)
return cache.package_json
2017-10-22 19:35:29 -04:00
@register.simple_tag
2017-10-26 00:57:44 -04:00
def request_origin(request):
return '{scheme}://{host}'.format(
scheme=request.scheme,
host=request.META['HTTP_HOST'],
)
2017-10-26 00:57:44 -04:00
@register.simple_tag
def request_uri(request):
return request_origin(request) + request.path
2017-10-22 18:37:24 -04:00
@register.simple_tag
def site_name():
return settings.LEMONCURRY_SITE_NAME
2017-10-24 00:01:17 -04:00
@register.inclusion_tag('lemoncurry/tags/nav.html')
def nav_left(request):
items = (MenuItem(
label=k.plural,
icon=k.icon,
url='entries:'+k.plural+'_index'
) for k in kinds.all)
return {'items': items, 'request': request}
2017-10-24 00:01:17 -04:00
@register.inclusion_tag('lemoncurry/tags/nav.html')
def nav_right(request):
if request.user.is_authenticated():
items = (
MenuItem(label='admin', icon='fa fa-gear', url='admin:index'),
MenuItem(label='log out', icon='fa fa-sign-out', url='lemonauth:logout'),
2017-10-24 00:01:17 -04:00
)
else:
items = (
MenuItem(label='log in', icon='fa fa-sign-in', url='lemonauth:login'),
2017-10-24 00:01:17 -04:00
)
return {'items': items, 'request': request}
@register.inclusion_tag('lemoncurry/tags/breadcrumbs.html', takes_context=True)
def nav_crumbs(context, route):
crumbs = breadcrumbs.find(route)
current = crumbs.pop()
item_list_element = [{
'@type': 'ListItem',
'position': i + 1,
'item': {
'@id': context['origin'] + reverse(crumb['route']),
'@type': 'WebPage',
'name': crumb['label']
}
} for i, crumb in enumerate(crumbs)]
item_list_element.append({
'@type': 'ListItem',
'position': len(item_list_element) + 1,
'item': {
'id': context['uri'],
'@type': 'WebPage',
'name': current['label'] or context.get('title'),
}
})
breadcrumb_list = {
'@context': 'http://schema.org',
'@type': 'BreadcrumbList',
'itemListElement': item_list_element
}
return {
'breadcrumb_list': breadcrumb_list,
'crumbs': crumbs,
'current': current,
'title': context.get('title'),
}