@@ -59,8 +59,13 @@ def startUpload(self):
5959 self .uploading = True
6060
6161
62+ self ._progress_message = Message (i18n_catalog .i18nc ("@info:status" , "Connecting to Doodle3D Connect" ), 0 , False , - 1 )
63+ self ._progress_message .addAction ("Cancel" , i18n_catalog .i18nc ("@action:button" , "Cancel" ), None , "" )
64+ self ._progress_message .actionTriggered .connect (self ._onMessageActionTriggered )
65+ self ._progress_message .show ()
66+ # Request upload credentials
6267 url = QUrl ("https://gcodeserver.doodle3d.com/upload" )
63- self ._manager .post (QNetworkRequest (url ), QByteArray ())
68+ self ._post_reply = self . _manager .post (QNetworkRequest (url ), QByteArray ())
6469
6570 def uploadGCode (self , data ):
6671 try :
@@ -107,13 +112,17 @@ def uploadGCode(self, data):
107112 upload_url = QUrl (data ["data" ]["reservation" ]["url" ])
108113 Logger .log ("d" , "{}" , upload_url )
109114
110- reply = self ._manager .post (QNetworkRequest (upload_url ), multi_part )
111- reply .uploadProgress .connect (self ._onProgress )
115+ self . _post_reply = self ._manager .post (QNetworkRequest (upload_url ), multi_part )
116+ self . _post_reply .uploadProgress .connect (self ._onProgress )
112117 self ._progress_message = Message (i18n_catalog .i18nc ("@info:status" , "Sending data to Doodle3D Connect" ), 0 , False , - 1 )
113118 self ._progress_message .addAction ("Cancel" , i18n_catalog .i18nc ("@action:button" , "Cancel" ), None , "" )
119+ self ._progress_message .actionTriggered .connect (self ._onMessageActionTriggered )
114120 self ._progress_message .show ()
115- multi_part .setParent (reply )
121+ multi_part .setParent (self . _post_reply )
116122 except Exception as e :
123+ self ._progress_message .hide ()
124+ self ._progress_message = Message (i18n_catalog .i18nc ("@info:status" , "Unable to send data to Doodle3D Connect. Is another job still active?" ))
125+ self ._progress_message .show ()
117126 Logger .log ("e" , "An exception occured during G-code upload: %s" % str (e ))
118127
119128 def _onProgress (self , bytes_sent , bytes_total ):
@@ -135,27 +144,50 @@ def _onFinished(self, reply):
135144 if reply .error () == QNetworkReply .TimeoutError :
136145 Logger .log ("w" , "Received a timeout on a request to the G-code server" )
137146
147+ status_code = reply .attribute (QNetworkRequest .HttpStatusCodeAttribute )
148+
149+ if not status_code :
150+ self .uploading = False
151+ return
152+
138153 reply_url = reply .url ().toString ()
139154 if "upload" in reply_url :
140- json_data = json .loads (bytes (reply .readAll ()).decode ("utf-8" ))
141- Logger .log ("d" , "{}" , json_data )
155+ try :
156+ json_data = json .loads (bytes (reply .readAll ()).decode ("utf-8" ))
157+ except json .decoder .JSONDecodeError :
158+ Logger .log ("w" , "Received invalid upload credentials request reply from Connect: Not valid JSON." )
159+ return
142160
143161 self .gcodeId = json_data ["data" ]["id" ]
144162
145163 reply .deleteLater ()
146- self .uploadGCode (json_data );
147- if "amazonaws" in reply_url :
164+ self ._post_reply = None
148165 self ._progress_message .hide ()
149- self ._progress_message = Message (i18n_catalog .i18nc ("@info:status" , "G-code file sent to Doodle3D Connect" ))
150- self ._progress_message .addAction ("open_browser" , i18n_catalog .i18nc ("@action:button" , "Open Connect.." ), "globe" , i18n_catalog .i18nc ("@info:tooltip" , "Open the Doodle3D Connect web interface" ))
151- self ._progress_message .actionTriggered .connect (self ._onMessageActionTriggered )
152- self ._progress_message .show ()
153- self .uploading = False
154- Logger .log ("d" , "uploaded to amazon" )
166+ self .uploadGCode (json_data )
167+ elif "amazonaws" in reply_url :
168+ if status_code == 204 :
169+ self ._progress_message .hide ()
170+ self ._progress_message = Message (i18n_catalog .i18nc ("@info:status" , "G-code file sent to Doodle3D Connect" ))
171+ self ._progress_message .addAction ("open_browser" , i18n_catalog .i18nc ("@action:button" , "Open Connect.." ), "globe" , i18n_catalog .i18nc ("@info:tooltip" , "Open the Doodle3D Connect web interface" ))
172+ self ._progress_message .actionTriggered .connect (self ._onMessageActionTriggered )
173+ self ._progress_message .show ()
174+ self .uploading = False
175+ Logger .log ("d" , "uploaded to amazon" )
176+ else :
177+ self ._progress_message .hide ()
178+ Logger .log ("w" , "Unexpected status code in reply from AWS S3" )
155179
156180 def _onMessageActionTriggered (self , message , action ):
157181 if action == "open_browser" :
158182 QDesktopServices .openUrl (QUrl ("%s?uuid=%s" % (self .base_url , self .gcodeId )))
183+ elif action == "Cancel" :
184+ Logger .log ("d" , "canceled upload to Doodle3D Connect" )
185+ self ._progress_message .hide ()
186+ if self ._post_reply :
187+ self ._post_reply .abort ()
188+ self ._post_reply = None
189+ else :
190+ Logger .log ("d" , "unknown action: %s" % action )
159191
160192
161193
0 commit comments