64
authentik/tasks/api.py
Normal file
64
authentik/tasks/api.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
from drf_spectacular.utils import OpenApiParameter, extend_schema
|
||||||
|
from rest_framework.mixins import (
|
||||||
|
ListModelMixin,
|
||||||
|
RetrieveModelMixin,
|
||||||
|
)
|
||||||
|
from rest_framework.viewsets import GenericViewSet
|
||||||
|
|
||||||
|
from authentik.core.api.utils import ModelSerializer
|
||||||
|
from authentik.tasks.models import Task
|
||||||
|
from authentik.tasks.schedules.models import Schedule
|
||||||
|
from authentik.tenants.utils import get_current_tenant
|
||||||
|
|
||||||
|
|
||||||
|
class TaskSerializer(ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Task
|
||||||
|
fields = [
|
||||||
|
"message_id",
|
||||||
|
"queue_name",
|
||||||
|
"actor_name",
|
||||||
|
"state",
|
||||||
|
"mtime",
|
||||||
|
"schedule_uid",
|
||||||
|
"uid",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class TaskViewSet(
|
||||||
|
RetrieveModelMixin,
|
||||||
|
ListModelMixin,
|
||||||
|
GenericViewSet,
|
||||||
|
):
|
||||||
|
serializer_class = TaskSerializer
|
||||||
|
search_fields = (
|
||||||
|
"message_id",
|
||||||
|
"queue_name",
|
||||||
|
"actor_name",
|
||||||
|
"state",
|
||||||
|
"schedule_uid",
|
||||||
|
)
|
||||||
|
filterset_fields = (
|
||||||
|
"queue_name",
|
||||||
|
"actor_name",
|
||||||
|
"state",
|
||||||
|
"schedule_uid",
|
||||||
|
)
|
||||||
|
ordering = (
|
||||||
|
"actor_name",
|
||||||
|
"-mtime",
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
qs = Task.objects.filter(tenant=get_current_tenant())
|
||||||
|
if self.request.query_params.get("exclude_scheduled", "false").lower() == "true":
|
||||||
|
qs = qs.exclude(schedule_uid__in=Schedule.objects.all().values_list("uid", flat=True))
|
||||||
|
return qs
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
parameters=[
|
||||||
|
OpenApiParameter("exclude_scheduled", bool, default=False),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
def list(self, *args, **kwargs):
|
||||||
|
return super().list(*args, **kwargs)
|
21
authentik/tasks/migrations/0003_alter_task_options.py
Normal file
21
authentik/tasks/migrations/0003_alter_task_options.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# Generated by Django 5.0.13 on 2025-03-27 13:33
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("authentik_tasks", "0002_task_schedule_uid"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name="task",
|
||||||
|
options={
|
||||||
|
"default_permissions": ("view",),
|
||||||
|
"verbose_name": "Task",
|
||||||
|
"verbose_name_plural": "Tasks",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
@ -8,6 +8,7 @@ from django.utils.translation import gettext_lazy as _
|
|||||||
|
|
||||||
from authentik.events.logs import LogEvent
|
from authentik.events.logs import LogEvent
|
||||||
from authentik.events.utils import sanitize_item
|
from authentik.events.utils import sanitize_item
|
||||||
|
from authentik.lib.models import SerializerModel
|
||||||
from authentik.lib.utils.errors import exception_to_string
|
from authentik.lib.utils.errors import exception_to_string
|
||||||
from authentik.tenants.models import Tenant
|
from authentik.tenants.models import Tenant
|
||||||
|
|
||||||
@ -37,8 +38,7 @@ class TaskStatus(models.TextChoices):
|
|||||||
ERROR = "error"
|
ERROR = "error"
|
||||||
|
|
||||||
|
|
||||||
# class Task(SerializerModel):
|
class Task(SerializerModel):
|
||||||
class Task(models.Model):
|
|
||||||
message_id = models.UUIDField(primary_key=True, default=uuid4)
|
message_id = models.UUIDField(primary_key=True, default=uuid4)
|
||||||
queue_name = models.TextField(default="default", help_text=_("Queue name"))
|
queue_name = models.TextField(default="default", help_text=_("Queue name"))
|
||||||
|
|
||||||
@ -69,6 +69,7 @@ class Task(models.Model):
|
|||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("Task")
|
verbose_name = _("Task")
|
||||||
verbose_name_plural = _("Tasks")
|
verbose_name_plural = _("Tasks")
|
||||||
|
default_permissions = ("view",)
|
||||||
indexes = (models.Index(fields=("state", "mtime")),)
|
indexes = (models.Index(fields=("state", "mtime")),)
|
||||||
triggers = (
|
triggers = (
|
||||||
pgtrigger.Trigger(
|
pgtrigger.Trigger(
|
||||||
@ -90,10 +91,11 @@ class Task(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return str(self.message_id)
|
return str(self.message_id)
|
||||||
|
|
||||||
# @property
|
@property
|
||||||
# def serializer(self):
|
def serializer(self):
|
||||||
# # TODO: fixme
|
from authentik.tasks.api import TaskSerializer
|
||||||
# pass
|
|
||||||
|
return TaskSerializer
|
||||||
|
|
||||||
def set_uid(self, uid: str):
|
def set_uid(self, uid: str):
|
||||||
"""Set UID, so in the case of an unexpected error its saved correctly"""
|
"""Set UID, so in the case of an unexpected error its saved correctly"""
|
||||||
|
@ -81,6 +81,46 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"model",
|
||||||
|
"identifiers"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"model": {
|
||||||
|
"const": "authentik_tasks.task"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"state": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"absent",
|
||||||
|
"present",
|
||||||
|
"created",
|
||||||
|
"must_created"
|
||||||
|
],
|
||||||
|
"default": "present"
|
||||||
|
},
|
||||||
|
"conditions": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"$ref": "#/$defs/model_authentik_tasks.task_permissions"
|
||||||
|
},
|
||||||
|
"attrs": {
|
||||||
|
"$ref": "#/$defs/model_authentik_tasks.task"
|
||||||
|
},
|
||||||
|
"identifiers": {
|
||||||
|
"$ref": "#/$defs/model_authentik_tasks.task"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
@ -4129,6 +4169,77 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"model_authentik_tasks.task": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"message_id": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uuid",
|
||||||
|
"title": "Message id"
|
||||||
|
},
|
||||||
|
"queue_name": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Queue name",
|
||||||
|
"description": "Queue name"
|
||||||
|
},
|
||||||
|
"actor_name": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Actor name",
|
||||||
|
"description": "Dramatiq actor name"
|
||||||
|
},
|
||||||
|
"state": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"queued",
|
||||||
|
"consumed",
|
||||||
|
"rejected",
|
||||||
|
"done"
|
||||||
|
],
|
||||||
|
"title": "State",
|
||||||
|
"description": "Task status"
|
||||||
|
},
|
||||||
|
"mtime": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "date-time",
|
||||||
|
"title": "Mtime",
|
||||||
|
"description": "Task last modified time"
|
||||||
|
},
|
||||||
|
"schedule_uid": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Schedule uid"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Uid"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": []
|
||||||
|
},
|
||||||
|
"model_authentik_tasks.task_permissions": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"permission"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"permission": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"view_task"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"role": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"model_authentik_crypto.certificatekeypair": {
|
"model_authentik_crypto.certificatekeypair": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@ -4762,6 +4873,7 @@
|
|||||||
"enum": [
|
"enum": [
|
||||||
null,
|
null,
|
||||||
"authentik_tenants.domain",
|
"authentik_tenants.domain",
|
||||||
|
"authentik_tasks.task",
|
||||||
"authentik_crypto.certificatekeypair",
|
"authentik_crypto.certificatekeypair",
|
||||||
"authentik_flows.flow",
|
"authentik_flows.flow",
|
||||||
"authentik_flows.flowstagebinding",
|
"authentik_flows.flowstagebinding",
|
||||||
@ -7373,9 +7485,6 @@
|
|||||||
"authentik_stages_user_write.change_userwritestage",
|
"authentik_stages_user_write.change_userwritestage",
|
||||||
"authentik_stages_user_write.delete_userwritestage",
|
"authentik_stages_user_write.delete_userwritestage",
|
||||||
"authentik_stages_user_write.view_userwritestage",
|
"authentik_stages_user_write.view_userwritestage",
|
||||||
"authentik_tasks.add_task",
|
|
||||||
"authentik_tasks.change_task",
|
|
||||||
"authentik_tasks.delete_task",
|
|
||||||
"authentik_tasks.view_task",
|
"authentik_tasks.view_task",
|
||||||
"authentik_tasks_schedules.change_schedule",
|
"authentik_tasks_schedules.change_schedule",
|
||||||
"authentik_tasks_schedules.view_schedule",
|
"authentik_tasks_schedules.view_schedule",
|
||||||
@ -13929,9 +14038,6 @@
|
|||||||
"authentik_stages_user_write.change_userwritestage",
|
"authentik_stages_user_write.change_userwritestage",
|
||||||
"authentik_stages_user_write.delete_userwritestage",
|
"authentik_stages_user_write.delete_userwritestage",
|
||||||
"authentik_stages_user_write.view_userwritestage",
|
"authentik_stages_user_write.view_userwritestage",
|
||||||
"authentik_tasks.add_task",
|
|
||||||
"authentik_tasks.change_task",
|
|
||||||
"authentik_tasks.delete_task",
|
|
||||||
"authentik_tasks.view_task",
|
"authentik_tasks.view_task",
|
||||||
"authentik_tasks_schedules.change_schedule",
|
"authentik_tasks_schedules.change_schedule",
|
||||||
"authentik_tasks_schedules.view_schedule",
|
"authentik_tasks_schedules.view_schedule",
|
||||||
|
13
schema.yml
13
schema.yml
@ -24426,6 +24426,7 @@ paths:
|
|||||||
- authentik_stages_user_login.userloginstage
|
- authentik_stages_user_login.userloginstage
|
||||||
- authentik_stages_user_logout.userlogoutstage
|
- authentik_stages_user_logout.userlogoutstage
|
||||||
- authentik_stages_user_write.userwritestage
|
- authentik_stages_user_write.userwritestage
|
||||||
|
- authentik_tasks.task
|
||||||
- authentik_tasks_schedules.schedule
|
- authentik_tasks_schedules.schedule
|
||||||
- authentik_tenants.domain
|
- authentik_tenants.domain
|
||||||
required: true
|
required: true
|
||||||
@ -24671,6 +24672,7 @@ paths:
|
|||||||
- authentik_stages_user_login.userloginstage
|
- authentik_stages_user_login.userloginstage
|
||||||
- authentik_stages_user_logout.userlogoutstage
|
- authentik_stages_user_logout.userlogoutstage
|
||||||
- authentik_stages_user_write.userwritestage
|
- authentik_stages_user_write.userwritestage
|
||||||
|
- authentik_tasks.task
|
||||||
- authentik_tasks_schedules.schedule
|
- authentik_tasks_schedules.schedule
|
||||||
- authentik_tenants.domain
|
- authentik_tenants.domain
|
||||||
required: true
|
required: true
|
||||||
@ -38993,7 +38995,8 @@ paths:
|
|||||||
name: id
|
name: id
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
description: A unique value identifying this Schedule.
|
format: uuid
|
||||||
|
description: A UUID string identifying this Schedule.
|
||||||
required: true
|
required: true
|
||||||
tags:
|
tags:
|
||||||
- tasks
|
- tasks
|
||||||
@ -39025,7 +39028,8 @@ paths:
|
|||||||
name: id
|
name: id
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
description: A unique value identifying this Schedule.
|
format: uuid
|
||||||
|
description: A UUID string identifying this Schedule.
|
||||||
required: true
|
required: true
|
||||||
tags:
|
tags:
|
||||||
- tasks
|
- tasks
|
||||||
@ -39063,7 +39067,8 @@ paths:
|
|||||||
name: id
|
name: id
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
description: A unique value identifying this Schedule.
|
format: uuid
|
||||||
|
description: A UUID string identifying this Schedule.
|
||||||
required: true
|
required: true
|
||||||
tags:
|
tags:
|
||||||
- tasks
|
- tasks
|
||||||
@ -46810,6 +46815,7 @@ components:
|
|||||||
ModelEnum:
|
ModelEnum:
|
||||||
enum:
|
enum:
|
||||||
- authentik_tenants.domain
|
- authentik_tenants.domain
|
||||||
|
- authentik_tasks.task
|
||||||
- authentik_crypto.certificatekeypair
|
- authentik_crypto.certificatekeypair
|
||||||
- authentik_flows.flow
|
- authentik_flows.flow
|
||||||
- authentik_flows.flowstagebinding
|
- authentik_flows.flowstagebinding
|
||||||
@ -56673,6 +56679,7 @@ components:
|
|||||||
properties:
|
properties:
|
||||||
id:
|
id:
|
||||||
type: string
|
type: string
|
||||||
|
format: uuid
|
||||||
readOnly: true
|
readOnly: true
|
||||||
name:
|
name:
|
||||||
type: string
|
type: string
|
||||||
|
Reference in New Issue
Block a user