Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add download conversation #1388

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion securedrop_client/api_jobs/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from sdclientapi import User as SDKUser
from sqlalchemy.orm.session import Session

from securedrop_client import state
from securedrop_client.api_jobs.base import ApiJob
from securedrop_client.db import DeletedUser, DraftReply, User
from securedrop_client.storage import get_remote_data, update_local_storage
Expand All @@ -19,9 +20,10 @@ class MetadataSyncJob(ApiJob):

NUMBER_OF_TIMES_TO_RETRY_AN_API_CALL = 2

def __init__(self, data_dir: str) -> None:
def __init__(self, data_dir: str, app_state: Optional[state.State] = None) -> None:
super().__init__(remaining_attempts=self.NUMBER_OF_TIMES_TO_RETRY_AN_API_CALL)
self.data_dir = data_dir
self._state = app_state

def call_api(self, api_client: API, session: Session) -> Any:
"""
Expand All @@ -43,6 +45,8 @@ def call_api(self, api_client: API, session: Session) -> Any:
MetadataSyncJob._update_users(session, users)
sources, submissions, replies = get_remote_data(api_client)
update_local_storage(session, sources, submissions, replies, self.data_dir)
if self._state is not None:
_update_state(self._state, submissions)

def _update_users(session: Session, remote_users: List[SDKUser]) -> None:
"""
Expand Down Expand Up @@ -122,3 +126,14 @@ def _update_users(session: Session, remote_users: List[SDKUser]) -> None:
logger.debug(f"Deleting account for user with uuid='{uuid}'")

session.commit()


def _update_state(
app_state: state.State,
submissions: List,
) -> None:
for submission in submissions:
if submission.is_file():
app_state.add_file(
state.ConversationId(submission.source_uuid), state.FileId(submission.uuid)
)
9 changes: 7 additions & 2 deletions securedrop_client/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication, QMessageBox

from securedrop_client import __version__
from securedrop_client import __version__, state
from securedrop_client.database import Database
from securedrop_client.db import make_session_maker
from securedrop_client.gui.main import Window
from securedrop_client.logic import Controller
Expand Down Expand Up @@ -215,13 +216,17 @@ def start_app(args, qt_args) -> NoReturn: # type: ignore [no-untyped-def]

session_maker = make_session_maker(args.sdc_home)

gui = Window()
session = session_maker()
database = Database(session)
app_state = state.State(database)
gui = Window(app_state)

controller = Controller(
"http://localhost:8081/",
gui,
session_maker,
args.sdc_home,
app_state,
not args.no_proxy,
not args.no_qubes,
)
Expand Down
19 changes: 19 additions & 0 deletions securedrop_client/database.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright © 2022 The Freedom of the Press Foundation.
from typing import List

from sqlalchemy.orm.session import Session

from securedrop_client.db import File
from securedrop_client.storage import get_local_files


class Database:
"""Provide an interface to the database while abstracting session details."""

def __init__(self, session: Session):
super().__init__()
self.session = session

def get_files(self) -> List[File]:
return get_local_files(self.session)
6 changes: 3 additions & 3 deletions securedrop_client/gui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from PyQt5.QtGui import QGuiApplication, QIcon, QKeySequence
from PyQt5.QtWidgets import QAction, QApplication, QHBoxLayout, QMainWindow, QVBoxLayout, QWidget

from securedrop_client import __version__
from securedrop_client import __version__, state
from securedrop_client.db import Source, User
from securedrop_client.gui.auth import LoginDialog
from securedrop_client.gui.widgets import LeftPane, MainView, TopPane
Expand All @@ -45,7 +45,7 @@ class Window(QMainWindow):

icon = "icon.png"

def __init__(self) -> None:
def __init__(self, app_state: Optional[state.State] = None) -> None:
"""
Create the default start state. The window contains a root widget into
which is placed:
Expand Down Expand Up @@ -73,7 +73,7 @@ def __init__(self) -> None:
layout.setSpacing(0)
self.main_pane.setLayout(layout)
self.left_pane = LeftPane()
self.main_view = MainView(self.main_pane)
self.main_view = MainView(self.main_pane, app_state)
layout.addWidget(self.left_pane)
layout.addWidget(self.main_view)

Expand Down
Loading