Source code for plata.shop.templatetags.plata_tags
from __future__ import absolute_import, unicode_literals
from django import forms, template
from django.db.models import ObjectDoesNotExist
from django.template.loader import render_to_string
# import plata
import plata.context_processors
register = template.Library()
[docs]@register.simple_tag(takes_context=True)
def load_plata_context(context):
"""
Conditionally run plata's context processor using {% load_plata_context %}
Rather than having the overheads involved in globally adding it to
TEMPLATE_CONTEXT_PROCESSORS.
"""
if "plata" not in context:
context.update(plata.context_processors.plata_context(context["request"]))
return ""
[docs]@register.filter
def quantity_ordered(product, order):
"""
e.g. {% if product|quantity_ordered:plata.order > 0 %} ... {% endif %}
"""
try:
return order.items.values("quantity").get(product=product)["quantity"]
except ObjectDoesNotExist:
return 0
def _type_class(item):
if isinstance(item.field.widget, forms.CheckboxInput):
return "checkbox"
elif isinstance(item.field.widget, forms.DateInput):
return "date"
elif isinstance(
item.field.widget, (forms.RadioSelect, forms.CheckboxSelectMultiple)
):
return "list"
return ""
[docs]@register.simple_tag
def form_items(form):
"""
Render all form items::
{% form_items form %}
"""
return "".join(
render_to_string(
"_form_item.html",
{
"item": field,
"is_checkbox": isinstance(field.field.widget, forms.CheckboxInput),
"type_class": _type_class(field),
},
)
for field in form
)
[docs]@register.inclusion_tag("_form_item.html")
def form_item(item, additional_classes=None):
"""
Helper for easy displaying of form items::
{% for field in form %}{% form_item field %}{% endfor %}
"""
return {
"item": item,
"additional_classes": additional_classes,
"is_checkbox": isinstance(item.field.widget, forms.CheckboxInput),
"type_class": _type_class(item),
}
[docs]@register.inclusion_tag("_form_item_plain.html")
def form_item_plain(item, additional_classes=None):
"""
Helper for easy displaying of form items without any additional
tags (table cells or paragraphs) or labels::
{% form_item_plain field %}
"""
return {
"item": item,
"additional_classes": additional_classes,
"is_checkbox": isinstance(item.field.widget, forms.CheckboxInput),
"type_class": _type_class(item),
}
[docs]@register.tag
def form_errors(parser, token):
"""
Show all form and formset errors::
{% form_errors form formset1 formset2 %}
Silently ignores non-existant variables.
"""
tokens = token.split_contents()
return FormErrorsNode(*tokens[1:])
class FormErrorsNode(template.Node):
def __init__(self, *items):
self.items = [template.Variable(item) for item in items]
def render(self, context):
items = []
for item in self.items:
try:
var = item.resolve(context)
if isinstance(var, dict):
items.extend(var.values())
elif isinstance(var, (list, tuple)):
items.extend(var)
else:
items.append(var)
except template.VariableDoesNotExist:
# We do not care too much
pass
errors = False
form_list = []
formset_list = []
for i in items:
if isinstance(i, forms.BaseForm):
form_list.append(i)
else:
formset_list.append(i)
if (
getattr(i, "errors", None)
or getattr(i, "non_field_errors", lambda: None)()
):
errors = True
if not errors:
return ""
return render_to_string(
"_form_errors.html",
{"forms": form_list, "formsets": formset_list, "errors": True},
)