Skip to content

Commit

Permalink
no longer try to show conversation for deleted src
Browse files Browse the repository at this point in the history
  • Loading branch information
Allie Crevier committed Apr 15, 2019
1 parent 261fa2c commit 2816a6e
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 18 deletions.
8 changes: 7 additions & 1 deletion securedrop_client/gui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,15 @@ def on_source_changed(self):
"""
source_item = self.main_view.source_list.currentItem()
source_widget = self.main_view.source_list.itemWidget(source_item)
if source_widget:

# Show conversation for the currently-selected source if it hasn't been deleted. If the
# current source no longer exists, clear the conversation for that source
self.current_source = None
if source_widget and self.controller.source_exists(source_widget.source.uuid):
self.current_source = source_widget.source
self.show_conversation_for(self.current_source, self.controller.is_authenticated)
else:
self.main_view.clear_conversation()

def show_conversation_for(self, source: Source, is_authenticated: bool):
"""
Expand Down
23 changes: 12 additions & 11 deletions securedrop_client/gui/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from typing import List
from uuid import uuid4

from securedrop_client.db import Source, Message, File
from securedrop_client.db import Source, Message, File, Reply
from securedrop_client.gui import SvgLabel, SvgPushButton
from securedrop_client.logic import Client
from securedrop_client.resources import load_svg, load_icon, load_image
Expand Down Expand Up @@ -631,6 +631,12 @@ def set_conversation(self, widget):
self.view_layout.addWidget(widget)
widget.show()

def clear_conversation(self):
while self.view_layout.count():
child = self.view_layout.takeAt(0)
if child.widget():
child.widget().deleteLater()


class SourceList(QListWidget):
"""
Expand Down Expand Up @@ -701,12 +707,7 @@ def launch(self):
"""
message = self._construct_message(self.source)
reply = QMessageBox.question(
self.parent,
"",
_(message),
QMessageBox.Cancel | QMessageBox.Yes,
QMessageBox.Cancel
)
self.parent, "", _(message), QMessageBox.Cancel | QMessageBox.Yes, QMessageBox.Cancel)

if reply == QMessageBox.Yes:
logger.debug("Deleting source %s" % (self.source.uuid,))
Expand All @@ -715,16 +716,19 @@ def launch(self):
def _construct_message(self, source: Source) -> str:
files = 0
messages = 0
replies = 0
for submission in source.collection:
if isinstance(submission, Message):
messages += 1
if isinstance(submission, Reply):
replies += 1
elif isinstance(submission, File):
files += 1

message = (
"<big>Deleting the Source account for",
"<b>{}</b> will also".format(source.journalist_designation,),
"delete {} files and {} messages.</big>".format(files, messages),
"delete {} files, {} replies, and {} messages.</big>".format(files, replies, messages),
"<br>",
"<small>This Source will no longer be able to correspond",
"through the log-in tied to this account.</small>",
Expand Down Expand Up @@ -1261,7 +1265,6 @@ def update_conversation(self, collection: list) -> None:
if conversation_item.filename.endswith('msg.gpg'):
self.add_message(conversation_item)
elif conversation_item.filename.endswith('reply.gpg'):
self.controller.session.refresh(conversation_item)
if conversation_item.content is not None:
content = conversation_item.content
else:
Expand Down Expand Up @@ -1293,7 +1296,6 @@ def add_message(self, message: Message) -> None:
"""
Add a message from the source.
"""
self.controller.session.refresh(message)
if message.content is not None:
content = message.content
else:
Expand Down Expand Up @@ -1423,7 +1425,6 @@ def __init__(self, source, parent, controller):
def trigger(self):
if self.controller.api is None:
self.controller.on_action_requiring_login()
return
else:
self.messagebox.launch()

Expand Down
7 changes: 7 additions & 0 deletions securedrop_client/logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -731,3 +731,10 @@ def _on_reply_complete(self, result, current_object: (str, str)) -> None:
def _on_reply_timeout(self, current_object: (str, str)) -> None:
_, reply_uuid = current_object
self.reply_failed.emit(reply_uuid)

def source_exists(self, source_uuid: str):
try:
self.session.query(db.Source).filter_by(uuid=source_uuid).one()
return True
except Exception:
return False
16 changes: 10 additions & 6 deletions tests/gui/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -1307,6 +1307,8 @@ def test_DeleteSourceMssageBox_launch_when_user_chooses_yes(mocker, source, sess
session.add(message)
message = factory.Message(source=source)
session.add(message)
reply = factory.Reply(source=source)
session.add(reply)
session.commit()

mock_message_box_question = mocker.MagicMock(QMessageBox.question)
Expand All @@ -1326,11 +1328,11 @@ def test_DeleteSourceMssageBox_launch_when_user_chooses_yes(mocker, source, sess
message = (
"<big>Deleting the Source account for "
"<b>{designation}</b> will also "
"delete {files} files and {messages} messages.</big> "
"<br> "
"delete {files} files, {replies} replies, and {messages} messages.</big>"
" <br> "
"<small>This Source will no longer be able to correspond "
"through the log-in tied to this account.</small>"
).format(designation=source.journalist_designation, files=1, messages=2)
).format(designation=source.journalist_designation, files=1, replies=1, messages=2)
mock_message_box_question.assert_called_once_with(
None,
"",
Expand All @@ -1348,6 +1350,8 @@ def test_DeleteSourceMessageBox_construct_message(mocker, source, session):
session.add(message)
message = factory.Message(source=source)
session.add(message)
reply = factory.Reply(source=source)
session.add(reply)
session.commit()

mock_controller = mocker.MagicMock()
Expand All @@ -1359,11 +1363,11 @@ def test_DeleteSourceMessageBox_construct_message(mocker, source, session):
expected_message = (
"<big>Deleting the Source account for "
"<b>{designation}</b> will also "
"delete {files} files and {messages} messages.</big> "
"<br> "
"delete {files} files, {replies} replies, and {messages} messages.</big>"
" <br> "
"<small>This Source will no longer be able to correspond "
"through the log-in tied to this account.</small>"
).format(designation=source.journalist_designation, files=1, messages=2)
).format(designation=source.journalist_designation, files=1, replies=1, messages=2)
assert message == expected_message


Expand Down

0 comments on commit 2816a6e

Please sign in to comment.