feat: add custom task recurrence options
ci / docker (push) Successful in 5m27s

This commit is contained in:
2026-09-08 08:53:02 +08:00
parent 2eca978820
commit 0dd67f2824
5 changed files with 35 additions and 3 deletions
+8 -1
View File
@@ -468,7 +468,12 @@ async def create_task(
)
if parent is None:
raise HTTPException(status_code=400, detail="父任务必须是同一清单的顶层任务")
data = payload.model_dump()
if payload.rrule:
if not payload.due_at:
raise HTTPException(status_code=422, detail="重复任务需要截止时间")
from .mvp import parse_rrule
parse_rrule(payload.rrule)
data = payload.model_dump(exclude={"rrule"})
parent_filter = Task.parent_id == payload.parent_id if payload.parent_id else Task.parent_id.is_(None)
max_position = await db.scalar(select(func.max(Task.position)).where(
Task.user_id == user.id,
@@ -479,6 +484,8 @@ async def create_task(
task = Task(user_id=user.id, position=(max_position if max_position is not None else -1) + 1, **data)
db.add(task)
await db.flush()
if payload.rrule:
db.add(RecurrenceTemplate(user_id=user.id, task_id=task.id, rrule=payload.rrule.upper(), starts_at=task.due_at))
audit(db, user.id, "create", "task", task.id)
await db.commit()
await db.refresh(task)
+1
View File
@@ -77,6 +77,7 @@ class TaskCreate(BaseModel):
priority: int = Field(default=0, ge=0, le=3)
due_at: datetime | None = None
parent_id: UUID | None = None
rrule: str | None = Field(default=None, min_length=5, max_length=1000)
class TaskUpdate(BaseModel):