From 83c3075de00aa4192446bf7a110bf4faa6295d86 Mon Sep 17 00:00:00 2001 From: Alex Blank Date: Mon, 11 May 2026 20:50:35 +0200 Subject: [PATCH] fix: update pydantic schemas to v2 syntax - Replace Config class with ConfigDict - Add cron expression validation - Add missing updated_at to Schedule - Add JobExecutionUpdate schema --- backend/app/schemas.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/backend/app/schemas.py b/backend/app/schemas.py index 81f9c6f..a7364b2 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -1,6 +1,7 @@ -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, ConfigDict, field_validator from typing import Optional, List, Dict, Any from datetime import datetime +import re # Source schemas class SourceBase(BaseModel): @@ -20,8 +21,7 @@ class Source(SourceBase): created_at: datetime updated_at: datetime - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) # Job schemas class JobBase(BaseModel): @@ -47,8 +47,7 @@ class Job(JobBase): created_at: datetime updated_at: datetime - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) # Schedule schemas class ScheduleBase(BaseModel): @@ -56,6 +55,14 @@ class ScheduleBase(BaseModel): cron_expression: str enabled: bool = True + @field_validator('cron_expression') + @classmethod + def validate_cron(cls, v: str) -> str: + pattern = r'^([0-9*,/-]+)\s+([0-9*,/-]+)\s+([0-9*,/-]+)\s+([0-9*,/-]+)\s+([0-9*,/-]+)$' + if not re.match(pattern, v): + raise ValueError('Invalid cron expression format') + return v + class ScheduleCreate(ScheduleBase): pass @@ -66,9 +73,9 @@ class ScheduleUpdate(BaseModel): class Schedule(ScheduleBase): id: int created_at: datetime + updated_at: datetime - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) # Execution schemas class JobExecutionBase(BaseModel): @@ -87,8 +94,11 @@ class JobExecution(JobExecutionBase): bytes_backed_up: int = 0 error_message: Optional[str] = None - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) + +class JobExecutionUpdate(BaseModel): + status: Optional[str] = Field(None, pattern="^(pending|running|success|failed|cancelled)$") + error_message: Optional[str] = None # Backup schemas class BackupBase(BaseModel): @@ -106,8 +116,7 @@ class Backup(BackupBase): id: int created_at: datetime - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) # Settings schemas class SettingBase(BaseModel): @@ -123,8 +132,7 @@ class SettingUpdate(BaseModel): class Setting(SettingBase): updated_at: datetime - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) # Dashboard schemas class DashboardStats(BaseModel):