from __future__ import unicode_literals

from django.db import models

def check_test_runner():
    """
    Checks if the user has *not* overridden the ``TEST_RUNNER`` setting &
    warns them about the default behavior changes.

    If the user has overridden that setting, we presume they know what they're
    doing & avoid generating a message.
    """
    from django.conf import settings
    new_default = 'django.test.runner.DiscoverRunner'
    test_runner_setting = getattr(settings, 'TEST_RUNNER', new_default)

    if test_runner_setting == new_default:
        message = [
            "You have not explicitly set 'TEST_RUNNER'. In Django 1.6,",
            "there is a new test runner ('%s')" % new_default,
            "by default. You should ensure your tests are still all",
            "running & behaving as expected. See",
            "https://docs.djangoproject.com/en/dev/releases/1.6/#discovery-of-tests-in-any-test-module",
            "for more information.",
        ]
        return ' '.join(message)

def check_boolean_field_default_value():
    """
    Checks if there are any BooleanFields without a default value, &
    warns the user that the default has changed from False to Null.
    """
    fields = []
    for cls in models.get_models():
        opts = cls._meta
        for f in opts.local_fields:
            if isinstance(f, models.BooleanField) and not f.has_default():
                fields.append(
                    '%s.%s: "%s"' % (opts.app_label, opts.object_name, f.name)
                )
    if fields:
        fieldnames = ", ".join(fields)
        message = [
            "You have not set a default value for one or more BooleanFields:",
            "%s." % fieldnames,
            "In Django 1.6 the default value of BooleanField was changed from",
            "False to Null when Field.default isn't defined. See",
            "https://docs.djangoproject.com/en/1.6/ref/models/fields/#booleanfield"
            "for more information."
        ]
        return ' '.join(message)


def run_checks():
    """
    Required by the ``check`` management command, this returns a list of
    messages from all the relevant check functions for this version of Django.
    """
    checks = [
        check_test_runner(),
        check_boolean_field_default_value(),
    ]
    # Filter out the ``None`` or empty strings.
    return [output for output in checks if output]
