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

1"""This module provides template tags for extra functionality, over and above the built-in Django tags.""" 

2 

3from datetime import date, datetime 

4 

5from django import template 

6from django.conf import settings as djangosettings 

7 

8import structlog 

9 

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 

17 

18register = template.Library() 

19 

20 

21logger = structlog.get_logger('inventree') 

22 

23 

24@register.simple_tag() 

25def define(value, *args, **kwargs): 

26 """Shortcut function to overcome the shortcomings of the django templating language. 

27 

28 Use as follows: {% define "hello_world" as hello %} 

29 

30 Ref: https://stackoverflow.com/questions/1070398/how-to-set-a-value-of-a-variable-inside-a-template-code 

31 """ 

32 return value 

33 

34 

35@register.simple_tag() 

36def decimal(x, *args, **kwargs): 

37 """Simplified rendering of a decimal number.""" 

38 return InvenTree.helpers.decimal2string(x) 

39 

40 

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 

46 

47 if isinstance(date_object, str): 

48 date_object = date_object.strip() 

49 

50 # Check for empty string 

51 if len(date_object) == 0: 

52 return None 

53 

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 

60 

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 

65 

66 

67@register.simple_tag() 

68def str2bool(x, *args, **kwargs): 

69 """Convert a string to a boolean value.""" 

70 return InvenTree.helpers.str2bool(x) 

71 

72 

73@register.simple_tag() 

74def to_list(*args): 

75 """Return the input arguments as list.""" 

76 return args 

77 

78 

79@register.simple_tag() 

80def inventree_instance_name(*args, **kwargs): 

81 """Return the InstanceName associated with the current database.""" 

82 return version.inventreeInstanceName() 

83 

84 

85@register.simple_tag() 

86def inventree_title(*args, **kwargs): 

87 """Return the title for the current instance - respecting the settings.""" 

88 return version.inventreeInstanceTitle() 

89 

90 

91@register.simple_tag() 

92def inventree_logo(**kwargs): 

93 """Return the InvenTree logo, *or* a custom logo if the user has provided one. 

94 

95 Returns a path to an image file, which can be rendered in the web interface. 

96 """ 

97 return InvenTree.helpers.getLogoImage(**kwargs) 

98 

99 

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() 

106 

107 

108@register.simple_tag() 

109def inventree_commit_hash(*args, **kwargs): 

110 """Return InvenTree git commit hash string.""" 

111 return version.inventreeCommitHash() 

112 

113 

114@register.simple_tag() 

115def inventree_installer(*args, **kwargs): 

116 """Return InvenTree package installer string.""" 

117 return InvenTree.config.inventreeInstaller() 

118 

119 

120@register.simple_tag() 

121def inventree_commit_date(*args, **kwargs): 

122 """Return InvenTree git commit date string.""" 

123 return version.inventreeCommitDate() 

124 

125 

126@register.simple_tag() 

127def setting_object(key, *args, **kwargs): 

128 """Return a setting object specified by the given key. 

129 

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) 

134 

135 if 'plugin' in kwargs: 

136 # Note, 'plugin' is an instance of an InvenTreePlugin class 

137 

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 

144 

145 return plugin.models.PluginSetting.get_setting_object( 

146 key, plugin=plg, cache=cache 

147 ) 

148 

149 elif 'user' in kwargs: 

150 return common.models.InvenTreeUserSetting.get_setting_object( 

151 key, user=kwargs['user'], cache=cache 

152 ) 

153 

154 else: 

155 return common.models.InvenTreeSetting.get_setting_object(key, cache=cache) 

156 

157 

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']) 

167 

168 return get_global_setting(key) 

169 

170 

171@register.filter 

172def keyvalue(dict, key): 

173 """Access to key of supplied dict. 

174 

175 Usage: 

176 {% mydict|keyvalue:mykey %} 

177 """ 

178 return dict.get(key) 

179 

180 

181@register.simple_tag() 

182def inventree_customize(reference, *args, **kwargs): 

183 """Return customization values for the user interface.""" 

184 return djangosettings.CUSTOMIZE.get(reference, '')