This commit is contained in:
@@ -95,6 +95,7 @@ class Task(Base):
|
||||
priority: Mapped[int] = mapped_column(Integer, default=0)
|
||||
completed: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
|
||||
due_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
|
||||
due_has_time: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
version: Mapped[int] = mapped_column(Integer, default=1)
|
||||
position: Mapped[int] = mapped_column(Integer, default=0)
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow)
|
||||
|
||||
+2
-1
@@ -809,7 +809,7 @@ async def export_json(user: User = Depends(current_user), db: AsyncSession = Dep
|
||||
"exported_at": utcnow(),
|
||||
"folders": [serialize(x, ["id", "name", "position", "deleted_at"]) for x in folders],
|
||||
"lists": [serialize(x, ["id", "folder_id", "name", "is_inbox", "position", "deleted_at"]) for x in lists],
|
||||
"tasks": [serialize(x, ["id", "list_id", "parent_id", "title", "description", "priority", "completed", "due_at", "external_id", "deleted_at"]) for x in tasks],
|
||||
"tasks": [serialize(x, ["id", "list_id", "parent_id", "title", "description", "priority", "completed", "due_at", "due_has_time", "external_id", "deleted_at"]) for x in tasks],
|
||||
"recurrences": [serialize(x, ["id", "task_id", "rrule", "starts_at", "ends_at"]) for x in recurrences],
|
||||
"habits": [serialize(x, ["id", "name", "kind", "target", "max_value", "schedule_type", "weekdays", "month_days", "interval_days", "start_date", "archived_at", "position"]) for x in habits],
|
||||
"countdowns": [serialize(x, ["id", "title", "event_date", "calendar_mode", "lunar_month", "lunar_day", "ignore_year", "kind", "repeat_rule", "icon", "pinned", "archived_at", "created_at", "updated_at"]) for x in countdowns],
|
||||
@@ -868,6 +868,7 @@ async def restore_json(payload: dict, mode: str = Query("merge", pattern="^(merg
|
||||
priority=raw.get("priority", 0),
|
||||
completed=raw.get("completed", False),
|
||||
due_at=datetime.fromisoformat(raw["due_at"]) if raw.get("due_at") else None,
|
||||
due_has_time=raw.get("due_has_time", True),
|
||||
external_id=ext,
|
||||
)
|
||||
db.add(row)
|
||||
|
||||
+4
-1
@@ -76,6 +76,7 @@ class TaskCreate(BaseModel):
|
||||
description: str = ""
|
||||
priority: int = Field(default=0, ge=0, le=3)
|
||||
due_at: datetime | None = None
|
||||
due_has_time: bool = False
|
||||
parent_id: UUID | None = None
|
||||
rrule: str | None = Field(default=None, min_length=5, max_length=1000)
|
||||
|
||||
@@ -85,13 +86,14 @@ class TaskUpdate(BaseModel):
|
||||
description: str | None = None
|
||||
priority: int | None = Field(default=None, ge=0, le=3)
|
||||
due_at: datetime | None = None
|
||||
due_has_time: bool | None = None
|
||||
completed: bool | None = None
|
||||
list_id: UUID | None = None
|
||||
version: int = Field(ge=1)
|
||||
|
||||
@model_validator(mode="after")
|
||||
def reject_null_non_nullable_fields(self):
|
||||
for field in ("title", "description", "priority", "completed", "list_id"):
|
||||
for field in ("title", "description", "priority", "completed", "list_id", "due_has_time"):
|
||||
if field in self.model_fields_set and getattr(self, field) is None:
|
||||
raise ValueError(f"{field} cannot be null")
|
||||
return self
|
||||
@@ -117,6 +119,7 @@ class TaskOut(BaseModel):
|
||||
priority: int
|
||||
completed: bool
|
||||
due_at: datetime | None
|
||||
due_has_time: bool
|
||||
version: int
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user