测试gitnore
This commit is contained in:
@@ -33,7 +33,7 @@ class MigrationQuestioner:
|
||||
# file check will ensure we skip South ones.
|
||||
try:
|
||||
app_config = apps.get_app_config(app_label)
|
||||
except LookupError: # It's a fake app.
|
||||
except LookupError: # It's a fake app.
|
||||
return self.defaults.get("ask_initial", False)
|
||||
migrations_import_path, _ = MigrationLoader.migrations_module(app_config.label)
|
||||
if migrations_import_path is None:
|
||||
@@ -44,6 +44,7 @@ class MigrationQuestioner:
|
||||
except ImportError:
|
||||
return self.defaults.get("ask_initial", False)
|
||||
else:
|
||||
# getattr() needed on PY36 and older (replace with attribute access).
|
||||
if getattr(migrations_module, "__file__", None):
|
||||
filenames = os.listdir(os.path.dirname(migrations_module.__file__))
|
||||
elif hasattr(migrations_module, "__path__"):
|
||||
@@ -71,7 +72,7 @@ class MigrationQuestioner:
|
||||
return self.defaults.get("ask_rename_model", False)
|
||||
|
||||
def ask_merge(self, app_label):
|
||||
"""Should these migrations really be merged?"""
|
||||
"""Do you really want to merge these migrations?"""
|
||||
return self.defaults.get("ask_merge", False)
|
||||
|
||||
def ask_auto_now_add_addition(self, field_name, model_name):
|
||||
@@ -81,6 +82,7 @@ class MigrationQuestioner:
|
||||
|
||||
|
||||
class InteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
|
||||
def _boolean_input(self, question, default=None):
|
||||
result = input("%s " % question)
|
||||
if not result and default is not None:
|
||||
@@ -104,7 +106,7 @@ class InteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
return value
|
||||
result = input("Please select a valid option: ")
|
||||
|
||||
def _ask_default(self, default=""):
|
||||
def _ask_default(self, default=''):
|
||||
"""
|
||||
Prompt for a default value.
|
||||
|
||||
@@ -112,16 +114,13 @@ class InteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
string) which will be shown to the user and used as the return value
|
||||
if the user doesn't provide any other input.
|
||||
"""
|
||||
print("Please enter the default value as valid Python.")
|
||||
print("Please enter the default value now, as valid Python")
|
||||
if default:
|
||||
print(
|
||||
f"Accept the default '{default}' by pressing 'Enter' or "
|
||||
f"provide another value."
|
||||
"You can accept the default '{}' by pressing 'Enter' or you "
|
||||
"can provide another value.".format(default)
|
||||
)
|
||||
print(
|
||||
"The datetime and django.utils.timezone modules are available, so "
|
||||
"it is possible to provide e.g. timezone.now as a value."
|
||||
)
|
||||
print("The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now")
|
||||
print("Type 'exit' to exit this prompt")
|
||||
while True:
|
||||
if default:
|
||||
@@ -132,12 +131,12 @@ class InteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
if not code and default:
|
||||
code = default
|
||||
if not code:
|
||||
print("Please enter some code, or 'exit' (without quotes) to exit.")
|
||||
print("Please enter some code, or 'exit' (with no quotes) to exit.")
|
||||
elif code == "exit":
|
||||
sys.exit(1)
|
||||
else:
|
||||
try:
|
||||
return eval(code, {}, {"datetime": datetime, "timezone": timezone})
|
||||
return eval(code, {}, {'datetime': datetime, 'timezone': timezone})
|
||||
except (SyntaxError, NameError) as e:
|
||||
print("Invalid input: %s" % e)
|
||||
|
||||
@@ -145,18 +144,14 @@ class InteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
"""Adding a NOT NULL field to a model."""
|
||||
if not self.dry_run:
|
||||
choice = self._choice_input(
|
||||
f"It is impossible to add a non-nullable field '{field_name}' "
|
||||
f"to {model_name} without specifying a default. This is "
|
||||
f"because the database needs something to populate existing "
|
||||
f"rows.\n"
|
||||
f"Please select a fix:",
|
||||
"You are trying to add a non-nullable field '%s' to %s without a default; "
|
||||
"we can't do that (the database needs something to populate existing rows).\n"
|
||||
"Please select a fix:" % (field_name, model_name),
|
||||
[
|
||||
(
|
||||
"Provide a one-off default now (will be set on all existing "
|
||||
"rows with a null value for this column)"
|
||||
),
|
||||
"Quit and manually define a default value in models.py.",
|
||||
],
|
||||
("Provide a one-off default now (will be set on all existing "
|
||||
"rows with a null value for this column)"),
|
||||
"Quit, and let me add a default in models.py",
|
||||
]
|
||||
)
|
||||
if choice == 2:
|
||||
sys.exit(3)
|
||||
@@ -168,21 +163,18 @@ class InteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
"""Changing a NULL field to NOT NULL."""
|
||||
if not self.dry_run:
|
||||
choice = self._choice_input(
|
||||
f"It is impossible to change a nullable field '{field_name}' "
|
||||
f"on {model_name} to non-nullable without providing a "
|
||||
f"default. This is because the database needs something to "
|
||||
f"populate existing rows.\n"
|
||||
f"Please select a fix:",
|
||||
"You are trying to change the nullable field '%s' on %s to non-nullable "
|
||||
"without a default; we can't do that (the database needs something to "
|
||||
"populate existing rows).\n"
|
||||
"Please select a fix:" % (field_name, model_name),
|
||||
[
|
||||
(
|
||||
"Provide a one-off default now (will be set on all existing "
|
||||
"rows with a null value for this column)"
|
||||
),
|
||||
"Ignore for now. Existing rows that contain NULL values "
|
||||
"will have to be handled manually, for example with a "
|
||||
"RunPython or RunSQL operation.",
|
||||
"Quit and manually define a default value in models.py.",
|
||||
],
|
||||
("Provide a one-off default now (will be set on all existing "
|
||||
"rows with a null value for this column)"),
|
||||
("Ignore for now, and let me handle existing rows with NULL myself "
|
||||
"(e.g. because you added a RunPython or RunSQL operation to handle "
|
||||
"NULL values in a previous data migration)"),
|
||||
"Quit, and let me add a default in models.py",
|
||||
]
|
||||
)
|
||||
if choice == 2:
|
||||
return NOT_PROVIDED
|
||||
@@ -194,33 +186,21 @@ class InteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
|
||||
def ask_rename(self, model_name, old_name, new_name, field_instance):
|
||||
"""Was this field really renamed?"""
|
||||
msg = "Was %s.%s renamed to %s.%s (a %s)? [y/N]"
|
||||
return self._boolean_input(
|
||||
msg
|
||||
% (
|
||||
model_name,
|
||||
old_name,
|
||||
model_name,
|
||||
new_name,
|
||||
field_instance.__class__.__name__,
|
||||
),
|
||||
False,
|
||||
)
|
||||
msg = "Did you rename %s.%s to %s.%s (a %s)? [y/N]"
|
||||
return self._boolean_input(msg % (model_name, old_name, model_name, new_name,
|
||||
field_instance.__class__.__name__), False)
|
||||
|
||||
def ask_rename_model(self, old_model_state, new_model_state):
|
||||
"""Was this model really renamed?"""
|
||||
msg = "Was the model %s.%s renamed to %s? [y/N]"
|
||||
return self._boolean_input(
|
||||
msg
|
||||
% (old_model_state.app_label, old_model_state.name, new_model_state.name),
|
||||
False,
|
||||
)
|
||||
msg = "Did you rename the %s.%s model to %s? [y/N]"
|
||||
return self._boolean_input(msg % (old_model_state.app_label, old_model_state.name,
|
||||
new_model_state.name), False)
|
||||
|
||||
def ask_merge(self, app_label):
|
||||
return self._boolean_input(
|
||||
"\nMerging will only work if the operations printed above do not conflict\n"
|
||||
+ "with each other (working on different fields or models)\n"
|
||||
+ "Should these migration branches be merged? [y/N]",
|
||||
"\nMerging will only work if the operations printed above do not conflict\n" +
|
||||
"with each other (working on different fields or models)\n" +
|
||||
"Do you want to merge these migration branches? [y/N]",
|
||||
False,
|
||||
)
|
||||
|
||||
@@ -228,24 +208,24 @@ class InteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
"""Adding an auto_now_add field to a model."""
|
||||
if not self.dry_run:
|
||||
choice = self._choice_input(
|
||||
f"It is impossible to add the field '{field_name}' with "
|
||||
f"'auto_now_add=True' to {model_name} without providing a "
|
||||
f"default. This is because the database needs something to "
|
||||
f"populate existing rows.\n",
|
||||
"You are trying to add the field '{}' with 'auto_now_add=True' "
|
||||
"to {} without a default; the database needs something to "
|
||||
"populate existing rows.\n".format(field_name, model_name),
|
||||
[
|
||||
"Provide a one-off default now which will be set on all "
|
||||
"existing rows",
|
||||
"Quit and manually define a default value in models.py.",
|
||||
],
|
||||
"Provide a one-off default now (will be set on all "
|
||||
"existing rows)",
|
||||
"Quit, and let me add a default in models.py",
|
||||
]
|
||||
)
|
||||
if choice == 2:
|
||||
sys.exit(3)
|
||||
else:
|
||||
return self._ask_default(default="timezone.now")
|
||||
return self._ask_default(default='timezone.now')
|
||||
return None
|
||||
|
||||
|
||||
class NonInteractiveMigrationQuestioner(MigrationQuestioner):
|
||||
|
||||
def ask_not_null_addition(self, field_name, model_name):
|
||||
# We can't ask the user, so act like the user aborted.
|
||||
sys.exit(3)
|
||||
|
||||
Reference in New Issue
Block a user