50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
from __future__ import unicode_literals
|
||
|
|
||
|
from itertools import chain
|
||
|
import types
|
||
|
|
||
|
from django.apps import apps
|
||
|
|
||
|
from . import Error, register
|
||
|
|
||
|
|
||
|
@register('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))
|
||
|
|
||
|
|
||
|
@register('models', 'signals')
|
||
|
def check_model_signals(app_configs=None, **kwargs):
|
||
|
"""Ensure lazily referenced model signals senders are installed."""
|
||
|
from django.db import models
|
||
|
errors = []
|
||
|
|
||
|
for name in dir(models.signals):
|
||
|
obj = getattr(models.signals, name)
|
||
|
if isinstance(obj, models.signals.ModelSignal):
|
||
|
for reference, receivers in obj.unresolved_references.items():
|
||
|
for receiver, _, _ in receivers:
|
||
|
# The receiver is either a function or an instance of class
|
||
|
# defining a `__call__` method.
|
||
|
if isinstance(receiver, types.FunctionType):
|
||
|
description = "The `%s` function" % receiver.__name__
|
||
|
else:
|
||
|
description = "An instance of the `%s` class" % receiver.__class__.__name__
|
||
|
errors.append(
|
||
|
Error(
|
||
|
"%s was connected to the `%s` signal "
|
||
|
"with a lazy reference to the '%s' sender, "
|
||
|
"which has not been installed." % (
|
||
|
description, name, '.'.join(reference)
|
||
|
),
|
||
|
obj=receiver.__module__,
|
||
|
hint=None,
|
||
|
id='E014'
|
||
|
)
|
||
|
)
|
||
|
return errors
|