def _parseResponse(self, reply: "QNetworkReply") -> None: """ Parse the response from the package list API request which can update. :param reply: A reply containing information about a number of packages. """ response_data = HttpRequestManager.readJSON(reply) if "data" not in response_data: Logger.error( f"Could not interpret the server's response. Missing 'data' from response data. Keys in response: {response_data.keys()}" ) return if len(response_data["data"]) == 0: return packages = response_data["data"] for package in packages: self._package_manager.addAvailablePackageVersion( package["package_id"], Version(package["package_version"])) package_model = self.getPackageModel(package["package_id"]) if package_model: # Also make sure that the local list knows where to get an update package_model.setDownloadUrl(package["download_url"]) self._ongoing_requests["check_updates"] = None
def _onUploadSlotCompleted(self, reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None: if HttpRequestManager.safeHttpStatus(reply) >= 300: replyText = HttpRequestManager.readText(reply) Logger.warning("Could not request backup upload: %s", replyText) self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE if HttpRequestManager.safeHttpStatus(reply) == 400: errors = json.loads(replyText)["errors"] if "moreThanMaximum" in [error["code"] for error in errors if error["meta"] and error["meta"]["field_name"] == "backup_size"]: self.backup_upload_error_message = catalog.i18nc("@error:file_size", "The backup exceeds the maximum file size.") self._job_done.set() return if error is not None: Logger.warning("Could not request backup upload: %s", HttpRequestManager.qt_network_error_name(error)) self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE self._job_done.set() return backup_upload_url = HttpRequestManager.readJSON(reply)["data"]["upload_url"] # Upload the backup to storage. HttpRequestManager.getInstance().put( backup_upload_url, data=self._backup_zip, callback=self._uploadFinishedCallback, error_callback=self._uploadFinishedCallback )
def _parseResponse(self, reply: "QNetworkReply") -> None: """ Parse the response from the package list API request. This converts that response into PackageModels, and triggers the ListModel to update. :param reply: A reply containing information about a number of packages. """ response_data = HttpRequestManager.readJSON(reply) if "data" not in response_data or "links" not in response_data: Logger.error(f"Could not interpret the server's response. Missing 'data' or 'links' from response data. Keys in response: {response_data.keys()}") self.setErrorMessage(catalog.i18nc("@info:error", "Could not interpret the server's response.")) return for package_data in response_data["data"]: try: package = PackageModel(package_data, parent = self) self._connectManageButtonSignals(package) self.appendItem({"package": package}) # Add it to this list model. except RuntimeError: # Setting the ownership of this object to not qml can still result in a RuntimeError. Which can occur when quickly toggling # between de-/constructing RemotePackageLists. This try-except is here to prevent a hard crash when the wrapped C++ object # was deleted when it was still parsing the response continue self._request_url = response_data["links"].get("next", "") # Use empty string to signify that there is no next page. self._ongoing_requests["get_packages"] = None self.setIsLoading(False) self.setHasMore(self._request_url != "")
def _onUploadSlotCompleted( self, reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None: if error is not None: Logger.warning(str(error)) self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE self._job_done.set() return if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) >= 300: Logger.warning("Could not request backup upload: %s", HttpRequestManager.readText(reply)) self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE self._job_done.set() return backup_upload_url = HttpRequestManager.readJSON( reply)["data"]["upload_url"] # Upload the backup to storage. HttpRequestManager.getInstance().put( backup_upload_url, data=self._backup_zip, callback=self._uploadFinishedCallback, error_callback=self._uploadFinishedCallback)
def _onUploadSlotCompleted( self, reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None: if HttpRequestManager.safeHttpStatus(reply) >= 300: replyText = HttpRequestManager.readText(reply) Logger.warning("Could not request backup upload: %s", replyText) self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE if HttpRequestManager.safeHttpStatus(reply) == 400: errors = json.loads(replyText)["errors"] if "moreThanMaximum" in [ error["code"] for error in errors if error["meta"] and error["meta"]["field_name"] == "backup_size" ]: if self._backup_zip is None: # will never happen; keep mypy happy zip_error = "backup is None." else: zip_error = "{} exceeds max size.".format( str(len(self._backup_zip))) sentry_sdk.capture_message( "backup failed: {}".format(zip_error), level="warning") self.backup_upload_error_message = catalog.i18nc( "@error:file_size", "The backup exceeds the maximum file size.") from sentry_sdk import capture_message self._job_done.set() return if error is not None: Logger.warning("Could not request backup upload: %s", HttpRequestManager.qt_network_error_name(error)) self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE self._job_done.set() return backup_upload_url = HttpRequestManager.readJSON( reply)["data"]["upload_url"] # Upload the backup to storage. HttpRequestManager.getInstance().put( backup_upload_url, data=self._backup_zip, callback=self._uploadFinishedCallback, error_callback=self._uploadFinishedCallback)
def callback( reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None: if error is not None: Logger.log("w", "Could not get backups: " + str(error)) changed([]) return backup_list_response = HttpRequestManager.readJSON(reply) if "data" not in backup_list_response: Logger.log( "w", "Could not get backups from remote, actual response body was: %s", str(backup_list_response)) changed([]) # empty list of backups return changed(backup_list_response["data"])
def onUploadRequestCompleted(self, reply: "QNetworkReply") -> None: """ Triggered when we successfully requested to upload a material archive. We then need to start uploading the material archive to the URL that the request answered with. :param reply: The reply from the server to our request to upload an archive. """ response_data = HttpRequestManager.readJSON(reply) if response_data is None: Logger.error( f"Invalid response to material upload request. Could not parse JSON data." ) self.failed( UploadMaterialsError( catalog.i18nc( "@text:error", "The response from Digital Factory appears to be corrupted." ))) return if "data" not in response_data: Logger.error( f"Invalid response to material upload request: Missing 'data' field that contains the entire response." ) self.failed( UploadMaterialsError( catalog.i18nc( "@text:error", "The response from Digital Factory is missing important information." ))) return if "upload_url" not in response_data["data"]: Logger.error( f"Invalid response to material upload request: Missing 'upload_url' field to upload archive to." ) self.failed( UploadMaterialsError( catalog.i18nc( "@text:error", "The response from Digital Factory is missing important information." ))) return if "material_profile_id" not in response_data["data"]: Logger.error( f"Invalid response to material upload request: Missing 'material_profile_id' to communicate about the materials with the server." ) self.failed( UploadMaterialsError( catalog.i18nc( "@text:error", "The response from Digital Factory is missing important information." ))) return upload_url = response_data["data"]["upload_url"] self._archive_remote_id = response_data["data"]["material_profile_id"] try: with open(cast(str, self._archive_filename), "rb") as f: file_data = f.read() except OSError as e: Logger.error( f"Failed to load archive back in for sending to cloud: {type(e)} - {e}" ) self.failed( UploadMaterialsError( catalog.i18nc( "@text:error", "Failed to load the archive of materials to sync it with printers." ))) return http = HttpRequestManager.getInstance() http.put(url=upload_url, data=file_data, callback=self.onUploadCompleted, error_callback=self.onError, scope=self._scope)