Coverage for src/backend/InvenTree/InvenTree/templatetags/inventree_extras.py: 46%
92 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
1"""This module provides template tags for extra functionality, over and above the built-in Django tags."""
3from datetime import date, datetime
5from django import template
6from django.conf import settings as djangosettings
8import structlog
10import common.models
11import InvenTree.config
12import InvenTree.helpers
13import plugin.models
14from common.settings import get_global_setting
15from InvenTree import version
16from plugin.plugin import InvenTreePlugin
18register = template.Library()
21logger = structlog.get_logger('inventree')
24@register.simple_tag()
25def define(value, *args, **kwargs):
26 """Shortcut function to overcome the shortcomings of the django templating language.
28 Use as follows: {% define "hello_world" as hello %}
30 Ref: https://stackoverflow.com/questions/1070398/how-to-set-a-value-of-a-variable-inside-a-template-code
31 """
32 return value
35@register.simple_tag()
36def decimal(x, *args, **kwargs):
37 """Simplified rendering of a decimal number."""
38 return InvenTree.helpers.decimal2string(x)
41@register.simple_tag()
42def render_date(date_object):
43 """Renders a date object as a string."""
44 if date_object is None:
45 return None
47 if isinstance(date_object, str):
48 date_object = date_object.strip()
50 # Check for empty string
51 if len(date_object) == 0:
52 return None
54 # If a string is passed, first convert it to a datetime
55 try:
56 date_object = date.fromisoformat(date_object)
57 except ValueError:
58 logger.warning('Tried to convert invalid date string: %s', date_object)
59 return None
61 user_date_format = '%Y-%m-%d'
62 if isinstance(date_object, (datetime, date)):
63 return date_object.strftime(user_date_format)
64 return date_object
67@register.simple_tag()
68def str2bool(x, *args, **kwargs):
69 """Convert a string to a boolean value."""
70 return InvenTree.helpers.str2bool(x)
73@register.simple_tag()
74def to_list(*args):
75 """Return the input arguments as list."""
76 return args
79@register.simple_tag()
80def inventree_instance_name(*args, **kwargs):
81 """Return the InstanceName associated with the current database."""
82 return version.inventreeInstanceName()
85@register.simple_tag()
86def inventree_title(*args, **kwargs):
87 """Return the title for the current instance - respecting the settings."""
88 return version.inventreeInstanceTitle()
91@register.simple_tag()
92def inventree_logo(**kwargs):
93 """Return the InvenTree logo, *or* a custom logo if the user has provided one.
95 Returns a path to an image file, which can be rendered in the web interface.
96 """
97 return InvenTree.helpers.getLogoImage(**kwargs)
100@register.simple_tag()
101def inventree_version(shortstring=False, *args, **kwargs):
102 """Return InvenTree version string."""
103 if shortstring: 103 ↛ 105line 103 didn't jump to line 105 because the condition on line 103 was always true
104 return f'{version.inventreeInstanceTitle()} v{version.inventreeVersion()}'
105 return version.inventreeVersion()
108@register.simple_tag()
109def inventree_commit_hash(*args, **kwargs):
110 """Return InvenTree git commit hash string."""
111 return version.inventreeCommitHash()
114@register.simple_tag()
115def inventree_installer(*args, **kwargs):
116 """Return InvenTree package installer string."""
117 return InvenTree.config.inventreeInstaller()
120@register.simple_tag()
121def inventree_commit_date(*args, **kwargs):
122 """Return InvenTree git commit date string."""
123 return version.inventreeCommitDate()
126@register.simple_tag()
127def setting_object(key, *args, **kwargs):
128 """Return a setting object specified by the given key.
130 (Or return None if the setting does not exist)
131 if a user-setting was requested return that
132 """
133 cache = kwargs.get('cache', True)
135 if 'plugin' in kwargs:
136 # Note, 'plugin' is an instance of an InvenTreePlugin class
138 plg = kwargs['plugin']
139 if issubclass(plg.__class__, InvenTreePlugin):
140 try:
141 plg = plg.plugin_config()
142 except plugin.models.PluginConfig.DoesNotExist:
143 return None
145 return plugin.models.PluginSetting.get_setting_object(
146 key, plugin=plg, cache=cache
147 )
149 elif 'user' in kwargs:
150 return common.models.InvenTreeUserSetting.get_setting_object(
151 key, user=kwargs['user'], cache=cache
152 )
154 else:
155 return common.models.InvenTreeSetting.get_setting_object(key, cache=cache)
158@register.simple_tag()
159def settings_value(key, *args, **kwargs):
160 """Return a settings value specified by the given key."""
161 if 'user' in kwargs: 161 ↛ 162line 161 didn't jump to line 162 because the condition on line 161 was never true
162 if not kwargs['user'] or (
163 kwargs['user'] and kwargs['user'].is_authenticated is False
164 ):
165 return common.models.InvenTreeUserSetting.get_setting(key)
166 return common.models.InvenTreeUserSetting.get_setting(key, user=kwargs['user'])
168 return get_global_setting(key)
171@register.filter
172def keyvalue(dict, key):
173 """Access to key of supplied dict.
175 Usage:
176 {% mydict|keyvalue:mykey %}
177 """
178 return dict.get(key)
181@register.simple_tag()
182def inventree_customize(reference, *args, **kwargs):
183 """Return customization values for the user interface."""
184 return djangosettings.CUSTOMIZE.get(reference, '')