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 a data journalism checkbox to the GUI #349

Open
wants to merge 1 commit into
base: 1.x
Choose a base branch
from
Open
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
73 changes: 70 additions & 3 deletions reprounzip-qt/reprounzip_qt/gui/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from qtpy import QtCore, QtWidgets
import yaml
import os

import reprounzip_qt.reprounzip_interface as reprounzip
from reprounzip_qt.gui.common import ROOT, ResizableStack, handle_error, \
Expand Down Expand Up @@ -138,6 +139,47 @@ def options(self):
return options


class DataJournalismOptions(RunOptions):
def __init__(self):
super(DataJournalismOptions, self).__init__()

self.rpz = QtWidgets.QLineEdit("")
self.add_row("RPZ package:", self.rpz)

self.mode = QtWidgets.QButtonGroup()
self.record_button = QtWidgets.QRadioButton("record")
self.mode.addButton(self.record_button)
self.playback_button = QtWidgets.QRadioButton("playback")
self.mode.addButton(self.playback_button)
row = QtWidgets.QHBoxLayout()
row.addWidget(self.record_button)
row.addWidget(self.playback_button)
row.addStretch(1)
self.add_row_layout("Mode:", row)

self.port = QtWidgets.QLineEdit('')
self.add_row("Webapp port:", self.port)

def set_rpz(self, directory):
self.directory = directory
self.rpz.setText(directory + ".rpz")

def options(self):
options = super(DataJournalismOptions, self).options()
if self.record_button.isChecked():
options['args'].append('record')
elif self.playback_button.isChecked():
options['args'].append('playback')
else:
return
options['args'].append(self.rpz.text())
options['args'].append(os.path.abspath(self.directory))
options['args'].append('--port={}'.format(self.port.text()))
options['args'].append('--skip-setup')

return options


class FilesManager(QtWidgets.QDialog):
def __init__(self, directory, unpacker=None, root=None, **kwargs):
super(FilesManager, self).__init__(**kwargs)
Expand Down Expand Up @@ -315,22 +357,32 @@ def __init__(self, unpacked_directory='', **kwargs):
enabled=False)
layout.addWidget(self.run_jupyter_notebook, 7, 1, 1, 2)

layout.addWidget(QtWidgets.QLabel("Data Journalism"),
8, 0)
self.data_journalism = QtWidgets.QCheckBox("Data journalism app",
checked=False,
enabled=False)
layout.addWidget(self.data_journalism, 8, 1, 1, 1)
self.data_journalism.stateChanged.connect(self._toggle_data_journalism_options)

group = QtWidgets.QGroupBox(title="Unpacker options")
group_layout = QtWidgets.QVBoxLayout()
self.unpacker_options = ResizableStack()
scroll = QtWidgets.QScrollArea(widgetResizable=True)
scroll.setWidget(self.unpacker_options)
group_layout.addWidget(scroll)
group.setLayout(group_layout)
layout.addWidget(group, 8, 0, 1, 3)
layout.setRowStretch(8, 1)
layout.addWidget(group, 9, 0, 1, 3)
layout.setRowStretch(9, 1)

for i, (name, WidgetClass) in enumerate(self.UNPACKERS):
widget = WidgetClass()
self.unpacker_options.addWidget(widget)

self.unpacker_options.addWidget(
QtWidgets.QLabel("Select a directory to display options..."))
self.data_journalism_options = DataJournalismOptions()
self.unpacker_options.addWidget(self.data_journalism_options)
self.unpacker_options.setCurrentIndex(len(self.UNPACKERS))

buttons = QtWidgets.QHBoxLayout()
Expand All @@ -342,7 +394,7 @@ def __init__(self, unpacked_directory='', **kwargs):
"experiment")
self.destroy_widget.clicked.connect(self._destroy)
buttons.addWidget(self.destroy_widget)
layout.addLayout(buttons, 9, 0, 1, 3)
layout.addLayout(buttons, 10, 0, 1, 3)

self.setLayout(layout)

Expand Down Expand Up @@ -389,6 +441,12 @@ def _directory_changed(self, new_dir=None, force=False):
reprounzip.is_jupyter(self.directory)):
self.run_jupyter_notebook.setEnabled(True)
self.run_jupyter_notebook.setChecked(True)

if (unpacker == 'docker' and
reprounzip.dj_unpacker_installed()):
self.data_journalism.setEnabled(True)
self.data_journalism_options.set_rpz(self.directory)

else:
self.run_widget.setEnabled(False)
self.destroy_widget.setEnabled(False)
Expand All @@ -401,6 +459,7 @@ def _run(self):
options = self.unpacker_options.currentWidget().options()
if options is None:
return

runs = sorted(i.row() for i in self.runs_widget.selectedIndexes())
if not runs:
error_msg(self, "No run selected", 'warning')
Expand All @@ -411,6 +470,7 @@ def _run(self):
unpacker=self.unpacker,
root=ROOT.INDEX_TO_OPTION[self.root.currentIndex()],
jupyter=self.run_jupyter_notebook.isChecked(),
data_journalism=self.data_journalism.isChecked(),
**options))

def _destroy(self):
Expand Down Expand Up @@ -449,3 +509,10 @@ def should_exit(self):

def replaceable(self):
return not self.unpacker

def _toggle_data_journalism_options(self, checked):
if checked:
self._docker_options_index = self.unpacker_options.currentIndex()
self.unpacker_options.setCurrentIndex(len(self.unpacker_options) - 1)
elif self._docker_options_index:
self.unpacker_options.setCurrentIndex(self._docker_options_index)
23 changes: 21 additions & 2 deletions reprounzip-qt/reprounzip_qt/reprounzip_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import sys
import time
import yaml
from pkg_resources import iter_entry_points

from reprounzip_qt.qt_terminal import run_in_builtin_terminal

Expand Down Expand Up @@ -147,7 +148,7 @@ def find_command(cmd):


def run(directory, unpacker=None, runs=None,
root=None, jupyter=False, args=[]):
root=None, jupyter=False, data_journalism=False, args=[]):
if unpacker is None:
unpacker = check_directory(directory)

Expand Down Expand Up @@ -182,6 +183,13 @@ def run(directory, unpacker=None, runs=None,
raise ValueError("Unrecognized docker host type %r" %
docker_host['type'])

if data_journalism:
run_in_system_terminal(
[reprounzip, 'dj'] + args,
env=env,
root=root)
return True

run_in_system_terminal(
[reprounzip, unpacker, 'run'] +
args +
Expand Down Expand Up @@ -385,7 +393,7 @@ def run_in_system_terminal(cmd, env={},
wait_script,
close_script)

proc.communicate(run_script)
proc.communicate(run_script.encode('utf-8'))
proc.wait()
if wait:
time.sleep(0.5)
Expand Down Expand Up @@ -424,3 +432,14 @@ def run_in_system_terminal(cmd, env={},

return None
return "Couldn't start a terminal", 'critical'


def dj_unpacker_installed():
for ep in iter_entry_points('reprounzip.unpackers',
'dj'):
return True
return False


def dj_is_playable(directory):
return os.path.isdir(directory + "/WARC_DATA")