Source code for shoop.admin.template_helpers.shoop_admin
# -*- coding: utf-8 -*-
# This file is part of Shoop.
#
# Copyright (c) 2012-2016, Shoop Ltd. All rights reserved.
#
# This source code is licensed under the AGPLv3 license found in the
# LICENSE file in the root directory of this source tree.
"""
This module is installed as the `shoop_admin` template function namespace.
"""
import itertools
from django.core.urlresolvers import NoReverseMatch, reverse
from django.middleware.csrf import get_token
from jinja2.utils import contextfunction
from shoop.admin import menu
from shoop.admin.breadcrumbs import Breadcrumbs
from shoop.admin.utils.urls import (
get_model_url, manipulate_query_string, NoModelUrl
)
__all__ = ["get_menu_entry_categories", "get_front_url", "get_config", "model_url"]
@contextfunction
@contextfunction
def get_menu_entries(context):
return sorted(itertools.chain(*(
c.entries
for c
in menu.get_menu_entry_categories(request=context["request"]).values()
)), key=(lambda m: m.text))
@contextfunction
[docs]def get_front_url(context):
front_url = context.get("front_url")
if not front_url:
try:
front_url = reverse("shoop:index")
except NoReverseMatch:
front_url = None
return front_url
# TODO: Figure out a more extensible way to deal with this
BROWSER_URL_NAMES = {
"media": "shoop_admin:media.browse",
"product": "shoop_admin:product.list",
"contact": "shoop_admin:contact.list",
"setLanguage": "shoop_admin:set-language",
}
def get_browser_urls():
browser_urls = {}
for name, urlname in BROWSER_URL_NAMES.items():
try:
browser_urls[name] = reverse(urlname)
except NoReverseMatch: # This may occur when a module is not available.
browser_urls[name] = None
return browser_urls
@contextfunction
[docs]def get_config(context):
request = context["request"]
url_name = None
if getattr(request, "resolver_match", None):
# This does not exist when testing views directly
url_name = request.resolver_match.url_name
qs = {"context": url_name}
return {
"searchUrl": manipulate_query_string(reverse("shoop_admin:search"), **qs),
"menuUrl": manipulate_query_string(reverse("shoop_admin:menu"), **qs),
"browserUrls": get_browser_urls(),
"csrf": get_token(request)
}
@contextfunction
def get_breadcrumbs(context):
breadcrumbs = context.get("breadcrumbs")
if breadcrumbs is None:
breadcrumbs = Breadcrumbs.infer(context)
return breadcrumbs
[docs]def model_url(model, kind="detail", default=None):
"""
Get a model URL of the given kind for a model (instance or class).
:param model: The model instance or class.
:type model: django.db.Model
:param kind: The URL kind to retrieve. See `get_model_url`.
:type kind: str
:param default: Default value to return if model URL retrieval fails. If None,
the `NoModelUrl` exception is (re)raised.
:type default: str|None
:return: URL string.
:rtype: str
"""
try:
return get_model_url(model, kind)
except NoModelUrl:
if default is None:
raise
return default