2014-08-29 19:46:26 +04:00
|
|
|
"""
|
|
|
|
Helpers for dealing with HTML input.
|
|
|
|
"""
|
2014-09-02 18:07:56 +04:00
|
|
|
import re
|
2015-06-18 16:38:29 +03:00
|
|
|
|
2014-11-06 20:32:33 +03:00
|
|
|
from django.utils.datastructures import MultiValueDict
|
2014-09-02 18:07:56 +04:00
|
|
|
|
2014-08-29 19:46:26 +04:00
|
|
|
|
|
|
|
def is_html_input(dictionary):
|
|
|
|
# MultiDict type datastructures are used to represent HTML form input,
|
|
|
|
# which may have more than one value for each key.
|
|
|
|
return hasattr(dictionary, 'getlist')
|
|
|
|
|
|
|
|
|
|
|
|
def parse_html_list(dictionary, prefix=''):
|
|
|
|
"""
|
|
|
|
Used to suport list values in HTML forms.
|
|
|
|
Supports lists of primitives and/or dictionaries.
|
|
|
|
|
|
|
|
* List of primitives.
|
|
|
|
|
|
|
|
{
|
|
|
|
'[0]': 'abc',
|
|
|
|
'[1]': 'def',
|
|
|
|
'[2]': 'hij'
|
|
|
|
}
|
|
|
|
-->
|
|
|
|
[
|
|
|
|
'abc',
|
|
|
|
'def',
|
|
|
|
'hij'
|
|
|
|
]
|
|
|
|
|
|
|
|
* List of dictionaries.
|
|
|
|
|
|
|
|
{
|
|
|
|
'[0]foo': 'abc',
|
|
|
|
'[0]bar': 'def',
|
|
|
|
'[1]foo': 'hij',
|
2014-11-12 18:38:05 +03:00
|
|
|
'[1]bar': 'klm',
|
2014-08-29 19:46:26 +04:00
|
|
|
}
|
|
|
|
-->
|
|
|
|
[
|
|
|
|
{'foo': 'abc', 'bar': 'def'},
|
|
|
|
{'foo': 'hij', 'bar': 'klm'}
|
|
|
|
]
|
|
|
|
"""
|
|
|
|
ret = {}
|
|
|
|
regex = re.compile(r'^%s\[([0-9]+)\](.*)$' % re.escape(prefix))
|
|
|
|
for field, value in dictionary.items():
|
|
|
|
match = regex.match(field)
|
|
|
|
if not match:
|
|
|
|
continue
|
|
|
|
index, key = match.groups()
|
|
|
|
index = int(index)
|
|
|
|
if not key:
|
|
|
|
ret[index] = value
|
|
|
|
elif isinstance(ret.get(index), dict):
|
|
|
|
ret[index][key] = value
|
|
|
|
else:
|
2014-11-06 20:32:33 +03:00
|
|
|
ret[index] = MultiValueDict({key: [value]})
|
2014-08-29 19:46:26 +04:00
|
|
|
return [ret[item] for item in sorted(ret.keys())]
|
|
|
|
|
|
|
|
|
|
|
|
def parse_html_dict(dictionary, prefix):
|
|
|
|
"""
|
|
|
|
Used to support dictionary values in HTML forms.
|
|
|
|
|
|
|
|
{
|
|
|
|
'profile.username': 'example',
|
|
|
|
'profile.email': 'example@example.com',
|
|
|
|
}
|
|
|
|
-->
|
|
|
|
{
|
|
|
|
'profile': {
|
2014-11-12 18:38:39 +03:00
|
|
|
'username': 'example',
|
2014-08-29 19:46:26 +04:00
|
|
|
'email': 'example@example.com'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
"""
|
|
|
|
ret = {}
|
|
|
|
regex = re.compile(r'^%s\.(.+)$' % re.escape(prefix))
|
|
|
|
for field, value in dictionary.items():
|
|
|
|
match = regex.match(field)
|
|
|
|
if not match:
|
|
|
|
continue
|
|
|
|
key = match.groups()[0]
|
|
|
|
ret[key] = value
|
|
|
|
return ret
|