Skip to content

Commit

Permalink
Merge pull request #1388 from gonzalo-bulnes/add-download-conversation
Browse files Browse the repository at this point in the history
Add download conversation
  • Loading branch information
sssoleileraaa authored Mar 15, 2022
2 parents 1aeaaed + f5f11b4 commit 635f070
Show file tree
Hide file tree
Showing 22 changed files with 1,141 additions and 203 deletions.
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

0 comments on commit 635f070

Please sign in to comment.