mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-31 07:57:55 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| Helpers for dealing with HTML input.
 | |
| """
 | |
| import re
 | |
| 
 | |
| from django.utils.datastructures import MultiValueDict
 | |
| 
 | |
| 
 | |
| 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='', default=None):
 | |
|     """
 | |
|     Used to support 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',
 | |
|         '[1]bar': 'klm',
 | |
|     }
 | |
|         -->
 | |
|     [
 | |
|         {'foo': 'abc', 'bar': 'def'},
 | |
|         {'foo': 'hij', 'bar': 'klm'}
 | |
|     ]
 | |
| 
 | |
|     :returns a list of objects, or the value specified in ``default`` if the list is empty
 | |
|     """
 | |
|     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:
 | |
|             ret[index] = MultiValueDict({key: [value]})
 | |
| 
 | |
|     # return the items of the ``ret`` dict, sorted by key, or ``default`` if the dict is empty
 | |
|     return [ret[item] for item in sorted(ret)] if ret else default
 | |
| 
 | |
| 
 | |
| def parse_html_dict(dictionary, prefix=''):
 | |
|     """
 | |
|     Used to support dictionary values in HTML forms.
 | |
| 
 | |
|     {
 | |
|         'profile.username': 'example',
 | |
|         'profile.email': 'example@example.com',
 | |
|     }
 | |
|         -->
 | |
|     {
 | |
|         'profile': {
 | |
|             'username': 'example',
 | |
|             'email': 'example@example.com'
 | |
|         }
 | |
|     }
 | |
|     """
 | |
|     ret = MultiValueDict()
 | |
|     regex = re.compile(r'^%s\.(.+)$' % re.escape(prefix))
 | |
|     for field in dictionary:
 | |
|         match = regex.match(field)
 | |
|         if not match:
 | |
|             continue
 | |
|         key = match.groups()[0]
 | |
|         value = dictionary.getlist(field)
 | |
|         ret.setlist(key, value)
 | |
| 
 | |
|     return ret
 |