From 8196b1f265da31af04edc7b9347539a162c5553a Mon Sep 17 00:00:00 2001 From: TheAfroOfDoom Date: Fri, 3 Jun 2022 21:48:28 -0400 Subject: [PATCH 1/2] Set undefined env variables using CLI arguments Both `DJANGO_SETTINGS_MODULE` and `DJANGO_CONFIGURATION` are required for `django.configurations.importer` to install, else it throws an exception. If the `importer` is not installed, `django.setup()` fails on `configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)` when trying to access uninitialized settings. fixes #309 (https://github.com/PyCQA/pylint-django/issues/309#issuecomment-817098961) fixes #325 might relate to #362 --- CONTRIBUTORS.md | 1 + pylint_django/checkers/foreign_key_strings.py | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 07160217..5fdc3150 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -20,3 +20,4 @@ * [naquiroz](https://github.com/naquiroz) * [john-sandall](https://github.com/john-sandall) * [dineshtrivedi](https://github.com/dineshtrivedi) +* [TheAfroOfDoom](https://github.com/TheAfroOfDoom) diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index c145301e..c5400454 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -1,6 +1,9 @@ from __future__ import absolute_import +import os + import astroid +from configurations import importer from pylint.checkers import BaseChecker from pylint.checkers.utils import check_messages from pylint.interfaces import IAstroidChecker @@ -41,6 +44,15 @@ class ForeignKeyStringsChecker(BaseChecker): "help": "A module containing Django settings to be used while linting.", }, ), + ( + "django-configuration", + { + "default": None, + "type": "string", + "metavar": "", + "help": "The configuration for Django to use while linting.", + }, + ), ) msgs = { @@ -89,6 +101,32 @@ def open(self): try: import django # pylint: disable=import-outside-toplevel + if ( + os.environ.get("DJANGO_SETTINGS_MODULE") is None + or os.environ.get("DJANGO_CONFIGURATION") is None + ): + try: + os.environ.setdefault( + "DJANGO_SETTINGS_MODULE", + os.environ.get("DJANGO_SETTINGS_MODULE") + or self.config.django_settings_module, + ) + os.environ.setdefault( + "DJANGO_CONFIGURATION", + os.environ.get("DJANGO_CONFIGURATION") + or self.config.django_configuration, + ) + except TypeError as ex: + missing_module = "" + if self.config.django_settings_module is None: + missing_module = "DJANGO_SETTINGS_MODULE" + else: + missing_module = "DJANGO_CONFIGURATION" + raise RuntimeError( + f"{missing_module} required to initialize Django project settings" + ) from ex + importer.install() + django.setup() from django.apps import ( # noqa pylint: disable=import-outside-toplevel,unused-import apps, From ec3bcf6156788c97e26939f90a1d8aed8f56b755 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 4 Jun 2022 01:55:04 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pylint_django/checkers/foreign_key_strings.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/pylint_django/checkers/foreign_key_strings.py b/pylint_django/checkers/foreign_key_strings.py index c5400454..477c4958 100644 --- a/pylint_django/checkers/foreign_key_strings.py +++ b/pylint_django/checkers/foreign_key_strings.py @@ -101,20 +101,15 @@ def open(self): try: import django # pylint: disable=import-outside-toplevel - if ( - os.environ.get("DJANGO_SETTINGS_MODULE") is None - or os.environ.get("DJANGO_CONFIGURATION") is None - ): + if os.environ.get("DJANGO_SETTINGS_MODULE") is None or os.environ.get("DJANGO_CONFIGURATION") is None: try: os.environ.setdefault( "DJANGO_SETTINGS_MODULE", - os.environ.get("DJANGO_SETTINGS_MODULE") - or self.config.django_settings_module, + os.environ.get("DJANGO_SETTINGS_MODULE") or self.config.django_settings_module, ) os.environ.setdefault( "DJANGO_CONFIGURATION", - os.environ.get("DJANGO_CONFIGURATION") - or self.config.django_configuration, + os.environ.get("DJANGO_CONFIGURATION") or self.config.django_configuration, ) except TypeError as ex: missing_module = "" @@ -122,9 +117,7 @@ def open(self): missing_module = "DJANGO_SETTINGS_MODULE" else: missing_module = "DJANGO_CONFIGURATION" - raise RuntimeError( - f"{missing_module} required to initialize Django project settings" - ) from ex + raise RuntimeError(f"{missing_module} required to initialize Django project settings") from ex importer.install() django.setup()