diff --git a/api/funkwhale_api/common/management/commands/makemigrations.py b/api/funkwhale_api/common/management/commands/makemigrations.py new file mode 100644 index 0000000000000000000000000000000000000000..f8530f1a7a6133962ea3f70d2861ad5bdf745375 --- /dev/null +++ b/api/funkwhale_api/common/management/commands/makemigrations.py @@ -0,0 +1,22 @@ +import os + +from django.core.management.base import CommandError +from django.core.management.commands.makemigrations import Command as BaseCommand + + +class Command(BaseCommand): + def handle(self, *apps_label, **options): + """ + Running makemigrations in production can have desastrous consequences. + + We ensure the command is disabled, unless a specific env var is provided. + """ + force = os.environ.get("FORCE") == "1" + if not force: + raise CommandError( + "Running makemigrations on your Funkwhale instance can have desastrous" + " consequences. This command is disabled, and should only be run in " + "development environments." + ) + + return super().handle(*apps_label, **options) diff --git a/api/funkwhale_api/common/management/commands/migrate.py b/api/funkwhale_api/common/management/commands/migrate.py new file mode 100644 index 0000000000000000000000000000000000000000..0f7b2dcd8faba9e06f92daa6640606d8fcf2a483 --- /dev/null +++ b/api/funkwhale_api/common/management/commands/migrate.py @@ -0,0 +1,29 @@ +from django.core.management.commands.migrate import Command as BaseCommand + + +def patch_write(buffer): + """ + Django is trying to help us when running migrate, by checking we don't have + model changes not included in migrations. Unfortunately, running makemigrations + on production instances create unwanted migrations and corrupt the database. + + So we disabled the makemigrations command, and we're patching the + write method to ensure misleading messages are never shown to the user, + because https://github.com/django/django/blob/2.1.5/django/core/management/commands/migrate.py#L186 + does not leave an easy way to disable them. + """ + unpatched = buffer.write + + def p(message, *args, **kwargs): + if "'manage.py makemigrations'" in message or "not yet reflected" in message: + return + return unpatched(message, *args, **kwargs) + + setattr(buffer, "write", p) + + +class Command(BaseCommand): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + patch_write(self.stdout) diff --git a/changes/changelog.d/685.enhancement b/changes/changelog.d/685.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..f9cc105abd5540e455e7dd80a1e50cabb6f8d6e3 --- /dev/null +++ b/changes/changelog.d/685.enhancement @@ -0,0 +1 @@ +Disable makemigrations in production and misleading message when running migrate (#685)