Kaynağa Gözat

Add management commands to reset demo environment

Jake Howard 2 yıl önce
ebeveyn
işleme
451db64630

+ 14 - 0
bakerydemo/base/management/commands/reset_admin_password.py

@@ -0,0 +1,14 @@
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.core.management.base import BaseCommand, CommandError
+
+
+class Command(BaseCommand):
+    def handle(self, **options):
+        try:
+            admin_user = User.objects.get(username="admin")
+        except User.DoesNotExist:
+            raise CommandError("Cannot find admin user.")
+
+        admin_user.set_password(settings.ADMIN_PASSWORD)
+        admin_user.save(update_fields=["password"])

+ 40 - 0
bakerydemo/base/management/commands/reset_demo.py

@@ -0,0 +1,40 @@
+from django.conf import settings
+from django.core.files.storage import default_storage
+from django.core.management import call_command
+from django.core.management.base import BaseCommand, CommandError
+from django.db import DEFAULT_DB_ALIAS
+from django_extensions.settings import POSTGRESQL_ENGINES
+from wagtail.documents import get_document_model
+from wagtail.images import get_image_model
+
+
+class Command(BaseCommand):
+    def handle(self, **options):
+        if settings.DATABASES[DEFAULT_DB_ALIAS]["ENGINE"] not in POSTGRESQL_ENGINES:
+            raise CommandError(
+                "This command can be used only with PostgreSQL databases."
+            )
+
+        # 1. (optional) Remove all objects from S3
+        if "s3" in settings.DEFAULT_FILE_STORAGE:
+            self.stdout.write("Removing files from S3")
+            default_storage.bucket.objects.all().delete()
+        else:
+            self.stdout.write("Removing images")
+            get_image_model().objects.all().delete()
+
+            self.stdout.write("Removing documents")
+            get_document_model().objects.all().delete()
+
+        # 2. Reset database to nothing
+        self.stdout.write("Reset schema")
+        call_command("reset_schema", interactive=False)
+
+        # 3. Rebuild database
+        call_command("migrate", interactive=False)
+
+        # 4. Re-import data
+        call_command("load_initial_data")
+
+        # 5. Change the admin password (in case it's different in this environment)
+        call_command("reset_admin_password")

+ 2 - 0
bakerydemo/settings/base.py

@@ -194,3 +194,5 @@ WAGTAIL_CONTENT_LANGUAGES = LANGUAGES = [
     ("de", "Deutsch"),
     ("ar", "العربيّة"),
 ]
+
+ADMIN_PASSWORD = os.environ.get("ADMIN_PASSWORD", "changeme")