summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-09-12 15:26:02 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-09-12 15:26:02 +0200
commitc712dbebefb07f5020dcb9c8e39241a40eb55d52 (patch)
treec127c56ddebaf599c429cda03e9d833c7d453cc3
parent72b5086225a96207b1590da33cdab35688e834f5 (diff)
downloadIshtar-c712dbebefb07f5020dcb9c8e39241a40eb55d52.tar.bz2
Ishtar-c712dbebefb07f5020dcb9c8e39241a40eb55d52.zip
✨ Formula: add splitpart filter
-rw-r--r--ishtar_common/jinja_filters.py51
-rw-r--r--ishtar_common/utils.py3
-rw-r--r--ishtar_common/utils_secretary.py29
3 files changed, 54 insertions, 29 deletions
diff --git a/ishtar_common/jinja_filters.py b/ishtar_common/jinja_filters.py
index e1e53cd66..cf19ef6c7 100644
--- a/ishtar_common/jinja_filters.py
+++ b/ishtar_common/jinja_filters.py
@@ -18,6 +18,7 @@
from datetime import datetime
+from jinja2.environment import Environment
from jinja2.filters import environmentfilter
import locale
from num2words import num2words
@@ -148,3 +149,53 @@ def short_date_filter(*args):
return ""
set_locale()
return value.strftime(settings.SHORT_DATE_FORMAT)
+
+
+@environmentfilter
+def splitpart(*args):
+ """
+ Split string.
+ First arg is index of first item to get
+ Second arg is last index of items to get not included (not mandatory - default is one item) - 0 to get just one
+ Third arg is character for split - default is ","
+ Last arg is character for join - default is ","
+
+ {{"9,2,10"|splitpart(1)}} -> 2
+ {{"chaise;bureau;papier;paragraphe"|splitpart(0,0,";")}} -> chaise
+ {{"182025_C001"|splitpart(1,0,"_")}} -> C001
+ {{"chaise;bureau;papier;paragraphe"|splitpart(1,3,";")}} -> bureau;papier
+ {{"chaise;bureau;papier;paragraphe"|splitpart(1,4,";","|")}} -> bureau|papier|paragraphe
+ """
+ # manage delta for environment filter
+ delta = 0
+ if isinstance(args[0], Environment):
+ delta = 1
+ value = args[0 + delta]
+ index = args[1 + delta]
+ index_end = args[2 + delta] if len(args) > (2 + delta) else None
+ char = args[3 + delta] if len(args) > (3 + delta) else ","
+ merge_character = args[4 + delta] if len(args) > (4 + delta) else None
+ if index_end:
+ try:
+ index_end = int(index_end)
+ if not merge_character: # merge is assumed
+ merge_character = char
+ except ValueError:
+ # old filter use - manage compatibility
+ merge_character = char
+ char = index_end
+ index_end = None
+ if not value or (not index and index != 0):
+ return ""
+ if merge_character is True: # old filter use
+ merge_character = char
+ splited = value.split(char)
+ if len(splited) <= index:
+ return ""
+ if not merge_character:
+ return splited[index]
+ if index_end:
+ splited = splited[index:index_end]
+ else:
+ splited = splited[index:]
+ return merge_character.join(splited)
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 11022cad2..768c58495 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -79,7 +79,7 @@ from django.template.defaultfilters import slugify
from .jinja_filters import capfirst_filter, capitalize_filter, \
euro_format, float_format, human_date_filter, lowerfirst_filter, \
- number_to_words, replace_line_breaks, short_date_filter
+ number_to_words, replace_line_breaks, short_date_filter, splitpart
if settings.USE_TRANSLATION_OVERLOAD:
@@ -2814,6 +2814,7 @@ FORMULA_FILTERS = {
"padding06": _padding06,
"padding07": _padding07,
"padding08": _padding08,
+ "splitpart": splitpart,
}
diff --git a/ishtar_common/utils_secretary.py b/ishtar_common/utils_secretary.py
index 075d9d0df..0ce4732d4 100644
--- a/ishtar_common/utils_secretary.py
+++ b/ishtar_common/utils_secretary.py
@@ -11,7 +11,7 @@ from django.conf import settings
from .jinja_filters import capfirst_filter, capitalize_filter, \
euro_format, float_format, human_date_filter, lowerfirst_filter, \
- number_to_words, replace_line_breaks, short_date_filter
+ number_to_words, replace_line_breaks, short_date_filter, splitpart
RE_UNITS = re.compile("([.0-9]+)([a-z]+)")
@@ -47,33 +47,6 @@ def multiply_filter(value1, value2):
return 0
-def splitpart(value, index, index_end=None, char=",", merge_character=None):
- if index_end:
- try:
- index_end = int(index_end)
- if not merge_character: # merge is assumed
- merge_character = char
- except ValueError:
- # old filter use - manage compatibility
- merge_character = char
- char = index_end
- index_end = None
- if not value or (not index and index != 0):
- return ""
- if merge_character is True: # old filter use
- merge_character = char
- splited = value.split(char)
- if len(splited) <= index:
- return ""
- if not merge_character:
- return splited[index]
- if index_end:
- splited = splited[index:index_end]
- else:
- splited = splited[index:]
- return merge_character.join(splited)
-
-
class IshtarSecretaryRenderer(Renderer):
def __init__(self, *args, **kwargs):
super(IshtarSecretaryRenderer, self).__init__(*args, **kwargs)