コード例 #1
0
ファイル: LocalPackageList.py プロジェクト: tornado12345/Cura
    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
コード例 #2
0
    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
        )
コード例 #3
0
    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 != "")
コード例 #4
0
ファイル: CreateBackupJob.py プロジェクト: jpokorny12/Cura
    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)
コード例 #5
0
    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)
コード例 #6
0
        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"])
コード例 #7
0
    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)