diff options
| author | Rigel Di Scala <rigel.discala@propylon.com> | 2014-10-14 14:10:27 +0100 |
|---|---|---|
| committer | Loic Bistuer <loic.bistuer@gmail.com> | 2014-10-17 00:36:43 +0700 |
| commit | e8262b59418d68d55a97a25567e4bc4f078ed3cb (patch) | |
| tree | 832d3d71c88c2e74faf2d0c252a79f5f7aa1e393 /django | |
| parent | b729ef0bda5009389da7e3a5498dc1f6233761d6 (diff) | |
[1.7.x] Fixed #23615 -- Validate that a Model instance's "check" attribute is a method.
The "check" name is a reserved word used by Django's check framework,
and cannot be redefined as something else other than a method, or the check
framework will raise an error.
This change amends the django.core.checks.model_check.check_all_models()
function, so that it verifies that a model instance's attribute "check"
is actually a method. This new check is assigned the id "models.E020".
Conflicts:
docs/ref/checks.txt
Backport of a5c77417a6 from master
Diffstat (limited to 'django')
| -rw-r--r-- | django/core/checks/model_checks.py | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/django/core/checks/model_checks.py b/django/core/checks/model_checks.py index 3f5a36b41b..3d0d56af58 100644 --- a/django/core/checks/model_checks.py +++ b/django/core/checks/model_checks.py @@ -1,28 +1,43 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from itertools import chain +import inspect import types from django.apps import apps - -from . import Error, Tags, register +from django.core.checks import Error, Tags, register @register(Tags.models) def check_all_models(app_configs=None, **kwargs): - errors = [model.check(**kwargs) - for model in apps.get_models() - if app_configs is None or model._meta.app_config in app_configs] - return list(chain(*errors)) + errors = [] + for model in apps.get_models(): + if app_configs is None or model._meta.app_config in app_configs: + if not inspect.ismethod(model.check): + errors.append( + Error( + "The '%s.check()' class method is " + "currently overridden by %r." % ( + model.__name__, model.check), + hint=None, + obj=model, + id='models.E020' + ) + ) + else: + errors.extend(model.check(**kwargs)) + return errors @register(Tags.models, Tags.signals) def check_model_signals(app_configs=None, **kwargs): - """Ensure lazily referenced model signals senders are installed.""" + """ + Ensure lazily referenced model signals senders are installed. + """ + # Avoid circular import from django.db import models - errors = [] + errors = [] for name in dir(models.signals): obj = getattr(models.signals, name) if isinstance(obj, models.signals.ModelSignal): |
