diff options
| author | Aaron France <aaron.l.france@gmail.com> | 2014-02-15 11:28:09 +0100 |
|---|---|---|
| committer | Baptiste Mispelon <bmispelon@gmail.com> | 2014-02-15 15:01:44 +0100 |
| commit | 23b781cc3d17f12c5158f781b2c8cd9d47550c20 (patch) | |
| tree | a832668067ead7c6496a820c3e8b65809e8dfe05 /django | |
| parent | 2ebccebf0609229317c2f5b9a76664dc216f27eb (diff) | |
Fixed #22018 -- Fixed checks for ModelAdmin.fields not handling sub-lists.
Flatten a level of sublists before checking for duplicate fields.
When given sublists such as:
```python
class FooAdmin(admin.ModelAdmin):
fields = ('one', ('one', 'two'))
```
The previous code did not correctly detect the duplicated 'one' field.
Thanks to jwa for the report.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/admin/checks.py | 24 | ||||
| -rw-r--r-- | django/contrib/admin/utils.py | 20 |
2 files changed, 28 insertions, 16 deletions
diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py index 855e916eaa..4238297b22 100644 --- a/django/contrib/admin/checks.py +++ b/django/contrib/admin/checks.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from itertools import chain -from django.contrib.admin.utils import get_fields_from_path, NotRelationField +from django.contrib.admin.utils import get_fields_from_path, NotRelationField, flatten from django.core import checks from django.db import models from django.db.models.fields import FieldDoesNotExist @@ -84,7 +84,8 @@ class BaseModelAdminChecks(object): id='admin.E005', ) ] - elif len(cls.fields) != len(set(cls.fields)): + fields = flatten(cls.fields) + if len(fields) != len(set(fields)): return [ checks.Error( 'There are duplicate field(s) in "fields".', @@ -93,11 +94,11 @@ class BaseModelAdminChecks(object): id='admin.E006', ) ] - else: - return list(chain(*[ + + return list(chain(*[ self._check_field_spec(cls, model, field_name, 'fields') for field_name in cls.fields - ])) + ])) def _check_fieldsets(self, cls, model): """ Check that fieldsets is properly formatted and doesn't contain @@ -132,7 +133,9 @@ class BaseModelAdminChecks(object): id='admin.E011', ) ] - elif len(fieldset[1]['fields']) != len(set(fieldset[1]['fields'])): + + fields = flatten(fieldset[1]['fields']) + if len(fields) != len(set(fields)): return [ checks.Error( 'There are duplicate field(s) in "%s[1]".' % label, @@ -141,11 +144,10 @@ class BaseModelAdminChecks(object): id='admin.E012', ) ] - else: - return list(chain(*[ - self._check_field_spec(cls, model, fields, '%s[1][\'fields\']' % label) - for fields in fieldset[1]['fields'] - ])) + return list(chain(*[ + self._check_field_spec(cls, model, fields, '%s[1][\'fields\']' % label) + for fields in fieldset[1]['fields'] + ])) def _check_field_spec(self, cls, model, fields, label): """ `fields` should be an item of `fields` or an item of diff --git a/django/contrib/admin/utils.py b/django/contrib/admin/utils.py index a2f2e9fa7b..b52300756b 100644 --- a/django/contrib/admin/utils.py +++ b/django/contrib/admin/utils.py @@ -83,15 +83,25 @@ def unquote(s): return "".join(res) +def flatten(fields): + """Returns a list which is a single level of flattening of the + original list.""" + flat = [] + for field in fields: + if isinstance(field, (list, tuple)): + flat.extend(field) + else: + flat.append(field) + return flat + + def flatten_fieldsets(fieldsets): """Returns a list of field names from an admin fieldsets structure.""" field_names = [] for name, opts in fieldsets: - for field in opts['fields']: - if isinstance(field, (list, tuple)): - field_names.extend(field) - else: - field_names.append(field) + field_names.extend( + flatten(opts['fields']) + ) return field_names |
