This repository has been archived by the owner on Apr 16, 2021. It is now read-only.
/
capdesk.py
136 lines (108 loc) · 4.76 KB
/
capdesk.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import sys
import keyring
import getpass
import multiprocessing
import PySide
from captools.api import Client
from new_upload import NewUploadWindow, UploadTracker
APP_NAME = "capdesk"
username = getpass.getuser()
client = None
class ApiTokenDialog(PySide.QtGui.QDialog):
def __init__(self, parent=None):
super(ApiTokenDialog, self).__init__(parent)
self.resize(250, 100)
self.setWindowTitle('API Token')
self.instructions = PySide.QtGui.QLabel('Please enter your Captricity API Token', self)
self.api_token_text = PySide.QtGui.QLineEdit(self)
self.ok_button = PySide.QtGui.QPushButton('Ok', self)
self.ok_button.clicked.connect(self.handle_ok)
actions_layout = PySide.QtGui.QHBoxLayout()
actions_layout.addStretch(1)
actions_layout.addWidget(self.ok_button)
layout = PySide.QtGui.QVBoxLayout()
layout.addWidget(self.instructions)
layout.addWidget(self.api_token_text)
layout.addLayout(actions_layout)
self.setLayout(layout)
def handle_ok(self):
self.api_token = str(self.api_token_text.text()).strip()
try:
self.client = Client(self.api_token)
self.client.read_user_profile()
keyring.set_password(APP_NAME, username, self.api_token)
self.accept()
except:
PySide.QtGui.QMessageBox.warning(self, 'Required API Token', 'A valid Captricity API Token is required to use the Captricity Desktop Client')
# Now initialize the main app
class MainWindow(PySide.QtGui.QMainWindow):
def __init__(self, client, parent=None):
self.cap_client = client
self.pool = multiprocessing.Pool(multiprocessing.cpu_count() * 2)
super(MainWindow, self).__init__(parent)
self.resize(350, 250)
self.setWindowTitle(APP_NAME)
new_upload = PySide.QtGui.QAction('New Upload', self)
new_upload.setShortcut('Ctrl+N')
new_upload.setStatusTip('Initiate a new upload to Captricity')
self.connect(new_upload, PySide.QtCore.SIGNAL('triggered()'), self.initiate_new_upload)
exit = PySide.QtGui.QAction('Exit', self)
exit.setShortcut('Ctrl+Q')
exit.setStatusTip('Exit application')
self.connect(exit, PySide.QtCore.SIGNAL('triggered()'), PySide.QtCore.SLOT('close()'))
self.statusBar()
menu = self.menuBar()
file_menu = menu.addMenu('File')
file_menu.addAction(new_upload)
file_menu.addAction(exit)
toolbar = self.addToolBar('Main')
toolbar.addAction(new_upload)
toolbar.addAction(exit)
self.main_widget = MainWidget(self)
self.setCentralWidget(self.main_widget)
def initiate_new_upload(self):
self.new_upload_window = NewUploadWindow(self.cap_client, self)
self.new_upload_window.resize(350, 250)
self.new_upload_window.show()
def close_new_upload(self):
self.new_upload_window = None
def add_upload_tracker(self, upload_manager):
self.main_widget.add_upload_tracker(upload_manager)
class MainWidget(PySide.QtGui.QWidget):
def __init__(self, parent=None):
self.progress_bars = []
super(MainWidget, self).__init__(parent)
self.container_widget = PySide.QtGui.QWidget()
self.container_layout = PySide.QtGui.QVBoxLayout(self)
self.container_widget.setLayout(self.container_layout)
self.scroll_area = PySide.QtGui.QScrollArea()
self.scroll_area.setVerticalScrollBarPolicy(PySide.QtCore.Qt.ScrollBarAlwaysOn)
self.scroll_area.setHorizontalScrollBarPolicy(PySide.QtCore.Qt.ScrollBarAlwaysOff)
self.scroll_area.setWidgetResizable(False)
self.scroll_area.setWidget(self.container_widget)
self.layout_ = PySide.QtGui.QVBoxLayout(self)
self.layout_.addWidget(self.scroll_area)
self.setLayout(self.layout_)
def add_upload_tracker(self, upload_manager):
pbar = UploadTracker(upload_manager)
self.progress_bars.append(pbar)
self.container_layout.addWidget(pbar)
upload_manager.start()
self.container_widget.resize(1000, 75 * len(self.progress_bars))
if __name__ == '__main__':
app = PySide.QtGui.QApplication(sys.argv)
# Obtain the API token from the keyring if it exists. Otherwise, have the user enter it.
api_token = keyring.get_password(APP_NAME, username)
if not api_token:
#Open dialog box to obtain api_token from user and store it
dialog = ApiTokenDialog()
if not dialog.exec_() == PySide.QtGui.QDialog.Accepted:
sys.exit(0)
client = dialog.client
else:
client = Client(api_token)
main = MainWindow(client)
main.show()
if sys.platform == 'darwin':
main.raise_()
sys.exit(app.exec_())