summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2022-03-08 15:53:42 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2022-03-08 15:53:42 +0100
commitd09fc817de5ba4692182208da153abd5268ecdb0 (patch)
tree84234d84769ec37079c53e6327ebce9ce68904a2
parent3683f2d298206fb5a7cc341ab7af653706af23cf (diff)
downloadIshtar-d09fc817de5ba4692182208da153abd5268ecdb0.tar.bz2
Ishtar-d09fc817de5ba4692182208da153abd5268ecdb0.zip
Templates: improve splitpart filter
-rw-r--r--CHANGES.md6
-rw-r--r--docs/fr/source/annexe-tech-4-jinja-filters.rst35
-rw-r--r--ishtar_common/tests.py5
-rw-r--r--ishtar_common/utils_secretary.py24
-rw-r--r--ishtar_common/version.py4
5 files changed, 53 insertions, 21 deletions
diff --git a/CHANGES.md b/CHANGES.md
index 28635e38b..2fab69393 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,12 @@
Ishtar changelog
================
+v3.1.50 - 2022-03-08
+--------------------
+
+### Features ###
+- Templates: improve splitpart filter
+
v3.1.49 - 2022-02-28
--------------------
diff --git a/docs/fr/source/annexe-tech-4-jinja-filters.rst b/docs/fr/source/annexe-tech-4-jinja-filters.rst
index 0df8369e8..6f2a13a47 100644
--- a/docs/fr/source/annexe-tech-4-jinja-filters.rst
+++ b/docs/fr/source/annexe-tech-4-jinja-filters.rst
@@ -7,7 +7,7 @@ Annexe technique 4 - Filtres pour les patrons de documents
==========================================================
:Auteurs: Étienne Loks, Valérie-Emma Leroux
-:Date: 2021-10-20
+:Date: 2022-03-08
:Copyright: CC-BY 3.0
:Ishtar Version: v3.1.0
@@ -35,7 +35,7 @@ Formatage des chaînes de caractères
Ce filtre met la première lettre en majuscule et ne touche pas au reste de la
chaîne.
- - `{{"saint georges d'oléron"|capfisrt}}` -> `Saint georges d'oléron`
+ - `{{\"saint georges d'oléron\"|capfisrt}}` -> `Saint georges d'oléron`
- **lowerfirst**
@@ -43,7 +43,7 @@ chaîne.
Ce filtre met la première lettre en minuscule et ne touche pas au reste de la
chaîne
- - `{{"SAINT-GEORGES-D'OLÉRON"|lowerfirst}}` -> `sAINT-GEORGES-D'OLÉRON`
+ - `{{\"SAINT-GEORGES-D'OLÉRON\"|lowerfirst}}` -> `sAINT-GEORGES-D'OLÉRON`
- **capitalize**
@@ -51,20 +51,20 @@ chaîne
Ce filtre met la première lettre de chaque mot en majuscule et le reste de la
chaîne en minuscule.
- - `{{"SAINT-GEORGES-D'OLÉRON"|capitalize}}` -> `Saint-Georges-d'Oléron`
+ - `{{\"SAINT-GEORGES-D'OLÉRON\"|capitalize}}` -> `Saint-Georges-d'Oléron`
- **human_date**
Ce filtre permet d'afficher une date en toutes lettres.
- - `{{"2020-03-03"|human_date}}` -> `3 mars 2020`
+ - `{{\"2020-03-03\"|human_date}}` -> `3 mars 2020`
- **int**
Pour afficher un nombre sans décimales.
- - `{{"600.0"|int}}` -> `600`
+ - `{{\"600.0\"|int}}` -> `600`
Manipulation des chaînes de caractères
@@ -76,14 +76,19 @@ Manipulation des chaînes de caractères
Ce filtre permet d'extraire un élément depuis une chaîne de
caractères en prenant en compte un séparateur. Par exemple depuis la chaîne
`2,3,10`, accéder au troisième élément : `10`. Ce filtre nécessite au minimum
-un argument : le numéro de l'élément souhaité (en commençant le compte à 0).
+un argument, le numéro de l'élément souhaité (en commençant le compte à 0) : pour
+avoir le second élément, il faut indiquer en argument `1`.
+Le second argument correspond à la borne de fin non incluse (en commençant le
+compte à 0) : ainsi pour avoir jusqu'au deuxième élément il faut indiquer en argument
+`2`. Si l'on ne souhaite avoir qu'un seul élément, on indique `0`.
Par défaut le séparateur `,` est utilisé si l'on souhaite un autre
-séparateur, on spécifie celui-ci en second argument. On peut associer un
-dernier argument qui permet de renvoyer le reste de la chaîne concaténée,
-il suffit de mettre cet argument à True.
-
- - `{{"9,2,10"|splitpart(1)}}` -> `2`
- - `{{"chaise;bureau;papier;paragraphe"|splitpart(0, ";")}}` -> `chaise`
- - `{{"182025_C001"|splitpart(1, "_")}}` -> `C001`
- - `{{"chaise;bureau;papier;paragraphe"|splitpart(2, ";", True)}}` -> `papier;paragraphe`
+séparateur, on spécifie celui-ci en troisème argument. On peut associer un
+dernier argument qui permet de spécifier le(s) caractère(s) de concatnation que l'on
+souhaite utiliser pour la chaîne en retour.
+
+ - `{{\"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`
diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py
index 90af3ac93..8ef083c9f 100644
--- a/ishtar_common/tests.py
+++ b/ishtar_common/tests.py
@@ -3095,8 +3095,13 @@ class JinjaFilterTest(TestCase):
self.assertEqual(utils_secretary.splitpart("1,2,3", 1), "2")
self.assertEqual(utils_secretary.splitpart("1,2,3", 10), "")
self.assertEqual(utils_secretary.splitpart("", 10), "")
+ # old use
self.assertEqual(utils_secretary.splitpart("1;2;3", 2, ";"), "3")
self.assertEqual(utils_secretary.splitpart("1;2;3;4", 1, ";", True), "2;3;4")
+ # new filter use
+ self.assertEqual(utils_secretary.splitpart("1;2;3", 0, 2, ";"), "1;2")
+ self.assertEqual(utils_secretary.splitpart("1;2;3", 2, 0, ";"), "3")
+ self.assertEqual(utils_secretary.splitpart("1;2;3;4", 1, -1, ";", "|"), "2|3")
def test_human_date(self):
self.assertEqual(utils_secretary.human_date_filter("NODATE"), "")
diff --git a/ishtar_common/utils_secretary.py b/ishtar_common/utils_secretary.py
index 062b43913..eea688ea1 100644
--- a/ishtar_common/utils_secretary.py
+++ b/ishtar_common/utils_secretary.py
@@ -71,15 +71,31 @@ def human_date_filter(value):
return value.strftime(settings.DATE_FORMAT)
-def splitpart(value, index, char=",", merge_end=False):
- if not value or not index:
+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_end:
+ if not merge_character:
return splited[index]
- return char.join(splited[index:])
+ if index_end:
+ splited = splited[index:index_end]
+ else:
+ splited = splited[index:]
+ return merge_character.join(splited)
class IshtarSecretaryRenderer(Renderer):
diff --git a/ishtar_common/version.py b/ishtar_common/version.py
index b2f930812..830404ea5 100644
--- a/ishtar_common/version.py
+++ b/ishtar_common/version.py
@@ -1,5 +1,5 @@
-# 3.1.49
-VERSION = (3, 1, 49)
+# 3.1.50
+VERSION = (3, 1, 50)
def get_version():