admin: include task duration in API (#4428)

include task duration in API

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
Jens L 2023-01-13 13:21:49 +01:00 committed by GitHub
parent 29d3fdaa1d
commit 36822c128c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 2 deletions

View File

@ -7,7 +7,13 @@ from django.utils.translation import gettext_lazy as _
from drf_spectacular.types import OpenApiTypes from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import OpenApiParameter, OpenApiResponse, extend_schema from drf_spectacular.utils import OpenApiParameter, OpenApiResponse, extend_schema
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.fields import CharField, ChoiceField, DateTimeField, ListField from rest_framework.fields import (
CharField,
ChoiceField,
DateTimeField,
ListField,
SerializerMethodField,
)
from rest_framework.permissions import IsAdminUser from rest_framework.permissions import IsAdminUser
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.response import Response from rest_framework.response import Response
@ -26,6 +32,7 @@ class TaskSerializer(PassiveSerializer):
task_name = CharField() task_name = CharField()
task_description = CharField() task_description = CharField()
task_finish_timestamp = DateTimeField(source="finish_time") task_finish_timestamp = DateTimeField(source="finish_time")
task_duration = SerializerMethodField()
status = ChoiceField( status = ChoiceField(
source="result.status.name", source="result.status.name",
@ -33,7 +40,11 @@ class TaskSerializer(PassiveSerializer):
) )
messages = ListField(source="result.messages") messages = ListField(source="result.messages")
def to_representation(self, instance): def get_task_duration(self, instance: TaskInfo) -> int:
"""Get the duration a task took to run"""
return max(instance.finish_timestamp - instance.start_timestamp, 0)
def to_representation(self, instance: TaskInfo):
"""When a new version of authentik adds fields to TaskInfo, """When a new version of authentik adds fields to TaskInfo,
the API will fail with an AttributeError, as the classes the API will fail with an AttributeError, as the classes
are pickled in cache. In that case, just delete the info""" are pickled in cache. In that case, just delete the info"""

View File

@ -37157,6 +37157,9 @@ components:
task_finish_timestamp: task_finish_timestamp:
type: string type: string
format: date-time format: date-time
task_duration:
type: integer
readOnly: true
status: status:
$ref: '#/components/schemas/TaskStatusEnum' $ref: '#/components/schemas/TaskStatusEnum'
messages: messages:
@ -37166,6 +37169,7 @@ components:
- messages - messages
- status - status
- task_description - task_description
- task_duration
- task_finish_timestamp - task_finish_timestamp
- task_name - task_name
TaskStatusEnum: TaskStatusEnum:

View File

@ -82,6 +82,16 @@ export class SystemTaskListPage extends TablePage<Task> {
return html` <td role="cell" colspan="3"> return html` <td role="cell" colspan="3">
<div class="pf-c-table__expandable-row-content"> <div class="pf-c-table__expandable-row-content">
<dl class="pf-c-description-list pf-m-horizontal"> <dl class="pf-c-description-list pf-m-horizontal">
<div class="pf-c-description-list__group">
<dt class="pf-c-description-list__term">
<span class="pf-c-description-list__text">${t`Duration`}</span>
</dt>
<dd class="pf-c-description-list__description">
<div class="pf-c-description-list__text">
${t`${Math.round(item.taskDuration)} seconds`}
</div>
</dd>
</div>
<div class="pf-c-description-list__group"> <div class="pf-c-description-list__group">
<dt class="pf-c-description-list__term"> <dt class="pf-c-description-list__term">
<span class="pf-c-description-list__text">${t`Messages`}</span> <span class="pf-c-description-list__text">${t`Messages`}</span>