client/securedrop_client/gui/conversation/delete/dialog.py (55 lines of code) (raw):

""" Conversation deletion dialog. Copyright (C) 2021 The Freedom of the Press Foundation. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ from gettext import gettext as _ from gettext import ngettext from securedrop_client.db import File, Message, Reply, Source from securedrop_client.gui.base import ModalDialog class DeleteConversationDialog(ModalDialog): """ Shown to confirm deletion of all content in a source conversation. """ def __init__(self, source: Source) -> None: super().__init__(show_header=False, dangerous=False) self.source = source self.body.setText(self.make_body_text()) self.continue_button.setText(_("YES, DELETE FILES AND MESSAGES")) self.continue_button.setFocus() self.adjustSize() def make_body_text(self) -> str: files = 0 messages = 0 replies = 0 for submission in self.source.collection: if isinstance(submission, Message): messages += 1 if isinstance(submission, Reply): replies += 1 elif isinstance(submission, File): files += 1 message_tuple = ( "<style>li {{line-height: 150%;}}</li></style>", "<p>", _( "Would you like to delete {files_to_delete}, {replies_to_delete}, " "{messages_to_delete} from the source account for {source}?" ), "</p>", "<p>", _( "Preserving the account will retain its metadata, and the ability for {source} " "to log in to your SecureDrop again." ), "</p>", ) files_to_delete = ngettext("one file", "{file_count} files", files).format(file_count=files) replies_to_delete = ngettext("one reply", "{reply_count} replies", replies).format( reply_count=replies ) messages_to_delete = ngettext("one message", "{message_count} messages", messages).format( message_count=messages ) source = f"<b>{self.source.journalist_designation}</b>" return "".join(message_tuple).format( files_to_delete=files_to_delete, messages_to_delete=messages_to_delete, replies_to_delete=replies_to_delete, source=source, ) def exec(self) -> int: # Refresh counters self.body.setText(self.make_body_text()) return super().exec()