Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions api/src/zimitfrontend/routes/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class TaskInfo(CamelModel):
flags: list[TaskInfoFlag]
progress: int | None
rank: int | None
offliner_definition_version: str


class TaskCreateRequest(CamelModel):
Expand Down Expand Up @@ -90,6 +91,7 @@ class ZimfarmTask(BaseModel):
# rank is populated only on GET /requested_tasks/{id}, and not on any of
# other endpoint and not on the webhook calls
rank: int | None = None
version: str


class HookStatus(BaseModel):
Expand Down
1 change: 1 addition & 0 deletions api/src/zimitfrontend/routes/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ def get_task_info(task: Any) -> TaskInfo:
else 0
),
rank=zimfarm_task.rank,
offliner_definition_version=zimfarm_task.version,
)


Expand Down
14 changes: 14 additions & 0 deletions api/tests/unit/routes/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
"notification": {"ended": {"webhook": ["bla"]}},
"container": {"progress": {"partialZim": True}},
"rank": 123,
"offliner": "zimit",
"version": "initial",
},
TaskInfo(
id="6341c25f-aac9-41aa-b9bb-3ddee058a0bf",
Expand All @@ -62,6 +64,7 @@
],
progress=0,
rank=123,
offliner_definition_version="initial",
),
id="full",
),
Expand All @@ -71,6 +74,8 @@
"config": {"warehouse_path": "/other", "offliner": {}},
"status": "blu",
"rank": 456,
"offliner": "zimit",
"version": "initial",
},
TaskInfo(
id="6341c25f-aac9-41aa-b9bb-3ddee058a0bf",
Expand All @@ -81,6 +86,7 @@
flags=[],
progress=0,
rank=456,
offliner_definition_version="initial",
),
id="simple",
),
Expand All @@ -91,6 +97,8 @@
"container": {"progress": {"partialZim": False}},
"status": "bla",
"rank": 456,
"offliner": "zimit",
"version": "initial",
},
TaskInfo(
id="6341c25f-aac9-41aa-b9bb-3ddee058a0bf",
Expand All @@ -101,6 +109,7 @@
flags=[],
progress=0,
rank=456,
offliner_definition_version="initial",
),
id="limit_not_hit",
),
Expand All @@ -111,6 +120,8 @@
"container": {"progress": {"overall": 100}},
"status": "bla",
"rank": 456,
"offliner": "zimit",
"version": "initial",
},
TaskInfo(
id="6341c25f-aac9-41aa-b9bb-3ddee058a0bf",
Expand All @@ -121,6 +132,7 @@
flags=[],
progress=100,
rank=456,
offliner_definition_version="initial",
),
id="no_limit_info",
),
Expand Down Expand Up @@ -153,6 +165,8 @@ def test_convert_zimfarm_task_to_info(task: Any, expected: TaskInfo):
"notification": {"ended": {"webhook": ["bla"]}},
"container": {"progress": {"partialZim": True}},
"rank": 123,
"offliner": "zimit",
"version": "initial",
}
)

Expand Down
62 changes: 56 additions & 6 deletions ui/src/stores/main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { defineStore } from 'pinia'
import axios, { AxiosError } from 'axios'
import { defineStore } from 'pinia'

