"""
----------------------------------------------------------------------------
METADATA:
File: workflow.py
Project: paperap
Created: 2025-03-04
Version: 0.0.9
Author: Jess Mann
Email: jess@jmann.me
Copyright (c) 2025 Jess Mann
----------------------------------------------------------------------------
LAST MODIFIED:
2025-03-04 By Jess Mann
"""
from __future__ import annotations
from datetime import datetime
from typing import Any, Self
from pydantic import Field
from paperap.const import (
ScheduleDateFieldType,
WorkflowActionType,
WorkflowTriggerMatchingType,
WorkflowTriggerSourceType,
WorkflowTriggerType,
)
from paperap.models.abstract.model import StandardModel
from paperap.models.mixins.models import MatcherMixin
from paperap.models.workflow.queryset import WorkflowActionQuerySet, WorkflowQuerySet, WorkflowTriggerQuerySet
[docs]
class WorkflowTrigger(StandardModel, MatcherMixin):
"""
Represents a workflow trigger in Paperless-NgX.
"""
sources: list[WorkflowTriggerSourceType] = Field(default_factory=list)
type: WorkflowTriggerType | None = None
filter_path: str | None = None
filter_filename: str | None = None
filter_mailrule: str | None = None
filter_has_tags: list[int] = Field(default_factory=list)
filter_has_correspondent: int | None = None
filter_has_document_type: int | None = None
schedule_date_field: ScheduleDateFieldType | None = None
schedule_date_custom_field: int | None = None
schedule_offset_days: int = 0
schedule_is_recurring: bool = False
schedule_recurring_interval_days: int = 1
[docs]
class WorkflowAction(StandardModel):
"""
Represents a workflow action in Paperless-NgX.
"""
type: WorkflowActionType | None = None
# Assignment actions
assign_title: str | None = None
assign_tags: list[int] = Field(default_factory=list)
assign_correspondent: int | None = None
assign_document_type: int | None = None
assign_storage_path: int | None = None
assign_owner: int | None = None
assign_view_users: list[int] = Field(default_factory=list)
assign_view_groups: list[int] = Field(default_factory=list)
assign_change_users: list[int] = Field(default_factory=list)
assign_change_groups: list[int] = Field(default_factory=list)
assign_custom_fields: list[int] = Field(default_factory=list)
assign_custom_fields_values: dict[str, Any] = Field(default_factory=dict)
# Removal actions
remove_all_tags: bool | None = None
remove_tags: list[int] = Field(default_factory=list)
remove_all_correspondents: bool | None = None
remove_correspondents: list[int] = Field(default_factory=list)
remove_all_document_types: bool | None = None
remove_document_types: list[int] = Field(default_factory=list)
remove_all_storage_paths: bool | None = None
remove_storage_paths: list[int] = Field(default_factory=list)
remove_custom_fields: list[int] = Field(default_factory=list)
remove_all_custom_fields: bool | None = None
remove_all_owners: bool | None = None
remove_owners: list[int] = Field(default_factory=list)
remove_all_permissions: bool | None = None
remove_view_users: list[int] = Field(default_factory=list)
remove_view_groups: list[int] = Field(default_factory=list)
remove_change_users: list[int] = Field(default_factory=list)
remove_change_groups: list[int] = Field(default_factory=list)
# Email action
email: dict[str, Any] | None = None
# Webhook action
webhook: dict[str, Any] | None = None
[docs]
class Workflow(StandardModel):
"""
Represents a workflow in Paperless-NgX.
"""
name: str
order: int | None = None
enabled: bool | None = None
triggers: list[dict[str, Any]] = Field(default_factory=list)
actions: list[dict[str, Any]] = Field(default_factory=list)
[docs]
class WorkflowRun(StandardModel):
"""
Represents a workflow run in Paperless-NgX.
"""
workflow: int | None = None
document: int | None = None
type: WorkflowTriggerType | None = None
run_at: datetime
started: datetime | None = None
finished: datetime | None = None
status: str | None = None
error: str | None = None