Fix #218 - Handle model 'objects' call with other parts in the name.

This commit is contained in:
David Wobrock authored and David Wobrock committed 2022-07-09 15:37:57 +02:00
1 parent 3baf9487bd
commit f67f27354d
3 files changed
+26 -3

No files matched your search

+4
View File
@@ -1,3 +1,7 @@
## 4.1.1 (unreleased)
- Fixed `RunPython` model import check when using a `through` object like `MyModel.many_to_many.through.objects.filter(...)` (issue #218)
## 4.1.0
- Allow configuring logging for `makemigrations` command and unify behaviour with `lintmigrations` (issue #207)
+2 -1
View File
@@ -531,7 +531,7 @@ class MigrationLinter(object):
@staticmethod
def get_runpython_model_import_issues(code):
model_object_regex = re.compile(r"[^a-zA-Z]?([a-zA-Z0-9]+?)\.objects")
model_object_regex = re.compile(r"[^a-zA-Z0-9._]?([a-zA-Z0-9._]+?)\.objects")
function_name = code.__name__
source_code = inspect.getsource(code)
@@ -539,6 +539,7 @@ class MigrationLinter(object):
called_models = model_object_regex.findall(source_code)
issues = []
for model in called_models:
model = model.split(".", 1)[0]
has_get_model_call = (
re.search(
r"{}.*= +\w+\.get_model\(".format(model),
+20 -2
View File
@@ -137,7 +137,7 @@ class DataMigrationModelImportTestCase(unittest.TestCase):
def test_not_overlapping_model_name(self):
"""
Correct for the import error, but should raise a warning
Correct for the import error, but should raise a warning.
"""
def forward_method(apps, schema_editor):
@@ -159,7 +159,7 @@ class DataMigrationModelImportTestCase(unittest.TestCase):
def test_not_overlapping_one_param(self):
"""
Not an error, but should raise a warning
Not an error, but should raise a warning.
"""
def forward_method(apps, schema_editor):
@@ -170,6 +170,24 @@ class DataMigrationModelImportTestCase(unittest.TestCase):
issues = MigrationLinter.get_runpython_model_import_issues(forward_method)
self.assertEqual(0, len(issues))
def test_m2m_through_orm_usage(self):
def forward_method(apps, schema_editor):
MyModel = apps.get_model("myapp", "MyModel")
MyModel.many_to_many.through.objects.filter(id=1).first()
issues = MigrationLinter.get_runpython_model_import_issues(forward_method)
self.assertEqual(0, len(issues))
def test_missing_m2m_through_orm(self):
def forward_method(apps, schema_editor):
from tests.test_project.app_data_migrations.models import MyModel
MyModel.many_to_many.through.objects.filter(id=1).first()
issues = MigrationLinter.get_runpython_model_import_issues(forward_method)
self.assertEqual(1, len(issues))
class DataMigrationModelVariableNamingTestCase(unittest.TestCase):
def test_same_variable_name(self):