1
0
mirror of https://github.com/django/django.git synced 2024-11-20 16:34:17 +00:00

Fixed #35882 -- Made migration questioner loop on all errors.

This commit is contained in:
Adam Johnson 2024-11-18 14:39:55 +01:00 committed by Sarah Boyce
parent 3434fab758
commit e035db1bc3
2 changed files with 21 additions and 4 deletions

View File

@ -160,8 +160,8 @@ class InteractiveMigrationQuestioner(MigrationQuestioner):
else:
try:
return eval(code, {}, {"datetime": datetime, "timezone": timezone})
except (SyntaxError, NameError) as e:
self.prompt_output.write("Invalid input: %s" % e)
except Exception as e:
self.prompt_output.write(f"{e.__class__.__name__}: {e}")
def ask_not_null_addition(self, field_name, model_name):
"""Adding a NOT NULL field to a model."""

View File

@ -61,10 +61,27 @@ class QuestionerHelperMethodsTests(SimpleTestCase):
)
@mock.patch("builtins.input", side_effect=["bad code", "exit"])
def test_questioner_no_default_bad_user_entry_code(self, mock_input):
def test_questioner_no_default_syntax_error(self, mock_input):
with self.assertRaises(SystemExit):
self.questioner._ask_default()
self.assertIn("Invalid input: ", self.prompt.getvalue())
self.assertIn("SyntaxError: invalid syntax", self.prompt.getvalue())
@mock.patch("builtins.input", side_effect=["datetim", "exit"])
def test_questioner_no_default_name_error(self, mock_input):
with self.assertRaises(SystemExit):
self.questioner._ask_default()
self.assertIn(
"NameError: name 'datetim' is not defined", self.prompt.getvalue()
)
@mock.patch("builtins.input", side_effect=["datetime.dat", "exit"])
def test_questioner_no_default_attribute_error(self, mock_input):
with self.assertRaises(SystemExit):
self.questioner._ask_default()
self.assertIn(
"AttributeError: module 'datetime' has no attribute 'dat'",
self.prompt.getvalue(),
)
@mock.patch("builtins.input", side_effect=[KeyboardInterrupt()])
def test_questioner_no_default_keyboard_interrupt(self, mock_input):