Source code for aleksis.core.templatetags.data_helpers
import json
from typing import Any, Optional, Union
from django import template
from django.contrib.contenttypes.models import ContentType
from django.db.models import Model
register = template.Library()
[docs]@register.filter
def get_dict(value: Any, arg: Any) -> Any:
"""Get an attribute of an object dynamically from a string name."""
if hasattr(value, str(arg)):
return getattr(value, arg)
elif hasattr(value, "keys") and arg in value.keys():
return value[arg]
elif str(arg).isnumeric() and len(value) > int(arg):
return value[int(arg)]
else:
return None
[docs]@register.simple_tag
def verbose_name(app_label: str, model: str, field: Optional[str] = None) -> str:
"""Get a verbose name of a model or a field by app label and model name."""
ct = ContentType.objects.get(app_label=app_label, model=model).model_class()
if field:
# Field
return ct._meta.get_field(field).verbose_name.title()
else:
# Whole model
return ct._meta.verbose_name.title()
[docs]@register.simple_tag
def verbose_name_object(model: Model, field: Optional[str] = None) -> str:
"""Get a verbose name of a model or a field by a model or an instance of a model."""
if field:
# Field
return model._meta.get_field(field).verbose_name.title()
else:
# Whole model
return model._meta.verbose_name.title()
[docs]@register.simple_tag
def parse_json(value: Optional[str] = None) -> Union[dict, None]:
"""Template tag for parsing JSON from a string."""
if not value:
return None
return json.loads(value)
[docs]@register.simple_tag(takes_context=True)
def build_badge(context: dict, item: dict) -> Any:
"""Get menu badge content from django-menu-generator dict."""
request = context["request"]
badge = item.get("badge")
if callable(badge):
return badge(request)
else:
return badge