This commit is contained in:
Timothy Jaeryang Baek
2026-04-01 00:55:52 -05:00
parent c6b1c56e9e
commit fe8a3d9f83
4 changed files with 202 additions and 42 deletions
+48 -1
View File
@@ -4,7 +4,7 @@ from typing import Optional
from uuid import uuid4
from pydantic import BaseModel, ConfigDict
from sqlalchemy import Column, Text, JSON, Boolean, BigInteger, Index, select
from sqlalchemy import Column, Text, JSON, Boolean, BigInteger, Index, select, or_, func, cast, String
from sqlalchemy.orm import Session
from open_webui.internal.db import Base, get_db, get_db_context
@@ -108,6 +108,11 @@ class AutomationResponse(AutomationModel):
next_runs: Optional[list[int]] = None
class AutomationListResponse(BaseModel):
items: list[AutomationModel]
total: int
####################
# AutomationTable
####################
@@ -159,6 +164,48 @@ class AutomationTable:
)
return [AutomationModel.model_validate(r) for r in rows]
def search_automations(
self,
user_id: str,
query: Optional[str] = None,
status: Optional[str] = None,
skip: int = 0,
limit: int = 30,
db: Optional[Session] = None,
) -> 'AutomationListResponse':
with get_db_context(db) as db:
q = db.query(Automation).filter_by(user_id=user_id)
if query:
search = f'%{query}%'
# Search in name and prompt inside JSON data
q = q.filter(
or_(
Automation.name.ilike(search),
cast(Automation.data, String).ilike(search),
)
)
if status == 'active':
q = q.filter(Automation.is_active == True)
elif status == 'paused':
q = q.filter(Automation.is_active == False)
q = q.order_by(Automation.created_at.desc())
total = q.count()
if skip:
q = q.offset(skip)
if limit:
q = q.limit(limit)
rows = q.all()
return AutomationListResponse(
items=[AutomationModel.model_validate(r) for r in rows],
total=total,
)
def get_all(self, db: Optional[Session] = None) -> list[AutomationModel]:
with get_db_context(db) as db:
rows = (
+40
View File
@@ -1,6 +1,7 @@
import asyncio
import logging
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Request, status
from sqlalchemy.orm import Session
@@ -11,6 +12,7 @@ from open_webui.models.automations import (
AutomationModel,
AutomationResponse,
AutomationRunModel,
AutomationListResponse,
)
from open_webui.utils.automations import (
validate_rrule,
@@ -26,6 +28,8 @@ log = logging.getLogger(__name__)
router = APIRouter()
PAGE_ITEM_COUNT = 30
############################
# Helpers
@@ -71,6 +75,42 @@ async def get_automations(
return [enrich_automation(automation, db, tz=user.timezone) for automation in automations]
############################
# GetAutomationItems (paginated)
############################
@router.get('/list')
async def get_automation_items(
request: Request,
query: Optional[str] = None,
status: Optional[str] = None,
page: Optional[int] = 1,
user=Depends(get_verified_user),
db: Session = Depends(get_session),
):
limit = PAGE_ITEM_COUNT
page = max(1, page)
skip = (page - 1) * limit
result = Automations.search_automations(
user_id=user.id,
query=query,
status=status,
skip=skip,
limit=limit,
db=db,
)
return {
'items': [
enrich_automation(item, db, tz=user.timezone)
for item in result.items
],
'total': result.total,
}
############################
# CreateNewAutomation
############################