diff --git a/Dockerfile b/Dockerfile index 84069e2..a5003d6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM cloudblueconnect/connect-extension-runner:29.4 +FROM cloudblueconnect/connect-extension-runner:30.0 COPY pyproject.toml /install_temp/. COPY poetry.* /install_temp/. diff --git a/connect_ext_ppr/service.py b/connect_ext_ppr/service.py index dada108..cd46f74 100644 --- a/connect_ext_ppr/service.py +++ b/connect_ext_ppr/service.py @@ -185,7 +185,7 @@ def create_ppr(ppr, user_id, deployment, db, client, logger): config_json = {} status = PPRVersion.STATUS.ready active_configuration = None - product_version = None + product_version = deployment.product.version if not file_data: active_configuration = ( db.query(Configuration) @@ -209,7 +209,6 @@ def create_ppr(ppr, user_id, deployment, db, client, logger): .first() ) data = None - product_version = deployment.product.version product_info = ( f"(product_id={deployment.product_id}, " f"product_version={deployment.product.version})" diff --git a/connect_ext_ppr/static/index.be01a9ee781833b05409.js b/connect_ext_ppr/static/index.8907dee66ebdfb4a3a16.js similarity index 99% rename from connect_ext_ppr/static/index.be01a9ee781833b05409.js rename to connect_ext_ppr/static/index.8907dee66ebdfb4a3a16.js index 4461152..67f7222 100644 --- a/connect_ext_ppr/static/index.be01a9ee781833b05409.js +++ b/connect_ext_ppr/static/index.8907dee66ebdfb4a3a16.js @@ -3096,7 +3096,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /******/ // This function allow to reference async chunks /******/ __webpack_require__.u = (chunkId) => { /******/ // return url for filenames based on template -/******/ return "" + chunkId + "." + {"deployment-details":"fd87698951c89fbe5e69","request-details":"d2e1e1181d6531e0ff8b"}[chunkId] + ".js"; +/******/ return "" + chunkId + "." + {"deployment-details":"fd87698951c89fbe5e69","request-details":"52f77cb9d466174a428e"}[chunkId] + ".js"; /******/ }; /******/ })(); /******/ diff --git a/connect_ext_ppr/static/index.html b/connect_ext_ppr/static/index.html index 7cf8f96..f5bc03f 100644 --- a/connect_ext_ppr/static/index.html +++ b/connect_ext_ppr/static/index.html @@ -12,7 +12,7 @@ Index - +
diff --git a/connect_ext_ppr/static/request-details.d2e1e1181d6531e0ff8b.js b/connect_ext_ppr/static/request-details.52f77cb9d466174a428e.js similarity index 92% rename from connect_ext_ppr/static/request-details.d2e1e1181d6531e0ff8b.js rename to connect_ext_ppr/static/request-details.52f77cb9d466174a428e.js index 3eaa23a..2570fcf 100644 --- a/connect_ext_ppr/static/request-details.d2e1e1181d6531e0ff8b.js +++ b/connect_ext_ppr/static/request-details.52f77cb9d466174a428e.js @@ -195,7 +195,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \****************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/cancel/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/check_circle/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/description/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/refresh/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/remove_circle/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/sync/baseline.svg\");\n/* harmony import */ var _components_ActionsMenu_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~components/ActionsMenu.vue */ \"./ui/src/components/ActionsMenu.vue\");\n/* harmony import */ var _components_cButton_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ~components/cButton.vue */ \"./ui/src/components/cButton.vue\");\n/* harmony import */ var _components_cIcon_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~components/cIcon.vue */ \"./ui/src/components/cIcon.vue\");\n/* harmony import */ var _components_cStatus_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~components/cStatus.vue */ \"./ui/src/components/cStatus.vue\");\n/* harmony import */ var _components_cTabs_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ~components/cTabs.vue */ \"./ui/src/components/cTabs.vue\");\n/* harmony import */ var _components_cView_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ~components/cView.vue */ \"./ui/src/components/cView.vue\");\n/* harmony import */ var _components_DetailItem_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ~components/DetailItem.vue */ \"./ui/src/components/DetailItem.vue\");\n/* harmony import */ var _components_ErrorDialog_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ~components/ErrorDialog.vue */ \"./ui/src/components/ErrorDialog.vue\");\n/* harmony import */ var _components_GridItem_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ~components/GridItem.vue */ \"./ui/src/components/GridItem.vue\");\n/* harmony import */ var _components_Pic_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ~components/Pic.vue */ \"./ui/src/components/Pic.vue\");\n/* harmony import */ var _components_RequestMarketplacesTab_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ~components/RequestMarketplacesTab.vue */ \"./ui/src/components/RequestMarketplacesTab.vue\");\n/* harmony import */ var _components_RequestTasksTab_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ~components/RequestTasksTab.vue */ \"./ui/src/components/RequestTasksTab.vue\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/utils */ \"./ui/src/utils.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ~helpers */ \"./ui/src/tools/helpers.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n ActionsMenu: _components_ActionsMenu_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n cButton: _components_cButton_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n cIcon: _components_cIcon_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n cStatus: _components_cStatus_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n cTabs: _components_cTabs_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n cView: _components_cView_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n DetailItem: _components_DetailItem_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n ErrorDialog: _components_ErrorDialog_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n GridItem: _components_GridItem_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n Pic: _components_Pic_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n RequestMarketplacesTab: _components_RequestMarketplacesTab_vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n RequestTasksTab: _components_RequestTasksTab_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n },\n\n data: () => ({\n currentTab: null,\n loading: true,\n request: null,\n isAbortingRequest: false,\n isRetryingRequest: false,\n areTasksUpdating: false,\n\n isErrorDialogOpen: false,\n errorMessages: '',\n }),\n\n computed: {\n icons: () => ({\n googleCancelBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n googleCheckCircleBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n googleDescriptionBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n googleRefreshBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n googleRemoveCircleBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_18__[\"default\"],\n googleSyncBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_19__[\"default\"],\n }),\n\n requestId: vm => vm.$route.params.id,\n\n tabs: () => [\n { label: 'Marketplaces', value: 'marketplaces' },\n { label: 'Tasks', value: 'tasks' },\n ],\n\n canAbort: vm => ['pending', 'processing'].includes(vm.request?.status),\n canRetry: vm => vm.request?.status === 'error',\n isAnyActionVisible: vm => vm.canAbort || vm.canRetry,\n\n isFailedRequest: vm => vm.request?.status === 'error',\n hasErrorDetails: vm => Boolean(vm.errorMessages),\n },\n\n methods: {\n async getRequest() {\n this.request = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getDeploymentsRequest)(this.requestId);\n if (this.isFailedRequest) {\n const tasksWithErrors = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getDeploymentRequestFailedTasks)(this.requestId);\n this.errorMessages = tasksWithErrors.map(task => task.error_message).join('\\n');\n } else {\n this.errorMessages = '';\n }\n },\n\n async getPprFileUrl() {\n const ppr = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getPPR)(this.request.deployment.id, this.request.ppr.id);\n this.pprFileUrl = ppr.file.location;\n },\n\n downloadPPR() {\n (0,_helpers__WEBPACK_IMPORTED_MODULE_13__.downloader)({ url: this.pprFileUrl });\n },\n\n async abortRequest() {\n this.request = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.abortDeploymentRequest)(this.requestId);\n this.areTasksUpdating = true;\n },\n\n async retryRequest() {\n try {\n this.request = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.retryDeploymentRequest)(this.requestId);\n } catch (e) {\n this.errorMessages = e.message;\n } finally {\n this.areTasksUpdating = true;\n }\n },\n\n openErrorDetailsDialog() {\n this.isErrorDialogOpen = true;\n },\n },\n\n async created() {\n await this.getRequest();\n await this.getPprFileUrl();\n this.loading = false;\n },\n});\n\n\n//# sourceURL=webpack://connect-extension-xvs/./ui/src/pages/RequestDetails.vue?./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/cancel/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/check_circle/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/description/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/refresh/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/remove_circle/baseline.svg\");\n/* harmony import */ var _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @cloudblueconnect/material-svg/baseline */ \"./node_modules/@cloudblueconnect/material-svg/icons/google/sync/baseline.svg\");\n/* harmony import */ var _components_ActionsMenu_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~components/ActionsMenu.vue */ \"./ui/src/components/ActionsMenu.vue\");\n/* harmony import */ var _components_cButton_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ~components/cButton.vue */ \"./ui/src/components/cButton.vue\");\n/* harmony import */ var _components_cIcon_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~components/cIcon.vue */ \"./ui/src/components/cIcon.vue\");\n/* harmony import */ var _components_cStatus_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~components/cStatus.vue */ \"./ui/src/components/cStatus.vue\");\n/* harmony import */ var _components_cTabs_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ~components/cTabs.vue */ \"./ui/src/components/cTabs.vue\");\n/* harmony import */ var _components_cView_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ~components/cView.vue */ \"./ui/src/components/cView.vue\");\n/* harmony import */ var _components_DetailItem_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ~components/DetailItem.vue */ \"./ui/src/components/DetailItem.vue\");\n/* harmony import */ var _components_ErrorDialog_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ~components/ErrorDialog.vue */ \"./ui/src/components/ErrorDialog.vue\");\n/* harmony import */ var _components_GridItem_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ~components/GridItem.vue */ \"./ui/src/components/GridItem.vue\");\n/* harmony import */ var _components_Pic_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ~components/Pic.vue */ \"./ui/src/components/Pic.vue\");\n/* harmony import */ var _components_RequestMarketplacesTab_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ~components/RequestMarketplacesTab.vue */ \"./ui/src/components/RequestMarketplacesTab.vue\");\n/* harmony import */ var _components_RequestTasksTab_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ~components/RequestTasksTab.vue */ \"./ui/src/components/RequestTasksTab.vue\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/utils */ \"./ui/src/utils.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ~helpers */ \"./ui/src/tools/helpers.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n ActionsMenu: _components_ActionsMenu_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n cButton: _components_cButton_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n cIcon: _components_cIcon_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n cStatus: _components_cStatus_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n cTabs: _components_cTabs_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n cView: _components_cView_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n DetailItem: _components_DetailItem_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n ErrorDialog: _components_ErrorDialog_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n GridItem: _components_GridItem_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n Pic: _components_Pic_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n RequestMarketplacesTab: _components_RequestMarketplacesTab_vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n RequestTasksTab: _components_RequestTasksTab_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n },\n\n data: () => ({\n currentTab: null,\n loading: true,\n request: null,\n productVersion: null,\n isAbortingRequest: false,\n isRetryingRequest: false,\n areTasksUpdating: false,\n\n isErrorDialogOpen: false,\n errorMessages: '',\n }),\n\n computed: {\n icons: () => ({\n googleCancelBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n googleCheckCircleBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n googleDescriptionBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n googleRefreshBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n googleRemoveCircleBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_18__[\"default\"],\n googleSyncBaseline: _cloudblueconnect_material_svg_baseline__WEBPACK_IMPORTED_MODULE_19__[\"default\"],\n }),\n\n requestId: vm => vm.$route.params.id,\n\n tabs: () => [\n { label: 'Marketplaces', value: 'marketplaces' },\n { label: 'Tasks', value: 'tasks' },\n ],\n\n canAbort: vm => ['pending', 'processing'].includes(vm.request?.status),\n canRetry: vm => vm.request?.status === 'error',\n isAnyActionVisible: vm => vm.canAbort || vm.canRetry,\n\n isFailedRequest: vm => vm.request?.status === 'error',\n hasErrorDetails: vm => Boolean(vm.errorMessages),\n },\n\n methods: {\n async getRequest() {\n this.request = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getDeploymentsRequest)(this.requestId);\n if (this.isFailedRequest) {\n const tasksWithErrors = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getDeploymentRequestFailedTasks)(this.requestId);\n this.errorMessages = tasksWithErrors.map(task => task.error_message).join('\\n');\n } else {\n this.errorMessages = '';\n }\n },\n\n async getPprFileUrl() {\n const ppr = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getPPR)(this.request.deployment.id, this.request.ppr.id);\n this.pprFileUrl = ppr.file.location;\n this.productVersion = ppr.product_version;\n },\n\n downloadPPR() {\n (0,_helpers__WEBPACK_IMPORTED_MODULE_13__.downloader)({ url: this.pprFileUrl });\n },\n\n async abortRequest() {\n this.request = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.abortDeploymentRequest)(this.requestId);\n this.areTasksUpdating = true;\n },\n\n async retryRequest() {\n try {\n this.request = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.retryDeploymentRequest)(this.requestId);\n } catch (e) {\n this.errorMessages = e.message;\n } finally {\n this.areTasksUpdating = true;\n }\n },\n\n openErrorDetailsDialog() {\n this.isErrorDialogOpen = true;\n },\n },\n\n async created() {\n await this.getRequest();\n await this.getPprFileUrl();\n this.loading = false;\n },\n});\n\n\n//# sourceURL=webpack://connect-extension-xvs/./ui/src/pages/RequestDetails.vue?./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -455,7 +455,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*****************************************************************************************************************************************************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ staticRenderFns: () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c\n return _c(\n \"c-view\",\n {\n staticClass: \"request-details\",\n attrs: {\n title: _vm.requestId,\n \"assistive-title\": \"Request Details\",\n \"back-route\": { name: \"Dashboard\", params: { tab: \"requests\" } },\n \"current-tab\": _vm.currentTab,\n loading: _vm.loading,\n \"show-alert\": _vm.isFailedRequest,\n },\n on: {\n \"update:currentTab\": function ($event) {\n _vm.currentTab = $event\n },\n \"update:current-tab\": function ($event) {\n _vm.currentTab = $event\n },\n },\n scopedSlots: _vm._u(\n [\n _vm.isAnyActionVisible\n ? {\n key: \"actions\",\n fn: function () {\n return [\n _c(\n \"actions-menu\",\n { attrs: { outline: \"\" } },\n [\n _vm.canAbort\n ? _c(\"c-button\", {\n staticClass: \"list-item\",\n attrs: {\n icon: _vm.icons.googleCancelBaseline,\n loading: _vm.isAbortingRequest,\n \"upper-case\": false,\n color: \"red\",\n label: \"Abort\",\n },\n on: { click: _vm.abortRequest },\n })\n : _vm._e(),\n _vm.canRetry\n ? _c(\"c-button\", {\n staticClass: \"list-item\",\n attrs: {\n icon: _vm.icons.googleRefreshBaseline,\n loading: _vm.isRetryingRequest,\n \"upper-case\": false,\n label: \"Retry\",\n },\n on: { click: _vm.retryRequest },\n })\n : _vm._e(),\n ],\n 1\n ),\n ]\n },\n proxy: true,\n }\n : null,\n {\n key: \"alert\",\n fn: function () {\n return [\n _c(\"p\", { staticClass: \"request-details__error\" }, [\n _vm._v(\n \"An error occurred while processing this deployment request. Try restarting the deployment\\nrequest. If the issue persists, contact your Support team.\"\n ),\n _vm.hasErrorDetails\n ? _c(\"a\", { on: { click: _vm.openErrorDetailsDialog } }, [\n _vm._v(\"Error details\"),\n ])\n : _vm._e(),\n ]),\n ]\n },\n proxy: true,\n },\n ],\n null,\n true\n ),\n },\n [\n _c(\"div\", { staticClass: \"info-container\" }, [\n _c(\n \"div\",\n { staticClass: \"info-column\" },\n [\n _c(\"grid-item\", {\n attrs: { \"column-width\": 50, label: \"Status\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\n \"div\",\n { staticClass: \"request-details__status\" },\n [\n _c(\"c-status\", {\n attrs: { status: _vm.request.status },\n }),\n _vm.hasErrorDetails\n ? [\n _c(\n \"span\",\n { staticClass: \"request-details__dot\" },\n [_vm._v(\"•\")]\n ),\n _c(\n \"a\",\n { on: { click: _vm.openErrorDetailsDialog } },\n [_vm._v(\"Details\")]\n ),\n ]\n : _vm._e(),\n ],\n 2\n ),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n _c(\"grid-item\", {\n attrs: { \"column-width\": 50, label: \"Product\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\"detail-item\", {\n attrs: {\n \"body-text\": _vm.request.deployment?.product?.name,\n dense: \"\",\n },\n scopedSlots: _vm._u([\n {\n key: \"image\",\n fn: function () {\n return [\n _c(\"pic\", {\n attrs: {\n src: _vm.request.deployment?.product?.icon,\n width: 16,\n height: 16,\n },\n }),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n ],\n 1\n ),\n _c(\n \"div\",\n { staticClass: \"info-column\" },\n [\n _c(\"grid-item\", {\n attrs: { \"column-width\": 28, label: \"Hub\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\"span\", [\n _vm._v(_vm._s(_vm.request.deployment?.hub?.name)),\n ]),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n _c(\"grid-item\", {\n attrs: { \"column-width\": 28, label: \"PPR\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\n \"div\",\n { staticClass: \"request-details__ppr\" },\n [\n _c(\"c-icon\", {\n attrs: {\n icon: _vm.icons.googleDescriptionBaseline,\n size: \"16px\",\n },\n }),\n _c(\"span\", [\n _vm._v(\n \"Version \" + _vm._s(_vm.request.ppr?.version)\n ),\n ]),\n _c(\"span\", { staticClass: \"request-details__dot\" }, [\n _vm._v(\"•\"),\n ]),\n _c(\"a\", { on: { click: _vm.downloadPPR } }, [\n _vm._v(\"Download\"),\n ]),\n ],\n 1\n ),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n ],\n 1\n ),\n _c(\n \"div\",\n { staticClass: \"info-column\" },\n [\n _c(\"grid-item\", {\n attrs: { \"column-width\": 78, label: \"L2 Resellers\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\n \"div\",\n { staticClass: \"request-details__delegate\" },\n [\n _c(\"c-icon\", {\n attrs: {\n icon: _vm.request.delegate_l2\n ? _vm.icons.googleCheckCircleBaseline\n : _vm.icons.googleRemoveCircleBaseline,\n size: \"16px\",\n },\n }),\n _c(\"span\", [\n _vm._v(\n _vm._s(\n _vm.request.delegate_l2\n ? \"Delegated\"\n : \"Not delegated\"\n )\n ),\n ]),\n ],\n 1\n ),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n ],\n 1\n ),\n ]),\n _vm.request\n ? _c(\"c-tabs\", {\n attrs: { \"current-tab\": _vm.currentTab, tabs: _vm.tabs },\n on: {\n \"update:currentTab\": function ($event) {\n _vm.currentTab = $event\n },\n \"update:current-tab\": function ($event) {\n _vm.currentTab = $event\n },\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"marketplaces\",\n fn: function () {\n return [\n _c(\"request-marketplaces-tab\", {\n attrs: { request: _vm.request },\n }),\n ]\n },\n proxy: true,\n },\n {\n key: \"tasks\",\n fn: function () {\n return [\n _c(\"request-tasks-tab\", {\n attrs: {\n \"request-id\": _vm.requestId,\n updating: _vm.areTasksUpdating,\n },\n on: {\n \"update:updating\": function ($event) {\n _vm.areTasksUpdating = $event\n },\n },\n }),\n ]\n },\n proxy: true,\n },\n ],\n null,\n false,\n 344068362\n ),\n })\n : _vm._e(),\n _c(\"error-dialog\", {\n attrs: {\n \"error-message\": _vm.errorMessages,\n type: \"Deployment Request\",\n },\n model: {\n value: _vm.isErrorDialogOpen,\n callback: function ($$v) {\n _vm.isErrorDialogOpen = $$v\n },\n expression: \"isErrorDialogOpen\",\n },\n }),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://connect-extension-xvs/./ui/src/pages/RequestDetails.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B1%5D!./node_modules/pug-plain-loader/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ staticRenderFns: () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c\n return _c(\n \"c-view\",\n {\n staticClass: \"request-details\",\n attrs: {\n title: _vm.requestId,\n \"assistive-title\": \"Request Details\",\n \"back-route\": { name: \"Dashboard\", params: { tab: \"requests\" } },\n \"current-tab\": _vm.currentTab,\n loading: _vm.loading,\n \"show-alert\": _vm.isFailedRequest,\n },\n on: {\n \"update:currentTab\": function ($event) {\n _vm.currentTab = $event\n },\n \"update:current-tab\": function ($event) {\n _vm.currentTab = $event\n },\n },\n scopedSlots: _vm._u(\n [\n _vm.isAnyActionVisible\n ? {\n key: \"actions\",\n fn: function () {\n return [\n _c(\n \"actions-menu\",\n { attrs: { outline: \"\" } },\n [\n _vm.canAbort\n ? _c(\"c-button\", {\n staticClass: \"list-item\",\n attrs: {\n icon: _vm.icons.googleCancelBaseline,\n loading: _vm.isAbortingRequest,\n \"upper-case\": false,\n color: \"red\",\n label: \"Abort\",\n },\n on: { click: _vm.abortRequest },\n })\n : _vm._e(),\n _vm.canRetry\n ? _c(\"c-button\", {\n staticClass: \"list-item\",\n attrs: {\n icon: _vm.icons.googleRefreshBaseline,\n loading: _vm.isRetryingRequest,\n \"upper-case\": false,\n label: \"Retry\",\n },\n on: { click: _vm.retryRequest },\n })\n : _vm._e(),\n ],\n 1\n ),\n ]\n },\n proxy: true,\n }\n : null,\n {\n key: \"alert\",\n fn: function () {\n return [\n _c(\"p\", { staticClass: \"request-details__error\" }, [\n _vm._v(\n \"An error occurred while processing this deployment request. Try restarting the deployment\\nrequest. If the issue persists, contact your Support team.\"\n ),\n _vm.hasErrorDetails\n ? _c(\"a\", { on: { click: _vm.openErrorDetailsDialog } }, [\n _vm._v(\"Error details\"),\n ])\n : _vm._e(),\n ]),\n ]\n },\n proxy: true,\n },\n ],\n null,\n true\n ),\n },\n [\n _c(\"div\", { staticClass: \"info-container\" }, [\n _c(\n \"div\",\n { staticClass: \"info-column\" },\n [\n _c(\"grid-item\", {\n attrs: { \"column-width\": 50, label: \"Status\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\n \"div\",\n { staticClass: \"request-details__status\" },\n [\n _c(\"c-status\", {\n attrs: { status: _vm.request.status },\n }),\n _vm.hasErrorDetails\n ? [\n _c(\n \"span\",\n { staticClass: \"request-details__dot\" },\n [_vm._v(\"•\")]\n ),\n _c(\n \"a\",\n { on: { click: _vm.openErrorDetailsDialog } },\n [_vm._v(\"Details\")]\n ),\n ]\n : _vm._e(),\n ],\n 2\n ),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n _c(\"grid-item\", {\n attrs: { \"column-width\": 50, label: \"Product\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\"detail-item\", {\n attrs: {\n \"body-text\": `${_vm.request.deployment?.product?.name} (version ${_vm.productVersion})`,\n dense: \"\",\n },\n scopedSlots: _vm._u([\n {\n key: \"image\",\n fn: function () {\n return [\n _c(\"pic\", {\n attrs: {\n src: _vm.request.deployment?.product?.icon,\n width: 16,\n height: 16,\n },\n }),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n ],\n 1\n ),\n _c(\n \"div\",\n { staticClass: \"info-column\" },\n [\n _c(\"grid-item\", {\n attrs: { \"column-width\": 28, label: \"Hub\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\"span\", [\n _vm._v(_vm._s(_vm.request.deployment?.hub?.name)),\n ]),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n _c(\"grid-item\", {\n attrs: { \"column-width\": 28, label: \"PPR\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\n \"div\",\n { staticClass: \"request-details__ppr\" },\n [\n _c(\"c-icon\", {\n attrs: {\n icon: _vm.icons.googleDescriptionBaseline,\n size: \"16px\",\n },\n }),\n _c(\"span\", [\n _vm._v(\n \"Version \" + _vm._s(_vm.request.ppr?.version)\n ),\n ]),\n _c(\"span\", { staticClass: \"request-details__dot\" }, [\n _vm._v(\"•\"),\n ]),\n _c(\"a\", { on: { click: _vm.downloadPPR } }, [\n _vm._v(\"Download\"),\n ]),\n ],\n 1\n ),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n ],\n 1\n ),\n _c(\n \"div\",\n { staticClass: \"info-column\" },\n [\n _c(\"grid-item\", {\n attrs: { \"column-width\": 78, label: \"L2 Resellers\" },\n scopedSlots: _vm._u([\n {\n key: \"value\",\n fn: function () {\n return [\n _c(\n \"div\",\n { staticClass: \"request-details__delegate\" },\n [\n _c(\"c-icon\", {\n attrs: {\n icon: _vm.request.delegate_l2\n ? _vm.icons.googleCheckCircleBaseline\n : _vm.icons.googleRemoveCircleBaseline,\n size: \"16px\",\n },\n }),\n _c(\"span\", [\n _vm._v(\n _vm._s(\n _vm.request.delegate_l2\n ? \"Delegated\"\n : \"Not delegated\"\n )\n ),\n ]),\n ],\n 1\n ),\n ]\n },\n proxy: true,\n },\n ]),\n }),\n ],\n 1\n ),\n ]),\n _vm.request\n ? _c(\"c-tabs\", {\n attrs: { \"current-tab\": _vm.currentTab, tabs: _vm.tabs },\n on: {\n \"update:currentTab\": function ($event) {\n _vm.currentTab = $event\n },\n \"update:current-tab\": function ($event) {\n _vm.currentTab = $event\n },\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"marketplaces\",\n fn: function () {\n return [\n _c(\"request-marketplaces-tab\", {\n attrs: { request: _vm.request },\n }),\n ]\n },\n proxy: true,\n },\n {\n key: \"tasks\",\n fn: function () {\n return [\n _c(\"request-tasks-tab\", {\n attrs: {\n \"request-id\": _vm.requestId,\n updating: _vm.areTasksUpdating,\n },\n on: {\n \"update:updating\": function ($event) {\n _vm.areTasksUpdating = $event\n },\n },\n }),\n ]\n },\n proxy: true,\n },\n ],\n null,\n false,\n 344068362\n ),\n })\n : _vm._e(),\n _c(\"error-dialog\", {\n attrs: {\n \"error-message\": _vm.errorMessages,\n type: \"Deployment Request\",\n },\n model: {\n value: _vm.isErrorDialogOpen,\n callback: function ($$v) {\n _vm.isErrorDialogOpen = $$v\n },\n expression: \"isErrorDialogOpen\",\n },\n }),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://connect-extension-xvs/./ui/src/pages/RequestDetails.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B1%5D!./node_modules/pug-plain-loader/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }) diff --git a/connect_ext_ppr/utils.py b/connect_ext_ppr/utils.py index 47ac464..423252c 100644 --- a/connect_ext_ppr/utils.py +++ b/connect_ext_ppr/utils.py @@ -242,12 +242,10 @@ def get_deployment_reference_schema(deployment, hub): def get_deployment_request_schema(deployment_request, hub): """ - Returns DeploymentSchema for the deployment - :param deployment: Deployment model - :param product: Product model from Connect - :param vendor: Vendor Account model from Connect + Returns DeploymentRequestSchema for the deployment request + :param deployment_request: DeploymentRequest model :param hub: Hub model from Connect - :rtype: DeploymentSchema + :rtype: DeploymentRequestSchema """ ppr = deployment_request.ppr ppr_schema = PPRVersionReferenceSchema( diff --git a/tests/api/test_pprs.py b/tests/api/test_pprs.py index 41beb7a..58c6491 100644 --- a/tests/api/test_pprs.py +++ b/tests/api/test_pprs.py @@ -318,6 +318,7 @@ def test_upload_ppr( }, 'description': '\n**Description**\nWhat a lovely day\n\n\n', 'status': 'ready', + 'product_version': 3, } assert id[:6] == 'PPRFL-' assert isinstance(events['created']['at'], str) @@ -382,6 +383,7 @@ def test_upload_ppr_invalid( "does not contain items matching the given schema\n\n" ), 'status': 'failed', + 'product_version': 3, } assert id[:6] == 'PPRFL-' assert isinstance(events['created']['at'], str) @@ -444,6 +446,7 @@ def test_post_ppr_new_version( }, 'description': '\n**Description**\nWhat a lovely day\n\n\n', 'status': 'ready', + 'product_version': 3, } assert id[:6] == 'PPRFL-' assert isinstance(events['created']['at'], str) diff --git a/ui/src/pages/RequestDetails.vue b/ui/src/pages/RequestDetails.vue index 1c1f372..27a69ea 100644 --- a/ui/src/pages/RequestDetails.vue +++ b/ui/src/pages/RequestDetails.vue @@ -59,7 +59,7 @@ c-view.request-details( ) template(#value="") detail-item( - :body-text="request.deployment?.product?.name", + :body-text="`${request.deployment?.product?.name} (version ${productVersion})`", dense, ) template(#image="") @@ -184,6 +184,7 @@ export default { currentTab: null, loading: true, request: null, + productVersion: null, isAbortingRequest: false, isRetryingRequest: false, areTasksUpdating: false, @@ -231,6 +232,7 @@ export default { async getPprFileUrl() { const ppr = await getPPR(this.request.deployment.id, this.request.ppr.id); this.pprFileUrl = ppr.file.location; + this.productVersion = ppr.product_version; }, downloadPPR() {