# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2017, Shoop Commerce Ltd. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
"""
This module is installed as the `shuup_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 shuup import configuration
from shuup.admin import menu
from shuup.admin.breadcrumbs import Breadcrumbs
from shuup.admin.utils.urls import (
get_model_url, manipulate_query_string, NoModelUrl
)
from shuup.core.telemetry import is_telemetry_enabled
__all__ = ["get_menu_entry_categories", "get_front_url", "get_config", "model_url"]
@contextfunction
def get_quicklinks(context):
request = context["request"]
if request.GET.get("context") == "home":
return []
return menu.get_quicklinks(request=context["request"])
@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("shuup:index")
except NoReverseMatch:
front_url = None
return front_url
@contextfunction
def get_support_id(context):
support_id = None
if is_telemetry_enabled():
support_id = configuration.get(None, "shuup_support_id")
return support_id
# TODO: Figure out a more extensible way to deal with this
BROWSER_URL_NAMES = {
"media": "shuup_admin:media.browse",
"product": "shuup_admin:shop_product.list",
"contact": "shuup_admin:contact.list",
"setLanguage": "shuup_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("shuup_admin:search"), **qs),
"menuUrl": manipulate_query_string(reverse("shuup_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
@contextfunction
[docs]def model_url(context, model, kind="detail", default=None):
"""
Get a model URL of the given kind for a model (instance or class).
:param context: Jinja rendering context
:type context: jinja2.runtime.Context
: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.
:type default: str
:return: URL string.
:rtype: str
"""
user = context.get("user")
try:
return get_model_url(model, kind=kind, user=user)
except NoModelUrl:
return default