2020-01-14 21:59:46 +01:00
|
|
|
from typing import Any
|
|
|
|
|
2019-06-25 19:11:56 +02:00
|
|
|
from django.core.management.base import CommandParser
|
2023-10-12 19:43:45 +02:00
|
|
|
from typing_extensions import override
|
2019-06-25 19:11:56 +02:00
|
|
|
|
|
|
|
from zerver.lib.management import ZulipBaseCommand
|
2020-06-11 00:54:34 +02:00
|
|
|
from zerver.lib.retention import (
|
|
|
|
restore_all_data_from_archive,
|
|
|
|
restore_data_from_archive,
|
|
|
|
restore_data_from_archive_by_realm,
|
|
|
|
)
|
2019-06-25 19:11:56 +02:00
|
|
|
from zerver.models import ArchiveTransaction
|
|
|
|
|
|
|
|
|
|
|
|
class Command(ZulipBaseCommand):
|
|
|
|
help = """
|
|
|
|
Restore recently deleted messages from the archive, that
|
|
|
|
have not been vacuumed (because the time limit of
|
|
|
|
ARCHIVED_DATA_VACUUMING_DELAY_DAYS has not passed).
|
|
|
|
|
|
|
|
Intended primarily for use after against potential bugs in
|
|
|
|
Zulip's message retention and deletion features.
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
To restore all recently deleted messages:
|
2021-05-10 21:16:32 +02:00
|
|
|
./manage.py restore_messages --all --restore-deleted
|
2020-03-28 01:25:56 +01:00
|
|
|
To restore a specific ArchiveTransaction:
|
2019-06-25 19:11:56 +02:00
|
|
|
./manage.py restore_messages --transaction-id=1
|
|
|
|
"""
|
|
|
|
|
2023-10-12 19:43:45 +02:00
|
|
|
@override
|
2019-06-25 19:11:56 +02:00
|
|
|
def add_arguments(self, parser: CommandParser) -> None:
|
2021-02-12 08:19:30 +01:00
|
|
|
parser.add_argument(
|
2021-05-10 21:16:32 +02:00
|
|
|
"--all",
|
|
|
|
action="store_true",
|
|
|
|
help="Restore archived messages from all realms. "
|
|
|
|
"(Does not restore manually deleted messages.)",
|
|
|
|
)
|
|
|
|
parser.add_argument(
|
2021-02-12 08:20:45 +01:00
|
|
|
"--restore-deleted",
|
|
|
|
action="store_true",
|
2021-05-10 21:16:32 +02:00
|
|
|
help="With --all, also restores manually deleted messages.",
|
2021-02-12 08:19:30 +01:00
|
|
|
)
|
|
|
|
parser.add_argument(
|
2021-02-12 08:20:45 +01:00
|
|
|
"-t", "--transaction-id", type=int, help="Restore a specific ArchiveTransaction."
|
2021-02-12 08:19:30 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
self.add_realm_args(
|
|
|
|
parser,
|
2021-02-12 08:20:45 +01:00
|
|
|
help="Restore archived messages from the specified realm. "
|
|
|
|
"(Does not restore manually deleted messages.)",
|
2021-02-12 08:19:30 +01:00
|
|
|
)
|
2019-06-25 19:11:56 +02:00
|
|
|
|
2023-10-12 19:43:45 +02:00
|
|
|
@override
|
2021-08-14 16:51:57 +02:00
|
|
|
def handle(self, *args: Any, **options: Any) -> None:
|
2019-06-25 19:11:56 +02:00
|
|
|
realm = self.get_realm(options)
|
|
|
|
if realm:
|
|
|
|
restore_data_from_archive_by_realm(realm)
|
2021-02-12 08:20:45 +01:00
|
|
|
elif options["transaction_id"]:
|
|
|
|
restore_data_from_archive(ArchiveTransaction.objects.get(id=options["transaction_id"]))
|
2021-05-10 21:16:32 +02:00
|
|
|
elif options["all"]:
|
2021-02-12 08:20:45 +01:00
|
|
|
restore_all_data_from_archive(restore_manual_transactions=options["restore_deleted"])
|
2021-05-10 21:16:32 +02:00
|
|
|
else:
|
|
|
|
self.print_help("./manage.py", "restore_messages")
|