diff options
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 |
commit | c712dbebefb07f5020dcb9c8e39241a40eb55d52 (patch) | |
tree | c127c56ddebaf599c429cda03e9d833c7d453cc3 | |
parent | 72b5086225a96207b1590da33cdab35688e834f5 (diff) | |
download | Ishtar-c712dbebefb07f5020dcb9c8e39241a40eb55d52.tar.bz2 Ishtar-c712dbebefb07f5020dcb9c8e39241a40eb55d52.zip |
✨ Formula: add splitpart filter
-rw-r--r-- | ishtar_common/jinja_filters.py | 51 | ||||
-rw-r--r-- | ishtar_common/utils.py | 3 | ||||
-rw-r--r-- | ishtar_common/utils_secretary.py | 29 |
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) |