arcgis: add support for formatting strings as list (#72632)
This commit is contained in:
parent
ae4e05a09e
commit
709a29d551
|
@ -32,8 +32,13 @@ class Migration(migrations.Migration):
|
||||||
models.TextField(
|
models.TextField(
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text=(
|
help_text=(
|
||||||
"<span>Use syntax <tt>{name}</tt> to introduce a string parameter and <tt>{name:d}</tt> for a decimal parameter. ex.:<br/>"
|
'<div>Use syntax <tt>{name}</tt> to introduce a string parameter and '
|
||||||
"<tt>adress LIKE ('%' || UPPER({adress}) || '%')</tt><br/><tt>population < {population:d}</tt></span>"
|
'<tt>{name:d}</tt> for a decimal parameter. Use syntax <tt>{name:l}</tt> '
|
||||||
|
'for a parameter that should be interpreted a a list of strings '
|
||||||
|
'(comma-separated). ex.:</div>'
|
||||||
|
'<tt>adress LIKE (\'%\' || UPPER({adress}) || \'%\')</tt><br>'
|
||||||
|
'<tt>population < {population:d}</tt><br>'
|
||||||
|
'<tt>ID IN {ids:l}</tt> (with ids being "11,13,17")'
|
||||||
),
|
),
|
||||||
validators=[passerelle.apps.arcgis.models.validate_where],
|
validators=[passerelle.apps.arcgis.models.validate_where],
|
||||||
verbose_name='ArcGis Where Clause',
|
verbose_name='ArcGis Where Clause',
|
||||||
|
|
|
@ -389,6 +389,8 @@ class SqlFormatter(string.Formatter):
|
||||||
def format_field(self, value, format_spec):
|
def format_field(self, value, format_spec):
|
||||||
if format_spec and format_spec[-1].isalpha() and format_spec[-1] == 'd':
|
if format_spec and format_spec[-1].isalpha() and format_spec[-1] == 'd':
|
||||||
value = int(value)
|
value = int(value)
|
||||||
|
if format_spec and format_spec[-1] == 'l':
|
||||||
|
return '(' + ', '.join(SqlFormatter().format('{x}', x=x) for x in value.split(',')) + ')'
|
||||||
formatted = super().format_field(value, format_spec)
|
formatted = super().format_field(value, format_spec)
|
||||||
if not format_spec or not format_spec[-1].isalpha() or format_spec[-1] == 's':
|
if not format_spec or not format_spec[-1].isalpha() or format_spec[-1] == 's':
|
||||||
formatted = "'%s'" % formatted.replace("'", "''")
|
formatted = "'%s'" % formatted.replace("'", "''")
|
||||||
|
@ -421,10 +423,13 @@ class Query(BaseQuery):
|
||||||
validators=[validate_where],
|
validators=[validate_where],
|
||||||
help_text=mark_safe_lazy(
|
help_text=mark_safe_lazy(
|
||||||
_(
|
_(
|
||||||
'<span>Use syntax <tt>{name}</tt> to introduce a string '
|
'<div>Use syntax <tt>{name}</tt> to introduce a string '
|
||||||
'parameter and <tt>{name:d}</tt> for a decimal parameter. ex.:<br/>'
|
'parameter and <tt>{name:d}</tt> for a decimal parameter. '
|
||||||
'<tt>adress LIKE (\'%\' || UPPER({adress}) || \'%\')</tt><br/>'
|
'Use syntax <tt>{name:l}</tt> for a parameter that should be '
|
||||||
'<tt>population < {population:d}</tt></span>'
|
'interpreted a a list of strings (comma-separated). ex.:</div>'
|
||||||
|
'<tt>adress LIKE (\'%\' || UPPER({adress}) || \'%\')</tt><br>'
|
||||||
|
'<tt>population < {population:d}</tt><br>'
|
||||||
|
'<tt>ID IN {ids:l}</tt> (with ids being "11,13,17")'
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
@ -703,6 +703,13 @@ def test_validate_where(format_string, fail):
|
||||||
},
|
},
|
||||||
ValueError,
|
ValueError,
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
'ID IN {ids:l}',
|
||||||
|
{
|
||||||
|
'ids': '1,3,5',
|
||||||
|
},
|
||||||
|
"ID IN ('1', '3', '5')",
|
||||||
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_sql_formatter(format_string, kwargs, expected):
|
def test_sql_formatter(format_string, kwargs, expected):
|
||||||
|
|
Loading…
Reference in New Issue