add missing for ldap kerberos, add last status for schedules
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
This commit is contained in:
@ -89,7 +89,7 @@ class KerberosSourceViewSet(UsedByMixin, ModelViewSet):
|
||||
url_path="sync/status",
|
||||
filter_backends=[ObjectFilter],
|
||||
)
|
||||
def sync_status(self, request: Request, pk: int) -> Response:
|
||||
def sync_status(self, request: Request, slug: str) -> Response:
|
||||
"""Get provider's sync status"""
|
||||
source: KerberosSource = self.get_object()
|
||||
|
||||
|
@ -164,7 +164,7 @@ class LDAPSourceViewSet(UsedByMixin, ModelViewSet):
|
||||
url_path="sync/status",
|
||||
filter_backends=[ObjectFilter],
|
||||
)
|
||||
def sync_status(self, request: Request, pk: int) -> Response:
|
||||
def sync_status(self, request: Request, slug: str) -> Response:
|
||||
"""Get provider's sync status"""
|
||||
source: LDAPSource = self.get_object()
|
||||
|
||||
|
@ -6,7 +6,7 @@ from dramatiq.errors import ActorNotFound
|
||||
from drf_spectacular.types import OpenApiTypes
|
||||
from drf_spectacular.utils import OpenApiResponse, extend_schema
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.fields import ReadOnlyField
|
||||
from rest_framework.fields import ChoiceField, ReadOnlyField
|
||||
from rest_framework.mixins import (
|
||||
ListModelMixin,
|
||||
RetrieveModelMixin,
|
||||
@ -20,6 +20,7 @@ from structlog.stdlib import get_logger
|
||||
|
||||
from authentik.core.api.utils import ModelSerializer
|
||||
from authentik.rbac.decorators import permission_required
|
||||
from authentik.tasks.models import Task, TaskStatus
|
||||
from authentik.tasks.schedules.models import Schedule
|
||||
|
||||
LOGGER = get_logger()
|
||||
@ -30,6 +31,7 @@ class ScheduleSerializer(ModelSerializer):
|
||||
rel_obj_model = ReadOnlyField(source="rel_obj_content_type.model")
|
||||
|
||||
description = SerializerMethodField()
|
||||
last_task_status = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Schedule
|
||||
@ -44,6 +46,7 @@ class ScheduleSerializer(ModelSerializer):
|
||||
"paused",
|
||||
"next_run",
|
||||
"description",
|
||||
"last_task_status",
|
||||
)
|
||||
|
||||
def get_description(self, instance: Schedule) -> str | None:
|
||||
@ -61,6 +64,12 @@ class ScheduleSerializer(ModelSerializer):
|
||||
return None
|
||||
return actor.options["description"]
|
||||
|
||||
def get_last_task_status(self, instance: Schedule) -> TaskStatus | None:
|
||||
last_task: Task = instance.tasks.order_by("-mtime").first()
|
||||
if last_task:
|
||||
return last_task.aggregated_status
|
||||
return None
|
||||
|
||||
|
||||
class ScheduleFilter(FilterSet):
|
||||
rel_obj_id__isnull = BooleanFilter("rel_obj_id", "isnull")
|
||||
@ -83,7 +92,9 @@ class ScheduleViewSet(
|
||||
ListModelMixin,
|
||||
GenericViewSet,
|
||||
):
|
||||
queryset = Schedule.objects.select_related("rel_obj_content_type").all()
|
||||
queryset = (
|
||||
Schedule.objects.select_related("rel_obj_content_type").prefetch_related("tasks").all()
|
||||
)
|
||||
serializer_class = ScheduleSerializer
|
||||
search_fields = (
|
||||
"id",
|
||||
|
16
schema.yml
16
schema.yml
@ -48395,6 +48395,16 @@ components:
|
||||
- name
|
||||
- server_uri
|
||||
- slug
|
||||
LastTaskStatusEnum:
|
||||
enum:
|
||||
- queued
|
||||
- consumed
|
||||
- rejected
|
||||
- done
|
||||
- info
|
||||
- warning
|
||||
- error
|
||||
type: string
|
||||
License:
|
||||
type: object
|
||||
description: License Serializer
|
||||
@ -59565,11 +59575,17 @@ components:
|
||||
type: string
|
||||
nullable: true
|
||||
readOnly: true
|
||||
last_task_status:
|
||||
allOf:
|
||||
- $ref: '#/components/schemas/LastTaskStatusEnum'
|
||||
nullable: true
|
||||
readOnly: true
|
||||
required:
|
||||
- actor_name
|
||||
- crontab
|
||||
- description
|
||||
- id
|
||||
- last_task_status
|
||||
- next_run
|
||||
- rel_obj_app_label
|
||||
- rel_obj_model
|
||||
|
@ -11,6 +11,7 @@ import "@goauthentik/elements/ak-mdx";
|
||||
import "@goauthentik/elements/buttons/ActionButton";
|
||||
import "@goauthentik/elements/buttons/SpinnerButton";
|
||||
import "@goauthentik/elements/forms/ModalForm";
|
||||
import "@goauthentik/elements/sync/SyncStatusCard";
|
||||
import MDSourceKerberosBrowser from "~docs/users-sources/sources/protocols/kerberos/browser.md";
|
||||
|
||||
import { msg } from "@lit/localize";
|
||||
@ -93,7 +94,9 @@ export class KerberosSourceViewPage extends AKElement {
|
||||
>
|
||||
</div>
|
||||
<div class="pf-l-grid pf-m-gutter">
|
||||
<div class="pf-c-card pf-l-grid__item pf-m-4-col">
|
||||
<div
|
||||
class="pf-c-card pf-l-grid__item pf-m-12-col pf-m-6-col-on-xl pf-m-6-col-on-2xl"
|
||||
>
|
||||
<div class="pf-c-card__body">
|
||||
<dl class="pf-c-description-list pf-m-2-col-on-lg">
|
||||
<div class="pf-c-description-list__group">
|
||||
@ -137,7 +140,20 @@ export class KerberosSourceViewPage extends AKElement {
|
||||
</ak-forms-modal>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pf-c-card pf-l-grid__item pf-m-8-col">
|
||||
<div
|
||||
class="pf-c-card pf-l-grid__item pf-m-12-col pf-m-6-col-on-xl pf-m-6-col-on-2xl"
|
||||
>
|
||||
<ak-sync-status-card
|
||||
.fetch=${() => {
|
||||
return new SourcesApi(
|
||||
DEFAULT_CONFIG,
|
||||
).sourcesKerberosSyncStatusRetrieve({
|
||||
slug: this.source?.slug,
|
||||
});
|
||||
}}
|
||||
></ak-sync-status-card>
|
||||
</div>
|
||||
<div class="pf-c-card pf-l-grid__item pf-m-12-col">
|
||||
<div class="pf-c-card__title">
|
||||
<p>${msg("Connectivity")}</p>
|
||||
</div>
|
||||
|
@ -10,6 +10,7 @@ import "@goauthentik/elements/Tabs";
|
||||
import "@goauthentik/elements/buttons/ActionButton";
|
||||
import "@goauthentik/elements/buttons/SpinnerButton";
|
||||
import "@goauthentik/elements/forms/ModalForm";
|
||||
import "@goauthentik/elements/sync/SyncStatusCard";
|
||||
import "@goauthentik/elements/tasks/ScheduleList";
|
||||
|
||||
import { msg } from "@lit/localize";
|
||||
@ -72,7 +73,9 @@ export class LDAPSourceViewPage extends AKElement {
|
||||
class="pf-c-page__main-section pf-m-no-padding-mobile"
|
||||
>
|
||||
<div class="pf-l-grid pf-m-gutter">
|
||||
<div class="pf-c-card pf-l-grid__item pf-m-4-col">
|
||||
<div
|
||||
class="pf-c-card pf-l-grid__item pf-m-12-col pf-m-6-col-on-xl pf-m-6-col-on-2xl"
|
||||
>
|
||||
<div class="pf-c-card__body">
|
||||
<dl class="pf-c-description-list pf-m-2-col-on-lg">
|
||||
<div class="pf-c-description-list__group">
|
||||
@ -127,7 +130,20 @@ export class LDAPSourceViewPage extends AKElement {
|
||||
</ak-forms-modal>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pf-c-card pf-l-grid__item pf-m-8-col">
|
||||
<div
|
||||
class="pf-c-card pf-l-grid__item pf-m-12-col pf-m-6-col-on-xl pf-m-6-col-on-2xl"
|
||||
>
|
||||
<ak-sync-status-card
|
||||
.fetch=${() => {
|
||||
return new SourcesApi(DEFAULT_CONFIG).sourcesLdapSyncStatusRetrieve(
|
||||
{
|
||||
slug: this.source?.slug,
|
||||
},
|
||||
);
|
||||
}}
|
||||
></ak-sync-status-card>
|
||||
</div>
|
||||
<div class="pf-c-card pf-l-grid__item pf-m-12-col">
|
||||
<div class="pf-c-card__title">
|
||||
<p>${msg("Connectivity")}</p>
|
||||
</div>
|
||||
|
@ -9,6 +9,7 @@ import { PaginatedResponse, Table } from "@goauthentik/elements/table/Table";
|
||||
import { TableColumn } from "@goauthentik/elements/table/Table";
|
||||
import "@goauthentik/elements/tasks/ScheduleForm";
|
||||
import "@goauthentik/elements/tasks/TaskList";
|
||||
import "@goauthentik/elements/tasks/TaskStatus";
|
||||
import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
|
||||
|
||||
import { msg } from "@lit/localize";
|
||||
@ -72,6 +73,7 @@ export class ScheduleList extends Table<Schedule> {
|
||||
new TableColumn(msg("Schedule"), "actor_name"),
|
||||
new TableColumn(msg("Crontab"), "crontab"),
|
||||
new TableColumn(msg("Next run"), "next_run"),
|
||||
new TableColumn(msg("Last status")),
|
||||
new TableColumn(msg("Actions")),
|
||||
];
|
||||
}
|
||||
@ -118,6 +120,7 @@ export class ScheduleList extends Table<Schedule> {
|
||||
<small>${item.nextRun.toLocaleString()}</small>
|
||||
`}
|
||||
`,
|
||||
html`<ak-task-status .status=${item.lastTaskStatus}></ak-task-status>`,
|
||||
html`<ak-action-button
|
||||
class="pf-m-plain"
|
||||
.apiRequest=${() => {
|
||||
|
@ -9,12 +9,16 @@ import { customElement, property } from "lit/decorators.js";
|
||||
import PFButton from "@patternfly/patternfly/components/Button/button.css";
|
||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
||||
|
||||
import { TaskAggregatedStatusEnum, TasksTasksListAggregatedStatusEnum } from "@goauthentik/api";
|
||||
import {
|
||||
LastTaskStatusEnum,
|
||||
TaskAggregatedStatusEnum,
|
||||
TasksTasksListAggregatedStatusEnum,
|
||||
} from "@goauthentik/api";
|
||||
|
||||
@customElement("ak-task-status")
|
||||
export class TaskStatus extends AKElement {
|
||||
@property()
|
||||
status?: TaskAggregatedStatusEnum | TasksTasksListAggregatedStatusEnum;
|
||||
status?: TaskAggregatedStatusEnum | TasksTasksListAggregatedStatusEnum | LastTaskStatusEnum;
|
||||
|
||||
static get styles(): CSSResult[] {
|
||||
return [PFBase, PFButton];
|
||||
@ -24,22 +28,29 @@ export class TaskStatus extends AKElement {
|
||||
switch (this.status) {
|
||||
case TasksTasksListAggregatedStatusEnum.Queued:
|
||||
case TaskAggregatedStatusEnum.Queued:
|
||||
case LastTaskStatusEnum.Queued:
|
||||
return html`<ak-label color=${PFColor.Grey}>${msg("Waiting to run")}</ak-label>`;
|
||||
case TasksTasksListAggregatedStatusEnum.Consumed:
|
||||
case TaskAggregatedStatusEnum.Consumed:
|
||||
case LastTaskStatusEnum.Consumed:
|
||||
return html`<ak-label color=${PFColor.Blue}>${msg("Running")}</ak-label>`;
|
||||
case TasksTasksListAggregatedStatusEnum.Done:
|
||||
case TaskAggregatedStatusEnum.Done:
|
||||
case LastTaskStatusEnum.Done:
|
||||
case TasksTasksListAggregatedStatusEnum.Info:
|
||||
case TaskAggregatedStatusEnum.Info:
|
||||
case LastTaskStatusEnum.Info:
|
||||
return html`<ak-label color=${PFColor.Green}>${msg("Successful")}</ak-label>`;
|
||||
case TasksTasksListAggregatedStatusEnum.Warning:
|
||||
case TaskAggregatedStatusEnum.Warning:
|
||||
case LastTaskStatusEnum.Warning:
|
||||
return html`<ak-label color=${PFColor.Orange}>${msg("Warning")}</ak-label>`;
|
||||
case TasksTasksListAggregatedStatusEnum.Rejected:
|
||||
case TaskAggregatedStatusEnum.Rejected:
|
||||
case LastTaskStatusEnum.Rejected:
|
||||
case TasksTasksListAggregatedStatusEnum.Error:
|
||||
case TaskAggregatedStatusEnum.Error:
|
||||
case LastTaskStatusEnum.Error:
|
||||
return html`<ak-label color=${PFColor.Red}>${msg("Error")}</ak-label>`;
|
||||
default:
|
||||
return html`<ak-label color=${PFColor.Grey}>${msg("Unknown")}</ak-label>`;
|
||||
|
Reference in New Issue
Block a user