import constants from '../constants'
import { getCurrentLocale, setCurrentLocale, type Language } from '../i18n'
Expand All @@ -9,6 +9,7 @@ export type RootState = {
loading: boolean
loadingText: string
offlinerDefinition: OfflinerDefinition | undefined
currentOfflinerDefinitionVersion: string | undefined
offlinerNotFound: boolean
formValues: NameValue[]
taskId: string
Expand Down Expand Up @@ -71,6 +72,7 @@ export type TaskData = {
downloadLink: string
progress: number
rank: number | undefined
offlinerDefinitionVersion: string
}

export type BlacklistEntry = {
Expand All @@ -82,20 +84,36 @@ export type BlacklistEntry = {
wp1Hint: boolean | null
}

export interface Paginator {
count: number
skip: number
limit: number
page_size: number
page: number
}

export interface ListResponse<T> {
meta: Paginator
items: T[]
}

export const useMainStore = defineStore('main', {
state: () =>
({
count: 0,
loading: false,
loadingText: '',
offlinerDefinition: undefined,
offlinerDefinitionVersions: [] as string[],
currentOfflinerDefinitionVersion: undefined,
offlinerNotFound: false,
formValues: [] as NameValue[],
taskId: '',
taskData: undefined,
taskNotFound: false,
snackbarDisplayed: false,
snackbarContent: '',
trackerStatus: undefined,
blacklistReason: undefined
}) as RootState,
actions: {
Expand All @@ -116,6 +134,9 @@ export const useMainStore = defineStore('main', {
this.taskData = (
await axios.get<TaskData>(this.config.zimit_ui_api + '/requests/' + this.taskId)
).data
if (this.taskData.offlinerDefinitionVersion != this.currentOfflinerDefinitionVersion) {
await this.loadOfflinerDefinitionVersion(this.taskData.offlinerDefinitionVersion)
}
this.taskNotFound = false
} catch (error) {
this.handleError(this.t('requestStatus.errorRefreshing'), error)
Expand All @@ -132,6 +153,10 @@ export const useMainStore = defineStore('main', {
saveOfflinersDefinitions(offlinersDefinitions: OfflinerDefinition) {
this.offlinerDefinition = offlinersDefinitions
},

setCurrentOfflinerDefinitionVersion(version: string) {
this.currentOfflinerDefinitionVersion = version
},
increment() {
this.count++
},
Expand All @@ -151,13 +176,34 @@ export const useMainStore = defineStore('main', {
}
},
async loadOfflinerDefinition() {
try {
const versions = (
await axios.get<ListResponse<string>>(
this.config.zimfarm_api + '/offliners/zimit/versions'
)
).data

if (versions.items.length == 0) {
this.offlinerNotFound = true
const message = 'No offliner definitions found'
this.handleError(message, new Error(message))
return
}
// load the latest version
this.currentOfflinerDefinitionVersion = versions.items[0]
await this.loadOfflinerDefinitionVersion(this.currentOfflinerDefinitionVersion)
} catch (error) {
this.handleError(this.t('newRequest.errorFetchingDefinition'), error)
this.offlinerNotFound = true
}
},
async loadOfflinerDefinitionVersion(version: string) {
try {
const offlinerDefinition = (
await axios.get<OfflinerDefinition>(this.config.zimfarm_api + '/offliners/zimit')
await axios.get<OfflinerDefinition>(
this.config.zimfarm_api + '/offliners/zimit/' + version
)
).data
offlinerDefinition.flags = offlinerDefinition.flags.filter(
(flag) => this.config.new_request_advanced_flags.indexOf(flag.data_key) > -1
)
this.offlinerDefinition = offlinerDefinition
this.offlinerNotFound = false
} catch (error) {
Expand Down Expand Up @@ -263,7 +309,11 @@ export const useMainStore = defineStore('main', {
return { shoudDisplay: state.loading, text: state.loadingText }
},
offlinerFlags(state) {
return state.offlinerDefinition?.flags || []
return (
state.offlinerDefinition?.flags.filter(
(flag) => this.config.new_request_advanced_flags.indexOf(flag.data_key) > -1
) || []
)
},
getFormValue: (state) => {
return (name: string) => {
Expand Down
17 changes: 12 additions & 5 deletions ui/src/views/RequestStatus.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<script setup lang="ts">
import { inject, onMounted, onBeforeUnmount, watch } from 'vue'
import { inject, onBeforeUnmount, onMounted, watch } from 'vue'
import type { Config } from '../config'
import constants from '../constants'
import type { OfflinerDefinition } from '../stores/main'

import { useRoute } from 'vue-router'
const route = useRoute()
Expand All @@ -13,6 +14,11 @@ const config = inject<Config>(constants.config)

let refreshInterval: ReturnType<typeof setInterval> | undefined

const getKeyLabel = (key: string, offlinerDefinition: OfflinerDefinition) => {
const flag = offlinerDefinition.flags.find((flag) => flag.key == key || flag.data_key == key)
return flag?.label
}

onMounted(() => {
Promise.all([mainStore.getTrackerStatus(), mainStore.loadTaskId(route.params.taskId)])

Expand Down Expand Up @@ -50,7 +56,7 @@ watch(

<p v-if="mainStore.loading">{{ mainStore.loadingText }}</p>
</div>
<div v-if="mainStore.taskData">
<div v-if="mainStore.taskData && mainStore.offlinerDefinition">
<h1>
{{ $t('requestStatus.zimingOf')
}}<a :href="mainStore.taskUrl" target="_blank">{{ mainStore.taskUrl }}</a>
Expand Down Expand Up @@ -85,7 +91,7 @@ watch(
<p>{{ $t('requestStatus.requestRecorded') }}</p>
<i18n-t v-if="mainStore.taskData.rank" keypath="requestStatus.rankMessage" tag="strong">
<template #task_rank>
{{ mainStore.taskData.rank + 1}}
{{ mainStore.taskData.rank + 1 }}
</template>
</i18n-t>
<p v-if="mainStore.taskData.hasEmail">{{ $t('requestStatus.bookmarkUrl') }}</p>
Expand Down Expand Up @@ -168,12 +174,13 @@ watch(
<tbody>
<tr
v-for="(flag, index) in mainStore.taskData.flags.filter(
(flag) => config?.task_status_hidden_flags.indexOf(flag.name) == -1
(flag) =>
config?.task_status_hidden_flags.indexOf(flag.name) == -1 && flag.value !== null
)"
:key="flag.name"
:class="{ 'striped-row': index % 2 === 0 }"
>
<th>{{ flag.name }}</th>
<th>{{ getKeyLabel(flag.name, mainStore.offlinerDefinition!) }}</th>
<td>{{ flag.value }}</td>
</tr>
</tbody>
Expand Down
Loading